]> Shamusworld >> Repos - thunder/blob - src/dis6808.cpp
97f20c4c91d64a515d1bfed669659039c8a9147b
[thunder] / src / dis6808.cpp
1 //
2 // 6808 disassembler
3 //
4 // by James Hammons
5 //
6 // (c) 2004, 2014 Underground Software
7 //
8
9 #include "dis6808.h"
10
11 #include <stdio.h>
12 #include <string>
13 #include "v6808.h"
14 #include "log.h"
15
16 using namespace std;
17
18 // External shit
19
20 #warning "THIS ISN'T GENERIC ENOUGH... !!! FIX !!!"
21 /*extern*/ V6808REGS soundCPU;//Hm.
22
23 // Private globals variables
24
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
42 };
43
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  "
77 };
78
79 //
80 // Display bytes in mem in hex
81 //
82 static void DisplayBytes(uint16_t src, uint32_t dst)
83 {
84         WriteLog("%04X: ", src);
85         uint8_t cnt = 0;                                                                                // Init counter...
86
87         if (src > dst)
88                 dst += 0x10000;                                                                 // That should fix the FFFF bug...
89
90         for(uint32_t i=src; i<dst; i++)
91         {
92                 WriteLog("%02X ", soundCPU.RdMem(i));
93                 cnt++;                                                                                  // Bump counter...
94         }
95
96         for(int i=cnt; i<5; i++)                                                        // Pad the leftover spaces...
97                 WriteLog("   ");
98 }
99
100 //
101 // Decode a 6808 instruction
102 //
103 int Decode6808(uint16_t pc)
104 {
105         char outbuf[80];
106
107         uint16_t addr = pc, offset;
108         uint8_t opcode = soundCPU.RdMem(addr++);                                // Get the opcode
109
110         switch (op_mat[opcode])                                                         // Decode the addressing mode...
111         {
112         case 0:                                                                                         // Illegal
113                 sprintf(outbuf, "???          ");
114                 break;
115         case 1:                                                                                         // Zero page
116                 sprintf(outbuf, "%s $%02X    ", mnemonics[opcode], soundCPU.RdMem(addr++));
117                 break;
118         case 2:                                                                                         // Absolute
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);
121                 addr += 2;
122                 sprintf(outbuf, "%s $%04X  ", mnemonics[opcode], offset);
123                 break;
124         case 3:                                                                                         // Relative
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);
127                 addr++;
128                 sprintf(outbuf, "%s $%04X  ", mnemonics[opcode], offset);
129                 break;
130         case 5:                                                                                         // Inherent
131                 sprintf(outbuf, "%s        ", mnemonics[opcode]);
132                 break;
133         case 7:                                                                                         // Indexed
134                 sprintf(outbuf, "%s $%02X,X  ", mnemonics[opcode], soundCPU.RdMem(addr++));
135                 break;
136         case 8:                                                                                         // Immediate
137                 sprintf(outbuf, "%s #$%02X   ", mnemonics[opcode], soundCPU.RdMem(addr++));
138                 break;
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);
142                 addr += 2;
143                 sprintf(outbuf, "%s #$%04X ", mnemonics[opcode], offset);
144                 break;
145         }
146
147         DisplayBytes(pc, addr);                                                         // Show bytes
148         WriteLog("%s", outbuf);                                                         // Display opcode & addressing, etc.
149
150         return addr - pc;
151 }