OSDN Git Service

[VM][General][WIP] Apply new (Upstream 2016-02-21) APIs to VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / i86.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : MAME 0.142
5         Author : Takeda.Toshiya
6         Date  : 2011.04.23-
7
8         [ 80x86 ]
9 */
10
11 #ifndef _I86_H_ 
12 #define _I86_H_
13
14 #include "vm.h"
15 #include "../emu.h"
16 #include "device.h"
17
18 #define SIG_I86_TEST    0
19
20 #ifdef USE_DEBUGGER
21 class DEBUGGER;
22 #endif
23
24 class I86 : public DEVICE
25 {
26 private:
27         /* ---------------------------------------------------------------------------
28         contexts
29         --------------------------------------------------------------------------- */
30         
31         DEVICE *d_mem, *d_io, *d_pic, *d_bios;
32 #ifdef SINGLE_MODE_DMA
33         DEVICE *d_dma;
34 #endif
35 #ifdef USE_DEBUGGER
36         DEBUGGER *d_debugger;
37         DEVICE *d_mem_stored, *d_io_stored;
38 #endif
39         
40         /* ---------------------------------------------------------------------------
41         registers
42         --------------------------------------------------------------------------- */
43         
44         union REGTYPE {
45                 uint16 w[8]; /* viewed as 16 bits registers */
46                 uint8 b[16]; /* or as 8 bit registers       */
47         } regs;
48         uint32 pc;
49         uint32 prevpc;
50         uint32 base[4];
51         uint16 sregs[4];
52         uint16 flags;
53         int32 AuxVal, OverVal, SignVal, ZeroVal, CarryVal, DirVal;
54         uint8 ParityVal;
55         uint8 TF, IF, MF;
56         
57         int int_state;
58         bool test_state;
59         bool busreq, halted;
60         
61         int icount;
62         int extra_icount;
63         
64         bool seg_prefix;        /* prefix segment indicator */
65         uint8 prefix_seg;       /* The prefixed segment */
66         unsigned ea;
67         uint16 eo;              /* effective offset of the address (before segment is added) */
68         uint8 ea_seg;           /* effective segment of the address */
69         
70         /* ---------------------------------------------------------------------------
71         opecode
72         --------------------------------------------------------------------------- */
73         
74         // sub
75         void interrupt(int num);
76         void trap();
77         unsigned GetEA(unsigned ModRM);
78         void rotate_shift_byte(unsigned ModRM, unsigned cnt);
79         void rotate_shift_word(unsigned ModRM, unsigned cnt);
80         
81         // opecode
82         void run_one_opecode();
83 #ifdef USE_DEBUGGER
84         void run_one_opecode_debugger();
85 #endif
86         void instruction(uint8 code);
87         inline void _add_br8();
88         inline void _add_wr16();
89         inline void _add_r8b();
90         inline void _add_r16w();
91         inline void _add_ald8();
92         inline void _add_axd16();
93         inline void _push_es();
94         inline void _pop_es();
95         inline void _or_br8();
96         inline void _or_wr16();
97         inline void _or_r8b();
98         inline void _or_r16w();
99         inline void _or_ald8();
100         inline void _or_axd16();
101         inline void _push_cs();
102 #if defined(HAS_V30)
103         inline void _0fpre();
104 #endif
105         inline void _adc_br8();
106         inline void _adc_wr16();
107         inline void _adc_r8b();
108         inline void _adc_r16w();
109         inline void _adc_ald8();
110         inline void _adc_axd16();
111         inline void _push_ss();
112         inline void _pop_ss();
113         inline void _sbb_br8();
114         inline void _sbb_wr16();
115         inline void _sbb_r8b();
116         inline void _sbb_r16w();
117         inline void _sbb_ald8();
118         inline void _sbb_axd16();
119         inline void _push_ds();
120         inline void _pop_ds();
121         inline void _and_br8();
122         inline void _and_wr16();
123         inline void _and_r8b();
124         inline void _and_r16w();
125         inline void _and_ald8();
126         inline void _and_axd16();
127         inline void _es();
128         inline void _daa();
129         inline void _sub_br8();
130         inline void _sub_wr16();
131         inline void _sub_r8b();
132         inline void _sub_r16w();
133         inline void _sub_ald8();
134         inline void _sub_axd16();
135         inline void _cs();
136         inline void _das();
137         inline void _xor_br8();
138         inline void _xor_wr16();
139         inline void _xor_r8b();
140         inline void _xor_r16w();
141         inline void _xor_ald8();
142         inline void _xor_axd16();
143         inline void _ss();
144         inline void _aaa();
145         inline void _cmp_br8();
146         inline void _cmp_wr16();
147         inline void _cmp_r8b();
148         inline void _cmp_r16w();
149         inline void _cmp_ald8();
150         inline void _cmp_axd16();
151         inline void _ds();
152         inline void _aas();
153         inline void _inc_ax();
154         inline void _inc_cx();
155         inline void _inc_dx();
156         inline void _inc_bx();
157         inline void _inc_sp();
158         inline void _inc_bp();
159         inline void _inc_si();
160         inline void _inc_di();
161         inline void _dec_ax();
162         inline void _dec_cx();
163         inline void _dec_dx();
164         inline void _dec_bx();
165         inline void _dec_sp();
166         inline void _dec_bp();
167         inline void _dec_si();
168         inline void _dec_di();
169         inline void _push_ax();
170         inline void _push_cx();
171         inline void _push_dx();
172         inline void _push_bx();
173         inline void _push_sp();
174         inline void _push_bp();
175         inline void _push_si();
176         inline void _push_di();
177         inline void _pop_ax();
178         inline void _pop_cx();
179         inline void _pop_dx();
180         inline void _pop_bx();
181         inline void _pop_sp();
182         inline void _pop_bp();
183         inline void _pop_si();
184         inline void _pop_di();
185         inline void _pusha();
186         inline void _popa();
187         inline void _bound();
188         inline void _repc(int flagval);
189         inline void _push_d16();
190         inline void _imul_d16();
191         inline void _push_d8();
192         inline void _imul_d8();
193         inline void _insb();
194         inline void _insw();
195         inline void _outsb();
196         inline void _outsw();
197         inline void _jo();
198         inline void _jno();
199         inline void _jb();
200         inline void _jnb();
201         inline void _jz();
202         inline void _jnz();
203         inline void _jbe();
204         inline void _jnbe();
205         inline void _js();
206         inline void _jns();
207         inline void _jp();
208         inline void _jnp();
209         inline void _jl();
210         inline void _jnl();
211         inline void _jle();
212         inline void _jnle();
213         inline void _80pre();
214         inline void _81pre();
215         inline void _82pre();
216         inline void _83pre();
217         inline void _test_br8();
218         inline void _test_wr16();
219         inline void _xchg_br8();
220         inline void _xchg_wr16();
221         inline void _mov_br8();
222         inline void _mov_wr16();
223         inline void _mov_r8b();
224         inline void _mov_r16w();
225         inline void _mov_wsreg();
226         inline void _lea();
227         inline void _mov_sregw();
228         inline void _popw();
229         inline void _nop();
230         inline void _xchg_axcx();
231         inline void _xchg_axdx();
232         inline void _xchg_axbx();
233         inline void _xchg_axsp();
234         inline void _xchg_axbp();
235         inline void _xchg_axsi();
236         inline void _xchg_axdi();
237         inline void _cbw();
238         inline void _cwd();
239         inline void _call_far();
240         inline void _wait();
241         inline void _pushf();
242         inline void _popf();
243         inline void _sahf();
244         inline void _lahf();
245         inline void _mov_aldisp();
246         inline void _mov_axdisp();
247         inline void _mov_dispal();
248         inline void _mov_dispax();
249         inline void _movsb();
250         inline void _movsw();
251         inline void _cmpsb();
252         inline void _cmpsw();
253         inline void _test_ald8();
254         inline void _test_axd16();
255         inline void _stosb();
256         inline void _stosw();
257         inline void _lodsb();
258         inline void _lodsw();
259         inline void _scasb();
260         inline void _scasw();
261         inline void _mov_ald8();
262         inline void _mov_cld8();
263         inline void _mov_dld8();
264         inline void _mov_bld8();
265         inline void _mov_ahd8();
266         inline void _mov_chd8();
267         inline void _mov_dhd8();
268         inline void _mov_bhd8();
269         inline void _mov_axd16();
270         inline void _mov_cxd16();
271         inline void _mov_dxd16();
272         inline void _mov_bxd16();
273         inline void _mov_spd16();
274         inline void _mov_bpd16();
275         inline void _mov_sid16();
276         inline void _mov_did16();
277         inline void _rotshft_bd8();
278         inline void _rotshft_wd8();
279         inline void _ret_d16();
280         inline void _ret();
281         inline void _les_dw();
282         inline void _lds_dw();
283         inline void _mov_bd8();
284         inline void _mov_wd16();
285         inline void _enter();
286         inline void _leav();    // _leave()
287         inline void _retf_d16();
288         inline void _retf();
289         inline void _int3();
290         inline void _int();
291         inline void _into();
292         inline void _iret();
293         inline void _rotshft_b();
294         inline void _rotshft_w();
295         inline void _rotshft_bcl();
296         inline void _rotshft_wcl();
297         inline void _aam();
298         inline void _aad();
299         inline void _setalc();
300         inline void _xlat();
301         inline void _escape();
302         inline void _loopne();
303         inline void _loope();
304         inline void _loop();
305         inline void _jcxz();
306         inline void _inal();
307         inline void _inax();
308         inline void _outal();
309         inline void _outax();
310         inline void _call_d16();
311         inline void _jmp_d16();
312         inline void _jmp_far();
313         inline void _jmp_d8();
314         inline void _inaldx();
315         inline void _inaxdx();
316         inline void _outdxal();
317         inline void _outdxax();
318         inline void _lock();
319         inline void _rep(int flagval);
320         inline void _repne();
321         inline void _repe();
322         inline void _hlt();
323         inline void _cmc();
324         inline void _f6pre();
325         inline void _f7pre();
326         inline void _clc();
327         inline void _stc();
328         inline void _cli();
329         inline void _sti();
330         inline void _cld();
331         inline void _std();
332         inline void _fepre();
333         inline void _ffpre();
334         inline void _invalid();
335         
336 public:
337         I86(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
338         {
339                 d_bios = NULL;
340 #ifdef SINGLE_MODE_DMA
341                 d_dma = NULL;
342 #endif
343                 busreq = false;
344         }
345         ~I86() {}
346         
347         // common functions
348         void initialize();
349         void reset();
350         int run(int clock);
351         void write_signal(int id, uint32 data, uint32 mask);
352         void set_intr_line(bool line, bool pending, uint32 bit);
353         void set_extra_clock(int clock)
354         {
355                 extra_icount += clock;
356         }
357         int get_extra_clock()
358         {
359                 return extra_icount;
360         }
361         uint32 get_pc()
362         {
363                 return prevpc;
364         }
365         uint32 get_next_pc()
366         {
367                 return pc;
368         }
369 #ifdef USE_DEBUGGER
370         void *get_debugger()
371         {
372                 return d_debugger;
373         }
374         uint32 get_debug_prog_addr_mask()
375         {
376                 return 0xfffff;
377         }
378         uint32 get_debug_data_addr_mask()
379         {
380                 return 0xfffff;
381         }
382         void write_debug_data8(uint32 addr, uint32 data);
383         uint32 read_debug_data8(uint32 addr);
384         void write_debug_data16(uint32 addr, uint32 data);
385         uint32 read_debug_data16(uint32 addr);
386         void write_debug_io8(uint32 addr, uint32 data);
387         uint32 read_debug_io8(uint32 addr);
388         void write_debug_io16(uint32 addr, uint32 data);
389         uint32 read_debug_io16(uint32 addr);
390         bool write_debug_reg(const _TCHAR *reg, uint32 data);
391         void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
392         int debug_dasm(uint32 pc, _TCHAR *buffer, size_t buffer_len);
393 #endif
394         void save_state(FILEIO* state_fio);
395         bool load_state(FILEIO* state_fio);
396         
397         // unique function
398         void set_context_mem(DEVICE* device)
399         {
400                 d_mem = device;
401         }
402         void set_context_io(DEVICE* device)
403         {
404                 d_io = device;
405         }
406         void set_context_intr(DEVICE* device)
407         {
408                 d_pic = device;
409         }
410         void set_context_bios(DEVICE* device)
411         {
412                 d_bios = device;
413         }
414 #ifdef SINGLE_MODE_DMA
415         void set_context_dma(DEVICE* device)
416         {
417                 d_dma = device;
418         }
419 #endif
420 #ifdef USE_DEBUGGER
421         void set_context_debugger(DEBUGGER* device)
422         {
423                 d_debugger = device;
424         }
425 #endif
426 };
427
428 #endif