0
|
1 /* 6809 Simulator V09.
|
|
2
|
|
3 created 1994,1995 by L.C. Benschop.
|
|
4 copyleft (c) 1994-2014 by the sbc09 team, see AUTHORS for more details.
|
|
5 license: GNU General Public License version 2, see LICENSE for more details.
|
|
6
|
|
7 This program simulates a 6809 processor.
|
|
8
|
|
9 System dependencies: short must be 16 bits.
|
|
10 char must be 8 bits.
|
|
11 long must be more than 16 bits.
|
|
12 arrays up to 65536 bytes must be supported.
|
|
13 machine must be twos complement.
|
|
14 Most Unix machines will work. For MSODS you need long pointers
|
|
15 and you may have to malloc() the mem array of 65536 bytes.
|
|
16
|
|
17 Special instructions:
|
|
18 SWI2 writes char to stdout from register B.
|
|
19 SWI3 reads char from stdout to register B, sets carry at EOF.
|
|
20 (or when no key available when using term control).
|
|
21 SWI retains its normal function.
|
|
22 CWAI and SYNC stop simulator.
|
|
23 Note: special instructions are gone for now.
|
|
24
|
|
25 ACIA emulation at port $E000
|
|
26
|
|
27 Note: BIG_ENDIAN option is no longer needed.
|
|
28 */
|
|
29
|
|
30 #include <stdio.h>
|
|
31 #include <unistd.h>
|
|
32
|
|
33 #define engine
|
|
34 #include "v09.h"
|
|
35
|
|
36 #define USLEEP 1000
|
|
37 Byte aca,acb;
|
|
38 Byte *breg=&aca,*areg=&acb;
|
|
39 static int tracetrick=0;
|
9
|
40 extern long romstart;
|
0
|
41
|
21
|
42 #ifndef USE_MMU
|
|
43
|
|
44 static Byte mem1(Word adr) {
|
|
45 if ((adr&0xfe00)==(IOPAGE&0xfe00)) return do_input(adr&0x1ff);
|
|
46 return mem[adr];
|
|
47 }
|
|
48
|
|
49 static void SETBYTE1(Word a,Byte n) {
|
|
50 if ((a&0xfe00)==(IOPAGE&0xfe00)) do_output(a&0x1ff,n);
|
|
51 if(!(a>=romstart))mem[a]=n;
|
|
52 }
|
|
53 #define mem(a) mem1(a)
|
|
54 #define SETBYTE(a,n) SETBYTE1(a,n);
|
|
55
|
|
56 #else
|
|
57
|
|
58 int paddr(Word adr, Byte *immu) {
|
|
59 if ((adr&0xfe00)==(IOPAGE&0xfe00)) return memsize-0x10000+adr;
|
|
60 return (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff );
|
|
61 }
|
10
|
62
|
11
|
63 Byte * mem0(Byte *iphymem, Word adr, Byte *immu) {
|
21
|
64 return & iphymem[ paddr(adr,immu) ];
|
18
|
65 }
|
11
|
66
|
|
67 static Byte mem1(Byte *iphymem, Word adr, Byte *immu) {
|
18
|
68 if ((adr&0xfe00)==(IOPAGE&0xfe00)) return do_input(adr&0x1ff);
|
11
|
69 Byte *p = mem0(iphymem, adr, immu);
|
16
|
70 if(!(p-phymem>=rommemsize)) {
|
11
|
71 return *p;
|
|
72 } else {
|
|
73 return 0xff;
|
|
74 }
|
|
75 }
|
9
|
76
|
11
|
77 #define mem(a) mem1(iphymem,a,immu)
|
|
78
|
18
|
79 #define SETBYTE(a,n) { \
|
|
80 Word adr = a; \
|
|
81 if ((adr&0xfe00)==(IOPAGE&0xfe00)) { \
|
|
82 do_output(adr&0x1ff,n); \
|
|
83 immu = mmu; \
|
|
84 } else {\
|
|
85 Byte *p = mem0(iphymem, adr,immu); \
|
|
86 if(!(p-phymem>=romstart)) { \
|
|
87 *p=n; \
|
|
88 } \
|
|
89 } \
|
|
90 }
|
11
|
91
|
|
92 #endif
|
4
|
93
|
|
94 #define GETWORD(a) (mem(a)<<8|mem((a)+1))
|
11
|
95 #define SETWORD(a,n) {Word a1=a;SETBYTE(a1,n>>8);SETBYTE(a1+1,n);}
|
9
|
96
|
11
|
97 /* Macros for load and store of accumulators. Can be modified to check
|
|
98 for port addresses */
|
|
99 // #define LOADAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))reg=mem(eaddr);else\
|
|
100 // reg=do_input(eaddr&0xff);
|
|
101 // #define STOREAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))SETBYTE(eaddr,reg)else\
|
|
102 // do_output(eaddr&0xff,reg);
|
9
|
103
|
0
|
104 /* Two bytes of a word are fetched separately because of
|
|
105 the possible wrap-around at address $ffff and alignment
|
|
106 */
|
|
107
|
4
|
108 #define IMMBYTE(b) b=mem(ipcreg++);
|
0
|
109 #define IMMWORD(w) {w=GETWORD(ipcreg);ipcreg+=2;}
|
|
110
|
|
111 #define PUSHBYTE(b) {--isreg;SETBYTE(isreg,b)}
|
|
112 #define PUSHWORD(w) {isreg-=2;SETWORD(isreg,w)}
|
4
|
113 #define PULLBYTE(b) b=mem(isreg++);
|
0
|
114 #define PULLWORD(w) {w=GETWORD(isreg);isreg+=2;}
|
|
115 #define PSHUBYTE(b) {--iureg;SETBYTE(iureg,b)}
|
|
116 #define PSHUWORD(w) {iureg-=2;SETWORD(iureg,w)}
|
4
|
117 #define PULUBYTE(b) b=mem(iureg++);
|
0
|
118 #define PULUWORD(w) {w=GETWORD(iureg);iureg+=2;}
|
|
119
|
|
120 #define SIGNED(b) ((Word)(b&0x80?b|0xff00:b))
|
|
121
|
|
122 #define GETDREG ((iareg<<8)|ibreg)
|
|
123 #define SETDREG(n) {iareg=(n)>>8;ibreg=(n);}
|
|
124
|
|
125 /* Macros for addressing modes (postbytes have their own code) */
|
|
126 #define DIRECT {IMMBYTE(eaddr) eaddr|=(idpreg<<8);}
|
|
127 #define IMM8 {eaddr=ipcreg++;}
|
|
128 #define IMM16 {eaddr=ipcreg;ipcreg+=2;}
|
|
129 #define EXTENDED {IMMWORD(eaddr)}
|
|
130
|
|
131 /* macros to set status flags */
|
|
132 #define SEC iccreg|=0x01;
|
|
133 #define CLC iccreg&=0xfe;
|
|
134 #define SEZ iccreg|=0x04;
|
|
135 #define CLZ iccreg&=0xfb;
|
|
136 #define SEN iccreg|=0x08;
|
|
137 #define CLN iccreg&=0xf7;
|
|
138 #define SEV iccreg|=0x02;
|
|
139 #define CLV iccreg&=0xfd;
|
|
140 #define SEH iccreg|=0x20;
|
|
141 #define CLH iccreg&=0xdf;
|
|
142
|
|
143 /* set N and Z flags depending on 8 or 16 bit result */
|
|
144 #define SETNZ8(b) {if(b)CLZ else SEZ if(b&0x80)SEN else CLN}
|
|
145 #define SETNZ16(b) {if(b)CLZ else SEZ if(b&0x8000)SEN else CLN}
|
|
146
|
|
147 #define SETSTATUS(a,b,res) if((a^b^res)&0x10) SEH else CLH \
|
|
148 if((a^b^res^(res>>1))&0x80)SEV else CLV \
|
|
149 if(res&0x100)SEC else CLC SETNZ8((Byte)res)
|
|
150
|
|
151 #define SETSTATUSD(a,b,res) {if(res&0x10000) SEC else CLC \
|
|
152 if(((res>>1)^a^b^res)&0x8000) SEV else CLV \
|
|
153 SETNZ16((Word)res)}
|
|
154
|
|
155 /* Macros for branch instructions */
|
|
156 #define BRANCH(f) if(!iflag){IMMBYTE(tb) if(f)ipcreg+=SIGNED(tb);}\
|
|
157 else{IMMWORD(tw) if(f)ipcreg+=tw;}
|
|
158 #define NXORV ((iccreg&0x08)^((iccreg&0x02)<<2))
|
|
159
|
|
160 /* MAcros for setting/getting registers in TFR/EXG instructions */
|
|
161 #define GETREG(val,reg) switch(reg) {\
|
|
162 case 0: val=GETDREG;break;\
|
|
163 case 1: val=ixreg;break;\
|
|
164 case 2: val=iyreg;break;\
|
|
165 case 3: val=iureg;break;\
|
|
166 case 4: val=isreg;break;\
|
|
167 case 5: val=ipcreg;break;\
|
|
168 case 8: val=iareg;break;\
|
|
169 case 9: val=ibreg;break;\
|
|
170 case 10: val=iccreg;break;\
|
|
171 case 11: val=idpreg;break;}
|
|
172
|
|
173 #define SETREG(val,reg) switch(reg) {\
|
|
174 case 0: SETDREG(val) break;\
|
|
175 case 1: ixreg=val;break;\
|
|
176 case 2: iyreg=val;break;\
|
|
177 case 3: iureg=val;break;\
|
|
178 case 4: isreg=val;break;\
|
|
179 case 5: ipcreg=val;break;\
|
|
180 case 8: iareg=val;break;\
|
|
181 case 9: ibreg=val;break;\
|
|
182 case 10: iccreg=val;break;\
|
|
183 case 11: idpreg=val;break;}
|
|
184
|
11
|
185
|
|
186 #define LOADAC(reg) reg=mem(eaddr);
|
|
187 #define STOREAC(reg) SETBYTE(eaddr,reg);
|
0
|
188
|
|
189 #define LOADREGS ixreg=xreg;iyreg=yreg;\
|
|
190 iureg=ureg;isreg=sreg;\
|
|
191 ipcreg=pcreg;\
|
|
192 iareg=*areg;ibreg=*breg;\
|
4
|
193 idpreg=dpreg;iccreg=ccreg;immu=mmu;
|
0
|
194
|
|
195 #define SAVEREGS xreg=ixreg;yreg=iyreg;\
|
|
196 ureg=iureg;sreg=isreg;\
|
|
197 pcreg=ipcreg;\
|
|
198 *areg=iareg;*breg=ibreg;\
|
4
|
199 dpreg=idpreg;ccreg=iccreg;mmu=immu;
|
0
|
200
|
|
201
|
|
202 unsigned char haspostbyte[] = {
|
|
203 /*0*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
204 /*1*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
205 /*2*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
206 /*3*/ 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
207 /*4*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
208 /*5*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
209 /*6*/ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
|
210 /*7*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
211 /*8*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
212 /*9*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
213 /*A*/ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
|
214 /*B*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
215 /*C*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
216 /*D*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
217 /*E*/ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
|
|
218 /*F*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
219 };
|
|
220
|
9
|
221 extern char *prog ;
|
|
222
|
0
|
223 void interpr(void)
|
|
224 {
|
|
225 Word ixreg,iyreg,iureg,isreg,ipcreg;
|
|
226 Byte idpreg,iccreg,iareg,ibreg;
|
|
227 /* Make local variables for the registers. On a real processor (non-Intel)
|
|
228 these could be implemented as fast registers. */
|
|
229 Word eaddr; /* effective address */
|
|
230 Byte ireg; /* instruction register */
|
|
231 Byte iflag; /* flag to indicate $10 or $11 prebyte */
|
|
232 Byte tb;Word tw;
|
4
|
233 Byte *immu = 0;
|
|
234 #ifdef USE_MMU
|
|
235 Byte *iphymem = (Byte *)phymem;
|
|
236 #endif
|
0
|
237 LOADREGS
|
|
238 for(;;){
|
|
239 if(attention) {
|
9
|
240 if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) {
|
|
241 SAVEREGS
|
|
242 #ifdef USE_MMU
|
18
|
243 Byte *phyadr = mem0(phymem,ipcreg,immu);
|
|
244 prog = (char *)(phyadr - ipcreg);
|
9
|
245 #endif
|
|
246 do_trace(tracefile);
|
|
247 }
|
0
|
248 if(escape){ SAVEREGS do_escape(); LOADREGS }
|
|
249 if(irq) {
|
|
250 if(irq==1&&!(iccreg&0x10)) { /* standard IRQ */
|
|
251 PUSHWORD(ipcreg)
|
|
252 PUSHWORD(iureg)
|
|
253 PUSHWORD(iyreg)
|
|
254 PUSHWORD(ixreg)
|
|
255 PUSHBYTE(idpreg)
|
|
256 PUSHBYTE(ibreg)
|
|
257 PUSHBYTE(iareg)
|
13
|
258 iccreg|=0x80;
|
0
|
259 PUSHBYTE(iccreg)
|
|
260 iccreg|=0x90;
|
|
261 ipcreg=GETWORD(0xfff8);
|
|
262 }
|
|
263 if(irq==2&&!(iccreg&0x40)) { /* Fast IRQ */
|
|
264 PUSHWORD(ipcreg)
|
13
|
265 iccreg&=0x7f;
|
0
|
266 PUSHBYTE(iccreg)
|
|
267 iccreg|=0x50;
|
|
268 ipcreg=GETWORD(0xfff6);
|
|
269 }
|
|
270 if(!tracing)attention=0;
|
|
271 irq=0;
|
|
272 }
|
|
273 }
|
|
274 iflag=0;
|
|
275 flaginstr: /* $10 and $11 instructions return here */
|
4
|
276 ireg=mem(ipcreg++);
|
0
|
277 if(haspostbyte[ireg]) {
|
4
|
278 Byte postbyte=mem(ipcreg++);
|
0
|
279 switch(postbyte) {
|
|
280 case 0x00: eaddr=ixreg;break;
|
|
281 case 0x01: eaddr=ixreg+1;break;
|
|
282 case 0x02: eaddr=ixreg+2;break;
|
|
283 case 0x03: eaddr=ixreg+3;break;
|
|
284 case 0x04: eaddr=ixreg+4;break;
|
|
285 case 0x05: eaddr=ixreg+5;break;
|
|
286 case 0x06: eaddr=ixreg+6;break;
|
|
287 case 0x07: eaddr=ixreg+7;break;
|
|
288 case 0x08: eaddr=ixreg+8;break;
|
|
289 case 0x09: eaddr=ixreg+9;break;
|
|
290 case 0x0A: eaddr=ixreg+10;break;
|
|
291 case 0x0B: eaddr=ixreg+11;break;
|
|
292 case 0x0C: eaddr=ixreg+12;break;
|
|
293 case 0x0D: eaddr=ixreg+13;break;
|
|
294 case 0x0E: eaddr=ixreg+14;break;
|
|
295 case 0x0F: eaddr=ixreg+15;break;
|
|
296 case 0x10: eaddr=ixreg-16;break;
|
|
297 case 0x11: eaddr=ixreg-15;break;
|
|
298 case 0x12: eaddr=ixreg-14;break;
|
|
299 case 0x13: eaddr=ixreg-13;break;
|
|
300 case 0x14: eaddr=ixreg-12;break;
|
|
301 case 0x15: eaddr=ixreg-11;break;
|
|
302 case 0x16: eaddr=ixreg-10;break;
|
|
303 case 0x17: eaddr=ixreg-9;break;
|
|
304 case 0x18: eaddr=ixreg-8;break;
|
|
305 case 0x19: eaddr=ixreg-7;break;
|
|
306 case 0x1A: eaddr=ixreg-6;break;
|
|
307 case 0x1B: eaddr=ixreg-5;break;
|
|
308 case 0x1C: eaddr=ixreg-4;break;
|
|
309 case 0x1D: eaddr=ixreg-3;break;
|
|
310 case 0x1E: eaddr=ixreg-2;break;
|
|
311 case 0x1F: eaddr=ixreg-1;break;
|
|
312 case 0x20: eaddr=iyreg;break;
|
|
313 case 0x21: eaddr=iyreg+1;break;
|
|
314 case 0x22: eaddr=iyreg+2;break;
|
|
315 case 0x23: eaddr=iyreg+3;break;
|
|
316 case 0x24: eaddr=iyreg+4;break;
|
|
317 case 0x25: eaddr=iyreg+5;break;
|
|
318 case 0x26: eaddr=iyreg+6;break;
|
|
319 case 0x27: eaddr=iyreg+7;break;
|
|
320 case 0x28: eaddr=iyreg+8;break;
|
|
321 case 0x29: eaddr=iyreg+9;break;
|
|
322 case 0x2A: eaddr=iyreg+10;break;
|
|
323 case 0x2B: eaddr=iyreg+11;break;
|
|
324 case 0x2C: eaddr=iyreg+12;break;
|
|
325 case 0x2D: eaddr=iyreg+13;break;
|
|
326 case 0x2E: eaddr=iyreg+14;break;
|
|
327 case 0x2F: eaddr=iyreg+15;break;
|
|
328 case 0x30: eaddr=iyreg-16;break;
|
|
329 case 0x31: eaddr=iyreg-15;break;
|
|
330 case 0x32: eaddr=iyreg-14;break;
|
|
331 case 0x33: eaddr=iyreg-13;break;
|
|
332 case 0x34: eaddr=iyreg-12;break;
|
|
333 case 0x35: eaddr=iyreg-11;break;
|
|
334 case 0x36: eaddr=iyreg-10;break;
|
|
335 case 0x37: eaddr=iyreg-9;break;
|
|
336 case 0x38: eaddr=iyreg-8;break;
|
|
337 case 0x39: eaddr=iyreg-7;break;
|
|
338 case 0x3A: eaddr=iyreg-6;break;
|
|
339 case 0x3B: eaddr=iyreg-5;break;
|
|
340 case 0x3C: eaddr=iyreg-4;break;
|
|
341 case 0x3D: eaddr=iyreg-3;break;
|
|
342 case 0x3E: eaddr=iyreg-2;break;
|
|
343 case 0x3F: eaddr=iyreg-1;break;
|
|
344 case 0x40: eaddr=iureg;break;
|
|
345 case 0x41: eaddr=iureg+1;break;
|
|
346 case 0x42: eaddr=iureg+2;break;
|
|
347 case 0x43: eaddr=iureg+3;break;
|
|
348 case 0x44: eaddr=iureg+4;break;
|
|
349 case 0x45: eaddr=iureg+5;break;
|
|
350 case 0x46: eaddr=iureg+6;break;
|
|
351 case 0x47: eaddr=iureg+7;break;
|
|
352 case 0x48: eaddr=iureg+8;break;
|
|
353 case 0x49: eaddr=iureg+9;break;
|
|
354 case 0x4A: eaddr=iureg+10;break;
|
|
355 case 0x4B: eaddr=iureg+11;break;
|
|
356 case 0x4C: eaddr=iureg+12;break;
|
|
357 case 0x4D: eaddr=iureg+13;break;
|
|
358 case 0x4E: eaddr=iureg+14;break;
|
|
359 case 0x4F: eaddr=iureg+15;break;
|
|
360 case 0x50: eaddr=iureg-16;break;
|
|
361 case 0x51: eaddr=iureg-15;break;
|
|
362 case 0x52: eaddr=iureg-14;break;
|
|
363 case 0x53: eaddr=iureg-13;break;
|
|
364 case 0x54: eaddr=iureg-12;break;
|
|
365 case 0x55: eaddr=iureg-11;break;
|
|
366 case 0x56: eaddr=iureg-10;break;
|
|
367 case 0x57: eaddr=iureg-9;break;
|
|
368 case 0x58: eaddr=iureg-8;break;
|
|
369 case 0x59: eaddr=iureg-7;break;
|
|
370 case 0x5A: eaddr=iureg-6;break;
|
|
371 case 0x5B: eaddr=iureg-5;break;
|
|
372 case 0x5C: eaddr=iureg-4;break;
|
|
373 case 0x5D: eaddr=iureg-3;break;
|
|
374 case 0x5E: eaddr=iureg-2;break;
|
|
375 case 0x5F: eaddr=iureg-1;break;
|
|
376 case 0x60: eaddr=isreg;break;
|
|
377 case 0x61: eaddr=isreg+1;break;
|
|
378 case 0x62: eaddr=isreg+2;break;
|
|
379 case 0x63: eaddr=isreg+3;break;
|
|
380 case 0x64: eaddr=isreg+4;break;
|
|
381 case 0x65: eaddr=isreg+5;break;
|
|
382 case 0x66: eaddr=isreg+6;break;
|
|
383 case 0x67: eaddr=isreg+7;break;
|
|
384 case 0x68: eaddr=isreg+8;break;
|
|
385 case 0x69: eaddr=isreg+9;break;
|
|
386 case 0x6A: eaddr=isreg+10;break;
|
|
387 case 0x6B: eaddr=isreg+11;break;
|
|
388 case 0x6C: eaddr=isreg+12;break;
|
|
389 case 0x6D: eaddr=isreg+13;break;
|
|
390 case 0x6E: eaddr=isreg+14;break;
|
|
391 case 0x6F: eaddr=isreg+15;break;
|
|
392 case 0x70: eaddr=isreg-16;break;
|
|
393 case 0x71: eaddr=isreg-15;break;
|
|
394 case 0x72: eaddr=isreg-14;break;
|
|
395 case 0x73: eaddr=isreg-13;break;
|
|
396 case 0x74: eaddr=isreg-12;break;
|
|
397 case 0x75: eaddr=isreg-11;break;
|
|
398 case 0x76: eaddr=isreg-10;break;
|
|
399 case 0x77: eaddr=isreg-9;break;
|
|
400 case 0x78: eaddr=isreg-8;break;
|
|
401 case 0x79: eaddr=isreg-7;break;
|
|
402 case 0x7A: eaddr=isreg-6;break;
|
|
403 case 0x7B: eaddr=isreg-5;break;
|
|
404 case 0x7C: eaddr=isreg-4;break;
|
|
405 case 0x7D: eaddr=isreg-3;break;
|
|
406 case 0x7E: eaddr=isreg-2;break;
|
|
407 case 0x7F: eaddr=isreg-1;break;
|
|
408 case 0x80: eaddr=ixreg;ixreg++;break;
|
|
409 case 0x81: eaddr=ixreg;ixreg+=2;break;
|
|
410 case 0x82: ixreg--;eaddr=ixreg;break;
|
|
411 case 0x83: ixreg-=2;eaddr=ixreg;break;
|
|
412 case 0x84: eaddr=ixreg;break;
|
|
413 case 0x85: eaddr=ixreg+SIGNED(ibreg);break;
|
|
414 case 0x86: eaddr=ixreg+SIGNED(iareg);break;
|
|
415 case 0x87: eaddr=0;break; /*ILELGAL*/
|
|
416 case 0x88: IMMBYTE(eaddr);eaddr=ixreg+SIGNED(eaddr);break;
|
|
417 case 0x89: IMMWORD(eaddr);eaddr+=ixreg;break;
|
|
418 case 0x8A: eaddr=0;break; /*ILLEGAL*/
|
|
419 case 0x8B: eaddr=ixreg+GETDREG;break;
|
|
420 case 0x8C: IMMBYTE(eaddr);eaddr=ipcreg+SIGNED(eaddr);break;
|
|
421 case 0x8D: IMMWORD(eaddr);eaddr+=ipcreg;break;
|
|
422 case 0x8E: eaddr=0;break; /*ILLEGAL*/
|
|
423 case 0x8F: IMMWORD(eaddr);break;
|
|
424 case 0x90: eaddr=ixreg;ixreg++;eaddr=GETWORD(eaddr);break;
|
|
425 case 0x91: eaddr=ixreg;ixreg+=2;eaddr=GETWORD(eaddr);break;
|
|
426 case 0x92: ixreg--;eaddr=ixreg;eaddr=GETWORD(eaddr);break;
|
|
427 case 0x93: ixreg-=2;eaddr=ixreg;eaddr=GETWORD(eaddr);break;
|
|
428 case 0x94: eaddr=ixreg;eaddr=GETWORD(eaddr);break;
|
|
429 case 0x95: eaddr=ixreg+SIGNED(ibreg);eaddr=GETWORD(eaddr);break;
|
|
430 case 0x96: eaddr=ixreg+SIGNED(iareg);eaddr=GETWORD(eaddr);break;
|
|
431 case 0x97: eaddr=0;break; /*ILELGAL*/
|
|
432 case 0x98: IMMBYTE(eaddr);eaddr=ixreg+SIGNED(eaddr);
|
|
433 eaddr=GETWORD(eaddr);break;
|
|
434 case 0x99: IMMWORD(eaddr);eaddr+=ixreg;eaddr=GETWORD(eaddr);break;
|
|
435 case 0x9A: eaddr=0;break; /*ILLEGAL*/
|
|
436 case 0x9B: eaddr=ixreg+GETDREG;eaddr=GETWORD(eaddr);break;
|
|
437 case 0x9C: IMMBYTE(eaddr);eaddr=ipcreg+SIGNED(eaddr);
|
|
438 eaddr=GETWORD(eaddr);break;
|
|
439 case 0x9D: IMMWORD(eaddr);eaddr+=ipcreg;eaddr=GETWORD(eaddr);break;
|
|
440 case 0x9E: eaddr=0;break; /*ILLEGAL*/
|
|
441 case 0x9F: IMMWORD(eaddr);eaddr=GETWORD(eaddr);break;
|
|
442 case 0xA0: eaddr=iyreg;iyreg++;break;
|
|
443 case 0xA1: eaddr=iyreg;iyreg+=2;break;
|
|
444 case 0xA2: iyreg--;eaddr=iyreg;break;
|
|
445 case 0xA3: iyreg-=2;eaddr=iyreg;break;
|
|
446 case 0xA4: eaddr=iyreg;break;
|
|
447 case 0xA5: eaddr=iyreg+SIGNED(ibreg);break;
|
|
448 case 0xA6: eaddr=iyreg+SIGNED(iareg);break;
|
|
449 case 0xA7: eaddr=0;break; /*ILELGAL*/
|
|
450 case 0xA8: IMMBYTE(eaddr);eaddr=iyreg+SIGNED(eaddr);break;
|
|
451 case 0xA9: IMMWORD(eaddr);eaddr+=iyreg;break;
|
|
452 case 0xAA: eaddr=0;break; /*ILLEGAL*/
|
|
453 case 0xAB: eaddr=iyreg+GETDREG;break;
|
|
454 case 0xAC: IMMBYTE(eaddr);eaddr=ipcreg+SIGNED(eaddr);break;
|
|
455 case 0xAD: IMMWORD(eaddr);eaddr+=ipcreg;break;
|
|
456 case 0xAE: eaddr=0;break; /*ILLEGAL*/
|
|
457 case 0xAF: IMMWORD(eaddr);break;
|
|
458 case 0xB0: eaddr=iyreg;iyreg++;eaddr=GETWORD(eaddr);break;
|
|
459 case 0xB1: eaddr=iyreg;iyreg+=2;eaddr=GETWORD(eaddr);break;
|
|
460 case 0xB2: iyreg--;eaddr=iyreg;eaddr=GETWORD(eaddr);break;
|
|
461 case 0xB3: iyreg-=2;eaddr=iyreg;eaddr=GETWORD(eaddr);break;
|
|
462 case 0xB4: eaddr=iyreg;eaddr=GETWORD(eaddr);break;
|
|
463 case 0xB5: eaddr=iyreg+SIGNED(ibreg);eaddr=GETWORD(eaddr);break;
|
|
464 case 0xB6: eaddr=iyreg+SIGNED(iareg);eaddr=GETWORD(eaddr);break;
|
|
465 case 0xB7: eaddr=0;break; /*ILELGAL*/
|
|
466 case 0xB8: IMMBYTE(eaddr);eaddr=iyreg+SIGNED(eaddr);
|
|
467 eaddr=GETWORD(eaddr);break;
|
|
468 case 0xB9: IMMWORD(eaddr);eaddr+=iyreg;eaddr=GETWORD(eaddr);break;
|
|
469 case 0xBA: eaddr=0;break; /*ILLEGAL*/
|
|
470 case 0xBB: eaddr=iyreg+GETDREG;eaddr=GETWORD(eaddr);break;
|
|
471 case 0xBC: IMMBYTE(eaddr);eaddr=ipcreg+SIGNED(eaddr);
|
|
472 eaddr=GETWORD(eaddr);break;
|
|
473 case 0xBD: IMMWORD(eaddr);eaddr+=ipcreg;eaddr=GETWORD(eaddr);break;
|
|
474 case 0xBE: eaddr=0;break; /*ILLEGAL*/
|
|
475 case 0xBF: IMMWORD(eaddr);eaddr=GETWORD(eaddr);break;
|
|
476 case 0xC0: eaddr=iureg;iureg++;break;
|
|
477 case 0xC1: eaddr=iureg;iureg+=2;break;
|
|
478 case 0xC2: iureg--;eaddr=iureg;break;
|
|
479 case 0xC3: iureg-=2;eaddr=iureg;break;
|
|
480 case 0xC4: eaddr=iureg;break;
|
|
481 case 0xC5: eaddr=iureg+SIGNED(ibreg);break;
|
|
482 case 0xC6: eaddr=iureg+SIGNED(iareg);break;
|
|
483 case 0xC7: eaddr=0;break; /*ILELGAL*/
|
|
484 case 0xC8: IMMBYTE(eaddr);eaddr=iureg+SIGNED(eaddr);break;
|
|
485 case 0xC9: IMMWORD(eaddr);eaddr+=iureg;break;
|
|
486 case 0xCA: eaddr=0;break; /*ILLEGAL*/
|
|
487 case 0xCB: eaddr=iureg+GETDREG;break;
|
|
488 case 0xCC: IMMBYTE(eaddr);eaddr=ipcreg+SIGNED(eaddr);break;
|
|
489 case 0xCD: IMMWORD(eaddr);eaddr+=ipcreg;break;
|
|
490 case 0xCE: eaddr=0;break; /*ILLEGAL*/
|
|
491 case 0xCF: IMMWORD(eaddr);break;
|
|
492 case 0xD0: eaddr=iureg;iureg++;eaddr=GETWORD(eaddr);break;
|
|
493 case 0xD1: eaddr=iureg;iureg+=2;eaddr=GETWORD(eaddr);break;
|
|
494 case 0xD2: iureg--;eaddr=iureg;eaddr=GETWORD(eaddr);break;
|
|
495 case 0xD3: iureg-=2;eaddr=iureg;eaddr=GETWORD(eaddr);break;
|
|
496 case 0xD4: eaddr=iureg;eaddr=GETWORD(eaddr);break;
|
|
497 case 0xD5: eaddr=iureg+SIGNED(ibreg);eaddr=GETWORD(eaddr);break;
|
|
498 case 0xD6: eaddr=iureg+SIGNED(iareg);eaddr=GETWORD(eaddr);break;
|
|
499 case 0xD7: eaddr=0;break; /*ILELGAL*/
|
|
500 case 0xD8: IMMBYTE(eaddr);eaddr=iureg+SIGNED(eaddr);
|
|
501 eaddr=GETWORD(eaddr);break;
|
|
502 case 0xD9: IMMWORD(eaddr);eaddr+=iureg;eaddr=GETWORD(eaddr);break;
|
|
503 case 0xDA: eaddr=0;break; /*ILLEGAL*/
|
|
504 case 0xDB: eaddr=iureg+GETDREG;eaddr=GETWORD(eaddr);break;
|
|
505 case 0xDC: IMMBYTE(eaddr);eaddr=ipcreg+SIGNED(eaddr);
|
|
506 eaddr=GETWORD(eaddr);break;
|
|
507 case 0xDD: IMMWORD(eaddr);eaddr+=ipcreg;eaddr=GETWORD(eaddr);break;
|
|
508 case 0xDE: eaddr=0;break; /*ILLEGAL*/
|
|
509 case 0xDF: IMMWORD(eaddr);eaddr=GETWORD(eaddr);break;
|
|
510 case 0xE0: eaddr=isreg;isreg++;break;
|
|
511 case 0xE1: eaddr=isreg;isreg+=2;break;
|
|
512 case 0xE2: isreg--;eaddr=isreg;break;
|
|
513 case 0xE3: isreg-=2;eaddr=isreg;break;
|
|
514 case 0xE4: eaddr=isreg;break;
|
|
515 case 0xE5: eaddr=isreg+SIGNED(ibreg);break;
|
|
516 case 0xE6: eaddr=isreg+SIGNED(iareg);break;
|
|
517 case 0xE7: eaddr=0;break; /*ILELGAL*/
|
|
518 case 0xE8: IMMBYTE(eaddr);eaddr=isreg+SIGNED(eaddr);break;
|
|
519 case 0xE9: IMMWORD(eaddr);eaddr+=isreg;break;
|
|
520 case 0xEA: eaddr=0;break; /*ILLEGAL*/
|
|
521 case 0xEB: eaddr=isreg+GETDREG;break;
|
|
522 case 0xEC: IMMBYTE(eaddr);eaddr=ipcreg+SIGNED(eaddr);break;
|
|
523 case 0xED: IMMWORD(eaddr);eaddr+=ipcreg;break;
|
|
524 case 0xEE: eaddr=0;break; /*ILLEGAL*/
|
|
525 case 0xEF: IMMWORD(eaddr);break;
|
|
526 case 0xF0: eaddr=isreg;isreg++;eaddr=GETWORD(eaddr);break;
|
|
527 case 0xF1: eaddr=isreg;isreg+=2;eaddr=GETWORD(eaddr);break;
|
|
528 case 0xF2: isreg--;eaddr=isreg;eaddr=GETWORD(eaddr);break;
|
|
529 case 0xF3: isreg-=2;eaddr=isreg;eaddr=GETWORD(eaddr);break;
|
|
530 case 0xF4: eaddr=isreg;eaddr=GETWORD(eaddr);break;
|
|
531 case 0xF5: eaddr=isreg+SIGNED(ibreg);eaddr=GETWORD(eaddr);break;
|
|
532 case 0xF6: eaddr=isreg+SIGNED(iareg);eaddr=GETWORD(eaddr);break;
|
|
533 case 0xF7: eaddr=0;break; /*ILELGAL*/
|
|
534 case 0xF8: IMMBYTE(eaddr);eaddr=isreg+SIGNED(eaddr);
|
|
535 eaddr=GETWORD(eaddr);break;
|
|
536 case 0xF9: IMMWORD(eaddr);eaddr+=isreg;eaddr=GETWORD(eaddr);break;
|
|
537 case 0xFA: eaddr=0;break; /*ILLEGAL*/
|
|
538 case 0xFB: eaddr=isreg+GETDREG;eaddr=GETWORD(eaddr);break;
|
|
539 case 0xFC: IMMBYTE(eaddr);eaddr=ipcreg+SIGNED(eaddr);
|
|
540 eaddr=GETWORD(eaddr);break;
|
|
541 case 0xFD: IMMWORD(eaddr);eaddr+=ipcreg;eaddr=GETWORD(eaddr);break;
|
|
542 case 0xFE: eaddr=0;break; /*ILLEGAL*/
|
|
543 case 0xFF: IMMWORD(eaddr);eaddr=GETWORD(eaddr);break;
|
|
544 }
|
|
545 }
|
|
546 switch(ireg) {
|
4
|
547 case 0x00: /*NEG direct*/ DIRECT tw=-mem(eaddr);SETSTATUS(0,mem(eaddr),tw)
|
0
|
548 SETBYTE(eaddr,tw)break;
|
|
549 case 0x01: break;/*ILLEGAL*/
|
|
550 case 0x02: break;/*ILLEGAL*/
|
4
|
551 case 0x03: /*COM direct*/ DIRECT tb=~mem(eaddr);SETNZ8(tb);SEC CLV
|
0
|
552 SETBYTE(eaddr,tb)break;
|
4
|
553 case 0x04: /*LSR direct*/ DIRECT tb=mem(eaddr);if(tb&0x01)SEC else CLC
|
0
|
554 if(tb&0x10)SEH else CLH tb>>=1;SETNZ8(tb)
|
|
555 SETBYTE(eaddr,tb)break;
|
|
556 case 0x05: break;/* ILLEGAL*/
|
|
557 case 0x06: /*ROR direct*/ DIRECT tb=(iccreg&0x01)<<7;
|
4
|
558 if(mem(eaddr)&0x01)SEC else CLC
|
|
559 tw=(mem(eaddr)>>1)+tb;SETNZ8(tw)
|
0
|
560 SETBYTE(eaddr,tw)
|
|
561 break;
|
4
|
562 case 0x07: /*ASR direct*/ DIRECT tb=mem(eaddr);if(tb&0x01)SEC else CLC
|
0
|
563 if(tb&0x10)SEH else CLH tb>>=1;
|
|
564 if(tb&0x40)tb|=0x80;SETBYTE(eaddr,tb)SETNZ8(tb)
|
|
565 break;
|
4
|
566 case 0x08: /*ASL direct*/ DIRECT tw=mem(eaddr)<<1;
|
|
567 SETSTATUS(mem(eaddr),mem(eaddr),tw)
|
0
|
568 SETBYTE(eaddr,tw)break;
|
4
|
569 case 0x09: /*ROL direct*/ DIRECT tb=mem(eaddr);tw=iccreg&0x01;
|
0
|
570 if(tb&0x80)SEC else CLC
|
|
571 if((tb&0x80)^((tb<<1)&0x80))SEV else CLV
|
|
572 tb=(tb<<1)+tw;SETNZ8(tb) SETBYTE(eaddr,tb)break;
|
4
|
573 case 0x0A: /*DEC direct*/ DIRECT tb=mem(eaddr)-1;if(tb==0x7F)SEV else CLV
|
0
|
574 SETNZ8(tb) SETBYTE(eaddr,tb)break;
|
|
575 case 0x0B: break; /*ILLEGAL*/
|
4
|
576 case 0x0C: /*INC direct*/ DIRECT tb=mem(eaddr)+1;if(tb==0x80)SEV else CLV
|
0
|
577 SETNZ8(tb) SETBYTE(eaddr,tb)break;
|
4
|
578 case 0x0D: /*TST direct*/ DIRECT tb=mem(eaddr);SETNZ8(tb) break;
|
0
|
579 case 0x0E: /*JMP direct*/ DIRECT ipcreg=eaddr;break;
|
|
580 case 0x0F: /*CLR direct*/ DIRECT SETBYTE(eaddr,0);CLN CLV SEZ CLC break;
|
|
581 case 0x10: /* flag10 */ iflag=1;goto flaginstr;
|
|
582 case 0x11: /* flag11 */ iflag=2;goto flaginstr;
|
|
583 case 0x12: /* NOP */ break;
|
|
584 case 0x13: /* SYNC */
|
|
585 do usleep(USLEEP); /* Wait for IRQ */
|
|
586 while(!irq && !attention);
|
|
587 if(iccreg&0x40)tracetrick=1;
|
|
588 break;
|
|
589 case 0x14: break; /*ILLEGAL*/
|
|
590 case 0x15: break; /*ILLEGAL*/
|
|
591 case 0x16: /*LBRA*/ IMMWORD(eaddr) ipcreg+=eaddr;break;
|
|
592 case 0x17: /*LBSR*/ IMMWORD(eaddr) PUSHWORD(ipcreg) ipcreg+=eaddr;break;
|
|
593 case 0x18: break; /*ILLEGAL*/
|
|
594 case 0x19: /* DAA*/ tw=iareg;
|
|
595 if(iccreg&0x20)tw+=6;
|
|
596 if((tw&0x0f)>9)tw+=6;
|
|
597 if(iccreg&0x01)tw+=0x60;
|
|
598 if((tw&0xf0)>0x90)tw+=0x60;
|
|
599 if(tw&0x100)SEC
|
|
600 iareg=tw;break;
|
|
601 case 0x1A: /* ORCC*/ IMMBYTE(tb) iccreg|=tb;break;
|
|
602 case 0x1B: break; /*ILLEGAL*/
|
|
603 case 0x1C: /* ANDCC*/ IMMBYTE(tb) iccreg&=tb;break;
|
|
604 case 0x1D: /* SEX */ tw=SIGNED(ibreg); SETNZ16(tw) SETDREG(tw) break;
|
|
605 case 0x1E: /* EXG */ IMMBYTE(tb) {Word t2;GETREG(tw,tb>>4) GETREG(t2,tb&15)
|
|
606 SETREG(t2,tb>>4) SETREG(tw,tb&15) } break;
|
|
607 case 0x1F: /* TFR */ IMMBYTE(tb) GETREG(tw,tb>>4) SETREG(tw,tb&15) break;
|
|
608 case 0x20: /* (L)BRA*/ BRANCH(1) break;
|
|
609 case 0x21: /* (L)BRN*/ BRANCH(0) break;
|
|
610 case 0x22: /* (L)BHI*/ BRANCH(!(iccreg&0x05)) break;
|
|
611 case 0x23: /* (L)BLS*/ BRANCH(iccreg&0x05) break;
|
|
612 case 0x24: /* (L)BCC*/ BRANCH(!(iccreg&0x01)) break;
|
|
613 case 0x25: /* (L)BCS*/ BRANCH(iccreg&0x01) break;
|
|
614 case 0x26: /* (L)BNE*/ BRANCH(!(iccreg&0x04)) break;
|
|
615 case 0x27: /* (L)BEQ*/ BRANCH(iccreg&0x04) break;
|
|
616 case 0x28: /* (L)BVC*/ BRANCH(!(iccreg&0x02)) break;
|
|
617 case 0x29: /* (L)BVS*/ BRANCH(iccreg&0x02) break;
|
|
618 case 0x2A: /* (L)BPL*/ BRANCH(!(iccreg&0x08)) break;
|
|
619 case 0x2B: /* (L)BMI*/ BRANCH(iccreg&0x08) break;
|
|
620 case 0x2C: /* (L)BGE*/ BRANCH(!NXORV) break;
|
|
621 case 0x2D: /* (L)BLT*/ BRANCH(NXORV) break;
|
|
622 case 0x2E: /* (L)BGT*/ BRANCH(!(NXORV||iccreg&0x04)) break;
|
|
623 case 0x2F: /* (L)BLE*/ BRANCH(NXORV||iccreg&0x04) break;
|
|
624 case 0x30: /* LEAX*/ ixreg=eaddr; if(ixreg) CLZ else SEZ break;
|
|
625 case 0x31: /* LEAY*/ iyreg=eaddr; if(iyreg) CLZ else SEZ break;
|
|
626 case 0x32: /* LEAS*/ isreg=eaddr;break;
|
|
627 case 0x33: /* LEAU*/ iureg=eaddr;break;
|
|
628 case 0x34: /* PSHS*/ IMMBYTE(tb)
|
|
629 if(tb&0x80)PUSHWORD(ipcreg)
|
|
630 if(tb&0x40)PUSHWORD(iureg)
|
|
631 if(tb&0x20)PUSHWORD(iyreg)
|
|
632 if(tb&0x10)PUSHWORD(ixreg)
|
|
633 if(tb&0x08)PUSHBYTE(idpreg)
|
|
634 if(tb&0x04)PUSHBYTE(ibreg)
|
|
635 if(tb&0x02)PUSHBYTE(iareg)
|
|
636 if(tb&0x01)PUSHBYTE(iccreg) break;
|
|
637 case 0x35: /* PULS*/ IMMBYTE(tb)
|
|
638 if(tb&0x01)PULLBYTE(iccreg)
|
|
639 if(tb&0x02)PULLBYTE(iareg)
|
|
640 if(tb&0x04)PULLBYTE(ibreg)
|
|
641 if(tb&0x08)PULLBYTE(idpreg)
|
|
642 if(tb&0x10)PULLWORD(ixreg)
|
|
643 if(tb&0x20)PULLWORD(iyreg)
|
|
644 if(tb&0x40)PULLWORD(iureg)
|
|
645 if(tb&0x80)PULLWORD(ipcreg)
|
|
646 if(tracetrick&&tb==0xff) { /* Arrange fake FIRQ after next insn
|
|
647 for hardware tracing */
|
|
648 tracetrick=0;
|
|
649 irq=2;
|
|
650 attention=1;
|
|
651 goto flaginstr;
|
|
652 }
|
|
653 break;
|
|
654 case 0x36: /* PSHU*/ IMMBYTE(tb)
|
|
655 if(tb&0x80)PSHUWORD(ipcreg)
|
|
656 if(tb&0x40)PSHUWORD(isreg)
|
|
657 if(tb&0x20)PSHUWORD(iyreg)
|
|
658 if(tb&0x10)PSHUWORD(ixreg)
|
|
659 if(tb&0x08)PSHUBYTE(idpreg)
|
|
660 if(tb&0x04)PSHUBYTE(ibreg)
|
|
661 if(tb&0x02)PSHUBYTE(iareg)
|
|
662 if(tb&0x01)PSHUBYTE(iccreg) break;
|
|
663 case 0x37: /* PULU*/ IMMBYTE(tb)
|
|
664 if(tb&0x01)PULUBYTE(iccreg)
|
|
665 if(tb&0x02)PULUBYTE(iareg)
|
|
666 if(tb&0x04)PULUBYTE(ibreg)
|
|
667 if(tb&0x08)PULUBYTE(idpreg)
|
|
668 if(tb&0x10)PULUWORD(ixreg)
|
|
669 if(tb&0x20)PULUWORD(iyreg)
|
|
670 if(tb&0x40)PULUWORD(isreg)
|
|
671 if(tb&0x80)PULUWORD(ipcreg) break;
|
|
672 case 0x39: /* RTS*/ PULLWORD(ipcreg) break;
|
|
673 case 0x3A: /* ABX*/ ixreg+=ibreg; break;
|
13
|
674 case 0x3B: /* RTI*/ PULLBYTE(iccreg)
|
|
675 tb=iccreg&0x80;
|
0
|
676 if(tb)
|
|
677 {
|
|
678 PULLBYTE(iareg)
|
|
679 PULLBYTE(ibreg)
|
|
680 PULLBYTE(idpreg)
|
|
681 PULLWORD(ixreg)
|
|
682 PULLWORD(iyreg)
|
|
683 PULLWORD(iureg)
|
|
684 }
|
|
685 PULLWORD(ipcreg) break;
|
|
686 case 0x3C: /* CWAI*/ IMMBYTE(tb)
|
|
687 PUSHWORD(ipcreg)
|
|
688 PUSHWORD(iureg)
|
|
689 PUSHWORD(iyreg)
|
|
690 PUSHWORD(ixreg)
|
|
691 PUSHBYTE(idpreg)
|
|
692 PUSHBYTE(ibreg)
|
|
693 PUSHBYTE(iareg)
|
|
694 PUSHBYTE(iccreg)
|
|
695 iccreg&=tb;
|
|
696 iccreg|=0x80;
|
|
697 do usleep(USLEEP); /* Wait for IRQ */
|
|
698 while(!attention && !((irq==1&&!(iccreg&0x10))||(irq==2&&!(iccreg&0x040))));
|
|
699 if(irq==1)ipcreg=GETWORD(0xfff8);
|
|
700 else ipcreg=GETWORD(0xfff6);
|
|
701 irq=0;
|
|
702 if(!tracing)attention=0;
|
|
703 break;
|
|
704 case 0x3D: /* MUL*/ tw=iareg*ibreg; if(tw)CLZ else SEZ
|
|
705 if(tw&0x80) SEC else CLC SETDREG(tw) break;
|
|
706 case 0x3E: break; /*ILLEGAL*/
|
|
707 case 0x3F: /* SWI (SWI2 SWI3)*/ {
|
|
708 PUSHWORD(ipcreg)
|
|
709 PUSHWORD(iureg)
|
|
710 PUSHWORD(iyreg)
|
|
711 PUSHWORD(ixreg)
|
|
712 PUSHBYTE(idpreg)
|
|
713 PUSHBYTE(ibreg)
|
|
714 PUSHBYTE(iareg)
|
13
|
715 iccreg|=0x80;
|
0
|
716 PUSHBYTE(iccreg)
|
|
717 if(!iflag)iccreg|=0x50;
|
|
718 switch(iflag) {
|
|
719 case 0:ipcreg=GETWORD(0xfffa);break;
|
|
720 case 1:ipcreg=GETWORD(0xfff4);break;
|
|
721 case 2:ipcreg=GETWORD(0xfff2);break;
|
|
722 }
|
|
723 }break;
|
|
724 case 0x40: /*NEGA*/ tw=-iareg;SETSTATUS(0,iareg,tw)
|
|
725 iareg=tw;break;
|
|
726 case 0x41: break;/*ILLEGAL*/
|
|
727 case 0x42: break;/*ILLEGAL*/
|
|
728 case 0x43: /*COMA*/ tb=~iareg;SETNZ8(tb);SEC CLV
|
|
729 iareg=tb;break;
|
|
730 case 0x44: /*LSRA*/ tb=iareg;if(tb&0x01)SEC else CLC
|
|
731 if(tb&0x10)SEH else CLH tb>>=1;SETNZ8(tb)
|
|
732 iareg=tb;break;
|
|
733 case 0x45: break;/* ILLEGAL*/
|
|
734 case 0x46: /*RORA*/ tb=(iccreg&0x01)<<7;
|
|
735 if(iareg&0x01)SEC else CLC
|
|
736 iareg=(iareg>>1)+tb;SETNZ8(iareg)
|
|
737 break;
|
|
738 case 0x47: /*ASRA*/ tb=iareg;if(tb&0x01)SEC else CLC
|
|
739 if(tb&0x10)SEH else CLH tb>>=1;
|
|
740 if(tb&0x40)tb|=0x80;iareg=tb;SETNZ8(tb)
|
|
741 break;
|
|
742 case 0x48: /*ASLA*/ tw=iareg<<1;
|
|
743 SETSTATUS(iareg,iareg,tw)
|
|
744 iareg=tw;break;
|
|
745 case 0x49: /*ROLA*/ tb=iareg;tw=iccreg&0x01;
|
|
746 if(tb&0x80)SEC else CLC
|
|
747 if((tb&0x80)^((tb<<1)&0x80))SEV else CLV
|
|
748 tb=(tb<<1)+tw;SETNZ8(tb) iareg=tb;break;
|
|
749 case 0x4A: /*DECA*/ tb=iareg-1;if(tb==0x7F)SEV else CLV
|
|
750 SETNZ8(tb) iareg=tb;break;
|
|
751 case 0x4B: break; /*ILLEGAL*/
|
|
752 case 0x4C: /*INCA*/ tb=iareg+1;if(tb==0x80)SEV else CLV
|
|
753 SETNZ8(tb) iareg=tb;break;
|
|
754 case 0x4D: /*TSTA*/ SETNZ8(iareg) break;
|
|
755 case 0x4E: break; /*ILLEGAL*/
|
|
756 case 0x4F: /*CLRA*/ iareg=0;CLN CLV SEZ CLC break;
|
|
757 case 0x50: /*NEGB*/ tw=-ibreg;SETSTATUS(0,ibreg,tw)
|
|
758 ibreg=tw;break;
|
|
759 case 0x51: break;/*ILLEGAL*/
|
|
760 case 0x52: break;/*ILLEGAL*/
|
|
761 case 0x53: /*COMB*/ tb=~ibreg;SETNZ8(tb);SEC CLV
|
|
762 ibreg=tb;break;
|
|
763 case 0x54: /*LSRB*/ tb=ibreg;if(tb&0x01)SEC else CLC
|
|
764 if(tb&0x10)SEH else CLH tb>>=1;SETNZ8(tb)
|
|
765 ibreg=tb;break;
|
|
766 case 0x55: break;/* ILLEGAL*/
|
|
767 case 0x56: /*RORB*/ tb=(iccreg&0x01)<<7;
|
|
768 if(ibreg&0x01)SEC else CLC
|
|
769 ibreg=(ibreg>>1)+tb;SETNZ8(ibreg)
|
|
770 break;
|
|
771 case 0x57: /*ASRB*/ tb=ibreg;if(tb&0x01)SEC else CLC
|
|
772 if(tb&0x10)SEH else CLH tb>>=1;
|
|
773 if(tb&0x40)tb|=0x80;ibreg=tb;SETNZ8(tb)
|
|
774 break;
|
|
775 case 0x58: /*ASLB*/ tw=ibreg<<1;
|
|
776 SETSTATUS(ibreg,ibreg,tw)
|
|
777 ibreg=tw;break;
|
|
778 case 0x59: /*ROLB*/ tb=ibreg;tw=iccreg&0x01;
|
|
779 if(tb&0x80)SEC else CLC
|
|
780 if((tb&0x80)^((tb<<1)&0x80))SEV else CLV
|
|
781 tb=(tb<<1)+tw;SETNZ8(tb) ibreg=tb;break;
|
|
782 case 0x5A: /*DECB*/ tb=ibreg-1;if(tb==0x7F)SEV else CLV
|
|
783 SETNZ8(tb) ibreg=tb;break;
|
|
784 case 0x5B: break; /*ILLEGAL*/
|
|
785 case 0x5C: /*INCB*/ tb=ibreg+1;if(tb==0x80)SEV else CLV
|
|
786 SETNZ8(tb) ibreg=tb;break;
|
|
787 case 0x5D: /*TSTB*/ SETNZ8(ibreg) break;
|
|
788 case 0x5E: break; /*ILLEGAL*/
|
|
789 case 0x5F: /*CLRB*/ ibreg=0;CLN CLV SEZ CLC break;
|
4
|
790 case 0x60: /*NEG indexed*/ tw=-mem(eaddr);SETSTATUS(0,mem(eaddr),tw)
|
0
|
791 SETBYTE(eaddr,tw)break;
|
|
792 case 0x61: break;/*ILLEGAL*/
|
|
793 case 0x62: break;/*ILLEGAL*/
|
4
|
794 case 0x63: /*COM indexed*/ tb=~mem(eaddr);SETNZ8(tb);SEC CLV
|
0
|
795 SETBYTE(eaddr,tb)break;
|
4
|
796 case 0x64: /*LSR indexed*/ tb=mem(eaddr);if(tb&0x01)SEC else CLC
|
0
|
797 if(tb&0x10)SEH else CLH tb>>=1;SETNZ8(tb)
|
|
798 SETBYTE(eaddr,tb)break;
|
|
799 case 0x65: break;/* ILLEGAL*/
|
|
800 case 0x66: /*ROR indexed*/ tb=(iccreg&0x01)<<7;
|
4
|
801 if(mem(eaddr)&0x01)SEC else CLC
|
|
802 tw=(mem(eaddr)>>1)+tb;SETNZ8(tw)
|
0
|
803 SETBYTE(eaddr,tw)
|
|
804 break;
|
4
|
805 case 0x67: /*ASR indexed*/ tb=mem(eaddr);if(tb&0x01)SEC else CLC
|
0
|
806 if(tb&0x10)SEH else CLH tb>>=1;
|
|
807 if(tb&0x40)tb|=0x80;SETBYTE(eaddr,tb)SETNZ8(tb)
|
|
808 break;
|
4
|
809 case 0x68: /*ASL indexed*/ tw=mem(eaddr)<<1;
|
|
810 SETSTATUS(mem(eaddr),mem(eaddr),tw)
|
0
|
811 SETBYTE(eaddr,tw)break;
|
4
|
812 case 0x69: /*ROL indexed*/ tb=mem(eaddr);tw=iccreg&0x01;
|
0
|
813 if(tb&0x80)SEC else CLC
|
|
814 if((tb&0x80)^((tb<<1)&0x80))SEV else CLV
|
|
815 tb=(tb<<1)+tw;SETNZ8(tb) SETBYTE(eaddr,tb)break;
|
4
|
816 case 0x6A: /*DEC indexed*/ tb=mem(eaddr)-1;if(tb==0x7F)SEV else CLV
|
0
|
817 SETNZ8(tb) SETBYTE(eaddr,tb)break;
|
|
818 case 0x6B: break; /*ILLEGAL*/
|
4
|
819 case 0x6C: /*INC indexed*/ tb=mem(eaddr)+1;if(tb==0x80)SEV else CLV
|
0
|
820 SETNZ8(tb) SETBYTE(eaddr,tb)break;
|
4
|
821 case 0x6D: /*TST indexed*/ tb=mem(eaddr);SETNZ8(tb) break;
|
0
|
822 case 0x6E: /*JMP indexed*/ ipcreg=eaddr;break;
|
|
823 case 0x6F: /*CLR indexed*/ SETBYTE(eaddr,0)CLN CLV SEZ CLC break;
|
4
|
824 case 0x70: /*NEG ext*/ EXTENDED tw=-mem(eaddr);SETSTATUS(0,mem(eaddr),tw)
|
0
|
825 SETBYTE(eaddr,tw)break;
|
|
826 case 0x71: break;/*ILLEGAL*/
|
|
827 case 0x72: break;/*ILLEGAL*/
|
4
|
828 case 0x73: /*COM ext*/ EXTENDED tb=~mem(eaddr);SETNZ8(tb);SEC CLV
|
0
|
829 SETBYTE(eaddr,tb)break;
|
4
|
830 case 0x74: /*LSR ext*/ EXTENDED tb=mem(eaddr);if(tb&0x01)SEC else CLC
|
0
|
831 if(tb&0x10)SEH else CLH tb>>=1;SETNZ8(tb)
|
|
832 SETBYTE(eaddr,tb)break;
|
|
833 case 0x75: break;/* ILLEGAL*/
|
|
834 case 0x76: /*ROR ext*/ EXTENDED tb=(iccreg&0x01)<<7;
|
4
|
835 if(mem(eaddr)&0x01)SEC else CLC
|
|
836 tw=(mem(eaddr)>>1)+tb;SETNZ8(tw)
|
0
|
837 SETBYTE(eaddr,tw)
|
|
838 break;
|
4
|
839 case 0x77: /*ASR ext*/ EXTENDED tb=mem(eaddr);if(tb&0x01)SEC else CLC
|
0
|
840 if(tb&0x10)SEH else CLH tb>>=1;
|
|
841 if(tb&0x40)tb|=0x80;SETBYTE(eaddr,tb)SETNZ8(tb)
|
|
842 break;
|
4
|
843 case 0x78: /*ASL ext*/ EXTENDED tw=mem(eaddr)<<1;
|
|
844 SETSTATUS(mem(eaddr),mem(eaddr),tw)
|
0
|
845 SETBYTE(eaddr,tw)break;
|
4
|
846 case 0x79: /*ROL ext*/ EXTENDED tb=mem(eaddr);tw=iccreg&0x01;
|
0
|
847 if(tb&0x80)SEC else CLC
|
|
848 if((tb&0x80)^((tb<<1)&0x80))SEV else CLV
|
|
849 tb=(tb<<1)+tw;SETNZ8(tb) SETBYTE(eaddr,tb)break;
|
4
|
850 case 0x7A: /*DEC ext*/ EXTENDED tb=mem(eaddr)-1;if(tb==0x7F)SEV else CLV
|
0
|
851 SETNZ8(tb) SETBYTE(eaddr,tb)break;
|
|
852 case 0x7B: break; /*ILLEGAL*/
|
4
|
853 case 0x7C: /*INC ext*/ EXTENDED tb=mem(eaddr)+1;if(tb==0x80)SEV else CLV
|
0
|
854 SETNZ8(tb) SETBYTE(eaddr,tb)break;
|
4
|
855 case 0x7D: /*TST ext*/ EXTENDED tb=mem(eaddr);SETNZ8(tb) break;
|
0
|
856 case 0x7E: /*JMP ext*/ EXTENDED ipcreg=eaddr;break;
|
|
857 case 0x7F: /*CLR ext*/ EXTENDED SETBYTE(eaddr,0)CLN CLV SEZ CLC break;
|
4
|
858 case 0x80: /*SUBA immediate*/ IMM8 tw=iareg-mem(eaddr);
|
|
859 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
860 iareg=tw;break;
|
4
|
861 case 0x81: /*CMPA immediate*/ IMM8 tw=iareg-mem(eaddr);
|
|
862 SETSTATUS(iareg,mem(eaddr),tw) break;
|
|
863 case 0x82: /*SBCA immediate*/ IMM8 tw=iareg-mem(eaddr)-(iccreg&0x01);
|
|
864 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
865 iareg=tw;break;
|
|
866 case 0x83: /*SUBD (CMPD CMPU) immediate*/ IMM16
|
|
867 {unsigned long res,dreg,breg;
|
|
868 if(iflag==2)dreg=iureg;else dreg=GETDREG;
|
|
869 breg=GETWORD(eaddr);
|
|
870 res=dreg-breg;
|
|
871 SETSTATUSD(dreg,breg,res)
|
|
872 if(iflag==0) SETDREG(res)
|
|
873 }break;
|
4
|
874 case 0x84: /*ANDA immediate*/ IMM8 iareg=iareg&mem(eaddr);SETNZ8(iareg)
|
0
|
875 CLV break;
|
4
|
876 case 0x85: /*BITA immediate*/ IMM8 tb=iareg&mem(eaddr);SETNZ8(tb)
|
0
|
877 CLV break;
|
|
878 case 0x86: /*LDA immediate*/ IMM8 LOADAC(iareg) CLV SETNZ8(iareg)
|
|
879 break;
|
|
880 case 0x87: /*STA immediate (for the sake of orthogonality) */ IMM8
|
|
881 SETNZ8(iareg) CLV STOREAC(iareg) break;
|
4
|
882 case 0x88: /*EORA immediate*/ IMM8 iareg=iareg^mem(eaddr);SETNZ8(iareg)
|
0
|
883 CLV break;
|
4
|
884 case 0x89: /*ADCA immediate*/ IMM8 tw=iareg+mem(eaddr)+(iccreg&0x01);
|
|
885 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
886 iareg=tw;break;
|
4
|
887 case 0x8A: /*ORA immediate*/ IMM8 iareg=iareg|mem(eaddr);SETNZ8(iareg)
|
0
|
888 CLV break;
|
4
|
889 case 0x8B: /*ADDA immediate*/ IMM8 tw=iareg+mem(eaddr);
|
|
890 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
891 iareg=tw;break;
|
|
892 case 0x8C: /*CMPX (CMPY CMPS) immediate */ IMM16
|
|
893 {unsigned long dreg,breg,res;
|
|
894 if(iflag==0)dreg=ixreg;else if(iflag==1)
|
|
895 dreg=iyreg;else dreg=isreg;breg=GETWORD(eaddr);
|
|
896 res=dreg-breg;
|
|
897 SETSTATUSD(dreg,breg,res)
|
|
898 }break;
|
|
899 case 0x8D: /*BSR */ IMMBYTE(tb) PUSHWORD(ipcreg) ipcreg+=SIGNED(tb);
|
|
900 break;
|
|
901 case 0x8E: /* LDX (LDY) immediate */ IMM16 tw=GETWORD(eaddr);
|
|
902 CLV SETNZ16(tw) if(!iflag)ixreg=tw; else
|
|
903 iyreg=tw;break;
|
|
904 case 0x8F: /* STX (STY) immediate (orthogonality) */ IMM16
|
|
905 if(!iflag) tw=ixreg; else tw=iyreg;
|
|
906 CLV SETNZ16(tw) SETWORD(eaddr,tw) break;
|
4
|
907 case 0x90: /*SUBA direct*/ DIRECT tw=iareg-mem(eaddr);
|
|
908 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
909 iareg=tw;break;
|
4
|
910 case 0x91: /*CMPA direct*/ DIRECT tw=iareg-mem(eaddr);
|
|
911 SETSTATUS(iareg,mem(eaddr),tw) break;
|
|
912 case 0x92: /*SBCA direct*/ DIRECT tw=iareg-mem(eaddr)-(iccreg&0x01);
|
|
913 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
914 iareg=tw;break;
|
|
915 case 0x93: /*SUBD (CMPD CMPU) direct*/ DIRECT
|
|
916 {unsigned long res,dreg,breg;
|
|
917 if(iflag==2)dreg=iureg;else dreg=GETDREG;
|
|
918 breg=GETWORD(eaddr);
|
|
919 res=dreg-breg;
|
|
920 SETSTATUSD(dreg,breg,res)
|
|
921 if(iflag==0) SETDREG(res)
|
|
922 }break;
|
4
|
923 case 0x94: /*ANDA direct*/ DIRECT iareg=iareg&mem(eaddr);SETNZ8(iareg)
|
0
|
924 CLV break;
|
4
|
925 case 0x95: /*BITA direct*/ DIRECT tb=iareg&mem(eaddr);SETNZ8(tb)
|
0
|
926 CLV break;
|
|
927 case 0x96: /*LDA direct*/ DIRECT LOADAC(iareg) CLV SETNZ8(iareg)
|
|
928 break;
|
|
929 case 0x97: /*STA direct */ DIRECT
|
|
930 SETNZ8(iareg) CLV STOREAC(iareg) break;
|
4
|
931 case 0x98: /*EORA direct*/ DIRECT iareg=iareg^mem(eaddr);SETNZ8(iareg)
|
0
|
932 CLV break;
|
4
|
933 case 0x99: /*ADCA direct*/ DIRECT tw=iareg+mem(eaddr)+(iccreg&0x01);
|
|
934 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
935 iareg=tw;break;
|
4
|
936 case 0x9A: /*ORA direct*/ DIRECT iareg=iareg|mem(eaddr);SETNZ8(iareg)
|
0
|
937 CLV break;
|
4
|
938 case 0x9B: /*ADDA direct*/ DIRECT tw=iareg+mem(eaddr);
|
|
939 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
940 iareg=tw;break;
|
|
941 case 0x9C: /*CMPX (CMPY CMPS) direct */ DIRECT
|
|
942 {unsigned long dreg,breg,res;
|
|
943 if(iflag==0)dreg=ixreg;else if(iflag==1)
|
|
944 dreg=iyreg;else dreg=isreg;breg=GETWORD(eaddr);
|
|
945 res=dreg-breg;
|
|
946 SETSTATUSD(dreg,breg,res)
|
|
947 }break;
|
|
948 case 0x9D: /*JSR direct */ DIRECT PUSHWORD(ipcreg) ipcreg=eaddr;
|
|
949 break;
|
|
950 case 0x9E: /* LDX (LDY) direct */ DIRECT tw=GETWORD(eaddr);
|
|
951 CLV SETNZ16(tw) if(!iflag)ixreg=tw; else
|
|
952 iyreg=tw;break;
|
|
953 case 0x9F: /* STX (STY) direct */ DIRECT
|
|
954 if(!iflag) tw=ixreg; else tw=iyreg;
|
|
955 CLV SETNZ16(tw) SETWORD(eaddr,tw) break;
|
4
|
956 case 0xA0: /*SUBA indexed*/ tw=iareg-mem(eaddr);
|
|
957 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
958 iareg=tw;break;
|
4
|
959 case 0xA1: /*CMPA indexed*/ tw=iareg-mem(eaddr);
|
|
960 SETSTATUS(iareg,mem(eaddr),tw) break;
|
|
961 case 0xA2: /*SBCA indexed*/ tw=iareg-mem(eaddr)-(iccreg&0x01);
|
|
962 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
963 iareg=tw;break;
|
|
964 case 0xA3: /*SUBD (CMPD CMPU) indexed*/
|
|
965 {unsigned long res,dreg,breg;
|
|
966 if(iflag==2)dreg=iureg;else dreg=GETDREG;
|
|
967 breg=GETWORD(eaddr);
|
|
968 res=dreg-breg;
|
|
969 SETSTATUSD(dreg,breg,res)
|
|
970 if(iflag==0) SETDREG(res)
|
|
971 }break;
|
4
|
972 case 0xA4: /*ANDA indexed*/ iareg=iareg&mem(eaddr);SETNZ8(iareg)
|
0
|
973 CLV break;
|
4
|
974 case 0xA5: /*BITA indexed*/ tb=iareg&mem(eaddr);SETNZ8(tb)
|
0
|
975 CLV break;
|
|
976 case 0xA6: /*LDA indexed*/ LOADAC(iareg) CLV SETNZ8(iareg)
|
|
977 break;
|
|
978 case 0xA7: /*STA indexed */
|
|
979 SETNZ8(iareg) CLV STOREAC(iareg) break;
|
4
|
980 case 0xA8: /*EORA indexed*/ iareg=iareg^mem(eaddr);SETNZ8(iareg)
|
0
|
981 CLV break;
|
4
|
982 case 0xA9: /*ADCA indexed*/ tw=iareg+mem(eaddr)+(iccreg&0x01);
|
|
983 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
984 iareg=tw;break;
|
4
|
985 case 0xAA: /*ORA indexed*/ iareg=iareg|mem(eaddr);SETNZ8(iareg)
|
0
|
986 CLV break;
|
4
|
987 case 0xAB: /*ADDA indexed*/ tw=iareg+mem(eaddr);
|
|
988 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
989 iareg=tw;break;
|
|
990 case 0xAC: /*CMPX (CMPY CMPS) indexed */
|
|
991 {unsigned long dreg,breg,res;
|
|
992 if(iflag==0)dreg=ixreg;else if(iflag==1)
|
|
993 dreg=iyreg;else dreg=isreg;breg=GETWORD(eaddr);
|
|
994 res=dreg-breg;
|
|
995 SETSTATUSD(dreg,breg,res)
|
|
996 }break;
|
|
997 case 0xAD: /*JSR indexed */ PUSHWORD(ipcreg) ipcreg=eaddr;
|
|
998 break;
|
|
999 case 0xAE: /* LDX (LDY) indexed */ tw=GETWORD(eaddr);
|
|
1000 CLV SETNZ16(tw) if(!iflag)ixreg=tw; else
|
|
1001 iyreg=tw;break;
|
|
1002 case 0xAF: /* STX (STY) indexed */
|
|
1003 if(!iflag) tw=ixreg; else tw=iyreg;
|
|
1004 CLV SETNZ16(tw) SETWORD(eaddr,tw) break;
|
4
|
1005 case 0xB0: /*SUBA ext*/ EXTENDED tw=iareg-mem(eaddr);
|
|
1006 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
1007 iareg=tw;break;
|
4
|
1008 case 0xB1: /*CMPA ext*/ EXTENDED tw=iareg-mem(eaddr);
|
|
1009 SETSTATUS(iareg,mem(eaddr),tw) break;
|
|
1010 case 0xB2: /*SBCA ext*/ EXTENDED tw=iareg-mem(eaddr)-(iccreg&0x01);
|
|
1011 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
1012 iareg=tw;break;
|
|
1013 case 0xB3: /*SUBD (CMPD CMPU) ext*/ EXTENDED
|
|
1014 {unsigned long res,dreg,breg;
|
|
1015 if(iflag==2)dreg=iureg;else dreg=GETDREG;
|
|
1016 breg=GETWORD(eaddr);
|
|
1017 res=dreg-breg;
|
|
1018 SETSTATUSD(dreg,breg,res)
|
|
1019 if(iflag==0) SETDREG(res)
|
|
1020 }break;
|
4
|
1021 case 0xB4: /*ANDA ext*/ EXTENDED iareg=iareg&mem(eaddr);SETNZ8(iareg)
|
0
|
1022 CLV break;
|
4
|
1023 case 0xB5: /*BITA ext*/ EXTENDED tb=iareg&mem(eaddr);SETNZ8(tb)
|
0
|
1024 CLV break;
|
|
1025 case 0xB6: /*LDA ext*/ EXTENDED LOADAC(iareg) CLV SETNZ8(iareg)
|
|
1026 break;
|
|
1027 case 0xB7: /*STA ext */ EXTENDED
|
|
1028 SETNZ8(iareg) CLV STOREAC(iareg) break;
|
4
|
1029 case 0xB8: /*EORA ext*/ EXTENDED iareg=iareg^mem(eaddr);SETNZ8(iareg)
|
0
|
1030 CLV break;
|
4
|
1031 case 0xB9: /*ADCA ext*/ EXTENDED tw=iareg+mem(eaddr)+(iccreg&0x01);
|
|
1032 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
1033 iareg=tw;break;
|
4
|
1034 case 0xBA: /*ORA ext*/ EXTENDED iareg=iareg|mem(eaddr);SETNZ8(iareg)
|
0
|
1035 CLV break;
|
4
|
1036 case 0xBB: /*ADDA ext*/ EXTENDED tw=iareg+mem(eaddr);
|
|
1037 SETSTATUS(iareg,mem(eaddr),tw)
|
0
|
1038 iareg=tw;break;
|
|
1039 case 0xBC: /*CMPX (CMPY CMPS) ext */ EXTENDED
|
|
1040 {unsigned long dreg,breg,res;
|
|
1041 if(iflag==0)dreg=ixreg;else if(iflag==1)
|
|
1042 dreg=iyreg;else dreg=isreg;breg=GETWORD(eaddr);
|
|
1043 res=dreg-breg;
|
|
1044 SETSTATUSD(dreg,breg,res)
|
|
1045 }break;
|
|
1046 case 0xBD: /*JSR ext */ EXTENDED PUSHWORD(ipcreg) ipcreg=eaddr;
|
|
1047 break;
|
|
1048 case 0xBE: /* LDX (LDY) ext */ EXTENDED tw=GETWORD(eaddr);
|
|
1049 CLV SETNZ16(tw) if(!iflag)ixreg=tw; else
|
|
1050 iyreg=tw;break;
|
|
1051 case 0xBF: /* STX (STY) ext */ EXTENDED
|
|
1052 if(!iflag) tw=ixreg; else tw=iyreg;
|
|
1053 CLV SETNZ16(tw) SETWORD(eaddr,tw) break;
|
4
|
1054 case 0xC0: /*SUBB immediate*/ IMM8 tw=ibreg-mem(eaddr);
|
|
1055 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1056 ibreg=tw;break;
|
4
|
1057 case 0xC1: /*CMPB immediate*/ IMM8 tw=ibreg-mem(eaddr);
|
|
1058 SETSTATUS(ibreg,mem(eaddr),tw) break;
|
|
1059 case 0xC2: /*SBCB immediate*/ IMM8 tw=ibreg-mem(eaddr)-(iccreg&0x01);
|
|
1060 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1061 ibreg=tw;break;
|
|
1062 case 0xC3: /*ADDD immediate*/ IMM16
|
|
1063 {unsigned long res,dreg,breg;
|
|
1064 dreg=GETDREG;
|
|
1065 breg=GETWORD(eaddr);
|
|
1066 res=dreg+breg;
|
|
1067 SETSTATUSD(dreg,breg,res)
|
|
1068 SETDREG(res)
|
|
1069 }break;
|
4
|
1070 case 0xC4: /*ANDB immediate*/ IMM8 ibreg=ibreg&mem(eaddr);SETNZ8(ibreg)
|
0
|
1071 CLV break;
|
4
|
1072 case 0xC5: /*BITB immediate*/ IMM8 tb=ibreg&mem(eaddr);SETNZ8(tb)
|
0
|
1073 CLV break;
|
|
1074 case 0xC6: /*LDB immediate*/ IMM8 LOADAC(ibreg) CLV SETNZ8(ibreg)
|
|
1075 break;
|
|
1076 case 0xC7: /*STB immediate (for the sake of orthogonality) */ IMM8
|
|
1077 SETNZ8(ibreg) CLV STOREAC(ibreg) break;
|
4
|
1078 case 0xC8: /*EORB immediate*/ IMM8 ibreg=ibreg^mem(eaddr);SETNZ8(ibreg)
|
0
|
1079 CLV break;
|
4
|
1080 case 0xC9: /*ADCB immediate*/ IMM8 tw=ibreg+mem(eaddr)+(iccreg&0x01);
|
|
1081 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1082 ibreg=tw;break;
|
4
|
1083 case 0xCA: /*ORB immediate*/ IMM8 ibreg=ibreg|mem(eaddr);SETNZ8(ibreg)
|
0
|
1084 CLV break;
|
4
|
1085 case 0xCB: /*ADDB immediate*/ IMM8 tw=ibreg+mem(eaddr);
|
|
1086 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1087 ibreg=tw;break;
|
|
1088 case 0xCC: /*LDD immediate */ IMM16 tw=GETWORD(eaddr);SETNZ16(tw)
|
|
1089 CLV SETDREG(tw) break;
|
|
1090 case 0xCD: /*STD immediate (orthogonality) */ IMM16
|
|
1091 tw=GETDREG; SETNZ16(tw) CLV
|
|
1092 SETWORD(eaddr,tw) break;
|
|
1093 case 0xCE: /* LDU (LDS) immediate */ IMM16 tw=GETWORD(eaddr);
|
|
1094 CLV SETNZ16(tw) if(!iflag)iureg=tw; else
|
|
1095 isreg=tw;break;
|
|
1096 case 0xCF: /* STU (STS) immediate (orthogonality) */ IMM16
|
|
1097 if(!iflag) tw=iureg; else tw=isreg;
|
|
1098 CLV SETNZ16(tw) SETWORD(eaddr,tw) break;
|
4
|
1099 case 0xD0: /*SUBB direct*/ DIRECT tw=ibreg-mem(eaddr);
|
|
1100 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1101 ibreg=tw;break;
|
4
|
1102 case 0xD1: /*CMPB direct*/ DIRECT tw=ibreg-mem(eaddr);
|
|
1103 SETSTATUS(ibreg,mem(eaddr),tw) break;
|
|
1104 case 0xD2: /*SBCB direct*/ DIRECT tw=ibreg-mem(eaddr)-(iccreg&0x01);
|
|
1105 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1106 ibreg=tw;break;
|
|
1107 case 0xD3: /*ADDD direct*/ DIRECT
|
|
1108 {unsigned long res,dreg,breg;
|
|
1109 dreg=GETDREG;
|
|
1110 breg=GETWORD(eaddr);
|
|
1111 res=dreg+breg;
|
|
1112 SETSTATUSD(dreg,breg,res)
|
|
1113 SETDREG(res)
|
|
1114 }break;
|
4
|
1115 case 0xD4: /*ANDB direct*/ DIRECT ibreg=ibreg&mem(eaddr);SETNZ8(ibreg)
|
0
|
1116 CLV break;
|
4
|
1117 case 0xD5: /*BITB direct*/ DIRECT tb=ibreg&mem(eaddr);SETNZ8(tb)
|
0
|
1118 CLV break;
|
|
1119 case 0xD6: /*LDB direct*/ DIRECT LOADAC(ibreg) CLV SETNZ8(ibreg)
|
|
1120 break;
|
|
1121 case 0xD7: /*STB direct */ DIRECT
|
|
1122 SETNZ8(ibreg) CLV STOREAC(ibreg) break;
|
4
|
1123 case 0xD8: /*EORB direct*/ DIRECT ibreg=ibreg^mem(eaddr);SETNZ8(ibreg)
|
0
|
1124 CLV break;
|
4
|
1125 case 0xD9: /*ADCB direct*/ DIRECT tw=ibreg+mem(eaddr)+(iccreg&0x01);
|
|
1126 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1127 ibreg=tw;break;
|
4
|
1128 case 0xDA: /*ORB direct*/ DIRECT ibreg=ibreg|mem(eaddr);SETNZ8(ibreg)
|
0
|
1129 CLV break;
|
4
|
1130 case 0xDB: /*ADDB direct*/ DIRECT tw=ibreg+mem(eaddr);
|
|
1131 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1132 ibreg=tw;break;
|
|
1133 case 0xDC: /*LDD direct */ DIRECT tw=GETWORD(eaddr);SETNZ16(tw)
|
|
1134 CLV SETDREG(tw) break;
|
|
1135 case 0xDD: /*STD direct */ DIRECT
|
|
1136 tw=GETDREG; SETNZ16(tw) CLV
|
11
|
1137 #ifdef USE_MMU
|
|
1138 STOREAC((tw>>8)&0x0ff); eaddr++;
|
|
1139 STOREAC(tw&0x0ff); break;
|
|
1140 #else
|
0
|
1141 SETWORD(eaddr,tw) break;
|
11
|
1142 #endif
|
0
|
1143 case 0xDE: /* LDU (LDS) direct */ DIRECT tw=GETWORD(eaddr);
|
|
1144 CLV SETNZ16(tw) if(!iflag)iureg=tw; else
|
|
1145 isreg=tw;break;
|
|
1146 case 0xDF: /* STU (STS) direct */ DIRECT
|
|
1147 if(!iflag) tw=iureg; else tw=isreg;
|
|
1148 CLV SETNZ16(tw) SETWORD(eaddr,tw) break;
|
4
|
1149 case 0xE0: /*SUBB indexed*/ tw=ibreg-mem(eaddr);
|
|
1150 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1151 ibreg=tw;break;
|
4
|
1152 case 0xE1: /*CMPB indexed*/ tw=ibreg-mem(eaddr);
|
|
1153 SETSTATUS(ibreg,mem(eaddr),tw) break;
|
|
1154 case 0xE2: /*SBCB indexed*/ tw=ibreg-mem(eaddr)-(iccreg&0x01);
|
|
1155 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1156 ibreg=tw;break;
|
|
1157 case 0xE3: /*ADDD indexed*/
|
|
1158 {unsigned long res,dreg,breg;
|
|
1159 dreg=GETDREG;
|
|
1160 breg=GETWORD(eaddr);
|
|
1161 res=dreg+breg;
|
|
1162 SETSTATUSD(dreg,breg,res)
|
|
1163 SETDREG(res)
|
|
1164 }break;
|
4
|
1165 case 0xE4: /*ANDB indexed*/ ibreg=ibreg&mem(eaddr);SETNZ8(ibreg)
|
0
|
1166 CLV break;
|
4
|
1167 case 0xE5: /*BITB indexed*/ tb=ibreg&mem(eaddr);SETNZ8(tb)
|
0
|
1168 CLV break;
|
|
1169 case 0xE6: /*LDB indexed*/ LOADAC(ibreg) CLV SETNZ8(ibreg)
|
|
1170 break;
|
|
1171 case 0xE7: /*STB indexed */
|
|
1172 SETNZ8(ibreg) CLV STOREAC(ibreg) break;
|
4
|
1173 case 0xE8: /*EORB indexed*/ ibreg=ibreg^mem(eaddr);SETNZ8(ibreg)
|
0
|
1174 CLV break;
|
4
|
1175 case 0xE9: /*ADCB indexed*/ tw=ibreg+mem(eaddr)+(iccreg&0x01);
|
|
1176 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1177 ibreg=tw;break;
|
4
|
1178 case 0xEA: /*ORB indexed*/ ibreg=ibreg|mem(eaddr);SETNZ8(ibreg)
|
0
|
1179 CLV break;
|
4
|
1180 case 0xEB: /*ADDB indexed*/ tw=ibreg+mem(eaddr);
|
|
1181 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1182 ibreg=tw;break;
|
|
1183 case 0xEC: /*LDD indexed */ tw=GETWORD(eaddr);SETNZ16(tw)
|
|
1184 CLV SETDREG(tw) break;
|
|
1185 case 0xED: /*STD indexed */
|
|
1186 tw=GETDREG; SETNZ16(tw) CLV
|
10
|
1187 #ifdef USE_MMU
|
11
|
1188 STOREAC((tw>>8)&0x0ff); eaddr++;
|
10
|
1189 STOREAC(tw&0x0ff);
|
|
1190 break;
|
|
1191 #else
|
0
|
1192 SETWORD(eaddr,tw) break;
|
10
|
1193 #endif
|
0
|
1194 case 0xEE: /* LDU (LDS) indexed */ tw=GETWORD(eaddr);
|
|
1195 CLV SETNZ16(tw) if(!iflag)iureg=tw; else
|
|
1196 isreg=tw;break;
|
|
1197 case 0xEF: /* STU (STS) indexed */
|
|
1198 if(!iflag) tw=iureg; else tw=isreg;
|
|
1199 CLV SETNZ16(tw) SETWORD(eaddr,tw) break;
|
4
|
1200 case 0xF0: /*SUBB ext*/ EXTENDED tw=ibreg-mem(eaddr);
|
|
1201 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1202 ibreg=tw;break;
|
4
|
1203 case 0xF1: /*CMPB ext*/ EXTENDED tw=ibreg-mem(eaddr);
|
|
1204 SETSTATUS(ibreg,mem(eaddr),tw) break;
|
|
1205 case 0xF2: /*SBCB ext*/ EXTENDED tw=ibreg-mem(eaddr)-(iccreg&0x01);
|
|
1206 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1207 ibreg=tw;break;
|
|
1208 case 0xF3: /*ADDD ext*/ EXTENDED
|
|
1209 {unsigned long res,dreg,breg;
|
|
1210 dreg=GETDREG;
|
|
1211 breg=GETWORD(eaddr);
|
|
1212 res=dreg+breg;
|
|
1213 SETSTATUSD(dreg,breg,res)
|
|
1214 SETDREG(res)
|
|
1215 }break;
|
4
|
1216 case 0xF4: /*ANDB ext*/ EXTENDED ibreg=ibreg&mem(eaddr);SETNZ8(ibreg)
|
0
|
1217 CLV break;
|
4
|
1218 case 0xF5: /*BITB ext*/ EXTENDED tb=ibreg&mem(eaddr);SETNZ8(tb)
|
0
|
1219 CLV break;
|
|
1220 case 0xF6: /*LDB ext*/ EXTENDED LOADAC(ibreg) CLV SETNZ8(ibreg)
|
|
1221 break;
|
|
1222 case 0xF7: /*STB ext */ EXTENDED
|
|
1223 SETNZ8(ibreg) CLV STOREAC(ibreg) break;
|
4
|
1224 case 0xF8: /*EORB ext*/ EXTENDED ibreg=ibreg^mem(eaddr);SETNZ8(ibreg)
|
0
|
1225 CLV break;
|
4
|
1226 case 0xF9: /*ADCB ext*/ EXTENDED tw=ibreg+mem(eaddr)+(iccreg&0x01);
|
|
1227 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1228 ibreg=tw;break;
|
4
|
1229 case 0xFA: /*ORB ext*/ EXTENDED ibreg=ibreg|mem(eaddr);SETNZ8(ibreg)
|
0
|
1230 CLV break;
|
4
|
1231 case 0xFB: /*ADDB ext*/ EXTENDED tw=ibreg+mem(eaddr);
|
|
1232 SETSTATUS(ibreg,mem(eaddr),tw)
|
0
|
1233 ibreg=tw;break;
|
|
1234 case 0xFC: /*LDD ext */ EXTENDED tw=GETWORD(eaddr);SETNZ16(tw)
|
|
1235 CLV SETDREG(tw) break;
|
|
1236 case 0xFD: /*STD ext */ EXTENDED
|
|
1237 tw=GETDREG; SETNZ16(tw) CLV
|
10
|
1238 #ifdef USE_MMU
|
11
|
1239 STOREAC((tw>>8)&0x0ff); eaddr++;
|
10
|
1240 STOREAC(tw&0x0ff);
|
|
1241 break;
|
|
1242 #else
|
0
|
1243 SETWORD(eaddr,tw) break;
|
10
|
1244 #endif
|
0
|
1245 case 0xFE: /* LDU (LDS) ext */ EXTENDED tw=GETWORD(eaddr);
|
|
1246 CLV SETNZ16(tw) if(!iflag)iureg=tw; else
|
|
1247 isreg=tw;break;
|
|
1248 case 0xFF: /* STU (STS) ext */ EXTENDED
|
|
1249 if(!iflag) tw=iureg; else tw=isreg;
|
|
1250 CLV SETNZ16(tw) SETWORD(eaddr,tw) break;
|
|
1251
|
|
1252
|
|
1253 }
|
|
1254 }
|
|
1255 }
|
|
1256
|