2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
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 DLL_PREFIX I8080 : public DEVICE
37 uint32_t __CPU_START_ADDR;
38 /* ---------------------------------------------------------------------------
40 --------------------------------------------------------------------------- */
42 DEVICE *d_mem, *d_io, *d_pic;
45 DEVICE *d_mem_stored, *d_io_stored;
49 outputs_t outputs_busack;
50 outputs_t outputs_sod;
52 /* ---------------------------------------------------------------------------
54 --------------------------------------------------------------------------- */
58 uint16_t SP, PC, prevPC;
60 bool afterHALT, BUSREQ, SID, afterEI;
62 static const int cc_op_8080[0x100];
63 static const int cc_op_8085[0x100];
66 static const uint8_t ZS[256];
67 static const uint8_t ZSP[256];
68 static const uint16_t DAA[2048];
70 void __FASTCALL RLDE_8085(void);
71 void __FASTCALL RIM_8085(void);
72 void __FASTCALL _DAA(void);
73 void __FASTCALL CMA_8080(void);
74 void __FASTCALL CMA_8085(void);
75 void __FASTCALL JMP(uint8_t c);
76 void __FASTCALL JMP_8085(uint8_t c);
77 void __FASTCALL JMP_8080(uint8_t c);
78 void __FASTCALL CALL(uint8_t c);
79 void __FASTCALL CALL_8085(uint8_t c);
80 void __FASTCALL CALL_8080(uint8_t c);
81 void __FASTCALL ANA(uint8_t n);
82 void __FASTCALL ANA_8085(uint8_t n);
83 void __FASTCALL ANA_8080(uint8_t n);
86 inline uint8_t __FASTCALL RM8(uint16_t addr)
89 uint8_t val = d_mem->read_data8w(addr, &wait);
93 inline void __FASTCALL WM8(uint16_t addr, uint8_t val)
96 d_mem->write_data8w(addr, val, &wait);
99 inline uint16_t __FASTCALL RM16(uint16_t addr)
102 val.b.l = RM8(addr );
103 val.b.h = RM8(addr + 1);
106 inline void __FASTCALL WM16(uint16_t addr, uint16_t val)
108 WM8(addr , (val ) & 0xff);
109 WM8(addr + 1, (val >> 8) & 0xff);
111 inline uint8_t __FASTCALL FETCHOP()
114 uint8_t val = d_mem->fetch_op(PC++, &wait);
118 inline uint8_t __FASTCALL FETCH8()
123 inline uint16_t __FASTCALL FETCH16()
125 uint16_t val = RM16(PC);
129 inline uint16_t __FASTCALL POP16()
131 uint16_t val = RM16(SP);
135 inline void __FASTCALL PUSH16(uint16_t val)
142 inline uint8_t __FASTCALL IN8(uint8_t addr)
145 uint8_t val = d_io->read_io8w(addr, &wait);
149 inline void __FASTCALL OUT8(uint8_t addr, uint8_t val)
152 d_io->write_io8w(addr, val, &wait);
157 inline uint32_t __FASTCALL ACK_INTR()
159 return d_pic->get_intr_ack();
162 void __FASTCALL DSUB_8085();
164 inline void __FASTCALL __INT(uint16_t v)
170 inline void __FASTCALL __RST(uint16_t n)
176 void __FASTCALL OP(uint8_t code);
177 void __FASTCALL run_one_opecode();
178 void check_interrupt();
180 uint64_t total_count;
181 uint64_t prev_total_count;
183 I8080(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
187 initialize_output_signals(&outputs_busack);
188 initialize_output_signals(&outputs_sod);
189 d_mem = d_pic = d_io = NULL;
190 d_mem_stored = d_io_stored = NULL;
192 total_count = prev_total_count = 0;
197 __CPU_START_ADDR = 0;
200 set_device_name(_T("i8080 CPU"));
204 void initialize() override;
205 void reset() override;
206 int __FASTCALL run(int clock) override;
208 void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask) override;
209 uint32_t __FASTCALL read_signal(int ch) override;
210 bool process_state(FILEIO* state_fio, bool loading) override;
212 void __FASTCALL set_intr_line(bool line, bool pending, uint32_t bit) override;
213 uint32_t get_pc() override
217 uint32_t get_next_pc() override
221 //#ifdef USE_DEBUGGER
222 bool is_cpu() override
226 bool is_debugger_available() override
230 void *get_debugger() override
234 uint32_t get_debug_prog_addr_mask() override
238 uint32_t get_debug_data_addr_mask() override
242 void __FASTCALL write_debug_data8(uint32_t addr, uint32_t data) override;
243 uint32_t __FASTCALL read_debug_data8(uint32_t addr) override;
244 void __FASTCALL write_debug_io8(uint32_t addr, uint32_t data) override;
245 uint32_t __FASTCALL read_debug_io8(uint32_t addr) override;
246 bool write_debug_reg(const _TCHAR *reg, uint32_t data) override;
247 bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) override;
248 int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0) override;
251 void set_context_mem(DEVICE* device)
255 void set_context_io(DEVICE* device)
259 void set_context_intr(DEVICE* device, uint32_t bit = 0xffffffff) override
263 void set_context_busack(DEVICE* device, int id, uint32_t mask)
265 register_output_signal(&outputs_busack, device, id, mask);
267 void set_context_sod(DEVICE* device, int id, uint32_t mask)
269 register_output_signal(&outputs_sod, device, id, mask);
271 void set_context_debugger(DEBUGGER* device)