summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/cpu/saturn/saturn.h
diff options
context:
space:
mode:
author Wilbert Pol <wilbert@jdg.info>2013-10-04 18:55:30 +0000
committer Wilbert Pol <wilbert@jdg.info>2013-10-04 18:55:30 +0000
commitf87a6bf917eb58257b397bc3206143981a6b4b86 (patch)
tree2bfb0e7e5ed6a5c8f0dd89c82465ca21cb355e80 /src/emu/cpu/saturn/saturn.h
parentcd6b8a92aa02339b6f79151fe6b277fec986bf5e (diff)
saturn.c: Modernized cpu core (nw)
Diffstat (limited to 'src/emu/cpu/saturn/saturn.h')
-rw-r--r--src/emu/cpu/saturn/saturn.h243
1 files changed, 230 insertions, 13 deletions
diff --git a/src/emu/cpu/saturn/saturn.h b/src/emu/cpu/saturn/saturn.h
index fabd069e4b7..53dabec81ab 100644
--- a/src/emu/cpu/saturn/saturn.h
+++ b/src/emu/cpu/saturn/saturn.h
@@ -50,17 +50,6 @@ HP38G 09/??/95 1LT8 Yorke
#define SATURN_INT_IRQ 1
#define SATURN_INT_NMI 2
-struct saturn_cpu_core
-{
- void (*out)(device_t*,int);
- int (*in)(device_t*);
- void (*reset)(device_t*);
- void (*config)(device_t*,int v);
- void (*unconfig)(device_t*,int v);
- int (*id)(device_t*);
- void (*crc)(device_t*,int addr, int data);
- void (*rsi)(device_t*);
-};
enum
{
@@ -84,8 +73,236 @@ enum
#define SATURN_NMI_LINE 1
#define SATURN_WAKEUP_LINE 2
-CPU_DISASSEMBLE( saturn );
-DECLARE_LEGACY_CPU_DEVICE(SATURN, saturn);
+#define MCFG_SATURN_CONFIG(_out, _in, _reset, _config, _unconfig, _id, _crc, _rsi) \
+ saturn_device::set_out_func(*device, DEVCB2_##_out); \
+ saturn_device::set_in_func(*device, DEVCB2_##_in); \
+ saturn_device::set_reset_func(*device, DEVCB2_##_reset); \
+ saturn_device::set_config_func(*device, DEVCB2_##_config); \
+ saturn_device::set_unconfig_func(*device, DEVCB2_##_unconfig); \
+ saturn_device::set_id_func(*device, DEVCB2_##_id); \
+ saturn_device::set_crc_func(*device, DEVCB2_##_crc); \
+ saturn_device::set_rsi_func(*device, DEVCB2_##_rsi);
+
+
+class saturn_device : public cpu_device
+{
+public:
+ // construction/destruction
+ saturn_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // static configuration helpers
+ template<class _Object> static devcb2_base &set_out_func(device_t &device, _Object object) { return downcast<saturn_device &>(device).m_out_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_in_func(device_t &device, _Object object) { return downcast<saturn_device &>(device).m_in_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_reset_func(device_t &device, _Object object) { return downcast<saturn_device &>(device).m_reset_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_config_func(device_t &device, _Object object) { return downcast<saturn_device &>(device).m_config_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_unconfig_func(device_t &device, _Object object) { return downcast<saturn_device &>(device).m_unconfig_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_id_func(device_t &device, _Object object) { return downcast<saturn_device &>(device).m_id_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_crc_func(device_t &device, _Object object) { return downcast<saturn_device &>(device).m_crc_func.set_callback(object); }
+ template<class _Object> static devcb2_base &set_rsi_func(device_t &device, _Object object) { return downcast<saturn_device &>(device).m_rsi_func.set_callback(object); }
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_execute_interface overrides
+ virtual UINT32 execute_min_cycles() const { return 2; }
+ virtual UINT32 execute_max_cycles() const { return 21; }
+ virtual UINT32 execute_input_lines() const { return 1; }
+ virtual void execute_run();
+ virtual void execute_set_input(int inputnum, int state);
+
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : NULL; }
+
+ // device_state_interface overrides
+ void state_string_export(const device_state_entry &entry, astring &string);
+ virtual void state_import(const device_state_entry &entry);
+ virtual void state_export(const device_state_entry &entry);
+
+ // device_disasm_interface overrides
+ virtual UINT32 disasm_min_opcode_bytes() const { return 1; }
+ virtual UINT32 disasm_max_opcode_bytes() const { return 20; }
+ virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
+
+private:
+ address_space_config m_program_config;
+
+ devcb2_write32 m_out_func;
+ devcb2_read32 m_in_func;
+ devcb2_write_line m_reset_func;
+ devcb2_write32 m_config_func;
+ devcb2_write32 m_unconfig_func;
+ devcb2_read32 m_id_func;
+ devcb2_write32 m_crc_func;
+ devcb2_write_line m_rsi_func;
+
+// 64 bit, unpacked (one nibble per byte)
+typedef UINT8 Saturn64[16];
+
+ Saturn64 m_reg[9]; //r0,r1,r2,r3,r4,a,b,c,d
+
+ UINT32 m_d[2], m_pc, m_oldpc, m_rstk[8]; // 20 bit, packed addresses
+
+ UINT8 m_p; // 4 bit pointer
+
+ UINT16 m_out; // 12 bit (packed)
+ UINT8 m_carry, m_decimal;
+ UINT16 m_st; // status 16 bit
+
+ UINT8 m_hst; // hardware status 4 bit
+
+ UINT8 m_nmi_state;
+ UINT8 m_irq_state;
+ UINT8 m_irq_enable; /* INTON / INTOFF */
+ UINT8 m_in_irq; /* already servicing IRQ */
+ UINT8 m_pending_irq; /* IRQ is pending */
+ UINT8 m_sleeping; /* low-consumption state */
+ int m_monitor_id;
+ int m_monitor_in;
+ address_space *m_program;
+ direct_read_data *m_direct;
+ int m_icount;
+ INT64 m_debugger_temp;
+
+ void saturn_take_irq();
+ void IntReg64(Saturn64 r, INT64 d);
+ INT64 Reg64Int(Saturn64 r);
+
+ inline int READ_OP();
+ inline int READ_OP_ARG();
+ inline int READ_OP_ARG8();
+ inline INT8 READ_OP_DIS8();
+ inline int READ_OP_ARG12();
+ inline int READ_OP_DIS12();
+ inline int READ_OP_ARG16();
+ inline INT16 READ_OP_DIS16();
+ inline int READ_OP_ARG20();
+ inline int READ_NIBBLE(UINT32 adr);
+ inline int READ_8(UINT32 adr);
+ inline int READ_12(UINT32 adr);
+ inline int READ_16(UINT32 adr);
+ inline int READ_20(UINT32 adr);
+ inline void WRITE_NIBBLE(UINT32 adr, UINT8 nib);
+ inline int S64_READ_X(int r);
+ inline int S64_READ_WORD(int r);
+ inline int S64_READ_A(int r);
+ inline void S64_WRITE_X(int r, int v);
+ inline void S64_WRITE_WORD(int r, int v);
+ inline void S64_WRITE_A(int r, int v);
+ inline UINT32 saturn_pop();
+ inline void saturn_push(UINT32 adr);
+ inline void saturn_interrupt_on();
+ inline void saturn_interrupt_off();
+ inline void saturn_reset_interrupt();
+ inline void saturn_mem_reset();
+ inline void saturn_mem_config();
+ inline void saturn_mem_unconfig();
+ inline void saturn_mem_id();
+ inline void saturn_shutdown();
+ inline void saturn_bus_command_b();
+ inline void saturn_bus_command_c();
+ inline void saturn_bus_command_d();
+ inline void saturn_serial_request();
+ inline void saturn_out_c();
+ inline void saturn_out_cs();
+ inline void saturn_in(int reg);
+ inline void saturn_sethex() { m_decimal=0; }
+ inline void saturn_setdec() { m_decimal=1; }
+ inline void saturn_clear_st();
+ inline void saturn_st_to_c();
+ inline void saturn_c_to_st();
+ inline void saturn_exchange_c_st();
+ inline void saturn_jump_after_test();
+ inline void saturn_st_clear_bit();
+ inline void saturn_st_set_bit();
+ inline void saturn_st_jump_bit_clear();
+ inline void saturn_st_jump_bit_set();
+ inline void saturn_hst_clear_bits();
+ inline void saturn_hst_bits_cleared();
+ inline void saturn_exchange_p();
+ inline void saturn_p_to_c();
+ inline void saturn_c_to_p();
+ inline void saturn_dec_p();
+ inline void saturn_inc_p();
+ inline void saturn_load_p();
+ inline void saturn_p_equals();
+ inline void saturn_p_not_equals();
+ inline void saturn_ca_p_1();
+ inline void saturn_load_reg(int reg);
+ inline void saturn_jump(int adr, int jump);
+ inline void saturn_call(int adr);
+ inline void saturn_return(int yes);
+ inline void saturn_return_carry_set();
+ inline void saturn_return_carry_clear();
+ inline void saturn_return_interrupt();
+ inline void saturn_return_xm_set();
+ inline void saturn_pop_c();
+ inline void saturn_push_c();
+ inline void saturn_indirect_jump(int reg);
+ inline void saturn_equals_zero(int reg, int begin, int count);
+ inline void saturn_equals(int reg, int begin, int count, int right);
+ inline void saturn_not_equals_zero(int reg, int begin, int count);
+ inline void saturn_not_equals(int reg, int begin, int count, int right);
+ inline void saturn_greater(int reg, int begin, int count, int right);
+ inline void saturn_greater_equals(int reg, int begin, int count, int right);
+ inline void saturn_smaller_equals(int reg, int begin, int count, int right);
+ inline void saturn_smaller(int reg, int begin, int count, int right);
+ inline void saturn_jump_bit_clear(int reg);
+ inline void saturn_jump_bit_set(int reg);
+ inline void saturn_load_pc(int reg);
+ inline void saturn_store_pc(int reg);
+ inline void saturn_exchange_pc(int reg);
+ inline void saturn_load_adr(int reg, int nibbles);
+ inline void saturn_add_adr(int reg);
+ inline void saturn_sub_adr(int reg);
+ inline void saturn_adr_to_reg(int adr, int reg);
+ inline void saturn_reg_to_adr(int reg, int adr);
+ inline void saturn_adr_to_reg_word(int adr, int reg);
+ inline void saturn_reg_to_adr_word(int reg, int adr);
+ inline void saturn_exchange_adr_reg(int adr, int reg);
+ inline void saturn_exchange_adr_reg_word(int adr, int reg);
+ inline void saturn_load_nibbles(int reg, int begin, int count, int adr);
+ inline void saturn_store_nibbles(int reg, int begin, int count, int adr);
+ inline void saturn_clear_bit(int reg);
+ inline void saturn_set_bit(int reg);
+ inline void saturn_clear(int reg, int begin, int count);
+ inline void saturn_exchange(int left, int begin, int count, int right);
+ inline void saturn_copy(int dest, int begin, int count, int src);
+ inline void saturn_add(int reg, int begin, int count, int right);
+ inline void saturn_add_const(int reg, int begin, int count, UINT8 right);
+ inline void saturn_sub(int reg, int begin, int count, int right);
+ inline void saturn_sub_const(int reg, int begin, int count, int right);
+ inline void saturn_sub2(int reg, int begin, int count, int right);
+ inline void saturn_increment(int reg, int begin, int count);
+ inline void saturn_decrement(int reg, int begin, int count);
+ inline void saturn_invert(int reg, int begin, int count);
+ inline void saturn_negate(int reg, int begin, int count);
+ inline void saturn_or(int dest, int begin, int count, int src);
+ inline void saturn_and(int dest, int begin, int count, int src);
+ inline void saturn_shift_nibble_left(int reg, int begin, int count);
+ inline void saturn_shift_nibble_right(int reg, int begin, int count);
+ inline void saturn_rotate_nibble_left_w(int reg);
+ inline void saturn_rotate_nibble_right_w(int reg);
+ inline void saturn_shift_right(int reg, int begin, int count);
+ void saturn_invalid3( int op1, int op2, int op3 );
+ void saturn_invalid4( int op1, int op2, int op3, int op4 );
+ void saturn_invalid5( int op1, int op2, int op3, int op4, int op5 );
+ void saturn_invalid6( int op1, int op2, int op3, int op4, int op5, int op6 );
+ void saturn_instruction_0e();
+ void saturn_instruction_1();
+ void saturn_instruction_80();
+ void saturn_instruction_81a();
+ void saturn_instruction_81();
+ void saturn_instruction_8();
+ void saturn_instruction_9();
+ void saturn_instruction_a();
+ void saturn_instruction_b();
+ void saturn_instruction();
+};
+
+extern const device_type SATURN;
+
#endif /* __SATURN_H__ */