]> Shamusworld >> Repos - stargem2/blob - src/dis6809.cpp
Fixed the dreaded demo failing bug! HUZZAH! Turned out to be an IRQ line
[stargem2] / src / dis6809.cpp
1 //
2 // 6809 disassembler
3 //
4 // by James L. Hammons
5 //
6 // (c) 2004 Underground Software
7 //
8
9 #include "dis6809.h"
10
11 #include <stdio.h>
12 #include <string.h>
13 #include "v6809.h"
14 #include "log.h"
15
16 using namespace std;
17
18 // External shit
19
20 extern V6809REGS mainCPU;//Hm.
21
22 static char op_mat1[256] = {
23         1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
24         0, 0, 5, 5, 0, 0, 4, 4, 0, 5, 8, 0, 8, 5, 6, 6,
25         3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
26         7, 7, 7, 7, 6, 6, 6, 6, 0, 5, 5, 5, 8, 5, 5, 5,
27         5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
28         5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 5, 0, 5,
29         7, 0, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7,
30         2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2,
31         8, 8, 8, 9, 8, 8, 8, 0, 8, 8, 8, 8, 9, 3, 9, 0,
32         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
33         7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
34         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
35         8, 8, 8, 9, 8, 8, 8, 0, 8, 8, 8, 8, 9, 0, 9, 0,
36         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
37         7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
38         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
39 },
40
41 op_mat2[256] = {
42         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
43         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44         0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
45         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
46         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
47         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
48         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50         0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0,
51         0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,
52         0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 7,
53         0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2,
54         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0,
55         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
56         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7,
57         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2
58 },
59
60 op_mat3[256] = {
61         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
65         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
67         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
68         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
69         0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
70         0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
71         0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
72         0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
73         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
74         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
75         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
76         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
77 };
78
79 static char mnemonics[256][6] = {
80         "NEG  ","???  ","???  ","COM  ","LSR  ","???  ","ROR  ","ASR  ",
81         "LSL  ","ROL  ","DEC  ","???  ","INC  ","TST  ","JMP  ","CLR  ",
82         "PAGE1","PAGE2","NOP  ","SYNC ","???  ","???  ","LBRA ","LBSR ",
83         "???  ","DAA  ","ORCC ","???  ","ANDCC","SEX  ","EXG  ","TFR  ",
84         "BRA  ","BRN  ","BHI  ","BLS  ","BHS  ","BLO  ","BNE  ","BEQ  ",
85         "BVC  ","BVS  ","BPL  ","BMI  ","BGE  ","BLT  ","BGT  ","BLE  ",
86         "LEAX ","LEAY ","LEAS ","LEAU ","PSHS ","PULS ","PSHU ","PULU ",
87         "???  ","RTS  ","ABX  ","RTI  ","CWAI ","MUL  ","RESET","SWI  ",
88         "NEGA ","???  ","???  ","COMA ","LSRA ","???  ","RORA ","ASRA ",
89         "LSLA ","ROLA ","DECA ","???  ","INCA ","TSTA ","???  ","CLRA ",
90         "NEGB ","???  ","???  ","COMB ","LSRB ","???  ","RORB ","ASRB ",
91         "LSLB ","ROLB ","DECB ","???  ","INCB ","TSTB ","???  ","CLRB ",
92         "NEG  ","???  ","???  ","COM  ","LSR  ","???  ","ROR  ","ASR  ",
93         "LSL  ","ROL  ","DEC  ","???  ","INC  ","TST  ","JMP  ","CLR  ",
94         "NEG  ","???  ","???  ","COM  ","LSR  ","???  ","ROR  ","ASR  ",
95         "LSL  ","ROL  ","DEC  ","???  ","INC  ","TST  ","JMP  ","CLR  ",
96         "SUBA ","CMPA ","SCBA ","SUBD ","ANDA ","BITA ","LDA  ","???  ",
97         "EORA ","ADCA ","ORA  ","ADDA ","CMPX ","BSR  ","LDX  ","???  ",
98         "SUBA ","CMPA ","SBCA ","SUBD ","ANDA ","BITA ","LDA  ","STA  ",
99         "EORA ","ADCA ","ORA  ","ADDA ","CMPX ","JSR  ","LDX  ","STX  ",
100         "SUBA ","CMPA ","SBCA ","SUBD ","ANDA ","BITA ","LDA  ","STA  ",
101         "EORA ","ADCA ","ORA  ","ADDA ","CMPX ","JSR  ","LDX  ","STX  ",
102         "SUBA ","CMPA ","SBCA ","SUBD ","ANDA ","BITA ","LDA  ","STA  ",
103         "EORA ","ADCA ","ORA  ","ADDA ","CMPX ","JSR  ","LDX  ","STX  ",
104         "SUBB ","CMPB ","SCBB ","ADDD ","ANDB ","BITB ","LDB  ","???  ",
105         "EORB ","ADCB ","ORB  ","ADDB ","LDD  ","???  ","LDU  ","???  ",
106         "SUBB ","CMPB ","SBCB ","ADDD ","ANDB ","BITB ","LDB  ","STB  ",
107         "EORB ","ADCB ","ORB  ","ADDB ","LDD  ","STD  ","LDU  ","STU  ",
108         "SUBB ","CMPB ","SBCB ","ADDD ","ANDB ","BITB ","LDB  ","STB  ",
109         "EORB ","ADCB ","ORB  ","ADDB ","LDD  ","STD  ","LDU  ","STU  ",
110         "SUBB ","CMPB ","SBCB ","ADDD ","ANDB ","BITB ","LDB  ","STB  ",
111         "EORB ","ADCB ","ORB  ","ADDB ","LDD  ","STD  ","LDU  ","STU  "
112 },
113
114 mnemonics2[256][6] = {
115         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
116         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
117         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
118         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
119         "???  ","LBRN ","LBHI ","LBLS ","LBHS ","LBLO ","LBNE ","LBEQ ",
120         "LBVC ","LBVS ","LBPL ","LBMI ","LBGE ","LBLT ","LBGT ","LBLE ",
121         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
122         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","SWI2 ",
123         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
124         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
125         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
126         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
127         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
128         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
129         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
130         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
131         "???  ","???  ","???  ","CMPD ","???  ","???  ","???  ","???  ",
132         "???  ","???  ","???  ","???  ","CMPY ","???  ","LDY  ","???  ",
133         "???  ","???  ","???  ","CMPD ","???  ","???  ","???  ","???  ",
134         "???  ","???  ","???  ","???  ","CMPY ","???  ","LDY  ","STY  ",
135         "???  ","???  ","???  ","CMPD ","???  ","???  ","???  ","???  ",
136         "???  ","???  ","???  ","???  ","CMPY ","???  ","LDY  ","STY  ",
137         "???  ","???  ","???  ","CMPD ","???  ","???  ","???  ","???  ",
138         "???  ","???  ","???  ","???  ","CMPY ","???  ","LDY  ","STY  ",
139         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
140         "???  ","???  ","???  ","???  ","???  ","???  ","LDS  ","???  ",
141         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
142         "???  ","???  ","???  ","???  ","???  ","???  ","LDS  ","STS  ",
143         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
144         "???  ","???  ","???  ","???  ","???  ","???  ","LDS  ","STS  ",
145         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
146         "???  ","???  ","???  ","???  ","???  ","???  ","LDS  ","STS  "
147 },
148
149 mnemonics3[256][6] = {
150         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
151         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
152         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
153         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
154         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
155         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
156         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
157         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","SWI3 ",
158         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
159         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
160         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
161         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
162         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
163         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
164         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
165         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
166         "???  ","???  ","???  ","CMPU ","???  ","???  ","???  ","???  ",
167         "???  ","???  ","???  ","???  ","CMPS ","???  ","???  ","???  ",
168         "???  ","???  ","???  ","CMPU ","???  ","???  ","???  ","???  ",
169         "???  ","???  ","???  ","???  ","CMPS ","???  ","???  ","???  ",
170         "???  ","???  ","???  ","CMPU ","???  ","???  ","???  ","???  ",
171         "???  ","???  ","???  ","???  ","CMPS ","???  ","???  ","???  ",
172         "???  ","???  ","???  ","CMPU ","???  ","???  ","???  ","???  ",
173         "???  ","???  ","???  ","???  ","CMPS ","???  ","???  ","???  ",
174         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
175         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
176         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
177         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
178         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
179         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
180         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  ",
181         "???  ","???  ","???  ","???  ","???  ","???  ","???  ","???  "
182 },
183
184 tregs[16][3] = {
185         "D",  "X", "Y",  "U",  "S",  "PC", "??", "??",
186         "A",  "B", "CC", "DP", "??", "??", "??", "??"
187 },
188
189 iregs[4][2] = {"X", "Y", "U", "S" };
190
191 //
192 // Display bytes in mem in hex
193 //
194 static void DisplayBytes(uint16 src, uint32 dst)
195 {
196         WriteLog("%04X: ", src);
197         uint8 cnt = 0;                                                                          // Init counter...
198
199         if (src > dst)
200                 dst += 0x10000;                                                                 // That should fix the FFFF bug...
201
202         for(uint32 i=src; i<dst; i++)
203         {
204                 WriteLog("%02X ", mainCPU.RdMem(i));
205                 cnt++;                                                                                  // Bump counter...
206         }
207
208         for(int i=cnt; i<5; i++)                                                        // Pad the leftover spaces...
209                 WriteLog("   ");
210 }
211
212 //
213 // Decode a 6809 instruction at 'addr'
214 //
215 int Decode6809(uint16 pc)
216 {
217         char outbuf[80], mnem[6], tmp[30];
218         uint8 opcode2, operand;
219
220         uint16 addr = pc, offset;
221
222         uint8 opcode = mainCPU.RdMem(addr++);                           // Get the opcode
223         uint8 admode = op_mat1[opcode];                                         // addressing mode
224         strcpy(mnem, mnemonics[opcode]);                                        // Copy page 1 opcode
225
226         if (opcode == 0x10)                                                                     // Extended opcode?
227         {
228                 opcode2 = mainCPU.RdMem(addr++);                                // Then get next byte
229                 admode = op_mat2[opcode2];                                              // And use it as index into 'op_mat2'
230                 strcpy(mnem, mnemonics2[opcode2]);                              // Overwrite mnemonic
231         }
232         else if (opcode == 0x11)                                                        // Same as above...
233         {
234                 opcode2 = mainCPU.RdMem(addr++);
235                 admode = op_mat3[opcode2];
236                 strcpy(mnem, mnemonics3[opcode2]);                              // Overwrite mnemonic
237         }
238
239         switch (admode)                                                                         // Decode it...
240         {
241         case 0:                                                                                         // Illegal
242                 sprintf(outbuf, "???");
243                 break;
244         case 1:                                                                                         // Zero page
245                 sprintf(outbuf, "%s $%02X", mnem, mainCPU.RdMem(addr++));
246                 break;
247         case 2:                                                                                         // Absolute
248 //              sprintf(outbuf, "%s $%04X", mnem, (mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++));
249                 offset = (mainCPU.RdMem(addr) << 8) | mainCPU.RdMem(addr + 1);
250                 addr += 2;
251                 sprintf(outbuf, "%s $%04X", mnem, offset);
252                 break;
253         case 3:                                                                                         // Relative
254 //DISNOWOK--FIX
255 //              sprintf(outbuf, "%s $%04X", mnem, ++addr + (int16)((int8)mainCPU.RdMem(addr)));
256                 offset = addr + 1 + (int16)(int8)mainCPU.RdMem(addr);
257                 addr++;
258                 sprintf(outbuf, "%s $%04X", mnem, offset);
259                 break;
260         case 4:                                                                                         // Long Relative
261 //              sprintf(outbuf, "%s $%04X", mnem, addr + (int16)((mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++)) + 2);
262                 offset = addr + (int16)((mainCPU.RdMem(addr) << 8) | mainCPU.RdMem(addr + 1)) + 2;
263                 addr += 2;
264                 sprintf(outbuf, "%s $%04X", mnem, offset);
265                 break;
266         case 5:                                                                                         // Inherent
267                 sprintf(outbuf, "%s ", mnem);
268                 break;
269         case 6:                                                                                         // Txfr/exchg/push/pull
270                 operand = mainCPU.RdMem(addr++);                                // Get txfr/exg/push/pull byte
271                 if ((opcode == 0x1E) || (opcode == 0x1F))               // Is it TXF/EXG?
272                         sprintf(tmp, "%s,%s", tregs[operand >> 4], tregs[operand & 0x0F]);
273                 else
274                 {
275                         tmp[0] = 0;
276                         if (operand & 0x01)  strcat(tmp, "CC ");
277                         if (operand & 0x02)  strcat(tmp, "A ");
278                         if (operand & 0x04)  strcat(tmp, "B ");
279                         if (operand & 0x08)  strcat(tmp, "DP ");
280                         if (operand & 0x10)  strcat(tmp, "X ");
281                         if (operand & 0x20)  strcat(tmp, "Y ");
282                         if (operand & 0x40)  (((opcode == 0x34) || (opcode == 0x35)) ? strcat(tmp, "U ") : strcat(tmp, "S "));
283                         if (operand & 0x80)  strcat(tmp, "PC");
284                 }
285
286                 sprintf(outbuf, "%s %s", mnem, tmp);
287                 break;
288         case 7:                                                                                         // Indexed (the tough one!)
289         {
290                 operand = mainCPU.RdMem(addr++);                                // Get IDX byte
291                 uint8 reg = ((operand & 0x60) >> 5), idxind = ((operand & 0x10) >> 4),
292                         lo_nyb = (operand & 0x0F),  boff;
293                 uint16 woff;
294
295                 strcpy(tmp, "??");
296                 if (!(operand & 0x80))                                                  // Hi bit set? Then decode 4 bit offset
297                         sprintf(tmp, "(%d),%s", (idxind ? -(16-lo_nyb) : lo_nyb), iregs[reg]);
298                 else                                                                                    // Add the ($nnnn,R) code dude...
299                 {
300                         if (idxind)
301                         {
302                                 switch(lo_nyb)
303                                 {
304                                 case 1:   sprintf(tmp, "(,%s++)", iregs[reg]);  break;
305                                 case 3:   sprintf(tmp, "(,--%s)", iregs[reg]);  break;
306                                 case 4:   sprintf(tmp, "(,%s)", iregs[reg]);  break;
307                                 case 5:   sprintf(tmp, "(B,%s)", iregs[reg]);  break;
308                                 case 6:   sprintf(tmp, "(A,%s)", iregs[reg]);  break;
309                                 case 8:
310                                         boff = mainCPU.RdMem(addr++);
311                                         sprintf(tmp, "($%02X,%s)", boff, iregs[reg]);
312                                         break;
313                                 case 9:
314                                         woff = (mainCPU.RdMem(addr) << 8) | mainCPU.RdMem(addr + 1);
315                                         addr += 2;
316                                         sprintf(tmp, "($%04X,%s)", woff, iregs[reg]);
317                                         break;
318                                 case 11:  sprintf(tmp, "(D,%s)", iregs[reg]);  break;
319                                 case 12:
320                                         boff = mainCPU.RdMem(addr++);
321                                         sprintf(tmp, "($%02X,PC)", boff);
322                                         break;
323                                 case 13:
324                                         woff = (mainCPU.RdMem(addr) << 8) | mainCPU.RdMem(addr + 1);
325                                         addr += 2;
326                                         sprintf(tmp, "($%04X,PC)", woff);
327                                         break;
328                                 case 15:
329                                         woff = (mainCPU.RdMem(addr) << 8) | mainCPU.RdMem(addr + 1);
330                                         addr += 2;
331                                         sprintf(tmp, "[$%04X]", woff);
332                                         break;
333                                 default:
334                                         strcpy(tmp, "??");
335                                 }
336                         }
337                         else
338                         {
339                                 switch(lo_nyb)
340                                 {
341                                 case 0:   sprintf(tmp, ",%s+", iregs[reg]);  break;
342                                 case 1:   sprintf(tmp, ",%s++", iregs[reg]);  break;
343                                 case 2:   sprintf(tmp, ",-%s", iregs[reg]);  break;
344                                 case 3:   sprintf(tmp, ",--%s", iregs[reg]);  break;
345                                 case 4:   sprintf(tmp, ",%s", iregs[reg]);  break;
346                                 case 5:   sprintf(tmp, "(B),%s", iregs[reg]);  break;
347                                 case 6:   sprintf(tmp, "(A),%s", iregs[reg]);  break;
348                                 case 8:
349                                         boff = mainCPU.RdMem(addr++);
350                                         sprintf(tmp, "($%02X),%s", boff, iregs[reg]);
351                                         break;
352                                 case 9:
353                                         woff = (mainCPU.RdMem(addr) << 8) | mainCPU.RdMem(addr + 1);
354                                         addr += 2;
355                                         sprintf(tmp, "($%04X),%s", woff, iregs[reg]);
356                                         break;
357                                 case 11:
358                                         sprintf(tmp, "(D),%s", iregs[reg]);
359                                         break;
360                                 case 12:
361                                         boff = mainCPU.RdMem(addr++);
362                                         sprintf(tmp, "($%02X),PC", boff);
363                                         break;
364                                 case 13:
365                                         woff = (mainCPU.RdMem(addr) << 8) | mainCPU.RdMem(addr + 1);
366                                         addr += 2;
367                                         sprintf(tmp, "($%04X),PC", woff);
368                                         break;
369                                 default:
370                                         strcpy(tmp, "??");
371                                 }
372                         }
373                 }
374                 sprintf(outbuf, "%s %s", mnem, tmp);
375                 break;
376         }
377         case 8:                                                                                         // Immediate
378                 sprintf(outbuf, "%s #$%02X", mnem, mainCPU.RdMem(addr++));
379                 break;
380         case 9:                                                                                         // Long Immediate
381 //              sprintf(outbuf, "%s #$%04X", mnem, (mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++));
382                 offset = (mainCPU.RdMem(addr) << 8) | mainCPU.RdMem(addr + 1);
383                 addr += 2;
384                 sprintf(outbuf, "%s #$%04X", mnem, offset);
385                 break;
386         }
387
388         DisplayBytes(pc, addr);                                                         // Show bytes
389         WriteLog("%s", outbuf);                                                         // Display opcode & addressing, etc.
390
391         return addr - pc;
392 }