OSDN Git Service

[VM][General] Merge upstream 2015-08-25.
[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 #ifndef TRUE
19 # define TRUE 1
20 #endif
21 #ifndef FALSE
22 # define FALSE 0
23 #endif
24
25 #define SIG_I86_TEST    0
26
27 #ifdef USE_DEBUGGER
28 class DEBUGGER;
29 #endif
30
31 class I86 : public DEVICE
32 {
33 private:
34         /* ---------------------------------------------------------------------------
35         contexts
36         --------------------------------------------------------------------------- */
37         
38         DEVICE *d_mem, *d_io, *d_pic, *d_bios;
39 #ifdef SINGLE_MODE_DMA
40         DEVICE *d_dma;
41 #endif
42 #ifdef USE_DEBUGGER
43         DEBUGGER *d_debugger;
44         DEVICE *d_mem_stored, *d_io_stored;
45 #endif
46         
47         /* ---------------------------------------------------------------------------
48         registers
49         --------------------------------------------------------------------------- */
50         
51         union REGTYPE {
52                 uint16 w[8]; /* viewed as 16 bits registers */
53                 uint8 b[16]; /* or as 8 bit registers       */
54         } regs;
55         uint32 pc;
56         uint32 prevpc;
57         uint32 base[4];
58         uint16 sregs[4];
59         uint16 flags;
60         int32 AuxVal, OverVal, SignVal, ZeroVal, CarryVal, DirVal;
61         uint8 ParityVal;
62         uint8 TF, IF, MF;
63         
64         int int_state;
65         bool test_state;
66         bool busreq, halted;
67         
68         int icount;
69         int extra_icount;
70         
71         bool seg_prefix;        /* prefix segment indicator */
72         uint8 prefix_seg;       /* The prefixed segment */
73         unsigned ea;
74         uint16 eo;              /* effective offset of the address (before segment is added) */
75         uint8 ea_seg;           /* effective segment of the address */
76
77 #if defined(_USE_AGAR) || defined(_USE_SDL) || defined(_USE_QT)
78        int max(int a, int b) {
79          if(a > b) return a;
80          return b;
81        }
82        int min(int a, int b) {
83          if(a < b) return a;
84          return b;
85        }
86 #endif   
87    
88         /* ---------------------------------------------------------------------------
89         opecode
90         --------------------------------------------------------------------------- */
91         
92         // sub
93         void interrupt(int num);
94         void trap();
95         unsigned GetEA(unsigned ModRM);
96         void rotate_shift_byte(unsigned ModRM, unsigned cnt);
97         void rotate_shift_word(unsigned ModRM, unsigned cnt);
98         
99         // opecode
100         void run_one_opecode();
101 #ifdef USE_DEBUGGER
102         void run_one_opecode_debugger();
103 #endif
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();
120 #if defined(HAS_V30)
121         inline void _0fpre();
122 #endif
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();
145         inline void _es();
146         inline void _daa();
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();
153         inline void _cs();
154         inline void _das();
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();
161         inline void _ss();
162         inline void _aaa();
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();
169         inline void _ds();
170         inline void _aas();
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();
204         inline void _popa();
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();
211         inline void _insb();
212         inline void _insw();
213         inline void _outsb();
214         inline void _outsw();
215         inline void _jo();
216         inline void _jno();
217         inline void _jb();
218         inline void _jnb();
219         inline void _jz();
220         inline void _jnz();
221         inline void _jbe();
222         inline void _jnbe();
223         inline void _js();
224         inline void _jns();
225         inline void _jp();
226         inline void _jnp();
227         inline void _jl();
228         inline void _jnl();
229         inline void _jle();
230         inline void _jnle();
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();
244         inline void _lea();
245         inline void _mov_sregw();
246         inline void _popw();
247         inline void _nop();
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();
255         inline void _cbw();
256         inline void _cwd();
257         inline void _call_far();
258         inline void _wait();
259         inline void _pushf();
260         inline void _popf();
261         inline void _sahf();
262         inline void _lahf();
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();
298         inline void _ret();
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();
306         inline void _retf();
307         inline void _int3();
308         inline void _int();
309         inline void _into();
310         inline void _iret();
311         inline void _rotshft_b();
312         inline void _rotshft_w();
313         inline void _rotshft_bcl();
314         inline void _rotshft_wcl();
315         inline void _aam();
316         inline void _aad();
317         inline void _setalc();
318         inline void _xlat();
319         inline void _escape();
320         inline void _loopne();
321         inline void _loope();
322         inline void _loop();
323         inline void _jcxz();
324         inline void _inal();
325         inline void _inax();
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();
336         inline void _lock();
337         inline void _rep(int flagval);
338         inline void _repne();
339         inline void _repe();
340         inline void _hlt();
341         inline void _cmc();
342         inline void _f6pre();
343         inline void _f7pre();
344         inline void _clc();
345         inline void _stc();
346         inline void _cli();
347         inline void _sti();
348         inline void _cld();
349         inline void _std();
350         inline void _fepre();
351         inline void _ffpre();
352         inline void _invalid();
353         
354 public:
355         I86(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
356         {
357                 d_bios = NULL;
358 #ifdef SINGLE_MODE_DMA
359                 d_dma = NULL;
360 #endif
361                 busreq = false;
362         }
363         ~I86() {}
364         
365         // common functions
366         void initialize();
367         void reset();
368         int run(int clock);
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)
372         {
373                 extra_icount += clock;
374         }
375         int get_extra_clock()
376         {
377                 return extra_icount;
378         }
379         uint32 get_pc()
380         {
381                 return prevpc;
382         }
383         uint32 get_next_pc()
384         {
385                 return pc;
386         }
387 #ifdef USE_DEBUGGER
388         void *get_debugger()
389         {
390                 return d_debugger;
391         }
392         uint32 debug_prog_addr_mask()
393         {
394                 return 0xfffff;
395         }
396         uint32 debug_data_addr_mask()
397         {
398                 return 0xfffff;
399         }
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);
411 #endif
412         void save_state(FILEIO* state_fio);
413         bool load_state(FILEIO* state_fio);
414         
415         // unique function
416         void set_context_mem(DEVICE* device)
417         {
418                 d_mem = device;
419         }
420         void set_context_io(DEVICE* device)
421         {
422                 d_io = device;
423         }
424         void set_context_intr(DEVICE* device)
425         {
426                 d_pic = device;
427         }
428         void set_context_bios(DEVICE* device)
429         {
430                 d_bios = device;
431         }
432 #ifdef SINGLE_MODE_DMA
433         void set_context_dma(DEVICE* device)
434         {
435                 d_dma = device;
436         }
437 #endif
438 #ifdef USE_DEBUGGER
439         void set_context_debugger(DEBUGGER* device)
440         {
441                 d_debugger = device;
442         }
443 #endif
444 };
445
446 #endif