Files
Sprinter-SDCC/libc/cbl/cbl_push_otir.c
T
snark13 5086c47f0f 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>
2026-07-07 21:21:54 +03:00

28 lines
1.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* cbl_push_otir — пропихнуть n байт из src в CBL через OTIR (порт
* 0x4F). Звать ИЗ fill()-callback'а (см. cbl.h) — приложение само
* решает, откуда брать данные, никакой промежуточной копии в libc.
*
* n — 128 или 256 (см. _cbl_block); низкий байт n (E) даёт готовое
* значение для регистра B: 128 остаётся 128, 256 идёт как 0 (Z80
* OTIR: B=0 значит 256 итераций).
*
* НЕ умеет 16-бит: порт 0x4F всегда кладёт байт как есть в один слот
* (см. cbl.h, cbl_open.c) — для 16-бит нужен cbl_push_accel().
*/
#include "_cbl.h"
void cbl_push_otir(const void *src, uint16_t n) __naked
{
(void)src; (void)n;
__asm
;; HL = src (1-й арг), DE = n (2-й арг) __sdcccall(1)
ld a, e
ld b, a
ld c, #0x4F
otir
ret
__endasm;
}