diff options
Diffstat (limited to 'src/mame/drivers/imsai.cpp')
-rw-r--r-- | src/mame/drivers/imsai.cpp | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/src/mame/drivers/imsai.cpp b/src/mame/drivers/imsai.cpp index 9e17fbb565c..f8b32f2beb9 100644 --- a/src/mame/drivers/imsai.cpp +++ b/src/mame/drivers/imsai.cpp @@ -30,6 +30,7 @@ public: imsai_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_rom(*this, "maincpu") , m_terminal(*this, "terminal") , m_pit(*this, "pit") { } @@ -38,31 +39,33 @@ public: private: void kbd_put(u8 data); - uint8_t keyin_r(); - uint8_t status_r(); - void control_w(uint8_t data); + u8 keyin_r(); + u8 status_r(); + void control_w(u8 data); - void imsai_io(address_map &map); - void imsai_mem(address_map &map); + void io_map(address_map &map); + void mem_map(address_map &map); - uint8_t m_term_data; - virtual void machine_reset() override; + u8 m_term_data; + void machine_reset() override; + void machine_start() override; + memory_passthrough_handler *m_rom_shadow_tap; required_device<cpu_device> m_maincpu; + required_region_ptr<u8> m_rom; required_device<generic_terminal_device> m_terminal; required_device<pit8253_device> m_pit; }; -void imsai_state::imsai_mem(address_map &map) +void imsai_state::mem_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x07ff).rom().region("prom", 0); map(0xd000, 0xd0ff).ram(); map(0xd100, 0xd103).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - map(0xd800, 0xdfff).rom().region("prom", 0); + map(0xd800, 0xdfff).rom().region("maincpu", 0); } -void imsai_state::imsai_io(address_map &map) +void imsai_state::io_map(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); @@ -79,14 +82,14 @@ void imsai_state::imsai_io(address_map &map) static INPUT_PORTS_START( imsai ) INPUT_PORTS_END -uint8_t imsai_state::keyin_r() +u8 imsai_state::keyin_r() { - uint8_t ret = m_term_data; + u8 ret = m_term_data; m_term_data = 0; return ret; } -uint8_t imsai_state::status_r() +u8 imsai_state::status_r() { return (m_term_data) ? 3 : 1; } @@ -96,21 +99,43 @@ void imsai_state::kbd_put(u8 data) m_term_data = data; } -void imsai_state::control_w(uint8_t data) +void imsai_state::control_w(u8 data) { } void imsai_state::machine_reset() { m_term_data = 0; + + address_space &program = m_maincpu->space(AS_PROGRAM); + program.install_rom(0x0000, 0x07ff, m_rom); // do it here for F3 + m_rom_shadow_tap = program.install_read_tap(0xd800, 0xdfff, "rom_shadow_r",[this](offs_t offset, u8 &data, u8 mem_mask) + { + if (!machine().side_effects_disabled()) + { + // delete this tap + m_rom_shadow_tap->remove(); + + // remove from the memory map + m_maincpu->space(AS_PROGRAM).unmap_readwrite(0x0000, 0x07ff); + } + + // return the original data + return data; + }); +} + +void imsai_state::machine_start() +{ + save_item(NAME(m_term_data)); } void imsai_state::imsai(machine_config &config) { /* basic machine hardware */ I8085A(config, m_maincpu, XTAL(6'000'000)); - m_maincpu->set_addrmap(AS_PROGRAM, &imsai_state::imsai_mem); - m_maincpu->set_addrmap(AS_IO, &imsai_state::imsai_io); + m_maincpu->set_addrmap(AS_PROGRAM, &imsai_state::mem_map); + m_maincpu->set_addrmap(AS_IO, &imsai_state::io_map); /* video hardware */ GENERIC_TERMINAL(config, m_terminal, 0); @@ -129,7 +154,7 @@ void imsai_state::imsai(machine_config &config) /* ROM definition */ ROM_START( imsai ) - ROM_REGION( 0x800, "prom", 0 ) // 2716 or 2708 program PROM + ROM_REGION( 0x800, "maincpu", 0 ) // 2716 or 2708 program PROM ROM_LOAD( "vdb-80.rom", 0x0000, 0x0800, CRC(0afc4683) SHA1(a5419aaee00badf339d7c627f50ef8b2538e42e2) ) ROM_REGION( 0x200, "decode", 0 ) // 512x4 address decoder ROM @@ -142,4 +167,4 @@ ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1978, imsai, 0, 0, imsai, imsai, imsai_state, empty_init, "Imsai", "MPU-B", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW ) +COMP( 1978, imsai, 0, 0, imsai, imsai, imsai_state, empty_init, "Imsai", "MPU-B", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE ) |