2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
14 //#if defined(USE_SHARED_DLL)
16 //#include "libcpu_newdev/libcpu_mc6809/mc6809.h"
21 #include "mc6809_consts.h"
25 MC6809_PHASE_PUSH_STACK,
26 MC6809_PHASE_FETCH_VECTOR,
27 MC6809_PHASE_DEAD_CYCLE,
29 MC6809_PHASE_REQ_HALT,
34 // Note: Below is ugly hack cause of CPU#0 cannot modify clock.
38 class MC6809_BASE : public DEVICE
48 outputs_t outputs_bus_ba; // Bus available.
49 outputs_t outputs_bus_bs; // Bus status.
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 */
59 pair32_t ea; /* effective address */
62 /* In Motorola's datasheet, status has some valiants. 20171207 K.O */
70 uint64_t total_icount;
71 uint64_t prev_total_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);
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
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
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 */
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
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
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);
173 inline void __FASTCALL BRANCH(bool cond);
174 inline void __FASTCALL LBRANCH(bool cond);
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);
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);
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);
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);
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();
521 uint64_t cycles_tmp_count;
522 uint32_t insns_count;
523 uint32_t extra_tmp_count;
530 MC6809_BASE(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
533 total_icount = prev_total_icount = 0;
534 cycles_tmp_count = 0;
536 __USE_DEBUGGER = false;
538 initialize_output_signals(&outputs_bus_ba);
539 initialize_output_signals(&outputs_bus_bs);
540 set_device_name(_T("MC6809 MPU"));
548 bool is_debugger_available()
556 uint32_t get_debug_prog_addr_mask()
560 uint32_t get_debug_data_addr_mask()
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)
568 write_debug_data8(addr, (data >> 8) & 0xff);
569 write_debug_data8(addr + 1, data & 0xff);
571 uint32_t __FASTCALL read_debug_data16(uint32_t addr)
573 uint32_t val = read_debug_data8(addr) << 8;
574 val |= read_debug_data8(addr + 1);
577 void __FASTCALL write_debug_data32(uint32_t addr, uint32_t data)
579 write_debug_data16(addr, (data >> 16) & 0xffff);
580 write_debug_data16(addr + 2, data & 0xffff);
582 uint32_t __FASTCALL read_debug_data32(uint32_t addr)
584 uint32_t val = read_debug_data16(addr) << 16;
585 val |= read_debug_data16(addr + 2);
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)
592 write_debug_io8(addr, (data >> 8) & 0xff);
593 write_debug_io8(addr + 1, data & 0xff);
595 uint32_t __FASTCALL read_debug_io16(uint32_t addr)
597 uint32_t val = read_debug_io8(addr) << 8;
598 val |= read_debug_io8(addr + 1);
601 void __FASTCALL write_debug_io32(uint32_t addr, uint32_t data)
603 write_debug_io16(addr, (data >> 16) & 0xffff);
604 write_debug_io16(addr + 2, data & 0xffff);
606 uint32_t __FASTCALL read_debug_io32(uint32_t addr)
608 uint32_t val = read_debug_io16(addr) << 16;
609 val |= read_debug_io16(addr + 2);
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);
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);
624 void set_extra_clock(int clock)
626 extra_icount += clock;
628 int get_extra_clock()
636 uint32_t get_next_pc()
649 uint32_t get_ustack()
653 uint32_t get_sstack()
675 void set_context_mem(DEVICE* device)
679 void set_context_bus_ba(DEVICE* device, int id, uint32_t mask)
681 register_output_signal(&outputs_bus_ba, device, id, mask);
683 void set_context_bus_bs(DEVICE* device, int id, uint32_t mask)
685 register_output_signal(&outputs_bus_bs, device, id, mask);
688 void set_context_debugger(DEBUGGER* device)
695 class MC6809 : public MC6809_BASE
699 MC6809(VM_TEMPLATE* parent_vm, EMU* parent_emu) : MC6809_BASE(parent_vm, parent_emu)
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);