OSDN Git Service

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