2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
13 #if defined(USE_SHARED_DLL)
14 #include "libcpu_newdev/i86.h"
21 #define SIG_I86_TEST 0
27 class I86 : public DEVICE
30 /* ---------------------------------------------------------------------------
32 --------------------------------------------------------------------------- */
34 DEVICE *d_mem, *d_io, *d_pic, *d_bios;
35 #ifdef SINGLE_MODE_DMA
40 DEVICE *d_mem_stored, *d_io_stored;
43 /* ---------------------------------------------------------------------------
45 --------------------------------------------------------------------------- */
48 uint16_t w[8]; /* viewed as 16 bits registers */
49 uint8_t b[16]; /* or as 8 bit registers */
56 int32_t AuxVal, OverVal, SignVal, ZeroVal, CarryVal, DirVal;
67 bool seg_prefix; /* prefix segment indicator */
68 uint8_t prefix_seg; /* The prefixed segment */
70 uint16_t eo; /* effective offset of the address (before segment is added) */
71 uint8_t ea_seg; /* effective segment of the address */
73 /* ---------------------------------------------------------------------------
75 --------------------------------------------------------------------------- */
78 void interrupt(int num);
80 unsigned GetEA(unsigned ModRM);
81 void rotate_shift_byte(unsigned ModRM, unsigned cnt);
82 void rotate_shift_word(unsigned ModRM, unsigned cnt);
85 void run_one_opecode();
87 void run_one_opecode_debugger();
89 void instruction(uint8_t code);
90 inline void _add_br8();
91 inline void _add_wr16();
92 inline void _add_r8b();
93 inline void _add_r16w();
94 inline void _add_ald8();
95 inline void _add_axd16();
96 inline void _push_es();
97 inline void _pop_es();
98 inline void _or_br8();
99 inline void _or_wr16();
100 inline void _or_r8b();
101 inline void _or_r16w();
102 inline void _or_ald8();
103 inline void _or_axd16();
104 inline void _push_cs();
106 inline void _0fpre();
108 inline void _adc_br8();
109 inline void _adc_wr16();
110 inline void _adc_r8b();
111 inline void _adc_r16w();
112 inline void _adc_ald8();
113 inline void _adc_axd16();
114 inline void _push_ss();
115 inline void _pop_ss();
116 inline void _sbb_br8();
117 inline void _sbb_wr16();
118 inline void _sbb_r8b();
119 inline void _sbb_r16w();
120 inline void _sbb_ald8();
121 inline void _sbb_axd16();
122 inline void _push_ds();
123 inline void _pop_ds();
124 inline void _and_br8();
125 inline void _and_wr16();
126 inline void _and_r8b();
127 inline void _and_r16w();
128 inline void _and_ald8();
129 inline void _and_axd16();
132 inline void _sub_br8();
133 inline void _sub_wr16();
134 inline void _sub_r8b();
135 inline void _sub_r16w();
136 inline void _sub_ald8();
137 inline void _sub_axd16();
140 inline void _xor_br8();
141 inline void _xor_wr16();
142 inline void _xor_r8b();
143 inline void _xor_r16w();
144 inline void _xor_ald8();
145 inline void _xor_axd16();
148 inline void _cmp_br8();
149 inline void _cmp_wr16();
150 inline void _cmp_r8b();
151 inline void _cmp_r16w();
152 inline void _cmp_ald8();
153 inline void _cmp_axd16();
156 inline void _inc_ax();
157 inline void _inc_cx();
158 inline void _inc_dx();
159 inline void _inc_bx();
160 inline void _inc_sp();
161 inline void _inc_bp();
162 inline void _inc_si();
163 inline void _inc_di();
164 inline void _dec_ax();
165 inline void _dec_cx();
166 inline void _dec_dx();
167 inline void _dec_bx();
168 inline void _dec_sp();
169 inline void _dec_bp();
170 inline void _dec_si();
171 inline void _dec_di();
172 inline void _push_ax();
173 inline void _push_cx();
174 inline void _push_dx();
175 inline void _push_bx();
176 inline void _push_sp();
177 inline void _push_bp();
178 inline void _push_si();
179 inline void _push_di();
180 inline void _pop_ax();
181 inline void _pop_cx();
182 inline void _pop_dx();
183 inline void _pop_bx();
184 inline void _pop_sp();
185 inline void _pop_bp();
186 inline void _pop_si();
187 inline void _pop_di();
188 inline void _pusha();
190 inline void _bound();
191 inline void _repc(int flagval);
192 inline void _push_d16();
193 inline void _imul_d16();
194 inline void _push_d8();
195 inline void _imul_d8();
198 inline void _outsb();
199 inline void _outsw();
216 inline void _80pre();
217 inline void _81pre();
218 inline void _82pre();
219 inline void _83pre();
220 inline void _test_br8();
221 inline void _test_wr16();
222 inline void _xchg_br8();
223 inline void _xchg_wr16();
224 inline void _mov_br8();
225 inline void _mov_wr16();
226 inline void _mov_r8b();
227 inline void _mov_r16w();
228 inline void _mov_wsreg();
230 inline void _mov_sregw();
233 inline void _xchg_axcx();
234 inline void _xchg_axdx();
235 inline void _xchg_axbx();
236 inline void _xchg_axsp();
237 inline void _xchg_axbp();
238 inline void _xchg_axsi();
239 inline void _xchg_axdi();
242 inline void _call_far();
244 inline void _pushf();
248 inline void _mov_aldisp();
249 inline void _mov_axdisp();
250 inline void _mov_dispal();
251 inline void _mov_dispax();
252 inline void _movsb();
253 inline void _movsw();
254 inline void _cmpsb();
255 inline void _cmpsw();
256 inline void _test_ald8();
257 inline void _test_axd16();
258 inline void _stosb();
259 inline void _stosw();
260 inline void _lodsb();
261 inline void _lodsw();
262 inline void _scasb();
263 inline void _scasw();
264 inline void _mov_ald8();
265 inline void _mov_cld8();
266 inline void _mov_dld8();
267 inline void _mov_bld8();
268 inline void _mov_ahd8();
269 inline void _mov_chd8();
270 inline void _mov_dhd8();
271 inline void _mov_bhd8();
272 inline void _mov_axd16();
273 inline void _mov_cxd16();
274 inline void _mov_dxd16();
275 inline void _mov_bxd16();
276 inline void _mov_spd16();
277 inline void _mov_bpd16();
278 inline void _mov_sid16();
279 inline void _mov_did16();
280 inline void _rotshft_bd8();
281 inline void _rotshft_wd8();
282 inline void _ret_d16();
284 inline void _les_dw();
285 inline void _lds_dw();
286 inline void _mov_bd8();
287 inline void _mov_wd16();
288 inline void _enter();
289 inline void _leav(); // _leave()
290 inline void _retf_d16();
296 inline void _rotshft_b();
297 inline void _rotshft_w();
298 inline void _rotshft_bcl();
299 inline void _rotshft_wcl();
302 inline void _setalc();
304 inline void _escape();
305 inline void _loopne();
306 inline void _loope();
311 inline void _outal();
312 inline void _outax();
313 inline void _call_d16();
314 inline void _jmp_d16();
315 inline void _jmp_far();
316 inline void _jmp_d8();
317 inline void _inaldx();
318 inline void _inaxdx();
319 inline void _outdxal();
320 inline void _outdxax();
322 inline void _rep(int flagval);
323 inline void _repne();
327 inline void _f6pre();
328 inline void _f7pre();
335 inline void _fepre();
336 inline void _ffpre();
337 inline void _invalid();
340 I86(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
343 #ifdef SINGLE_MODE_DMA
348 set_device_name(_T("i8086 CPU"));
350 set_device_name(_T("i80186 CPU"));
359 void write_signal(int id, uint32_t data, uint32_t mask);
360 void set_intr_line(bool line, bool pending, uint32_t bit);
361 void set_extra_clock(int clock)
363 extra_icount += clock;
365 int get_extra_clock()
373 uint32_t get_next_pc()
382 uint32_t get_debug_prog_addr_mask()
386 uint32_t get_debug_data_addr_mask()
390 void write_debug_data8(uint32_t addr, uint32_t data);
391 uint32_t read_debug_data8(uint32_t addr);
392 void write_debug_data16(uint32_t addr, uint32_t data);
393 uint32_t read_debug_data16(uint32_t addr);
394 void write_debug_io8(uint32_t addr, uint32_t data);
395 uint32_t read_debug_io8(uint32_t addr);
396 void write_debug_io16(uint32_t addr, uint32_t data);
397 uint32_t read_debug_io16(uint32_t addr);
398 bool write_debug_reg(const _TCHAR *reg, uint32_t data);
399 void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
400 int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
402 void save_state(FILEIO* state_fio);
403 bool load_state(FILEIO* state_fio);
406 void set_context_mem(DEVICE* device)
410 void set_context_io(DEVICE* device)
414 void set_context_intr(DEVICE* device)
418 void set_context_bios(DEVICE* device)
422 #ifdef SINGLE_MODE_DMA
423 void set_context_dma(DEVICE* device)
429 void set_context_debugger(DEBUGGER* device)
435 #endif // USE_SHARED_DLL