diff options
Diffstat (limited to 'src/mame/drivers/pentagon.cpp')
-rw-r--r-- | src/mame/drivers/pentagon.cpp | 90 |
1 files changed, 42 insertions, 48 deletions
diff --git a/src/mame/drivers/pentagon.cpp b/src/mame/drivers/pentagon.cpp index 0908792973f..1056a8f4a44 100644 --- a/src/mame/drivers/pentagon.cpp +++ b/src/mame/drivers/pentagon.cpp @@ -31,10 +31,12 @@ public: , m_beta(*this, BETA_DISK_TAG) { } - DECLARE_DIRECT_UPDATE_MEMBER(pentagon_direct); DECLARE_WRITE8_MEMBER(pentagon_port_7ffd_w); DECLARE_WRITE8_MEMBER(pentagon_scr_w); DECLARE_WRITE8_MEMBER(pentagon_scr2_w); + DECLARE_READ8_MEMBER(beta_neutral_r); + DECLARE_READ8_MEMBER(beta_enable_r); + DECLARE_READ8_MEMBER(beta_disable_r); DECLARE_MACHINE_RESET(pentagon); INTERRUPT_GEN_MEMBER(pentagon_interrupt); TIMER_CALLBACK_MEMBER(irq_on); @@ -47,49 +49,11 @@ protected: required_device<beta_disk_device> m_beta; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: + address_space *m_program; uint8_t *m_p_ram; void pentagon_update_memory(); }; -DIRECT_UPDATE_MEMBER(pentagon_state::pentagon_direct) -{ - uint16_t pc = m_maincpu->pcbase(); - - if (m_beta->started() && m_beta->is_active() && (pc >= 0x4000)) - { - m_ROMSelection = BIT(m_port_7ffd_data, 4); - m_beta->disable(); - m_bank1->set_base(&m_p_ram[0x10000 + (m_ROMSelection<<14)]); - } - else - if (((pc & 0xff00) == 0x3d00) && (m_ROMSelection==1)) - { - m_ROMSelection = 3; - if (m_beta->started()) - m_beta->enable(); - } - - if (address<=0x3fff) - { - if (m_ROMSelection == 3) - { - if (m_beta->started()) - { - direct.explicit_configure(0x0000, 0x3fff, 0x3fff, memregion("beta:beta")->base()); - m_bank1->set_base(memregion("beta:beta")->base()); - } - } - else - { - direct.explicit_configure(0x0000, 0x3fff, 0x3fff, &m_p_ram[0x10000 + (m_ROMSelection<<14)]); - m_bank1->set_base(&m_p_ram[0x10000 + (m_ROMSelection<<14)]); - } - return ~0; - } - - return address; -} - void pentagon_state::pentagon_update_memory() { uint8_t *messram = m_ram->pointer(); @@ -183,6 +147,34 @@ INTERRUPT_GEN_MEMBER(pentagon_state::pentagon_interrupt) { timer_set(attotime::from_ticks(179, XTAL_14MHz / 4), TIMER_IRQ_ON, 0); } + +READ8_MEMBER(pentagon_state::beta_neutral_r) +{ + return m_program->read_byte(offset); +} + +READ8_MEMBER(pentagon_state::beta_enable_r) +{ + if(m_ROMSelection == 1) { + m_ROMSelection = 3; + if (m_beta->started()) { + m_beta->enable(); + m_bank1->set_base(memregion("beta:beta")->base()); + } + } + return m_program->read_byte(offset + 0x3d00); +} + +READ8_MEMBER(pentagon_state::beta_disable_r) +{ + if (m_beta->started() && m_beta->is_active()) { + m_ROMSelection = BIT(m_port_7ffd_data, 4); + m_beta->disable(); + m_bank1->set_base(&m_p_ram[0x10000 + (m_ROMSelection<<14)]); + } + return m_program->read_byte(offset + 0x4000); +} + static ADDRESS_MAP_START (pentagon_io, AS_IO, 8, pentagon_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0x0000) AM_WRITE(pentagon_port_7ffd_w) AM_MIRROR(0x7ffd) // (A15 | A1) == 0 @@ -196,25 +188,26 @@ static ADDRESS_MAP_START (pentagon_io, AS_IO, 8, pentagon_state ) AM_RANGE(0xc000, 0xc000) AM_DEVREADWRITE("ay8912", ay8910_device, data_r, address_w) AM_MIRROR(0x3ffd) ADDRESS_MAP_END +static ADDRESS_MAP_START (pentagon_switch, AS_DECRYPTED_OPCODES, 8, pentagon_state) + AM_RANGE(0x3d00, 0x3dff) AM_READ(beta_enable_r) + AM_RANGE(0x0000, 0x3fff) AM_READ(beta_neutral_r) // Overlap with previous because we want real addresses on the 3e00-3fff range + AM_RANGE(0x4000, 0xffff) AM_READ(beta_disable_r) +ADDRESS_MAP_END + MACHINE_RESET_MEMBER(pentagon_state,pentagon) { uint8_t *messram = m_ram->pointer(); - address_space &space = m_maincpu->space(AS_PROGRAM); + m_program = &m_maincpu->space(AS_PROGRAM); m_p_ram = memregion("maincpu")->base(); - space.install_read_bank(0x0000, 0x3fff, "bank1"); - space.unmap_write(0x0000, 0x3fff); - - space.install_write_handler(0x4000, 0x5aff, write8_delegate(FUNC(pentagon_state::pentagon_scr_w), this)); - space.install_write_handler(0xc000, 0xdaff, write8_delegate(FUNC(pentagon_state::pentagon_scr2_w), this)); + m_program->install_write_handler(0x4000, 0x5aff, write8_delegate(FUNC(pentagon_state::pentagon_scr_w), this)); + m_program->install_write_handler(0xc000, 0xdaff, write8_delegate(FUNC(pentagon_state::pentagon_scr2_w), this)); if (m_beta->started()) { if (strcmp(machine().system().name, "pent1024")==0) m_beta->enable(); } - space.set_direct_update_handler(direct_update_delegate(&pentagon_state::pentagon_direct, this)); - memset(messram,0,128*1024); /* Bank 5 is always in 0x4000 - 0x7fff */ @@ -252,6 +245,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( pentagon, spectrum_128, pentagon_state ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_CLOCK(XTAL_14MHz / 4) MCFG_CPU_IO_MAP(pentagon_io) + MCFG_CPU_DECRYPTED_OPCODES_MAP(pentagon_switch) MCFG_CPU_VBLANK_INT_DRIVER("screen", pentagon_state, pentagon_interrupt) MCFG_MACHINE_RESET_OVERRIDE(pentagon_state, pentagon ) |