]> Shamusworld >> Repos - stargem2/blob - src/dis6808.cpp
17cd301fd51f4c45b5e0a70c069466a63a799060
[stargem2] / src / dis6808.cpp
1 //
2 // 6808 disassembler
3 //
4 // by James L. Hammons
5 //
6 // (c) 2004 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 extern V6808REGS soundCPU;//Hm.
21
22 // Private globals variables
23
24 static char op_mat[256] = {
25   0, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
26   5, 5, 0, 0, 0, 0, 5, 5, 0, 5, 0, 5, 0, 0, 0, 0,
27   3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
28   5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 0, 5, 0, 0, 5, 5,
29   5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
30   5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
31   7, 0, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7,
32   2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2,
33   8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 8, 9, 3, 9, 0,
34   1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,
35   7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
36   2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
37   8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 8, 0, 0, 9, 0,
38   1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,
39   7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7,
40   2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2
41 };
42
43 static char mnemonics[256][6] = {
44   "???  ","NOP  ","???  ","???  ","???  ","???  ","TAP  ","TPA  ",
45   "INX  ","DEX  ","CLV  ","SEV  ","CLC  ","SEC  ","CLI  ","SEI  ",
46   "SBA  ","CBA  ","???  ","???  ","???  ","???  ","TAB  ","TBA  ",
47   "???  ","DAA  ","???  ","ABA  ","???  ","???  ","???  ","???  ",
48   "BRA  ","???  ","BHI  ","BLS  ","BCC  ","BCS  ","BNE  ","BEQ  ",
49   "BVC  ","BVS  ","BPL  ","BMI  ","BGE  ","BLT  ","BGT  ","BLE  ",
50   "TSX  ","INS  ","PULA ","PULB ","DES  ","TXS  ","PSHA ","PSHB ",
51   "???  ","RTS  ","???  ","RTI  ","???  ","???  ","WAI  ","SWI  ",
52   "NEGA ","???  ","???  ","COMA ","LSRA ","???  ","RORA ","ASRA ",
53   "ASLA ","ROLA ","DECA ","???  ","INCA ","TSTA ","???  ","CLRA ",
54   "NEGB ","???  ","???  ","COMB ","LSRB ","???  ","RORB ","ASRB ",
55   "ASLB ","ROLB ","DECB ","???  ","INCB ","TSTB ","???  ","CLRB ",
56   "NEG  ","???  ","???  ","COM  ","LSR  ","???  ","ROR  ","ASR  ",
57   "ASL  ","ROL  ","DEC  ","???  ","INC  ","TST  ","JMP  ","CLR  ",
58   "NEG  ","???  ","???  ","COM  ","LSR  ","???  ","ROR  ","ASR  ",
59   "ASL  ","ROL  ","DEC  ","???  ","INC  ","TST  ","JMP  ","CLR  ",
60   "SUBA ","CMPA ","SBCA ","???  ","ANDA ","BITA ","LDAA ","???  ",
61   "EORA ","ADCA ","ORAA ","ADDA ","CPX  ","BSR  ","LDS  ","???  ",
62   "SUBA ","CMPA ","SBCA ","???  ","ANDA ","BITA ","LDAA ","STAA ",
63   "EORA ","ADCA ","ORAA ","ADDA ","CPX  ","???  ","LDS  ","STS  ",
64   "SUBA ","CMPA ","SBCA ","???  ","ANDA ","BITA ","LDAA ","STAA ",
65   "EORA ","ADCA ","ORAA ","ADDA ","CPX  ","JSR  ","LDS  ","STS  ",
66   "SUBA ","CMPA ","SBCA ","???  ","ANDA ","BITA ","LDAA ","STAA ",
67   "EORA ","ADCA ","ORAA ","ADDA ","CPX  ","JSR  ","LDS  ","STS  ",
68   "SUBB ","CMPB ","SBCB ","???  ","ANDB ","BITB ","LDAB ","???  ",
69   "EORB ","ADCB ","ORAB ","ADDB ","???  ","???  ","LDX  ","???  ",
70   "SUBB ","CMPB ","SBCB ","???  ","ANDB ","BITB ","LDAB ","STAB ",
71   "EORB ","ADCB ","ORAB ","ADDB ","???  ","???  ","LDX  ","STX  ",
72   "SUBB ","CMPB ","SBCB ","???  ","ANDB ","BITB ","LDAB ","STAB ",
73   "EORB ","ADCB ","ORAB ","ADDB ","???  ","???  ","LDX  ","STX  ",
74   "SUBB ","CMPB ","SBCB ","???  ","ANDB ","BITB ","LDAB ","STAB ",
75   "EORB ","ADCB ","ORAB ","ADDB ","???  ","???  ","LDX  ","STX  "
76 };
77
78 //
79 // Display bytes in mem in hex
80 //
81 static void DisplayBytes(uint16 src, uint32 dst)
82 {
83         WriteLog("%04X: ", src);
84         uint8 cnt = 0;                                                                          // Init counter...
85
86         if (src > dst)
87                 dst += 0x10000;                                                                 // That should fix the FFFF bug...
88
89         for(uint32 i=src; i<dst; i++)
90         {
91                 WriteLog("%02X ", soundCPU.RdMem(i));
92                 cnt++;                                                                                  // Bump counter...
93         }
94
95         for(int i=cnt; i<5; i++)                                                        // Pad the leftover spaces...
96                 WriteLog("   ");
97 }
98
99 //
100 // Decode a 6808 instruction
101 //
102 int Decode6808(uint16 pc)
103 {
104         char outbuf[80];
105
106         uint16 addr = pc, offset;
107         uint8 opcode = soundCPU.RdMem(addr++);                          // Get the opcode
108
109         switch (op_mat[opcode])                                                         // Decode the addressing mode...
110         {
111         case 0:                                                                                         // Illegal
112                 sprintf(outbuf, "???          ");
113                 break;
114         case 1:                                                                                         // Zero page
115                 sprintf(outbuf, "%s $%02X    ", mnemonics[opcode], soundCPU.RdMem(addr++));
116                 break;
117         case 2:                                                                                         // Absolute
118 //              sprintf(outbuf, "%s $%04X", mnemonics[opcode], (soundCPU.RdMem(addr++) << 8) | soundCPU.RdMem(addr++));
119                 offset = (soundCPU.RdMem(addr + 0) << 8) | soundCPU.RdMem(addr + 1);
120                 addr += 2;
121                 sprintf(outbuf, "%s $%04X  ", mnemonics[opcode], offset);
122                 break;
123         case 3:                                                                                         // Relative
124 //              sprintf(outbuf, "%s $%04X", mnemonics[opcode], ++addr + (int16)(int8)soundCPU.RdMem(addr));
125                 offset = addr + 1 + (int16)(int8)soundCPU.RdMem(addr);
126                 addr++;
127                 sprintf(outbuf, "%s $%04X  ", mnemonics[opcode], offset);
128                 break;
129         case 5:                                                                                         // Inherent
130                 sprintf(outbuf, "%s        ", mnemonics[opcode]);
131                 break;
132         case 7:                                                                                         // Indexed
133                 sprintf(outbuf, "%s $%02X,X  ", mnemonics[opcode], soundCPU.RdMem(addr++));
134                 break;
135         case 8:                                                                                         // Immediate
136                 sprintf(outbuf, "%s #$%02X   ", mnemonics[opcode], soundCPU.RdMem(addr++));
137                 break;
138         case 9:                                                                                         // Long Immediate
139 //              sprintf(outbuf, "%s #$%04X", mnemonics[opcode], (soundCPU.RdMem(addr++) << 8) | soundCPU.RdMem(addr++));
140                 offset = (soundCPU.RdMem(addr + 0) << 8) | soundCPU.RdMem(addr + 1);
141                 addr += 2;
142                 sprintf(outbuf, "%s #$%04X ", mnemonics[opcode], offset);
143                 break;
144         }
145
146         DisplayBytes(pc, addr);                                                         // Show bytes
147         WriteLog("%s", outbuf);                                                         // Display opcode & addressing, etc.
148
149         return addr - pc;
150 }