diff options
Diffstat (limited to 'src/devices/cpu/m6502/st2205u.h')
-rw-r--r-- | src/devices/cpu/m6502/st2205u.h | 208 |
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 |