6 // (c) 2004, 2014 Underground Software
20 #warning "THIS ISN'T GENERIC ENOUGH... !!! FIX !!!"
21 /*extern*/ V6808REGS soundCPU;//Hm.
23 // Private globals variables
25 static char op_mat[256] = {
26 0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
27 5, 5, 0, 0, 0, 0, 5, 5, 0, 5, 0, 5, 0, 0, 0, 0,
28 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
29 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 0, 5, 5,
30 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
31 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
32 7, 0, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7,
33 2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2,
34 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 8, 9, 3, 9, 0,
35 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
36 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
37 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
38 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 8, 0, 0, 9, 0,
39 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,
40 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7,
41 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2
44 static char mnemonics[256][6] = {
45 "??? ","NOP ","??? ","??? ","??? ","??? ","TAP ","TPA ",
46 "INX ","DEX ","CLV ","SEV ","CLC ","SEC ","CLI ","SEI ",
47 "SBA ","CBA ","??? ","??? ","??? ","??? ","TAB ","TBA ",
48 "??? ","DAA ","??? ","ABA ","??? ","??? ","??? ","??? ",
49 "BRA ","??? ","BHI ","BLS ","BCC ","BCS ","BNE ","BEQ ",
50 "BVC ","BVS ","BPL ","BMI ","BGE ","BLT ","BGT ","BLE ",
51 "TSX ","INS ","PULA ","PULB ","DES ","TXS ","PSHA ","PSHB ",
52 "??? ","RTS ","??? ","RTI ","??? ","??? ","WAI ","SWI ",
53 "NEGA ","??? ","??? ","COMA ","LSRA ","??? ","RORA ","ASRA ",
54 "ASLA ","ROLA ","DECA ","??? ","INCA ","TSTA ","??? ","CLRA ",
55 "NEGB ","??? ","??? ","COMB ","LSRB ","??? ","RORB ","ASRB ",
56 "ASLB ","ROLB ","DECB ","??? ","INCB ","TSTB ","??? ","CLRB ",
57 "NEG ","??? ","??? ","COM ","LSR ","??? ","ROR ","ASR ",
58 "ASL ","ROL ","DEC ","??? ","INC ","TST ","JMP ","CLR ",
59 "NEG ","??? ","??? ","COM ","LSR ","??? ","ROR ","ASR ",
60 "ASL ","ROL ","DEC ","??? ","INC ","TST ","JMP ","CLR ",
61 "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","??? ",
62 "EORA ","ADCA ","ORAA ","ADDA ","CPX ","BSR ","LDS ","??? ",
63 "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","STAA ",
64 "EORA ","ADCA ","ORAA ","ADDA ","CPX ","??? ","LDS ","STS ",
65 "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","STAA ",
66 "EORA ","ADCA ","ORAA ","ADDA ","CPX ","JSR ","LDS ","STS ",
67 "SUBA ","CMPA ","SBCA ","??? ","ANDA ","BITA ","LDAA ","STAA ",
68 "EORA ","ADCA ","ORAA ","ADDA ","CPX ","JSR ","LDS ","STS ",
69 "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","??? ",
70 "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","??? ",
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 ",
75 "SUBB ","CMPB ","SBCB ","??? ","ANDB ","BITB ","LDAB ","STAB ",
76 "EORB ","ADCB ","ORAB ","ADDB ","??? ","??? ","LDX ","STX "
80 // Display bytes in mem in hex
82 static void DisplayBytes(uint16_t src, uint32_t dst)
84 WriteLog("%04X: ", src);
85 uint8_t cnt = 0; // Init counter...
88 dst += 0x10000; // That should fix the FFFF bug...
90 for(uint32_t i=src; i<dst; i++)
92 WriteLog("%02X ", soundCPU.RdMem(i));
93 cnt++; // Bump counter...
96 for(int i=cnt; i<5; i++) // Pad the leftover spaces...
101 // Decode a 6808 instruction
103 int Decode6808(uint16_t pc)
107 uint16_t addr = pc, offset;
108 uint8_t opcode = soundCPU.RdMem(addr++); // Get the opcode
110 switch (op_mat[opcode]) // Decode the addressing mode...
113 sprintf(outbuf, "??? ");
116 sprintf(outbuf, "%s $%02X ", mnemonics[opcode], soundCPU.RdMem(addr++));
119 // sprintf(outbuf, "%s $%04X", mnemonics[opcode], (soundCPU.RdMem(addr++) << 8) | soundCPU.RdMem(addr++));
120 offset = (soundCPU.RdMem(addr + 0) << 8) | soundCPU.RdMem(addr + 1);
122 sprintf(outbuf, "%s $%04X ", mnemonics[opcode], offset);
125 // sprintf(outbuf, "%s $%04X", mnemonics[opcode], ++addr + (int16_t)(int8_t)soundCPU.RdMem(addr));
126 offset = addr + 1 + (int16_t)(int8_t)soundCPU.RdMem(addr);
128 sprintf(outbuf, "%s $%04X ", mnemonics[opcode], offset);
131 sprintf(outbuf, "%s ", mnemonics[opcode]);
134 sprintf(outbuf, "%s $%02X,X ", mnemonics[opcode], soundCPU.RdMem(addr++));
137 sprintf(outbuf, "%s #$%02X ", mnemonics[opcode], soundCPU.RdMem(addr++));
139 case 9: // Long Immediate
140 // sprintf(outbuf, "%s #$%04X", mnemonics[opcode], (soundCPU.RdMem(addr++) << 8) | soundCPU.RdMem(addr++));
141 offset = (soundCPU.RdMem(addr + 0) << 8) | soundCPU.RdMem(addr + 1);
143 sprintf(outbuf, "%s #$%04X ", mnemonics[opcode], offset);
147 DisplayBytes(pc, addr); // Show bytes
148 WriteLog("%s", outbuf); // Display opcode & addressing, etc.