OSDN Git Service

[Qt][OpenGL][WIP] GL4.3: Implementing texture buffer with mapping.
[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 #if defined(USE_SHARED_DLL)
14 #include "libcpu_newdev/i86.h"
15 #else
16
17 #include "vm.h"
18 #include "../emu.h"
19 #include "device.h"
20
21 #define SIG_I86_TEST    0
22
23 #ifdef USE_DEBUGGER
24 class DEBUGGER;
25 #endif
26
27 class I86 : public DEVICE
28 {
29 private:
30         /* ---------------------------------------------------------------------------
31         contexts
32         --------------------------------------------------------------------------- */
33         
34         DEVICE *d_mem, *d_io, *d_pic, *d_bios;
35 #ifdef SINGLE_MODE_DMA
36         DEVICE *d_dma;
37 #endif
38 #ifdef USE_DEBUGGER
39         DEBUGGER *d_debugger;
40         DEVICE *d_mem_stored, *d_io_stored;
41 #endif
42         
43         /* ---------------------------------------------------------------------------
44         registers
45         --------------------------------------------------------------------------- */
46         
47         union REGTYPE {
48                 uint16_t w[8]; /* viewed as 16 bits registers */
49                 uint8_t b[16]; /* or as 8 bit registers       */
50         } regs;
51         uint32_t pc;
52         uint32_t prevpc;
53         uint32_t base[4];
54         uint16_t sregs[4];
55         uint16_t flags;
56         int32_t AuxVal, OverVal, SignVal, ZeroVal, CarryVal, DirVal;
57         uint8_t ParityVal;
58         uint8_t TF, IF, MF;
59         
60         int int_state;
61         bool test_state;
62         bool busreq, halted;
63         
64         int icount;
65         int extra_icount;
66         
67         bool seg_prefix;        /* prefix segment indicator */
68         uint8_t prefix_seg;     /* The prefixed segment */
69         unsigned ea;
70         uint16_t eo;            /* effective offset of the address (before segment is added) */
71         uint8_t ea_seg;         /* effective segment of the address */
72         
73         /* ---------------------------------------------------------------------------
74         opecode
75         --------------------------------------------------------------------------- */
76         
77         // sub
78         void interrupt(int num);
79         void trap();
80         unsigned GetEA(unsigned ModRM);
81         void rotate_shift_byte(unsigned ModRM, unsigned cnt);
82         void rotate_shift_word(unsigned ModRM, unsigned cnt);
83         
84         // opecode
85         void run_one_opecode();
86 #ifdef USE_DEBUGGER
87         void run_one_opecode_debugger();
88 #endif
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();
105 #if defined(HAS_V30)
106         inline void _0fpre();
107 #endif
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();
130         inline void _es();
131         inline void _daa();
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();
138         inline void _cs();
139         inline void _das();
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();
146         inline void _ss();
147         inline void _aaa();
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();
154         inline void _ds();
155         inline void _aas();
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();
189         inline void _popa();
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();
196         inline void _insb();
197         inline void _insw();
198         inline void _outsb();
199         inline void _outsw();
200         inline void _jo();
201         inline void _jno();
202         inline void _jb();
203         inline void _jnb();
204         inline void _jz();
205         inline void _jnz();
206         inline void _jbe();
207         inline void _jnbe();
208         inline void _js();
209         inline void _jns();
210         inline void _jp();
211         inline void _jnp();
212         inline void _jl();
213         inline void _jnl();
214         inline void _jle();
215         inline void _jnle();
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();
229         inline void _lea();
230         inline void _mov_sregw();
231         inline void _popw();
232         inline void _nop();
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();
240         inline void _cbw();
241         inline void _cwd();
242         inline void _call_far();
243         inline void _wait();
244         inline void _pushf();
245         inline void _popf();
246         inline void _sahf();
247         inline void _lahf();
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();
283         inline void _ret();
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();
291         inline void _retf();
292         inline void _int3();
293         inline void _int();
294         inline void _into();
295         inline void _iret();
296         inline void _rotshft_b();
297         inline void _rotshft_w();
298         inline void _rotshft_bcl();
299         inline void _rotshft_wcl();
300         inline void _aam();
301         inline void _aad();
302         inline void _setalc();
303         inline void _xlat();
304         inline void _escape();
305         inline void _loopne();
306         inline void _loope();
307         inline void _loop();
308         inline void _jcxz();
309         inline void _inal();
310         inline void _inax();
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();
321         inline void _lock();
322         inline void _rep(int flagval);
323         inline void _repne();
324         inline void _repe();
325         inline void _hlt();
326         inline void _cmc();
327         inline void _f6pre();
328         inline void _f7pre();
329         inline void _clc();
330         inline void _stc();
331         inline void _cli();
332         inline void _sti();
333         inline void _cld();
334         inline void _std();
335         inline void _fepre();
336         inline void _ffpre();
337         inline void _invalid();
338         
339 public:
340         I86(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
341         {
342                 d_bios = NULL;
343 #ifdef SINGLE_MODE_DMA
344                 d_dma = NULL;
345 #endif
346                 busreq = false;
347 #if defined(HAS_I86)
348                 set_device_name(_T("i8086 CPU"));
349 #else
350                 set_device_name(_T("i80186 CPU"));
351 #endif          
352         }
353         ~I86() {}
354         
355         // common functions
356         void initialize();
357         void reset();
358         int run(int clock);
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)
362         {
363                 extra_icount += clock;
364         }
365         int get_extra_clock()
366         {
367                 return extra_icount;
368         }
369         uint32_t get_pc()
370         {
371                 return prevpc;
372         }
373         uint32_t get_next_pc()
374         {
375                 return pc;
376         }
377 #ifdef USE_DEBUGGER
378         void *get_debugger()
379         {
380                 return d_debugger;
381         }
382         uint32_t get_debug_prog_addr_mask()
383         {
384                 return 0xfffff;
385         }
386         uint32_t get_debug_data_addr_mask()
387         {
388                 return 0xfffff;
389         }
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);
401 #endif
402         void save_state(FILEIO* state_fio);
403         bool load_state(FILEIO* state_fio);
404         
405         // unique function
406         void set_context_mem(DEVICE* device)
407         {
408                 d_mem = device;
409         }
410         void set_context_io(DEVICE* device)
411         {
412                 d_io = device;
413         }
414         void set_context_intr(DEVICE* device)
415         {
416                 d_pic = device;
417         }
418         void set_context_bios(DEVICE* device)
419         {
420                 d_bios = device;
421         }
422 #ifdef SINGLE_MODE_DMA
423         void set_context_dma(DEVICE* device)
424         {
425                 d_dma = device;
426         }
427 #endif
428 #ifdef USE_DEBUGGER
429         void set_context_debugger(DEBUGGER* device)
430         {
431                 d_debugger = device;
432         }
433 #endif
434 };
435 #endif // USE_SHARED_DLL
436 #endif