diff options
Diffstat (limited to 'src/devices/cpu/cosmac/cosmac.h')
-rw-r--r-- | src/devices/cpu/cosmac/cosmac.h | 96 |
1 files changed, 65 insertions, 31 deletions
diff --git a/src/devices/cpu/cosmac/cosmac.h b/src/devices/cpu/cosmac/cosmac.h index 3607ce37d59..01b35785911 100644 --- a/src/devices/cpu/cosmac/cosmac.h +++ b/src/devices/cpu/cosmac/cosmac.h @@ -158,6 +158,9 @@ public: auto wait_cb() { return m_read_wait.bind(); } auto clear_cb() { return m_read_clear.bind(); } + auto int_cb() { return m_read_int.bind(); } + auto dma_in_cb() { return m_read_dma_in.bind(); } + auto dma_out_cb() { return m_read_dma_out.bind(); } auto ef1_cb() { return m_read_ef[0].bind(); } auto ef2_cb() { return m_read_ef[1].bind(); } auto ef3_cb() { return m_read_ef[2].bind(); } @@ -171,28 +174,27 @@ public: // public interfaces offs_t get_memory_address(); - DECLARE_WRITE_LINE_MEMBER( wait_w ) { set_input_line(COSMAC_INPUT_LINE_WAIT, state); } - DECLARE_WRITE_LINE_MEMBER( clear_w ) { set_input_line(COSMAC_INPUT_LINE_CLEAR, state); } - DECLARE_WRITE_LINE_MEMBER( int_w ) { set_input_line(COSMAC_INPUT_LINE_INT, state); } - DECLARE_WRITE_LINE_MEMBER( dma_in_w ) { set_input_line(COSMAC_INPUT_LINE_DMAIN, state); } - DECLARE_WRITE_LINE_MEMBER( dma_out_w ) { set_input_line(COSMAC_INPUT_LINE_DMAOUT, state); } - DECLARE_WRITE_LINE_MEMBER( ef1_w ) { set_input_line(COSMAC_INPUT_LINE_EF1, state); } - DECLARE_WRITE_LINE_MEMBER( ef2_w ) { set_input_line(COSMAC_INPUT_LINE_EF2, state); } - DECLARE_WRITE_LINE_MEMBER( ef3_w ) { set_input_line(COSMAC_INPUT_LINE_EF3, state); } - DECLARE_WRITE_LINE_MEMBER( ef4_w ) { set_input_line(COSMAC_INPUT_LINE_EF4, state); } + void wait_w(int state) { set_input_line(COSMAC_INPUT_LINE_WAIT, state); } + void clear_w(int state) { set_input_line(COSMAC_INPUT_LINE_CLEAR, state); } + void int_w(int state) { set_input_line(COSMAC_INPUT_LINE_INT, state); } + void dma_in_w(int state) { set_input_line(COSMAC_INPUT_LINE_DMAIN, state); } + void dma_out_w(int state) { set_input_line(COSMAC_INPUT_LINE_DMAOUT, state); } + void ef1_w(int state) { set_input_line(COSMAC_INPUT_LINE_EF1, state); } + void ef2_w(int state) { set_input_line(COSMAC_INPUT_LINE_EF2, state); } + void ef3_w(int state) { set_input_line(COSMAC_INPUT_LINE_EF3, state); } + void ef4_w(int state) { set_input_line(COSMAC_INPUT_LINE_EF4, state); } protected: // construction/destruction cosmac_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; // device_execute_interface overrides - virtual uint32_t execute_min_cycles() const override; - virtual uint32_t execute_max_cycles() const override; - virtual uint32_t execute_input_lines() const override; + virtual uint32_t execute_min_cycles() const noexcept override; + virtual uint32_t execute_max_cycles() const noexcept override; virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; @@ -218,14 +220,17 @@ protected: // execution logic inline void run_state(); inline void debug(); - inline void reset_state(); + virtual void reset_state(); inline void initialize(); inline void fetch_instruction(); inline void execute_instruction(); inline void dma_input(); inline void dma_output(); inline void interrupt(); + virtual bool check_irq() { return m_ie && sample_interrupt(); } inline void sample_wait_clear(); + bool sample_interrupt(); + inline void sample_dma_io(); inline void sample_ef_lines(); virtual void output_state_code(); inline void set_q_flag(int state); @@ -348,13 +353,28 @@ protected: void ldc(); void gec(); + void stpc(); + void stm(); + void scm1(); + void scm2(); + void spm1(); + void spm2(); + + void xie(); + void xid(); + void cie(); + void cid(); + const address_space_config m_program_config; const address_space_config m_io_config; // device callbacks devcb_read_line m_read_wait; devcb_read_line m_read_clear; - devcb_read_line m_read_ef[4]; + devcb_read_line m_read_int; + devcb_read_line m_read_dma_in; + devcb_read_line m_read_dma_out; + devcb_read_line::array<4> m_read_ef; devcb_write_line m_write_q; devcb_read8 m_read_dma; devcb_write8 m_write_dma; @@ -384,9 +404,9 @@ protected: }; // internal state - uint16_t m_pc; // fake program counter - uint16_t m_op; // current opcode - uint8_t m_flagsio; // flags storage for state saving + uint16_t m_pc; // fake program counter + uint16_t m_op; // current opcode + uint8_t m_flagsio; // flags storage for state saving cosmac_state m_state; // state cosmac_mode m_mode; // control mode cosmac_mode m_pmode; // previous control mode @@ -399,25 +419,37 @@ protected: int m_ef_line[4]; // external flags // registers - uint8_t m_d; // data register (accumulator) - uint8_t m_b; // auxiliary holding register - uint16_t m_r[16]; // scratchpad registers - uint8_t m_p; // designates which register is Program Counter - uint8_t m_x; // designates which register is Data Pointer - uint8_t m_n; // low-order instruction digit - uint8_t m_i; // high-order instruction digit - uint8_t m_t; // temporary register + uint8_t m_d; // data register (accumulator) + uint8_t m_b; // auxiliary holding register + uint16_t m_r[16]; // scratchpad registers + uint8_t m_p; // designates which register is Program Counter + uint8_t m_x; // designates which register is Data Pointer + uint8_t m_n; // low-order instruction digit + uint8_t m_i; // high-order instruction digit + uint8_t m_t; // temporary register // flags int m_df; // data flag (ALU carry) - int m_ie; // interrupt enable + int m_ie; // master interrupt enable + int m_cie; // counter interrupt enable + int m_xie; // external interrupt enable + int m_cil; // counter interrupt latch int m_q; // output flip-flop + uint8_t m_cnt_mode; // counter mode + uint8_t m_cnt_load; // counter reload value + uint8_t m_cnt_count; // active counter value + emu_timer *m_cnt_timer; // counter mode 1 timer handler + + TIMER_CALLBACK_MEMBER(cnt_timerout); + uint8_t get_count(); + void stop_count(); + // internal stuff int m_icount; - address_space * m_program; - address_space * m_io; - memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_cache; + memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_cache; + memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_program; + memory_access< 3, 0, 0, ENDIANNESS_LITTLE>::specific m_io; // opcode/condition tables typedef void (cosmac_device::*ophandler)(); @@ -481,6 +513,8 @@ protected: virtual cosmac_device::ophandler get_ophandler(uint16_t opcode) const override; virtual bool has_extended_opcodes() override { return true; } + virtual bool check_irq() override { return m_ie && ((sample_interrupt() && m_xie) || (m_cil && m_cie)); } + virtual void reset_state() override; private: static const ophandler s_opcodetable_ex[256]; |