;***********************************************************************
;
; Пример программы для Covox-Blaster-a.
;
;***********************************************************************
CLEAR_COVOX: ; программа для очистки буфера ОЗУ и
; отключения звука
LD A,80H ; значение, эквивалентное нулю на выходе Covox
LD BC,0FBH ; порт Covox-Blaster-à
CLEAR_CBL:
OUT (C),A
DJNZ CLEAR_CBL
XOR A
LD (SND_P),A ; установить в страницу звука 0 (нет звука)
RET
;***********************************************************************
SOUND_START: ; программа инициализации Covox-Blaster-à
;=======================================================================
; здесь должна располагаться программа, которая
; произведет расчет первой страницы данных для COVOX-áëàñòåðà è
; адреса данных. Страница и адрес соответственно в регистры A и HL
;=======================================================================
LD (SND_A),HL ; запомнить состояние адреса звука
LD (SND_P),A ; запомнить новую страницу WAV-данных
RET
SND_A: DB 0
SND_P: DW 0
;***********************************************************************
SOUND:
PUSH AF
LD A,(SND_P) ; проверка, что страница WAV-данных не равна 0
AND A
JR Z,RET_ALL ;иначе выход -- нет звука
PUSH HL
SND_MORE:
IN A,(0FEH) ; бит 7 порта #FE указывает состояние 7-го бита
; счетчика выводимого байта (банк 0/1)
XOR 0 ; запомненное состояние Covox адреса
COV_ADR EQU $-1
AND 80H ; проверить, переключение банки 128 байт
JP NZ,NO_LD_SND ; если изменения не было, вернуться.
LD A,(SND_P)
AND A
JR Z,RET_ALL
PUSH DE
PUSH BC
LD A,(COV_ADR) ; взять адрес Covox-а.
CPL ; инвертировать
LD B,A ; запомнить в B
LD HL,(SND_A) ; взять адрес WAV-данных
LD C,0FBH ; порт Covox-Blaster-а
IN A,(PAGE3) ; запомнить состояние PAGE3
LD E,A
LD A,(SND_P) ; взять номер страницы WAV-данных
OUT (PAGE3),A ; переключить PAGE3
LD D,16 ; повторять 16 раз
L_DDX:
OUTI ; выводить в Covox-Blaster
OUTI ; (OUTI работает несколько быстрее, чем OTIR)
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
DEC D
JR NZ,L_DDX
LD (SND_A),HL ; запомнить состояние адреса звука
LD A,H ; проверить, что адрес не дошел до конца страницы
AND A
JP NZ,NO_SNDP ; если не дошел, идти на выход
LD A,E ; вспомнить страницу PAGE3
OUT (PAGE3),A
;=======================================================================
; здесь должна располагаться программа, которая
; произведет рассчет новой страницы данных для COVOX-бластера и
; адреса данных. Страница и адрес соответственно в регистры A и HL
;=======================================================================
LD (SND_A),HL ; запомнить состояние адреса звука
LD (SND_P),A ; запомнить новую страницу WAV-данных
JR NO_SNDP1
NO_SNDP:
LD A,E ; вспомнить страницу PAGE3
OUT (PAGE3),A
NO_SNDP1:
POP BC
POP DE
NO_LD_SND:
POP HL
RET_ALL:
POP AF
RET