From 5ef3d3a3b59fe47934582f6c816fb92aa24c8459 Mon Sep 17 00:00:00 2001 From: Michael Zapf Date: Mon, 6 Jan 2020 13:54:56 +0100 Subject: [PATCH] ti99: Block invalid accesses to VDP (like writing on read address); fixes Ambulance game. --- src/devices/bus/ti99/internal/datamux.cpp | 40 ++++++++++------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/src/devices/bus/ti99/internal/datamux.cpp b/src/devices/bus/ti99/internal/datamux.cpp index d0e7d05a6c1..91265ab6d5c 100644 --- a/src/devices/bus/ti99/internal/datamux.cpp +++ b/src/devices/bus/ti99/internal/datamux.cpp @@ -123,31 +123,25 @@ datamux_device::datamux_device(const machine_config &mconfig, const char *tag, d void datamux_device::read_all(uint16_t addr, uint8_t *value) { - // Valid access - bool validaccess = ((addr & 0x0400)==0); - - if (validaccess) + // GROM access + if ((addr & 0xfc01)==0x9800) { - // GROM access - if ((addr & 0xf801)==0x9800) + if (m_console_groms_present) { - if (m_console_groms_present) - { - m_grom0->readz(value); - m_grom1->readz(value); - m_grom2->readz(value); - } - // GROMport (GROMs) - m_gromport->readz(addr, value); - m_grom_idle = false; + m_grom0->readz(value); + m_grom1->readz(value); + m_grom2->readz(value); } + // GROMport (GROMs) + m_gromport->readz(addr, value); + m_grom_idle = false; + } - // Video - if ((addr & 0xf801)==0x8800) - { - // Forward to VDP unless we have an EVPC - if (m_video != nullptr) *value = m_video->read(addr>>1); // A14 determines data or register read - } + // Video + if ((addr & 0xfc01)==0x8800) + { + // Forward to VDP unless we have an EVPC + if (m_video != nullptr) *value = m_video->read((addr>>1)&1); // A14 determines data or register read } // GROMport (ROMs) @@ -185,10 +179,10 @@ void datamux_device::write_all(uint16_t addr, uint8_t value) } // Video - if ((addr & 0xf801)==0x8800) + if ((addr & 0xfc01)==0x8c00) { // Forward to VDP unless we have an EVPC - if (m_video != nullptr) m_video->write(addr>>1, value); // A14 determines data or register write + if (m_video != nullptr) m_video->write((addr>>1)&1, value); // A14 determines data or register write } // I/O port gets all accesses