summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/mc1000.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/mc1000.cpp')
-rw-r--r--src/mame/drivers/mc1000.cpp68
1 files changed, 30 insertions, 38 deletions
diff --git a/src/mame/drivers/mc1000.cpp b/src/mame/drivers/mc1000.cpp
index 7735c3124bb..f3be3434285 100644
--- a/src/mame/drivers/mc1000.cpp
+++ b/src/mame/drivers/mc1000.cpp
@@ -77,6 +77,8 @@ public:
required_ioport m_modifiers;
required_ioport_array<2> m_joykeymap;
+ std::unique_ptr<uint8_t[]> m_banked_ram;
+
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -89,7 +91,7 @@ public:
DECLARE_READ8_MEMBER( videoram_r );
DECLARE_WRITE8_MEMBER( keylatch_w );
DECLARE_READ8_MEMBER( keydata_r );
- DIRECT_UPDATE_MEMBER(mc1000_direct_update_handler);
+ DECLARE_READ8_MEMBER( rom_banking_r );
void bankswitch();
@@ -227,7 +229,12 @@ static ADDRESS_MAP_START( mc1000_mem, AS_PROGRAM, 8, mc1000_state )
AM_RANGE(0x4000, 0x7fff) AM_RAMBANK("bank3")
AM_RANGE(0x8000, 0x97ff) AM_RAMBANK("bank4") AM_SHARE("mc6847_vram")
AM_RANGE(0x9800, 0xbfff) AM_RAMBANK("bank5")
- AM_RANGE(0xc000, 0xffff) AM_ROM
+ AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION(Z80_TAG, 0)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( mc1000_banking_mem, AS_DECRYPTED_OPCODES, 8, mc1000_state )
+ AM_RANGE(0xc000, 0xffff) AM_READ(rom_banking_r)
+ AM_IMPORT_FROM(mc1000_mem)
ADDRESS_MAP_END
static ADDRESS_MAP_START( mc1000_io, AS_IO, 8, mc1000_state )
@@ -411,40 +418,45 @@ READ8_MEMBER( mc1000_state::keydata_r )
return data;
}
+
+READ8_MEMBER( mc1000_state::rom_banking_r )
+{
+ membank("bank1")->set_entry(0);
+ m_rom0000 = 0;
+ return m_rom->base()[offset];
+}
+
/* Machine Initialization */
void mc1000_state::machine_start()
{
- address_space &program = m_maincpu->space(AS_PROGRAM);
-
/* setup memory banking */
- uint8_t *rom = m_rom->base();
+ m_banked_ram = make_unique_clear<uint8_t[]>(0xc000);
- program.install_readwrite_bank(0x0000, 0x1fff, "bank1");
- membank("bank1")->configure_entry(0, rom);
- membank("bank1")->configure_entry(1, rom + 0xc000);
+ membank("bank1")->configure_entry(0, m_banked_ram.get());
+ membank("bank1")->configure_entry(1, m_rom->base());
membank("bank1")->set_entry(1);
m_rom0000 = 1;
- program.install_readwrite_bank(0x2000, 0x27ff, "bank2");
- membank("bank2")->configure_entry(0, rom + 0x2000);
+ membank("bank2")->configure_entry(0, m_banked_ram.get() + 0x2000);
membank("bank2")->configure_entry(1, m_mc6845_video_ram);
membank("bank2")->set_entry(0);
- membank("bank3")->configure_entry(0, rom + 0x4000);
+ membank("bank3")->configure_entry(0, m_banked_ram.get() + 0x4000);
membank("bank3")->set_entry(0);
membank("bank4")->configure_entry(0, m_mc6847_video_ram);
- membank("bank4")->configure_entry(1, rom + 0x8000);
+ membank("bank4")->configure_entry(1, m_banked_ram.get() + 0x8000);
membank("bank4")->set_entry(0);
- membank("bank5")->configure_entry(0, rom + 0x9800);
+ membank("bank5")->configure_entry(0, m_banked_ram.get() + 0x9800);
membank("bank5")->set_entry(0);
bankswitch();
/* register for state saving */
+ save_pointer(NAME(m_banked_ram.get()), 0xc000);
save_item(NAME(m_rom0000));
save_item(NAME(m_mc6845_bank));
save_item(NAME(m_mc6847_bank));
@@ -514,6 +526,7 @@ static MACHINE_CONFIG_START( mc1000, mc1000_state )
/* basic machine hardware */
MCFG_CPU_ADD(Z80_TAG, Z80, 3579545)
MCFG_CPU_PROGRAM_MAP(mc1000_mem)
+ MCFG_CPU_DECRYPTED_OPCODES_MAP(mc1000_banking_mem)
MCFG_CPU_IO_MAP(mc1000_io)
/* timers */
@@ -562,34 +575,13 @@ MACHINE_CONFIG_END
/* ROMs */
ROM_START( mc1000 )
- ROM_REGION( 0x10000, Z80_TAG, 0 )
- ROM_LOAD( "mc1000.ic17", 0xc000, 0x2000, CRC(8e78d80d) SHA1(9480270e67a5db2e7de8bc5c8b9e0bb210d4142b) )
- ROM_LOAD( "mc1000.ic12", 0xe000, 0x2000, CRC(750c95f0) SHA1(fd766f5ea4481ef7fd4df92cf7d8397cc2b5a6c4) )
+ ROM_REGION( 0x4000, Z80_TAG, 0 )
+ ROM_LOAD( "mc1000.ic17", 0x0000, 0x2000, CRC(8e78d80d) SHA1(9480270e67a5db2e7de8bc5c8b9e0bb210d4142b) )
+ ROM_LOAD( "mc1000.ic12", 0x2000, 0x2000, CRC(750c95f0) SHA1(fd766f5ea4481ef7fd4df92cf7d8397cc2b5a6c4) )
ROM_END
-/* Driver Initialization */
-
-DIRECT_UPDATE_MEMBER(mc1000_state::mc1000_direct_update_handler)
-{
- if (m_rom0000)
- {
- if (address >= 0xc000)
- {
- membank("bank1")->set_entry(0);
- m_rom0000 = 0;
- }
- }
-
- return address;
-}
-
-DRIVER_INIT_MEMBER(mc1000_state,mc1000)
-{
- m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(&mc1000_state::mc1000_direct_update_handler, this));
-}
-
/* System Drivers */
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
-COMP( 1985, mc1000, 0, 0, mc1000, mc1000, mc1000_state, mc1000, "CCE", "MC-1000", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+COMP( 1985, mc1000, 0, 0, mc1000, mc1000, driver_device, 0, "CCE", "MC-1000", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )