2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
25 #define SIG_I86_TEST 0
31 class I86 : public DEVICE
34 /* ---------------------------------------------------------------------------
36 --------------------------------------------------------------------------- */
38 DEVICE *d_mem, *d_io, *d_pic, *d_bios;
39 #ifdef SINGLE_MODE_DMA
44 DEVICE *d_mem_stored, *d_io_stored;
47 /* ---------------------------------------------------------------------------
49 --------------------------------------------------------------------------- */
52 uint16 w[8]; /* viewed as 16 bits registers */
53 uint8 b[16]; /* or as 8 bit registers */
60 int32 AuxVal, OverVal, SignVal, ZeroVal, CarryVal, DirVal;
71 bool seg_prefix; /* prefix segment indicator */
72 uint8 prefix_seg; /* The prefixed segment */
74 uint16 eo; /* effective offset of the address (before segment is added) */
75 uint8 ea_seg; /* effective segment of the address */
77 #if defined(_USE_AGAR) || defined(_USE_SDL) || defined(_USE_QT)
78 int max(int a, int b) {
82 int min(int a, int b) {
88 /* ---------------------------------------------------------------------------
90 --------------------------------------------------------------------------- */
93 void interrupt(int num);
95 unsigned GetEA(unsigned ModRM);
96 void rotate_shift_byte(unsigned ModRM, unsigned cnt);
97 void rotate_shift_word(unsigned ModRM, unsigned cnt);
100 void run_one_opecode();
102 void run_one_opecode_debugger();
104 void instruction(uint8 code);
105 inline void _add_br8();
106 inline void _add_wr16();
107 inline void _add_r8b();
108 inline void _add_r16w();
109 inline void _add_ald8();
110 inline void _add_axd16();
111 inline void _push_es();
112 inline void _pop_es();
113 inline void _or_br8();
114 inline void _or_wr16();
115 inline void _or_r8b();
116 inline void _or_r16w();
117 inline void _or_ald8();
118 inline void _or_axd16();
119 inline void _push_cs();
121 inline void _0fpre();
123 inline void _adc_br8();
124 inline void _adc_wr16();
125 inline void _adc_r8b();
126 inline void _adc_r16w();
127 inline void _adc_ald8();
128 inline void _adc_axd16();
129 inline void _push_ss();
130 inline void _pop_ss();
131 inline void _sbb_br8();
132 inline void _sbb_wr16();
133 inline void _sbb_r8b();
134 inline void _sbb_r16w();
135 inline void _sbb_ald8();
136 inline void _sbb_axd16();
137 inline void _push_ds();
138 inline void _pop_ds();
139 inline void _and_br8();
140 inline void _and_wr16();
141 inline void _and_r8b();
142 inline void _and_r16w();
143 inline void _and_ald8();
144 inline void _and_axd16();
147 inline void _sub_br8();
148 inline void _sub_wr16();
149 inline void _sub_r8b();
150 inline void _sub_r16w();
151 inline void _sub_ald8();
152 inline void _sub_axd16();
155 inline void _xor_br8();
156 inline void _xor_wr16();
157 inline void _xor_r8b();
158 inline void _xor_r16w();
159 inline void _xor_ald8();
160 inline void _xor_axd16();
163 inline void _cmp_br8();
164 inline void _cmp_wr16();
165 inline void _cmp_r8b();
166 inline void _cmp_r16w();
167 inline void _cmp_ald8();
168 inline void _cmp_axd16();
171 inline void _inc_ax();
172 inline void _inc_cx();
173 inline void _inc_dx();
174 inline void _inc_bx();
175 inline void _inc_sp();
176 inline void _inc_bp();
177 inline void _inc_si();
178 inline void _inc_di();
179 inline void _dec_ax();
180 inline void _dec_cx();
181 inline void _dec_dx();
182 inline void _dec_bx();
183 inline void _dec_sp();
184 inline void _dec_bp();
185 inline void _dec_si();
186 inline void _dec_di();
187 inline void _push_ax();
188 inline void _push_cx();
189 inline void _push_dx();
190 inline void _push_bx();
191 inline void _push_sp();
192 inline void _push_bp();
193 inline void _push_si();
194 inline void _push_di();
195 inline void _pop_ax();
196 inline void _pop_cx();
197 inline void _pop_dx();
198 inline void _pop_bx();
199 inline void _pop_sp();
200 inline void _pop_bp();
201 inline void _pop_si();
202 inline void _pop_di();
203 inline void _pusha();
205 inline void _bound();
206 inline void _repc(int flagval);
207 inline void _push_d16();
208 inline void _imul_d16();
209 inline void _push_d8();
210 inline void _imul_d8();
213 inline void _outsb();
214 inline void _outsw();
231 inline void _80pre();
232 inline void _81pre();
233 inline void _82pre();
234 inline void _83pre();
235 inline void _test_br8();
236 inline void _test_wr16();
237 inline void _xchg_br8();
238 inline void _xchg_wr16();
239 inline void _mov_br8();
240 inline void _mov_wr16();
241 inline void _mov_r8b();
242 inline void _mov_r16w();
243 inline void _mov_wsreg();
245 inline void _mov_sregw();
248 inline void _xchg_axcx();
249 inline void _xchg_axdx();
250 inline void _xchg_axbx();
251 inline void _xchg_axsp();
252 inline void _xchg_axbp();
253 inline void _xchg_axsi();
254 inline void _xchg_axdi();
257 inline void _call_far();
259 inline void _pushf();
263 inline void _mov_aldisp();
264 inline void _mov_axdisp();
265 inline void _mov_dispal();
266 inline void _mov_dispax();
267 inline void _movsb();
268 inline void _movsw();
269 inline void _cmpsb();
270 inline void _cmpsw();
271 inline void _test_ald8();
272 inline void _test_axd16();
273 inline void _stosb();
274 inline void _stosw();
275 inline void _lodsb();
276 inline void _lodsw();
277 inline void _scasb();
278 inline void _scasw();
279 inline void _mov_ald8();
280 inline void _mov_cld8();
281 inline void _mov_dld8();
282 inline void _mov_bld8();
283 inline void _mov_ahd8();
284 inline void _mov_chd8();
285 inline void _mov_dhd8();
286 inline void _mov_bhd8();
287 inline void _mov_axd16();
288 inline void _mov_cxd16();
289 inline void _mov_dxd16();
290 inline void _mov_bxd16();
291 inline void _mov_spd16();
292 inline void _mov_bpd16();
293 inline void _mov_sid16();
294 inline void _mov_did16();
295 inline void _rotshft_bd8();
296 inline void _rotshft_wd8();
297 inline void _ret_d16();
299 inline void _les_dw();
300 inline void _lds_dw();
301 inline void _mov_bd8();
302 inline void _mov_wd16();
303 inline void _enter();
304 inline void _leav(); // _leave()
305 inline void _retf_d16();
311 inline void _rotshft_b();
312 inline void _rotshft_w();
313 inline void _rotshft_bcl();
314 inline void _rotshft_wcl();
317 inline void _setalc();
319 inline void _escape();
320 inline void _loopne();
321 inline void _loope();
326 inline void _outal();
327 inline void _outax();
328 inline void _call_d16();
329 inline void _jmp_d16();
330 inline void _jmp_far();
331 inline void _jmp_d8();
332 inline void _inaldx();
333 inline void _inaxdx();
334 inline void _outdxal();
335 inline void _outdxax();
337 inline void _rep(int flagval);
338 inline void _repne();
342 inline void _f6pre();
343 inline void _f7pre();
350 inline void _fepre();
351 inline void _ffpre();
352 inline void _invalid();
355 I86(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
358 #ifdef SINGLE_MODE_DMA
369 void write_signal(int id, uint32 data, uint32 mask);
370 void set_intr_line(bool line, bool pending, uint32 bit);
371 void set_extra_clock(int clock)
373 extra_icount += clock;
375 int get_extra_clock()
392 uint32 debug_prog_addr_mask()
396 uint32 debug_data_addr_mask()
400 void debug_write_data8(uint32 addr, uint32 data);
401 uint32 debug_read_data8(uint32 addr);
402 void debug_write_data16(uint32 addr, uint32 data);
403 uint32 debug_read_data16(uint32 addr);
404 void debug_write_io8(uint32 addr, uint32 data);
405 uint32 debug_read_io8(uint32 addr);
406 void debug_write_io16(uint32 addr, uint32 data);
407 uint32 debug_read_io16(uint32 addr);
408 bool debug_write_reg(const _TCHAR *reg, uint32 data);
409 void debug_regs_info(_TCHAR *buffer, size_t buffer_len);
410 int debug_dasm(uint32 pc, _TCHAR *buffer, size_t buffer_len);
412 void save_state(FILEIO* state_fio);
413 bool load_state(FILEIO* state_fio);
416 void set_context_mem(DEVICE* device)
420 void set_context_io(DEVICE* device)
424 void set_context_intr(DEVICE* device)
428 void set_context_bios(DEVICE* device)
432 #ifdef SINGLE_MODE_DMA
433 void set_context_dma(DEVICE* device)
439 void set_context_debugger(DEBUGGER* device)