summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6502/st2205u.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/m6502/st2205u.h')
-rw-r--r--src/devices/cpu/m6502/st2205u.h208
1 files changed, 139 insertions, 69 deletions
diff --git a/src/devices/cpu/m6502/st2205u.h b/src/devices/cpu/m6502/st2205u.h
index 452337da42e..d5bd7f04f03 100644
--- a/src/devices/cpu/m6502/st2205u.h
+++ b/src/devices/cpu/m6502/st2205u.h
@@ -13,7 +13,7 @@
#include "st2xxx.h"
-class st2205u_device : public st2xxx_device
+class st2205u_base_device : public st2xxx_device
{
public:
enum {
@@ -36,8 +36,6 @@ public:
ST_VOL3,
ST_VOLM0,
ST_VOLM1,
- ST_LBUF,
- ST_BRR,
ST_DMS0,
ST_DMS1,
ST_DMD0,
@@ -57,65 +55,19 @@ public:
ST_LVCTR
};
- st2205u_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
-
- void set_alt_map() { m_alt_map = true; }
-
protected:
- virtual void device_start() override;
+ st2205u_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor internal_map, int data_bits, bool has_banked_ram);
+
virtual void device_reset() override;
- virtual u16 st2xxx_ireq_mask() const override { return 0xdfff; }
- virtual const char *st2xxx_irq_name(int i) const override;
- virtual u8 st2xxx_pmcr_mask() const override { return 0xff; }
virtual unsigned st2xxx_bt_divider(int n) const override;
virtual u8 st2xxx_prs_mask() const override { return 0xc0; }
virtual void st2xxx_tclk_start() override;
virtual void st2xxx_tclk_stop() override;
- virtual u8 st2xxx_sys_mask() const override { return 0xfe; }
- virtual u8 st2xxx_misc_mask() const override { return 0x0f; }
- virtual bool st2xxx_wdten_on_reset() const override { return true; }
virtual bool st2xxx_has_dma() const override { return true; }
- virtual u8 st2xxx_lpan_mask() const override { return 0x0f; }
- virtual u8 st2xxx_lctr_mask() const override { return 0xef; }
- 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; }
-private:
- class mi_st2205u : public mi_st2xxx {
- public:
- virtual u8 read(u16 adr) override;
- virtual u8 read_sync(u16 adr) override;
- virtual u8 read_arg(u16 adr) override;
- virtual u8 read_vector(u16 adr) override;
- virtual void write(u16 adr, u8 val) override;
-
- u8 pread(u16 adr);
- u8 preadc(u16 adr);
- void pwrite(u16 adr, u8 val);
- u8 dread(u16 adr);
- u8 dreadc(u16 adr);
- void dwrite(u16 adr, u8 val);
- u8 bread(u16 adr);
- u8 breadc(u16 adr);
- void bwrite(u16 adr, u8 val);
-
- u16 brr;
+ void base_init(std::unique_ptr<mi_st2xxx> &&intf);
- std::unique_ptr<u8[]> ram;
- };
-
- template<int N> TIMER_CALLBACK_MEMBER(bt_interrupt);
-
- u8 brrl_r();
- void brrl_w(u8 data);
- u8 brrh_r();
- void brrh_w(u8 data);
u8 btc_r();
void btc_w(u8 data);
u32 tclk_pres_div(u8 mode) const;
@@ -133,6 +85,7 @@ private:
void t4c_w(u8 data);
u8 tien_r();
void tien_w(u8 data);
+
u8 psg_r(offs_t offset);
void psg_w(offs_t offset, u8 data);
u8 psgc_r();
@@ -143,9 +96,7 @@ private:
void vol_w(offs_t offset, u8 data);
u8 volm_r(offs_t offset);
void volm_w(offs_t offset, u8 data);
- u8 lbuf_r();
- void lbuf_w(u8 data);
- void lpal_w(u8 data);
+
u8 usbcon_r();
void usbcon_w(u8 data);
u8 usbien_r();
@@ -166,21 +117,14 @@ private:
void dctr_w(u8 data);
u8 dmod_r();
void dmod_w(u8 data);
+
u8 rctr_r();
void rctr_w(u8 data);
+
u8 lvctr_r();
void lvctr_w(u8 data);
- u8 ram_r(offs_t offset);
- void ram_w(offs_t offset, u8 data);
- u8 pmem_r(offs_t offset);
- void pmem_w(offs_t offset, u8 data);
- u8 dmem_r(offs_t offset);
- void dmem_w(offs_t offset, u8 data);
- u8 bmem_r(offs_t offset);
- void bmem_w(offs_t offset, u8 data);
-
- void int_map(address_map &map);
+ void base_map(address_map &map);
u8 m_btc;
u16 m_tc_12bit[4];
@@ -196,9 +140,6 @@ private:
u8 m_psg_on;
u8 m_psg_vol[4];
u8 m_psg_volm[2];
- u8 m_lbuf;
- u8 m_lpal_index;
- u8 m_gray_levels[16];
u8 m_usbcon;
u8 m_usbien;
u16 m_dptr[4];
@@ -208,10 +149,139 @@ private:
u8 m_dmod[2];
u8 m_rctr;
u8 m_lvctr;
+};
+
+class st2205u_device : public st2205u_base_device
+{
+public:
+ enum {
+ ST_LBUF = ST_LVCTR + 1,
+ ST_BRR
+ };
+
+ st2205u_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
- bool m_alt_map; // hack
+ virtual u16 st2xxx_ireq_mask() const override { return 0xdfff; }
+ virtual const char *st2xxx_irq_name(int i) const override;
+ virtual u8 st2xxx_pmcr_mask() const override { return 0xff; }
+ virtual u8 st2xxx_sys_mask() const override { return 0xfe; }
+ virtual u8 st2xxx_misc_mask() const override { return 0x0f; }
+ virtual bool st2xxx_wdten_on_reset() const override { return true; }
+ virtual u8 st2xxx_lpan_mask() const override { return 0x0f; }
+ virtual u8 st2xxx_lctr_mask() const override { return 0xef; }
+ 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; }
+
+private:
+ class mi_st2205u : public mi_st2xxx {
+ public:
+ virtual u8 read(u16 adr) override;
+ virtual u8 read_sync(u16 adr) override;
+ virtual u8 read_arg(u16 adr) override;
+ virtual u8 read_vector(u16 adr) override;
+ virtual void write(u16 adr, u8 val) override;
+
+ u8 pread(u16 adr);
+ u8 preadc(u16 adr);
+ void pwrite(u16 adr, u8 val);
+ u8 dread(u16 adr);
+ u8 dreadc(u16 adr);
+ void dwrite(u16 adr, u8 val);
+ u8 bread(u16 adr);
+ u8 breadc(u16 adr);
+ void bwrite(u16 adr, u8 val);
+
+ u16 brr;
+
+ std::unique_ptr<u8[]> ram;
+ };
+
+ u8 brrl_r();
+ void brrl_w(u8 data);
+ u8 brrh_r();
+ void brrh_w(u8 data);
+
+ u8 lbuf_r();
+ void lbuf_w(u8 data);
+ void lpal_w(u8 data);
+
+ u8 ram_r(offs_t offset);
+ void ram_w(offs_t offset, u8 data);
+ u8 pmem_r(offs_t offset);
+ void pmem_w(offs_t offset, u8 data);
+ u8 dmem_r(offs_t offset);
+ void dmem_w(offs_t offset, u8 data);
+ u8 bmem_r(offs_t offset);
+ void bmem_w(offs_t offset, u8 data);
+
+ void int_map(address_map &map);
+
+ u8 m_lbuf;
+ u8 m_lpal_index;
+ u8 m_gray_levels[16];
+};
+
+class st2302u_device : public st2205u_base_device
+{
+public:
+ st2302u_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual void device_start() override;
+
+ virtual u16 st2xxx_ireq_mask() const override { return 0xd37f; } // ???
+ virtual const char *st2xxx_irq_name(int i) const override;
+ virtual u8 st2xxx_pmcr_mask() const override { return 0xff; } // ???
+ virtual u8 st2xxx_sys_mask() const override { return 0xfe; } // ???
+ virtual u8 st2xxx_misc_mask() const override { return 0x0f; } // ???
+ virtual bool st2xxx_wdten_on_reset() const override { return true; } // ???
+ virtual u8 st2xxx_lpan_mask() const override { return 0; } // no LCDC
+ virtual u8 st2xxx_lctr_mask() const override { return 0; } // no LCDC
+ virtual u8 st2xxx_lckr_mask() const override { return 0; } // no LCDC
+ virtual u8 st2xxx_lpwm_mask() const override { return 0; } // no LCDC
+ virtual unsigned st2xxx_lfr_clocks() const override { return 0; } // no LCDC
+ 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 0; } // no UART
+ virtual u8 st2xxx_bctr_mask() const override { return 0; } // no UART
+
+private:
+ class mi_st2302u : public mi_st2xxx {
+ public:
+ virtual u8 read(u16 adr) override;
+ virtual u8 read_sync(u16 adr) override;
+ virtual u8 read_arg(u16 adr) override;
+ virtual u8 read_vector(u16 adr) override;
+ virtual void write(u16 adr, u8 val) override;
+
+ u8 pread(u16 adr);
+ u8 preadc(u16 adr);
+ void pwrite(u16 adr, u8 val);
+ u8 dread(u16 adr);
+ u8 dreadc(u16 adr);
+ void dwrite(u16 adr, u8 val);
+ };
+
+ u8 ram_r(offs_t offset);
+ void ram_w(offs_t offset, u8 data);
+ u8 pmem_r(offs_t offset);
+ void pmem_w(offs_t offset, u8 data);
+ u8 dmem_r(offs_t offset);
+ void dmem_w(offs_t offset, u8 data);
+
+ void int_map(address_map &map);
};
DECLARE_DEVICE_TYPE(ST2205U, st2205u_device)
+DECLARE_DEVICE_TYPE(ST2302U, st2302u_device)
#endif // MAME_MACHINE_M6502_ST2205U_H