2 Skelton for retropc emulator
5 Author : Takeda.Toshiya
9 Notes from K.Ohta <whatisthis.sowhat _at_ gmail.com> at Jan 16, 2015:
10 All of undocumented instructions (i.e. ngc, flag16) of MC6809(not HD6309) are written by me.
11 These behaviors of undocumented insns are refered from "vm/cpu_x86.asm" (ia32 assembly codefor nasm) within XM7
12 written by Ryu Takegami , and older article wrote in magazine, "I/O" at 1985.
13 But, these C implements are written from scratch by me , and I tested many years at XM7/SDL.
14 Perhaps, these insns. are not implement MAME/MESS yet.
17 // Fixed IRQ/FIRQ by Mr.Sasaji at 2011.06.17
19 #include "./mc6809_consts.h"
21 #include "../config.h"
23 #define OP_HANDLER(_name) void MC6809_BASE::_name (void)
25 static void (MC6809_BASE::*m6809_main[0x100]) (void) = {
26 /* 0xX0, 0xX1, 0xX2, 0xX3, 0xX4, 0xX5, 0xX6, 0xX7,
27 0xX8, 0xX9, 0xXA, 0xXB, 0xXC, 0xXD, 0xXE, 0xXF */
30 &MC6809_BASE::neg_di, &MC6809_BASE::neg_di, &MC6809_BASE::ngc_di, &MC6809_BASE::com_di,
31 &MC6809_BASE::lsr_di, &MC6809_BASE::lsr_di, &MC6809_BASE::ror_di, &MC6809_BASE::asr_di,
32 &MC6809_BASE::asl_di, &MC6809_BASE::rol_di, &MC6809_BASE::dec_di, &MC6809_BASE::dcc_di,
33 &MC6809_BASE::inc_di, &MC6809_BASE::tst_di, &MC6809_BASE::jmp_di, &MC6809_BASE::clr_di,
35 &MC6809_BASE::pref10, &MC6809_BASE::pref11, &MC6809_BASE::nop, &MC6809_BASE::sync_09,
36 &MC6809_BASE::trap, &MC6809_BASE::trap, &MC6809_BASE::lbra, &MC6809_BASE::lbsr,
37 &MC6809_BASE::aslcc_in, &MC6809_BASE::daa, &MC6809_BASE::orcc, &MC6809_BASE::nop,
38 &MC6809_BASE::andcc, &MC6809_BASE::sex, &MC6809_BASE::exg, &MC6809_BASE::tfr,
40 &MC6809_BASE::bra, &MC6809_BASE::brn, &MC6809_BASE::bhi, &MC6809_BASE::bls,
41 &MC6809_BASE::bcc, &MC6809_BASE::bcs, &MC6809_BASE::bne, &MC6809_BASE::beq,
42 &MC6809_BASE::bvc, &MC6809_BASE::bvs, &MC6809_BASE::bpl, &MC6809_BASE::bmi,
43 &MC6809_BASE::bge, &MC6809_BASE::blt, &MC6809_BASE::bgt, &MC6809_BASE::ble,
45 &MC6809_BASE::leax, &MC6809_BASE::leay, &MC6809_BASE::leas, &MC6809_BASE::leau,
46 &MC6809_BASE::pshs, &MC6809_BASE::puls, &MC6809_BASE::pshu, &MC6809_BASE::pulu,
47 &MC6809_BASE::andcc, &MC6809_BASE::rts, &MC6809_BASE::abx, &MC6809_BASE::rti,
48 &MC6809_BASE::cwai, &MC6809_BASE::mul, &MC6809_BASE::rst, &MC6809_BASE::swi,
50 &MC6809_BASE::nega, &MC6809_BASE::nega, &MC6809_BASE::ngca, &MC6809_BASE::coma,
51 &MC6809_BASE::lsra, &MC6809_BASE::lsra, &MC6809_BASE::rora, &MC6809_BASE::asra,
52 &MC6809_BASE::asla, &MC6809_BASE::rola, &MC6809_BASE::deca, &MC6809_BASE::dcca,
53 &MC6809_BASE::inca, &MC6809_BASE::tsta, &MC6809_BASE::clca, &MC6809_BASE::clra,
55 &MC6809_BASE::negb, &MC6809_BASE::negb, &MC6809_BASE::ngcb, &MC6809_BASE::comb,
56 &MC6809_BASE::lsrb, &MC6809_BASE::lsrb, &MC6809_BASE::rorb, &MC6809_BASE::asrb,
57 &MC6809_BASE::aslb, &MC6809_BASE::rolb, &MC6809_BASE::decb, &MC6809_BASE::dccb,
58 &MC6809_BASE::incb, &MC6809_BASE::tstb, &MC6809_BASE::clcb, &MC6809_BASE::clrb,
60 &MC6809_BASE::neg_ix, &MC6809_BASE::neg_ix, &MC6809_BASE::ngc_ix, &MC6809_BASE::com_ix,
61 &MC6809_BASE::lsr_ix, &MC6809_BASE::lsr_ix, &MC6809_BASE::ror_ix, &MC6809_BASE::asr_ix,
62 &MC6809_BASE::asl_ix, &MC6809_BASE::rol_ix, &MC6809_BASE::dec_ix, &MC6809_BASE::dcc_ix,
63 &MC6809_BASE::inc_ix, &MC6809_BASE::tst_ix, &MC6809_BASE::jmp_ix, &MC6809_BASE::clr_ix,
65 &MC6809_BASE::neg_ex, &MC6809_BASE::neg_ex, &MC6809_BASE::ngc_ex, &MC6809_BASE::com_ex,
66 &MC6809_BASE::lsr_ex, &MC6809_BASE::lsr_ex, &MC6809_BASE::ror_ex, &MC6809_BASE::asr_ex,
67 &MC6809_BASE::asl_ex, &MC6809_BASE::rol_ex, &MC6809_BASE::dec_ex, &MC6809_BASE::dcc_ex,
68 &MC6809_BASE::inc_ex, &MC6809_BASE::tst_ex, &MC6809_BASE::jmp_ex, &MC6809_BASE::clr_ex,
70 &MC6809_BASE::suba_im, &MC6809_BASE::cmpa_im, &MC6809_BASE::sbca_im, &MC6809_BASE::subd_im,
71 &MC6809_BASE::anda_im, &MC6809_BASE::bita_im, &MC6809_BASE::lda_im, &MC6809_BASE::flag8_im,
72 &MC6809_BASE::eora_im, &MC6809_BASE::adca_im, &MC6809_BASE::ora_im, &MC6809_BASE::adda_im,
73 &MC6809_BASE::cmpx_im, &MC6809_BASE::bsr, &MC6809_BASE::ldx_im, &MC6809_BASE::flag16_im,
75 &MC6809_BASE::suba_di, &MC6809_BASE::cmpa_di, &MC6809_BASE::sbca_di, &MC6809_BASE::subd_di,
76 &MC6809_BASE::anda_di, &MC6809_BASE::bita_di, &MC6809_BASE::lda_di, &MC6809_BASE::sta_di,
77 &MC6809_BASE::eora_di, &MC6809_BASE::adca_di, &MC6809_BASE::ora_di, &MC6809_BASE::adda_di,
78 &MC6809_BASE::cmpx_di, &MC6809_BASE::jsr_di, &MC6809_BASE::ldx_di, &MC6809_BASE::stx_di,
80 &MC6809_BASE::suba_ix, &MC6809_BASE::cmpa_ix, &MC6809_BASE::sbca_ix, &MC6809_BASE::subd_ix,
81 &MC6809_BASE::anda_ix, &MC6809_BASE::bita_ix, &MC6809_BASE::lda_ix, &MC6809_BASE::sta_ix,
82 &MC6809_BASE::eora_ix, &MC6809_BASE::adca_ix, &MC6809_BASE::ora_ix, &MC6809_BASE::adda_ix,
83 &MC6809_BASE::cmpx_ix, &MC6809_BASE::jsr_ix, &MC6809_BASE::ldx_ix, &MC6809_BASE::stx_ix,
85 &MC6809_BASE::suba_ex, &MC6809_BASE::cmpa_ex, &MC6809_BASE::sbca_ex, &MC6809_BASE::subd_ex,
86 &MC6809_BASE::anda_ex, &MC6809_BASE::bita_ex, &MC6809_BASE::lda_ex, &MC6809_BASE::sta_ex,
87 &MC6809_BASE::eora_ex, &MC6809_BASE::adca_ex, &MC6809_BASE::ora_ex, &MC6809_BASE::adda_ex,
88 &MC6809_BASE::cmpx_ex, &MC6809_BASE::jsr_ex, &MC6809_BASE::ldx_ex, &MC6809_BASE::stx_ex,
90 &MC6809_BASE::subb_im, &MC6809_BASE::cmpb_im, &MC6809_BASE::sbcb_im, &MC6809_BASE::addd_im,
91 &MC6809_BASE::andb_im, &MC6809_BASE::bitb_im, &MC6809_BASE::ldb_im, &MC6809_BASE::flag8_im,
92 &MC6809_BASE::eorb_im, &MC6809_BASE::adcb_im, &MC6809_BASE::orb_im, &MC6809_BASE::addb_im,
93 &MC6809_BASE::ldd_im, &MC6809_BASE::trap, &MC6809_BASE::ldu_im, &MC6809_BASE::flag16_im,
95 &MC6809_BASE::subb_di, &MC6809_BASE::cmpb_di, &MC6809_BASE::sbcb_di, &MC6809_BASE::addd_di,
96 &MC6809_BASE::andb_di, &MC6809_BASE::bitb_di, &MC6809_BASE::ldb_di, &MC6809_BASE::stb_di,
97 &MC6809_BASE::eorb_di, &MC6809_BASE::adcb_di, &MC6809_BASE::orb_di, &MC6809_BASE::addb_di,
98 &MC6809_BASE::ldd_di, &MC6809_BASE::std_di, &MC6809_BASE::ldu_di, &MC6809_BASE::stu_di,
100 &MC6809_BASE::subb_ix, &MC6809_BASE::cmpb_ix, &MC6809_BASE::sbcb_ix, &MC6809_BASE::addd_ix,
101 &MC6809_BASE::andb_ix, &MC6809_BASE::bitb_ix, &MC6809_BASE::ldb_ix, &MC6809_BASE::stb_ix,
102 &MC6809_BASE::eorb_ix, &MC6809_BASE::adcb_ix, &MC6809_BASE::orb_ix, &MC6809_BASE::addb_ix,
103 &MC6809_BASE::ldd_ix, &MC6809_BASE::std_ix, &MC6809_BASE::ldu_ix, &MC6809_BASE::stu_ix,
105 &MC6809_BASE::subb_ex, &MC6809_BASE::cmpb_ex, &MC6809_BASE::sbcb_ex, &MC6809_BASE::addd_ex,
106 &MC6809_BASE::andb_ex, &MC6809_BASE::bitb_ex, &MC6809_BASE::ldb_ex, &MC6809_BASE::stb_ex,
107 &MC6809_BASE::eorb_ex, &MC6809_BASE::adcb_ex, &MC6809_BASE::orb_ex, &MC6809_BASE::addb_ex,
108 &MC6809_BASE::ldd_ex, &MC6809_BASE::std_ex, &MC6809_BASE::ldu_ex, &MC6809_BASE::stu_ex
110 /* macros for branch instructions */
111 inline void MC6809_BASE::BRANCH(bool cond)
120 inline void MC6809_BASE::LBRANCH(bool cond)
130 /* macros for setting/getting registers in TFR/EXG instructions */
132 inline pair32_t MC6809_BASE::RM16_PAIR(uint32_t addr)
137 b.b.l = RM((addr + 1));
141 inline void MC6809_BASE::WM16(uint32_t Addr, pair32_t *p)
144 WM((Addr + 1), p->b.l);
147 void MC6809_BASE::reset()
149 //extar_tmp_count += extra_icount;
153 int_state &= MC6809_HALT_BIT;
157 DPD = 0; /* Reset direct page register */
165 //#if defined(_FM7) || defined(_FM8) || defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
167 if((req_halt_on) && !(req_halt_off)) {
168 int_state |= MC6809_HALT_BIT;
170 req_halt_on = req_halt_off = false;
172 if((int_state & MC6809_HALT_BIT) != 0) {
173 write_signals(&outputs_bus_ba, 0xffffffff);
174 write_signals(&outputs_bus_bs, 0xffffffff);
176 write_signals(&outputs_bus_ba, 0x00000000);
177 write_signals(&outputs_bus_bs, 0x00000000);
181 CC |= CC_II; /* IRQ disabled */
182 CC |= CC_IF; /* FIRQ disabled */
184 pPC = RM16_PAIR(0xfffe);
188 void MC6809_BASE::initialize()
190 DEVICE::initialize();
195 req_halt_on = req_halt_off = false;
196 cycles_tmp_count = 0;
199 __USE_DEBUGGER = osd->check_feature(_T("USE_DEBUGGER"));
202 cycles_tmp_count = 0;
206 // if(config.print_statistics) {
207 register_frame_event(this);
213 void MC6809_BASE::event_frame()
215 if(frames_count < 0) {
216 cycles_tmp_count = total_icount;
223 } else if(frames_count >= 16) {
224 uint64_t _icount = total_icount - cycles_tmp_count;
225 if(config.print_statistics) {
226 out_debug_log(_T("INFO: 16 frames done.\nINFO: CLOCKS = %ld INSNS = %d EXTRA_ICOUNT = %d \nINFO: NMI# = %d FIRQ# = %d IRQ# = %d"), _icount, insns_count, extra_tmp_count, nmi_count, firq_count, irq_count);
228 cycles_tmp_count = total_icount;
240 void MC6809_BASE::write_signal(int id, uint32_t data, uint32_t mask)
242 if(id == SIG_CPU_IRQ) {
244 int_state |= MC6809_IRQ_BIT;
247 int_state &= ~MC6809_IRQ_BIT;
249 } else if(id == SIG_CPU_FIRQ) {
251 int_state |= MC6809_FIRQ_BIT;
254 int_state &= ~MC6809_FIRQ_BIT;
256 } else if(id == SIG_CPU_NMI) {
258 int_state |= MC6809_NMI_BIT;
261 int_state &= ~MC6809_NMI_BIT;
263 } else if(id == SIG_CPU_BUSREQ) {
266 req_halt_off = false;
267 int_state |= MC6809_HALT_BIT;
271 req_halt_off = false;
272 int_state &= ~MC6809_HALT_BIT;
274 } else if(id == SIG_CPU_HALTREQ) {
277 //int_state |= MC6809_HALT_BIT;
282 //int_state &= ~MC6809_HALT_BIT;
284 } else if(id == SIG_CPU_WAIT_FACTOR) {
285 waitfactor = data; // 65536.
289 void MC6809_BASE::cpu_nmi_push(void)
291 if ((int_state & MC6809_CWAI_IN) == 0) {
305 void MC6809_BASE::cpu_nmi_fetch_vector_address(void)
307 pPC = RM16_PAIR(0xfffc);
308 // printf("NMI occured PC=0x%04x VECTOR=%04x SP=%04x \n",rpc.w.l,pPC.w.l,S);
309 int_state |= MC6809_CWAI_OUT;
310 //int_state &= ~(MC6809_NMI_BIT | MC6809_SYNC_IN | MC6809_SYNC_OUT | MC6809_CWAI_IN); // $FF1E
316 void MC6809_BASE::cpu_firq_fetch_vector_address(void)
318 pPC = RM16_PAIR(0xfff6);
319 int_state |= MC6809_CWAI_OUT;
320 int_state &= ~(MC6809_SYNC_IN | MC6809_SYNC_OUT );
324 void MC6809_BASE::cpu_firq_push(void)
326 //pair32_t rpc = pPC;
327 if ((int_state & MC6809_CWAI_IN) == 0) {
333 // printf("Firq occured PC=0x%04x VECTOR=%04x SP=%04x \n",rpc.w.l,pPC.w.l,S);
335 void MC6809_BASE::cpu_irq_push(void)
337 if ((int_state & MC6809_CWAI_IN) == 0) {
349 void MC6809_BASE::cpu_irq_fetch_vector_address(void)
351 //pair32_t rpc = pPC;
352 pPC = RM16_PAIR(0xfff8);
353 int_state |= MC6809_CWAI_OUT;
354 int_state &= ~(MC6809_SYNC_IN | MC6809_SYNC_OUT);
357 void MC6809_BASE::cpu_wait(int clocks)
360 if(clocks < 0) return;
361 if(waitfactor == 0) return;
362 waitcount += (waitfactor * (uint32_t)clocks);
363 if(waitcount >= 65536) {
364 ncount = waitcount >> 16;
365 waitcount = waitcount - (ncount << 16);
367 if(ncount > 0) extra_icount += ncount;
371 int MC6809_BASE::run(int clock)
374 int first_icount = 0;
375 int passed_icount = 0;
376 first_icount = icount;
377 if(extra_icount > 0) {
378 extra_tmp_count += extra_icount;
381 if((req_halt_on) && !(req_halt_off)) {
382 int_state |= MC6809_HALT_BIT;
383 } else if(req_halt_on && req_halt_off) { // HALT OFF
384 int_state &= ~MC6809_HALT_BIT;
385 req_halt_on = req_halt_off = false;
388 if ((int_state & MC6809_HALT_BIT) != 0) { // 0x80
394 first_icount = icount;
396 write_signals(&outputs_bus_ba, 0);
397 write_signals(&outputs_bus_bs, 0);
400 icount -= extra_icount;
402 passed_icount = first_icount - icount;
403 total_icount += passed_icount;
405 write_signals(&outputs_bus_ba, 0xffffffff);
406 write_signals(&outputs_bus_bs, 0xffffffff);
408 cpu_wait(passed_icount);
409 return passed_icount;
412 icount -= extra_icount;
414 passed_icount = first_icount - icount;
415 total_icount += passed_icount;
417 cpu_wait(passed_icount);
418 return passed_icount;
421 if(busreq) { // Exit from BUSREQ state.
422 if((int_state & MC6809_SYNC_IN) != 0) {
423 write_signals(&outputs_bus_ba, 0xffffffff);
425 write_signals(&outputs_bus_ba, 0x00000000);
427 write_signals(&outputs_bus_bs, 0x00000000);
430 if((int_state & MC6809_INSN_HALT) != 0) { // 0x80
431 if(clock <= 1) clock = 1;
433 first_icount = icount;
435 RM(PCD); //Will save.Need to keep.
438 icount -= extra_icount;
439 passed_icount = first_icount - icount;
443 total_icount += passed_icount;
444 cpu_wait(passed_icount);
445 return passed_icount;
451 if ((int_state & (MC6809_NMI_BIT | MC6809_FIRQ_BIT | MC6809_IRQ_BIT)) != 0) { // 0x0007
452 if ((int_state & MC6809_NMI_BIT) == 0)
454 int_state &= ~MC6809_SYNC_IN; // Thanks to Ryu Takegami.
455 write_signals(&outputs_bus_ba, 0x00000000);
456 write_signals(&outputs_bus_bs, 0x00000000);
457 if((int_state & MC6809_CWAI_IN) == 0) {
462 write_signals(&outputs_bus_bs, 0xffffffff);
463 CC = CC | CC_II | CC_IF; // 0x50
465 cpu_nmi_fetch_vector_address();
467 write_signals(&outputs_bus_bs, 0x00000000);
468 int_state &= ~(MC6809_NMI_BIT | MC6809_SYNC_IN | MC6809_SYNC_OUT); // $FF1E
471 // OK, none interrupts.
475 if ((int_state & MC6809_FIRQ_BIT) != 0) {
476 int_state &= ~MC6809_SYNC_IN; // Moved to before checking MASK.Thanks to Ryu Takegami.
477 if ((CC & CC_IF) != 0)
479 write_signals(&outputs_bus_bs, 0x00000000);
480 write_signals(&outputs_bus_ba, 0x00000000);
481 if((int_state & MC6809_CWAI_IN) == 0) {
482 CC = CC & (uint8_t)(~CC_E);
486 write_signals(&outputs_bus_bs, 0xffffffff);
487 CC = CC | CC_II | CC_IF; // 0x50
489 cpu_firq_fetch_vector_address();
491 write_signals(&outputs_bus_bs, 0x00000000);
492 int_state &= ~(MC6809_SYNC_IN | MC6809_SYNC_OUT); // $FF1E
497 if ((int_state & MC6809_IRQ_BIT) != 0) {
498 int_state &= ~MC6809_SYNC_IN; // Moved to before checking MASK.Thanks to Ryu Takegami.
499 if ((CC & CC_II) != 0)
501 write_signals(&outputs_bus_bs, 0x00000000);
502 write_signals(&outputs_bus_ba, 0x00000000);
503 if((int_state & MC6809_CWAI_IN) == 0) {
508 write_signals(&outputs_bus_bs, 0xffffffff);
510 CC = CC | CC_II; // 0x50
511 cpu_irq_fetch_vector_address();
513 write_signals(&outputs_bus_bs, 0x00000000);
514 int_state &= ~(MC6809_SYNC_IN | MC6809_SYNC_OUT); // $FF1E
525 if((int_state & MC6809_CWAI_IN) != 0) {
526 int_state &= ~MC6809_CWAI_IN;
528 if(clock >= 0) icount += clock;
529 first_icount = icount;
532 icount -= extra_icount;
533 passed_icount = first_icount - icount;
535 total_icount += (uint64_t)passed_icount;
536 cpu_wait(passed_icount);
538 if((icount <= 0) || (clock <= passed_icount)) return passed_icount;
539 clock -= passed_icount;
541 return passed_icount;
546 if((int_state & MC6809_SYNC_IN) != 0) {
547 int tmp_passed_icount = 0;
548 first_icount = icount;
549 if(clock < 1) clock = 1;
550 icount -= extra_icount;
554 tmp_passed_icount = first_icount - icount;
555 total_icount += (uint64_t)passed_icount;
556 cpu_wait(tmp_passed_icount);
557 return passed_icount + tmp_passed_icount;
559 if((int_state & MC6809_CWAI_IN) == 0) {
561 // run only one opcode
562 int tmp_passed_icount = 0;
563 first_icount = icount;
566 tmp_passed_icount = first_icount - icount;
567 cpu_wait(tmp_passed_icount);
568 return passed_icount + tmp_passed_icount;;
570 // run cpu while given clocks
571 int tmp_passed_icount = 0;
573 first_icount = icount;
574 while((icount > 0) && (!(req_halt_on) && !(req_halt_off)) && (!busreq)) {
578 tmp_passed_icount = first_icount - icount;
579 cpu_wait(tmp_passed_icount);
580 return tmp_passed_icount + passed_icount;
583 int tmp_passed_icount = 0;
584 first_icount = icount;
585 if(clock < 1) clock = 1;
586 icount -= extra_icount;
590 tmp_passed_icount = first_icount - icount;
591 total_icount += tmp_passed_icount;
592 cpu_wait(tmp_passed_icount);
593 return passed_icount + tmp_passed_icount;
598 void MC6809_BASE::debugger_hook()
603 void MC6809_BASE::run_one_opecode()
606 uint8_t ireg = ROP(PCD);
608 icount -= cycles1[ireg];
609 icount -= extra_icount;
614 void MC6809_BASE::op(uint8_t ireg)
616 //printf("CPU(%08x) PC=%04x OP=%02x %02x %02x %02x %02x\n", (void *)this, PC, ireg, RM(PC), RM(PC + 1), RM(PC + 2), RM(PC + 3));
618 (this->*m6809_main[ireg])();
622 void MC6809_BASE::write_debug_data8(uint32_t addr, uint32_t data)
624 if(__USE_DEBUGGER) d_mem_stored->write_data8(addr, data);
627 uint32_t MC6809_BASE::read_debug_data8(uint32_t addr)
630 return d_mem_stored->read_data8(addr);
635 void MC6809_BASE::write_debug_io8(uint32_t addr, uint32_t data)
637 if(__USE_DEBUGGER) d_mem_stored->write_io8(addr, data);
640 uint32_t MC6809_BASE::read_debug_io8(uint32_t addr)
643 uint8_t val = d_mem_stored->read_io8(addr);
650 bool MC6809_BASE::write_debug_reg(const _TCHAR *reg, uint32_t data)
652 //#ifdef USE_DEBUGGER
653 if(_tcsicmp(reg, _T("PC")) == 0) {
655 } else if(_tcsicmp(reg, _T("DP")) == 0) {
657 } else if(_tcsicmp(reg, _T("A")) == 0) {
659 } else if(_tcsicmp(reg, _T("B")) == 0) {
661 } else if(_tcsicmp(reg, _T("D")) == 0) {
663 } else if(_tcsicmp(reg, _T("U")) == 0) {
665 } else if(_tcsicmp(reg, _T("X")) == 0) {
667 } else if(_tcsicmp(reg, _T("Y")) == 0) {
669 } else if(_tcsicmp(reg, _T("S")) == 0) {
671 } else if(_tcsicmp(reg, _T("CC")) == 0) {
682 INTR=[ IRQ FIRQ NMI HALT][CI CO SI SO TRAP] CC =[EFHINZVC]
683 A = 00 B = 00 DP = 00 X = 0000 Y = 0000 U = 0000 S = 0000 EA = 0000
684 Clocks = 0 (0) Since Scanline = 0/0 (0/0)
686 void MC6809_BASE::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
688 //#ifdef USE_DEBUGGER
689 my_stprintf_s(buffer, buffer_len,
690 _T("PC = %04x PPC = %04x\nINTR = [%s %s %s %s][%s %s %s %s %s] CC = [%c%c%c%c%c%c%c%c]\nA = %02x B = %02x DP = %02x X = %04x Y = %04x U = %04x S = %04x EA = %04x\nClocks = %llu (%llu) Since Scanline = %d/%d (%d/%d)"),
693 ((int_state & MC6809_IRQ_BIT) == 0) ? _T("----") : _T(" IRQ"),
694 ((int_state & MC6809_FIRQ_BIT) == 0) ? _T("----") : _T("FIRQ"),
695 ((int_state & MC6809_NMI_BIT) == 0) ? _T("----") : _T(" NMI"),
696 ((int_state & MC6809_HALT_BIT) == 0) ? _T("----") : _T("HALT"),
697 ((int_state & MC6809_CWAI_IN) == 0) ? _T("--") : _T("CI"),
698 ((int_state & MC6809_CWAI_OUT) == 0) ? _T("--") : _T("CO"),
699 ((int_state & MC6809_SYNC_IN) == 0) ? _T("--") : _T("SI"),
700 ((int_state & MC6809_SYNC_OUT) == 0) ? _T("--") : _T("SO"),
701 ((int_state & MC6809_INSN_HALT) == 0) ? _T("----") : _T("TRAP"),
702 ((CC & CC_E) == 0) ? _T('-') : _T('E'),
703 ((CC & CC_IF) == 0) ? _T('-') : _T('F'),
704 ((CC & CC_H) == 0) ? _T('-') : _T('H'),
705 ((CC & CC_II) == 0) ? _T('-') : _T('I'),
706 ((CC & CC_N) == 0) ? _T('-') : _T('N'),
707 ((CC & CC_Z) == 0) ? _T('-') : _T('Z'),
708 ((CC & CC_V) == 0) ? _T('-') : _T('V'),
709 ((CC & CC_C) == 0) ? _T('-') : _T('C'),
713 total_icount, total_icount - prev_total_icount,
714 get_passed_clock_since_vline(), get_cur_vline_clocks(), get_cur_vline(), get_lines_per_frame()
716 prev_total_icount = total_icount;
720 uint32_t MC6809_BASE::cpu_disassemble_m6809(_TCHAR *buffer, uint32_t pc, const uint8_t *oprom, const uint8_t *opram)
725 int MC6809_BASE::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
732 inline void MC6809_BASE::fetch_effective_address()
735 uint8_t upper, lower;
739 upper = (postbyte >> 4) & 0x0f;
740 lower = postbyte & 0x0f;
767 fetch_effective_address_IDX(upper, lower);
771 icount -= index_cycle_em[postbyte];
774 inline void MC6809_BASE::fetch_effective_address_IDX(uint8_t upper, uint8_t lower)
776 bool indirect = false;
781 indirect = ((upper & 0x01) != 0) ? true : false;
783 switch ((upper >> 1) & 0x03) { // $8-$f >> 1 = $4 - $7 : delete bit2
802 *reg = *reg & 0xffff;
807 *reg = *reg & 0xffff;
811 *reg = *reg & 0xffff;
816 *reg = *reg & 0xffff;
823 EA = *reg + SIGNED(B);
827 EA = *reg + SIGNED(A);
831 EA = *reg + SIGNED(bx_p);
837 case 0x0a: // Undocumented
847 EA = PC + SIGNED(bx_p);
849 case 0x0d: // xxxx,pc
853 case 0x0e: // Undocumented
861 // $9x,$bx,$dx,$fx = INDIRECT
864 EAP = RM16_PAIR(pp.d);
868 #define IIError() illegal()
872 //logerror("M6809: illegal opcode at %04x\n",PC);
873 //printf("M6809: illegal opcode at %04x %02x %02x %02x %02x %02x \n",
874 // PC - 2, RM(PC - 2), RM(PC - 1), RM(PC), RM(PC + 1), RM(PC + 2));
878 inline uint8_t MC6809_BASE::GET_INDEXED_DATA(void)
881 fetch_effective_address();
886 inline pair32_t MC6809_BASE::GET_INDEXED_DATA16(void)
889 fetch_effective_address();
895 inline void MC6809_BASE::NEG_MEM(uint8_t a_neg)
898 r_neg = 0 - (uint16_t)a_neg;
900 SET_FLAGS8(0, a_neg, r_neg);
904 inline uint8_t MC6809_BASE::NEG_REG(uint8_t a_neg)
907 r_neg = 0 - (uint16_t)a_neg;
909 SET_FLAGS8(0, a_neg, r_neg);
910 return (uint8_t)r_neg;
915 inline void MC6809_BASE::COM_MEM(uint8_t a_com)
925 inline uint8_t MC6809_BASE::COM_REG(uint8_t r_com)
934 inline void MC6809_BASE::LSR_MEM(uint8_t t)
937 CC = CC | (t & CC_C);
943 inline uint8_t MC6809_BASE::LSR_REG(uint8_t r)
952 inline void MC6809_BASE::ROR_MEM(uint8_t t)
955 r = (CC & CC_C) << 7;
964 inline uint8_t MC6809_BASE::ROR_REG(uint8_t t)
967 r = (CC & CC_C) << 7;
977 inline void MC6809_BASE::ASR_MEM(uint8_t t)
981 CC = CC | (t & CC_C);
982 r = (t & 0x80) | (t >> 1);
989 inline uint8_t MC6809_BASE::ASR_REG(uint8_t t)
993 CC = CC | (t & CC_C);
994 r = (t & 0x80) | (t >> 1);
1001 inline void MC6809_BASE::ASL_MEM(uint8_t t)
1004 tt = (uint16_t)t & 0x00ff;
1007 SET_FLAGS8(tt, tt, r);
1009 WM(EAD, (uint8_t)r);
1012 inline uint8_t MC6809_BASE::ASL_REG(uint8_t t)
1015 tt = (uint16_t)t & 0x00ff;
1018 SET_FLAGS8(tt, tt, r);
1023 inline void MC6809_BASE::ROL_MEM(uint8_t t)
1026 tt = (uint16_t)t & 0x00ff;
1027 r = (CC & CC_C) | (tt << 1);
1032 // if((r & 0x80) == 0)SEV;
1034 // if((r & 0x80) != 0) SEV;
1036 SET_FLAGS8(tt, tt, r);
1037 WM(EAD, (uint8_t)r);
1040 inline uint8_t MC6809_BASE::ROL_REG(uint8_t t)
1043 tt = (uint16_t)t & 0x00ff;
1044 r = (CC & CC_C) | (tt << 1);
1049 // if((r & 0x80) == 0) SEV;
1051 // if((r & 0x80) != 0) SEV;
1053 SET_FLAGS8(tt, tt, r);
1057 inline void MC6809_BASE::DEC_MEM(uint8_t t)
1066 inline uint8_t MC6809_BASE::DEC_REG(uint8_t t)
1075 inline void MC6809_BASE::DCC_MEM(uint8_t t)
1089 inline uint8_t MC6809_BASE::DCC_REG(uint8_t t)
1103 inline void MC6809_BASE::INC_MEM(uint8_t t)
1105 uint16_t tt = t + 1;
1111 inline uint8_t MC6809_BASE::INC_REG(uint8_t t)
1113 uint16_t tt = t + 1;
1119 inline void MC6809_BASE::TST_MEM(uint8_t t)
1125 inline uint8_t MC6809_BASE::TST_REG(uint8_t t)
1132 inline uint8_t MC6809_BASE::CLC_REG(uint8_t t)
1142 inline void MC6809_BASE::CLR_MEM(uint8_t t)
1149 inline uint8_t MC6809_BASE::CLR_REG(uint8_t t)
1156 inline uint8_t MC6809_BASE::SUB8_REG(uint8_t reg, uint8_t data)
1159 r = (uint16_t)reg - (uint16_t)data;
1162 SET_FLAGS8(reg, data, r);
1166 inline uint8_t MC6809_BASE::CMP8_REG(uint8_t reg, uint8_t data)
1169 r = (uint16_t)reg - (uint16_t)data;
1172 SET_FLAGS8(reg, data, r);
1176 inline uint8_t MC6809_BASE::SBC8_REG(uint8_t reg, uint8_t data)
1179 uint8_t cc_c = CC & CC_C;
1180 r = (uint16_t)reg - (uint16_t)data - (uint16_t)cc_c;
1182 SET_FLAGS8(reg, (data + cc_c) , r);
1186 inline uint8_t MC6809_BASE::AND8_REG(uint8_t reg, uint8_t data)
1195 inline uint8_t MC6809_BASE::BIT8_REG(uint8_t reg, uint8_t data)
1201 SET_V8(reg, data, r);
1205 inline uint8_t MC6809_BASE::EOR8_REG(uint8_t reg, uint8_t data)
1214 inline uint8_t MC6809_BASE::OR8_REG(uint8_t reg, uint8_t data)
1223 inline uint8_t MC6809_BASE::ADD8_REG(uint8_t reg, uint8_t data)
1226 t = (uint16_t) data;
1230 SET_HNZVC8(reg, t, r);
1234 inline uint8_t MC6809_BASE::ADC8_REG(uint8_t reg, uint8_t data)
1237 uint8_t c_cc = CC & CC_C;
1238 t = (uint16_t) data;
1242 SET_HNZVC8(reg, (t + c_cc), r);
1246 inline uint8_t MC6809_BASE::LOAD8_REG(uint8_t reg)
1253 inline void MC6809_BASE::STORE8_REG(uint8_t reg)
1260 inline uint16_t MC6809_BASE::LOAD16_REG(uint16_t reg)
1268 inline uint16_t MC6809_BASE::SUB16_REG(uint16_t reg, uint16_t data)
1274 SET_FLAGS16(d, data, r);
1278 inline uint16_t MC6809_BASE::ADD16_REG(uint16_t reg, uint16_t data)
1282 r = d + (uint32_t)data;
1284 SET_HNZVC16(d, data, r);
1288 inline uint16_t MC6809_BASE::CMP16_REG(uint16_t reg, uint16_t data)
1294 SET_FLAGS16(d, data, r);
1298 inline void MC6809_BASE::STORE16_REG(pair32_t *p)
1306 /* $00 NEG direct ?**** */
1307 OP_HANDLER(neg_di) {
1313 /* $01 Undefined Neg */
1314 /* $03 COM direct -**01 */
1315 OP_HANDLER(com_di) {
1321 /* $02 NGC Direct (Undefined) */
1322 OP_HANDLER(ngc_di) {
1323 if ((CC & CC_C) == 0) {
1332 /* $04 LSR direct -0*-* */
1333 OP_HANDLER(lsr_di) {
1341 /* $06 ROR direct -**-* */
1342 OP_HANDLER(ror_di) {
1348 /* $07 ASR direct ?**-* */
1349 OP_HANDLER(asr_di) {
1355 /* $08 ASL direct ?**** */
1356 OP_HANDLER(asl_di) {
1362 /* $09 ROL direct -**** */
1363 OP_HANDLER(rol_di) {
1369 /* $0A DEC direct -***- */
1370 OP_HANDLER(dec_di) {
1376 /* $0B DCC direct */
1377 OP_HANDLER(dcc_di) {
1384 /* $OC INC direct -***- */
1385 OP_HANDLER(inc_di) {
1391 /* $OD TST direct -**0- */
1392 OP_HANDLER(tst_di) {
1399 /* $0E JMP direct ----- */
1400 OP_HANDLER(jmp_di) {
1405 /* $0F CLR direct -0100 */
1406 OP_HANDLER(clr_di) {
1409 dummy = RM(EAD); // Dummy Read(Alpha etc...)
1417 /* $12 NOP inherent ----- */
1422 /* $13 SYNC inherent ----- */
1423 OP_HANDLER(sync_09) // Rename 20101110
1425 int_state |= MC6809_SYNC_IN;
1426 write_signals(&outputs_bus_ba, 0xffffffff);
1427 write_signals(&outputs_bus_bs, 0x00000000);
1432 /* $14 trap(HALT) */
1434 int_state |= MC6809_INSN_HALT; // HALTフラグ
1435 // Debug: ã
\83\88ã
\83©ã
\83\81E
\81Eè¦
\81å
\9b
1436 this->out_debug_log(_T("TRAP(HALT) @%04x %02x %02x\n"), PC - 1, RM((PC - 1)), RM(PC));
1441 /* $16 LBRA relative ----- */
1446 /* $17 LBSR relative ----- */
1455 OP_HANDLER(aslcc_in) {
1457 if ((cc_r & CC_Z) != 0x00) { //20100824 Fix
1465 /* $19 DAA inherent (A) -**0* */
1471 if (lsn > 0x09 || CC & CC_H)
1473 if (msn > 0x80 && lsn > 0x09)
1475 if (msn > 0x90 || CC & CC_C)
1478 CLR_NZV; /* keep carry from previous operation */
1479 SET_NZ8((uint8_t) t);
1485 /* $1A ORCC immediate ##### */
1495 /* $1C ANDCC immediate ##### */
1500 // check_irq_lines(); /* HJB 990116 */
1503 /* $1D SEX inherent -**-- */
1507 D = t; // Endian OK?
1508 // CLR_NZV; Tim Lindner 20020905: verified that V flag is not affected
1513 /* $1E EXG inherent ----- */// 20100825
1521 * 20111011: 16bit vs 16Bitの演算にする(XM7/ cpu_x86.asmより
1524 switch ((tb >> 4) & 15) {
1603 switch ((tb >> 4) & 15) {
1618 int_state |= MC6809_LDS;
1651 int_state |= MC6809_LDS;
1671 /* $1F TFR inherent ----- */
1678 * 20111011: 16bit vs 16Bitの演算にする(XM7/ cpu_x86.asmより)
1681 switch ((tb >> 4) & 15) {
1736 int_state |= MC6809_LDS;
1756 /* $20 BRA relative ----- */
1761 /* $21 BRN relative ----- */
1766 /* $1021 LBRN relative ----- */
1771 /* $22 BHI relative ----- */
1773 BRANCH(((CC & (CC_Z | CC_C)) == 0));
1776 /* $1022 LBHI relative ----- */
1778 LBRANCH(((CC & (CC_Z | CC_C)) == 0));
1781 /* $23 BLS relative ----- */
1783 BRANCH(((CC & (CC_Z | CC_C)) != 0));
1786 /* $1023 LBLS relative ----- */
1788 LBRANCH(((CC & (CC_Z | CC_C)) != 0));
1789 //LBRANCH((CC & (CC_Z | CC_C)));
1792 /* $24 BCC relative ----- */
1794 BRANCH((CC & CC_C) == 0);
1797 /* $1024 LBCC relative ----- */
1799 LBRANCH((CC & CC_C) == 0);
1802 /* $25 BCS relative ----- */
1804 BRANCH((CC & CC_C) != 0);
1807 /* $1025 LBCS relative ----- */
1809 LBRANCH((CC & CC_C) != 0);
1812 /* $26 BNE relative ----- */
1814 BRANCH((CC & CC_Z) == 0);
1817 /* $1026 LBNE relative ----- */
1819 LBRANCH((CC & CC_Z) == 0);
1822 /* $27 BEQ relative ----- */
1824 BRANCH((CC & CC_Z) != 0);
1827 /* $1027 LBEQ relative ----- */
1829 LBRANCH((CC & CC_Z) != 0);
1832 /* $28 BVC relative ----- */
1834 BRANCH((CC & CC_V) == 0);
1837 /* $1028 LBVC relative ----- */
1839 LBRANCH((CC & CC_V) == 0);
1842 /* $29 BVS relative ----- */
1844 BRANCH((CC & CC_V) != 0);
1847 /* $1029 LBVS relative ----- */
1849 LBRANCH((CC & CC_V) != 0);
1852 /* $2A BPL relative ----- */
1854 BRANCH((CC & CC_N) == 0);
1857 /* $102A LBPL relative ----- */
1859 LBRANCH((CC & CC_N) == 0);
1862 /* $2B BMI relative ----- */
1864 BRANCH((CC & CC_N) != 0);
1867 /* $102B LBMI relative ----- */
1869 LBRANCH((CC & CC_N) != 0);
1872 /* $2C BGE relative ----- */
1877 /* $102C LBGE relative ----- */
1882 /* $2D BLT relative ----- */
1887 /* $102D LBLT relative ----- */
1892 /* $2E BGT relative ----- */
1894 BRANCH(!(NXORV || (CC & CC_Z)));
1897 /* $102E LBGT relative ----- */
1899 LBRANCH(!(NXORV || (CC & CC_Z)));
1902 /* $2F BLE relative ----- */
1904 BRANCH((NXORV || (CC & CC_Z)));
1907 /* $102F LBLE relative ----- */
1909 LBRANCH((NXORV || (CC & CC_Z)));
1912 /* $30 LEAX indexed --*-- */
1914 fetch_effective_address();
1920 /* $31 LEAY indexed --*-- */
1922 fetch_effective_address();
1928 /* $32 LEAS indexed ----- */
1930 fetch_effective_address();
1932 int_state |= MC6809_LDS;
1935 /* $33 LEAU indexed ----- */
1937 fetch_effective_address();
1941 /* $34 PSHS inherent ----- */
1945 //dmy = RM(S); // Add 20100825
1946 RM(S); // Add 20100825
1981 /* 35 PULS inherent ----- */
2017 //dmy = RM(S); // Add 20100825
2018 RM(S); // Add 20100825
2019 /* HJB 990225: moved check after all PULLs */
2020 // if( t&0x01 ) { check_irq_lines(); }
2023 /* $36 PSHU inherent ----- */
2027 //dmy = RM(U); // Add 20100825
2028 RM(U); // Add 20100825
2063 /* 37 PULU inherent ----- */
2099 //dmy = RM(U); // Add 20100825
2100 RM(U); // Add 20100825
2101 /* HJB 990225: moved check after all PULLs */
2102 //if( t&0x01 ) { check_irq_lines(); }
2107 /* $39 RTS inherent ----- */
2109 //printf("RTS: Before PC=%04x", pPC.w.l);
2111 //printf(" After PC=%04x\n", pPC.w.l);
2114 /* $3A ABX inherent ----- */
2122 /* $3B RTI inherent ##### */
2125 // t = CC & CC_E; /* HJB 990225: entire state saved? */
2126 if ((CC & CC_E) != 0) { // NMIIRQ
2136 // check_irq_lines(); /* HJB 990116 */
2139 /* $3C CWAI inherent ----1 */
2144 CC |= CC_E; /* HJB 990225: save entire state */
2154 int_state = int_state | MC6809_CWAI_IN;
2155 int_state &= ~MC6809_CWAI_OUT; // 0xfeff
2159 /* $3D MUL inherent --*-@ */
2169 if (t.b.l & 0x80) SEC;
2180 /* $3F SWI (SWI2 SWI3) absolute indirect ----- */
2182 CC |= CC_E; /* HJB 980225: save entire state */
2191 CC |= CC_IF | CC_II; /* inhibit FIRQ and IRQ */
2192 pPC = RM16_PAIR(0xfffa);
2195 /* $103F SWI2 absolute indirect ----- */
2197 CC |= CC_E; /* HJB 980225: save entire state */
2206 pPC = RM16_PAIR(0xfff4);
2209 /* $113F SWI3 absolute indirect ----- */
2211 CC |= CC_E; /* HJB 980225: save entire state */
2220 pPC = RM16_PAIR(0xfff2);
2223 /* $40 NEGA inherent ?**** */
2231 /* $43 COMA inherent -**01 */
2238 if ((CC & CC_C) == 0) {
2245 /* $44 LSRA inherent -0*-* */
2252 /* $46 RORA inherent -**-* */
2257 /* $47 ASRA inherent ?**-* */
2262 /* $48 ASLA inherent ?**** */
2267 /* $49 ROLA inherent -**** */
2272 /* $4A DECA inherent -***- */
2283 /* $4C INCA inherent -***- */
2288 /* $4D TSTA inherent -**0- */
2298 /* $4F CLRA inherent -0100 */
2303 /* $50 NEGB inherent ?**** */
2312 /* $53 COMB inherent -**01 */
2319 if ((CC & CC_C) == 0) {
2326 /* $54 LSRB inherent -0*-* */
2333 /* $56 RORB inherent -**-* */
2338 /* $57 ASRB inherent ?**-* */
2343 /* $58 ASLB inherent ?**** */
2348 /* $59 ROLB inherent -**** */
2353 /* $5A DECB inherent -***- */
2363 /* $5C INCB inherent -***- */
2368 /* $5D TSTB inherent -**0- */
2378 /* $5F CLRB inherent -0100 */
2383 /* $60 NEG indexed ?**** */
2384 OP_HANDLER(neg_ix) {
2386 t = GET_INDEXED_DATA();
2393 /* $63 COM indexed -**01 */
2394 OP_HANDLER(com_ix) {
2396 t = GET_INDEXED_DATA();
2401 OP_HANDLER(ngc_ix) {
2402 if ((CC & CC_C) == 0) {
2409 /* $64 LSR indexed -0*-* */
2410 OP_HANDLER(lsr_ix) {
2412 t = GET_INDEXED_DATA();
2418 /* $66 ROR indexed -**-* */
2419 OP_HANDLER(ror_ix) {
2421 t = GET_INDEXED_DATA();
2425 /* $67 ASR indexed ?**-* */
2426 OP_HANDLER(asr_ix) {
2428 t = GET_INDEXED_DATA();
2432 /* $68 ASL indexed ?**** */
2433 OP_HANDLER(asl_ix) {
2435 t = GET_INDEXED_DATA();
2439 /* $69 ROL indexed -**** */
2440 OP_HANDLER(rol_ix) {
2442 t = GET_INDEXED_DATA();
2446 /* $6A DEC indexed -***- */
2447 OP_HANDLER(dec_ix) {
2449 t = GET_INDEXED_DATA();
2454 OP_HANDLER(dcc_ix) {
2456 t = GET_INDEXED_DATA();
2460 /* $6C INC indexed -***- */
2461 OP_HANDLER(inc_ix) {
2463 t = GET_INDEXED_DATA();
2467 /* $6D TST indexed -**0- */
2468 OP_HANDLER(tst_ix) {
2470 t = GET_INDEXED_DATA();
2474 /* $6E JMP indexed ----- */
2475 OP_HANDLER(jmp_ix) {
2476 fetch_effective_address();
2480 /* $6F CLR indexed -0100 */
2481 OP_HANDLER(clr_ix) {
2483 t = GET_INDEXED_DATA();
2484 //dummy = RM(EAD); // Dummy Read(Alpha etc...)
2485 RM(EAD); // Dummy Read(Alpha etc...)
2489 /* $70 NEG extended ?**** */
2490 OP_HANDLER(neg_ex) {
2497 /* $73 COM extended -**01 */
2498 OP_HANDLER(com_ex) {
2504 /* $72 NGC extended */
2505 OP_HANDLER(ngc_ex) {
2506 if ((CC & CC_C) == 0) {
2513 /* $74 LSR extended -0*-* */
2514 OP_HANDLER(lsr_ex) {
2522 /* $76 ROR extended -**-* */
2523 OP_HANDLER(ror_ex) {
2529 /* $77 ASR extended ?**-* */
2530 OP_HANDLER(asr_ex) {
2536 /* $78 ASL extended ?**** */
2537 OP_HANDLER(asl_ex) {
2543 /* $79 ROL extended -**** */
2544 OP_HANDLER(rol_ex) {
2550 /* $7A DEC extended -***- */
2551 OP_HANDLER(dec_ex) {
2559 OP_HANDLER(dcc_ex) {
2565 /* $7C INC extended -***- */
2566 OP_HANDLER(inc_ex) {
2572 /* $7D TST extended -**0- */
2573 OP_HANDLER(tst_ex) {
2579 /* $7E JMP extended ----- */
2580 OP_HANDLER(jmp_ex) {
2585 /* $7F CLR extended -0100 */
2586 OP_HANDLER(clr_ex) {
2593 /* $80 SUBA immediate ?**** */
2594 OP_HANDLER(suba_im) {
2600 /* $81 CMPA immediate ?**** */
2601 OP_HANDLER(cmpa_im) {
2607 /* $82 SBCA immediate ?**** */
2608 OP_HANDLER(sbca_im) {
2614 /* $83 SUBD (CMPD CMPU) immediate -**** */
2615 OP_HANDLER(subd_im) {
2618 D = SUB16_REG(D, b.w.l);
2621 /* $1083 CMPD immediate -**** */
2622 OP_HANDLER(cmpd_im) {
2625 D = CMP16_REG(D, b.w.l);
2628 /* $1183 CMPU immediate -**** */
2629 OP_HANDLER(cmpu_im) {
2632 U = CMP16_REG(U, b.w.l);
2635 /* $84 ANDA immediate -**0- */
2636 OP_HANDLER(anda_im) {
2642 /* $85 BITA immediate -**0- */
2643 OP_HANDLER(bita_im) {
2649 /* $86 LDA immediate -**0- */
2650 OP_HANDLER(lda_im) {
2655 /* is this a legal instruction? */
2656 /* $87 STA immediate -**0- */
2657 OP_HANDLER(sta_im) {
2667 OP_HANDLER(flag8_im) {
2678 /* $88 EORA immediate -**0- */
2679 OP_HANDLER(eora_im) {
2685 /* $89 ADCA immediate ***** */
2686 OP_HANDLER(adca_im) {
2692 /* $8A ORA immediate -**0- */
2693 OP_HANDLER(ora_im) {
2699 /* $8B ADDA immediate ***** */
2700 OP_HANDLER(adda_im) {
2706 /* $8C CMPX (CMPY CMPS) immediate -**** */
2707 OP_HANDLER(cmpx_im) {
2710 X = CMP16_REG(X, b.w.l);
2713 /* $108C CMPY immediate -**** */
2714 OP_HANDLER(cmpy_im) {
2717 Y = CMP16_REG(Y, b.w.l);
2720 /* $118C CMPS immediate -**** */
2721 OP_HANDLER(cmps_im) {
2724 S = CMP16_REG(S, b.w.l);
2735 /* $8E LDX (LDY) immediate -**0- */
2736 OP_HANDLER(ldx_im) {
2741 /* $108E LDY immediate -**0- */
2742 OP_HANDLER(ldy_im) {
2747 /* is this a legal instruction? */
2748 /* $8F STX (STY) immediate -**0- */
2749 OP_HANDLER(stx_im) {
2759 OP_HANDLER(flag16_im) {
2767 /* is this a legal instruction? */
2768 /* $108F STY immediate -**0- */
2769 OP_HANDLER(sty_im) {
2776 /* $90 SUBA direct ?**** */
2777 OP_HANDLER(suba_di) {
2783 /* $91 CMPA direct ?**** */
2784 OP_HANDLER(cmpa_di) {
2790 /* $92 SBCA direct ?**** */
2791 OP_HANDLER(sbca_di) {
2797 /* $93 SUBD (CMPD CMPU) direct -**** */
2798 OP_HANDLER(subd_di) {
2801 D = SUB16_REG(D, b.w.l);
2804 /* $1093 CMPD direct -**** */
2805 OP_HANDLER(cmpd_di) {
2808 D = CMP16_REG(D, b.w.l);
2811 /* $1193 CMPU direct -**** */
2812 OP_HANDLER(cmpu_di) {
2815 U = CMP16_REG(U, b.w.l);
2818 /* $94 ANDA direct -**0- */
2819 OP_HANDLER(anda_di) {
2825 /* $95 BITA direct -**0- */
2826 OP_HANDLER(bita_di) {
2832 /* $96 LDA direct -**0- */
2833 OP_HANDLER(lda_di) {
2838 /* $97 STA direct -**0- */
2839 OP_HANDLER(sta_di) {
2844 /* $98 EORA direct -**0- */
2845 OP_HANDLER(eora_di) {
2851 /* $99 ADCA direct ***** */
2852 OP_HANDLER(adca_di) {
2858 /* $9A ORA direct -**0- */
2859 OP_HANDLER(ora_di) {
2865 /* $9B ADDA direct ***** */
2866 OP_HANDLER(adda_di) {
2872 /* $9C CMPX (CMPY CMPS) direct -**** */
2873 OP_HANDLER(cmpx_di) {
2876 X = CMP16_REG(X, b.w.l);
2879 /* $109C CMPY direct -**** */
2880 OP_HANDLER(cmpy_di) {
2883 Y = CMP16_REG(Y, b.w.l);
2886 /* $119C CMPS direct -**** */
2887 OP_HANDLER(cmps_di) {
2890 S = CMP16_REG(S, b.w.l);
2893 /* $9D JSR direct ----- */
2894 OP_HANDLER(jsr_di) {
2900 /* $9E LDX (LDY) direct -**0- */
2901 OP_HANDLER(ldx_di) {
2906 /* $109E LDY direct -**0- */
2907 OP_HANDLER(ldy_di) {
2912 /* $9F STX (STY) direct -**0- */
2913 OP_HANDLER(stx_di) {
2918 /* $109F STY direct -**0- */
2919 OP_HANDLER(sty_di) {
2924 /* $a0 SUBA indexed ?**** */
2925 OP_HANDLER(suba_ix) {
2927 t = GET_INDEXED_DATA();
2931 /* $a1 CMPA indexed ?**** */
2932 OP_HANDLER(cmpa_ix) {
2934 t = GET_INDEXED_DATA();
2938 /* $a2 SBCA indexed ?**** */
2939 OP_HANDLER(sbca_ix) {
2941 t = GET_INDEXED_DATA();
2945 /* $a3 SUBD (CMPD CMPU) indexed -**** */
2946 OP_HANDLER(subd_ix) {
2948 b = GET_INDEXED_DATA16();
2949 D = SUB16_REG(D, b.w.l);
2952 /* $10a3 CMPD indexed -**** */
2953 OP_HANDLER(cmpd_ix) {
2955 b = GET_INDEXED_DATA16();
2956 D = CMP16_REG(D, b.w.l);
2959 /* $11a3 CMPU indexed -**** */
2960 OP_HANDLER(cmpu_ix) {
2962 b = GET_INDEXED_DATA16();
2963 U = CMP16_REG(U, b.w.l);
2966 /* $a4 ANDA indexed -**0- */
2967 OP_HANDLER(anda_ix) {
2969 t = GET_INDEXED_DATA();
2973 /* $a5 BITA indexed -**0- */
2974 OP_HANDLER(bita_ix) {
2976 t = GET_INDEXED_DATA();
2980 /* $a6 LDA indexed -**0- */
2981 OP_HANDLER(lda_ix) {
2982 A = GET_INDEXED_DATA();
2986 /* $a7 STA indexed -**0- */
2987 OP_HANDLER(sta_ix) {
2988 fetch_effective_address();
2992 /* $a8 EORA indexed -**0- */
2993 OP_HANDLER(eora_ix) {
2995 t = GET_INDEXED_DATA();
2999 /* $a9 ADCA indexed ***** */
3000 OP_HANDLER(adca_ix) {
3002 t = GET_INDEXED_DATA();
3006 /* $aA ORA indexed -**0- */
3007 OP_HANDLER(ora_ix) {
3009 t = GET_INDEXED_DATA();
3013 /* $aB ADDA indexed ***** */
3014 OP_HANDLER(adda_ix) {
3016 t = GET_INDEXED_DATA();
3020 /* $aC CMPX (CMPY CMPS) indexed -**** */
3021 OP_HANDLER(cmpx_ix) {
3023 b = GET_INDEXED_DATA16();
3024 X = CMP16_REG(X, b.w.l);
3027 /* $10aC CMPY indexed -**** */
3028 OP_HANDLER(cmpy_ix) {
3030 b = GET_INDEXED_DATA16();
3031 Y = CMP16_REG(Y, b.w.l);
3034 /* $11aC CMPS indexed -**** */
3035 OP_HANDLER(cmps_ix) {
3037 b = GET_INDEXED_DATA16();
3038 S = CMP16_REG(S, b.w.l);
3041 /* $aD JSR indexed ----- */
3042 OP_HANDLER(jsr_ix) {
3043 fetch_effective_address();
3048 /* $aE LDX (LDY) indexed -**0- */
3049 OP_HANDLER(ldx_ix) {
3051 t = GET_INDEXED_DATA16();
3056 /* $10aE LDY indexed -**0- */
3057 OP_HANDLER(ldy_ix) {
3059 t = GET_INDEXED_DATA16();
3064 /* $aF STX (STY) indexed -**0- */
3065 OP_HANDLER(stx_ix) {
3066 fetch_effective_address();
3070 /* $10aF STY indexed -**0- */
3071 OP_HANDLER(sty_ix) {
3072 fetch_effective_address();
3076 /* $b0 SUBA extended ?**** */
3077 OP_HANDLER(suba_ex) {
3083 /* $b1 CMPA extended ?**** */
3084 OP_HANDLER(cmpa_ex) {
3090 /* $b2 SBCA extended ?**** */
3091 OP_HANDLER(sbca_ex) {
3097 /* $b3 SUBD (CMPD CMPU) extended -**** */
3098 OP_HANDLER(subd_ex) {
3101 D = SUB16_REG(D, b.w.l);
3104 /* $10b3 CMPD extended -**** */
3105 OP_HANDLER(cmpd_ex) {
3108 D = CMP16_REG(D, b.w.l);
3111 /* $11b3 CMPU extended -**** */
3112 OP_HANDLER(cmpu_ex) {
3115 U = CMP16_REG(U, b.w.l);
3118 /* $b4 ANDA extended -**0- */
3119 OP_HANDLER(anda_ex) {
3125 /* $b5 BITA extended -**0- */
3126 OP_HANDLER(bita_ex) {
3132 /* $b6 LDA extended -**0- */
3133 OP_HANDLER(lda_ex) {
3138 /* $b7 STA extended -**0- */
3139 OP_HANDLER(sta_ex) {
3144 /* $b8 EORA extended -**0- */
3145 OP_HANDLER(eora_ex) {
3151 /* $b9 ADCA extended ***** */
3152 OP_HANDLER(adca_ex) {
3158 /* $bA ORA extended -**0- */
3159 OP_HANDLER(ora_ex) {
3165 /* $bB ADDA extended ***** */
3166 OP_HANDLER(adda_ex) {
3172 /* $bC CMPX (CMPY CMPS) extended -**** */
3173 OP_HANDLER(cmpx_ex) {
3176 X = CMP16_REG(X, b.w.l);
3179 /* $10bC CMPY extended -**** */
3180 OP_HANDLER(cmpy_ex) {
3183 Y = CMP16_REG(Y, b.w.l);
3186 /* $11bC CMPS extended -**** */
3187 OP_HANDLER(cmps_ex) {
3190 S = CMP16_REG(S, b.w.l);
3193 /* $bD JSR extended ----- */
3194 OP_HANDLER(jsr_ex) {
3200 /* $bE LDX (LDY) extended -**0- */
3201 OP_HANDLER(ldx_ex) {
3206 /* $10bE LDY extended -**0- */
3207 OP_HANDLER(ldy_ex) {
3212 /* $bF STX (STY) extended -**0- */
3213 OP_HANDLER(stx_ex) {
3218 /* $10bF STY extended -**0- */
3219 OP_HANDLER(sty_ex) {
3224 /* $c0 SUBB immediate ?**** */
3225 OP_HANDLER(subb_im) {
3231 /* $c1 CMPB immediate ?**** */
3232 OP_HANDLER(cmpb_im) {
3238 /* $c2 SBCB immediate ?**** */
3239 OP_HANDLER(sbcb_im) {
3245 /* $c3 ADDD immediate -**** */
3246 OP_HANDLER(addd_im) {
3249 D = ADD16_REG(D, b.w.l);
3252 /* $c4 ANDB immediate -**0- */
3253 OP_HANDLER(andb_im) {
3259 /* $c5 BITB immediate -**0- */
3260 OP_HANDLER(bitb_im) {
3266 /* $c6 LDB immediate -**0- */
3267 OP_HANDLER(ldb_im) {
3272 /* is this a legal instruction? */
3273 /* $c7 STB immediate -**0- */
3274 OP_HANDLER(stb_im) {
3281 /* $c8 EORB immediate -**0- */
3282 OP_HANDLER(eorb_im) {
3288 /* $c9 ADCB immediate ***** */
3289 OP_HANDLER(adcb_im) {
3295 /* $cA ORB immediate -**0- */
3296 OP_HANDLER(orb_im) {
3302 /* $cB ADDB immediate ***** */
3303 OP_HANDLER(addb_im) {
3309 /* $cC LDD immediate -**0- */
3310 OP_HANDLER(ldd_im) {
3315 /* is this a legal instruction? */
3316 /* $cD STD immediate -**0- */
3317 OP_HANDLER(std_im) {
3324 /* $cE LDU (LDS) immediate -**0- */
3325 OP_HANDLER(ldu_im) {
3330 /* $10cE LDS immediate -**0- */
3331 OP_HANDLER(lds_im) {
3334 int_state |= MC6809_LDS;
3337 /* is this a legal instruction? */
3338 /* $cF STU (STS) immediate -**0- */
3339 OP_HANDLER(stu_im) {
3346 /* is this a legal instruction? */
3347 /* $10cF STS immediate -**0- */
3348 OP_HANDLER(sts_im) {
3355 /* $d0 SUBB direct ?**** */
3356 OP_HANDLER(subb_di) {
3361 /* $d1 CMPB direct ?**** */
3362 OP_HANDLER(cmpb_di) {
3368 /* $d2 SBCB direct ?**** */
3369 OP_HANDLER(sbcb_di) {
3375 /* $d3 ADDD direct -**** */
3376 OP_HANDLER(addd_di) {
3379 D = ADD16_REG(D, b.w.l);
3382 /* $d4 ANDB direct -**0- */
3383 OP_HANDLER(andb_di) {
3389 /* $d5 BITB direct -**0- */
3390 OP_HANDLER(bitb_di) {
3396 /* $d6 LDB direct -**0- */
3397 OP_HANDLER(ldb_di) {
3402 /* $d7 STB direct -**0- */
3403 OP_HANDLER(stb_di) {
3408 /* $d8 EORB direct -**0- */
3409 OP_HANDLER(eorb_di) {
3415 /* $d9 ADCB direct ***** */
3416 OP_HANDLER(adcb_di) {
3422 /* $dA ORB direct -**0- */
3423 OP_HANDLER(orb_di) {
3429 /* $dB ADDB direct ***** */
3430 OP_HANDLER(addb_di) {
3436 /* $dC LDD direct -**0- */
3437 OP_HANDLER(ldd_di) {
3442 /* $dD STD direct -**0- */
3443 OP_HANDLER(std_di) {
3448 /* $dE LDU (LDS) direct -**0- */
3449 OP_HANDLER(ldu_di) {
3454 /* $10dE LDS direct -**0- */
3455 OP_HANDLER(lds_di) {
3458 int_state |= MC6809_LDS;
3461 /* $dF STU (STS) direct -**0- */
3462 OP_HANDLER(stu_di) {
3467 /* $10dF STS direct -**0- */
3468 OP_HANDLER(sts_di) {
3473 /* $e0 SUBB indexed ?**** */
3474 OP_HANDLER(subb_ix) {
3476 t = GET_INDEXED_DATA();
3480 /* $e1 CMPB indexed ?**** */
3481 OP_HANDLER(cmpb_ix) {
3483 t = GET_INDEXED_DATA();
3487 /* $e2 SBCB indexed ?**** */
3488 OP_HANDLER(sbcb_ix) {
3490 t = GET_INDEXED_DATA();
3494 /* $e3 ADDD indexed -**** */
3495 OP_HANDLER(addd_ix) {
3497 b = GET_INDEXED_DATA16();
3498 D = ADD16_REG(D, b.w.l);
3501 /* $e4 ANDB indexed -**0- */
3502 OP_HANDLER(andb_ix) {
3504 t = GET_INDEXED_DATA();
3508 /* $e5 BITB indexed -**0- */
3509 OP_HANDLER(bitb_ix) {
3511 t = GET_INDEXED_DATA();
3515 /* $e6 LDB indexed -**0- */
3516 OP_HANDLER(ldb_ix) {
3517 B = GET_INDEXED_DATA();
3521 /* $e7 STB indexed -**0- */
3522 OP_HANDLER(stb_ix) {
3523 fetch_effective_address();
3527 /* $e8 EORB indexed -**0- */
3528 OP_HANDLER(eorb_ix) {
3530 t = GET_INDEXED_DATA();
3534 /* $e9 ADCB indexed ***** */
3535 OP_HANDLER(adcb_ix) {
3537 t = GET_INDEXED_DATA();
3541 /* $eA ORB indexed -**0- */
3542 OP_HANDLER(orb_ix) {
3544 t = GET_INDEXED_DATA();
3548 /* $eB ADDB indexed ***** */
3549 OP_HANDLER(addb_ix) {
3551 t = GET_INDEXED_DATA();
3555 /* $eC LDD indexed -**0- */
3556 OP_HANDLER(ldd_ix) {
3558 t = GET_INDEXED_DATA16();
3563 /* $eD STD indexed -**0- */
3564 OP_HANDLER(std_ix) {
3565 fetch_effective_address();
3569 /* $eE LDU (LDS) indexed -**0- */
3570 OP_HANDLER(ldu_ix) {
3572 t = GET_INDEXED_DATA16();
3577 /* $10eE LDS indexed -**0- */
3578 OP_HANDLER(lds_ix) {
3580 t = GET_INDEXED_DATA16();
3583 int_state |= MC6809_LDS;
3586 /* $eF STU (STS) indexed -**0- */
3587 OP_HANDLER(stu_ix) {
3588 fetch_effective_address();
3592 /* $10eF STS indexed -**0- */
3593 OP_HANDLER(sts_ix) {
3594 fetch_effective_address();
3598 /* $f0 SUBB extended ?**** */
3599 OP_HANDLER(subb_ex) {
3605 /* $f1 CMPB extended ?**** */
3606 OP_HANDLER(cmpb_ex) {
3612 /* $f2 SBCB extended ?**** */
3613 OP_HANDLER(sbcb_ex) {
3619 /* $f3 ADDD extended -**** */
3620 OP_HANDLER(addd_ex) {
3623 D = ADD16_REG(D, b.w.l);
3626 /* $f4 ANDB extended -**0- */
3627 OP_HANDLER(andb_ex) {
3633 /* $f5 BITB extended -**0- */
3634 OP_HANDLER(bitb_ex) {
3640 /* $f6 LDB extended -**0- */
3641 OP_HANDLER(ldb_ex) {
3646 /* $f7 STB extended -**0- */
3647 OP_HANDLER(stb_ex) {
3652 /* $f8 EORB extended -**0- */
3653 OP_HANDLER(eorb_ex) {
3659 /* $f9 ADCB extended ***** */
3660 OP_HANDLER(adcb_ex) {
3666 /* $fA ORB extended -**0- */
3667 OP_HANDLER(orb_ex) {
3673 /* $fB ADDB extended ***** */
3674 OP_HANDLER(addb_ex) {
3680 /* $fC LDD extended -**0- */
3681 OP_HANDLER(ldd_ex) {
3686 /* $fD STD extended -**0- */
3687 OP_HANDLER(std_ex) {
3692 /* $fE LDU (LDS) extended -**0- */
3693 OP_HANDLER(ldu_ex) {
3698 /* $10fE LDS extended -**0- */
3699 OP_HANDLER(lds_ex) {
3702 int_state |= MC6809_LDS;
3705 /* $fF STU (STS) extended -**0- */
3706 OP_HANDLER(stu_ex) {
3711 /* $10fF STS extended -**0- */
3712 OP_HANDLER(sts_ex) {
3719 OP_HANDLER(pref10) {
3720 uint8_t ireg2 = ROP_ARG(PCD);
3807 // case 0x8f: flag16_im();->cycle=4; break; // 20130417
3860 // case 0xcf: flag16_im();->cycle=4; break;
3893 OP_HANDLER(pref11) {
3894 uint8_t ireg2 = ROP_ARG(PCD);
3945 #define STATE_VERSION 5
3947 bool MC6809_BASE::process_state(FILEIO* state_fio, bool loading)
3949 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
3952 if(!state_fio->StateCheckInt32(this_device_id)) {
3955 state_fio->StateInt32(icount);
3956 state_fio->StateInt32(extra_icount);
3957 state_fio->StateUint32(int_state);
3959 state_fio->StateUint32(pc.d);
3960 state_fio->StateUint32(ppc.d);
3961 state_fio->StateUint32(acc.d);
3962 state_fio->StateUint32(dp.d);
3963 state_fio->StateUint32(u.d);
3964 state_fio->StateUint32(s.d);
3965 state_fio->StateUint32(x.d);
3966 state_fio->StateUint32(y.d);
3967 state_fio->StateUint8(cc);
3968 state_fio->StateUint32(ea.d);
3971 state_fio->StateBool(req_halt_on);
3972 state_fio->StateBool(req_halt_off);
3973 state_fio->StateBool(busreq);
3975 state_fio->StateUint64(total_icount);
3976 state_fio->StateUint32(waitfactor);
3977 state_fio->StateUint32(waitcount);
3981 prev_total_icount = total_icount;
3982 // Post process for collecting statistics.
3983 cycles_tmp_count = total_icount;
3984 extra_tmp_count = 0;