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 dec_count(uint8_t code) {}
66 virtual void check_reg_c(uint8_t val) {}
67 virtual void check_reg_e(uint8_t val) {}
68 virtual void check_reg_l(uint8_t val) {}
69 virtual void check_reg_sp(uint8_t val) {}
70 virtual void INSN_0x08(void) {}
71 virtual void INSN_0x10(void) {}
72 virtual void RLDE(void) {}
73 virtual void RIM(void) {}
74 virtual void _DAA(void) {}
75 virtual void LDEH(void) {}
76 virtual void CMA(void) {}
77 virtual void SIM(void) {}
78 virtual void LDES(void) {}
79 virtual void INSN_0xcb(void) {}
80 virtual void INSN_0xd9(void) {}
81 virtual void INSN_0xdd(void) {}
82 virtual void INSN_0xed(void) {}
83 virtual void INSN_0xfd(void) {}
86 virtual void JMP(uint8_t c);
87 virtual void CALL(uint8_t c);
88 virtual void ANA(uint8_t n);
90 virtual uint8_t RM8(uint16_t addr) { return 0xff;}
91 virtual void WM8(uint16_t addr, uint8_t val) {}
92 virtual uint16_t RM16(uint16_t addr) { return 0xffff;}
93 virtual void WM16(uint16_t addr, uint16_t val) {}
94 virtual uint8_t IN8(uint8_t addr) { return 0xff; }
95 virtual void OUT8(uint8_t addr, uint8_t val) {}
96 virtual uint8_t FETCHOP() { return 0xff;}
97 virtual uint8_t FETCH8() { return 0xff;}
98 virtual uint16_t FETCH16() { return 0xffff; }
99 virtual uint16_t POP16() { return 0xff;}
100 virtual void PUSH16(uint16_t val) {}
101 virtual uint32_t ACK_INTR() {return 0xffffffff; }
105 inline void INT(uint16_t v);
106 inline void RST(uint16_t n);
108 void 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 int run(int clock);
129 virtual void write_signal(int id, uint32_t data, uint32_t mask);
130 uint32_t 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 uint32_t get_debug_prog_addr_mask()
149 uint32_t get_debug_data_addr_mask()
153 void write_debug_data8(uint32_t addr, uint32_t data);
154 uint32_t read_debug_data8(uint32_t addr);
155 void write_debug_io8(uint32_t addr, uint32_t data);
156 uint32_t read_debug_io8(uint32_t addr);
157 bool write_debug_reg(const _TCHAR *reg, uint32_t data);
158 void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
159 int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
162 void set_context_mem(DEVICE* device)
166 void set_context_io(DEVICE* device)
170 void set_context_intr(DEVICE* device)
174 void set_context_busack(DEVICE* device, int id, uint32_t mask)
176 register_output_signal(&outputs_busack, device, id, mask);
178 void set_context_sod(DEVICE* device, int id, uint32_t mask)
180 register_output_signal(&outputs_sod, device, id, mask);
185 inline void I8080_BASE::INT(uint16_t v)
190 PUSH16(PC); PC = (v);
193 inline void I8080_BASE::RST(uint16_t n)