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