5 // (C) 2004 Underground Software
19 extern V6808REGS soundCPU;//Hm.
21 // Private globals variables
23 static char op_mat[256] = {
24 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
25 5, 5, 0, 0, 0, 0, 5, 5, 0, 5, 0, 5, 0, 0, 0, 0,
26 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
27 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 0, 5, 5,
28 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
29 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
30 7, 0, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7,
31 2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2,
32 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 8, 9, 3, 9, 0,
33 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
34 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
35 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
36 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 8, 0, 0, 9, 0,
37 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,
38 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7,
39 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2
42 static char mnemonics[256][6] = {
43 "??? ","NOP ","??? ","??? ","??? ","??? ","TAP ","TPA ",
44 "INX ","DEX ","CLV ","SEV ","CLC ","SEC ","CLI ","SEI ",
45 "SBA ","CBA ","??? ","??? ","??? ","??? ","TAB ","TBA ",
46 "??? ","DAA ","??? ","ABA ","??? ","??? ","??? ","??? ",
47 "BRA ","??? ","BHI ","BLS ","BCC ","BCS ","BNE ","BEQ ",
48 "BVC ","BVS ","BPL ","BMI ","BGE ","BLT ","BGT ","BLE ",
49 "TSX ","INS ","PULA ","PULB ","DES ","TXS ","PSHA ","PSHB ",
50 "??? ","RTS ","??? ","RTI ","??? ","??? ","WAI ","SWI ",
51 "NEGA ","??? ","??? ","COMA ","LSRA ","??? ","RORA ","ASRA ",
52 "ASLA ","ROLA ","DECA ","??? ","INCA ","TSTA ","??? ","CLRA ",
53 "NEGB ","??? ","??? ","COMB ","LSRB ","??? ","RORB ","ASRB ",
54 "ASLB ","ROLB ","DECB ","??? ","INCB ","TSTB ","??? ","CLRB ",
55 "NEG ","??? ","??? ","COM ","LSR ","??? ","ROR ","ASR ",
56 "ASL ","ROL ","DEC ","??? ","INC ","TST ","JMP ","CLR ",
57 "NEG ","??? ","??? ","COM ","LSR ","??? ","ROR ","ASR ",
58 "ASL ","ROL ","DEC ","??? ","INC ","TST ","JMP ","CLR ",
59 "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","??? ",
60 "EORA ","ADCA ","ORAA ","ADDA ","CPX ","BSR ","LDS ","??? ",
61 "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","STAA ",
62 "EORA ","ADCA ","ORAA ","ADDA ","CPX ","??? ","LDS ","STS ",
63 "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","STAA ",
64 "EORA ","ADCA ","ORAA ","ADDA ","CPX ","JSR ","LDS ","STS ",
65 "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","STAA ",
66 "EORA ","ADCA ","ORAA ","ADDA ","CPX ","JSR ","LDS ","STS ",
67 "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","??? ",
68 "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","??? ",
69 "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","STAB ",
70 "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","STX ",
71 "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","STAB ",
72 "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","STX ",
73 "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","STAB ",
74 "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","STX "
78 // Display bytes in mem in hex
80 static void DisplayBytes(uint16_t src, uint32_t dst)
82 WriteLog("%04X: ", src);
83 uint8_t cnt = 0; // Init counter...
86 dst += 0x10000; // That should fix the FFFF bug...
88 for(uint32_t i=src; i<dst; i++)
90 WriteLog("%02X ", soundCPU.RdMem(i));
91 cnt++; // Bump counter...
94 for(int i=cnt; i<5; i++) // Pad the leftover spaces...
99 // Decode a 6808 instruction
101 int Decode6808(uint16_t pc)
105 uint16_t addr = pc, offset;
106 uint8_t opcode = soundCPU.RdMem(addr++); // Get the opcode
108 switch (op_mat[opcode]) // Decode the addressing mode...
111 sprintf(outbuf, "??? ");
114 sprintf(outbuf, "%s $%02X ", mnemonics[opcode], soundCPU.RdMem(addr++));
117 // sprintf(outbuf, "%s $%04X", mnemonics[opcode], (soundCPU.RdMem(addr++) << 8) | soundCPU.RdMem(addr++));
118 offset = (soundCPU.RdMem(addr + 0) << 8) | soundCPU.RdMem(addr + 1);
120 sprintf(outbuf, "%s $%04X ", mnemonics[opcode], offset);
123 // sprintf(outbuf, "%s $%04X", mnemonics[opcode], ++addr + (int16)(int8)soundCPU.RdMem(addr));
124 offset = addr + 1 + (int16_t)(int8_t)soundCPU.RdMem(addr);
126 sprintf(outbuf, "%s $%04X ", mnemonics[opcode], offset);
129 sprintf(outbuf, "%s ", mnemonics[opcode]);
132 sprintf(outbuf, "%s $%02X,X ", mnemonics[opcode], soundCPU.RdMem(addr++));
135 sprintf(outbuf, "%s #$%02X ", mnemonics[opcode], soundCPU.RdMem(addr++));
137 case 9: // Long Immediate
138 // sprintf(outbuf, "%s #$%04X", mnemonics[opcode], (soundCPU.RdMem(addr++) << 8) | soundCPU.RdMem(addr++));
139 offset = (soundCPU.RdMem(addr + 0) << 8) | soundCPU.RdMem(addr + 1);
141 sprintf(outbuf, "%s #$%04X ", mnemonics[opcode], offset);
145 DisplayBytes(pc, addr); // Show bytes
146 WriteLog("%s", outbuf); // Display opcode & addressing, etc.