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