/* * _cbl_port — разделяемое владение bit7 порта управления 0x004E между * реальной CBL-сессией (cbl_open/cbl_close) и другими держателями * (сейчас — gfx_wait_vsync(), которому нужен только бит 5 порта 0xFE, * доступный лишь пока включён cbl_mode(); см. libc/gfx/gfx_wait_vsync.c * и MAME sprinter.cpp kbd_fe_r). * * Если реальный CBL уже открыт (_irq_cbl_hook != 0) — портом владеет * он, ref/unref его не трогают вообще (это уже нужное состояние). * Иначе включаем/выключаем bit7 "немым" кодом частоты _CBL_VSYNC_FREQ * — таймер CBL при этом коде не заводится (divs[2]=0 в MAME), значит * ни звука, ни прерываний, только доступ к синхро-биту. */ #include "_cbl.h" #include "../irq/_irq.h" void _cbl_port_sync(void) { if (_irq_cbl_hook) return; /* реальный CBL сам владеет портом */ _cbl_ctrl(_cbl_port_refs ? (uint8_t)(0x80 | _CBL_VSYNC_FREQ) : 0); } void _cbl_port_ref(void) { _cbl_port_refs++; _cbl_port_sync(); } void _cbl_port_unref(void) { if (_cbl_port_refs) _cbl_port_refs--; _cbl_port_sync(); }