6 // (c) 2004 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 src, uint32 dst)
84 WriteLog("%04X: ", src);
85 uint8 cnt = 0; // Init counter...
88 dst += 0x10000; // That should fix the FFFF bug...
90 for(uint32 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 pc)
107 uint16 addr = pc, offset;
108 uint8 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)(int8)soundCPU.RdMem(addr));
126 offset = addr + 1 + (int16)(int8)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.