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