summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mess/drivers/bbc.c227
-rw-r--r--src/mess/includes/bbc.h39
-rw-r--r--src/mess/machine/bbc.c264
3 files changed, 298 insertions, 232 deletions
diff --git a/src/mess/drivers/bbc.c b/src/mess/drivers/bbc.c
index 53953dd2cbf..f357f2e364f 100644
--- a/src/mess/drivers/bbc.c
+++ b/src/mess/drivers/bbc.c
@@ -159,7 +159,7 @@ static ADDRESS_MAP_START( bbca_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC # ECONET controller */
AM_RANGE(0xfec0, 0xfedf) AM_NOP /* fec0-fedf uPD7002 # Analogue to digital converter */
AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA # Tube system interface */
- AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x13f00) /* ff00-ffff OS Rom (continued) */
+ AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("os", 0x3f00) /* ff00-ffff OS Rom (continued) */
ADDRESS_MAP_END
@@ -187,7 +187,7 @@ static ADDRESS_MAP_START( bbcb_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC ECONET controller */
AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002", upd7002_device, read, write) /* fec0-fedf uPD7002 Analogue to digital converter */
AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */
- AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* ff00-ffff OS Rom (continued) */
+ AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("os", 0x3f00) /* ff00-ffff OS Rom (continued) */
ADDRESS_MAP_END
@@ -216,7 +216,7 @@ static ADDRESS_MAP_START( bbcbp_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC ECONET controller */
AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002", upd7002_device, read, write) /* fec0-fedf uPD7002 Analogue to digital converter */
AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */
- AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* ff00-ffff OS Rom (continued) */
+ AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("os", 0x3f00) /* ff00-ffff OS Rom (continued) */
ADDRESS_MAP_END
@@ -246,7 +246,7 @@ static ADDRESS_MAP_START( bbcbp128_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0xfea0, 0xfebf) AM_READ(bbc_fe_r) /* fea0-febf 68B54 ADLC ECONET controller */
AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002", upd7002_device, read, write) /* fec0-fedf uPD7002 Analogue to digital converter */
AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */
- AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* ff00-ffff OS Rom (continued) */
+ AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("os", 0x3f00) /* ff00-ffff OS Rom (continued) */
ADDRESS_MAP_END
@@ -280,9 +280,9 @@ static ADDRESS_MAP_START(bbcm_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0x8000, 0x8fff) AM_READ_BANK("bank4") AM_WRITE(bbc_memorybm4_w) /* 8000-8fff Paged ROM/RAM or 4K of RAM ANDY */
AM_RANGE(0x9000, 0xbfff) AM_READ_BANK("bank5") AM_WRITE(bbc_memorybm5_w) /* 9000-bfff Rest of paged ROM/RAM area */
AM_RANGE(0xc000, 0xdfff) AM_READ_BANK("bank7") AM_WRITE(bbc_memorybm7_w) /* c000-dfff OS ROM or 8K of RAM HAZEL */
- AM_RANGE(0xe000, 0xfbff) AM_ROM AM_REGION("user1", 0x42000) /* e000-fbff OS ROM */
+ AM_RANGE(0xe000, 0xfbff) AM_ROM AM_REGION("os", 0x2000) /* e000-fbff OS ROM */
AM_RANGE(0xfc00, 0xfeff) AM_READ_BANK("bank8") AM_WRITE(bbcm_w) /* this is now processed directly because it can be ROM or hardware */
- AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("user1", 0x43f00) /* ff00-ffff OS ROM (continued) */
+ AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("os", 0x3f00) /* ff00-ffff OS ROM (continued) */
ADDRESS_MAP_END
@@ -313,7 +313,7 @@ INPUT_CHANGED_MEMBER(bbc_state::trigger_reset)
/* Port Key description Emulated key Natural key Shift 1 Shift 2 (Ctrl) */
static INPUT_PORTS_START(bbc_keyboard)
- PORT_START("COL0") /* KEYBOARD COLUMN 0 */
+ PORT_START("COL0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F0") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
@@ -323,7 +323,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ESCAPE") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
- PORT_START("COL1") /* KEYBOARD COLUMN 1 */
+ PORT_START("COL1")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W')
@@ -333,7 +333,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
- PORT_START("COL2") /* KEYBOARD COLUMN 2 */
+ PORT_START("COL2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E')
@@ -343,7 +343,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
- PORT_START("COL3") /* KEYBOARD COLUMN 3 */
+ PORT_START("COL3")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T')
@@ -353,7 +353,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
- PORT_START("COL4") /* KEYBOARD COLUMN 4 */
+ PORT_START("COL4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 \\") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
@@ -363,7 +363,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
- PORT_START("COL5") /* KEYBOARD COLUMN 5 */
+ PORT_START("COL5")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I')
@@ -373,7 +373,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F6") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
- PORT_START("COL6") /* KEYBOARD COLUMN 6 */
+ PORT_START("COL6")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F7") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 )") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
@@ -383,7 +383,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
- PORT_START("COL7") /* KEYBOARD COLUMN 7 */
+ PORT_START("COL7")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("- =") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
@@ -393,7 +393,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
- PORT_START("COL8") /* KEYBOARD COLUMN 8 */
+ PORT_START("COL8")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("^ ~") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('^') PORT_CHAR('~')
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("_ \xC2\xA3") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('_') PORT_CHAR('\xA3')
@@ -403,7 +403,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\ |") PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('\\') PORT_CHAR('|')
- PORT_START("COL9") /* KEYBOARD COLUMN 9 */
+ PORT_START("COL9")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("LEFT") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DOWN") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
@@ -413,7 +413,7 @@ static INPUT_PORTS_START(bbc_keyboard)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("COPY") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END))
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
- PORT_START("BRK") /* BREAK */
+ PORT_START("BRK")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("BREAK") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, trigger_reset, 0)
/* Keyboard columns 10 -> 12 are reserved for BBC Master */
@@ -428,7 +428,7 @@ INPUT_PORTS_END
static INPUT_PORTS_START(bbc_keypad)
- PORT_MODIFY("COL10") /* KEYBOARD COLUMN 10 */
+ PORT_MODIFY("COL10")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
@@ -438,7 +438,7 @@ static INPUT_PORTS_START(bbc_keypad)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
- PORT_MODIFY("COL11") /* KEYBOARD COLUMN 11 */
+ PORT_MODIFY("COL11")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
@@ -448,7 +448,7 @@ static INPUT_PORTS_START(bbc_keypad)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
- PORT_MODIFY("COL12") /* KEYBOARD COLUMN 12 */
+ PORT_MODIFY("COL12")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
@@ -461,42 +461,42 @@ INPUT_PORTS_END
static INPUT_PORTS_START(bbc_dipswitch)
- PORT_MODIFY("COL2") /* KEYBOARD COLUMN 2 */
+ PORT_MODIFY("COL2")
PORT_DIPNAME(0x01, 0x01, "DIP 8 (Default File System)")
PORT_DIPSETTING( 0x00, "NFS" )
PORT_DIPSETTING( 0x01, "DFS" )
- PORT_MODIFY("COL3") /* KEYBOARD COLUMN 3 */
+ PORT_MODIFY("COL3")
PORT_DIPNAME(0x01, 0x01, "DIP 7 (Not Used)")
PORT_DIPSETTING( 0x00, DEF_STR( Off ))
PORT_DIPSETTING( 0x01, DEF_STR( On ))
- PORT_MODIFY("COL4") /* KEYBOARD COLUMN 4 */
+ PORT_MODIFY("COL4")
PORT_DIPNAME(0x01, 0x01, "DIP 6 (Disc Timings)")
PORT_DIPSETTING( 0x00, DEF_STR( Off ))
PORT_DIPSETTING( 0x01, DEF_STR( On ))
- PORT_MODIFY("COL5") /* KEYBOARD COLUMN 5 */
+ PORT_MODIFY("COL5")
PORT_DIPNAME(0x01, 0x01, "DIP 5 (Disc Timings)")
PORT_DIPSETTING( 0x00, DEF_STR( Off ))
PORT_DIPSETTING( 0x01, DEF_STR( On ))
- PORT_MODIFY("COL6") /* KEYBOARD COLUMN 6 */
+ PORT_MODIFY("COL6")
PORT_DIPNAME(0x01, 0x01, "DIP 4 (Boot)")
PORT_DIPSETTING( 0x00, "SHIFT" )
PORT_DIPSETTING( 0x01, "SHIFT-BREAK" )
- PORT_MODIFY("COL7") /* KEYBOARD COLUMN 7 */
+ PORT_MODIFY("COL7")
PORT_DIPNAME(0x01, 0x01, "DIP 3 (Screen Mode)")
PORT_DIPSETTING( 0x00, "+0" )
PORT_DIPSETTING( 0x01, "+4" )
- PORT_MODIFY("COL8") /* KEYBOARD COLUMN 8 */
+ PORT_MODIFY("COL8")
PORT_DIPNAME(0x01, 0x01, "DIP 2 (Screen Mode)")
PORT_DIPSETTING( 0x00, "+0" )
PORT_DIPSETTING( 0x01, "+2" )
- PORT_MODIFY("COL9") /* KEYBOARD COLUMN 9 */
+ PORT_MODIFY("COL9")
PORT_DIPNAME(0x01, 0x01, "DIP 1 (Screen Mode)")
PORT_DIPSETTING( 0x00, "+0" )
PORT_DIPSETTING( 0x01, "+1" )
@@ -614,30 +614,23 @@ WRITE_LINE_MEMBER(bbc_state::econet_clk_w)
m_adlc->txc_w(state);
}
-static MACHINE_CONFIG_FRAGMENT( bbc_cartslot )
- MCFG_CARTSLOT_ADD("exp_rom1")
- MCFG_CARTSLOT_EXTENSION_LIST("rom")
- MCFG_CARTSLOT_NOT_MANDATORY
- MCFG_CARTSLOT_LOAD(bbc_state, bbc_exp_rom)
- MCFG_CARTSLOT_INTERFACE("bbc_cart")
-
- MCFG_CARTSLOT_ADD("exp_rom2")
- MCFG_CARTSLOT_EXTENSION_LIST("rom")
- MCFG_CARTSLOT_NOT_MANDATORY
- MCFG_CARTSLOT_LOAD(bbc_state, bbc_exp_rom)
- MCFG_CARTSLOT_INTERFACE("bbc_cart")
-
- MCFG_CARTSLOT_ADD("exp_rom3")
- MCFG_CARTSLOT_EXTENSION_LIST("rom")
- MCFG_CARTSLOT_NOT_MANDATORY
- MCFG_CARTSLOT_LOAD(bbc_state, bbc_exp_rom)
- MCFG_CARTSLOT_INTERFACE("bbc_cart")
-
- MCFG_CARTSLOT_ADD("exp_rom4")
- MCFG_CARTSLOT_EXTENSION_LIST("rom")
- MCFG_CARTSLOT_NOT_MANDATORY
- MCFG_CARTSLOT_LOAD(bbc_state, bbc_exp_rom)
- MCFG_CARTSLOT_INTERFACE("bbc_cart")
+// 4 x EPROM sockets (16K) in BBC-A, these should grow to 16 for BBC-B and later...
+static MACHINE_CONFIG_FRAGMENT( bbc_eprom_sockets )
+ MCFG_GENERIC_SOCKET_ADD("exp_rom1", generic_linear_slot, "bbc_cart")
+ MCFG_GENERIC_EXTENSIONS("bin,rom")
+ MCFG_GENERIC_LOAD(bbc_state, exp1_load)
+
+ MCFG_GENERIC_SOCKET_ADD("exp_rom2", generic_linear_slot, "bbc_cart")
+ MCFG_GENERIC_EXTENSIONS("bin,rom")
+ MCFG_GENERIC_LOAD(bbc_state, exp2_load)
+
+ MCFG_GENERIC_SOCKET_ADD("exp_rom3", generic_linear_slot, "bbc_cart")
+ MCFG_GENERIC_EXTENSIONS("bin,rom")
+ MCFG_GENERIC_LOAD(bbc_state, exp3_load)
+
+ MCFG_GENERIC_SOCKET_ADD("exp_rom4", generic_linear_slot, "bbc_cart")
+ MCFG_GENERIC_EXTENSIONS("bin,rom")
+ MCFG_GENERIC_LOAD(bbc_state, exp4_load)
MACHINE_CONFIG_END
@@ -718,6 +711,9 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_porta))
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_portb))
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_system_irq_w))
+
+ /* EPROM sockets */
+ MCFG_FRAGMENT_ADD(bbc_eprom_sockets)
MACHINE_CONFIG_END
@@ -770,9 +766,6 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface)
- /* cartridges */
- MCFG_FRAGMENT_ADD(bbc_cartslot)
-
/* software lists */
MCFG_DEVICE_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
@@ -835,9 +828,6 @@ static MACHINE_CONFIG_DERIVED( bbcb_us, bbca )
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface)
- /* cartridges */
- MCFG_FRAGMENT_ADD(bbc_cartslot)
-
/* software lists */
MCFG_DEVICE_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
@@ -941,17 +931,12 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
MCFG_CASSETTE_INTERFACE("bbc_cass")
- /* cartridges */
- MCFG_CARTSLOT_ADD("cart1")
- MCFG_CARTSLOT_EXTENSION_LIST("bin")
- MCFG_CARTSLOT_NOT_MANDATORY
- MCFG_CARTSLOT_LOAD(bbc_state, bbcm_cart)
- MCFG_CARTSLOT_INTERFACE("bbcm_cart")
- MCFG_CARTSLOT_ADD("cart2")
- MCFG_CARTSLOT_EXTENSION_LIST("bin")
- MCFG_CARTSLOT_NOT_MANDATORY
- MCFG_CARTSLOT_LOAD(bbc_state, bbcm_cart)
- MCFG_CARTSLOT_INTERFACE("bbcm_cart")
+ // 2 x EPROM sockets (32K) in BBC-Master
+ MCFG_GENERIC_SOCKET_ADD("exp_rom1", generic_plain_slot, "bbcm_cart")
+ MCFG_GENERIC_LOAD(bbc_state, bbcm_exp1_load)
+
+ MCFG_GENERIC_SOCKET_ADD("exp_rom2", generic_plain_slot, "bbcm_cart")
+ MCFG_GENERIC_LOAD(bbc_state, bbcm_exp2_load)
/* software lists */
MCFG_SOFTWARE_LIST_ADD("cass_ls_m", "bbcm_cass")
@@ -1002,9 +987,6 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface)
- /* rom slots */
- MCFG_FRAGMENT_ADD(bbc_cartslot)
-
/* econet */
MCFG_DEVICE_ADD("mc6854", MC6854, 0)
MCFG_MC6854_OUT_TXD_CB(DEVWRITELINE(ECONET_TAG, econet_device, data_w))
@@ -1103,7 +1085,7 @@ MACHINE_CONFIG_END
ROM_START(bbca)
ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */
- ROM_REGION(0x14000,"user1",0) /* ROM */
+ ROM_REGION(0x14000,"option",0) /* ROM */
/* rom page 0 00000 */
/* rom page 1 04000 */
/* rom page 2 08000 */
@@ -1133,19 +1115,22 @@ ROM_START(bbca)
ROMX_LOAD("basic1.rom", 0x04000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(6)) /* rom page 1 04000 */
ROMX_LOAD("basic1.rom", 0x08000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(6)) /* rom page 2 08000 */
ROMX_LOAD("basic1.rom", 0x0c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(6)) /* rom page 3 0c000 */
+
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x10000, 0, 0x4000)
ROM_END
+
/* 0000- 7fff ram */
-/* 8000- bfff not used, this area is mapped over with one of the roms at 10000 and above */
-/* c000- ffff OS rom and memory mapped hardware at fc00-feff */
-/* 10000-4ffff 16 paged rom banks mapped back into 8000-bfff by the page rom select */
+/* 8000- bfff this area is mapped over with one of the roms from "option" region 0x00000-0x40000 */
+/* c000- ffff OS rom and memory mapped hardware at fc00-feff, from "option" region 0x40000-0x44000 */
ROM_START(bbcb)
ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
/* rom page 0 00000 */
/* rom page 1 04000 */
/* rom page 2 08000 */
@@ -1176,7 +1161,10 @@ ROM_START(bbcb)
ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(4)) /* os */
ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(4)) /* rom page 15 3c000 */
- ROM_REGION(0x20000,"user2",0) /* DFS ROMS */
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
+ ROM_REGION(0x20000,"dfs",0) /* DFS ROMS */
ROM_LOAD("dfs09.rom", 0x00000, 0x2000, CRC(3ce609cf) SHA1(5cc0f14b8f46855c70eaa653cca4ad079b458732))
ROM_RELOAD( 0x02000, 0x2000 )
ROM_LOAD("dnfs.rom", 0x04000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232))
@@ -1199,7 +1187,7 @@ ROM_END
ROM_START(bbcb_de)
ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
/* rom page 0 00000 */
/* rom page 1 04000 */
/* rom page 2 08000 */
@@ -1221,7 +1209,10 @@ ROM_START(bbcb_de)
ROMX_LOAD("os_de.rom", 0x40000, 0x4000, CRC(b7262caf) SHA1(aadf90338ee9d1c85dfa73beba50e930c2a38f10), ROM_BIOS(1))
ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1)) /* rom page 15 3c000 */
- ROM_REGION(0x20000,"user2",0) /* DFS ROMS */
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
+ ROM_REGION(0x20000,"dfs",0) /* DFS ROMS */
ROM_LOAD("dfs09.rom", 0x00000, 0x2000, CRC(3ce609cf) SHA1(5cc0f14b8f46855c70eaa653cca4ad079b458732))
ROM_RELOAD( 0x02000, 0x2000 )
@@ -1238,7 +1229,7 @@ ROM_END
ROM_START(bbcb_us)
ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
/* rom page 0 00000 */
/* rom page 1 04000 */
/* rom page 2 08000 */
@@ -1260,7 +1251,10 @@ ROM_START(bbcb_us)
ROMX_LOAD("os10_us.rom", 0x40000, 0x4000, CRC(c8e946a9) SHA1(83d91d089dca092d2c8b7c3650ff8143c9069b89), ROM_BIOS(1))
ROMX_LOAD("basic3.rom", 0x3c000, 0x4000, CRC(161b9539) SHA1(b39014610a968789afd7695aa04d1277d874405c), ROM_BIOS(1)) /* rom page 15 3c000 */
- ROM_REGION(0x20000,"user2",0) /* DFS ROMS */
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
+ ROM_REGION(0x20000,"dfs",0) /* DFS ROMS */
ROM_LOAD("dfs09.rom", 0x00000, 0x2000, CRC(3ce609cf) SHA1(5cc0f14b8f46855c70eaa653cca4ad079b458732))
ROM_RELOAD( 0x02000, 0x2000 )
@@ -1280,7 +1274,7 @@ ROM_END
ROM_START(bbcbp)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("os20")
ROM_SYSTEM_BIOS( 0, "os20", "OS 2.00" )
ROMX_LOAD("bpos2.ic71", 0x3c000, 0x4000, CRC(9f356396) SHA1(ea7d3a7e3ee1ecfaa1483af994048057362b01f2), ROM_BIOS(1)) /* rom page 15 3C000 BASIC */
@@ -1303,13 +1297,16 @@ ROM_START(bbcbp)
/* rom page 15 3C000 BASIC */
/* ddfs 2.23 this is acorns 1770 disc controller Double density disc filing system */
ROM_LOAD("ddfs223.rom", 0x1c000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa))
+
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
ROM_END
ROM_START(bbcbp128)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("os20")
ROM_SYSTEM_BIOS( 0, "os20", "OS 2.00" )
ROMX_LOAD("bpos2.ic71", 0x3c000, 0x4000, CRC(9f356396) SHA1(ea7d3a7e3ee1ecfaa1483af994048057362b01f2), ROM_BIOS(1)) /* rom page 15 3C000 BASIC */
@@ -1332,19 +1329,22 @@ ROM_START(bbcbp128)
/* rom page 15 3C000 BASIC */
/* ddfs 2.23 this is acorns 1770 disc controller Double density disc filing system */
ROM_LOAD("ddfs223.rom", 0x1c000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa))
+
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
ROM_END
ROM_START(bbcm)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("mos350")
ROM_SYSTEM_BIOS( 0, "mos350", "Enhanced MOS 3.50" )
ROMX_LOAD("mos350.ic24", 0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803), ROM_BIOS(1))
ROM_SYSTEM_BIOS( 1, "mos320", "Original MOS 3.20" )
ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(2))
- ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
+ ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
ROM_FILL(0x20000, 0x4000, 0xFFFF)
/* 00000 rom 0 Rear Cartridge bottom 16K */
/* 04000 rom 1 Rear Cartridge top 16K */
@@ -1364,6 +1364,9 @@ ROM_START(bbcm)
/* 3c000 rom 15 Terminal + Tube host + CFS */
// ROM_LOAD("anfs424.rom", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853) ) // TODO where to load this?
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
ROM_REGION(0x40,"rtc",0) /* mc146818 */
/* Factory defaulted CMOS RAM, sets default language ROM, etc. */
ROMX_LOAD("mos350.cmos", 0x00, 0x40, CRC(e84c1854) SHA1(f3cb7f12b7432caba28d067f01af575779220aac), ROM_BIOS(1))
@@ -1374,13 +1377,13 @@ ROM_END
ROM_START(bbcmt)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("mos350")
ROM_SYSTEM_BIOS( 0, "mos350", "Enhanced MOS 3.50" )
ROMX_LOAD("mos350.ic24", 0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803), ROM_BIOS(1))
ROM_SYSTEM_BIOS( 1, "mos320", "Original MOS 3.20" )
ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(2))
- ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
+ ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
ROM_FILL(0x20000, 0x4000, 0xFFFF)
/* 00000 rom 0 Rear Cartridge bottom 16K */
/* 04000 rom 1 Rear Cartridge top 16K */
@@ -1400,6 +1403,9 @@ ROM_START(bbcmt)
/* 3c000 rom 15 Terminal + Tube host + CFS */
// ROM_LOAD("anfs424.ic27", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853) ) // TODO where to load this?
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
ROM_REGION(0x40,"rtc",0) /* mc146818 */
/* Factory defaulted CMOS RAM, sets default language ROM, etc. */
ROMX_LOAD("mos350.cmos", 0x00, 0x40, CRC(e84c1854) SHA1(f3cb7f12b7432caba28d067f01af575779220aac), ROM_BIOS(1))
@@ -1410,11 +1416,11 @@ ROM_END
ROM_START(bbcmaiv)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("mos320")
ROM_SYSTEM_BIOS( 0, "mos320", "MOS 3.20" )
ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(1))
- ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
+ ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
ROM_FILL(0x20000, 0x4000, 0xFFFF)
/* 00000 rom 0 Rear Cartridge bottom 16K */
/* 04000 rom 1 Rear Cartridge top 16K */
@@ -1434,6 +1440,9 @@ ROM_START(bbcmaiv)
/* 3c000 rom 15 Terminal + Tube host + CFS */
ROM_LOAD("vfs170.rom", 0x20000, 0x4000, CRC(b124a0bb) SHA1(ba31c757815cf470402d7829a70a0e1d3fb1355b) )
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
ROM_REGION(0x40,"rtc",0) /* mc146818 */
/* Factory defaulted CMOS RAM, sets default language ROM, etc. */
ROMX_LOAD("mos320aiv.cmos", 0x0E, 0x32, BAD_DUMP CRC(b9ae42a1) SHA1(abf3e94b013f24027ca36c96720963c3411e93f8), ROM_BIOS(1))
@@ -1443,12 +1452,12 @@ ROM_END
ROM_START(bbcmet)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("mos400")
ROM_SYSTEM_BIOS( 0, "mos400", "Econet MOS 4.00" )
ROMX_LOAD("mos400.ic24", 0x20000, 0x10000, BAD_DUMP CRC(81729034) SHA1(d4bc2c7f5e66b5298786138f395908e70c772971), ROM_BIOS(1)) /* Merged individual ROM bank dumps */
- ROM_COPY("user1", 0x24000, 0x34000, 0xC000) /* Mirror */
- ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
+ ROM_COPY("option", 0x24000, 0x34000, 0xC000) /* Mirror */
+ ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
ROM_FILL(0x20000, 0x4000, 0xFFFF)
/* 00000 rom 0 Rear Cartridge bottom 16K */
/* 04000 rom 1 Rear Cartridge top 16K */
@@ -1467,6 +1476,9 @@ ROM_START(bbcmet)
/* 38000 rom 14 ANFS */
/* 3c000 rom 15 MOS code */
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
ROM_REGION(0x40,"rtc",0) /* mc146818 */
/* Factory defaulted CMOS RAM, sets default language ROM, etc. */
ROMX_LOAD("mos400.cmos", 0x0E, 0x32, BAD_DUMP CRC(fff41cc5) SHA1(3607568758f90b3bd6c7dc9533e2aa24f9806ff3), ROM_BIOS(1))
@@ -1476,13 +1488,13 @@ ROM_END
ROM_START(bbcm512)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("mos350")
ROM_SYSTEM_BIOS( 0, "mos350", "Enhanced MOS 3.50" )
ROMX_LOAD("mos350.ic24", 0x20000, 0x20000, CRC(141027b9) SHA1(85211b5bc7c7a269952d2b063b7ec0e1f0196803), ROM_BIOS(1))
ROM_SYSTEM_BIOS( 1, "mos320", "Original MOS 3.20" )
ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(2))
- ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
+ ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
ROM_FILL(0x20000, 0x4000, 0xFFFF)
/* 00000 rom 0 Rear Cartridge bottom 16K */
/* 04000 rom 1 Rear Cartridge top 16K */
@@ -1502,6 +1514,9 @@ ROM_START(bbcm512)
/* 3c000 rom 15 Terminal + Tube host + CFS */
// ROM_LOAD("anfs424.ic27", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853) )
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
ROM_REGION(0x40,"rtc",0) /* mc146818 */
/* Factory defaulted CMOS RAM, sets default language ROM, etc. */
ROMX_LOAD("mos350.cmos", 0x00, 0x40, CRC(e84c1854) SHA1(f3cb7f12b7432caba28d067f01af575779220aac), ROM_BIOS(1))
@@ -1512,11 +1527,11 @@ ROM_END
ROM_START(bbcmarm)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("mos320")
ROM_SYSTEM_BIOS( 0, "mos320", "Original MOS 3.20" )
ROMX_LOAD("mos320.ic24", 0x20000, 0x20000, CRC(0cfad2ce) SHA1(0275719aa7746dd3b627f95ccc4362b564063a5e), ROM_BIOS(1))
- ROM_COPY("user1", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
+ ROM_COPY("option", 0x20000, 0x40000, 0x4000) /* Move loaded roms into place */
ROM_FILL(0x20000, 0x4000, 0xFFFF)
/* 00000 rom 0 Rear Cartridge bottom 16K */
/* 04000 rom 1 Rear Cartridge top 16K */
@@ -1536,6 +1551,9 @@ ROM_START(bbcmarm)
/* 3c000 rom 15 Terminal + Tube host + CFS */
// ROM_LOAD("anfs424.ic27", 0x20000, 0x4000, CRC(1b9f75fd) SHA1(875f71edd48f87c3a55371409d0cc2015d8b5853) )
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
ROM_REGION(0x40,"rtc",0) /* mc146818 */
/* Factory defaulted CMOS RAM, sets default language ROM, etc. */
ROMX_LOAD("mos320arm.cmos", 0x00, 0x40, CRC(56117257) SHA1(ed98563bef18f9d2a0b2d941cd20823d760fb127), ROM_BIOS(1))
@@ -1545,14 +1563,13 @@ ROM_END
ROM_START(bbcmc)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("mos510")
ROM_SYSTEM_BIOS( 0, "mos510", "Enhanced MOS 5.10" )
ROMX_LOAD("mos510.ic49", 0x30000, 0x10000, BAD_DUMP CRC(9a2a6086) SHA1(094ab37b0b6437c4f1653eaa0602ef102737adb6), ROM_BIOS(1)) /* Merged individual ROM bank dumps */
ROM_SYSTEM_BIOS( 1, "mos500", "Original MOS 5.00" )
ROMX_LOAD("mos500.ic49", 0x30000, 0x10000, BAD_DUMP CRC(f6170023) SHA1(140d002d2d9cd34b47197a2ba823505af2a84633), ROM_BIOS(2)) /* Merged individual ROM bank dumps */
-
- ROM_COPY("user1", 0x30000, 0x40000, 0x4000) /* Move loaded roms into place */
+ ROM_COPY("option", 0x30000, 0x40000, 0x4000) /* Move loaded roms into place */
ROM_FILL(0x30000, 0x4000, 0xFFFF)
/* 00000 rom 0 EXTERNAL */
/* 04000 rom 1 EXTERNAL */
@@ -1571,6 +1588,9 @@ ROM_START(bbcmc)
/* 38000 rom 14 BASIC */
/* 3c000 rom 15 Utils */
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
// ROM_REGION(0x80,"mc146818",0) /* mc146818 */
/* Factory defaulted CMOS RAM, sets default language ROM, etc. */
// ROM_LOAD("mos500.cmos", 0x00, 0x80, CRC(d8458039) SHA1(72c056d493e74ceca41f48936012b012b496a226))
@@ -1580,11 +1600,11 @@ ROM_END
ROM_START(bbcmc_ar)
ROM_REGION(0x10000,"maincpu",ROMREGION_ERASEFF) /* ROM MEMORY */
- ROM_REGION(0x44000,"user1",0) /* ROM */
+ ROM_REGION(0x44000,"option",0) /* ROM */
ROM_DEFAULT_BIOS("mos511i")
ROM_SYSTEM_BIOS( 0, "mos511i", "International MOS 5.11" )
ROMX_LOAD("mos511.ic49", 0x30000, 0x10000, BAD_DUMP CRC(8708803c) SHA1(d2170c8b9b536f3ad84a4a603a7fe712500cc751), ROM_BIOS(1)) /* Merged individual ROM bank dumps */
- ROM_COPY("user1", 0x30000, 0x40000, 0x4000) /* Move loaded roms into place */
+ ROM_COPY("option", 0x30000, 0x40000, 0x4000) /* Move loaded roms into place */
ROM_FILL(0x30000, 0x4000, 0xFFFF)
/* 00000 rom 0 EXTERNAL */
/* 04000 rom 1 EXTERNAL */
@@ -1605,6 +1625,9 @@ ROM_START(bbcmc_ar)
ROM_LOAD("international16.rom", 0x8000 , 0x4000, CRC(0ef527b1) SHA1(dc5149ccf588cd591a6ad47727474ef3313272ce) )
ROM_LOAD("arabian-c22.rom" , 0x20000, 0x4000, CRC(4f3aadff) SHA1(2bbf61ba68264ce5845aab9c54e750b0efe219c8) )
+ ROM_REGION(0x4000, "os", 0)
+ ROM_COPY("option", 0x40000, 0, 0x4000)
+
// ROM_REGION(0x80,"mc146818",0) /* mc146818 */
/* Factory defaulted CMOS RAM, sets default language ROM, etc. */
// ROM_LOAD("mos500.cmos", 0x00, 0x80, CRC(d8458039) SHA1(72c056d493e74ceca41f48936012b012b496a226))
diff --git a/src/mess/includes/bbc.h b/src/mess/includes/bbc.h
index 4cacfa4d434..892acee7f83 100644
--- a/src/mess/includes/bbc.h
+++ b/src/mess/includes/bbc.h
@@ -26,6 +26,9 @@
#include "sound/tms5220.h"
#include "imagedev/cassette.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
#define RS232_TAG "rs232"
class bbc_state : public driver_device
@@ -48,13 +51,18 @@ public:
m_via6522_1(*this, "via6522_1"),
m_upd7002(*this, "upd7002"),
m_i8271(*this, "i8271"),
+ m_exp1(*this, "exp_rom1"),
+ m_exp2(*this, "exp_rom2"),
+ m_exp3(*this, "exp_rom3"),
+ m_exp4(*this, "exp_rom4"),
m_joy0(*this, "JOY0"),
m_joy1(*this, "JOY1"),
m_joy2(*this, "JOY2"),
m_joy3(*this, "JOY3"),
m_region_maincpu(*this, "maincpu"),
- m_region_user1(*this, "user1"),
- m_region_user2(*this, "user2"),
+ m_region_os(*this, "os"),
+ m_region_opt(*this, "option"),
+ m_region_dfs(*this, "dfs"),
m_bank1(*this, "bank1"),
m_bank2(*this, "bank2"),
m_bank3(*this, "bank3"),
@@ -68,8 +76,7 @@ public:
m_via_user_irq(CLEAR_LINE),
m_acia_irq(CLEAR_LINE),
m_palette(*this, "palette")
- {
- }
+ { }
DECLARE_WRITE8_MEMBER(bbc_page_selecta_w);
DECLARE_WRITE8_MEMBER(bbc_memorya1_w);
@@ -161,9 +168,18 @@ public:
UPD7002_GET_ANALOGUE(BBC_get_analogue_input);
UPD7002_EOC(BBC_uPD7002_EOC);
- int exp_rom_load(device_image_interface &image, int index);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbc_exp_rom );
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcm_cart );
+ void bbc_setup_banks(memory_bank *membank, int banks, UINT32 shift, UINT32 size);
+ void bbcm_setup_banks(memory_bank *membank, int banks, UINT32 shift, UINT32 size);
+
+ int bbc_load_cart(device_image_interface &image, generic_slot_device *slot);
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp1_load) { return bbc_load_cart(image, m_exp1); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp2_load) { return bbc_load_cart(image, m_exp2); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp3_load) { return bbc_load_cart(image, m_exp3); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp4_load) { return bbc_load_cart(image, m_exp4); }
+
+ int bbcm_load_cart(device_image_interface &image, generic_slot_device *slot);
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_exp1_load) { return bbcm_load_cart(image, m_exp1); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_exp2_load) { return bbcm_load_cart(image, m_exp2); }
MC6845_UPDATE_ROW(crtc_update_row);
@@ -184,11 +200,16 @@ public: // HACK FOR MC6845
optional_device<via6522_device> m_via6522_1;
optional_device<upd7002_device> m_upd7002;
optional_device<i8271_device> m_i8271;
+ required_device<generic_slot_device> m_exp1;
+ required_device<generic_slot_device> m_exp2;
+ optional_device<generic_slot_device> m_exp3;
+ optional_device<generic_slot_device> m_exp4;
optional_ioport m_joy0, m_joy1, m_joy2, m_joy3;
required_memory_region m_region_maincpu;
- required_memory_region m_region_user1;
- optional_memory_region m_region_user2;
+ required_memory_region m_region_os;
+ required_memory_region m_region_opt;
+ optional_memory_region m_region_dfs;
required_memory_bank m_bank1; // bbca bbcb bbcbp bbcbp128 bbcm
optional_memory_bank m_bank2; // bbcbp bbcbp128 bbcm
optional_memory_bank m_bank3; // bbca bbcb
diff --git a/src/mess/machine/bbc.c b/src/mess/machine/bbc.c
index e12f031ad06..2fb23919012 100644
--- a/src/mess/machine/bbc.c
+++ b/src/mess/machine/bbc.c
@@ -35,7 +35,7 @@ Model A memory handling functions
/* for the model A just address the 4 on board ROM sockets */
WRITE8_MEMBER(bbc_state::bbc_page_selecta_w)
{
- m_bank4->set_base(m_region_user1->base()+((data&0x03)<<14));
+ m_bank4->set_entry(data & 0x03);
}
@@ -52,14 +52,14 @@ Model B memory handling functions
/* I have set bank 1 as a special case to load different DFS roms selectable from MESS's CONF settings var:bbc_DFSTypes */
WRITE8_MEMBER(bbc_state::bbc_page_selectb_w)
{
- m_rombank=data&0x0f;
- if (m_rombank!=1)
+ m_rombank = data & 0x0f;
+ if (m_rombank != 1)
{
- m_bank4->set_base(m_region_user1->base() + (m_rombank << 14));
+ m_bank4->set_entry(m_rombank);
}
else
{
- m_bank4->set_base(m_region_user2->base() + ((m_DFSType) << 14));
+ m_bank4->set_entry(m_DFSType);
}
}
@@ -91,15 +91,15 @@ WRITE8_MEMBER(bbc_state::bbc_memoryb4_w)
if (m_rombank == 1)
{
// special DFS case for Acorn DFS E00 Hack that can write to the DFS RAM Bank;
- if (m_DFSType == 3) m_region_user2->base()[((m_DFSType) << 14) + offset] = data;
+ if (m_DFSType == 3) m_region_dfs->base()[((m_DFSType) << 14) + offset] = data;
}
else
{
switch (m_SWRAMtype)
{
- case 1: if (bbc_SWRAMtype1[m_userport]) m_region_user1->base()[(m_userport << 14) + offset] = data;
- case 2: if (bbc_SWRAMtype2[m_rombank]) m_region_user1->base()[(m_rombank << 14) + offset] = data;
- case 3: if (bbc_SWRAMtype3[m_rombank]) m_region_user1->base()[(m_rombank << 14) + offset] = data;
+ case 1: if (bbc_SWRAMtype1[m_userport]) m_region_opt->base()[(m_userport << 14) + offset] = data;
+ case 2: if (bbc_SWRAMtype2[m_rombank]) m_region_opt->base()[(m_rombank << 14) + offset] = data;
+ case 3: if (bbc_SWRAMtype3[m_rombank]) m_region_opt->base()[(m_rombank << 14) + offset] = data;
}
}
}
@@ -135,12 +135,12 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectbp_w)
if (m_pagedRAM)
{
/* if paged ram then set 8000 to afff to read from the ram 8000 to afff */
- m_bank4->set_base(m_region_maincpu->base() + 0x8000);
+ m_bank4->set_entry(0x10);
}
else
{
/* if paged rom then set the rom to be read from 8000 to afff */
- m_bank4->set_base(m_region_user1->base() + (m_rombank << 14));
+ m_bank4->set_entry(m_rombank);
};
/* set the rom to be read from b000 to bfff */
@@ -152,7 +152,7 @@ WRITE8_MEMBER(bbc_state::bbc_page_selectbp_w)
m_vdusel=(data>>7)&0x01;
bbcbp_setvideoshadow(m_vdusel);
//need to make the video display do a full screen refresh for the new memory area
- m_bank2->set_base(m_region_maincpu->base()+0x3000);
+ m_bank2->set_base(m_region_maincpu->base() + 0x3000);
}
}
@@ -258,7 +258,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybp4_128_w)
{
if (bbc_b_plus_sideways_ram_banks[m_rombank])
{
- m_region_user1->base()[offset+(m_rombank<<14)]=data;
+ m_region_opt->base()[offset+(m_rombank<<14)]=data;
}
}
}
@@ -267,7 +267,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybp6_128_w)
{
if (bbc_b_plus_sideways_ram_banks[m_rombank])
{
- m_region_user1->base()[offset+(m_rombank<<14)+0x3000]=data;
+ m_region_opt->base()[offset+(m_rombank<<14)+0x3000]=data;
}
}
@@ -360,7 +360,7 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
}
else
{
- m_bank7->set_base(m_region_user1->base() + 0x40000);
+ m_bank7->set_base(m_region_os->base());
}
bbcbp_setvideoshadow(m_ACCCON_D);
@@ -368,11 +368,11 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
if (m_ACCCON_X)
{
- m_bank2->set_base(m_region_maincpu->base() + 0xb000 );
+ m_bank2->set_base(m_region_maincpu->base() + 0xb000);
}
else
{
- m_bank2->set_base(m_region_maincpu->base() + 0x3000 );
+ m_bank2->set_base(m_region_maincpu->base() + 0x3000);
}
/* ACCCON_TST controls paging of rom reads in the 0xFC00-0xFEFF reigon */
@@ -380,12 +380,12 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write)
/* if 1 the the ROM is paged in for reads but writes still go to I/O */
if (m_ACCCON_TST)
{
- m_bank8->set_base(m_region_user1->base()+0x43c00);
- space.install_read_bank(0xFC00,0xFEFF,"bank8");
+ m_bank8->set_base(m_region_os->base() + 0x3c00);
+ space.install_read_bank(0xfc00, 0xfeff, "bank8");
}
else
{
- space.install_read_handler(0xFC00,0xFEFF,read8_delegate(FUNC(bbc_state::bbcm_r),this));
+ space.install_read_handler(0xfc00, 0xfeff, read8_delegate(FUNC(bbc_state::bbcm_r),this));
}
}
@@ -405,12 +405,12 @@ WRITE8_MEMBER(bbc_state::page_selectbm_w)
if (m_pagedRAM)
{
- m_bank4->set_base(m_region_maincpu->base() + 0x8000);
+ m_bank4->set_entry(0x10);
m_bank5->set_entry(m_rombank);
}
else
{
- m_bank4->set_base(m_region_user1->base() + ((m_rombank) << 14));
+ m_bank4->set_entry(m_rombank);
m_bank5->set_entry(m_rombank);
}
}
@@ -427,17 +427,17 @@ DIRECT_UPDATE_MEMBER(bbc_state::bbcm_direct_handler)
{
if (m_ACCCON_X)
{
- m_bank2->set_base( m_region_maincpu->base() + 0xb000 );
+ m_bank2->set_base(m_region_maincpu->base() + 0xb000);
}
else
{
if (m_ACCCON_E && bbcm_vdudriverset())
{
- m_bank2->set_base( m_region_maincpu->base() + 0xb000 );
+ m_bank2->set_base(m_region_maincpu->base() + 0xb000);
}
else
{
- m_bank2->set_base( m_region_maincpu->base() + 0x3000 );
+ m_bank2->set_base(m_region_maincpu->base() + 0x3000);
}
}
@@ -482,7 +482,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm4_w)
{
if (bbc_master_sideways_ram_banks[m_rombank])
{
- m_region_user1->base()[offset+(m_rombank<<14)] = data;
+ m_region_opt->base()[offset+(m_rombank<<14)] = data;
}
}
}
@@ -492,7 +492,7 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm5_w)
{
if (bbc_master_sideways_ram_banks[m_rombank])
{
- m_region_user1->base()[offset+(m_rombank<<14)+0x1000] = data;
+ m_region_opt->base()[offset+(m_rombank<<14)+0x1000] = data;
}
}
@@ -555,7 +555,7 @@ READ8_MEMBER(bbc_state::bbcm_r)
/* Now handled in bbcm_ACCCON_write PHS - 2008-10-11 */
// if ( m_ACCCON_TST )
// {
-// return m_region_user1->base()[offset+0x43c00];
+// return m_region_os->base()[offset + 0x3c00];
// };
if (offset<=0x0ff) /* FRED */
@@ -1938,103 +1938,58 @@ WRITE8_MEMBER(bbc_state::bbc_disc_w)
BBC B Rom loading functions
***************************************/
-int bbc_state::exp_rom_load(device_image_interface &image, int index)
+int bbc_state::bbc_load_cart(device_image_interface &image, generic_slot_device *slot)
{
- UINT8 *RAM = m_region_user1->base();
- int size, read_;
- int addr = 0x8000 + (0x4000 * index);
-
- if (image.software_entry() == NULL)
+ UINT32 size = slot->common_get_size("rom");
+
+ if (size != 0x2000 && size != 0x4000)
{
- size = image.length();
- logerror("loading rom %s, at %.4x size:%.4x\n", image.filename(), addr, size);
-
- switch (size)
- {
- case 0x2000:
- read_ = image.fread(RAM + addr, size);
- if (read_ != size)
- return 1;
- image.fseek(0, SEEK_SET);
- read_ = image.fread(RAM + addr + 0x2000, size);
- break;
- case 0x4000:
- read_ = image.fread(RAM + addr, size);
- break;
- default:
- read_ = 0;
- logerror("bad rom file size of %.4x\n", size);
- break;
- }
-
- if (read_ != size)
- return IMAGE_INIT_FAIL;
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return IMAGE_INIT_FAIL;
}
+
+ slot->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ slot->common_load_rom(slot->get_rom_base(), size, "rom");
+
return IMAGE_INIT_PASS;
}
-DEVICE_IMAGE_LOAD_MEMBER( bbc_state, bbc_exp_rom )
-{
- if (strcmp(image.device().tag(),":exp_rom1") == 0)
- return exp_rom_load(image, 0);
-
- if (strcmp(image.device().tag(),":exp_rom2") == 0)
- return exp_rom_load(image, 1);
-
- if (strcmp(image.device().tag(),":exp_rom3") == 0)
- return exp_rom_load(image, 2);
-
- if (strcmp(image.device().tag(),":exp_rom4") == 0)
- return exp_rom_load(image, 3);
-
- return IMAGE_INIT_FAIL;
-}
-
-
/**************************************
BBC Master Rom loading functions
***************************************/
-DEVICE_IMAGE_LOAD_MEMBER( bbc_state, bbcm_cart )
+int bbc_state::bbcm_load_cart(device_image_interface &image, generic_slot_device *slot)
{
- UINT8 *RAM = m_region_user1->base();
- int addr = 0, index = 0;
-
- if (strcmp(image.device().tag(),":cart1") == 0)
- index = 0;
- if (strcmp(image.device().tag(),":cart2") == 0)
- index = 1;
- addr += index * 0x8000;
-
if (image.software_entry() == NULL)
{
- UINT32 size = image.length();
- logerror("loading rom %s, size:%.4x\n", image.filename(), size);
+ UINT32 filesize = image.length();
- if (size != 0x8000)
+ if (filesize != 0x8000)
{
- image.seterror(IMAGE_ERROR_UNSUPPORTED, "Invalid rom file size");
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
return IMAGE_INIT_FAIL;
}
-
- image.fread(RAM + addr, size);
+
+ slot->rom_alloc(filesize, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ image.fread(slot->get_rom_base(), filesize);
+ return IMAGE_INIT_PASS;
}
else
{
UINT32 size_lo = image.get_software_region_length("lorom");
UINT32 size_hi = image.get_software_region_length("uprom");
- logerror("loading rom %s, size:%.4x\n", image.filename(), size_lo + size_hi);
-
+
if (size_lo + size_hi != 0x8000)
{
- image.seterror(IMAGE_ERROR_UNSUPPORTED, "Invalid rom file size");
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
return IMAGE_INIT_FAIL;
}
-
- memcpy(RAM + addr + 0, image.get_software_region("uprom"), size_hi);
- memcpy(RAM + addr + size_hi, image.get_software_region("lorom"), size_lo);
+
+ slot->rom_alloc(size_lo + size_hi, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ memcpy(slot->get_rom_base() + 0, image.get_software_region("uprom"), size_hi);
+ memcpy(slot->get_rom_base() + size_hi, image.get_software_region("lorom"), size_lo);
}
-
+
return IMAGE_INIT_PASS;
}
@@ -2075,11 +2030,73 @@ DRIVER_INIT_MEMBER(bbc_state,bbcm)
m_via6522_0->write_cb2(1);
}
-MACHINE_START_MEMBER(bbc_state,bbca)
+// setup pointers for optional EPROMs
+void bbc_state::bbc_setup_banks(memory_bank *membank, int banks, UINT32 shift, UINT32 size)
+{
+ astring region_tag;
+ memory_region *tmp_reg;
+ UINT8 *eprom[4];
+ if (m_exp1 && (tmp_reg = memregion(region_tag.cpy(m_exp1->tag()).cat(GENERIC_ROM_REGION_TAG))))
+ eprom[0] = tmp_reg->base() + shift;
+ else
+ eprom[0] = m_region_opt->base() + 0x0000 + shift;
+ if (m_exp2 && (tmp_reg = memregion(region_tag.cpy(m_exp2->tag()).cat(GENERIC_ROM_REGION_TAG))))
+ eprom[1] = tmp_reg->base() + shift;
+ else
+ eprom[1] = m_region_opt->base() + 0x4000 + shift;
+ if (m_exp3 && (tmp_reg = memregion(region_tag.cpy(m_exp3->tag()).cat(GENERIC_ROM_REGION_TAG))))
+ eprom[2] = tmp_reg->base() + shift;
+ else
+ eprom[2] = m_region_opt->base() + 0x8000 + shift;
+ if (m_exp4 && (tmp_reg = memregion(region_tag.cpy(m_exp4->tag()).cat(GENERIC_ROM_REGION_TAG))))
+ eprom[3] = tmp_reg->base() + shift;
+ else
+ eprom[3] = m_region_opt->base() + 0xc000 + shift;
+
+ membank->configure_entries(0, 1, eprom[0], size);
+ membank->configure_entries(1, 1, eprom[1], size);
+ membank->configure_entries(2, 1, eprom[2], size);
+ membank->configure_entries(3, 1, eprom[3], size);
+
+ if (banks > 4)
+ {
+ for (int i = 0; i < banks - 4; i++)
+ membank->configure_entries(i + 4, 1, m_region_opt->base() + 0x10000 + shift + i * 0x4000, size);
+ }
+}
+
+void bbc_state::bbcm_setup_banks(memory_bank *membank, int banks, UINT32 shift, UINT32 size)
+{
+ astring region_tag;
+ memory_region *tmp_reg;
+ UINT8 *eprom[2];
+ if (m_exp1 && (tmp_reg = memregion(region_tag.cpy(m_exp1->tag()).cat(GENERIC_ROM_REGION_TAG))))
+ eprom[0] = tmp_reg->base() + shift;
+ else
+ eprom[0] = m_region_opt->base() + 0x0000 + shift;
+ if (m_exp2 && (tmp_reg = memregion(region_tag.cpy(m_exp2->tag()).cat(GENERIC_ROM_REGION_TAG))))
+ eprom[1] = tmp_reg->base() + shift;
+ else
+ eprom[1] = m_region_opt->base() + 0x8000 + shift;
+
+ membank->configure_entries(0, 1, eprom[0], size);
+ membank->configure_entries(1, 1, eprom[0] + 0x4000, size);
+ membank->configure_entries(2, 1, eprom[1], size);
+ membank->configure_entries(3, 1, eprom[1] + 0x4000, size);
+
+ if (banks > 4)
+ {
+ for (int i = 0; i < banks - 4; i++)
+ membank->configure_entries(i + 4, 1, m_region_opt->base() + 0x10000 + shift + i * 0x4000, size);
+ }
+}
+
+MACHINE_START_MEMBER(bbc_state, bbca)
{
+ bbc_setup_banks(m_bank4, 4, 0, 0x4000);
}
-MACHINE_RESET_MEMBER(bbc_state,bbca)
+MACHINE_RESET_MEMBER(bbc_state, bbca)
{
UINT8 *RAM = m_region_maincpu->base();
@@ -2097,20 +2114,23 @@ MACHINE_RESET_MEMBER(bbc_state,bbca)
m_memorySize=16;
}
- m_bank4->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */
- m_bank7->set_base(m_region_user1->base()+0x10000); /* bank 7 points at the OS rom from c000 to ffff */
+ m_bank4->set_entry(0);
+ m_bank7->set_base(m_region_os->base()); /* bank 7 points at the OS rom from c000 to ffff */
bbcb_IC32_initialise(this);
}
-MACHINE_START_MEMBER(bbc_state,bbcb)
+MACHINE_START_MEMBER(bbc_state, bbcb)
{
m_mc6850_clock = 0;
m_previous_i8271_int_state=0;
m_previous_wd177x_int_state=1;
+ bbc_setup_banks(m_bank4, 16, 0, 0x4000);
+ if (m_region_dfs)
+ m_bank4->configure_entries(16, 8, m_region_dfs->base(), 0x4000); // additional bank for paged ram
}
-MACHINE_RESET_MEMBER(bbc_state,bbcb)
+MACHINE_RESET_MEMBER(bbc_state, bbcb)
{
UINT8 *RAM = m_region_maincpu->base();
m_DFSType= (ioport("BBCCONFIG")->read() >> 0) & 0x07;
@@ -2119,8 +2139,8 @@ MACHINE_RESET_MEMBER(bbc_state,bbcb)
m_bank3->set_base(RAM + 0x4000);
m_memorySize=32;
- m_bank4->set_base(m_region_user1->base()); /* bank 4 is the paged ROMs from 8000 to bfff */
- m_bank7->set_base(m_region_user1->base() + 0x40000); /* bank 7 points at the OS rom from c000 to ffff */
+ m_bank4->set_entry(0);
+ m_bank7->set_base(m_region_os->base()); /* bank 7 points at the OS rom from c000 to ffff */
bbcb_IC32_initialise(this);
@@ -2128,23 +2148,24 @@ MACHINE_RESET_MEMBER(bbc_state,bbcb)
}
-MACHINE_START_MEMBER(bbc_state,bbcbp)
+MACHINE_START_MEMBER(bbc_state, bbcbp)
{
m_mc6850_clock = 0;
m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcbp_direct_handler), this));
- /* bank 6 is the paged ROMs from b000 to bfff */
- m_bank6->configure_entries(0, 16, m_region_user1->base()+0x3000, 1<<14);
+ bbc_setup_banks(m_bank4, 16, 0, 0x3000);
+ m_bank4->configure_entries(16, 1, m_region_maincpu->base() + 0x8000, 0x3000); // additional bank for paged ram
+ bbc_setup_banks(m_bank6, 16, 0x3000, 0x1000);
}
-MACHINE_RESET_MEMBER(bbc_state,bbcbp)
+MACHINE_RESET_MEMBER(bbc_state, bbcbp)
{
m_bank1->set_base(m_region_maincpu->base());
- m_bank2->set_base(m_region_maincpu->base()+0x03000); /* bank 2 screen/shadow ram from 3000 to 7fff */
- m_bank4->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to afff */
+ m_bank2->set_base(m_region_maincpu->base() + 0x03000); /* bank 2 screen/shadow ram from 3000 to 7fff */
+ m_bank4->set_entry(0);
m_bank6->set_entry(0);
- m_bank7->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom from c000 to ffff */
+ m_bank7->set_base(m_region_os->base()); /* bank 7 points at the OS rom from c000 to ffff */
bbcb_IC32_initialise(this);
@@ -2152,27 +2173,28 @@ MACHINE_RESET_MEMBER(bbc_state,bbcbp)
}
-MACHINE_START_MEMBER(bbc_state,bbcm)
+MACHINE_START_MEMBER(bbc_state, bbcm)
{
m_mc6850_clock = 0;
m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcm_direct_handler), this));
- /* bank 5 is the paged ROMs from 9000 to bfff */
- m_bank5->configure_entries(0, 16, m_region_user1->base()+0x01000, 1<<14);
+ bbcm_setup_banks(m_bank4, 16, 0, 0x1000);
+ m_bank4->configure_entries(16, 1, m_region_maincpu->base() + 0x8000, 0x1000); // additional bank for paged ram
+ bbcm_setup_banks(m_bank5, 16, 0x1000, 0x3000);
/* Set ROM/IO bank to point to rom */
- m_bank8->set_base( m_region_user1->base()+0x43c00);
- m_maincpu->space(AS_PROGRAM).install_read_bank(0xFC00, 0xFEFF, "bank8");
+ m_bank8->set_base(m_region_os->base() + 0x3c00);
+ m_maincpu->space(AS_PROGRAM).install_read_bank(0xfc00, 0xfeff, "bank8");
}
-MACHINE_RESET_MEMBER(bbc_state,bbcm)
+MACHINE_RESET_MEMBER(bbc_state, bbcm)
{
m_bank1->set_base(m_region_maincpu->base()); /* bank 1 regular lower ram from 0000 to 2fff */
m_bank2->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */
- m_bank4->set_base(m_region_user1->base()); /* bank 4 is paged ROM or RAM from 8000 to 8fff */
+ m_bank4->set_entry(0);
m_bank5->set_entry(0);
- m_bank7->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM from c000 to dfff */
+ m_bank7->set_base(m_region_os->base()); /* bank 6 OS rom of RAM from c000 to dfff */
bbcb_IC32_initialise(this);