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
30 class I8080 : public DEVICE
33 /* ---------------------------------------------------------------------------
35 --------------------------------------------------------------------------- */
37 DEVICE *d_mem, *d_io, *d_pic;
40 DEVICE *d_mem_stored, *d_io_stored;
44 outputs_t outputs_busack;
45 outputs_t outputs_sod;
47 /* ---------------------------------------------------------------------------
49 --------------------------------------------------------------------------- */
53 uint16 SP, PC, prevPC;
55 bool HALT, BUSREQ, SID, afterEI;
57 /* ---------------------------------------------------------------------------
58 virtual machine interfaces
59 --------------------------------------------------------------------------- */
62 inline uint8 RM8(uint16 addr)
64 #ifdef I8080_MEMORY_WAIT
66 uint8 val = d_mem->read_data8w(addr, &wait);
70 return d_mem->read_data8(addr);
73 inline void WM8(uint16 addr, uint8 val)
75 #ifdef I8080_MEMORY_WAIT
77 d_mem->write_data8w(addr, val, &wait);
80 d_mem->write_data8(addr, val);
84 inline uint16 RM16(uint16 addr)
86 #ifdef I8080_MEMORY_WAIT
88 uint16 val = d_mem->read_data16w(addr, &wait);
92 return d_mem->read_data16(addr);
95 inline void WM16(uint16 addr, uint16 val)
97 #ifdef I8080_MEMORY_WAIT
99 d_mem->write_data16w(addr, val, &wait);
102 d_mem->write_data16(addr, val);
105 inline uint8 FETCHOP()
107 #ifdef I8080_MEMORY_WAIT
109 uint8 val = d_mem->read_data8w(PC++, &wait);
113 return d_mem->read_data8(PC++);
116 inline uint8 FETCH8()
118 #ifdef I8080_MEMORY_WAIT
120 uint8 val = d_mem->read_data8w(PC++, &wait);
124 return d_mem->read_data8(PC++);
127 inline uint16 FETCH16()
129 #ifdef I8080_MEMORY_WAIT
131 uint16 val = d_mem->read_data16w(PC, &wait);
134 uint16 val = d_mem->read_data16(PC);
139 inline uint16 POP16()
141 #ifdef I8080_MEMORY_WAIT
143 uint16 val = d_mem->read_data16w(SP, &wait);
146 uint16 val = d_mem->read_data16(SP);
151 inline void PUSH16(uint16 val)
154 #ifdef I8080_MEMORY_WAIT
156 d_mem->write_data16w(SP, val, &wait);
159 d_mem->write_data16(SP, val);
164 inline uint8 IN8(uint8 addr)
168 uint8 val = d_io->read_io8w(addr, &wait);
172 return d_io->read_io8(addr);
175 inline void OUT8(uint8 addr, uint8 val)
179 d_io->write_io8w(addr, val, &wait);
182 d_io->write_io8(addr, val);
187 inline uint32 ACK_INTR()
189 return d_pic->intr_ack();
192 /* ---------------------------------------------------------------------------
194 --------------------------------------------------------------------------- */
196 void run_one_opecode();
200 I8080(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
204 init_output_signals(&outputs_busack);
205 init_output_signals(&outputs_sod);
213 void write_signal(int id, uint32 data, uint32 mask);
214 void set_intr_line(bool line, bool pending, uint32 bit);
228 uint32 debug_prog_addr_mask()
232 uint32 debug_data_addr_mask()
236 void debug_write_data8(uint32 addr, uint32 data);
237 uint32 debug_read_data8(uint32 addr);
238 void debug_write_io8(uint32 addr, uint32 data);
239 uint32 debug_read_io8(uint32 addr);
240 bool debug_write_reg(_TCHAR *reg, uint32 data);
241 void debug_regs_info(_TCHAR *buffer, size_t buffer_len);
242 int debug_dasm(uint32 pc, _TCHAR *buffer, size_t buffer_len);
245 void save_state(FILEIO* state_fio);
246 bool load_state(FILEIO* state_fio);
248 void set_context_mem(DEVICE* device)
252 void set_context_io(DEVICE* device)
256 void set_context_intr(DEVICE* device)
261 void set_context_debugger(DEBUGGER* device)
266 void set_context_busack(DEVICE* device, int id, uint32 mask)
268 register_output_signal(&outputs_busack, device, id, mask);
270 void set_context_sod(DEVICE* device, int id, uint32 mask)
272 register_output_signal(&outputs_sod, device, id, mask);