/*
 * _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();
}
