diff options
Diffstat (limited to 'src/mame/drivers/specpls3.cpp')
-rw-r--r-- | src/mame/drivers/specpls3.cpp | 84 |
1 files changed, 54 insertions, 30 deletions
diff --git a/src/mame/drivers/specpls3.cpp b/src/mame/drivers/specpls3.cpp index 64b4695360b..eb427f20a3e 100644 --- a/src/mame/drivers/specpls3.cpp +++ b/src/mame/drivers/specpls3.cpp @@ -198,65 +198,47 @@ READ8_MEMBER( spectrum_state::spectrum_plus3_port_2ffd_r ) void spectrum_state::spectrum_plus3_update_memory() { - address_space &space = m_maincpu->space(AS_PROGRAM); - uint8_t *messram = m_ram->pointer(); - if (m_port_7ffd_data & 8) { logerror("+3 SCREEN 1: BLOCK 7\n"); - m_screen_location = messram + (7 << 14); + m_screen_location = m_ram->pointer() + (7 << 14); } else { logerror("+3 SCREEN 0: BLOCK 5\n"); - m_screen_location = messram + (5 << 14); + m_screen_location = m_ram->pointer() + (5 << 14); } if ((m_port_1ffd_data & 0x01) == 0) { /* select ram at 0x0c000-0x0ffff */ int ram_page = m_port_7ffd_data & 0x07; - unsigned char *ram_data = messram + (ram_page<<14); + unsigned char *ram_data = m_ram->pointer() + (ram_page<<14); membank("bank4")->set_base(ram_data); logerror("RAM at 0xc000: %02x\n", ram_page); /* Reset memory between 0x4000 - 0xbfff in case extended paging was being used */ /* Bank 5 in 0x4000 - 0x7fff */ - membank("bank2")->set_base(messram + (5 << 14)); + membank("bank2")->set_base(m_ram->pointer() + (5 << 14)); /* Bank 2 in 0x8000 - 0xbfff */ - membank("bank3")->set_base(messram + (2 << 14)); - - /* ROM switching */ - int ROMSelection = BIT(m_port_7ffd_data, 4) | ((m_port_1ffd_data >> 1) & 0x02); - - /* rom 0 is editor, rom 1 is syntax, rom 2 is DOS, rom 3 is 48 BASIC */ - unsigned char *ChosenROM = memregion("maincpu")->base() + 0x010000 + (ROMSelection << 14); - - membank("bank1")->set_base(ChosenROM); - space.unmap_write(0x0000, 0x3fff); - - logerror("rom switch: %02x\n", ROMSelection); + membank("bank3")->set_base(m_ram->pointer() + (2 << 14)); } else { /* Extended memory paging */ int MemorySelection = (m_port_1ffd_data >> 1) & 0x03; const int *memory_selection = &spectrum_plus3_memory_selections[(MemorySelection << 2)]; - unsigned char *ram_data = messram + (memory_selection[0] << 14); - - membank("bank1")->set_base(ram_data); - /* allow writes to 0x0000-0x03fff */ - space.install_write_bank(0x0000, 0x3fff, "bank1"); + unsigned char *ram_data = m_ram->pointer() + (memory_selection[0] << 14); - ram_data = messram + (memory_selection[1] << 14); + ram_data = m_ram->pointer() + (memory_selection[1] << 14); membank("bank2")->set_base(ram_data); - ram_data = messram + (memory_selection[2] << 14); + ram_data = m_ram->pointer() + (memory_selection[2] << 14); membank("bank3")->set_base(ram_data); - ram_data = messram + (memory_selection[3] << 14); + ram_data = m_ram->pointer() + (memory_selection[3] << 14); membank("bank4")->set_base(ram_data); logerror("extended memory paging: %02x\n", MemorySelection); @@ -264,6 +246,49 @@ void spectrum_state::spectrum_plus3_update_memory() } +WRITE8_MEMBER(spectrum_state::spectrum_plus3_bank1_w) +{ + if (m_exp->romcs()) + { + m_exp->mreq_w(offset, data); + } + else if ((m_port_1ffd_data & 0x01) != 0) + { + /* Extended memory paging */ + int MemorySelection = (m_port_1ffd_data >> 1) & 0x03; + const int *memory_selection = &spectrum_plus3_memory_selections[(MemorySelection << 2)]; + m_ram->pointer()[(memory_selection[0] << 14) + offset] = data; + } +} + +READ8_MEMBER(spectrum_state::spectrum_plus3_bank1_r) +{ + uint8_t data; + + if (m_exp->romcs()) + { + data = m_exp->mreq_r(offset); + } + else + { + if ((m_port_1ffd_data & 0x01) == 0) + { + /* ROM switching */ + int ROMSelection = BIT(m_port_7ffd_data, 4) | ((m_port_1ffd_data >> 1) & 0x02); + + /* rom 0 is editor, rom 1 is syntax, rom 2 is DOS, rom 3 is 48 BASIC */ + data = memregion("maincpu")->base()[0x010000 + (ROMSelection << 14) + offset]; + } + else + { + /* Extended memory paging */ + int MemorySelection = (m_port_1ffd_data >> 1) & 0x03; + const int *memory_selection = &spectrum_plus3_memory_selections[(MemorySelection << 2)]; + data = m_ram->pointer()[(memory_selection[0] << 14) + offset]; + } + } + return data; +} WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_7ffd_w ) { @@ -307,7 +332,7 @@ WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_1ffd_w ) The function decodes the ports appropriately */ void spectrum_state::spectrum_plus3_io(address_map &map) { - map.unmap_value_high(); + map(0x0000, 0xffff).rw(m_exp, FUNC(spectrum_expansion_slot_device::iorq_r), FUNC(spectrum_expansion_slot_device::iorq_w)); map(0x0000, 0x0000).rw(FUNC(spectrum_state::spectrum_port_fe_r), FUNC(spectrum_state::spectrum_port_fe_w)).select(0xfffe); map(0x4000, 0x4000).w(FUNC(spectrum_state::spectrum_plus3_port_7ffd_w)).mirror(0x3ffd); map(0x8000, 0x8000).w("ay8912", FUNC(ay8910_device::data_w)).mirror(0x3ffd); @@ -319,7 +344,7 @@ void spectrum_state::spectrum_plus3_io(address_map &map) void spectrum_state::spectrum_plus3_mem(address_map &map) { - map(0x0000, 0x3fff).bankr("bank1"); + map(0x0000, 0x3fff).rw(FUNC(spectrum_state::spectrum_plus3_bank1_r), FUNC(spectrum_state::spectrum_plus3_bank1_w)); //.bankr("bank1"); map(0x4000, 0x7fff).bankrw("bank2"); map(0x8000, 0xbfff).bankrw("bank3"); map(0xc000, 0xffff).bankrw("bank4"); @@ -390,7 +415,6 @@ void spectrum_state::spectrum_plus3(machine_config &config) FLOPPY_CONNECTOR(config, "upd765:1", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats); SPECTRUM_EXPANSION_SLOT(config.replace(), m_exp, specpls3_expansion_devices, nullptr); - m_exp->set_io_space(m_maincpu, AS_IO); m_exp->irq_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0); m_exp->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI); |