From 069c9c8e2cd4dc5b8079404ed2897ee59d4044f2 Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Thu, 15 Mar 2018 22:02:36 +0000 Subject: [PATCH] bbc: Added cassette relay samples. --- src/mame/drivers/bbc.cpp | 201 +++++++++++++++++++++------------------ src/mame/includes/bbc.h | 5 +- src/mame/machine/bbc.cpp | 14 ++- 3 files changed, 123 insertions(+), 97 deletions(-) diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index c7e216ae333..09b817b248e 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -144,126 +144,122 @@ 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(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 */ - /* 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.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(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 */ + /* 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 */ - map(0xfe10, 0xfe17).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); /* fe10-fe17 Serial ULA Serial system chip */ - 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(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 */ - map(0xfea0, 0xfebf).r(this, FUNC(bbc_state::bbc_fe_r)); /* fea0-febf 68B54 ADLC # ECONET controller */ - map(0xfec0, 0xfedf).noprw(); /* fec0-fedf uPD7002 # Analogue to digital converter */ - map(0xfee0, 0xfeff).r(this, FUNC(bbc_state::bbc_fe_r)); /* fee0-feff Tube ULA # Tube system interface */ - map(0xff00, 0xffff).rom().region("os", 0x3f00); /* ff00-ffff OS Rom (continued) */ + map(0xfe08, 0xfe09).mirror(0x06).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); /* fe08-fe0f 6850 ACIA Serial controller */ + map(0xfe10, 0xfe17).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); /* fe10-fe17 Serial ULA Serial system chip */ + 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(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 */ + map(0xfea0, 0xfebf).r(this, FUNC(bbc_state::bbc_fe_r)); /* fea0-febf 68B54 ADLC # ECONET controller */ + map(0xfec0, 0xfedf).noprw(); /* fec0-fedf uPD7002 # Analogue to digital converter */ + map(0xfee0, 0xfeff).r(this, FUNC(bbc_state::bbc_fe_r)); /* fee0-feff Tube ULA # Tube system interface */ + map(0xff00, 0xffff).rom().region("os", 0x3f00); /* ff00-ffff OS Rom (continued) */ } 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, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); /* fe00-fe07 6845 CRTC Video controller */ + 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, 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 */ - map(0xfe10, 0xfe17).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); /* fe10-fe17 Serial ULA Serial system chip */ - map(0xfe18, 0xfe1f).portr("STATID"); /* 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(0xfe40, 0xfe5f).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); /* fe40-fe5f 6522 VIA SYSTEM VIA */ - map(0xfe60, 0xfe7f).rw(m_via6522_1, FUNC(via6522_device::read), FUNC(via6522_device::write)); /* fe60-fe7f 6522 VIA USER VIA */ - /* fe80-fe9f FDC Floppy disc controller */ - map(0xfea0, 0xfebf).r(this, FUNC(bbc_state::bbc_fe_r)); /* fea0-febf 68B54 ADLC ECONET controller */ - map(0xfec0, 0xfedf).rw(m_upd7002, FUNC(upd7002_device::read), FUNC(upd7002_device::write)); /* fec0-fedf uPD7002 Analogue to digital converter */ - 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 */ - map(0xff00, 0xffff).rom().region("os", 0x3f00); /* ff00-ffff OS ROM (continued) */ + map(0xfe08, 0xfe09).mirror(0x06).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); /* fe08-fe0f 6850 ACIA Serial controller */ + map(0xfe10, 0xfe17).rw(this, FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); /* fe10-fe17 Serial ULA Serial system chip */ + map(0xfe18, 0xfe1f).portr("STATID"); /* 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(0xfe40, 0xfe5f).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); /* fe40-fe5f 6522 VIA SYSTEM VIA */ + map(0xfe60, 0xfe7f).rw(m_via6522_1, FUNC(via6522_device::read), FUNC(via6522_device::write)); /* fe60-fe7f 6522 VIA USER VIA */ + /* fe80-fe9f FDC Floppy disc controller */ + map(0xfea0, 0xfebf).r(this, FUNC(bbc_state::bbc_fe_r)); /* fea0-febf 68B54 ADLC ECONET controller */ + map(0xfec0, 0xfedf).rw(m_upd7002, FUNC(upd7002_device::read), FUNC(upd7002_device::write)); /* fec0-fedf uPD7002 Analogue to digital converter */ + 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 */ + map(0xff00, 0xffff).rom().region("os", 0x3f00); /* ff00-ffff OS ROM (continued) */ } 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(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 */ + 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).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 */ } 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).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 */ } 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(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(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 */ + 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_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(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 */ } 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(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 */ + 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(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 */ } 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(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(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_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 */ } /****************************************************************************** @@ -292,14 +288,13 @@ 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(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 */ - map(0xe000, 0xfbff).rom().region("os", 0x2000); /* e000-fbff OS ROM */ - map(0xfc00, 0xfeff).bankr("bank8").w(this, FUNC(bbc_state::bbcm_w)); /* processed directly because it can be ROM or hardware */ - map(0xff00, 0xffff).rom().region("os", 0x3f00); /* ff00-ffff OS ROM (continued) */ + 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(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 */ + map(0xe000, 0xffff).rom().region("os", 0x2000); /* e000-ffff OS ROM */ + map(0xfc00, 0xfeff).bankr("bank8").w(this, FUNC(bbc_state::bbcm_w)); /* processed directly because it can be ROM or hardware */ } @@ -820,6 +815,15 @@ static SLOT_INTERFACE_START( bbc_floppies_35 ) SLOT_INTERFACE_END +static const char *const bbc_sample_names[] = +{ + "*bbc", + "motoroff", + "motoron", + nullptr +}; + + WRITE_LINE_MEMBER(bbc_state::adlc_irq_w) { m_adlc_irq = state; @@ -914,10 +918,16 @@ MACHINE_CONFIG_START(bbc_state::bbca) MCFG_SOUND_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + /* cassette relay */ + MCFG_SOUND_ADD("samples", SAMPLES, 0) + MCFG_SAMPLES_CHANNELS(1) + MCFG_SAMPLES_NAMES(bbc_sample_names) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + /* cassette */ MCFG_CASSETTE_ADD( "cassette" ) MCFG_CASSETTE_FORMATS(bbc_cassette_formats) - MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY) + MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED) MCFG_CASSETTE_INTERFACE("bbc_cass") /* software lists */ @@ -1266,6 +1276,7 @@ MACHINE_CONFIG_START(bbc_state::reutapm) /* sound hardware */ MCFG_DEVICE_REMOVE("mono") MCFG_DEVICE_REMOVE("sn76489") + MCFG_DEVICE_REMOVE("samples") MCFG_DEVICE_REMOVE("vsm") MCFG_DEVICE_REMOVE("tms5220") @@ -1373,6 +1384,12 @@ MACHINE_CONFIG_START(bbc_state::bbcm) MCFG_SOUND_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + /* cassette relay */ + MCFG_SOUND_ADD("samples", SAMPLES, 0) + MCFG_SAMPLES_CHANNELS(1) + MCFG_SAMPLES_NAMES(bbc_sample_names) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + /* rtc and cmos */ MCFG_MC146818_ADD( "rtc", 32.768_kHz_XTAL ) @@ -1384,7 +1401,7 @@ MACHINE_CONFIG_START(bbc_state::bbcm) /* cassette */ MCFG_CASSETTE_ADD( "cassette" ) MCFG_CASSETTE_FORMATS(bbc_cassette_formats) - MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY) + MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED) MCFG_CASSETTE_INTERFACE("bbc_cass") // 2 x cartridge sockets in BBC-Master diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h index 49d014ea4b4..5c484899e36 100644 --- a/src/mame/includes/bbc.h +++ b/src/mame/includes/bbc.h @@ -29,6 +29,7 @@ #include "video/saa5050.h" #include "sound/sn76496.h" #include "sound/tms5220.h" +#include "sound/samples.h" #include "imagedev/cassette.h" #include "bus/bbc/fdc/fdc.h" @@ -56,6 +57,7 @@ public: m_screen(*this, "screen"), m_adlc(*this, "mc6854"), m_sn(*this, "sn76489"), + m_samples(*this, "samples"), m_keyboard(*this, "COL%u", 0), m_trom(*this, "saa5050"), m_tms(*this, "tms5220"), @@ -256,6 +258,7 @@ private: required_device m_screen; optional_device m_adlc; optional_device m_sn; + optional_device m_samples; required_ioport_array<13> m_keyboard; public: // HACK FOR MC6845 optional_device m_trom; @@ -475,7 +478,7 @@ public: // HACK FOR MC6845 void bbcb_IC32_initialise(bbc_state *state); void MC146818_set(address_space &space); void MC6850_Receive_Clock(int new_clock); - void BBC_Cassette_motor(unsigned char status); + void cassette_motor(bool state); void bbc_update_nmi(); uint16_t calculate_video_address(uint16_t ma, uint8_t ra); required_device m_palette; diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp index fe7b66257a3..f14dbf269f8 100644 --- a/src/mame/machine/bbc.cpp +++ b/src/mame/machine/bbc.cpp @@ -1229,9 +1229,15 @@ WRITE_LINE_MEMBER( bbc_state::bbc_txd_w ) } -void bbc_state::BBC_Cassette_motor(unsigned char status) +void bbc_state::cassette_motor(bool motor_state) { - if (status) + const bool prev_state = ((m_cassette->get_state() & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_ENABLED) ? true : false; + + /* cassette relay sound */ + if (prev_state != motor_state) + m_samples->start(0, motor_state ? 1 : 0); + + if (motor_state) { m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR); m_tape_timer->adjust(attotime::zero, 0, attotime::from_hz(44100)); @@ -1248,7 +1254,7 @@ void bbc_state::BBC_Cassette_motor(unsigned char status) m_cass_out_phase = 0; m_cass_out_samples_to_go = 4; } - output().set_value("motor_led", !status); + output().set_value("motor_led", !motor_state); } @@ -1287,7 +1293,7 @@ WRITE8_MEMBER(bbc_state::bbc_SerialULA_w) update_acia_rxd(); update_acia_dcd(); update_acia_cts(); - if (m_cassette) BBC_Cassette_motor(m_serproc_data & 0x80); + if (m_cassette) cassette_motor(BIT(m_serproc_data, 7)); // Set transmit clock rate m_acia_clock->set_clock_scale( (double) 1 / serial_clocks[ data & 0x07 ] );