summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/sc61860/sc61860.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/sc61860/sc61860.h')
-rw-r--r--src/devices/cpu/sc61860/sc61860.h236
1 files changed, 236 insertions, 0 deletions
diff --git a/src/devices/cpu/sc61860/sc61860.h b/src/devices/cpu/sc61860/sc61860.h
new file mode 100644
index 00000000000..e34197f83f9
--- /dev/null
+++ b/src/devices/cpu/sc61860/sc61860.h
@@ -0,0 +1,236 @@
+// license:BSD-3-Clause
+// copyright-holders:Peter Trauner
+/*****************************************************************************
+ *
+ * sc61860.h
+ * portable sharp 61860 emulator interface
+ * (sharp pocket computers)
+ *
+ * Copyright Peter Trauner, all rights reserved.
+ *
+ *****************************************************************************/
+
+#pragma once
+
+#ifndef __SC61860_H__
+#define __SC61860_H__
+
+/*
+ official names seam to be
+ ESR-H, ESR-J
+ (ESR-L SC62015 ist complete different)
+ */
+
+/* unsolved problems
+ the processor has 8 kbyte internal rom
+ only readable with special instructions and program execution
+ 64 kb external ram (first 8kbyte not seen for program execution?) */
+
+
+enum
+{
+ SC61860_PC=1, SC61860_DP,
+ SC61860_P, SC61860_Q, SC61860_R,
+ SC61860_CARRY,
+ SC61860_ZERO,
+ // the following are in the internal ram!
+ SC61860_BA,
+ SC61860_X, SC61860_Y,
+ SC61860_I, SC61860_J, SC61860_K, SC61860_L, SC61860_V, SC61860_W,
+ SC61860_H
+
+// SC61860_NMI_STATE,
+// SC61860_IRQ_STATE
+};
+
+
+#define MCFG_SC61860_READ_RESET_HANDLER(_devcb) \
+ devcb = &sc61860_device::set_reset_cb(*device, DEVCB_##_devcb);
+
+#define MCFG_SC61860_READ_BRK_HANDLER(_devcb) \
+ devcb = &sc61860_device::set_brk_cb(*device, DEVCB_##_devcb);
+
+#define MCFG_SC61860_READ_X_HANDLER(_devcb) \
+ devcb = &sc61860_device::set_x_cb(*device, DEVCB_##_devcb);
+
+#define MCFG_SC61860_READ_A_HANDLER(_devcb) \
+ devcb = &sc61860_device::set_ina_cb(*device, DEVCB_##_devcb);
+
+#define MCFG_SC61860_WRITE_A_HANDLER(_devcb) \
+ devcb = &sc61860_device::set_outa_cb(*device, DEVCB_##_devcb);
+
+#define MCFG_SC61860_READ_B_HANDLER(_devcb) \
+ devcb = &sc61860_device::set_inb_cb(*device, DEVCB_##_devcb);
+
+#define MCFG_SC61860_WRITE_B_HANDLER(_devcb) \
+ devcb = &sc61860_device::set_outb_cb(*device, DEVCB_##_devcb);
+
+#define MCFG_SC61860_WRITE_C_HANDLER(_devcb) \
+ devcb = &sc61860_device::set_outc_cb(*device, DEVCB_##_devcb);
+
+class sc61860_device : public cpu_device
+{
+public:
+ // construction/destruction
+ sc61860_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // static configuration helpers
+ template<class _Object> static devcb_base &set_reset_cb(device_t &device, _Object object) { return downcast<sc61860_device &>(device).m_reset.set_callback(object); }
+ template<class _Object> static devcb_base &set_brk_cb(device_t &device, _Object object) { return downcast<sc61860_device &>(device).m_brk.set_callback(object); }
+ template<class _Object> static devcb_base &set_x_cb(device_t &device, _Object object) { return downcast<sc61860_device &>(device).m_x.set_callback(object); }
+ template<class _Object> static devcb_base &set_ina_cb(device_t &device, _Object object) { return downcast<sc61860_device &>(device).m_ina.set_callback(object); }
+ template<class _Object> static devcb_base &set_outa_cb(device_t &device, _Object object) { return downcast<sc61860_device &>(device).m_outa.set_callback(object); }
+ template<class _Object> static devcb_base &set_inb_cb(device_t &device, _Object object) { return downcast<sc61860_device &>(device).m_inb.set_callback(object); }
+ template<class _Object> static devcb_base &set_outb_cb(device_t &device, _Object object) { return downcast<sc61860_device &>(device).m_outb.set_callback(object); }
+ template<class _Object> static devcb_base &set_outc_cb(device_t &device, _Object object) { return downcast<sc61860_device &>(device).m_outc.set_callback(object); }
+
+ /* this is though for power on/off of the sharps */
+ UINT8 *internal_ram();
+
+ TIMER_CALLBACK_MEMBER(sc61860_2ms_tick);
+
+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 4; }
+ virtual UINT32 execute_input_lines() const { return 0; }
+ virtual void execute_run();
+
+ // 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
+ virtual void state_import(const device_state_entry &entry);
+ virtual void state_export(const device_state_entry &entry);
+ void state_string_export(const device_state_entry &entry, std::string &str);
+
+ // device_disasm_interface overrides
+ virtual UINT32 disasm_min_opcode_bytes() const { return 1; }
+ virtual UINT32 disasm_max_opcode_bytes() const { return 4; }
+ 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;
+
+ devcb_read_line m_reset;
+ devcb_read_line m_brk;
+ devcb_read_line m_x;
+ devcb_read8 m_ina;
+ devcb_write8 m_outa;
+ devcb_read8 m_inb;
+ devcb_write8 m_outb;
+ devcb_write8 m_outc;
+
+ UINT8 m_p, m_q, m_r; //7 bits only?
+
+ UINT8 m_c; // port c, used for HLT.
+ UINT8 m_d, m_h;
+ UINT16 m_oldpc, m_pc, m_dp;
+
+ int m_carry, m_zero;
+
+ struct { int t2ms, t512ms; int count; } m_timer;
+
+ address_space *m_program;
+ direct_read_data *m_direct;
+ int m_icount;
+ UINT8 m_ram[0x100]; // internal special ram, should be 0x60, 0x100 to avoid memory corruption for now
+
+ UINT32 m_debugger_temp;
+
+ inline UINT8 READ_OP();
+ inline UINT8 READ_OP_ARG();
+ inline UINT16 READ_OP_ARG_WORD();
+ inline UINT8 READ_BYTE(UINT16 adr);
+ inline void WRITE_BYTE(UINT16 a, UINT8 v);
+ inline UINT8 READ_RAM(int r);
+ inline void WRITE_RAM(int r, UINT8 v);
+ inline void PUSH(UINT8 v);
+ inline UINT8 POP();
+ inline void sc61860_load_imm(int r, UINT8 v);
+ inline void sc61860_load();
+ inline void sc61860_load_imm_p(UINT8 v);
+ inline void sc61860_load_imm_q(UINT8 v);
+ inline void sc61860_load_r();
+ inline void sc61860_load_ext(int r);
+ inline void sc61860_load_dp();
+ inline void sc61860_load_dl();
+ inline void sc61860_store_p();
+ inline void sc61860_store_q();
+ inline void sc61860_store_r();
+ inline void sc61860_store_ext(int r);
+ inline void sc61860_exam(int a, int b);
+ inline void sc61860_test(int reg, UINT8 value);
+ inline void sc61860_test_ext();
+ inline void sc61860_and(int reg, UINT8 value);
+ inline void sc61860_and_ext();
+ inline void sc61860_or(int reg, UINT8 value);
+ inline void sc61860_or_ext();
+ inline void sc61860_rotate_right();
+ inline void sc61860_rotate_left();
+ inline void sc61860_swap();
+ inline void sc61860_inc(int reg);
+ inline void sc61860_inc_p();
+ inline void sc61860_dec(int reg);
+ inline void sc61860_dec_p();
+ inline void sc61860_add(int reg, UINT8 value);
+ inline void sc61860_add_carry();
+ inline void sc61860_add_word();
+ inline void sc61860_sub(int reg, UINT8 value);
+ inline void sc61860_sub_carry();
+ inline void sc61860_sub_word();
+ inline void sc61860_cmp(int reg, UINT8 value);
+ inline void sc61860_pop();
+ inline void sc61860_push();
+ inline void sc61860_prepare_table_call();
+ inline void sc61860_execute_table_call();
+ inline void sc61860_call(UINT16 adr);
+ inline void sc61860_return();
+ inline void sc61860_jump(int yes);
+ inline void sc61860_jump_rel_plus(int yes);
+ inline void sc61860_jump_rel_minus(int yes);
+ inline void sc61860_loop();
+ inline void sc61860_leave();
+ inline void sc61860_wait();
+ inline void sc61860_set_carry();
+ inline void sc61860_reset_carry();
+ inline void sc61860_out_a();
+ inline void sc61860_out_b();
+ inline void sc61860_out_f();
+ inline void sc61860_out_c();
+ inline void sc61860_in_a();
+ inline void sc61860_in_b();
+ inline void sc61860_test_special();
+ inline void sc61860_add_bcd_a();
+ inline void sc61860_add_bcd();
+ inline void sc61860_sub_bcd_a();
+ inline void sc61860_sub_bcd();
+ inline void sc61860_shift_left_nibble();
+ inline void sc61860_shift_right_nibble();
+ inline void sc61860_inc_load_dp(int reg);
+ inline void sc61860_dec_load_dp(int reg);
+ inline void sc61860_inc_load_dp_load();
+ inline void sc61860_dec_load_dp_load();
+ inline void sc61860_inc_load_dp_store();
+ inline void sc61860_dec_load_dp_store();
+ inline void sc61860_fill();
+ inline void sc61860_fill_ext();
+ inline void sc61860_copy(int count);
+ inline void sc61860_copy_ext(int count);
+ inline void sc61860_copy_int(int count);
+ inline void sc61860_exchange(int count);
+ inline void sc61860_exchange_ext(int count);
+ inline void sc61860_wait_x(int level);
+ void sc61860_instruction();
+
+};
+
+
+extern const device_type SC61860;
+
+
+#endif /* __SC61860_H__ */