bbc: Added cassette relay samples.

This commit is contained in:
Nigel Barnes 2018-03-15 22:02:36 +00:00
parent 4385097d99
commit 069c9c8e2c
3 changed files with 123 additions and 97 deletions

View File

@ -145,7 +145,6 @@ READ8_MEMBER(bbc_state::bbc_fe_r)
void bbc_state::bbca_mem(address_map &map) void bbc_state::bbca_mem(address_map &map)
{ {
map.unmap_value_high(); /* Hardware marked with a # is not present in a Model A */ 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(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(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(0x8000, 0xbfff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memoryb4_w)); /* 8000-bfff Paged ROM */
@ -174,7 +173,6 @@ void bbc_state::bbca_mem(address_map &map)
void bbc_state::bbc_base(address_map &map) void bbc_state::bbc_base(address_map &map)
{ {
map.unmap_value_high(); map.unmap_value_high();
map(0xc000, 0xfbff).bankr("bank7"); /* c000-fbff OS ROM */ map(0xc000, 0xfbff).bankr("bank7"); /* c000-fbff OS ROM */
map(0xfc00, 0xfdff).noprw(); /* fc00-fdff FRED & JIM Pages */ map(0xfc00, 0xfdff).noprw(); /* fc00-fdff FRED & JIM Pages */
/* fe00-feff SHEILA Address Page */ /* fe00-feff SHEILA Address Page */
@ -198,7 +196,6 @@ void bbc_state::bbc_base(address_map &map)
void bbc_state::bbcb_mem(address_map &map) void bbc_state::bbcb_mem(address_map &map)
{ {
bbc_base(map); bbc_base(map);
map(0x0000, 0x3fff).bankr("bank1").w(this, FUNC(bbc_state::bbc_memorya1_w)); /* 0000-3fff Regular Ram */ 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(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(0x8000, 0xbfff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memoryb4_w)); /* 8000-bfff Paged ROM */
@ -212,7 +209,6 @@ void bbc_state::bbcb_mem(address_map &map)
void bbc_state::bbcb_nofdc_mem(address_map &map) void bbc_state::bbcb_nofdc_mem(address_map &map)
{ {
bbc_base(map); bbc_base(map);
map(0x0000, 0x3fff).bankr("bank1").w(this, FUNC(bbc_state::bbc_memorya1_w)); /* 0000-3fff Regular Ram */ 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(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(0x8000, 0xbfff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memoryb4_w)); /* 8000-bfff Paged ROM */
@ -297,9 +293,8 @@ void bbc_state::bbcm_mem(address_map &map)
map(0x8000, 0x8fff).bankr("bank4").w(this, FUNC(bbc_state::bbc_memorybm4_w)); /* 8000-8fff Paged ROM/RAM or 4K of RAM ANDY */ 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(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(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(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 */ 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) */
} }
@ -820,6 +815,15 @@ static SLOT_INTERFACE_START( bbc_floppies_35 )
SLOT_INTERFACE_END SLOT_INTERFACE_END
static const char *const bbc_sample_names[] =
{
"*bbc",
"motoroff",
"motoron",
nullptr
};
WRITE_LINE_MEMBER(bbc_state::adlc_irq_w) WRITE_LINE_MEMBER(bbc_state::adlc_irq_w)
{ {
m_adlc_irq = state; 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_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) 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 */ /* cassette */
MCFG_CASSETTE_ADD( "cassette" ) MCFG_CASSETTE_ADD( "cassette" )
MCFG_CASSETTE_FORMATS(bbc_cassette_formats) 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") MCFG_CASSETTE_INTERFACE("bbc_cass")
/* software lists */ /* software lists */
@ -1266,6 +1276,7 @@ MACHINE_CONFIG_START(bbc_state::reutapm)
/* sound hardware */ /* sound hardware */
MCFG_DEVICE_REMOVE("mono") MCFG_DEVICE_REMOVE("mono")
MCFG_DEVICE_REMOVE("sn76489") MCFG_DEVICE_REMOVE("sn76489")
MCFG_DEVICE_REMOVE("samples")
MCFG_DEVICE_REMOVE("vsm") MCFG_DEVICE_REMOVE("vsm")
MCFG_DEVICE_REMOVE("tms5220") 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_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) 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 */ /* rtc and cmos */
MCFG_MC146818_ADD( "rtc", 32.768_kHz_XTAL ) MCFG_MC146818_ADD( "rtc", 32.768_kHz_XTAL )
@ -1384,7 +1401,7 @@ MACHINE_CONFIG_START(bbc_state::bbcm)
/* cassette */ /* cassette */
MCFG_CASSETTE_ADD( "cassette" ) MCFG_CASSETTE_ADD( "cassette" )
MCFG_CASSETTE_FORMATS(bbc_cassette_formats) 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") MCFG_CASSETTE_INTERFACE("bbc_cass")
// 2 x cartridge sockets in BBC-Master // 2 x cartridge sockets in BBC-Master

View File

@ -29,6 +29,7 @@
#include "video/saa5050.h" #include "video/saa5050.h"
#include "sound/sn76496.h" #include "sound/sn76496.h"
#include "sound/tms5220.h" #include "sound/tms5220.h"
#include "sound/samples.h"
#include "imagedev/cassette.h" #include "imagedev/cassette.h"
#include "bus/bbc/fdc/fdc.h" #include "bus/bbc/fdc/fdc.h"
@ -56,6 +57,7 @@ public:
m_screen(*this, "screen"), m_screen(*this, "screen"),
m_adlc(*this, "mc6854"), m_adlc(*this, "mc6854"),
m_sn(*this, "sn76489"), m_sn(*this, "sn76489"),
m_samples(*this, "samples"),
m_keyboard(*this, "COL%u", 0), m_keyboard(*this, "COL%u", 0),
m_trom(*this, "saa5050"), m_trom(*this, "saa5050"),
m_tms(*this, "tms5220"), m_tms(*this, "tms5220"),
@ -256,6 +258,7 @@ private:
required_device<screen_device> m_screen; required_device<screen_device> m_screen;
optional_device<mc6854_device> m_adlc; optional_device<mc6854_device> m_adlc;
optional_device<sn76489_device> m_sn; optional_device<sn76489_device> m_sn;
optional_device<samples_device> m_samples;
required_ioport_array<13> m_keyboard; required_ioport_array<13> m_keyboard;
public: // HACK FOR MC6845 public: // HACK FOR MC6845
optional_device<saa5050_device> m_trom; optional_device<saa5050_device> m_trom;
@ -475,7 +478,7 @@ public: // HACK FOR MC6845
void bbcb_IC32_initialise(bbc_state *state); void bbcb_IC32_initialise(bbc_state *state);
void MC146818_set(address_space &space); void MC146818_set(address_space &space);
void MC6850_Receive_Clock(int new_clock); void MC6850_Receive_Clock(int new_clock);
void BBC_Cassette_motor(unsigned char status); void cassette_motor(bool state);
void bbc_update_nmi(); void bbc_update_nmi();
uint16_t calculate_video_address(uint16_t ma, uint8_t ra); uint16_t calculate_video_address(uint16_t ma, uint8_t ra);
required_device<palette_device> m_palette; required_device<palette_device> m_palette;

View File

@ -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_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
m_tape_timer->adjust(attotime::zero, 0, attotime::from_hz(44100)); 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_phase = 0;
m_cass_out_samples_to_go = 4; 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_rxd();
update_acia_dcd(); update_acia_dcd();
update_acia_cts(); 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 // Set transmit clock rate
m_acia_clock->set_clock_scale( (double) 1 / serial_clocks[ data & 0x07 ] ); m_acia_clock->set_clock_scale( (double) 1 / serial_clocks[ data & 0x07 ] );