diff options
Diffstat (limited to 'src/mame/drivers/specpls3.cpp')
-rw-r--r-- | src/mame/drivers/specpls3.cpp | 124 |
1 files changed, 51 insertions, 73 deletions
diff --git a/src/mame/drivers/specpls3.cpp b/src/mame/drivers/specpls3.cpp index 3c3e2855565..deee57e2cec 100644 --- a/src/mame/drivers/specpls3.cpp +++ b/src/mame/drivers/specpls3.cpp @@ -175,7 +175,7 @@ static const int spectrum_plus3_memory_selections[]= WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_w ) { if (m_floppy==1) - m_upd765->fifo_w(data); + m_upd765->fifo_w(space, 0, data, 0xff); } READ8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_r ) @@ -183,7 +183,7 @@ READ8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_r ) if (m_floppy==0) return 0xff; else - return m_upd765->fifo_r(); + return m_upd765->fifo_r(space, 0, 0xff); } @@ -192,53 +192,71 @@ READ8_MEMBER( spectrum_state::spectrum_plus3_port_2ffd_r ) if (m_floppy==0) return 0xff; else - return m_upd765->msr_r(); + return m_upd765->msr_r(space, 0, 0xff); } 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 = m_ram->pointer() + (7 << 14); + m_screen_location = messram + (7 << 14); } else { logerror("+3 SCREEN 0: BLOCK 5\n"); - m_screen_location = m_ram->pointer() + (5 << 14); + m_screen_location = messram + (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 = m_ram->pointer() + (ram_page<<14); + unsigned char *ram_data = messram + (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(m_ram->pointer() + (5 << 14)); + membank("bank2")->set_base(messram + (5 << 14)); /* Bank 2 in 0x8000 - 0xbfff */ - membank("bank3")->set_base(m_ram->pointer() + (2 << 14)); + 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); } 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 = m_ram->pointer() + (memory_selection[0] << 14); + unsigned char *ram_data = messram + (memory_selection[0] << 14); - ram_data = m_ram->pointer() + (memory_selection[1] << 14); + membank("bank1")->set_base(ram_data); + /* allow writes to 0x0000-0x03fff */ + space.install_write_bank(0x0000, 0x3fff, "bank1"); + + ram_data = messram + (memory_selection[1] << 14); membank("bank2")->set_base(ram_data); - ram_data = m_ram->pointer() + (memory_selection[2] << 14); + ram_data = messram + (memory_selection[2] << 14); membank("bank3")->set_base(ram_data); - ram_data = m_ram->pointer() + (memory_selection[3] << 14); + ram_data = messram + (memory_selection[3] << 14); membank("bank4")->set_base(ram_data); logerror("extended memory paging: %02x\n", MemorySelection); @@ -246,49 +264,6 @@ 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 ) { @@ -332,7 +307,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(0x0000, 0xffff).rw(m_exp, FUNC(spectrum_expansion_slot_device::iorq_r), FUNC(spectrum_expansion_slot_device::iorq_w)); + map.unmap_value_high(); 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); @@ -344,7 +319,7 @@ void spectrum_state::spectrum_plus3_io(address_map &map) void spectrum_state::spectrum_plus3_mem(address_map &map) { - map(0x0000, 0x3fff).rw(FUNC(spectrum_state::spectrum_plus3_bank1_r), FUNC(spectrum_state::spectrum_plus3_bank1_w)); //.bankr("bank1"); + map(0x0000, 0x3fff).bankr("bank1"); map(0x4000, 0x7fff).bankrw("bank2"); map(0x8000, 0xbfff).bankrw("bank3"); map(0xc000, 0xffff).bankrw("bank4"); @@ -366,11 +341,17 @@ MACHINE_RESET_MEMBER(spectrum_state,spectrum_plus3) void spectrum_state::init_plus3() { m_floppy = 1; + + // setup expansion slot + m_exp->set_io_space(&m_maincpu->space(AS_IO)); } void spectrum_state::init_plus2() { m_floppy = 0; + + // setup expansion slot + m_exp->set_io_space(&m_maincpu->space(AS_IO)); } static void specpls3_floppies(device_slot_interface &device) @@ -397,29 +378,26 @@ static GFXDECODE_START( specpls3 ) GFXDECODE_END -void spectrum_state::spectrum_plus3(machine_config &config) -{ +MACHINE_CONFIG_START(spectrum_state::spectrum_plus3) spectrum_128(config); - - m_maincpu->set_addrmap(AS_PROGRAM, &spectrum_state::spectrum_plus3_mem); - m_maincpu->set_addrmap(AS_IO, &spectrum_state::spectrum_plus3_io); - - m_screen->set_refresh_hz(50.01); - - subdevice<gfxdecode_device>("gfxdecode")->set_info(specpls3); + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(spectrum_plus3_mem) + MCFG_DEVICE_IO_MAP(spectrum_plus3_io) + MCFG_SCREEN_MODIFY("screen") + MCFG_SCREEN_REFRESH_RATE(50.01) + MCFG_GFXDECODE_MODIFY("gfxdecode", specpls3) MCFG_MACHINE_RESET_OVERRIDE(spectrum_state, spectrum_plus3 ) UPD765A(config, m_upd765, 4'000'000, true, true); - FLOPPY_CONNECTOR(config, "upd765:0", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats); - FLOPPY_CONNECTOR(config, "upd765:1", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats); + MCFG_FLOPPY_DRIVE_ADD("upd765:0", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("upd765:1", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats) - SPECTRUM_EXPANSION_SLOT(config.replace(), m_exp, specpls3_expansion_devices, nullptr); - m_exp->irq_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0); - m_exp->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI); + MCFG_DEVICE_MODIFY("exp") + MCFG_DEVICE_SLOT_INTERFACE(specpls3_expansion_devices, nullptr, false) - SOFTWARE_LIST(config, "flop_list").set_original("specpls3_flop"); -} + MCFG_SOFTWARE_LIST_ADD("flop_list", "specpls3_flop") +MACHINE_CONFIG_END /*************************************************************************** |