5086c47f0f
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>
25 lines
1.0 KiB
C
25 lines
1.0 KiB
C
/*
|
|
* _cbl_pump_otir — ISR-насос CBL (путь OTIR): зовёт fill() приложения
|
|
* за очередным блоком; при недоливе (fill вернул 0 или не задан) —
|
|
* тишина через cbl_push_otir(), если включён CBL_UNDERRUN_SILENCE.
|
|
*
|
|
* Обычная (не __naked) Си-функция: вызывается из _irq_tramp.c через
|
|
* указатель, а трамплин уже сохранил ВЕСЬ контекст (оба регистровых
|
|
* набора + IX/IY) вокруг вызова — что бы эта функция ни наделала с
|
|
* регистрами, трамплин восстановит всё сам после возврата.
|
|
*/
|
|
|
|
#include "_cbl.h"
|
|
|
|
void _cbl_pump_otir(void)
|
|
{
|
|
_cbl_reqs++;
|
|
int ok = _cbl_fill ? _cbl_fill(_cbl_block) : 0;
|
|
if (!ok) {
|
|
_cbl_undr++;
|
|
if (_cbl_underrun_mode == CBL_UNDERRUN_SILENCE && _cbl_silence) {
|
|
cbl_push_otir(_cbl_silence, _cbl_block);
|
|
}
|
|
}
|
|
}
|