diff --git a/src/devices/sound/s14001a_new.cpp b/src/devices/sound/s14001a_new.cpp index 2c70a4798fe..9e7f06a6626 100644 --- a/src/devices/sound/s14001a_new.cpp +++ b/src/devices/sound/s14001a_new.cpp @@ -33,7 +33,6 @@ void s14001a_new_device::device_start() m_bsy_handler.resolve(); m_uOutputP1 = m_uOutputP2 = 7; - //m_uPrintLevel = 10; } @@ -46,38 +45,40 @@ void s14001a_new_device::sound_stream_update(sound_stream &stream, stream_sample for (int i = 0; i < samples; i++) { Clock(); - outputs[0][i] = ((((INT16)GetOutput())-7)<<10)*15; + INT16 sample = INT16(m_uOutputP2) - 7; + outputs[0][i] = sample * 0x4000; } } -UINT8 s14001a_new_device::readmem(UINT16 offset, bool phase) -{ - offset &= 0xfff; // 11-bit internal - return ((m_ext_read_handler.isnull()) ? m_SpeechRom[offset & (m_SpeechRom.bytes() - 1)] : m_ext_read_handler(offset)); -} void s14001a_new_device::force_update() { m_stream->update(); } -int s14001a_new_device::bsy_r() +READ_LINE_MEMBER(s14001a_new_device::romclock_r) { m_stream->update(); - return (GetBusy()) ? 1 : 0; + return (m_bPhase1) ? 1 : 0; } -void s14001a_new_device::reg_w(int data) +READ_LINE_MEMBER(s14001a_new_device::busy_r) { m_stream->update(); - SetWord(data); + return (m_bBusyP1) ? 1 : 0; } -void s14001a_new_device::rst_w(int data) +WRITE8_MEMBER(s14001a_new_device::data_w) { m_stream->update(); - SetStart(data != 0); + m_uWord = data & 0x3f; // C0-C5 +} + +WRITE_LINE_MEMBER(s14001a_new_device::start_w) +{ + m_stream->update(); + m_bStart = (state != 0); if (m_bStart) m_uStateP1 = WORDWAIT; } @@ -90,6 +91,11 @@ void s14001a_new_device::set_clock(int clock) +UINT8 s14001a_new_device::readmem(UINT16 offset, bool phase) +{ + offset &= 0xfff; // 11-bit internal + return ((m_ext_read_handler.isnull()) ? m_SpeechRom[offset & (m_SpeechRom.bytes() - 1)] : m_ext_read_handler(offset)); +} bool s14001a_new_device::Clock() { @@ -136,27 +142,30 @@ bool s14001a_new_device::Clock() // logic done during phase 1 switch (m_uStateP1) { - // 0 case IDLE: - m_bBusyP1 = false; m_uOutputP1 = 7; if (m_bStart) m_uStateP1 = WORDWAIT; + + if (m_bBusyP1 && !m_bsy_handler.isnull()) + m_bsy_handler(0); + m_bBusyP1 = false; break; - // 1 case WORDWAIT: // the delta address register latches the word number into bits 03 to 08 // all other bits forced to 0. 04 to 08 makes a multiply by two. m_uDAR13To05P1 = (m_uWord&0x3C)>>2; m_uDAR04To00P1 = (m_uWord&0x03)<<3; m_RomAddrP1 = (m_uDAR13To05P1<<3)|(m_uDAR04To00P1>>2); // remove lower two bits - m_bBusyP1 = true; m_uOutputP1 = 7; if (m_bStart) m_uStateP1 = WORDWAIT; else m_uStateP1 = CWARMSB; + + if (!m_bBusyP1 && !m_bsy_handler.isnull()) + m_bsy_handler(1); + m_bBusyP1 = true; break; - // 2 case CWARMSB: if (m_uPrintLevel >= 1) printf("\n speaking word %02x",m_uWord); @@ -173,7 +182,6 @@ bool s14001a_new_device::Clock() else m_uStateP1 = CWARLSB; break; - // 3 case CWARLSB: m_uCWARP1 = m_uCWARP2|(readmem(m_uRomAddrP2,m_bPhase1)>>4); // setup in previous state m_RomAddrP1 = m_uCWARP1; @@ -183,7 +191,6 @@ bool s14001a_new_device::Clock() else m_uStateP1 = DARMSB; break; - // 4 case DARMSB: m_uDAR13To05P1 = readmem(m_uRomAddrP2,m_bPhase1)<<1; // 9 bit counter, 8 MSBs from ROM, lsb zeroed m_uDAR04To00P1 = 0; @@ -196,7 +203,6 @@ bool s14001a_new_device::Clock() else m_uStateP1 = CTRLBITS; break; - // 5 case CTRLBITS: m_bStopP1 = readmem(m_uRomAddrP2,m_bPhase1)&0x80? true: false; m_bVoicedP1 = readmem(m_uRomAddrP2,m_bPhase1)&0x40? true: false; @@ -216,7 +222,6 @@ bool s14001a_new_device::Clock() break; - // 6 case PLAY: { // statistics @@ -306,7 +311,6 @@ bool s14001a_new_device::Clock() break; } - // 7 case DELAY: m_uOutputP1 = 7; if (m_bStart) m_uStateP1 = WORDWAIT; @@ -351,7 +355,7 @@ void s14001a_new_device::CalculateIncrement(bool bVoicedP2, UINT8 uPPQtrP2, bool { uDeltaOldP2 = 0x02; } - static UINT8 uIncrements[4][4] = + static const UINT8 uIncrements[4][4] = { // 00 01 10 11 { 3, 3, 1, 1,}, // 00 diff --git a/src/devices/sound/s14001a_new.h b/src/devices/sound/s14001a_new.h index 04c11e31ed6..709573bd0bb 100644 --- a/src/devices/sound/s14001a_new.h +++ b/src/devices/sound/s14001a_new.h @@ -22,30 +22,11 @@ public: template static devcb_base &set_bsy_handler(device_t &device, _Object object) { return downcast(device).m_bsy_handler.set_callback(object); } template static devcb_base &set_ext_read_handler(device_t &device, _Object object) { return downcast(device).m_ext_read_handler.set_callback(object); } - bool Clock(); // called once to toggle external clock twice - - // output pin data - UINT16 GetRomAddr() { return m_uRomAddrP2; } - UINT8 GetOutput() { return m_uOutputP2; } - bool GetAddressRead() { return m_bPhase1; } - bool GetBusy() { return m_bBusyP1; } - - // input pin data - void SetStart(bool bStart) { m_bStart = bStart; } - void SetWord(UINT8 uWord) { m_uWord = uWord; } - - // emulator helper functions - UINT8 Mux8To2(bool bVoicedP2, UINT8 uPPQtrP2, UINT8 uDeltaAdrP2, UINT8 uRomDataP2); - void CalculateIncrement(bool bVoicedP2, UINT8 uPPQtrP2, bool bPPQStartP2, UINT8 uDeltaP2, UINT8 uDeltaOldP2, UINT8 &uDeltaOldP1, UINT8 &uIncrementP2, bool &bAddP2); - UINT8 CalculateOutput(bool bVoicedP2, bool bXSilenceP2, UINT8 uPPQtrP2, bool bPPQStartP2, UINT8 uLOutputP2, UINT8 uIncrementP2, bool bAddP2); - void ClearStatistics(); - void GetStatistics(UINT32 &uNPitchPeriods, UINT32 &uNVoiced, UINT32 uNControlWords); - void SetPrintLevel(UINT32 uPrintLevel) { m_uPrintLevel = uPrintLevel; } - - - int bsy_r(); /* read BUSY pin */ - void reg_w(int data); /* write to input latch */ - void rst_w(int data); /* write to RESET pin */ + DECLARE_READ_LINE_MEMBER(busy_r); + DECLARE_READ_LINE_MEMBER(romclock_r); + DECLARE_WRITE_LINE_MEMBER(start_w); + DECLARE_WRITE8_MEMBER(data_w); + void set_clock(int clock); /* set VSU-1000 clock */ // void set_volume(int volume); /* set VSU-1000 volume control */ void force_update(); @@ -58,7 +39,6 @@ protected: virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; private: - // internal state required_region_ptr m_SpeechRom; sound_stream * m_stream; @@ -66,7 +46,17 @@ private: devcb_read8 m_ext_read_handler; UINT8 readmem(UINT16 offset, bool phase); + bool Clock(); // called once to toggle external clock twice + // emulator helper functions + UINT8 Mux8To2(bool bVoicedP2, UINT8 uPPQtrP2, UINT8 uDeltaAdrP2, UINT8 uRomDataP2); + void CalculateIncrement(bool bVoicedP2, UINT8 uPPQtrP2, bool bPPQStartP2, UINT8 uDeltaP2, UINT8 uDeltaOldP2, UINT8 &uDeltaOldP1, UINT8 &uIncrementP2, bool &bAddP2); + UINT8 CalculateOutput(bool bVoicedP2, bool bXSilenceP2, UINT8 uPPQtrP2, bool bPPQStartP2, UINT8 uLOutputP2, UINT8 uIncrementP2, bool bAddP2); + void ClearStatistics(); + void GetStatistics(UINT32 &uNPitchPeriods, UINT32 &uNVoiced, UINT32 uNControlWords); + void SetPrintLevel(UINT32 uPrintLevel) { m_uPrintLevel = uPrintLevel; } + + // internal state bool m_bPhase1; // 1 bit internal clock enum states diff --git a/src/mame/drivers/fidelsensor.cpp b/src/mame/drivers/fidelsensor.cpp index 5dc3a8e0981..339972c19e1 100644 --- a/src/mame/drivers/fidelsensor.cpp +++ b/src/mame/drivers/fidelsensor.cpp @@ -92,7 +92,7 @@ WRITE8_MEMBER( csc_state::pia0_pa_w ) break; } -// m_speech->reg_w(data & 0x3f); +// m_speech->data_w(space, 0, data & 0x3f); // for avoid the digit flashing m_selector |= 0x80; @@ -100,15 +100,14 @@ WRITE8_MEMBER( csc_state::pia0_pa_w ) WRITE8_MEMBER( csc_state::pia0_pb_w ) { -// m_speech->set_volume(15); // hack, s14001a core should assume a volume of 15 unless otherwise stated... -// m_speech->rst_w(BIT(data, 1)); +// m_speech->start_w(BIT(data, 1)); } READ8_MEMBER( csc_state::pia0_pb_r ) { UINT8 data = 0x04; - if(m_speech->bsy_r()) + if(m_speech->busy_r()) data |= 0x08; if (m_selector<9) diff --git a/src/mame/drivers/fidelz80.cpp b/src/mame/drivers/fidelz80.cpp index 44d76301b2b..59a8f875fb9 100644 --- a/src/mame/drivers/fidelz80.cpp +++ b/src/mame/drivers/fidelz80.cpp @@ -817,8 +817,8 @@ WRITE8_MEMBER(fidelz80_state::vcc_ppi_porta_w) // d0-d5: TSI A0-A5 // d7: TSI START line - m_speech->reg_w(data & 0x3f); - m_speech->rst_w(data >> 7 & 1); + m_speech->data_w(space, 0, data & 0x3f); + m_speech->start_w(data >> 7 & 1); // d6: language latch data // d7: language latch clock (latch on high) @@ -832,7 +832,7 @@ WRITE8_MEMBER(fidelz80_state::vcc_ppi_porta_w) READ8_MEMBER(fidelz80_state::vcc_ppi_portb_r) { // d7: TSI BSY line - return (m_speech->bsy_r()) ? 0x80 : 0x00; + return (m_speech->busy_r()) ? 0x80 : 0x00; } WRITE8_MEMBER(fidelz80_state::vcc_ppi_portb_w) @@ -893,7 +893,7 @@ void fidelz80_state::vsc_prepare_display() WRITE8_MEMBER(fidelz80_state::vsc_ppi_porta_w) { // d0-d5: TSI A0-A5 - m_speech->reg_w(data & 0x3f); + m_speech->data_w(space, 0, data & 0x3f); // d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led) m_7seg_data = BITSWAP8(data,7,6,2,1,0,5,4,3); @@ -932,7 +932,7 @@ READ8_MEMBER(fidelz80_state::vsc_pio_portb_r) UINT8 ret = 0; // d4: TSI BSY line - ret |= (m_speech->bsy_r()) ? 0 : 0x10; + ret |= (m_speech->busy_r()) ? 0 : 0x10; return ret; } @@ -946,7 +946,7 @@ WRITE8_MEMBER(fidelz80_state::vsc_pio_portb_w) m_speaker->level_w(data >> 2 & 1); // d6: TSI START line - m_speech->rst_w(data >> 6 & 1); + m_speech->start_w(data >> 6 & 1); } @@ -1073,11 +1073,11 @@ WRITE8_MEMBER(fidelz80_state::vbrc_speech_w) //printf("%X ",data); // todo: HALT THE z80 here, and set up a callback to poll the s14001a BSY line to resume z80 - m_speech->reg_w(data & 0x1f); - m_speech->rst_w(1); - m_speech->rst_w(0); + m_speech->data_w(space, 0, data & 0x3f); + m_speech->start_w(1); + m_speech->start_w(0); - //m_speech->rst_w(BIT(data, 7)); + //m_speech->start_w(BIT(data, 7)); } static ADDRESS_MAP_START( vbrc_main_map, AS_PROGRAM, 8, fidelz80_state )