summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/acorn/ssfindo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/acorn/ssfindo.cpp')
-rw-r--r--src/mame/acorn/ssfindo.cpp40
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);
}