summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/imsai.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/imsai.cpp')
-rw-r--r--src/mame/drivers/imsai.cpp63
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 )