mirror of
https://git.k-space.ee/arti/vt1200.git
synced 2026-10-31 12:05:05 +02:00
46 lines
968 B
C++
46 lines
968 B
C++
#include "vt1200_board.h"
|
|
|
|
bool vt1200_board::is_switch_port(uint32_t addr) const
|
|
{
|
|
// The monitor-selection switch lives in bits 4-6 of winner 3's +0xD0
|
|
// register (harness offset 0x0d).
|
|
return addr == (VT1200_WIN3 + VT1200_OFF_SWITCH);
|
|
}
|
|
|
|
uint16_t vt1200_board::read(uint32_t addr)
|
|
{
|
|
auto ov = m_override.find(addr);
|
|
if (ov != m_override.end())
|
|
return ov->second;
|
|
|
|
uint16_t value = m_default;
|
|
auto st = m_store.find(addr);
|
|
if (st != m_store.end())
|
|
value = st->second;
|
|
|
|
if (is_switch_port(addr))
|
|
return (uint16_t)((value & 0xff8f) | (m_switch_bits & 0x0070));
|
|
|
|
if (m_handshake && (addr & 0xffff) == VT1200_OFF_STATUS)
|
|
{
|
|
if (m_busy_left > 0)
|
|
value |= 0x0001;
|
|
else
|
|
value &= ~0x0001;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
void vt1200_board::write(uint32_t addr, uint16_t data)
|
|
{
|
|
m_store[addr] = data;
|
|
if (m_handshake && (addr & 0xffff) == VT1200_OFF_CMD)
|
|
m_busy_left = m_busy_ticks;
|
|
}
|
|
|
|
void vt1200_board::tick()
|
|
{
|
|
if (m_busy_left > 0)
|
|
m_busy_left--;
|
|
}
|