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:
2026-07-07 21:21:54 +03:00
parent 8a952b99eb
commit 5086c47f0f
28 changed files with 1208 additions and 22 deletions
+4 -1
View File
@@ -8,6 +8,9 @@ banklocl 4832
banktest 3767
bios_text 4470
cat 915
cblstream 6234
cbltest 6374
cblwav 6443
conio 4634
conio2 3946
dec_test 860
@@ -23,7 +26,7 @@ gfx_mous 5542
gfx_text 2560
hello 4176
hello2 4251
irqtest 5834
irqtest 5881
ls 4919
malloc 4462
mdview 19122
1 # Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update
8 banktest
9 bios_text
10 cat
11 cblstream
12 cbltest
13 cblwav
14 conio
15 conio2
16 dec_test
26 gfx_text
27 hello
28 hello2
29 irqtest
30 ls
31 malloc
32 mdview