summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2020-09-08 15:03:49 -0400
committer AJR <ajrhacker@users.noreply.github.com>2020-09-08 15:03:49 -0400
commit61fb20463b8ddc88a13ca57bc8a4696504917a85 (patch)
treed30d03f6a9feff6bbe8d131f37cdefab5b34e497 /src
parent49024d783a6ce60d52470513177f838ebb18bbd9 (diff)
st2xxx: Add some SPI stubs
Diffstat (limited to 'src')
-rw-r--r--src/devices/cpu/m6502/st2204.cpp6
-rw-r--r--src/devices/cpu/m6502/st2204.h1
-rw-r--r--src/devices/cpu/m6502/st2205u.cpp8
-rw-r--r--src/devices/cpu/m6502/st2205u.h2
-rw-r--r--src/devices/cpu/m6502/st2xxx.cpp63
-rw-r--r--src/devices/cpu/m6502/st2xxx.h20
6 files changed, 100 insertions, 0 deletions
diff --git a/src/devices/cpu/m6502/st2204.cpp b/src/devices/cpu/m6502/st2204.cpp
index d482e6b798a..8701ee5381b 100644
--- a/src/devices/cpu/m6502/st2204.cpp
+++ b/src/devices/cpu/m6502/st2204.cpp
@@ -152,6 +152,9 @@ void st2204_device::device_start()
state_add(ST_LFRA, "LFRA", m_lfra).mask(0x3f);
state_add(ST_LAC, "LAC", m_lac).mask(0x1f);
state_add(ST_LPWM, "LPWM", m_lpwm).mask(st2xxx_lpwm_mask());
+ state_add(ST_SCTR, "SCTR", m_sctr);
+ state_add(ST_SCKR, "SCKR", m_sckr).mask(0x7f);
+ state_add(ST_SSR, "SSR", m_ssr).mask(0x77);
state_add(ST_UCTR, "UCTR", m_uctr).mask(st2xxx_uctr_mask());
state_add(ST_USR, "USTR", m_usr).mask(0x7f);
state_add(ST_IRCTR, "IRCTR", m_irctr).mask(0xc7);
@@ -683,6 +686,9 @@ void st2204_device::common_map(address_map &map)
map(0x004c, 0x004c).rw(FUNC(st2204_device::pl_r), FUNC(st2204_device::pl_w));
// PCL is listed as write-only in ST2202 specification, but DynamiDesk suggests otherwise
map(0x004e, 0x004e).rw(FUNC(st2204_device::pcl_r), FUNC(st2204_device::pcl_w));
+ map(0x0052, 0x0052).rw(FUNC(st2204_device::sctr_r), FUNC(st2204_device::sctr_w));
+ map(0x0053, 0x0053).rw(FUNC(st2204_device::sckr_r), FUNC(st2204_device::sckr_w));
+ map(0x0054, 0x0054).rw(FUNC(st2204_device::ssr_r), FUNC(st2204_device::ssr_w));
map(0x0060, 0x0060).rw(FUNC(st2204_device::uctr_r), FUNC(st2204_device::uctr_w));
map(0x0061, 0x0061).rw(FUNC(st2204_device::usr_r), FUNC(st2204_device::ustr_trg_w));
map(0x0062, 0x0062).rw(FUNC(st2204_device::irctr_r), FUNC(st2204_device::irctr_w));
diff --git a/src/devices/cpu/m6502/st2204.h b/src/devices/cpu/m6502/st2204.h
index 4d8839833d0..91d1ea54bec 100644
--- a/src/devices/cpu/m6502/st2204.h
+++ b/src/devices/cpu/m6502/st2204.h
@@ -56,6 +56,7 @@ protected:
virtual u8 st2xxx_lckr_mask() const override { return 0x1f; }
virtual u8 st2xxx_lpwm_mask() const override { return 0x3f; }
virtual unsigned st2xxx_lfr_clocks() const override;
+ virtual bool st2xxx_has_spi() const override { return true; }
virtual u8 st2xxx_uctr_mask() const override { return 0x0f; }
virtual u8 st2xxx_bctr_mask() const override { return 0x87; }
diff --git a/src/devices/cpu/m6502/st2205u.cpp b/src/devices/cpu/m6502/st2205u.cpp
index 14ec2c65aa6..58b887a3aea 100644
--- a/src/devices/cpu/m6502/st2205u.cpp
+++ b/src/devices/cpu/m6502/st2205u.cpp
@@ -155,6 +155,10 @@ void st2205u_device::device_start()
state_add(ST_LFRA, "LFRA", m_lfra).mask(0x3f);
state_add(ST_LAC, "LAC", m_lac).mask(0x1f);
state_add(ST_LPWM, "LPWM", m_lpwm).mask(st2xxx_lpwm_mask());
+ state_add(ST_SCTR, "SCTR", m_sctr);
+ state_add(ST_SCKR, "SCKR", m_sckr).mask(0x7f);
+ state_add(ST_SSR, "SSR", m_ssr).mask(0x77);
+ state_add(ST_SMOD, "SMOD", m_smod).mask(0x0f);
state_add(ST_UCTR, "UCTR", m_uctr).mask(st2xxx_uctr_mask());
state_add(ST_USR, "USR", m_usr).mask(0x7f);
state_add(ST_IRCTR, "IRCTR", m_irctr).mask(0xc7);
@@ -731,6 +735,10 @@ void st2205u_device::int_map(address_map &map)
map(0x004c, 0x004c).w(FUNC(st2205u_device::lpal_w));
map(0x004e, 0x004e).rw(FUNC(st2205u_device::pl_r), FUNC(st2205u_device::pl_w));
map(0x004f, 0x004f).rw(FUNC(st2205u_device::pcl_r), FUNC(st2205u_device::pcl_w));
+ map(0x0052, 0x0052).rw(FUNC(st2205u_device::sctr_r), FUNC(st2205u_device::sctr_w));
+ map(0x0053, 0x0053).rw(FUNC(st2205u_device::sckr_r), FUNC(st2205u_device::sckr_w));
+ map(0x0054, 0x0054).rw(FUNC(st2205u_device::ssr_r), FUNC(st2205u_device::ssr_w));
+ map(0x0055, 0x0055).rw(FUNC(st2205u_device::smod_r), FUNC(st2205u_device::smod_w));
map(0x0057, 0x0057).rw(FUNC(st2205u_device::lvctr_r), FUNC(st2205u_device::lvctr_w));
map(0x0058, 0x0058).rw(FUNC(st2205u_device::dptrl_r), FUNC(st2205u_device::dptrl_w));
map(0x0059, 0x0059).rw(FUNC(st2205u_device::dptrh_r), FUNC(st2205u_device::dptrh_w));
diff --git a/src/devices/cpu/m6502/st2205u.h b/src/devices/cpu/m6502/st2205u.h
index 646a6bb3a1b..6a2e26e634b 100644
--- a/src/devices/cpu/m6502/st2205u.h
+++ b/src/devices/cpu/m6502/st2205u.h
@@ -79,6 +79,8 @@ protected:
virtual u8 st2xxx_lckr_mask() const override { return 0x3f; }
virtual u8 st2xxx_lpwm_mask() const override { return 0xff; }
virtual unsigned st2xxx_lfr_clocks() const override;
+ virtual bool st2xxx_has_spi() const override { return true; }
+ virtual bool st2xxx_spi_iis() const override { return true; }
virtual u8 st2xxx_uctr_mask() const override { return 0x3f; }
virtual u8 st2xxx_bctr_mask() const override { return 0xb7; }
diff --git a/src/devices/cpu/m6502/st2xxx.cpp b/src/devices/cpu/m6502/st2xxx.cpp
index 41327c00267..45200e02a27 100644
--- a/src/devices/cpu/m6502/st2xxx.cpp
+++ b/src/devices/cpu/m6502/st2xxx.cpp
@@ -69,6 +69,10 @@ st2xxx_device::st2xxx_device(const machine_config &mconfig, device_type type, co
, m_lpwm(0)
, m_lcd_ireq(0)
, m_lcd_timer(nullptr)
+ , m_sctr(0)
+ , m_sckr(0)
+ , m_ssr(0)
+ , m_smod(0)
, m_uctr(0)
, m_usr(0)
, m_irctr(0)
@@ -186,6 +190,14 @@ void st2xxx_device::save_common_registers()
save_item(NAME(m_lfra));
save_item(NAME(m_lac));
save_item(NAME(m_lpwm));
+ if (st2xxx_has_spi())
+ {
+ save_item(NAME(m_sctr));
+ save_item(NAME(m_sckr));
+ save_item(NAME(m_ssr));
+ if (st2xxx_spi_iis())
+ save_item(NAME(m_smod));
+ }
if (st2xxx_uctr_mask() != 0)
{
save_item(NAME(m_uctr));
@@ -246,6 +258,12 @@ void st2xxx_device::device_reset()
m_lpwm = 0;
m_lcd_timer->adjust(attotime::never);
+ // reset SPI
+ m_sctr = 0;
+ m_sckr = 0;
+ m_ssr = 0;
+ m_smod = 0;
+
// reset UART and BRG
m_uctr = 0;
m_usr = BIT(st2xxx_uctr_mask(), 4) ? 0x01 : 0;
@@ -758,6 +776,51 @@ void st2xxx_device::lpwm_w(u8 data)
m_lpwm = data & st2xxx_lpwm_mask();
}
+u8 st2xxx_device::sctr_r()
+{
+ return m_sctr;
+}
+
+void st2xxx_device::sctr_w(u8 data)
+{
+ // TXEMP on wakeup?
+ if (!BIT(m_sctr, 7) && BIT(data, 7))
+ m_ssr |= 0x20;
+
+ m_sctr = data;
+}
+
+u8 st2xxx_device::sckr_r()
+{
+ return m_sckr | 0x80;
+}
+
+void st2xxx_device::sckr_w(u8 data)
+{
+ m_sckr = data & 0x7f;
+}
+
+u8 st2xxx_device::ssr_r()
+{
+ return m_ssr | 0x88;
+}
+
+void st2xxx_device::ssr_w(u8 data)
+{
+ // Write any value to clear
+ m_ssr = 0;
+}
+
+u8 st2xxx_device::smod_r()
+{
+ return m_smod | 0xf0;
+}
+
+void st2xxx_device::smod_w(u8 data)
+{
+ m_smod = data & 0x0f;
+}
+
u8 st2xxx_device::uctr_r()
{
return m_uctr | ~st2xxx_uctr_mask();
diff --git a/src/devices/cpu/m6502/st2xxx.h b/src/devices/cpu/m6502/st2xxx.h
index f83d005cbab..8ae9b4ed17b 100644
--- a/src/devices/cpu/m6502/st2xxx.h
+++ b/src/devices/cpu/m6502/st2xxx.h
@@ -57,6 +57,10 @@ public:
ST_LFRA,
ST_LAC,
ST_LPWM,
+ ST_SCTR,
+ ST_SCKR,
+ ST_SSR,
+ ST_SMOD,
ST_UCTR,
ST_USR,
ST_IRCTR,
@@ -106,6 +110,8 @@ protected:
virtual u8 st2xxx_lckr_mask() const = 0;
virtual u8 st2xxx_lpwm_mask() const = 0;
virtual unsigned st2xxx_lfr_clocks() const = 0;
+ virtual bool st2xxx_has_spi() const = 0;
+ virtual bool st2xxx_spi_iis() const { return false; }
virtual u8 st2xxx_uctr_mask() const = 0;
virtual u8 st2xxx_bctr_mask() const = 0;
@@ -212,6 +218,15 @@ protected:
u8 lpwm_r();
void lpwm_w(u8 data);
+ u8 sctr_r();
+ void sctr_w(u8 data);
+ u8 sckr_r();
+ void sckr_w(u8 data);
+ u8 ssr_r();
+ void ssr_w(u8 data);
+ u8 smod_r();
+ void smod_w(u8 data);
+
u8 uctr_r();
void uctr_w(u8 data);
u8 usr_r();
@@ -279,6 +294,11 @@ protected:
u16 m_lcd_ireq;
emu_timer *m_lcd_timer;
+ u8 m_sctr;
+ u8 m_sckr;
+ u8 m_ssr;
+ u8 m_smod;
+
u8 m_uctr;
u8 m_usr;
u8 m_irctr;