COVOX-Blaster (CBL)
Covox-Blaster (CBL) – Covox с буферным ОЗУ.
Подключение буферного ОЗУ осуществляется по следующей схеме:
Счетчик работает на частоте 15 или 22 килогерца, в зависимости от состояния порта конфигурации Covox-а. Адрес мультиплексируется на момент записи в порт из процессора, все остальное время данные из ОЗУ записываются в регистр ЦАП-а.
Ввод байтов в буферное ОЗУ осуществляется командой OTIR (OUTI), что позволяет ускорить вывод звука и создать достаточно большие паузы для работы других частей программы. Так как при использовании команды OTIR регистр B (который попадает на A15..A8 процессора) уменьшается, для нормальной работы CBL счетчик считает «назад».
Для контроля за работой Covox-Blaster-а используется бит 7 порта #FE, в который выводится старший бит счетчика. Блок ОЗУ 256 байт условно разбит на две банки по 128 байт, и бит 7 порта #FE указывает какая из банок ОЗУ выводится в ЦАП в конкретный момент времени. Это используется программой вывода для определения, нужно ли подгружать следующие 128 байт в буфер.
В плате Sp2000 COVOX-Blaster включен в основную прошивку и включается через порт управления CBL - #4E. Запись в этот порт значения #80 приводит к включению режима CBL, #00 - включение обычного COVOX-а. Другие биты порта #4E имеют значение и их следует выставлять в 0 для получения описанного выше режима CBL. В дальнейшем этот порт будет устанавливать режимы Stereo, 8/16-bit и частоту.
;***********************************************************************
;
; Пример программы для 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
OUTI
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