OSDN Git Service

[VM][DEVICE][I386] Add bios_call_far_ia32() and bios_int_ia32() because BIOS calling...
[csp-qt/common_source_project-fm7.git] / source / src / vm / mc6800.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : MAME 0.142
5         Author : Takeda.Toshiya
6         Date  : 2011.04.23-
7
8         [ MC6800 ]
9 */
10
11 #ifndef _MC6800_H_ 
12 #define _MC6800_H_
13
14 //#include "vm.h"
15 //#include "../emu.h"
16 #include "device.h"
17
18 //#if defined(HAS_MC6801) || defined(HAS_HD6301)
19 //#define SIG_MC6801_PORT_1     0
20 //#define SIG_MC6801_PORT_2     1
21 //#define SIG_MC6801_PORT_3     2
22 //#define SIG_MC6801_PORT_4     3
23 //#define SIG_MC6801_PORT_3_SC1 4
24 //#define SIG_MC6801_PORT_3_SC2 5
25 //#define SIG_MC6801_SIO_RECV   6
26
27 //class FIFO;
28 //#endif
29
30 //#ifdef USE_DEBUGGER
31 class DEBUGGER;
32 //#endif
33
34 class MC6800 : public DEVICE
35 {
36 private:
37
38 protected:
39         DEVICE *d_mem;
40 //#ifdef USE_DEBUGGER
41         DEBUGGER *d_debugger;
42         DEVICE *d_mem_stored;
43 //#endif
44         static const uint8_t flags8i[256];
45         static const uint8_t flags8d[256];
46 #define XX 5 // invalid opcode unknown cc
47         const uint8_t cycles[256] = {
48 //#if defined(HAS_MC6800)
49                 XX, 2,XX,XX,XX,XX, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2,
50                 2, 2,XX,XX,XX,XX, 2, 2,XX, 2,XX, 2,XX,XX,XX,XX,
51                 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
52                 4, 4, 4, 4, 4, 4, 4, 4,XX, 5,XX,10,XX,XX, 9,12,
53                 2,XX,XX, 2, 2,XX, 2, 2, 2, 2, 2,XX, 2, 2,XX, 2,
54                 2,XX,XX, 2, 2,XX, 2, 2, 2, 2, 2,XX, 2, 2,XX, 2,
55                 7,XX,XX, 7, 7,XX, 7, 7, 7, 7, 7,XX, 7, 7, 4, 7,
56                 6,XX,XX, 6, 6,XX, 6, 6, 6, 6, 6,XX, 6, 6, 3, 6,
57                 2, 2, 2,XX, 2, 2, 2, 3, 2, 2, 2, 2, 3, 8, 3, 4,
58                 3, 3, 3,XX, 3, 3, 3, 4, 3, 3, 3, 3, 4, 6, 4, 5,
59                 5, 5, 5,XX, 5, 5, 5, 6, 5, 5, 5, 5, 6, 8, 6, 7,
60                 4, 4, 4,XX, 4, 4, 4, 5, 4, 4, 4, 4, 5, 9, 5, 6,
61                 2, 2, 2,XX, 2, 2, 2, 3, 2, 2, 2, 2,XX,XX, 3, 4,
62                 3, 3, 3,XX, 3, 3, 3, 4, 3, 3, 3, 3,XX,XX, 4, 5,
63                 5, 5, 5,XX, 5, 5, 5, 6, 5, 5, 5, 5,XX,XX, 6, 7,
64                 4, 4, 4,XX, 4, 4, 4, 5, 4, 4, 4, 4,XX,XX, 5, 6
65         };
66 #undef XX // invalid opcode unknown cc
67         
68         pair32_t pc;
69         uint16_t prevpc;
70         pair32_t sp;
71         pair32_t ix;
72         pair32_t acc_d;
73         pair32_t ea;
74         
75         uint8_t cc;
76         int wai_state;
77         int int_state;
78         
79
80         uint64_t total_icount;
81         uint64_t prev_total_icount;
82
83         int icount;
84         bool one_more_insn;
85         
86         virtual uint32_t RM(uint32_t Addr);
87         virtual void WM(uint32_t Addr, uint32_t Value);
88         uint32_t RM16(uint32_t Addr);
89         void WM16(uint32_t Addr, pair32_t *p);
90         
91         
92         virtual void increment_counter(int amount);
93         virtual void run_one_opecode();
94         void enter_interrupt(uint16_t irq_vector);
95         virtual void insn(uint8_t code);
96         
97         void aba();
98         void adca_di();
99         void adca_ex();
100         void adca_im();
101         void adca_ix();
102         void adcb_di();
103         void adcb_ex();
104         void adcb_im();
105         void adcb_ix();
106         void adda_di();
107         void adda_ex();
108         void adda_im();
109         void adda_ix();
110         void addb_di();
111         void addb_ex();
112         void addb_im();
113         void addb_ix();
114
115         void anda_di();
116         void anda_ex();
117         void anda_im();
118         void anda_ix();
119         void andb_di();
120         void andb_ex();
121         void andb_im();
122         void andb_ix();
123         void asl_ex();
124         void asl_ix();
125         void asla();
126         void aslb();
127
128         void asr_ex();
129         void asr_ix();
130         void asra();
131         void asrb();
132         void bcc();
133         void bcs();
134         void beq();
135         void bge();
136         void bgt();
137         void bhi();
138         void bita_di();
139         void bita_ex();
140         void bita_im();
141         void bita_ix();
142         void bitb_di();
143         void bitb_ex();
144         void bitb_im();
145         void bitb_ix();
146         void ble();
147         void bls();
148         void blt();
149         void bmi();
150         void bne();
151         void bpl();
152         void bra();
153         void brn();
154         void bsr();
155         void bvc();
156         void bvs();
157         void cba();
158         void clc();
159         void cli();
160         void clr_ex();
161         void clr_ix();
162         void clra();
163         void clrb();
164         void clv();
165         void cmpa_di();
166         void cmpa_ex();
167         void cmpa_im();
168         void cmpa_ix();
169         void cmpb_di();
170         void cmpb_ex();
171         void cmpb_im();
172         void cmpb_ix();
173         void cmpx_di();
174         void cmpx_ex();
175         void cmpx_im();
176         void cmpx_ix();
177         void com_ex();
178         void com_ix();
179         void coma();
180         void comb();
181         void daa();
182         void dec_ex();
183         void dec_ix();
184         void deca();
185         void decb();
186         void des();
187         void dex();
188
189         void eora_di();
190         void eora_ex();
191         void eora_im();
192         void eora_ix();
193         void eorb_di();
194         void eorb_ex();
195         void eorb_im();
196         void eorb_ix();
197         virtual void illegal();
198         void inc_ex();
199         void inc_ix();
200         void inca();
201         void incb();
202         void ins();
203         void inx();
204         void jmp_ex();
205         void jmp_ix();
206         void jsr_di();
207         void jsr_ex();
208         void jsr_ix();
209         void lda_di();
210         void lda_ex();
211         void lda_im();
212         void lda_ix();
213         void ldb_di();
214         void ldb_ex();
215         void ldb_im();
216         void ldb_ix();
217         void lds_di();
218         void lds_ex();
219         void lds_im();
220         void lds_ix();
221         void ldx_di();
222         void ldx_ex();
223         void ldx_im();
224         void ldx_ix();
225         void lsr_ex();
226         void lsr_ix();
227         void lsra();
228         void lsrb();
229         void neg_ex();
230         void neg_ix();
231         void nega();
232         void negb();
233         void nop();
234
235         void ora_di();
236         void ora_ex();
237         void ora_im();
238         void ora_ix();
239         void orb_di();
240         void orb_ex();
241         void orb_im();
242         void orb_ix();
243         void psha();
244         void pshb();
245         void pula();
246         void pulb();
247         void rol_ex();
248         void rol_ix();
249         void rola();
250         void rolb();
251         void ror_ex();
252         void ror_ix();
253         void rora();
254         void rorb();
255         void rti();
256         void rts();
257         void sba();
258         void sbca_di();
259         void sbca_ex();
260         void sbca_im();
261         void sbca_ix();
262         void sbcb_di();
263         void sbcb_ex();
264         void sbcb_im();
265         void sbcb_ix();
266         void sec();
267         void sei();
268         void sev();
269         void sta_di();
270         void sta_ex();
271         void sta_im();
272         void sta_ix();
273         void stb_di();
274         void stb_ex();
275         void stb_im();
276         void stb_ix();
277         void sts_di();
278         void sts_ex();
279         void sts_im();
280         void sts_ix();
281         void stx_di();
282         void stx_ex();
283         void stx_im();
284         void stx_ix();
285         void suba_di();
286         void suba_ex();
287         void suba_im();
288         void suba_ix();
289         void subb_di();
290         void subb_ex();
291         void subb_im();
292         void subb_ix();
293         void swi();
294         void tab();
295         void tap();
296         void tba();
297
298         void tpa();
299         void tst_ex();
300         void tst_ix();
301         void tsta();
302         void tstb();
303         void tsx();
304         void txs();
305         void wai();
306         unsigned Dasm680x(int subtype, _TCHAR *buf, unsigned pc, const UINT8 *oprom, const UINT8 *opram, symbol_t *first_symbol);
307
308         bool __USE_DEBUGGER;
309 public:
310         MC6800(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
311         {
312                 d_mem = NULL;
313                 d_debugger = NULL;
314                 d_mem_stored = NULL;
315                 __USE_DEBUGGER = false;
316 //#if defined(HAS_MC6801) || defined(HAS_HD6301)
317 //              for(int i = 0; i < 4; i++) {
318 //                      initialize_output_signals(&port[i].outputs);
319 //                      port[i].wreg = port[i].rreg = 0;//0xff;
320 //              }
321 //              initialize_output_signals(&outputs_sio);
322 //#endif
323 //#if defined(HAS_MC6801)
324 //              set_device_name(_T("MC6801 MPU"));
325 //#elif defined(HAS_HD6301)
326 //              set_device_name(_T("HD6301 MPU"));
327 //#else
328                 set_device_name(_T("MC6800 MPU"));
329 //#endif
330         }
331         ~MC6800() {}
332         
333         // common functions
334         virtual void initialize();
335         virtual void reset();
336         virtual int run(int clock);
337         
338         virtual void write_signal(int id, uint32_t data, uint32_t mask);
339         uint32_t get_pc()
340         {
341                 return prevpc;
342         }
343         uint32_t get_next_pc()
344         {
345                 return pc.w.l;
346         }
347 //#ifdef USE_DEBUGGER
348         void *get_debugger()
349         {
350                 return d_debugger;
351         }
352         uint32_t get_debug_prog_addr_mask()
353         {
354                 return 0xffff;
355         }
356         uint32_t get_debug_data_addr_mask()
357         {
358                 return 0xffff;
359         }
360         void write_debug_data8(uint32_t addr, uint32_t data);
361         uint32_t read_debug_data8(uint32_t addr);
362         // implement 16bit/32bit functions because this cpu is big endian
363         void write_debug_data16(uint32_t addr, uint32_t data);
364         uint32_t read_debug_data16(uint32_t addr);
365         void write_debug_data32(uint32_t addr, uint32_t data);
366         uint32_t read_debug_data32(uint32_t addr);
367         bool write_debug_reg(const _TCHAR *reg, uint32_t data);
368         bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
369         virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
370 //#endif
371         virtual bool process_state(FILEIO* state_fio, bool loading);
372         
373         // unique functions
374         void set_context_mem(DEVICE* device)
375         {
376                 d_mem = device;
377         }
378 //#ifdef USE_DEBUGGER
379         void set_context_debugger(DEBUGGER* device)
380         {
381                 d_debugger = device;
382         }
383 //#endif
384 };
385
386 #endif
387