2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
11 #ifndef _I8080_BASE_H_
12 #define _I8080_BASE_H_
18 #define SIG_I8080_INTR 0
20 #define SIG_I8085_RST5 1
21 #define SIG_I8085_RST6 2
22 #define SIG_I8085_RST7 3
23 #define SIG_I8085_SID 4
25 #define SIG_I8080_INTE 5
31 class I8080_BASE : public DEVICE
34 /* ---------------------------------------------------------------------------
36 --------------------------------------------------------------------------- */
38 DEVICE *d_mem, *d_io, *d_pic;
41 DEVICE *d_mem_stored, *d_io_stored;
45 outputs_t outputs_busack;
46 outputs_t outputs_sod;
48 /* ---------------------------------------------------------------------------
50 --------------------------------------------------------------------------- */
54 uint16_t SP, PC, prevPC;
56 bool afterHALT, BUSREQ, SID, afterEI;
58 static const int cc_op_8080[0x100];
59 static const int cc_op_8085[0x100];
61 static const uint8_t ZS[256];
62 static const uint8_t ZSP[256];
63 static const uint16_t DAA[2048];
65 virtual void __FASTCALL dec_count(uint8_t code) {}
66 virtual void __FASTCALL check_reg_c(uint8_t val) {}
67 virtual void __FASTCALL check_reg_e(uint8_t val) {}
68 virtual void __FASTCALL check_reg_l(uint8_t val) {}
69 virtual void __FASTCALL check_reg_sp(uint8_t val) {}
70 virtual void __FASTCALL INSN_0x08(void) {}
71 virtual void __FASTCALL INSN_0x10(void) {}
72 virtual void __FASTCALL RLDE(void) {}
73 virtual void __FASTCALL RIM(void) {}
74 virtual void __FASTCALL _DAA(void) {}
75 virtual void __FASTCALL LDEH(void) {}
76 virtual void __FASTCALL CMA(void) {}
77 virtual void __FASTCALL SIM(void) {}
78 virtual void __FASTCALL LDES(void) {}
79 virtual void __FASTCALL INSN_0xcb(void) {}
80 virtual void __FASTCALL INSN_0xd9(void) {}
81 virtual void __FASTCALL INSN_0xdd(void) {}
82 virtual void __FASTCALL INSN_0xed(void) {}
83 virtual void __FASTCALL INSN_0xfd(void) {}
86 virtual void __FASTCALL JMP(uint8_t c);
87 virtual void __FASTCALL CALL(uint8_t c);
88 virtual void __FASTCALL ANA(uint8_t n);
90 virtual uint8_t __FASTCALL RM8(uint16_t addr) { return 0xff;}
91 virtual void __FASTCALL WM8(uint16_t addr, uint8_t val) {}
92 virtual uint16_t __FASTCALL RM16(uint16_t addr) { return 0xffff;}
93 virtual void __FASTCALL WM16(uint16_t addr, uint16_t val) {}
94 virtual uint8_t __FASTCALL IN8(uint8_t addr) { return 0xff; }
95 virtual void __FASTCALL OUT8(uint8_t addr, uint8_t val) {}
96 virtual uint8_t __FASTCALL FETCHOP() { return 0xff;}
97 virtual uint8_t __FASTCALL FETCH8() { return 0xff;}
98 virtual uint16_t __FASTCALL FETCH16() { return 0xffff; }
99 virtual uint16_t __FASTCALL POP16() { return 0xff;}
100 virtual void __FASTCALL PUSH16(uint16_t val) {}
101 virtual uint32_t __FASTCALL ACK_INTR() {return 0xffffffff; }
103 void __FASTCALL DSUB();
105 inline void __FASTCALL INT(uint16_t v);
106 inline void __FASTCALL RST(uint16_t n);
108 void __FASTCALL OP(uint8_t code);
110 uint64_t total_count;
111 uint64_t prev_total_count;
113 I8080_BASE(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
117 initialize_output_signals(&outputs_busack);
118 initialize_output_signals(&outputs_sod);
119 d_mem = d_pic = d_io = NULL;
120 d_mem_stored = d_io_stored = NULL;
122 total_count = prev_total_count = 0;
123 set_device_name(_T("i8080 CPU"));
126 virtual void initialize();
127 virtual void reset();
128 virtual __FASTCALL int run(int clock);
129 virtual void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
130 uint32_t __FASTCALL read_signal(int ch);
131 void set_intr_line(bool line, bool pending, uint32_t bit);
136 uint32_t get_next_pc()
140 //#ifdef USE_DEBUGGER
145 bool is_debugger_available()
153 uint32_t get_debug_prog_addr_mask()
157 uint32_t get_debug_data_addr_mask()
161 void __FASTCALL write_debug_data8(uint32_t addr, uint32_t data);
162 uint32_t __FASTCALL read_debug_data8(uint32_t addr);
163 void __FASTCALL write_debug_io8(uint32_t addr, uint32_t data);
164 uint32_t __FASTCALL read_debug_io8(uint32_t addr);
165 bool write_debug_reg(const _TCHAR *reg, uint32_t data);
166 bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
167 int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0);
170 void set_context_mem(DEVICE* device)
174 void set_context_io(DEVICE* device)
178 void set_context_intr(DEVICE* device)
182 void set_context_busack(DEVICE* device, int id, uint32_t mask)
184 register_output_signal(&outputs_busack, device, id, mask);
186 void set_context_sod(DEVICE* device, int id, uint32_t mask)
188 register_output_signal(&outputs_sod, device, id, mask);
193 inline void I8080_BASE::INT(uint16_t v)
198 PUSH16(PC); PC = (v);
201 inline void I8080_BASE::RST(uint16_t n)