diff options
Diffstat (limited to 'src/mame/acorn/ssfindo.cpp')
-rw-r--r-- | src/mame/acorn/ssfindo.cpp | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/src/mame/acorn/ssfindo.cpp b/src/mame/acorn/ssfindo.cpp index c6f2b63029d..abc836fa192 100644 --- a/src/mame/acorn/ssfindo.cpp +++ b/src/mame/acorn/ssfindo.cpp @@ -71,7 +71,7 @@ Notes: =================================================================================================== -Pong Pong Car +Pang Pang Car Icarus, 1999 This game runs on hardware that is similar to that used on 'See See Find Out' @@ -133,6 +133,7 @@ Notes: #include "machine/arm_iomd.h" #include "machine/i2cmem.h" #include "sound/qs1000.h" +#include "diserial.h" #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -140,11 +141,12 @@ Notes: namespace { -class ssfindo_state : public driver_device +class ssfindo_state : public driver_device, public device_serial_interface { public: ssfindo_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) + , device_serial_interface(mconfig, *this) , m_maincpu(*this, "maincpu") , m_vidc(*this, "vidc") , m_iomd(*this, "iomd") @@ -178,6 +180,7 @@ protected: bool m_i2cmem_clock = false; + virtual void tra_callback() override; void sound_w(uint8_t data); private: @@ -209,6 +212,8 @@ private: uint8_t iolines_r(); void iolines_w(uint8_t data); bool m_flash_bank_select = false; + + bool m_txd = true; }; class tetfight_state : public ssfindo_state @@ -228,10 +233,10 @@ private: void tetfight_map(address_map &map); - DECLARE_READ_LINE_MEMBER(iocr_od0_r); - DECLARE_READ_LINE_MEMBER(iocr_od1_r); - DECLARE_WRITE_LINE_MEMBER(iocr_od0_w); - DECLARE_WRITE_LINE_MEMBER(iocr_od1_w); + int iocr_od0_r(); + int iocr_od1_r(); + void iocr_od0_w(int state); + void iocr_od1_w(int state); uint32_t tetfight_unk_r(); }; @@ -258,19 +263,19 @@ void ssfindo_state::iolines_w(uint8_t data) // inverted compared to riscpc.cpp // TODO: simplify hookup over i2cmem having AND 1 on state for a writeline (?) -READ_LINE_MEMBER(tetfight_state::iocr_od1_r) +int tetfight_state::iocr_od1_r() { // TODO: completely get rid of this speedup fn or move anywhere else //if (m_speedup) (this->*m_speedup)(); return (m_i2cmem->read_sda() ? 1 : 0); //eeprom read } -READ_LINE_MEMBER(tetfight_state::iocr_od0_r) +int tetfight_state::iocr_od0_r() { return (m_i2cmem_clock == true ? 1 : 0); //eeprom read } -WRITE_LINE_MEMBER(tetfight_state::iocr_od1_w) +void tetfight_state::iocr_od1_w(int state) { // TODO: i2c cares about the order of this!? // tetfight reaches PC=0x106c if initialization has success @@ -280,7 +285,7 @@ WRITE_LINE_MEMBER(tetfight_state::iocr_od1_w) //m_i2cmem->write_sda(state == true ? 1 : 0); } -WRITE_LINE_MEMBER(tetfight_state::iocr_od0_w) +void tetfight_state::iocr_od0_w(int state) { m_i2cmem_clock = state; m_i2cmem->write_scl(state == true ? 1 : 0); @@ -371,7 +376,7 @@ uint32_t ssfindo_state::randomized_r() void ssfindo_state::sound_w(uint8_t data) { - m_qs1000->serial_in(data); + transmit_register_setup(data); m_maincpu->spin_until_time(attotime::from_usec(2000)); // give time to the QS1000 CPU to react. TODO: sync things correctly } @@ -441,11 +446,23 @@ void ssfindo_state::machine_start() save_item(NAME(m_flashN)); save_item(NAME(m_i2cmem_clock)); save_item(NAME(m_flash_bank_select)); + + set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1); + set_rate(31250); } void ssfindo_state::machine_reset() { // ... + receive_register_reset(); + transmit_register_reset(); + + m_txd = true; +} + +void ssfindo_state::tra_callback() +{ + m_txd = transmit_register_get_data_bit(); } static INPUT_PORTS_START( ssfindo ) @@ -616,6 +633,7 @@ void ssfindo_state::ssfindo(machine_config &config) qs1000_device &qs1000(QS1000(config, "qs1000", 24_MHz_XTAL)); qs1000.set_external_rom(true); // qs1000.p1_out().set(FUNC()); // TODO: writes something here + qs1000.p3_in().set([this]() { return u8(0xfeU | m_txd); }); qs1000.add_route(0, "lspeaker", 0.25); qs1000.add_route(1, "rspeaker", 0.25); } |