From e5bccf8de14ca0c407fb9ad1855112853bfd1bec Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Tue, 20 Mar 2018 21:31:17 +0000 Subject: bbc: Fixed Shadow RAM corruption in Master/B+, and sideways RAM access in Model B. --- src/mame/drivers/bbc.cpp | 156 ++++++-------- src/mame/includes/bbc.h | 155 +++++++------- src/mame/machine/bbc.cpp | 521 +++++++++++++++++++++-------------------------- src/mame/video/bbc.cpp | 7 +- 4 files changed, 366 insertions(+), 473 deletions(-) diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index 09b817b248e..832333cd8d2 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -145,8 +145,8 @@ READ8_MEMBER(bbc_state::bbc_fe_r) void bbc_state::bbca_mem(address_map &map) { map.unmap_value_high(); /* Hardware marked with a # is not present in a Model A */ - map(0x0000, 0x3fff).bankr("bank1").w(this, FUNC(bbc_state::bbc_memorya1_w)); /* 0000-3fff Regular Ram */ - map(0x4000, 0x7fff).bankr("bank3").w(this, FUNC(bbc_state::bbc_memoryb3_w)); /* 4000-7fff Repeat of the Regular Ram */ + map(0x0000, 0x3fff).bankrw("bank1"); /* 0000-3fff Regular RAM */ + map(0x4000, 0x7fff).bankrw("bank3"); /* 4000-7fff Regular RAM mirrored */ map(0x8000, 0xbfff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memoryb4_w)); /* 8000-bfff Paged ROM */ map(0xc000, 0xfbff).bankr("bank7"); /* c000-fbff OS ROM */ map(0xfc00, 0xfdff).noprw(); /* fc00-fdff FRED & JIM Pages */ @@ -158,8 +158,7 @@ void bbc_state::bbca_mem(address_map &map) map(0xfe18, 0xfe1f).noprw(); /* fe18-fe1f INTOFF/STATID # ECONET Interrupt Off / ID No. */ map(0xfe20, 0xfe2f).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_videoULA_w)); /* R: fe20-fe2f INTON # ECONET Interrupt On */ /* W: fe20-fe2f Video ULA Video system chip */ - map(0xfe30, 0xfe3f).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_page_selecta_w)); /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 74LS161 Paged ROM selector */ + map(0xfe30, 0xfe3f).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::page_selecta_w)); /* W: fe30-fe3f 74LS161 Paged ROM selector */ map(0xfe40, 0xfe5f).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); /* fe40-fe5f 6522 VIA SYSTEM VIA */ map(0xfe60, 0xfe7f).noprw(); /* fe60-fe7f 6522 VIA # USER VIA */ map(0xfe80, 0xfe9f).noprw(); /* fe80-fe9f 8271/1770 FDC # Floppy disc controller */ @@ -175,7 +174,7 @@ void bbc_state::bbc_base(address_map &map) map.unmap_value_high(); map(0xc000, 0xfbff).bankr("bank7"); /* c000-fbff OS ROM */ map(0xfc00, 0xfdff).noprw(); /* fc00-fdff FRED & JIM Pages */ - /* fe00-feff SHEILA Address Page */ + map(0xfe00, 0xfeff).r(this, FUNC(bbc_state::bbc_fe_r)); /* fe00-feff SHEILA Address Page */ map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); /* fe00-fe07 6845 CRTC Video controller */ map(0xfe01, 0xfe01).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w)); map(0xfe08, 0xfe09).mirror(0x06).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); /* fe08-fe0f 6850 ACIA Serial controller */ @@ -196,11 +195,10 @@ void bbc_state::bbc_base(address_map &map) void bbc_state::bbcb_mem(address_map &map) { bbc_base(map); - map(0x0000, 0x3fff).bankr("bank1").w(this, FUNC(bbc_state::bbc_memorya1_w)); /* 0000-3fff Regular Ram */ - map(0x4000, 0x7fff).bankr("bank3").w(this, FUNC(bbc_state::bbc_memoryb3_w)); /* 4000-7fff Regular Ram */ - map(0x8000, 0xbfff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memoryb4_w)); /* 8000-bfff Paged ROM */ - map(0xfe30, 0xfe3f).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_page_selectb_w)); /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 84LS161 Paged ROM selector */ + map(0x0000, 0x3fff).bankrw("bank1"); /* 0000-3fff Regular RAM */ + map(0x4000, 0x7fff).bankrw("bank3"); /* 4000-7fff Regular RAM */ + map(0x8000, 0xbfff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memoryb4_w)); /* 8000-bfff Paged ROM/RAM */ + map(0xfe30, 0xfe3f).w(this, FUNC(bbc_state::page_selectb_w)); /* W: fe30-fe3f 84LS161 Paged ROM selector */ map(0xfe80, 0xfe83).m(m_i8271, FUNC(i8271_device::map)); /* fe80-fe83 8271 FDC Floppy disc controller */ map(0xfe84, 0xfe9f).rw(m_i8271, FUNC(i8271_device::data_r), FUNC(i8271_device::data_w)); /* fe84-fe9f 8271 FDC Floppy disc controller */ } @@ -209,25 +207,22 @@ void bbc_state::bbcb_mem(address_map &map) void bbc_state::bbcb_nofdc_mem(address_map &map) { bbc_base(map); - map(0x0000, 0x3fff).bankr("bank1").w(this, FUNC(bbc_state::bbc_memorya1_w)); /* 0000-3fff Regular Ram */ - map(0x4000, 0x7fff).bankr("bank3").w(this, FUNC(bbc_state::bbc_memoryb3_w)); /* 4000-7fff Regular Ram */ - map(0x8000, 0xbfff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memoryb4_w)); /* 8000-bfff Paged ROM */ - map(0xfe30, 0xfe3f).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_page_selectb_w)); /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 84LS161 Paged ROM selector */ - map(0xfe80, 0xfe83).noprw(); /* fe80-fe9f Floppy disc controller */ + map(0x0000, 0x3fff).bankrw("bank1"); /* 0000-3fff Regular RAM */ + map(0x4000, 0x7fff).bankrw("bank3"); /* 4000-7fff Regular RAM */ + map(0x8000, 0xbfff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memoryb4_w)); /* 8000-bfff Paged ROM/RAM */ + map(0xfe30, 0xfe3f).w(this, FUNC(bbc_state::page_selectb_w)); /* W: fe30-fe3f 84LS161 Paged ROM selector */ } void bbc_state::bbcbp_mem(address_map &map) { bbc_base(map); - map(0x0000, 0x2fff).bankr("bank1").w(this, FUNC(bbc_state::bbc_memorybp1_w)); /* 0000-2fff Regular Ram */ - map(0x3000, 0x7fff).bankr("bank2").w(this, FUNC(bbc_state::bbc_memorybp2_w)); /* 3000-7fff Video/Shadow Ram */ + map(0x0000, 0x2fff).bankrw("bank1"); /* 0000-2fff Regular RAM */ + map(0x3000, 0x7fff).bankrw("bank2"); /* 3000-7fff Video/Shadow RAM */ map(0x8000, 0xafff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memorybp4_w)); /* 8000-afff Paged ROM or 12K of SWRAM */ - map(0xb000, 0xbfff).bankr("bank6"); /* b000-bfff Rest of paged ROM area */ - map(0xfe30, 0xfe3f).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_page_selectbp_w)); /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 84LS161 Paged ROM selector */ - map(0xfe80, 0xfe83).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_wd1770_status_w)); /* fe80-fe83 1770 FDC Drive control register */ + map(0xb000, 0xbfff).bankr("bank6").w(this, FUNC(bbc_state::bbc_memorybp6_w)); /* b000-bfff Rest of paged ROM area */ + map(0xfe30, 0xfe3f).w(this, FUNC(bbc_state::page_selectbp_w)); /* W: fe30-fe3f 84LS161 Paged ROM selector */ + map(0xfe80, 0xfe83).w(this, FUNC(bbc_state::bbc_wd1770_status_w)); /* fe80-fe83 1770 FDC Drive control register */ map(0xfe84, 0xfe9f).rw(m_wd1770, FUNC(wd1770_device::read), FUNC(wd1770_device::write)); /* fe84-fe9f 1770 FDC Floppy disc controller */ map(0xfee0, 0xfeff).rw(m_tube, FUNC(bbc_tube_slot_device::host_r), FUNC(bbc_tube_slot_device::host_w)); /* fee0-feff Tube ULA Tube system interface */ } @@ -236,13 +231,12 @@ void bbc_state::bbcbp_mem(address_map &map) void bbc_state::bbcbp128_mem(address_map &map) { bbc_base(map); - map(0x0000, 0x2fff).bankr("bank1").w(this, FUNC(bbc_state::bbc_memorybp1_w)); /* 0000-2fff Regular Ram */ - map(0x3000, 0x7fff).bankr("bank2").w(this, FUNC(bbc_state::bbc_memorybp2_w)); /* 3000-7fff Video/Shadow Ram */ - map(0x8000, 0xafff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memorybp4_128_w)); /* 8000-afff Paged ROM or 12K of SWRAM */ - map(0xb000, 0xbfff).bankr("bank6").w(this, FUNC(bbc_state::bbc_memorybp6_128_w)); /* b000-bfff Rest of paged ROM area */ - map(0xfe30, 0xfe3f).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_page_selectbp_w)); /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 84LS161 Paged ROM selector */ - map(0xfe80, 0xfe83).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_wd1770_status_w)); /* fe80-fe83 1770 FDC Drive control register */ + map(0x0000, 0x2fff).bankrw("bank1"); /* 0000-2fff Regular RAM */ + map(0x3000, 0x7fff).bankrw("bank2"); /* 3000-7fff Video/Shadow RAM */ + map(0x8000, 0xafff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memorybp4_w)); /* 8000-afff Paged ROM or 12K of SWRAM */ + map(0xb000, 0xbfff).bankr("bank6").w(this, FUNC(bbc_state::bbc_memorybp6_w)); /* b000-bfff Rest of paged ROM area */ + map(0xfe30, 0xfe3f).w(this, FUNC(bbc_state::page_selectbp128_w)); /* W: fe30-fe3f 84LS161 Paged ROM selector */ + map(0xfe80, 0xfe83).w(this, FUNC(bbc_state::bbc_wd1770_status_w)); /* fe80-fe83 1770 FDC Drive control register */ map(0xfe84, 0xfe9f).rw(m_wd1770, FUNC(wd1770_device::read), FUNC(wd1770_device::write)); /* fe84-fe9f 1770 FDC Floppy disc controller */ map(0xfee0, 0xfeff).rw(m_tube, FUNC(bbc_tube_slot_device::host_r), FUNC(bbc_tube_slot_device::host_w)); /* fee0-feff Tube ULA Tube system interface */ } @@ -251,17 +245,21 @@ void bbc_state::bbcbp128_mem(address_map &map) void bbc_state::reutapm_mem(address_map &map) { bbc_base(map); - map(0x0000, 0x2fff).bankr("bank1").w(this, FUNC(bbc_state::bbc_memorybp1_w)); /* 0000-2fff Regular Ram */ - map(0x3000, 0x7fff).bankr("bank2").w(this, FUNC(bbc_state::bbc_memorybp2_w)); /* 3000-7fff Video/Shadow Ram */ + map(0x0000, 0x2fff).bankrw("bank1"); /* 0000-2fff Regular RAM */ + map(0x3000, 0x7fff).bankrw("bank2"); /* 3000-7fff Video/Shadow RAM */ map(0x8000, 0xafff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memorybp4_w)); /* 8000-afff Paged ROM or 12K of SWRAM */ - map(0xb000, 0xbfff).bankr("bank6"); /* b000-bfff Rest of paged ROM area */ - map(0xfe30, 0xfe3f).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_page_selectbp_w)); /* R: fe30-fe3f NC Not Connected */ - /* W: fe30-fe3f 84LS161 Paged ROM selector */ - map(0xfe80, 0xfe83).noprw(); /* fe80-fe83 1770 FDC Drive control register */ - map(0xfe84, 0xfe9f).noprw(); /* fe84-fe9f 1770 FDC Floppy disc controller */ - map(0xfee0, 0xfeff).r(this, FUNC(bbc_state::bbc_fe_r)); /* fee0-feff Tube ULA Tube system interface */ + map(0xb000, 0xbfff).bankr("bank6").w(this, FUNC(bbc_state::bbc_memorybp6_w)); /* b000-bfff Rest of paged ROM area */ + map(0xfe30, 0xfe3f).w(this, FUNC(bbc_state::page_selectbp_w)); /* W: fe30-fe3f 84LS161 Paged ROM selector */ + map(0xfee0, 0xfeff).rw(m_tube, FUNC(bbc_tube_slot_device::host_r), FUNC(bbc_tube_slot_device::host_w)); /* fee0-feff Tube ULA Tube system interface */ } + +void bbc_state::bbcbp_fetch(address_map &map) +{ + map(0x0000, 0xffff).r(this, FUNC(bbc_state::bbcbp_fetch_r)); +} + + /****************************************************************************** &FC00-&FCFF FRED &FD00-&FDFF JIM @@ -288,8 +286,8 @@ void bbc_state::reutapm_mem(address_map &map) void bbc_state::bbcm_mem(address_map &map) { - map(0x0000, 0x2fff).bankr("bank1").w(this, FUNC(bbc_state::bbc_memorybm1_w)); /* 0000-2fff Regular Ram */ - map(0x3000, 0x7fff).bankr("bank2").w(this, FUNC(bbc_state::bbc_memorybm2_w)); /* 3000-7fff Video/Shadow Ram */ + map(0x0000, 0x2fff).bankrw("bank1"); /* 0000-2fff Regular RAM */ + map(0x3000, 0x7fff).bankrw("bank2"); /* 3000-7fff Video/Shadow RAM */ map(0x8000, 0x8fff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memorybm4_w)); /* 8000-8fff Paged ROM/RAM or 4K of RAM ANDY */ map(0x9000, 0xbfff).bankr("bank5").w(this, FUNC(bbc_state::bbc_memorybm5_w)); /* 9000-bfff Rest of paged ROM/RAM area */ map(0xc000, 0xdfff).bankr("bank7").w(this, FUNC(bbc_state::bbc_memorybm7_w)); /* c000-dfff OS ROM or 8K of RAM HAZEL */ @@ -297,6 +295,11 @@ void bbc_state::bbcm_mem(address_map &map) map(0xfc00, 0xfeff).bankr("bank8").w(this, FUNC(bbc_state::bbcm_w)); /* processed directly because it can be ROM or hardware */ } +void bbc_state::bbcm_fetch(address_map &map) +{ + map(0x0000, 0xffff).r(this, FUNC(bbc_state::bbcm_fetch_r)); +} + INPUT_CHANGED_MEMBER(bbc_state::trigger_reset) { @@ -672,14 +675,7 @@ INPUT_PORTS_END INPUT_CHANGED_MEMBER(bbc_state::monitor_changed) { - m_monitortype = m_bbcconfig.read_safe(0) &0x03; -} - - -INPUT_CHANGED_MEMBER(bbc_state::speech_changed) -{ - // Switchable during runtime as some games (Hyper Sports, Space Fighter) are not compatible with Speech - m_Speech = m_bbcconfig.read_safe(0) & 0x04; + m_monitortype = m_bbcconfig.read_safe(0) & 0x03; } @@ -700,26 +696,11 @@ static INPUT_PORTS_START(bbcb_config) PORT_CONFSETTING( 0x01, "B&W") PORT_CONFSETTING( 0x02, "Green") PORT_CONFSETTING( 0x03, "Amber") - PORT_CONFNAME( 0x04, 0x04, "Speech Fitted" ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, speech_changed, 0) - PORT_CONFSETTING( 0x00, DEF_STR( No ) ) - PORT_CONFSETTING( 0x04, DEF_STR( Yes ) ) - PORT_CONFNAME( 0x18, 0x00, "Sideways RAM Board") + PORT_CONFNAME( 0x0c, 0x00, "Sideways RAM Board") PORT_CONFSETTING( 0x00, DEF_STR( None ) ) - PORT_CONFSETTING( 0x08, "Solidisk 128K (fe62)" ) - PORT_CONFSETTING( 0x10, "Acorn 64K (fe30)" ) - PORT_CONFSETTING( 0x18, "Acorn 128K (fe30)" ) -INPUT_PORTS_END - -static INPUT_PORTS_START(bbcbp_config) - PORT_START("BBCCONFIG") - PORT_CONFNAME( 0x03, 0x00, "Monitor") PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, monitor_changed, 0) - PORT_CONFSETTING( 0x00, "Colour") - PORT_CONFSETTING( 0x01, "B&W") - PORT_CONFSETTING( 0x02, "Green") - PORT_CONFSETTING( 0x03, "Amber") - PORT_CONFNAME( 0x04, 0x04, "Speech Fitted") PORT_CHANGED_MEMBER(DEVICE_SELF, bbc_state, speech_changed, 0) - PORT_CONFSETTING( 0x00, DEF_STR(No)) - PORT_CONFSETTING( 0x04, DEF_STR(Yes)) + //PORT_CONFSETTING( 0x04, "Solidisk 128K (fe62)" ) + PORT_CONFSETTING( 0x08, "Acorn 64K (fe30)" ) + PORT_CONFSETTING( 0x0c, "Acorn 128K (fe30)" ) INPUT_PORTS_END static INPUT_PORTS_START(bbca) @@ -736,7 +717,7 @@ static INPUT_PORTS_START(bbcb) INPUT_PORTS_END static INPUT_PORTS_START(bbcbp) - PORT_INCLUDE(bbcbp_config) + PORT_INCLUDE(bbc_config) PORT_INCLUDE(bbc_keyboard) PORT_INCLUDE(bbc_dipswitch) PORT_INCLUDE(bbcbp_links) @@ -780,28 +761,16 @@ INTERRUPT_GEN_MEMBER(bbc_state::bbcb_vsync) FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbc ) - FLOPPY_ACORN_SSD_FORMAT, - FLOPPY_ACORN_DSD_FORMAT, - FLOPPY_OPUS_DDOS_FORMAT, - FLOPPY_OPUS_DDCPM_FORMAT, - FLOPPY_FSD_FORMAT, - FLOPPY_PC_FORMAT -FLOPPY_FORMATS_END - -FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcm ) FLOPPY_ACORN_SSD_FORMAT, FLOPPY_ACORN_DSD_FORMAT, FLOPPY_ACORN_ADFS_OLD_FORMAT, - FLOPPY_OPUS_DDCPM_FORMAT, FLOPPY_ACORN_DOS_FORMAT, + FLOPPY_OPUS_DDOS_FORMAT, + FLOPPY_OPUS_DDCPM_FORMAT, FLOPPY_FSD_FORMAT, FLOPPY_PC_FORMAT FLOPPY_FORMATS_END -FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcmc ) - FLOPPY_ACORN_ADFS_OLD_FORMAT -FLOPPY_FORMATS_END - static SLOT_INTERFACE_START( bbc_floppies_525 ) SLOT_INTERFACE("525sssd", FLOPPY_525_SSSD) SLOT_INTERFACE("525sd", FLOPPY_525_SD) @@ -963,7 +932,7 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(bbc_state::bbcb) bbca(config); /* basic machine hardware */ - MCFG_CPU_MODIFY( "maincpu" ) + MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(bbcb_nofdc_mem) MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcb) @@ -1090,8 +1059,9 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(bbc_state::bbcbp) bbcb(config); /* basic machine hardware */ - MCFG_CPU_MODIFY( "maincpu" ) /* M6512 */ + MCFG_CPU_MODIFY("maincpu") /* M6512 */ MCFG_CPU_PROGRAM_MAP(bbcbp_mem) + MCFG_CPU_OPCODES_MAP(bbcbp_fetch) MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp) @@ -1102,9 +1072,9 @@ MACHINE_CONFIG_START(bbc_state::bbcbp) MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, fdc_drq_w)) - MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm) + MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm) + MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) MCFG_FLOPPY_DRIVE_SOUND(true) MACHINE_CONFIG_END @@ -1112,8 +1082,9 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(bbc_state::bbcbp128) bbcbp(config); /* basic machine hardware */ - MCFG_CPU_MODIFY( "maincpu" ) /* M6512 */ + MCFG_CPU_MODIFY("maincpu") /* M6512 */ MCFG_CPU_PROGRAM_MAP(bbcbp128_mem) + MCFG_CPU_OPCODES_MAP(bbcbp_fetch) MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp) MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp) @@ -1270,8 +1241,9 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(bbc_state::reutapm) bbcbp(config); /* basic machine hardware */ - MCFG_CPU_MODIFY( "maincpu" ) /* M6512 */ + MCFG_CPU_MODIFY("maincpu") /* M6512 */ MCFG_CPU_PROGRAM_MAP(reutapm_mem) + MCFG_CPU_OPCODES_MAP(bbcbp_fetch) /* sound hardware */ MCFG_DEVICE_REMOVE("mono") @@ -1294,7 +1266,6 @@ MACHINE_CONFIG_START(bbc_state::reutapm) /* expansion ports */ MCFG_DEVICE_REMOVE("analogue") - MCFG_DEVICE_REMOVE("1mhzbus") MACHINE_CONFIG_END @@ -1337,6 +1308,7 @@ MACHINE_CONFIG_START(bbc_state::bbcm) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M65SC02, 16_MHz_XTAL/8) /* 2.00 MHz */ MCFG_CPU_PROGRAM_MAP(bbcm_mem) + MCFG_CPU_OPCODES_MAP(bbcm_fetch) MCFG_CPU_VBLANK_INT_DRIVER("screen", bbc_state, bbcb_vsync) /* screen refresh interrupts */ MCFG_CPU_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */ MCFG_QUANTUM_TIME(attotime::from_hz(60)) @@ -1460,9 +1432,9 @@ MACHINE_CONFIG_START(bbc_state::bbcm) MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, fdc_drq_w)) - MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm) + MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm) + MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc) MCFG_FLOPPY_DRIVE_SOUND(true) /* econet */ @@ -1654,9 +1626,9 @@ MACHINE_CONFIG_START(bbc_state::bbcmc) MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, fdc_drq_w)) - MCFG_FLOPPY_DRIVE_ADD_FIXED("wd1772:0", bbc_floppies_35, "35dd", bbc_state::floppy_formats_bbcmc) + MCFG_FLOPPY_DRIVE_ADD_FIXED("wd1772:0", bbc_floppies_35, "35dd", bbc_state::floppy_formats_bbc) MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("wd1772:1", bbc_floppies_35, nullptr, bbc_state::floppy_formats_bbcmc) + MCFG_FLOPPY_DRIVE_ADD("wd1772:1", bbc_floppies_35, nullptr, bbc_state::floppy_formats_bbc) MCFG_FLOPPY_DRIVE_SOUND(true) /* eeprom pcd8572 */ diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h index 5c484899e36..d21d24839f1 100644 --- a/src/mame/includes/bbc.h +++ b/src/mame/includes/bbc.h @@ -117,24 +117,20 @@ public: }; DECLARE_FLOPPY_FORMATS(floppy_formats_bbc); - DECLARE_FLOPPY_FORMATS(floppy_formats_bbcm); - DECLARE_FLOPPY_FORMATS(floppy_formats_bbcmc); - DECLARE_WRITE8_MEMBER(bbc_page_selecta_w); - DECLARE_WRITE8_MEMBER(bbc_memorya1_w); - DECLARE_WRITE8_MEMBER(bbc_page_selectb_w); - DECLARE_WRITE8_MEMBER(bbc_memoryb3_w); + DECLARE_WRITE8_MEMBER(page_selecta_w); + DECLARE_WRITE8_MEMBER(page_selectb_w); DECLARE_WRITE8_MEMBER(bbc_memoryb4_w); - DECLARE_WRITE8_MEMBER(bbc_page_selectbp_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp1_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp2_w); + DECLARE_READ8_MEMBER(bbcbp_fetch_r); + DECLARE_WRITE8_MEMBER(page_selectbp_w); + DECLARE_WRITE8_MEMBER(page_selectbp128_w); DECLARE_WRITE8_MEMBER(bbc_memorybp4_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp4_128_w); - DECLARE_WRITE8_MEMBER(bbc_memorybp6_128_w); - DECLARE_READ8_MEMBER(bbcm_ACCCON_read); - DECLARE_WRITE8_MEMBER(bbcm_ACCCON_write); + DECLARE_WRITE8_MEMBER(bbc_memorybp6_w); + DECLARE_READ8_MEMBER(bbcm_fetch_r); + DECLARE_READ8_MEMBER(bbcm_acccon_r); + DECLARE_WRITE8_MEMBER(bbcm_acccon_w); DECLARE_WRITE8_MEMBER(page_selectbm_w); - DECLARE_WRITE8_MEMBER(bbc_memorybm1_w); + DECLARE_READ8_MEMBER(bbc_memorybm2_r); DECLARE_WRITE8_MEMBER(bbc_memorybm2_w); DECLARE_WRITE8_MEMBER(bbc_memorybm4_w); DECLARE_WRITE8_MEMBER(bbc_memorybm5_w); @@ -184,7 +180,6 @@ public: DECLARE_WRITE_LINE_MEMBER(bbc_vsync_changed); DECLARE_WRITE_LINE_MEMBER(bbc_de_changed); DECLARE_INPUT_CHANGED_MEMBER(monitor_changed); - DECLARE_INPUT_CHANGED_MEMBER(speech_changed); void update_acia_rxd(); void update_acia_dcd(); void update_acia_cts(); @@ -248,7 +243,9 @@ public: void bbcb_nofdc_mem(address_map &map); void bbcbp128_mem(address_map &map); void bbcbp_mem(address_map &map); + void bbcbp_fetch(address_map &map); void bbcm_mem(address_map &map); + void bbcm_fetch(address_map &map); void reutapm_mem(address_map &map); private: @@ -304,77 +301,70 @@ public: // HACK FOR MC6845 bool m_os01; // flag indicating whether OS 0.1 is being used int m_monitortype; // monitor type (colour, green, amber) - int m_SWRAMtype; // this stores the setting for the SWRAM type being used - int m_Speech; // this stores the setting for Speech enabled/disabled + int m_swramtype; // this stores the setting for the SWRAM type being used - int m_ACCCON_IRR; // IRQ inputs + int m_swrbank; // This is the latch that holds the sideways ROM bank to read + bool m_swrbank_ram; // Does ROM bank contain RAM - int m_rombank; // This is the latch that holds the sideways ROM bank to read - - int m_userport; // This stores the sideways RAM latch type. - // Acorn and others use the bbc_rombank latch to select the write bank to be used.(type 0) - // Solidisc use the BBC's userport to select the write bank to be used (type 1) - - int m_pagedRAM; // BBC B+ memory handling + int m_paged_ram; // BBC B+ memory handling int m_vdusel; // BBC B+ memory handling bool m_lk18_ic41_paged_rom; // BBC Master Paged ROM/RAM select IC41 bool m_lk19_ic37_paged_rom; // BBC Master Paged ROM/RAM select IC37 - /* - ACCCON - - b7 IRR 1=Causes an IRQ to the processor - b6 TST 1=Selects &FC00-&FEFF read from OS-ROM - b5 IFJ 1=Internal 1 MHz bus - 0=External 1MHz bus - b4 ITU 1=Internal Tube - 0=External Tube - b3 Y 1=Read/Write HAZEL &C000-&DFFF RAM - 0=Read/Write ROM &C000-&DFFF OS-ROM - b2 X 1=Read/Write LYNNE - 0=Read/WRITE main memory &3000-&8000 - b1 E 1=Causes shadow if VDU code - 0=Main all the time - b0 D 1=Display LYNNE as screen - 0=Display main RAM screen - - ACCCON is a read/write register - */ - - int m_ACCCON; - int m_ACCCON_TST; - int m_ACCCON_IFJ; - int m_ACCCON_ITU; - int m_ACCCON_Y; - int m_ACCCON_X; - int m_ACCCON_E; - int m_ACCCON_D; - - - /* - The addressable latch - This 8 bit addressable latch is operated from port B lines 0-3. - PB0-PB2 are set to the required address of the output bit to be set. - PB3 is set to the value which should be programmed at that bit. - The function of the 8 output bits from this latch are:- - - B0 - Write Enable to the sound generator IC - B1 - READ select on the speech processor (B and B+) - R/nW control on CMOS RAM (Master only) - B2 - WRITE select on the speech processor - DS control on CMOS RAM (Master only) - B3 - Keyboard write enable - B4,B5 - these two outputs define the number to be added to the - start of screen address in hardware to control hardware scrolling:- - Mode Size Start of screen Size No.to add B5 B4 - 0,1,2 20K &3000 12K 1 1 - 3 16K &4000 16K 0 0 - 4,5 10K &5800 (or &1800) 22K 1 0 - 6 8K &6000 (or &2000) 24K 0 1 - B6 - Operates the CAPS lock LED (Pin 17 keyboard connector) - B7 - Operates the SHIFT lock LED (Pin 16 keyboard connector) - */ + /* + ACCCON + b7 IRR 1=Causes an IRQ to the processor + b6 TST 1=Selects &FC00-&FEFF read from OS-ROM + b5 IFJ 1=Internal 1 MHz bus + 0=External 1MHz bus + b4 ITU 1=Internal Tube + 0=External Tube + b3 Y 1=Read/Write HAZEL &C000-&DFFF RAM + 0=Read/Write ROM &C000-&DFFF OS-ROM + b2 X 1=Read/Write LYNNE + 0=Read/WRITE main memory &3000-&8000 + b1 E 1=Causes shadow if VDU code + 0=Main all the time + b0 D 1=Display LYNNE as screen + 0=Display main RAM screen + ACCCON is a read/write register + */ + + int m_acccon; + int m_acccon_irr; + int m_acccon_tst; + int m_acccon_ifj; + int m_acccon_itu; + int m_acccon_y; + int m_acccon_x; + int m_acccon_e; + int m_acccon_d; + + + /* + The addressable latch + This 8 bit addressable latch is operated from port B lines 0-3. + PB0-PB2 are set to the required address of the output bit to be set. + PB3 is set to the value which should be programmed at that bit. + The function of the 8 output bits from this latch are:- + + B0 - Write Enable to the sound generator IC + B1 - READ select on the speech processor (B and B+) + R/nW control on CMOS RAM (Master only) + B2 - WRITE select on the speech processor + DS control on CMOS RAM (Master only) + B3 - Keyboard write enable + B4,B5 - these two outputs define the number to be added to the + start of screen address in hardware to control hardware scrolling:- + Mode Size Start of screen Size No.to add B5 B4 + 0,1,2 20K &3000 12K 1 1 + 3 16K &4000 16K 0 0 + 4,5 10K &5800 (or &1800) 22K 1 0 + 6 8K &6000 (or &2000) 24K 0 1 + B6 - Operates the CAPS lock LED (Pin 17 keyboard connector) + B7 - Operates the SHIFT lock LED (Pin 16 keyboard connector) + */ int m_b0_sound; int m_b1_speech_read; @@ -437,9 +427,6 @@ public: // HACK FOR MC6845 Video Code ***************************************/ - int m_memorySize; - - // this is the real location of the start of the BBC's ram in the emulation // it can be changed if shadow ram is being used to point at the upper 32K of RAM uint8_t *m_video_ram; @@ -470,10 +457,8 @@ public: // HACK FOR MC6845 rgb_t out_rgb(rgb_t entry); - void bbc_setvideoshadow(int vdusel); + void setvideoshadow(int vdusel); void set_pixel_lookup(); - int vdudriverset(); - int bbcm_vdudriverset(); int bbc_keyboard(address_space &space, int data); void bbcb_IC32_initialise(bbc_state *state); void MC146818_set(address_space &space); diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp index f14dbf269f8..730a8e5de45 100644 --- a/src/mame/machine/bbc.cpp +++ b/src/mame/machine/bbc.cpp @@ -22,282 +22,254 @@ #include "imagedev/cassette.h" -/************************* -Model A memory handling functions -*************************/ +/**************************************** + BBC 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) +WRITE8_MEMBER(bbc_state::page_selecta_w) { - m_bank4->set_entry(data & 0x03); -} + /* for the Model A just address the 4 on board ROM sockets */ + m_swrbank = data & 0x03; + m_swrbank_ram = false; - -WRITE8_MEMBER(bbc_state::bbc_memorya1_w) -{ - m_region_maincpu->base()[offset]=data; + m_bank4->set_entry(m_swrbank); } -/************************* -Model B memory handling functions -*************************/ -/* the model B address all 16 of the ROM sockets */ -WRITE8_MEMBER(bbc_state::bbc_page_selectb_w) +/**************************************** + BBC Model B memory handling functions +****************************************/ + +WRITE8_MEMBER(bbc_state::page_selectb_w) { - m_rombank = data & 0x0f; - m_bank4->set_entry(m_rombank); -} + static const unsigned short swramtype[4][16] = { + // TODO: move sideways RAM boards to slot devices + { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, // 0: none + { 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 }, // 1: 128K (bank 8 to 15) Solidisk sideways ram userport bank latch (not implemented) + { 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0 }, // 2: 64K (banks 4 to 7) for Acorn sideways ram FE30 bank latch + { 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1 }, // 3: 128K (banks 8 to 15) for Acorn sideways ram FE30 bank latch + }; + /* the Model B address all 16 of the ROM sockets */ + m_swrbank = data & 0x0f; + m_swrbank_ram = swramtype[m_swramtype][m_swrbank] ? true : false; -WRITE8_MEMBER(bbc_state::bbc_memoryb3_w) -{ - if (m_ram->size() == 32*1024) - { - m_region_maincpu->base()[offset + 0x4000] = data; - } - else - { - m_region_maincpu->base()[offset] = data; - } + m_bank4->set_entry(m_swrbank); } -/* I have setup 3 types of sideways ram: -0: none -1: 128K (bank 8 to 15) Solidisc sideways ram userport bank latch -2: 64K (banks 4 to 7) for Acorn sideways ram FE30 bank latch -3: 128K (banks 8 to 15) for Acorn sideways ram FE30 bank latch -*/ -static const unsigned short bbc_SWRAMtype1[16]={0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1}; -static const unsigned short bbc_SWRAMtype2[16]={0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}; -static const unsigned short bbc_SWRAMtype3[16]={0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1}; - WRITE8_MEMBER(bbc_state::bbc_memoryb4_w) { - switch (m_SWRAMtype) + if (m_swrbank_ram) { - 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; + m_region_opt->base()[(m_swrbank << 14) + offset] = data; } } -/****************************************/ -/* BBC B Plus memory handling function */ -/****************************************/ - - -/* this function should return true if - the instruction is in the VDU driver address ranged - these are set when: - PC is in the range c000 to dfff - or if pagedRAM set and PC is in the range a000 to afff -*/ -int bbc_state::vdudriverset() -{ - int PC; - PC = machine().device("maincpu")->safe_pc(); // this needs to be set to the 6502 program counter - return (((PC >= 0xc000) && (PC <= 0xdfff)) || ((m_pagedRAM) && ((PC >= 0xa000) && (PC <= 0xafff)))); -} +/**************************************** + BBC Model B+ memory handling functions +****************************************/ -/* the model B Plus addresses all 16 of the ROM sockets plus the extra 12K of ram at 0x8000 - and 20K of shadow ram at 0x3000 */ -WRITE8_MEMBER(bbc_state::bbc_page_selectbp_w) +READ8_MEMBER(bbc_state::bbcbp_fetch_r) { - if ((offset&0x04)==0) + switch (offset & 0xf000) { - m_pagedRAM = BIT(data,7); - m_rombank = data & 0x0f; + case 0xa000: + /* Code executing from sideways RAM between 0xa000-0xafff will access the shadow RAM (if selected) */ + if (m_vdusel && m_paged_ram) + { + m_bank2->set_base(m_region_maincpu->base() + 0xb000); + } + else + { + m_bank2->set_base(m_region_maincpu->base() + 0x3000); + } + break; - if (m_pagedRAM) + case 0xc000: + case 0xd000: + /* Access shadow RAM if VDU drivers and shadow RAM selected */ + if (m_vdusel) { - /* if paged ram then set 8000 to afff to read from the ram 8000 to afff */ - m_bank4->set_entry(0x10); + m_bank2->set_base(m_region_maincpu->base() + 0xb000); } else { - /* if paged rom then set the rom to be read from 8000 to afff */ - m_bank4->set_entry(m_rombank); - }; + m_bank2->set_base(m_region_maincpu->base() + 0x3000); + } + break; - /* set the rom to be read from b000 to bfff */ - m_bank6->set_entry(m_rombank); - } - else - { - //the video display should now use this flag to display the shadow ram memory - m_vdusel=BIT(data,7); - bbc_setvideoshadow(m_vdusel); - //need to make the video display do a full screen refresh for the new memory area + default: m_bank2->set_base(m_region_maincpu->base() + 0x3000); + break; } + return m_maincpu->space(AS_PROGRAM).read_byte(offset); } - -/* write to the normal memory from 0x0000 to 0x2fff - the writes to this memory are just done the normal - way */ - -WRITE8_MEMBER(bbc_state::bbc_memorybp1_w) +WRITE8_MEMBER(bbc_state::page_selectbp_w) { - m_region_maincpu->base()[offset]=data; -} + /* the Model B+ addresses all 16 ROM sockets and extra 12K of RAM at 0x8000 and 20K of shadow RAM at 0x3000 */ + switch (offset & 0x07) + { + case 0x00: + m_paged_ram = BIT(data,7); + m_swrbank = data & 0x0f; + m_swrbank_ram = false; -WRITE8_MEMBER(bbc_state::bbc_memorybp2_w) -{ - uint8_t *RAM = m_region_maincpu->base(); - if (m_vdusel==0) - { - // not in shadow ram mode so just write to normal ram - RAM[offset + 0x3000] = data; - } - else - { - if (vdudriverset()) + if (m_paged_ram) { - // if VDUDriver set then write to shadow ram - RAM[offset + 0xb000] = data; + /* if paged RAM then set 0x8000 to 0xafff to read from the RAM 8000 to 0xafff */ + m_bank4->set_entry(0x10); } else { - // else write to normal ram - RAM[offset + 0x3000] = data; - } - } -} + /* if paged ROM then set the ROM to be read from 0x8000 to 0xafff */ + m_bank4->set_entry(m_swrbank); + }; + /* set the ROM to be read from 0xb000 to 0xbfff */ + m_bank6->set_entry(m_swrbank); + break; -/* if the pagedRAM is set write to RAM between 0x8000 to 0xafff -otherwise this area contains ROM so no write is required */ -WRITE8_MEMBER(bbc_state::bbc_memorybp4_w) -{ - if (m_pagedRAM) - { - m_region_maincpu->base()[offset+0x8000]=data; + case 0x04: + /* the video display should now use this flag to display the shadow RAM memory */ + m_vdusel = BIT(data,7); + setvideoshadow(m_vdusel); + break; } } +WRITE8_MEMBER(bbc_state::page_selectbp128_w) +{ + /* the BBC B+ 128K has extra RAM mapped in replacing the ROM banks 0,1,c and d. */ + static const unsigned short swram_banks[16] = { 1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0 }; -/* the BBC B plus 128K had extra ram mapped in replacing the -rom bank 0,1,c and d. -The function memorybp3_128_w handles memory writes from 0x8000 to 0xafff -which could either be sideways ROM, paged RAM, or sideways RAM. -The function memorybp4_128_w handles memory writes from 0xb000 to 0xbfff -which could either be sideways ROM or sideways RAM */ + switch (offset & 0x07) + { + case 0x00: + m_paged_ram = BIT(data, 7); + m_swrbank = data & 0x0f; + m_swrbank_ram = swram_banks[m_swrbank] ? true : false; -static const unsigned short bbc_b_plus_sideways_ram_banks[16]={ 1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0 }; + if (m_paged_ram) + { + /* if paged RAM then set 0x8000 to 0xafff to read from the RAM 8000 to 0xafff */ + m_bank4->set_entry(0x10); + } + else + { + /* if paged ROM then set the ROM to be read from 0x8000 to 0xafff */ + m_bank4->set_entry(m_swrbank); + } + /* set the ROM to be read from 0xb000 to 0xbfff */ + m_bank6->set_entry(m_swrbank); + break; + + case 0x04: + /* the video display should now use this flag to display the shadow RAM memory */ + m_vdusel = BIT(data, 7); + setvideoshadow(m_vdusel); + break; + } +} -WRITE8_MEMBER(bbc_state::bbc_memorybp4_128_w) +WRITE8_MEMBER(bbc_state::bbc_memorybp4_w) { - if (m_pagedRAM) + if (m_paged_ram) { - m_region_maincpu->base()[offset+0x8000]=data; + m_region_maincpu->base()[offset + 0x8000] = data; } - else + else if (m_swrbank_ram) { - if (bbc_b_plus_sideways_ram_banks[m_rombank]) - { - m_region_opt->base()[offset+(m_rombank<<14)]=data; - } + m_region_opt->base()[offset + (m_swrbank << 14)] = data; } } -WRITE8_MEMBER(bbc_state::bbc_memorybp6_128_w) +WRITE8_MEMBER(bbc_state::bbc_memorybp6_w) { - if (bbc_b_plus_sideways_ram_banks[m_rombank]) + if (m_swrbank_ram) { - m_region_opt->base()[offset+(m_rombank<<14)+0x3000]=data; + m_region_opt->base()[offset + (m_swrbank << 14) + 0x3000] = data; } } - -/****************************************/ -/* BBC Master functions */ -/****************************************/ +/**************************************** + BBC Master memory handling functions +****************************************/ /* -ROMSEL - &FE30 write Only -B7 RAM 1=Page in ANDY &8000-&8FFF - 0=Page in ROM &8000-&8FFF -B6 Not Used -B5 Not Used -B4 Not Used -B3-B0 Rom/Ram Bank Select - -ACCCON - -b7 IRR 1=Causes an IRQ to the processor -b6 TST 1=Selects &FC00-&FEFF read from OS-ROM -b5 IFJ 1=Internal 1MHz bus - 0=External 1MHz bus -b4 ITU 1=Internal Tube - 0=External Tube -b3 Y 1=Read/Write HAZEL &C000-&DFFF RAM - 0=Read/Write ROM &C000-&DFFF OS-ROM -b2 X 1=Read/Write LYNNE - 0=Read/WRITE main memory &3000-&8000 -b1 E 1=Causes shadow if VDU code - 0=Main all the time -b0 D 1=Display LYNNE as screen - 0=Display main RAM screen - -ACCCON is a read/write register - -HAZEL is the 8K of RAM used by the MOS, filing system, and other ROMs at &C000-&DFFF - -ANDY is the name of the 4K of RAM used by the MOS at &8000-&8FFF - -b7:This causes an IRQ to occur. If you set this bit, you must write a routine on IRQ2V to clear it. - -b6:If set, this switches in the ROM at &FD00-&FEFF for reading, writes to these addresses are still directed to the I/O -The MOS will not work properly with this but set. the Masters OS uses this feature to place some of the reset code in this area, -which is run at powerup. - -b3:If set, access to &C000-&DFFF are directed to HAZEL, an 8K bank of RAM. IF clear, then operating system ROM is read. - -b2:If set, read/write access to &3000-&7FFF are directed to the LYNNE, the shadow screen RAM. If clear access is made to the main RAM. - -b1:If set, when the program counter is between &C000 and &DFFF, read/write access is directed to the LYNNE shadow RAM. -if the program counter is anywhere else main ram is accessed. - + ROMSEL - &FE30 write only + b7 RAM 1 = Page in ANDY &8000-&8FFF + 0 = Page in ROM &8000-&8FFF + b6 Not Used + b5 Not Used + b4 Not Used + b3-b0 ROM/RAM Bank Select + + ACCCON - &FE34 read/write register + b7 IRR 1 = Causes an IRQ to the processor + b6 TST 1 = Selects &FC00-&FEFF read from OS-ROM + b5 IFJ 1 = Internal 1MHz bus + 0 = External 1MHz bus + b4 ITU 1 = Internal Tube + 0 = External Tube + b3 Y 1 = Read/Write HAZEL &C000-&DFFF RAM + 0 = Read/Write ROM &C000-&DFFF OS-ROM + b2 X 1 = Read/Write LYNNE + 0 = Read/Write main memory &3000-&8000 + b1 E 1 = Causes shadow if VDU code + 0 = Main all the time + b0 D 1 = Display LYNNE as screen + 0 = Display main RAM screen + + HAZEL is the 8K of RAM used by the MOS, filing system, and other ROMs at &C000-&DFFF + + ANDY is the name of the 4K of RAM used by the MOS at &8000-&8FFF */ - -READ8_MEMBER(bbc_state::bbcm_ACCCON_read) +READ8_MEMBER(bbc_state::bbcm_fetch_r) { - logerror("ACCCON read %d\n",offset); - return m_ACCCON; + if (offset >= 0xc000 && offset <= 0xdfff) + { + if (m_acccon_e) + { + m_bank2->set_base(m_region_maincpu->base() + 0xb000); + } + else + { + m_bank2->set_base(m_region_maincpu->base() + 0x3000); + } + } + return m_maincpu->space(AS_PROGRAM).read_byte(offset); } -WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write) +READ8_MEMBER(bbc_state::bbcm_acccon_r) { - int tempIRR; - m_ACCCON=data; + return m_acccon; +} - logerror("ACCCON write %d %d \n",offset,data); +WRITE8_MEMBER(bbc_state::bbcm_acccon_w) +{ + m_acccon = data; - tempIRR=m_ACCCON_IRR; + m_acccon_irr = BIT(data,7); + m_acccon_tst = BIT(data,6); + m_acccon_ifj = BIT(data,5); + m_acccon_itu = BIT(data,4); + m_acccon_y = BIT(data,3); + m_acccon_x = BIT(data,2); + m_acccon_e = BIT(data,1); + m_acccon_d = BIT(data,0); - m_ACCCON_IRR = BIT(data,7); - m_ACCCON_TST = BIT(data,6); - m_ACCCON_IFJ = BIT(data,5); - m_ACCCON_ITU = BIT(data,4); - m_ACCCON_Y = BIT(data,3); - m_ACCCON_X = BIT(data,2); - m_ACCCON_E = BIT(data,1); - m_ACCCON_D = BIT(data,0); + /* Bit IRR causes Interrupt Request. */ + m_irqs->in_w<6>(m_acccon_irr); - if (tempIRR!=m_ACCCON_IRR) - { - m_irqs->in_w<3>(m_ACCCON_IRR); - } - - if (m_ACCCON_Y) + /* Bit Y causes 8K of RAM (HAZEL) to be overlayed on the MOS VDU drivers. */ + if (m_acccon_y) { m_bank7->set_base(m_region_maincpu->base() + 0x9000); } @@ -306,10 +278,11 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write) m_bank7->set_base(m_region_os->base()); } - bbc_setvideoshadow(m_ACCCON_D); - + /* Bit D causes the CRT controller to display the contents of LYNNE. */ + setvideoshadow(m_acccon_d); - if (m_ACCCON_X) + /* Bit X causes all accesses to 0x3000-0x7fff to be re-directed to LYNNE.*/ + if (m_acccon_x) { m_bank2->set_base(m_region_maincpu->base() + 0xb000); } @@ -318,10 +291,10 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write) m_bank2->set_base(m_region_maincpu->base() + 0x3000); } - /* ACCCON_TST controls paging of rom reads in the 0xFC00-0xFEFF region */ + /* Bit TST controls paging of ROM reads in the 0xfc00-0xfeff region */ /* if 0 the I/O is paged for both reads and writes */ /* if 1 the ROM is paged in for reads but writes still go to I/O */ - if (m_ACCCON_TST) + if (m_acccon_tst) { m_bank8->set_base(m_region_os->base() + 0x3c00); space.install_read_bank(0xfc00, 0xfeff, "bank8"); @@ -332,98 +305,76 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write) } } - -int bbc_state::bbcm_vdudriverset() -{ - int PC; - PC = machine().device("maincpu")->safe_pc(); - return ((PC >= 0xc000) && (PC <= 0xdfff)); -} - - WRITE8_MEMBER(bbc_state::page_selectbm_w) { - m_pagedRAM = (data & 0x80) >> 7; - m_rombank = data & 0x0f; + m_paged_ram = (data & 0x80) >> 7; + m_swrbank = data & 0x0f; - if (m_lk19_ic37_paged_rom && (m_rombank == 4 || m_rombank == 5)) m_pagedRAM = 0; - if (m_lk18_ic41_paged_rom && (m_rombank == 6 || m_rombank == 7)) m_pagedRAM = 0; + if ((!m_lk19_ic37_paged_rom && (m_swrbank == 4 || m_swrbank == 5)) || (!m_lk18_ic41_paged_rom && (m_swrbank == 6 || m_swrbank == 7))) + { + /* links are set for RAM so make read/write */ + m_swrbank_ram = true; + } + else + { + /* links are set for ROM so make read-only */ + m_swrbank_ram = false; + } - if (m_pagedRAM) + if (m_paged_ram) { m_bank4->set_entry(0x10); - m_bank5->set_entry(m_rombank); + m_bank5->set_entry(m_swrbank); } else { - m_bank4->set_entry(m_rombank); - m_bank5->set_entry(m_rombank); + m_bank4->set_entry(m_swrbank); + m_bank5->set_entry(m_swrbank); } } - -WRITE8_MEMBER(bbc_state::bbc_memorybm1_w) -{ - m_region_maincpu->base()[offset] = data; -} - - WRITE8_MEMBER(bbc_state::bbc_memorybm2_w) { - uint8_t *RAM = m_region_maincpu->base(); - if (m_ACCCON_X) + if (m_acccon_x || (m_acccon_e && m_vdusel)) { - RAM[offset + 0xb000] = data; + m_region_maincpu->base()[offset + 0xb000] = data; } else { - if (m_ACCCON_E && bbcm_vdudriverset()) - { - RAM[offset + 0xb000] = data; - } - else - { - RAM[offset + 0x3000] = data; - } + m_region_maincpu->base()[offset + 0x3000] = data; } } - WRITE8_MEMBER(bbc_state::bbc_memorybm4_w) { - if (m_pagedRAM) + if (m_paged_ram) { - m_region_maincpu->base()[offset+0x8000] = data; + m_region_maincpu->base()[offset + 0x8000] = data; } - else + else if (m_swrbank_ram) { - if ((!m_lk18_ic41_paged_rom && (m_rombank == 6 || m_rombank == 7)) || (!m_lk19_ic37_paged_rom && (m_rombank == 4 || m_rombank == 5))) - { - m_region_opt->base()[offset+(m_rombank<<14)] = data; - } + m_region_opt->base()[offset + (m_swrbank << 14)] = data; } } WRITE8_MEMBER(bbc_state::bbc_memorybm5_w) { - if ((!m_lk18_ic41_paged_rom && (m_rombank == 6 || m_rombank == 7)) || (!m_lk19_ic37_paged_rom && (m_rombank == 4 || m_rombank == 5))) + if (m_swrbank_ram) { - m_region_opt->base()[offset+(m_rombank<<14) + 0x1000] = data; + m_region_opt->base()[offset + (m_swrbank << 14) + 0x1000] = data; } } - WRITE8_MEMBER(bbc_state::bbc_memorybm7_w) { - if (m_ACCCON_Y) + if (m_acccon_y) { - m_region_maincpu->base()[offset+0x9000] = data; + m_region_maincpu->base()[offset + 0x9000] = data; } } - /****************************************************************************** &FC00-&FCFF FRED &FC00-&FC03 Byte-Wide Expansion RAM @@ -493,7 +444,7 @@ READ8_MEMBER(bbc_state::bbcm_r) if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) return m_wd1772->read(space, myo-0x28); /* 1772 Controller */ if ((myo>=0x28) && (myo<=0x2f)) return 0xfe; /* No Controller */ if ((myo>=0x30) && (myo<=0x33)) return 0xfe; - if ((myo>=0x34) && (myo<=0x37)) return bbcm_ACCCON_read(space, myo-0x34); /* ACCCON */ + if ((myo>=0x34) && (myo<=0x37)) return bbcm_acccon_r(space, myo-0x34); /* ACCCON */ if ((myo>=0x38) && (myo<=0x3f)) return 0xfe; /* NC ?? */ if ((myo>=0x40) && (myo<=0x5f)) return m_via6522_0->read(space, myo-0x40); if ((myo>=0x60) && (myo<=0x7f)) return m_via6522_1 ? m_via6522_1->read(space, myo-0x60) : 0xfe; @@ -502,8 +453,8 @@ READ8_MEMBER(bbc_state::bbcm_r) if ((myo>=0xc0) && (myo<=0xdf)) return 0xff; if ((myo>=0xe0) && (myo<=0xff)) { - if (m_intube && m_ACCCON_ITU) return m_intube->host_r(space, myo-0xe0); /* Internal TUBE */ - if (m_extube && !m_ACCCON_ITU) return m_extube->host_r(space, myo-0xe0); /* External TUBE */ + if (m_intube && m_acccon_itu) return m_intube->host_r(space, myo-0xe0); /* Internal TUBE */ + if (m_extube && !m_acccon_itu) return m_extube->host_r(space, myo-0xe0); /* External TUBE */ } } return 0xfe; @@ -527,7 +478,7 @@ WRITE8_MEMBER(bbc_state::bbcm_w) if ((myo>=0x24) && (myo<=0x27) && (m_wd1772)) bbcm_wd1772l_write(space, myo-0x24, data); /* disc control latch */ if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) m_wd1772->write(space, myo-0x28, data); /* 1772 Controller */ if ((myo>=0x30) && (myo<=0x33)) page_selectbm_w(space, myo-0x30, data); /* ROMSEL */ - if ((myo>=0x34) && (myo<=0x37)) bbcm_ACCCON_write(space, myo-0x34, data); /* ACCCON */ + if ((myo>=0x34) && (myo<=0x37)) bbcm_acccon_w(space, myo-0x34, data); /* ACCCON */ //if ((myo>=0x38) && (myo<=0x3f)) /* NC ?? */ if ((myo>=0x40) && (myo<=0x5f)) m_via6522_0->write(space, myo-0x40, data); if ((myo>=0x60) && (myo<=0x7f) && (m_via6522_1)) m_via6522_1->write(space, myo-0x60, data); @@ -536,8 +487,8 @@ WRITE8_MEMBER(bbc_state::bbcm_w) //if ((myo>=0xc0) && (myo<=0xdf)) if ((myo>=0xe0) && (myo<=0xff)) { - if (m_intube && m_ACCCON_ITU) m_intube->host_w(space, myo-0xe0, data); /* Internal TUBE */ - if (m_extube && !m_ACCCON_ITU) m_extube->host_w(space, myo-0xe0, data); /* External TUBE */ + if (m_intube && m_acccon_itu) m_intube->host_w(space, myo-0xe0, data); /* Internal TUBE */ + if (m_extube && !m_acccon_itu) m_extube->host_w(space, myo-0xe0, data); /* External TUBE */ } } } @@ -1018,7 +969,7 @@ READ8_MEMBER(bbc_state::bbcb_via_system_read_portb) /************************************** -BBC Joystick Support + BBC Joystick Support **************************************/ UPD7002_GET_ANALOGUE(bbc_state::BBC_get_analogue_input) @@ -1649,23 +1600,18 @@ MACHINE_START_MEMBER(bbc_state, bbca) MACHINE_RESET_MEMBER(bbc_state, bbca) { m_monitortype = m_bbcconfig.read_safe(0) & 0x03; - m_Speech = m_bbcconfig.read_safe(0) & 0x04; - m_SWRAMtype = m_bbcconfig.read_safe(0) & 0x18; + m_swramtype = (m_bbcconfig.read_safe(0) & 0x0c) >> 2; - uint8_t *RAM = m_region_maincpu->base(); - - m_bank1->set_base(RAM); + m_bank1->set_base(m_region_maincpu->base()); if (m_ram->size() == 32*1024) { /* 32K Model A */ - m_bank3->set_base(RAM + 0x4000); - m_memorySize=32; + m_bank3->set_base(m_region_maincpu->base() + 0x4000); } else { /* 16K just repeat the lower 16K*/ - m_bank3->set_base(RAM); - m_memorySize=16; + m_bank3->set_base(m_region_maincpu->base()); } m_bank4->set_entry(0); @@ -1684,14 +1630,10 @@ MACHINE_START_MEMBER(bbc_state, bbcb) MACHINE_RESET_MEMBER(bbc_state, bbcb) { m_monitortype = m_bbcconfig.read_safe(0) & 0x03; - m_Speech = m_bbcconfig.read_safe(1) & 0x04; - m_SWRAMtype = m_bbcconfig.read_safe(0) & 0x18; + m_swramtype = (m_bbcconfig.read_safe(0) & 0x0c) >> 2; - uint8_t *RAM = m_region_maincpu->base(); - - m_bank1->set_base(RAM); - m_bank3->set_base(RAM + 0x4000); - m_memorySize=32; + m_bank1->set_base(m_region_maincpu->base()); + m_bank3->set_base(m_region_maincpu->base() + 0x4000); m_bank4->set_entry(0); m_bank7->set_base(m_region_os->base()); /* bank 7 points at the OS rom from c000 to ffff */ @@ -1705,8 +1647,7 @@ MACHINE_RESET_MEMBER(bbc_state, torch) MACHINE_RESET_CALL_MEMBER(bbcb); m_monitortype = monitor_type_t::COLOUR; - m_Speech = 1; - m_SWRAMtype = 0; + m_swramtype = 0; } @@ -1723,8 +1664,7 @@ MACHINE_START_MEMBER(bbc_state, bbcbp) MACHINE_RESET_MEMBER(bbc_state, bbcbp) { m_monitortype = m_bbcconfig.read_safe(0) & 0x03; - m_Speech = m_bbcconfig.read_safe(1) & 0x04; - m_SWRAMtype = 0; + m_swramtype = 0; m_bank1->set_base(m_region_maincpu->base()); m_bank2->set_base(m_region_maincpu->base() + 0x3000); /* bank 2 screen/shadow ram from 3000 to 7fff */ @@ -1758,11 +1698,10 @@ MACHINE_START_MEMBER(bbc_state, bbcm) MACHINE_RESET_MEMBER(bbc_state, bbcm) { m_monitortype = m_bbcconfig.read_safe(0) & 0x03; - m_Speech = 0; - m_SWRAMtype = 0; + m_swramtype = 0; - 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_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_entry(0); m_bank5->set_entry(0); m_bank7->set_base(m_region_os->base()); /* bank 6 OS rom of RAM from c000 to dfff */ @@ -1789,8 +1728,7 @@ MACHINE_RESET_MEMBER(bbc_state, ltmpbp) MACHINE_RESET_CALL_MEMBER(bbcbp); m_monitortype = monitor_type_t::GREEN; - m_Speech = 1; - m_SWRAMtype = 0; + m_swramtype = 0; } MACHINE_RESET_MEMBER(bbc_state, ltmpm) @@ -1798,8 +1736,7 @@ MACHINE_RESET_MEMBER(bbc_state, ltmpm) MACHINE_RESET_CALL_MEMBER(bbcm); m_monitortype = monitor_type_t::GREEN; - m_Speech = 0; - m_SWRAMtype = 0; + m_swramtype = 0; } diff --git a/src/mame/video/bbc.cpp b/src/mame/video/bbc.cpp index 5baba4ee184..ebf652f4b61 100644 --- a/src/mame/video/bbc.cpp +++ b/src/mame/video/bbc.cpp @@ -77,7 +77,7 @@ uint16_t bbc_state::calculate_video_address(uint16_t ma, uint8_t ra) else m = ((ma & 0xff)<<3) | (s<<11) | (ra & 0x7); - if (m_memorySize == 16) m &= 0x3fff; + if (m_ram->size() == 16 * 1024) m &= 0x3fff; return m; } @@ -281,13 +281,13 @@ WRITE_LINE_MEMBER(bbc_state::bbc_de_changed) /**** BBC B+/Master Shadow Ram change ****/ -void bbc_state::bbc_setvideoshadow(int vdusel) +void bbc_state::setvideoshadow(int vdusel) { // LYNNE lives at 0xb000 in our map, but the offset we use here is 0x8000 // as the video circuitry will already be looking at 0x3000 or so above // the offset. if (vdusel) - m_video_ram = m_region_maincpu->base()+0x8000; + m_video_ram = m_region_maincpu->base() + 0x8000; else m_video_ram = m_region_maincpu->base(); } @@ -304,5 +304,4 @@ VIDEO_START_MEMBER(bbc_state, bbc) set_pixel_lookup(); m_video_ram = m_region_maincpu->base(); - m_memorySize = m_ram->size() / 1024; } -- cgit v1.2.3