OSDN Git Service

[VM][COMMON_VM] Include IO:: class to common_vm.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mc6809.h
1 /*
2         Skelton for retropc emulator
3
4         Origin : MAME 0.142
5         Author : Takeda.Toshiya
6         Date   : 2011.05.06-
7
8         [ MC6809 ]
9 */
10
11 #ifndef _MC6809_H_
12 #define _MC6809_H_
13
14 //#if defined(USE_SHARED_DLL)
15 //#if 0
16 //#include "libcpu_newdev/libcpu_mc6809/mc6809.h"
17 //#else
18 //#include "vm.h"
19 //#include "../emu.h"
20 #include "device.h"
21 #include "mc6809_consts.h"
22
23 enum {
24         MC6809_PHASE_RUN = 0,
25         MC6809_PHASE_PUSH_STACK,
26         MC6809_PHASE_FETCH_VECTOR,
27         MC6809_PHASE_DEAD_CYCLE,
28
29         MC6809_PHASE_REQ_HALT,
30         MC6809_PHASE_DO_HALT,
31 };
32
33
34 // Note: Below is ugly hack cause of CPU#0 cannot modify clock.
35 class VM;
36 class EMU;
37 class DEBUGGER;
38 class MC6809_BASE : public DEVICE
39 {
40 protected:
41         // context
42         DEVICE *d_mem;
43
44         DEBUGGER *d_debugger;
45         DEVICE *d_mem_stored;
46         int dasm_ptr;
47
48         outputs_t outputs_bus_ba; // Bus available.
49         outputs_t outputs_bus_bs; // Bus status.
50
51         // registers
52         pair32_t pc;    /* Program counter */
53         pair32_t ppc;   /* Previous program counter */
54         pair32_t acc;   /* Accumulator a and b */
55         pair32_t dp;    /* Direct Page register (page in MSB) */
56         pair32_t u, s;  /* Stack pointers */
57         pair32_t x, y;  /* Index registers */
58         uint8_t cc;
59         pair32_t ea;    /* effective address */
60         
61         uint32_t int_state;
62         /* In Motorola's datasheet, status has some valiants. 20171207 K.O */
63         
64         bool req_halt_on;
65         bool req_halt_off;
66         bool busreq;
67
68         uint32_t waitfactor;
69         uint32_t waitcount;
70         uint64_t total_icount;
71         uint64_t prev_total_icount;
72
73         int icount;
74         int extra_icount;
75         void __FASTCALL WM16(uint32_t Addr, pair32_t *p);
76         void __FASTCALL cpu_irq_push(void);
77         void __FASTCALL cpu_firq_push(void);
78         void __FASTCALL cpu_nmi_push(void);
79         void __FASTCALL cpu_irq_fetch_vector_address(void);
80         void __FASTCALL cpu_firq_fetch_vector_address(void);
81         void __FASTCALL cpu_nmi_fetch_vector_address(void);
82         void __FASTCALL cpu_wait(int clocks = 1);
83         // Tables
84 /* increment */
85         const uint8_t flags8i[256] = {
86                 CC_Z,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
87                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
88                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
89                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
90                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
91                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
92                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
93                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
94                 CC_N|CC_V,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
95                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
96                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
97                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
98                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
99                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
100                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
101                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N
102         };
103         
104 /* decrement */
105         const uint8_t flags8d[256] = {
106                 CC_Z,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
107                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
108                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
109                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
110                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
111                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
112                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
113                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,CC_V,
114                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
115                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
116                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
117                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
118                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
119                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
120                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,
121                 CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N,CC_N
122         };
123         
124         /* FIXME: Cycles differ slighly from hd6309 emulation */
125         const int index_cycle_em[256] = {       /* Index Loopup cycle counts */
126 /*           0xX0, 0xX1, 0xX2, 0xX3, 0xX4, 0xX5, 0xX6, 0xX7, 0xX8, 0xX9, 0xXA, 0xXB, 0xXC, 0xXD, 0xXE, 0xXF */
127                 
128                 /* 0x0X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
129                 /* 0x1X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
130                 /* 0x2X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
131                 /* 0x3X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
132                 /* 0x4X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
133                 /* 0x5X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
134                 /* 0x6X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
135                 /* 0x7X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
136                 /* 0x8X */ 2, 3, 2, 3, 0, 1, 1, 1, 1, 4, 0, 4, 1, 5, 0, 2,
137                 /* 0x9X */ 5, 6, 5, 6, 3, 4, 4, 4, 4, 7, 3, 7, 4, 8, 3, 3,
138                 /* 0xAX */ 2, 3, 2, 3, 0, 1, 1, 1, 1, 4, 0, 4, 1, 5, 0, 2,
139                 /* 0xBX */ 5, 6, 5, 6, 3, 4, 4, 4, 4, 7, 3, 7, 4, 8, 3, 5,
140                 /* 0xCX */ 2, 3, 2, 3, 0, 1, 1, 1, 1, 4, 0, 4, 1, 5, 0, 2,
141                 /* 0xDX */ 5, 6, 5, 6, 3, 4, 4, 4, 4, 7, 3, 7, 4, 8, 3, 5,
142 /* 0xEX */ 2, 3, 2, 3, 0, 1, 1, 1, 1, 4, 0, 4, 1, 5, 0, 2,
143                 /* 0xFX */ 4, 6, 5, 6, 3, 4, 4, 4, 4, 7, 3, 7, 4, 8, 3, 5
144         };
145         
146         /* timings for 1-byte opcodes */
147         /* 20100731 Fix to XM7 */
148         const int cycles1[256] = {
149                 /*     0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F */
150                 /*0 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6,
151                 /*1 */ 0, 0, 2, 2, 0, 0, 5, 9, 3, 2, 3, 2, 3, 2, 8, 6,
152                 /*2 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
153                 /*3 */ 4, 4, 4, 4, 5, 5, 5, 5, 4, 5, 3, 6, 20, 11, 1, 19,
154                 /*4 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
155                 /*5 */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
156                 /*6 */ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6,
157                 /*7 */ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 7,
158                 /*8 */ 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 4, 7, 3, 3,
159                 /*9 */ 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 6, 7, 5, 5,
160                 /*A*/ 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 6, 7, 5, 5,
161                 /*B*/ 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 7, 8, 6, 6,
162                 /*C*/ 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 3, 3,
163                 /*D*/ 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
164                 /*E*/ 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
165                 /*F*/ 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6
166         };
167         // opcodes
168         virtual void __FASTCALL run_one_opecode();
169         void __FASTCALL op(uint8_t ireg);
170         void __FASTCALL fetch_effective_address();
171         void __FASTCALL fetch_effective_address_IDX(uint8_t upper, uint8_t lower);
172         // Useful routines.
173         inline void __FASTCALL BRANCH(bool cond);
174         inline void __FASTCALL LBRANCH(bool cond);
175         
176         inline pair32_t __FASTCALL RM16_PAIR(uint32_t addr);
177         inline uint8_t __FASTCALL GET_INDEXED_DATA(void);
178         inline pair32_t __FASTCALL GET_INDEXED_DATA16(void);
179         
180         inline void __FASTCALL  NEG_MEM(uint8_t a_neg);
181         inline uint8_t __FASTCALL NEG_REG(uint8_t r_neg);
182         inline void __FASTCALL  COM_MEM(uint8_t a_neg);
183         inline uint8_t __FASTCALL COM_REG(uint8_t r_neg);
184         inline void __FASTCALL  LSR_MEM(uint8_t a_neg);
185         inline uint8_t __FASTCALL LSR_REG(uint8_t r_neg);
186         inline void __FASTCALL  ROR_MEM(uint8_t a_neg);
187         inline uint8_t __FASTCALL ROR_REG(uint8_t r_neg);
188         inline void __FASTCALL  ASR_MEM(uint8_t a_neg);
189         inline uint8_t __FASTCALL ASR_REG(uint8_t r_neg);
190         inline void __FASTCALL  ASL_MEM(uint8_t a_neg);
191         inline uint8_t __FASTCALL ASL_REG(uint8_t r_neg);
192         inline void __FASTCALL  ROL_MEM(uint8_t a_neg);
193         inline uint8_t __FASTCALL ROL_REG(uint8_t r_neg);
194         inline void __FASTCALL  DEC_MEM(uint8_t a_neg);
195         inline uint8_t __FASTCALL DEC_REG(uint8_t r_neg);
196         inline void __FASTCALL  DCC_MEM(uint8_t a_neg);
197         inline uint8_t __FASTCALL DCC_REG(uint8_t r_neg);
198         inline void __FASTCALL  INC_MEM(uint8_t a_neg);
199         inline uint8_t __FASTCALL INC_REG(uint8_t r_neg);
200         inline void __FASTCALL  TST_MEM(uint8_t a_neg);
201         inline uint8_t __FASTCALL TST_REG(uint8_t r_neg);
202         inline uint8_t __FASTCALL CLC_REG(uint8_t r_neg);
203         inline void __FASTCALL  CLR_MEM(uint8_t a_neg);
204         inline uint8_t __FASTCALL CLR_REG(uint8_t r_neg);
205         
206         inline uint8_t __FASTCALL SUB8_REG(uint8_t reg, uint8_t data);
207         inline uint8_t __FASTCALL CMP8_REG(uint8_t reg, uint8_t data);
208         inline uint8_t __FASTCALL SBC8_REG(uint8_t reg, uint8_t data);
209         inline uint8_t __FASTCALL AND8_REG(uint8_t reg, uint8_t data);
210         inline uint8_t __FASTCALL BIT8_REG(uint8_t reg, uint8_t data);
211         inline uint8_t __FASTCALL OR8_REG(uint8_t reg, uint8_t data);
212         inline uint8_t __FASTCALL EOR8_REG(uint8_t reg, uint8_t data);
213         inline uint8_t __FASTCALL ADD8_REG(uint8_t reg, uint8_t data);
214         inline uint8_t __FASTCALL ADC8_REG(uint8_t reg, uint8_t data);
215         inline void __FASTCALL  STORE8_REG(uint8_t reg);
216         inline uint8_t __FASTCALL LOAD8_REG(uint8_t reg);
217
218         inline uint16_t SUB16_REG(uint16_t reg, uint16_t data);
219         inline uint16_t ADD16_REG(uint16_t reg, uint16_t data);
220         inline uint16_t CMP16_REG(uint16_t reg, uint16_t data);
221         inline uint16_t LOAD16_REG(uint16_t reg);
222         inline void __FASTCALL STORE16_REG(pair32_t *p);
223  public:
224         void __FASTCALL abx();
225         void __FASTCALL adca_di();
226         void __FASTCALL adca_ex();
227         inline void __FASTCALL adca_im();
228         void __FASTCALL adca_ix();
229         void __FASTCALL adcb_di();
230         void __FASTCALL adcb_ex();
231         void __FASTCALL adcb_im();
232         void __FASTCALL adcb_ix();
233         void __FASTCALL adda_di();
234         void __FASTCALL adda_ex();
235         void __FASTCALL adda_im();
236         void __FASTCALL adda_ix();
237         void __FASTCALL addb_di();
238         void __FASTCALL addb_ex();
239         void __FASTCALL addb_im();
240         void __FASTCALL addb_ix();
241         void __FASTCALL addd_di();
242         void __FASTCALL addd_ex();
243         void __FASTCALL addd_im();
244         void __FASTCALL addd_ix();
245         void __FASTCALL anda_di();
246         void __FASTCALL anda_ex();
247         void __FASTCALL anda_im();
248         void __FASTCALL anda_ix();
249         void __FASTCALL andb_di();
250         void __FASTCALL andb_ex();
251         void __FASTCALL andb_im();
252         void __FASTCALL andb_ix();
253         void __FASTCALL andcc();
254         void __FASTCALL asla();
255         void __FASTCALL aslb();
256         void __FASTCALL aslcc_in();
257         void __FASTCALL asl_di();
258         void __FASTCALL asl_ex();
259         void __FASTCALL asl_ix();
260         void __FASTCALL asra();
261         void __FASTCALL asrb();
262         void __FASTCALL asr_di();
263         void __FASTCALL asr_ex();
264         void __FASTCALL asr_ix();
265         void __FASTCALL bcc();
266         void __FASTCALL bcs();
267         void __FASTCALL beq();
268         void __FASTCALL bge();
269         void __FASTCALL bgt();
270         void __FASTCALL bhi();
271         void __FASTCALL bita_di();
272         void __FASTCALL bita_ex();
273         void __FASTCALL bita_im();
274         void __FASTCALL bita_ix();
275         void __FASTCALL bitb_di();
276         void __FASTCALL bitb_ex();
277         void __FASTCALL bitb_im();
278         void __FASTCALL bitb_ix();
279         void __FASTCALL ble();
280         void __FASTCALL bls();
281         void __FASTCALL blt();
282         void __FASTCALL bmi();
283         void __FASTCALL bne();
284         void __FASTCALL bpl();
285         void __FASTCALL bra();
286         void __FASTCALL brn();
287         void __FASTCALL bsr();
288         void __FASTCALL bvc();
289         void __FASTCALL bvs();
290         void __FASTCALL clca();
291         void __FASTCALL clcb();
292         void __FASTCALL clra();
293         void __FASTCALL clrb();
294         void __FASTCALL clr_di();
295         void __FASTCALL clr_ex();
296         void __FASTCALL clr_ix();
297         void __FASTCALL cmpa_di();
298         void __FASTCALL cmpa_ex();
299         void __FASTCALL cmpa_im();
300         void __FASTCALL cmpa_ix();
301         void __FASTCALL cmpb_di();
302         void __FASTCALL cmpb_ex();
303         void __FASTCALL cmpb_im();
304         void __FASTCALL cmpb_ix();
305         void __FASTCALL cmpd_di();
306         void __FASTCALL cmpd_ex();
307         void __FASTCALL cmpd_im();
308         void __FASTCALL cmpd_ix();
309         void __FASTCALL cmps_di();
310         void __FASTCALL cmps_ex();
311         void __FASTCALL cmps_im();
312         void __FASTCALL cmps_ix();
313         void __FASTCALL cmpu_di();
314         void __FASTCALL cmpu_ex();
315         void __FASTCALL cmpu_im();
316         void __FASTCALL cmpu_ix();
317         void __FASTCALL cmpx_di();
318         void __FASTCALL cmpx_ex();
319         void __FASTCALL cmpx_im();
320         void __FASTCALL cmpx_ix();
321         void __FASTCALL cmpy_di();
322         void __FASTCALL cmpy_ex();
323         void __FASTCALL cmpy_im();
324         void __FASTCALL cmpy_ix();
325         void __FASTCALL coma();
326         void __FASTCALL comb();
327         void __FASTCALL com_di();
328         void __FASTCALL com_ex();
329         void __FASTCALL com_ix();
330         void __FASTCALL cwai();
331         void __FASTCALL daa();
332         void __FASTCALL dcca();
333         void __FASTCALL dccb();
334         void __FASTCALL dcc_di();
335         void __FASTCALL dcc_ex();
336         void __FASTCALL dcc_ix();
337         void __FASTCALL deca();
338         void __FASTCALL decb();
339         void __FASTCALL dec_di();
340         void __FASTCALL dec_ex();
341         void __FASTCALL dec_ix();
342         void __FASTCALL eora_di();
343         void __FASTCALL eora_ex();
344         void __FASTCALL eora_im();
345         void __FASTCALL eora_ix();
346         void __FASTCALL eorb_di();
347         void __FASTCALL eorb_ex();
348         void __FASTCALL eorb_im();
349         void __FASTCALL eorb_ix();
350         void __FASTCALL exg();
351         void __FASTCALL flag8_im();
352         void __FASTCALL flag16_im();
353         void __FASTCALL illegal();
354         void __FASTCALL inca();
355         void __FASTCALL incb();
356         void __FASTCALL inc_di();
357         void __FASTCALL inc_ex();
358         void __FASTCALL inc_ix();
359         void __FASTCALL jmp_di();
360         void __FASTCALL jmp_ex();
361         void __FASTCALL jmp_ix();
362         void __FASTCALL jsr_di();
363         void __FASTCALL jsr_ex();
364         void __FASTCALL jsr_ix();
365         void __FASTCALL lbcc();
366         void __FASTCALL lbcs();
367         void __FASTCALL lbeq();
368         void __FASTCALL lbge();
369         void __FASTCALL lbgt();
370         void __FASTCALL lbhi();
371         void __FASTCALL lble();
372         void __FASTCALL lbls();
373         void __FASTCALL lblt();
374         void __FASTCALL lbmi();
375         void __FASTCALL lbne();
376         void __FASTCALL lbpl();
377         void __FASTCALL lbra();
378         void __FASTCALL lbrn();
379         void __FASTCALL lbsr();
380         void __FASTCALL lbvc();
381         void __FASTCALL lbvs();
382         void __FASTCALL lda_di();
383         void __FASTCALL lda_ex();
384         void __FASTCALL lda_im();
385         void __FASTCALL lda_ix();
386         void __FASTCALL ldb_di();
387         void __FASTCALL ldb_ex();
388         void __FASTCALL ldb_im();
389         void __FASTCALL ldb_ix();
390         void __FASTCALL ldd_di();
391         void __FASTCALL ldd_ex();
392         void __FASTCALL ldd_im();
393         void __FASTCALL ldd_ix();
394         void __FASTCALL lds_di();
395         void __FASTCALL lds_ex();
396         void __FASTCALL lds_im();
397         void __FASTCALL lds_ix();
398         void __FASTCALL ldu_di();
399         void __FASTCALL ldu_ex();
400         void __FASTCALL ldu_im();
401         void __FASTCALL ldu_ix();
402         void __FASTCALL ldx_di();
403         void __FASTCALL ldx_ex();
404         void __FASTCALL ldx_im();
405         void __FASTCALL ldx_ix();
406         void __FASTCALL ldy_di();
407         void __FASTCALL ldy_ex();
408         void __FASTCALL ldy_im();
409         void __FASTCALL ldy_ix();
410         void __FASTCALL leas();
411         void __FASTCALL leau();
412         void __FASTCALL leax();
413         void __FASTCALL leay();
414         void __FASTCALL lsra();
415         void __FASTCALL lsrb();
416         void __FASTCALL lsr_di();
417         void __FASTCALL lsr_ex();
418         void __FASTCALL lsr_ix();
419         void __FASTCALL mul();
420         void __FASTCALL nega();
421         void __FASTCALL negb();
422         void __FASTCALL neg_di();
423         void __FASTCALL neg_ex();
424         void __FASTCALL neg_ix();
425         void __FASTCALL ngca();
426         void __FASTCALL ngcb();
427         void __FASTCALL ngc_di();
428         void __FASTCALL ngc_ex();
429         void __FASTCALL ngc_ix();
430         void __FASTCALL nop();
431         void __FASTCALL ora_di();
432         void __FASTCALL ora_ex();
433         void __FASTCALL ora_im();
434         void __FASTCALL ora_ix();
435         void __FASTCALL orb_di();
436         void __FASTCALL orb_ex();
437         void __FASTCALL orb_im();
438         void __FASTCALL orb_ix();
439         void __FASTCALL orcc();
440         void __FASTCALL pref10();
441         void __FASTCALL pref11();
442         void __FASTCALL pshs();
443         void __FASTCALL pshu();
444         void __FASTCALL puls();
445         void __FASTCALL pulu();
446         void __FASTCALL rola();
447         void __FASTCALL rolb();
448         void __FASTCALL rol_di();
449         void __FASTCALL rol_ex();
450         void __FASTCALL rol_ix();
451         void __FASTCALL rora();
452         void __FASTCALL rorb();
453         void __FASTCALL ror_di();
454         void __FASTCALL ror_ex();
455         void __FASTCALL ror_ix();
456         void __FASTCALL rst();
457         void __FASTCALL rti();  
458         void __FASTCALL rts();  
459         void __FASTCALL sbca_di();
460         void __FASTCALL sbca_ex();
461         void __FASTCALL sbca_im();
462         void __FASTCALL sbca_ix();
463         void __FASTCALL sbcb_di();
464         void __FASTCALL sbcb_ex();
465         void __FASTCALL sbcb_im();
466         void __FASTCALL sbcb_ix();
467         void __FASTCALL sex();
468         void __FASTCALL sta_di();
469         void __FASTCALL sta_ex();
470         void __FASTCALL sta_im();
471         void __FASTCALL sta_ix();
472         void __FASTCALL stb_di();
473         void __FASTCALL stb_ex();
474         void __FASTCALL stb_im();
475         void __FASTCALL stb_ix();
476         void __FASTCALL std_di();
477         void __FASTCALL std_ex();
478         void __FASTCALL std_im();
479         void __FASTCALL std_ix();
480         void __FASTCALL sts_di();
481         void __FASTCALL sts_ex();
482         void __FASTCALL sts_im();
483         void __FASTCALL sts_ix();
484         void __FASTCALL stu_di();
485         void __FASTCALL stu_ex();
486         void __FASTCALL stu_im();
487         void __FASTCALL stu_ix();
488         void __FASTCALL stx_di();
489         void __FASTCALL stx_ex();
490         void __FASTCALL stx_im();
491         void __FASTCALL stx_ix();
492         void __FASTCALL sty_di();
493         void __FASTCALL sty_ex();
494         void __FASTCALL sty_im();
495         void __FASTCALL sty_ix();
496         void __FASTCALL suba_di();
497         void __FASTCALL suba_ex();
498         void __FASTCALL suba_im();
499         void __FASTCALL suba_ix();
500         void __FASTCALL subb_di();
501         void __FASTCALL subb_ex();
502         void __FASTCALL subb_im();
503         void __FASTCALL subb_ix();
504         void __FASTCALL subd_di();
505         void __FASTCALL subd_ex();
506         void __FASTCALL subd_im();
507         void __FASTCALL subd_ix();
508         void __FASTCALL swi2();
509         void __FASTCALL swi3();
510         void __FASTCALL swi();
511         void __FASTCALL sync_09();
512         void __FASTCALL tfr();
513         void __FASTCALL trap();
514         void __FASTCALL tsta();
515         void __FASTCALL tstb();
516         void __FASTCALL tst_di();
517         void __FASTCALL tst_ex();
518         void __FASTCALL tst_ix();
519
520         bool __USE_DEBUGGER;
521         uint64_t cycles_tmp_count;
522         uint32_t insns_count;
523         uint32_t extra_tmp_count;
524         uint32_t nmi_count;
525         uint32_t firq_count;
526         uint32_t irq_count;
527         int frames_count;
528
529 public:
530         MC6809_BASE(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) 
531         {
532
533                 total_icount = prev_total_icount = 0;
534                 cycles_tmp_count = 0;
535                 insns_count = 0;
536                 __USE_DEBUGGER = false;
537                 d_debugger = NULL;
538                 initialize_output_signals(&outputs_bus_ba);
539                 initialize_output_signals(&outputs_bus_bs);
540                 set_device_name(_T("MC6809 MPU"));
541         }
542         ~MC6809_BASE() {}
543         
544         bool is_cpu()
545         {
546                 return true;
547         }
548         bool is_debugger_available()
549         {
550                 return true;
551         }
552         void *get_debugger()
553         {
554                 return d_debugger;
555         }
556         uint32_t get_debug_prog_addr_mask()
557         {
558                 return 0xffff;
559         }
560         uint32_t get_debug_data_addr_mask()
561         {
562                 return 0xffff;
563         }
564         void __FASTCALL write_debug_data8(uint32_t addr, uint32_t data);
565         uint32_t __FASTCALL read_debug_data8(uint32_t addr);
566         void __FASTCALL write_debug_data16(uint32_t addr, uint32_t data)
567         {
568                 write_debug_data8(addr, (data >> 8) & 0xff);
569                 write_debug_data8(addr + 1, data & 0xff);
570         }
571         uint32_t __FASTCALL read_debug_data16(uint32_t addr)
572         {
573                 uint32_t val = read_debug_data8(addr) << 8;
574                 val |= read_debug_data8(addr + 1);
575                 return val;
576         }
577         void __FASTCALL write_debug_data32(uint32_t addr, uint32_t data)
578         {
579                 write_debug_data16(addr, (data >> 16) & 0xffff);
580                 write_debug_data16(addr + 2, data & 0xffff);
581         }
582         uint32_t __FASTCALL read_debug_data32(uint32_t addr)
583         {
584                 uint32_t val = read_debug_data16(addr) << 16;
585                 val |= read_debug_data16(addr + 2);
586                 return val;
587         }
588         void __FASTCALL write_debug_io8(uint32_t addr, uint32_t data);
589         uint32_t __FASTCALL read_debug_io8(uint32_t addr);
590         void __FASTCALL write_debug_io16(uint32_t addr, uint32_t data)
591         {
592                 write_debug_io8(addr, (data >> 8) & 0xff);
593                 write_debug_io8(addr + 1, data & 0xff);
594         }
595         uint32_t __FASTCALL read_debug_io16(uint32_t addr)
596         {
597                 uint32_t val = read_debug_io8(addr) << 8;
598                 val |= read_debug_io8(addr + 1);
599                 return val;
600         }
601         void __FASTCALL write_debug_io32(uint32_t addr, uint32_t data)
602         {
603                 write_debug_io16(addr, (data >> 16) & 0xffff);
604                 write_debug_io16(addr + 2, data & 0xffff);
605         }
606         uint32_t __FASTCALL read_debug_io32(uint32_t addr)
607         {
608                 uint32_t val = read_debug_io16(addr) << 16;
609                 val |= read_debug_io16(addr + 2);
610                 return val;
611         }
612         bool write_debug_reg(const _TCHAR *reg, uint32_t data);
613         bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
614         virtual int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0);
615         virtual uint32_t cpu_disassemble_m6809(_TCHAR *buffer, uint32_t pc, const uint8_t *oprom, const uint8_t *opram);
616         virtual void __FASTCALL debugger_hook(void);
617         // common functions
618         void reset();
619         virtual void initialize();
620         int __FASTCALL run(int clock);
621         void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
622         bool process_state(FILEIO* state_fio, bool loading);
623         
624         void set_extra_clock(int clock)
625         {
626                 extra_icount += clock;
627         }
628         int get_extra_clock()
629         {
630                 return extra_icount;
631         }
632         uint32_t get_pc()
633         {
634                 return ppc.w.l;
635         }
636         uint32_t get_next_pc()
637         {
638                 return pc.w.l;
639         }
640         // For debug
641         uint32_t get_ix()
642         {
643                 return x.w.l;
644         }
645         uint32_t get_iy()
646         {
647                 return y.w.l;
648         }
649         uint32_t get_ustack()
650         {
651                 return u.w.l;
652         }
653         uint32_t get_sstack()
654         {
655                 return s.w.l;
656         }
657         uint32_t get_acca()
658         {
659                 return acc.b.h;
660         }
661         uint32_t get_accb()
662         {
663                 return acc.b.l;
664         }
665         uint32_t get_cc()
666         {
667                 return cc;
668         }
669         uint32_t get_dp()
670         {
671                 return dp.b.h;
672         }
673
674         // unique function
675         void set_context_mem(DEVICE* device)
676         {
677                 d_mem = device;
678         }
679         void set_context_bus_ba(DEVICE* device, int id, uint32_t mask)
680         {
681                 register_output_signal(&outputs_bus_ba, device, id, mask);
682         }
683         void set_context_bus_bs(DEVICE* device, int id, uint32_t mask)
684         {
685                 register_output_signal(&outputs_bus_bs, device, id, mask);
686         }
687
688         void set_context_debugger(DEBUGGER* device)
689         {
690                 d_debugger = device;
691         }
692         void event_frame();
693 };
694
695 class MC6809 : public MC6809_BASE
696 {
697
698  public:
699         MC6809(VM_TEMPLATE* parent_vm, EMU* parent_emu) : MC6809_BASE(parent_vm, parent_emu) 
700         {
701         }
702         ~MC6809() {}
703         void initialize();
704         void __FASTCALL run_one_opecode();
705         uint32_t cpu_disassemble_m6809(_TCHAR *buffer, uint32_t pc, const uint8_t *oprom, const uint8_t *opram);
706         virtual int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0);
707         void __FASTCALL debugger_hook(void);
708 };
709 #endif
710