]> Shamusworld >> Repos - stargem2/blob - src/dis6809.cpp
Moving to trunk...
[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>
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;
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                 break;
250         case 3:                                                                                         // Relative
251                 sprintf(outbuf, "%s $%04X", mnem, ++addr + (int16)(int8)mainCPU.RdMem(addr));
252                 break;
253         case 4:                                                                                         // Long Relative
254                 sprintf(outbuf, "%s $%04X", mnem, addr + (int16)((mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++)) + 2);
255                 break;
256         case 5:                                                                                         // Inherent
257                 sprintf(outbuf, "%s ", mnem);
258                 break;
259         case 6:                                                                                         // Txfr/exchg/push/pull
260                 operand = mainCPU.RdMem(addr++);                                // Get txfr/exg/push/pull byte
261                 if ((opcode == 0x1E) || (opcode == 0x1F))               // Is it TXF/EXG?
262                         sprintf(tmp, "%s,%s", tregs[operand >> 4], tregs[operand & 0x0F]);
263                 else
264                 {
265                         tmp[0] = 0;
266                         if (operand & 0x01)  strcat(tmp, "CC ");
267                         if (operand & 0x02)  strcat(tmp, "A ");
268                         if (operand & 0x04)  strcat(tmp, "B ");
269                         if (operand & 0x08)  strcat(tmp, "DP ");
270                         if (operand & 0x10)  strcat(tmp, "X ");
271                         if (operand & 0x20)  strcat(tmp, "Y ");
272                         if (operand & 0x40)  (((opcode == 0x34) || (opcode == 0x35)) ? strcat(tmp, "U ") : strcat(tmp, "S "));
273                         if (operand & 0x80)  strcat(tmp, "PC");
274                 }
275
276                 sprintf(outbuf, "%s %s", mnem, tmp);
277                 break;
278         case 7:                                                                                         // Indexed (the tough one!)
279         {
280                 operand = mainCPU.RdMem(addr++);                                // Get IDX byte
281                 uint8 reg = ((operand & 0x60) >> 5), idxind = ((operand & 0x10) >> 4),
282                         lo_nyb = (operand & 0x0F),  boff;
283                 uint16 woff;
284
285                 strcpy(tmp, "??");
286                 if (!(operand & 0x80))                                                  // Hi bit set? Then decode 4 bit offset
287                         sprintf(tmp, "(%d),%s", (idxind ? -(16-lo_nyb) : lo_nyb), iregs[reg]);
288                 else                                                                                    // Add the ($nnnn,R) code dude...
289                 {
290                         if (idxind)
291                         {
292                                 switch(lo_nyb)
293                                 {
294                                 case 1:   sprintf(tmp, "(,%s++)", iregs[reg]);  break;
295                                 case 3:   sprintf(tmp, "(,--%s)", iregs[reg]);  break;
296                                 case 4:   sprintf(tmp, "(,%s)", iregs[reg]);  break;
297                                 case 5:   sprintf(tmp, "(B,%s)", iregs[reg]);  break;
298                                 case 6:   sprintf(tmp, "(A,%s)", iregs[reg]);  break;
299                                 case 8:
300                                         boff = mainCPU.RdMem(addr++);
301                                         sprintf(tmp, "($%02X,%s)", boff, iregs[reg]);
302                                         break;
303                                 case 9:
304                                         woff = (mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++);
305                                         sprintf(tmp, "($%04X,%s)", woff, iregs[reg]);
306                                         break;
307                                 case 11:  sprintf(tmp, "(D,%s)", iregs[reg]);  break;
308                                 case 12:
309                                         boff = mainCPU.RdMem(addr++);
310                                         sprintf(tmp, "($%02X,PC)", boff);
311                                         break;
312                                 case 13:  
313                                         woff = (mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++);
314                                         sprintf(tmp, "($%04X,PC)", woff);
315                                         break;
316                                 case 15:
317                                         woff = (mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++);
318                                         sprintf(tmp, "[$%04X]", woff);
319                                         break;
320                                 default:
321                                         strcpy(tmp, "??");
322                                 }
323                         }
324                         else
325                         {
326                                 switch(lo_nyb)
327                                 {
328                                 case 0:   sprintf(tmp, ",%s+", iregs[reg]);  break;
329                                 case 1:   sprintf(tmp, ",%s++", iregs[reg]);  break;
330                                 case 2:   sprintf(tmp, ",-%s", iregs[reg]);  break;
331                                 case 3:   sprintf(tmp, ",--%s", iregs[reg]);  break;
332                                 case 4:   sprintf(tmp, ",%s", iregs[reg]);  break;
333                                 case 5:   sprintf(tmp, "(B),%s", iregs[reg]);  break;
334                                 case 6:   sprintf(tmp, "(A),%s", iregs[reg]);  break;
335                                 case 8:
336                                         boff = mainCPU.RdMem(addr++);
337                                         sprintf(tmp, "($%02X),%s", boff, iregs[reg]);
338                                         break;
339                                 case 9:
340                                         woff = (mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++);
341                                         sprintf(tmp, "($%04X),%s", woff, iregs[reg]);
342                                         break;
343                                 case 11:
344                                         sprintf(tmp, "(D),%s", iregs[reg]);
345                                         break;
346                                 case 12:
347                                         boff = mainCPU.RdMem(addr++);
348                                         sprintf(tmp, "($%02X),PC", boff);
349                                         break;
350                                 case 13:  
351                                         woff = (mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++);
352                                         sprintf(tmp, "($%04X),PC", woff);
353                                         break;
354                                 default:
355                                         strcpy(tmp, "??");
356                                 }
357                         }
358                 }
359                 sprintf(outbuf, "%s %s", mnem, tmp);
360                 break;
361         }
362         case 8:                                                                                         // Immediate
363                 sprintf(outbuf, "%s #$%02X", mnem, mainCPU.RdMem(addr++));
364                 break;
365         case 9:                                                                                         // Long Immediate
366                 sprintf(outbuf, "%s #$%04X", mnem, (mainCPU.RdMem(addr++) << 8) | mainCPU.RdMem(addr++));
367                 break;
368         }
369
370         DisplayBytes(pc, addr);                                                         // Show bytes
371         WriteLog("%s", outbuf);                                                         // Display opcode & addressing, etc.
372
373         return addr - pc;
374 }