diff options
Diffstat (limited to 'src/devices/cpu/rii/riscii.h')
-rw-r--r-- | src/devices/cpu/rii/riscii.h | 68 |
1 files changed, 49 insertions, 19 deletions
diff --git a/src/devices/cpu/rii/riscii.h b/src/devices/cpu/rii/riscii.h index c670c1ea813..f050ce77c6f 100644 --- a/src/devices/cpu/rii/riscii.h +++ b/src/devices/cpu/rii/riscii.h @@ -56,6 +56,18 @@ public: RII_VOCON }; + enum + { + PA0_LINE = 0, + PA1_LINE, + PA2_LINE, + PA3_LINE, + PA4_LINE, + PA5_LINE, + PA6_LINE, + PA7_LINE + }; + // callback configuration auto in_porta_cb() { return m_porta_in_cb.bind(); } auto in_portb_cb() { return m_port_in_cb[0].bind(); } @@ -80,24 +92,23 @@ public: auto out_portk_cb() { return m_port_out_cb[9].bind(); } protected: - riscii_series_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, unsigned addrbits, unsigned pcbits, u32 datastart, unsigned bankbits, u8 maxbank, u8 post_id_mask, address_map_constructor regs); + riscii_series_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, unsigned addrbits, unsigned pcbits, unsigned bankbits, u8 maxbank, u8 post_id_mask, address_map_constructor regs); - // device-level overrides - virtual void device_resolve_objects() override; - virtual void device_start() override; - virtual void device_reset() override; + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; - // device_execute_interface overrides + // device_execute_interface implementation virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; - // device_memory_interface overrides + // device_memory_interface implementation virtual space_config_vector memory_space_config() const override; - // device_state_interface overrides + // device_state_interface implementation virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; - void core_regs_map(address_map &map); + void core_regs_map(address_map &map) ATTR_COLD; // register handlers u8 fsr0_r(); @@ -173,6 +184,15 @@ protected: void sprm_w(u8 data); u8 sprh_r(); void sprh_w(u8 data); + void timer0_reload(); + TIMER_CALLBACK_MEMBER(timer0); + u16 timer0_count() const; + void timer1_reload(); + TIMER_CALLBACK_MEMBER(timer1); + u8 timer1_count() const; + void timer2_reload(); + TIMER_CALLBACK_MEMBER(timer2); + u8 timer2_count() const; u8 trl0l_r(); void trl0l_w(u8 data); u8 trl0h_r(); @@ -193,6 +213,8 @@ protected: u8 tr2c_r(); u8 sfcr_r(); void sfcr_w(u8 data); + void spht_reload(); + TIMER_CALLBACK_MEMBER(speech_timer); u8 addl_r(); void addl_w(u8 data); u8 addm_r(); @@ -262,6 +284,11 @@ private: void execute_undef(u16 opcode); void execute_cycle1(u16 opcode); void execute_tbrd(u32 ptr); + void idle_wakeup(); + + // interrupt helpers + bool interrupt_active() const; + u32 vector_interrupt() const; enum exec_state : u8 { EXEC_CYCLE1, @@ -275,24 +302,24 @@ private: EXEC_L0CALL, EXEC_L1CALL, EXEC_L2CALL, EXEC_L3CALL, EXEC_L4CALL, EXEC_L5CALL, EXEC_L6CALL, EXEC_L7CALL, EXEC_L8CALL, EXEC_L9CALL, EXEC_LACALL, EXEC_LBCALL, - EXEC_LCCALL, EXEC_LDCALL, EXEC_LECALL, EXEC_LFCALL + EXEC_LCCALL, EXEC_LDCALL, EXEC_LECALL, EXEC_LFCALL, + EXEC_IDLE }; // address spaces address_space_config m_program_config; address_space_config m_regs_config; - address_space *m_program; - address_space *m_regs; - memory_access_cache<1, -1, ENDIANNESS_LITTLE> *m_cache; + memory_access<22, 1, -1, ENDIANNESS_LITTLE>::cache m_cache; + memory_access<22, 1, -1, ENDIANNESS_LITTLE>::specific m_program; + memory_access<13, 0, 0, ENDIANNESS_LITTLE>::specific m_regs; // device callbacks devcb_read8 m_porta_in_cb; - devcb_read8 m_port_in_cb[10]; - devcb_write8 m_port_out_cb[10]; + devcb_read8::array<10> m_port_in_cb; + devcb_write8::array<10> m_port_out_cb; // model-specific parameters const u32 m_pcmask; - const u32 m_datastart; const u32 m_tbptmask; const u8 m_bankmask; const u8 m_maxbank; @@ -320,6 +347,7 @@ private: u8 m_port_dcr[6]; u8 m_port_control[2]; u8 m_stbcon; + u8 m_pa; u8 m_painten; u8 m_paintsta; u8 m_pawake; @@ -339,9 +367,10 @@ private: u8 m_tr01con; u8 m_tr2con; u8 m_trlir; - u8 m_sfcr; + emu_timer *m_timer[3]; // synthesizer state + u8 m_sfcr; u32 m_add[4]; u8 m_env[4]; u8 m_mtcon[4]; @@ -350,6 +379,7 @@ private: u8 m_sphtcon; u8 m_sphtrl; u8 m_vocon; + emu_timer *m_speech_timer; // execution sequencing s32 m_icount; @@ -365,11 +395,11 @@ public: epg3231_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); protected: - // device_disasm_interface overrides + // device_disasm_interface implementation virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; private: - void regs_map(address_map &map); + void regs_map(address_map &map) ATTR_COLD; }; DECLARE_DEVICE_TYPE(EPG3231, epg3231_device) |