libc: IM2 Phase 2b — звук CBL/COVOX через callback fill(), без кольца libc
CBL уже имеет аппаратный буфер 256 Б (2×128, двойная буферизация на стороне железа) — держать поверх него ещё одно кольцо в libc было бы лишней копией. cbl_open(freq, fmt, pump_mode, underrun_mode, fill) регистрирует callback, вызываемый из ISR за очередным блоком; он сам пропихивает данные приложения (откуда угодно) через cbl_push_otir()/ cbl_push_accel() — без промежуточного буфера. - два насоса: OTIR (порт 0x4F) и ACCEL (акселератор, спец-страница EMM 0xFD@0xC000); OTIR+16-бит запрещён (EINVAL) — по исходнику MAME порт данных физически не может собрать 16-бит сэмпл из пары байт; - форматы CBL_FMT_MONO8/16/STEREO8/16, частоты 7.8..109к; - CBL_UNDERRUN_APP (по умолчанию, недолив не наша забота) / CBL_UNDERRUN_SILENCE (буфер тишины malloc'ится только в этом режиме); - tests/cbltest: матрица 64 комбинации (2 насоса × 8 форматов × 4 частоты); tests/cblwav: banked-стрим речи с дискеты (физстраницы кэшированы заранее — mem_get_page нельзя звать из fill()/ISR); tests/cblstream: единственный случай с собственным кольцом уровня приложения (диск нельзя читать из fill()). Verified в MAME 2026-07-07 — все три теста работают. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -35,6 +35,12 @@ extern isr_t _irq_ctc_user; /* CTC-handler; NULL = нет */
|
||||
extern uint8_t _irq_old_i; /* I до захвата таблицы */
|
||||
extern uint8_t _irq_refs; /* счётчик пользователей таблицы */
|
||||
|
||||
/* Хук CBL-насоса (libc/cbl регистрирует _cbl_pump). Косвенность
|
||||
* сознательная: прямая ссылка трамплина на cbl-модуль притянула бы
|
||||
* его (и 2 КБ кольца) в каждую irq-программу. NULL = CBL выключен,
|
||||
* трамплин НЕ проверяет бит 7 порта 0xFE (он подтянут к 1). */
|
||||
extern isr_t _irq_cbl_hook;
|
||||
|
||||
/* Порты встроенной периферии Z84C015 (docs/samples/SIO_CTC_KEY.asm). */
|
||||
#define _IRQ_CTC_CH0 0x10
|
||||
#define _IRQ_CTC_CH2 0x12
|
||||
|
||||
Reference in New Issue
Block a user