Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
RishiRecon
GitHub Repository: RishiRecon/exploits
Path: blob/main/misc/emulator/xnes/snem/spc.c
28547 views
1
#include <stdio.h>
2
#include "snes.h"
3
4
int spcins;
5
void (*spcopcodes[256])();
6
7
struct
8
{
9
union
10
{
11
unsigned short ya;
12
struct
13
{
14
unsigned char a,y;
15
} b;
16
} ya;
17
unsigned char x;
18
unsigned char s;
19
unsigned short pc;
20
struct
21
{
22
int c,z,h,p,v,n;
23
} p;
24
unsigned short opc[8];
25
} spc;
26
27
unsigned char spurom[64]=
28
{
29
0xCD,0xEF,0xBD,0xE8,0x00,0xC6,0x1D,0xD0,
30
0xFC,0x8F,0xAA,0xF4,0x8F,0xBB,0xF5,0x78,
31
0xCC,0xF4,0xD0,0xFB,0x2F,0x19,0xEB,0xF4,
32
0xD0,0xFC,0x7E,0xF4,0xD0,0x0B,0xE4,0xF5,
33
0xCB,0xF4,0xD7,0x00,0xFC,0xD0,0xF3,0xAB,
34
0x01,0x10,0xEF,0x7E,0xF4,0x10,0xEB,0xBA,
35
0xF6,0xDA,0x00,0xBA,0xF4,0xC4,0xF4,0xDD,
36
0x5D,0xD0,0xDB,0x1F,0x00,0x00,0xC0,0xFF
37
};
38
39
unsigned char spuram[0x10080];
40
unsigned char spuport[4],spuportin[4]={0,0,0,0};
41
unsigned char spuport2[4];
42
unsigned char spctctrl=0x80;
43
unsigned char spctimer[3],spclatch[3],spccount[3];
44
int spctimer2[3];
45
46
int decode[64];
47
unsigned short diraddr;
48
49
void write214x(unsigned short addr, unsigned char v)
50
{
51
// printf("Write %04X %02X %02X:%04X\n",addr,v,pbr,pc);
52
spuportin[addr&3]=v;
53
}
54
55
unsigned char read214x(unsigned short a)
56
{
57
unsigned char temp=spuport[a&3];
58
spuport[a&3]=spuport2[a&3];
59
return temp;
60
}
61
62
unsigned char readspcl(unsigned short a)
63
{
64
unsigned char temp;
65
if (a<0xF0) return spuram[a];
66
switch (a)
67
{
68
case 0xF0: return 0xFF;
69
case 0xF1: return spctctrl;
70
case 0xF2: case 0xF3: return readdsp(a);
71
case 0xF4: case 0xF5: case 0xF6: case 0xF7:
72
return spuportin[a&3];
73
case 0xFD: temp=spccount[0]&0xF; spccount[0]=0; return temp;
74
case 0xFE: temp=spccount[1]&0xF; spccount[1]=0; return temp;
75
case 0xFF: temp=spccount[2]&0xF; spccount[2]=0; return temp;
76
}
77
printf("Bad SPC read %04X\n",a);
78
dumpspcregs();
79
exit(-1);
80
}
81
82
void writespcl(unsigned short a, unsigned char v)
83
{
84
if (a<0xF0)
85
{
86
spuram[a]=v;
87
return;
88
}
89
switch (a)
90
{
91
case 0xF1:
92
// printf("CTRL write %02X\n",v);
93
if ((spctctrl&0x80)!=(v&0x80))
94
{
95
memcpy(&spuram[0x10040],&spuram[0xFFC0],64);
96
memcpy(&spuram[0xFFC0],&spuram[0x10000],64);
97
memcpy(&spuram[0x10000],&spuram[0x10040],64);
98
}
99
spctctrl=v;
100
if (v&0x10) spuportin[0]=spuportin[1]=0;
101
if (v&0x20) spuportin[2]=spuportin[3]=0;
102
// printf("SPC CTRL=%02X\n",v);
103
return;
104
case 0xF2: case 0xF3: writedsp(a,v); return;
105
case 0xF4: case 0xF5: case 0xF6: case 0xF7:
106
spuport2[a&3]=v;
107
return;
108
case 0xF0: case 0xF8: case 0xF9: return; /*Mortal Kombat writes to F0 and F9*/
109
case 0xFA: spclatch[0]=v; return;
110
case 0xFB: spclatch[1]=v; return;
111
case 0xFC: spclatch[2]=v; return;
112
case 0xFD: case 0xFE: case 0xFF: return; /*I don't think these
113
are writeable*/
114
}
115
if ((a&0xFF00)==0x100) { spuram[a]=v; return; }
116
if ((a&0xFF00)==diraddr)
117
{
118
if (v!=spuram[a]) decode[(a&0xFC)>>2]=1;
119
spuram[a]=v;
120
return;
121
}
122
if ((a&0xFF00)==0xFF00)
123
{
124
if (!(spctctrl&0x80) || (a<0xFFC0))
125
spuram[a]=v;
126
return;
127
}
128
printf("Bad SPC write %04X %02X\n",a,v);
129
dumpspcregs();
130
exit(-1);
131
}
132
int spuaccess[256];
133
134
void updatespuaccess(int page)
135
{
136
memset(spuaccess,0xFF,sizeof(spuaccess));
137
spuaccess[0]=0;
138
spuaccess[page]=0;
139
}
140
141
void dumpspcregs()
142
{
143
FILE *f=fopen("spc.dmp","wb");
144
fwrite(spuram,0x10000,1,f);
145
fclose(f);
146
printf("SPC700 :\n");
147
printf("A=%02X Y=%02X X=%02X S=%02X PC=%04X\n",spc.ya.b.a,spc.ya.b.y,spc.x,spc.s,spc.pc);
148
printf("%c%c%c%c%c%c\n",(spc.p.c)?'C':' ',
149
(spc.p.z)?'Z':' ',
150
(spc.p.h)?'H':' ',
151
(spc.p.p)?'P':' ',
152
(spc.p.v)?'V':' ',
153
(spc.p.n)?'N':' ');
154
printf("In= %02X %02X %02X %02X\n",spuportin[0],spuportin[1],spuportin[2],spuportin[3]);
155
printf("Out=%02X %02X %02X %02X\n",spuport[0],spuport[1],spuport[2],spuport[3]);
156
printf("%i ins %04X %04X %04X %04X %04X %04X %04X %04X\n",spcins,spc.opc[0],spc.opc[1],spc.opc[2],spc.opc[3],spc.opc[4],spc.opc[5],spc.opc[6],spc.opc[7]);
157
}
158
159
void resetspc()
160
{
161
memcpy(&spuram[0xFFC0],spurom,64);
162
spc.pc=0xFFC0;
163
spc.p.p=0;
164
memset(spuaccess,0xFF,sizeof(spuaccess));
165
spuaccess[0]=0;
166
spuaccess[255]=0;
167
makespctables();
168
}
169
170
unsigned short addr,addr2,tempw;
171
unsigned char temp,temp2,opcode;
172
uint32 templ;
173
signed char tmps;
174
int cycs;
175
176
#define readspc(a) (((a)&0xFF00)?spuram[(a)]:readspcl(a))
177
#define writespc(a,v) if (spuaccess[(a)>>8]) spuram[(a)]=v; else writespcl(a,v)
178
179
#define getdp() addr=readspc(spc.pc)|spc.p.p; spc.pc++
180
#define getdpx() addr=((readspc(spc.pc)+spc.x)&0xFF)|spc.p.p; spc.pc++
181
#define getdpy() addr=((readspc(spc.pc)+spc.ya.b.y)&0xFF)|spc.p.p; spc.pc++
182
#define getabs() addr=readspc(spc.pc)|(readspc(spc.pc+1)<<8); spc.pc+=2
183
184
#define setspczn(v) spc.p.z=!(v); spc.p.n=(v)&0x80
185
#define setspczn16(v) spc.p.z=!(v); spc.p.n=(v)&0x8000
186
187
#define ADC(ac) tempw=ac+temp+((spc.p.c)?1:0); \
188
spc.p.v=(!((ac^temp)&0x80)&&((ac^tempw)&0x80)); \
189
ac=tempw&0xFF; \
190
setspczn(ac); \
191
spc.p.c=tempw&0x100;
192
193
#define SBC(ac) tempw=ac-temp-((spc.p.c)?0:1); \
194
spc.p.v=(((ac^temp)&0x80)&&((ac^tempw)&0x80)); \
195
ac=tempw&0xFF; \
196
setspczn(ac); \
197
spc.p.c=tempw<=0xFF;
198
199
#define CMP(ac) spc.p.c=(ac>=temp); \
200
spc.p.z=!(ac-temp); \
201
spc.p.n=(ac-temp)&0x80
202
203
/*NOP*/ void sop00() { cycs=2; }
204
205
/*SET*/
206
void sop02() { getdp(); temp=readspc(addr)|0x01; writespc(addr,temp); cycs=4; }
207
void sop22() { getdp(); temp=readspc(addr)|0x02; writespc(addr,temp); cycs=4; }
208
void sop42() { getdp(); temp=readspc(addr)|0x04; writespc(addr,temp); cycs=4; }
209
void sop62() { getdp(); temp=readspc(addr)|0x08; writespc(addr,temp); cycs=4; }
210
void sop82() { getdp(); temp=readspc(addr)|0x10; writespc(addr,temp); cycs=4; }
211
void sopa2() { getdp(); temp=readspc(addr)|0x20; writespc(addr,temp); cycs=4; }
212
void sopc2() { getdp(); temp=readspc(addr)|0x40; writespc(addr,temp); cycs=4; }
213
void sope2() { getdp(); temp=readspc(addr)|0x80; writespc(addr,temp); cycs=4; }
214
215
/*CLR*/
216
void sop12() { getdp(); temp=readspc(addr)&~0x01; writespc(addr,temp); cycs=4; }
217
void sop32() { getdp(); temp=readspc(addr)&~0x02; writespc(addr,temp); cycs=4; }
218
void sop52() { getdp(); temp=readspc(addr)&~0x04; writespc(addr,temp); cycs=4; }
219
void sop72() { getdp(); temp=readspc(addr)&~0x08; writespc(addr,temp); cycs=4; }
220
void sop92() { getdp(); temp=readspc(addr)&~0x10; writespc(addr,temp); cycs=4; }
221
void sopb2() { getdp(); temp=readspc(addr)&~0x20; writespc(addr,temp); cycs=4; }
222
void sopd2() { getdp(); temp=readspc(addr)&~0x40; writespc(addr,temp); cycs=4; }
223
void sopf2() { getdp(); temp=readspc(addr)&~0x80; writespc(addr,temp); cycs=4; }
224
225
/*BEQ*/ void sopf0() { tmps=(signed char)readspc(spc.pc); spc.pc++; if (spc.p.z) { spc.pc+=tmps; cycs=4; } else cycs=2; }
226
/*BNE*/ void sopd0() { tmps=(signed char)readspc(spc.pc); spc.pc++; if (!spc.p.z) { spc.pc+=tmps; cycs=4; } else cycs=2; }
227
/*BCS*/ void sopb0() { tmps=(signed char)readspc(spc.pc); spc.pc++; if (spc.p.c) { spc.pc+=tmps; cycs=4; } else cycs=2; }
228
/*BCC*/ void sop90() { tmps=(signed char)readspc(spc.pc); spc.pc++; if (!spc.p.c) { spc.pc+=tmps; cycs=4; } else cycs=2; }
229
/*BRA*/ void sop2f() { tmps=(signed char)readspc(spc.pc); spc.pc++; spc.pc+=tmps; cycs=4; }
230
/*BVS*/ void sop70() { tmps=(signed char)readspc(spc.pc); spc.pc++; if (spc.p.v) { spc.pc+=tmps; cycs=4; } else cycs=2; }
231
/*BVC*/ void sop50() { tmps=(signed char)readspc(spc.pc); spc.pc++; if (!spc.p.v) { spc.pc+=tmps; cycs=4; } else cycs=2; }
232
/*BMI*/ void sop30() { tmps=(signed char)readspc(spc.pc); spc.pc++; if (spc.p.n) { spc.pc+=tmps; cycs=4; } else cycs=2; }
233
/*BPL*/ void sop10() { tmps=(signed char)readspc(spc.pc); spc.pc++; if (!spc.p.n) { spc.pc+=tmps; cycs=4; } else cycs=2; }
234
235
/*MOV (X),A*/ void sopc6() { addr=spc.x|spc.p.p; writespc(addr,spc.ya.b.a); cycs=4; }
236
/*MOV (X)+,A*/ void sopaf() { addr=spc.x|spc.p.p; writespc(addr,spc.ya.b.a); spc.x++; cycs=4; }
237
/*MOV dp,A*/ void sopc4() { getdp(); writespc(addr,spc.ya.b.a); cycs=4; }
238
/*MOV dpx,A*/ void sopd4() { getdpx(); writespc(addr,spc.ya.b.a); cycs=5; }
239
/*MOV abs,A*/ void sopc5() { getabs(); writespc(addr,spc.ya.b.a); cycs=5; }
240
/*MOV absx,A*/ void sopd5() { getabs(); addr+=spc.x; writespc(addr,spc.ya.b.a); cycs=5; }
241
/*MOV absy,A*/ void sopd6() { getabs(); addr+=spc.ya.b.y; writespc(addr,spc.ya.b.a); cycs=5; }
242
/*MOV (dpx),A*/ void sopc7() { getdpx(); addr2=readspc(addr)|(readspc(addr+1)<<8); writespc(addr2,spc.ya.b.a); cycs=7; }
243
/*MOV (dp)y,A*/ void sopd7() { getdp(); addr2=(readspc(addr)|(readspc(addr+1)<<8))+spc.ya.b.y; writespc(addr2,spc.ya.b.a); cycs=7; }
244
245
/*MOV dp,X*/ void sopd8() { getdp(); writespc(addr,spc.x); cycs=4; }
246
/*MOV dpy,X*/ void sopd9() { getdpy(); writespc(addr,spc.x); cycs=5; }
247
/*MOV abs,X*/ void sopc9() { getabs(); writespc(addr,spc.x); cycs=5; }
248
249
/*MOV dp,Y*/ void sopcb() { getdp(); writespc(addr,spc.ya.b.y); cycs=4; }
250
/*MOV dpx,Y*/ void sopdb() { getdpx(); writespc(addr,spc.ya.b.y); cycs=5; }
251
/*MOV abs,Y*/ void sopcc() { getabs(); writespc(addr,spc.ya.b.y); cycs=5; }
252
253
/*MOV A,#*/ void sope8() { getdp(); spc.ya.b.a=addr&0xFF; setspczn(spc.ya.b.a); cycs=2; }
254
/*MOV A,(X)*/ void sope6() { addr=spc.x|spc.p.p; spc.ya.b.a=readspc(addr); setspczn(spc.ya.b.a); cycs=3; }
255
/*MOV A,(X)+*/ void sopbf() { addr=spc.x|spc.p.p; spc.ya.b.a=readspc(addr); setspczn(spc.ya.b.a); spc.x++; cycs=4; }
256
/*MOV A,dp*/ void sope4() { getdp(); spc.ya.b.a=readspc(addr); setspczn(spc.ya.b.a); cycs=3; }
257
/*MOV A,dpx*/ void sopf4() { getdpx(); spc.ya.b.a=readspc(addr); setspczn(spc.ya.b.a); cycs=4; }
258
/*MOV A,abs*/ void sope5() { getabs(); spc.ya.b.a=readspc(addr); setspczn(spc.ya.b.a); cycs=4; }
259
/*MOV A,absx*/ void sopf5() { getabs(); addr+=spc.x; spc.ya.b.a=readspc(addr); setspczn(spc.ya.b.a); cycs=5; }
260
/*MOV A,absy*/ void sopf6() { getabs(); addr+=spc.ya.b.y; spc.ya.b.a=readspc(addr); setspczn(spc.ya.b.a); cycs=5; }
261
/*MOV A,(dpx)*/ void sope7() { getdpx(); addr2=readspc(addr)|(readspc(addr+1)<<8); spc.ya.b.a=readspc(addr2); setspczn(spc.ya.b.a); cycs=6; }
262
/*MOV A,(dp)y*/ void sopf7() { getdp(); addr2=(readspc(addr)|(readspc(addr+1)<<8))+spc.ya.b.y; spc.ya.b.a=readspc(addr2); setspczn(spc.ya.b.a); cycs=6; }
263
264
/*MOV dp,dp*/ void sopfa() { getdp(); tempw=addr; getdp(); temp=readspc(tempw); writespc(addr,temp); setspczn(temp); cycs=5; }
265
266
/*MOV X,#*/ void sopcd() { getdp(); spc.x=addr&0xFF; setspczn(spc.x); cycs=2; }
267
/*MOV X,dp*/ void sopf8() { getdp(); spc.x=readspc(addr); setspczn(spc.x); cycs=3; }
268
/*MOV X,dpx*/ void sopf9() { getdpx(); spc.x=readspc(addr); setspczn(spc.x); cycs=4; }
269
/*MOV X,abs*/ void sope9() { getabs(); spc.x=readspc(addr); setspczn(spc.x); cycs=4; }
270
271
/*MOV Y,#*/ void sop8d() { getdp(); spc.ya.b.y=addr&0xFF; setspczn(spc.ya.b.y); cycs=2; }
272
/*MOV Y,dp*/ void sopeb() { getdp(); spc.ya.b.y=readspc(addr); setspczn(spc.ya.b.y); cycs=3; }
273
/*MOV Y,dpx*/ void sopfb() { getdpx(); spc.ya.b.y=readspc(addr); setspczn(spc.ya.b.y); cycs=4; }
274
/*MOV Y,abs*/ void sopec() { getabs(); spc.ya.b.y=readspc(addr); setspczn(spc.ya.b.y); cycs=4; }
275
276
/*MOV A,X*/ void sop7d() { spc.ya.b.a=spc.x; setspczn(spc.ya.b.a); cycs=2; }
277
/*MOV A,Y*/ void sopdd() { spc.ya.b.a=spc.ya.b.y; setspczn(spc.ya.b.a); cycs=2; }
278
/*MOV X,A*/ void sop5d() { spc.x =spc.ya.b.a; setspczn(spc.x); cycs=2; }
279
/*MOV Y,A*/ void sopfd() { spc.ya.b.y=spc.ya.b.a; setspczn(spc.ya.b.y); cycs=2; }
280
/*MOV X,SP*/ void sop9d() { spc.x=spc.s; setspczn(spc.x); cycs=2; }
281
/*MOV SP,X*/ void sopbd() { spc.s=spc.x; cycs=2; }
282
283
/*ADC #*/ void sop88() { getdp(); temp=addr&0xFF; ADC(spc.ya.b.a); cycs=2; }
284
/*ADC (X)*/ void sop86() { addr=spc.x|spc.p.p; temp=readspc(addr); ADC(spc.ya.b.a); cycs=3; }
285
/*ADC dp*/ void sop84() { getdp(); temp=readspc(addr); ADC(spc.ya.b.a); cycs=3; }
286
/*ADC dpx*/ void sop94() { getdpx(); temp=readspc(addr); ADC(spc.ya.b.a); cycs=4; }
287
/*ADC abs*/ void sop85() { getabs(); temp=readspc(addr); ADC(spc.ya.b.a); cycs=4; }
288
/*ADC absx*/ void sop95() { getabs(); addr+=spc.x; temp=readspc(addr); ADC(spc.ya.b.a); cycs=5; }
289
/*ADC absy*/ void sop96() { getabs(); addr+=spc.ya.b.y; temp=readspc(addr); ADC(spc.ya.b.a); cycs=5; }
290
/*ADC (dpx)*/ void sop87() { getdpx(); addr2=readspc(addr)|(readspc(addr+1)<<8); temp=readspc(addr2); ADC(spc.ya.b.a); cycs=6; }
291
/*ADC (dp)y*/ void sop97() { getdp(); addr2=(readspc(addr)|(readspc(addr+1)<<8))+spc.ya.b.y; temp=readspc(addr2); ADC(spc.ya.b.a); cycs=6; }
292
/*ADC dp,#*/ void sop98() { getdp(); temp=addr&0xFF; getdp(); temp2=readspc(addr); ADC(temp2); writespc(addr,temp2); cycs=5; }
293
/*ADC dp,dp*/ void sop89() { getdp(); temp=readspc(addr); getdp(); temp2=readspc(addr); ADC(temp2); writespc(addr,temp2); cycs=5; }
294
295
/*SBC #*/ void sopa8() { getdp(); temp=addr&0xFF; SBC(spc.ya.b.a); cycs=2; }
296
/*SBC (X)*/ void sopa6() { addr=spc.x|spc.p.p; temp=readspc(addr); SBC(spc.ya.b.a); cycs=3; }
297
/*SBC dp*/ void sopa4() { getdp(); temp=readspc(addr); SBC(spc.ya.b.a); cycs=3; }
298
/*SBC dpx*/ void sopb4() { getdpx(); temp=readspc(addr); SBC(spc.ya.b.a); cycs=4; }
299
/*SBC abs*/ void sopa5() { getabs(); temp=readspc(addr); SBC(spc.ya.b.a); cycs=4; }
300
/*SBC absx*/ void sopb5() { getabs(); addr+=spc.x; temp=readspc(addr); SBC(spc.ya.b.a); cycs=5; }
301
/*SBC absy*/ void sopb6() { getabs(); addr+=spc.ya.b.y; temp=readspc(addr); SBC(spc.ya.b.a); cycs=5; }
302
/*SBC (dpx)*/ void sopa7() { getdpx(); addr2=readspc(addr)|(readspc(addr+1)<<8); temp=readspc(addr2); SBC(spc.ya.b.a); cycs=6; }
303
/*SBC (dp)y*/ void sopb7() { getdp(); addr2=(readspc(addr)|(readspc(addr+1)<<8))+spc.ya.b.y; temp=readspc(addr2); SBC(spc.ya.b.a); cycs=6; }
304
/*SBC dp,#*/ void sopb8() { getdp(); temp=addr&0xFF; getdp(); temp2=readspc(addr); SBC(temp2); writespc(addr,temp2); cycs=5; }
305
306
/*CMP A,#*/ void sop68() { getdp(); temp=addr&0xFF; CMP(spc.ya.b.a); cycs=2; }
307
/*CMP A,(X)*/ void sop66() { addr=spc.x|spc.p.p; temp=readspc(addr); CMP(spc.ya.b.a); cycs=3; }
308
/*CMP A,dp*/ void sop64() { getdp(); temp=readspc(addr); CMP(spc.ya.b.a); cycs=3; }
309
/*CMP A,dpx*/ void sop74() { getdpx(); temp=readspc(addr); CMP(spc.ya.b.a); cycs=4; }
310
/*CMP A,abs*/ void sop65() { getabs(); temp=readspc(addr); CMP(spc.ya.b.a); cycs=4; }
311
/*CMP A,absx*/ void sop75() { getabs(); addr+=spc.x; temp=readspc(addr); CMP(spc.ya.b.a); cycs=5; }
312
/*CMP A,absy*/ void sop76() { getabs(); addr+=spc.ya.b.y; temp=readspc(addr); CMP(spc.ya.b.a); cycs=5; }
313
/*CMP A,(dpx)*/ void sop67() { getdpx(); addr2=readspc(addr)|(readspc(addr+1)<<8); temp=readspc(addr2); CMP(spc.ya.b.a); cycs=6; }
314
/*CMP A,(dp)y*/ void sop77() { getdp(); addr2=(readspc(addr)|(readspc(addr+1)<<8))+spc.ya.b.y; temp=readspc(addr2); CMP(spc.ya.b.a); cycs=6; }
315
316
/*CMP X,#*/ void sopc8() { getdp(); temp=addr&0xFF; CMP(spc.x); cycs=2; }
317
/*CMP X,dp*/ void sop3e() { getdp(); temp=readspc(addr); CMP(spc.x); cycs=3; }
318
/*CMP X,abs*/ void sop1e() { getabs(); temp=readspc(addr); CMP(spc.x); cycs=4; }
319
320
/*CMP Y,#*/ void sopad() { getdp(); temp=addr&0xFF; CMP(spc.ya.b.y); cycs=2; }
321
/*CMP Y,dp*/ void sop7e() { getdp(); temp=readspc(addr); CMP(spc.ya.b.y); cycs=3; }
322
/*CMP Y,abs*/ void sop5e() { getabs(); temp=readspc(addr); CMP(spc.ya.b.y); cycs=4; }
323
324
/*CMP dp,dp*/ void sop69() { getdp(); tempw=addr; getdp(); temp2=readspc(tempw); temp=readspc(addr); CMP(temp2); cycs=6; }
325
326
/*AND #*/ void sop28() { getdp(); temp=addr&0xFF; spc.ya.b.a&=temp; setspczn(spc.ya.b.a); cycs=2; }
327
/*AND (X)*/ void sop26() { addr=spc.x|spc.p.p; temp=readspc(addr); spc.ya.b.a&=temp; setspczn(spc.ya.b.a); cycs=3; }
328
/*AND dp*/ void sop24() { getdp(); temp=readspc(addr); spc.ya.b.a&=temp; setspczn(spc.ya.b.a); cycs=3; }
329
/*AND dpx*/ void sop34() { getdpx(); temp=readspc(addr); spc.ya.b.a&=temp; setspczn(spc.ya.b.a); cycs=4; }
330
/*AND abs*/ void sop25() { getabs(); temp=readspc(addr); spc.ya.b.a&=temp; setspczn(spc.ya.b.a); cycs=4; }
331
/*AND absx*/ void sop35() { getabs(); addr+=spc.x; temp=readspc(addr); spc.ya.b.a&=temp; setspczn(spc.ya.b.a); cycs=5; }
332
/*AND absy*/ void sop36() { getabs(); addr+=spc.ya.b.y; temp=readspc(addr); spc.ya.b.a&=temp; setspczn(spc.ya.b.a); cycs=5; }
333
/*AND (dpx)*/ void sop27() { getdpx(); addr2=readspc(addr)|(readspc(addr+1)<<8); temp=readspc(addr2); spc.ya.b.a&=temp; setspczn(spc.ya.b.a); cycs=6; }
334
/*AND (dp)y*/ void sop37() { getdp(); addr2=(readspc(addr)|(readspc(addr+1)<<8))+spc.ya.b.y; temp=readspc(addr2); spc.ya.b.a&=temp; setspczn(spc.ya.b.a); cycs=6; }
335
/*AND dp,#*/ void sop38() { getdp(); temp=addr&0xFF; getdp(); temp2=readspc(addr); temp&=temp2; setspczn(temp); writespc(addr,temp); cycs=5; }
336
/*AND dp,dp*/ void sop29() { getdp(); tempw=addr; getdp(); temp=readspc(tempw)&readspc(addr); writespc(addr,temp); setspczn(temp); cycs=6; }
337
338
/*OR #*/ void sop08() { getdp(); temp=addr&0xFF; spc.ya.b.a|=temp; setspczn(spc.ya.b.a); cycs=2; }
339
/*OR (X)*/ void sop06() { addr=spc.x|spc.p.p; temp=readspc(addr); spc.ya.b.a|=temp; setspczn(spc.ya.b.a); cycs=3; }
340
/*OR dp*/ void sop04() { getdp(); temp=readspc(addr); spc.ya.b.a|=temp; setspczn(spc.ya.b.a); cycs=3; }
341
/*OR dpx*/ void sop14() { getdpx(); temp=readspc(addr); spc.ya.b.a|=temp; setspczn(spc.ya.b.a); cycs=4; }
342
/*OR abs*/ void sop05() { getabs(); temp=readspc(addr); spc.ya.b.a|=temp; setspczn(spc.ya.b.a); cycs=4; }
343
/*OR absx*/ void sop15() { getabs(); addr+=spc.x; temp=readspc(addr); spc.ya.b.a|=temp; setspczn(spc.ya.b.a); cycs=5; }
344
/*OR absy*/ void sop16() { getabs(); addr+=spc.ya.b.y; temp=readspc(addr); spc.ya.b.a|=temp; setspczn(spc.ya.b.a); cycs=5; }
345
/*OR (dpx)*/ void sop07() { getdpx(); addr2=readspc(addr)|(readspc(addr+1)<<8); temp=readspc(addr2); spc.ya.b.a|=temp; setspczn(spc.ya.b.a); cycs=6; }
346
/*OR (dp)y*/ void sop17() { getdp(); addr2=(readspc(addr)|(readspc(addr+1)<<8))+spc.ya.b.y; temp=readspc(addr2); spc.ya.b.a|=temp; setspczn(spc.ya.b.a); cycs=6; }
347
/*OR dp,dp*/ void sop09() { getdp(); tempw=addr; getdp(); temp=readspc(tempw)|readspc(addr); writespc(addr,temp); setspczn(temp); cycs=6; }
348
/*OR dp,#*/ void sop18() { getdp(); temp=addr&0xFF; getdp(); temp2=readspc(addr); temp|=temp2; setspczn(temp); writespc(addr,temp); cycs=5; }
349
350
/*EOR #*/ void sop48() { getdp(); temp=addr&0xFF; spc.ya.b.a^=temp; setspczn(spc.ya.b.a); cycs=2; }
351
/*EOR (X)*/ void sop46() { addr=spc.x|spc.p.p; temp=readspc(addr); spc.ya.b.a^=temp; setspczn(spc.ya.b.a); cycs=3; }
352
/*EOR dp*/ void sop44() { getdp(); temp=readspc(addr); spc.ya.b.a^=temp; setspczn(spc.ya.b.a); cycs=3; }
353
/*EOR dpx*/ void sop54() { getdpx(); temp=readspc(addr); spc.ya.b.a^=temp; setspczn(spc.ya.b.a); cycs=4; }
354
/*EOR abs*/ void sop45() { getabs(); temp=readspc(addr); spc.ya.b.a^=temp; setspczn(spc.ya.b.a); cycs=4; }
355
/*EOR absx*/ void sop55() { getabs(); addr+=spc.x; temp=readspc(addr); spc.ya.b.a^=temp; setspczn(spc.ya.b.a); cycs=5; }
356
/*EOR absy*/ void sop56() { getabs(); addr+=spc.ya.b.y; temp=readspc(addr); spc.ya.b.a^=temp; setspczn(spc.ya.b.a); cycs=5; }
357
/*EOR (dpx)*/ void sop47() { getdpx(); addr2=readspc(addr)|(readspc(addr+1)<<8); temp=readspc(addr2); spc.ya.b.a^=temp; setspczn(spc.ya.b.a); cycs=6; }
358
/*EOR (dp)y*/ void sop57() { getdp(); addr2=(readspc(addr)|(readspc(addr+1)<<8))+spc.ya.b.y; temp=readspc(addr2); spc.ya.b.a^=temp; setspczn(spc.ya.b.a); cycs=6; }
359
/*EOR dp,dp*/ void sop49() { getdp(); tempw=addr; getdp(); temp=readspc(tempw)^readspc(addr); writespc(addr,temp); setspczn(temp); cycs=6; }
360
/*EOR dp,#*/ void sop58() { getdp(); temp=addr&0xFF; getdp(); temp2=readspc(addr); temp^=temp2; setspczn(temp); writespc(addr,temp); cycs=5; }
361
362
/*CLRC*/ void sop60() { spc.p.c=0; cycs=2; }
363
/*SETC*/ void sop80() { spc.p.c=1; cycs=2; }
364
/*NOTC*/ void soped() { spc.p.c=!spc.p.c; cycs=2; }
365
/*CLRP*/ void sop20() { spc.p.p=0; cycs=2; }
366
/*SETP*/ void sop40() { spc.p.p=0x100; cycs=2; }
367
368
/*DEC X*/ void sop1d() { spc.x--; setspczn(spc.x); cycs=2; }
369
/*DEC Y*/ void sopdc() { spc.ya.b.y--; setspczn(spc.ya.b.y); cycs=2; }
370
/*DEC A*/ void sop9c() { spc.ya.b.a--; setspczn(spc.ya.b.a); cycs=2; }
371
372
/*INC X*/ void sop3d() { spc.x++; setspczn(spc.x); cycs=2; }
373
/*INC Y*/ void sopfc() { spc.ya.b.y++; setspczn(spc.ya.b.y); cycs=2; }
374
/*INC A*/ void sopbc() { spc.ya.b.a++; setspczn(spc.ya.b.a); cycs=2; }
375
376
/*MOV dp,#*/ void sop8f() { temp=readspc(spc.pc); spc.pc++; getdp(); writespc(addr,temp); cycs=5; }
377
378
/*CMP dp,#*/ void sop78() { temp=readspc(spc.pc); spc.pc++; getdp(); temp2=readspc(addr); CMP(temp2); cycs=5; }
379
380
/*MOVW YA,dp*/ void sopba() { getdp(); spc.ya.b.a=readspc(addr); spc.ya.b.y=readspc(addr+1); setspczn16(spc.ya.ya); cycs=5; }
381
/*MOVW dp,YA*/ void sopda() { getdp(); writespc(addr,spc.ya.b.a); writespc(addr+1,spc.ya.b.y); cycs=4; }
382
383
/*INC dp*/ void sopab() { getdp(); temp=readspc(addr)+1; writespc(addr,temp); setspczn(temp); cycs=4; }
384
/*INC dpx*/ void sopbb() { getdpx(); temp=readspc(addr)+1; writespc(addr,temp); setspczn(temp); cycs=5; }
385
/*INC abs*/ void sopac() { getabs(); temp=readspc(addr)+1; writespc(addr,temp); setspczn(temp); cycs=5; }
386
387
/*DEC dp*/ void sop8b() { getdp(); temp=readspc(addr)-1; writespc(addr,temp); setspczn(temp); cycs=4; }
388
/*DEC dpx*/ void sop9b() { getdpx(); temp=readspc(addr)-1; writespc(addr,temp); setspczn(temp); cycs=5; }
389
/*DEC abs*/ void sop8c() { getabs(); temp=readspc(addr)-1; writespc(addr,temp); setspczn(temp); cycs=5; }
390
391
/*JMP abs*/ void sop5f() { getabs(); spc.pc=addr; cycs=3; }
392
/*JMP [,x]*/ void sop1f() { getabs(); addr+=spc.x; spc.pc=readspc(addr)|(readspc(addr+1)<<8); cycs=6; }
393
394
/*CALL*/ void sop3f() { getabs(); writespc(0x100|spc.s,spc.pc>>8); spc.s--; writespc(0x100|spc.s,spc.pc&0xFF); spc.s--; spc.pc=addr; cycs=8; }
395
/*PCALL*/ void sop4f() { addr=readspc(spc.pc)|0xFF00; spc.pc++; writespc(0x100|spc.s,spc.pc>>8); spc.s--; writespc(0x100|spc.s,spc.pc&0xFF); spc.s--; spc.pc=addr; cycs=6; }
396
/*RET*/ void sop6f() { spc.s++; addr=readspc(0x100|spc.s); spc.s++; addr|=readspc(0x100|spc.s)<<8; spc.pc=addr; cycs=5; }
397
398
/*PUSH A*/ void sop2d() { spuram[0x100|spc.s]=spc.ya.b.a; spc.s--; cycs=4; }
399
/*PUSH X*/ void sop4d() { spuram[0x100|spc.s]=spc.x; spc.s--; cycs=4; }
400
/*PUSH Y*/ void sop6d() { spuram[0x100|spc.s]=spc.ya.b.y; spc.s--; cycs=4; }
401
402
/*POP A*/ void sopae() { spc.s++; spc.ya.b.a=spuram[0x100|spc.s]; cycs=4; }
403
/*POP X*/ void sopce() { spc.s++; spc.x=spuram[0x100|spc.s]; cycs=4; }
404
/*POP Y*/ void sopee() { spc.s++; spc.ya.b.y=spuram[0x100|spc.s]; cycs=4; }
405
406
/*MUL YA*/ void sopcf() { spc.ya.ya=spc.ya.b.a*spc.ya.b.y; setspczn16(spc.ya.ya); cycs=9; }
407
/*DIV YA,X*/ void sop9e() { if (!spc.x) { spc.p.v=1; spc.ya.ya=0xFFFF; } else { spc.p.v=0; temp=spc.ya.ya/spc.x; spc.ya.b.y=spc.ya.ya%spc.x; spc.ya.b.a=temp; setspczn(spc.ya.b.a); } cycs=12; }
408
409
/*CBNE dp*/ void sop2e() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (spc.ya.b.a!=temp) { spc.pc+=tmps; cycs=7; } else cycs=5; }
410
/*CBNE dpx*/ void sopde() { getdpx(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (spc.ya.b.a!=temp) { spc.pc+=tmps; cycs=8; } else cycs=6; }
411
/*DBNZ dp*/ void sop6e() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); temp--; writespc(addr,temp); if (temp) { spc.pc+=tmps; cycs=7; } else cycs=5; }
412
/*DBNZ Y*/ void sopfe() { tmps=(signed char)readspc(spc.pc); spc.pc++; spc.ya.b.y--; if (spc.ya.b.y) { spc.pc+=tmps; cycs=6; } else cycs=4; }
413
414
/*ASL A*/ void sop1c() { spc.p.c=spc.ya.b.a&0x80; spc.ya.b.a<<=1; setspczn(spc.ya.b.a); cycs=2; }
415
/*ASL dp*/ void sop0b() { getdp(); temp=readspc(addr); spc.p.c=temp&0x80; temp<<=1; setspczn(temp); writespc(addr,temp); cycs=4; }
416
/*ASL dpx*/ void sop1b() { getdpx(); temp=readspc(addr); spc.p.c=temp&0x80; temp<<=1; setspczn(temp); writespc(addr,temp); cycs=5; }
417
/*ASL abs*/ void sop0c() { getabs(); temp=readspc(addr); spc.p.c=temp&0x80; temp<<=1; setspczn(temp); writespc(addr,temp); cycs=5; }
418
419
/*LSR A*/ void sop5c() { spc.p.c=spc.ya.b.a&1; spc.ya.b.a>>=1; setspczn(spc.ya.b.a); cycs=2; }
420
/*LSR dp*/ void sop4b() { getdp(); temp=readspc(addr); spc.p.c=temp&1; temp>>=1; setspczn(temp); writespc(addr,temp); cycs=4; }
421
/*LSR dpx*/ void sop5b() { getdpx(); temp=readspc(addr); spc.p.c=temp&1; temp>>=1; setspczn(temp); writespc(addr,temp); cycs=5; }
422
/*LSR abs*/ void sop4c() { getabs(); temp=readspc(addr); spc.p.c=temp&1; temp>>=1; setspczn(temp); writespc(addr,temp); cycs=5; }
423
424
/*ROL A*/ void sop3c() { templ=spc.p.c; spc.p.c=spc.ya.b.a&0x80; spc.ya.b.a<<=1; if (templ) spc.ya.b.a|=1; setspczn(spc.ya.b.a); cycs=2; }
425
/*ROL dp*/ void sop2b() { getdp(); temp=readspc(addr); templ=spc.p.c; spc.p.c=temp&0x80; temp<<=1; if (templ) temp|=1; setspczn(temp); writespc(addr,temp); cycs=4; }
426
/*ROL dpx*/ void sop3b() { getdpx(); temp=readspc(addr); templ=spc.p.c; spc.p.c=temp&0x80; temp<<=1; if (templ) temp|=1; setspczn(temp); writespc(addr,temp); cycs=5; }
427
/*ROL abs*/ void sop2c() { getabs(); temp=readspc(addr); templ=spc.p.c; spc.p.c=temp&0x80; temp<<=1; if (templ) temp|=1; setspczn(temp); writespc(addr,temp); cycs=5; }
428
429
/*ROR A*/ void sop7c() { templ=spc.p.c; spc.p.c=spc.ya.b.a&1; spc.ya.b.a>>=1; if (templ) spc.ya.b.a|=0x80; setspczn(spc.ya.b.a); cycs=2; }
430
/*ROR dp*/ void sop6b() { getdp(); temp=readspc(addr); templ=spc.p.c; spc.p.c=temp&1; temp>>=1; if (templ) temp|=0x80; setspczn(temp); writespc(addr,temp); cycs=4; }
431
/*ROR dpx*/ void sop7b() { getdpx(); temp=readspc(addr); templ=spc.p.c; spc.p.c=temp&1; temp>>=1; if (templ) temp|=0x80; setspczn(temp); writespc(addr,temp); cycs=5; }
432
/*ROR abs*/ void sop6c() { getabs(); temp=readspc(addr); templ=spc.p.c; spc.p.c=temp&1; temp>>=1; if (templ) temp|=0x80; setspczn(temp); writespc(addr,temp); cycs=5; }
433
434
/*BBC 0*/ void sop13() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (!(temp&0x01)) { spc.pc+=tmps; cycs=7; } else cycs=5; }
435
/*BBC 1*/ void sop33() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (!(temp&0x02)) { spc.pc+=tmps; cycs=7; } else cycs=5; }
436
/*BBC 2*/ void sop53() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (!(temp&0x04)) { spc.pc+=tmps; cycs=7; } else cycs=5; }
437
/*BBC 3*/ void sop73() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (!(temp&0x08)) { spc.pc+=tmps; cycs=7; } else cycs=5; }
438
/*BBC 4*/ void sop93() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (!(temp&0x10)) { spc.pc+=tmps; cycs=7; } else cycs=5; }
439
/*BBC 5*/ void sopb3() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (!(temp&0x20)) { spc.pc+=tmps; cycs=7; } else cycs=5; }
440
/*BBC 6*/ void sopd3() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (!(temp&0x40)) { spc.pc+=tmps; cycs=7; } else cycs=5; }
441
/*BBC 7*/ void sopf3() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (!(temp&0x80)) { spc.pc+=tmps; cycs=7; } else cycs=5; }
442
443
/*BBS 0*/ void sop03() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (temp&0x01) { spc.pc+=tmps; cycs=7; } else cycs=5; }
444
/*BBS 1*/ void sop23() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (temp&0x02) { spc.pc+=tmps; cycs=7; } else cycs=5; }
445
/*BBS 2*/ void sop43() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (temp&0x04) { spc.pc+=tmps; cycs=7; } else cycs=5; }
446
/*BBS 3*/ void sop63() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (temp&0x08) { spc.pc+=tmps; cycs=7; } else cycs=5; }
447
/*BBS 4*/ void sop83() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (temp&0x10) { spc.pc+=tmps; cycs=7; } else cycs=5; }
448
/*BBS 5*/ void sopa3() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (temp&0x20) { spc.pc+=tmps; cycs=7; } else cycs=5; }
449
/*BBS 6*/ void sopc3() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (temp&0x40) { spc.pc+=tmps; cycs=7; } else cycs=5; }
450
/*BBS 7*/ void sope3() { getdp(); tmps=(signed char)readspc(spc.pc); spc.pc++; temp=readspc(addr); if (temp&0x80) { spc.pc+=tmps; cycs=7; } else cycs=5; }
451
452
/*ADDW YA,dp*/ void sop7a() { getdp(); tempw=readspc(addr); tempw|=readspc(addr+1)<<8; templ=spc.ya.ya+tempw; spc.p.v=(!((spc.ya.ya^tempw)&0x8000)&&((spc.ya.ya^templ)&0x8000)); spc.ya.ya=templ&0xFFFF; setspczn16(spc.ya.ya); spc.p.c=templ&0x10000; cycs=5; }
453
/*SUBW YA,dp*/ void sop9a() { getdp(); tempw=readspc(addr); tempw|=readspc(addr+1)<<8; templ=spc.ya.ya-tempw; spc.p.v=(((spc.ya.ya^tempw)&0x8000)&&((spc.ya.ya^templ)&0x8000)); spc.ya.ya=templ&0xFFFF; spc.p.c=(spc.ya.ya>=tempw); setspczn16(spc.ya.ya); cycs=5; }
454
/*CMPW YA,dp*/ void sop5a() { getdp(); tempw=readspc(addr); tempw|=readspc(addr+1)<<8; spc.p.c=(spc.ya.ya>=tempw); setspczn16(spc.ya.ya-tempw); cycs=4; }
455
456
/*DECW dp*/ void sop1a() { getdp(); tempw=readspc(addr); tempw|=readspc(addr+1)<<8; tempw--; writespc(addr,tempw); writespc(addr+1,tempw>>8); setspczn16(tempw); cycs=6; }
457
/*INCW dp*/ void sop3a() { getdp(); tempw=readspc(addr); tempw|=readspc(addr+1)<<8; tempw++; writespc(addr,tempw); writespc(addr+1,tempw>>8); setspczn16(tempw); cycs=6; }
458
459
/*XCN A*/ void sop9f() { spc.ya.b.a=(spc.ya.b.a>>4)|(spc.ya.b.a<<4); setspczn(spc.ya.b.a); cycs=2; }
460
461
/*TCLR1*/ void sop4e() { getabs(); temp=readspc(addr); setspczn(spc.ya.b.a&temp); temp&=~spc.ya.b.a; writespc(addr,temp); cycs=6; }
462
/*TSET1*/ void sop0e() { getabs(); temp=readspc(addr); setspczn(spc.ya.b.a&temp); temp|=spc.ya.b.a; writespc(addr,temp); cycs=6; }
463
464
/*MOV1 C,mem.bit*/ void sopaa() { getabs(); tempw=addr>>13; addr&=0x1FFF; temp=readspc(addr); spc.p.c=temp&(1<<tempw); cycs=4; }
465
/*MOV1 mem.bit,C*/ void sopca() { getabs(); tempw=addr>>13; addr&=0x1FFF; temp=readspc(addr); if (spc.p.c) temp|=(1<<tempw); else temp&=~(1<<tempw); writespc(addr,temp); cycs=6; }
466
/*EOR1 C,mem.bit*/ void sop8a() { getabs(); tempw=addr>>13; addr&=0x1FFF; temp=readspc(addr); if (spc.p.c) spc.p.c=1; spc.p.c^=((temp&(1<<tempw))?1:0); cycs=4; }
467
/*NOT1 mem.bit*/ void sopea() { getabs(); tempw=addr>>13; addr&=0x1FFF; temp=readspc(addr); temp^=(1<<tempw); writespc(addr,temp); cycs=4; }
468
469
/*PUSH PSW*/ void sop0d() { temp=(spc.p.c)?1:0; temp|=(spc.p.z)?2:0;
470
temp|=(spc.p.h)?8:0; temp|=(spc.p.p)?32:0;
471
temp|=(spc.p.v)?64:0; temp|=(spc.p.n)?128:0;
472
spuram[0x100|spc.s]=temp; spc.s--; cycs=4; }
473
/*POP PSW*/ void sop8e() { spc.s++; temp=spuram[0x100|spc.s];
474
spc.p.c=temp&1; spc.p.z=temp&2;
475
spc.p.h=temp&8; spc.p.p=(temp&32)?0x100:0;
476
spc.p.v=temp&64; spc.p.n=temp&128; cycs=4; }
477
478
void sopbad() { printf("Illegal SPC opcode %02X\n",opcode); dumpspcregs(); exit(-1); }
479
480
void makespctables()
481
{
482
int c;
483
for (c=0;c<256;c++) spcopcodes[c]=sopbad;
484
spcopcodes[0x02]=sop02;
485
spcopcodes[0x22]=sop22;
486
spcopcodes[0x42]=sop42;
487
spcopcodes[0x62]=sop62;
488
spcopcodes[0x82]=sop82;
489
spcopcodes[0xa2]=sopa2;
490
spcopcodes[0xc2]=sopc2;
491
spcopcodes[0xe2]=sope2;
492
spcopcodes[0x12]=sop12;
493
spcopcodes[0x32]=sop32;
494
spcopcodes[0x52]=sop52;
495
spcopcodes[0x72]=sop72;
496
spcopcodes[0x92]=sop92;
497
spcopcodes[0xb2]=sopb2;
498
spcopcodes[0xd2]=sopd2;
499
spcopcodes[0xf2]=sopf2;
500
spcopcodes[0xf0]=sopf0;
501
spcopcodes[0xd0]=sopd0;
502
spcopcodes[0xb0]=sopb0;
503
spcopcodes[0x90]=sop90;
504
spcopcodes[0x70]=sop70;
505
spcopcodes[0x50]=sop50;
506
spcopcodes[0x30]=sop30;
507
spcopcodes[0x10]=sop10;
508
spcopcodes[0xc6]=sopc6;
509
spcopcodes[0xaf]=sopaf;
510
spcopcodes[0xc4]=sopc4;
511
spcopcodes[0xd4]=sopd4;
512
spcopcodes[0xc5]=sopc5;
513
spcopcodes[0xd5]=sopd5;
514
spcopcodes[0xd6]=sopd6;
515
spcopcodes[0xc7]=sopc7;
516
spcopcodes[0xd7]=sopd7;
517
spcopcodes[0xd8]=sopd8;
518
spcopcodes[0xd9]=sopd9;
519
spcopcodes[0xc9]=sopc9;
520
spcopcodes[0xcb]=sopcb;
521
spcopcodes[0xdb]=sopdb;
522
spcopcodes[0xcc]=sopcc;
523
524
spcopcodes[0xe8]=sope8;
525
spcopcodes[0xe6]=sope6;
526
spcopcodes[0xbf]=sopbf;
527
spcopcodes[0xe4]=sope4;
528
spcopcodes[0xf4]=sopf4;
529
spcopcodes[0xe5]=sope5;
530
spcopcodes[0xf5]=sopf5;
531
spcopcodes[0xf6]=sopf6;
532
spcopcodes[0xe7]=sope7;
533
spcopcodes[0xf7]=sopf7;
534
535
spcopcodes[0xcd]=sopcd;
536
spcopcodes[0xf8]=sopf8;
537
spcopcodes[0xf9]=sopf9;
538
spcopcodes[0xe9]=sope9;
539
540
spcopcodes[0x8d]=sop8d;
541
spcopcodes[0xeb]=sopeb;
542
spcopcodes[0xfb]=sopfb;
543
spcopcodes[0xec]=sopec;
544
545
spcopcodes[0x7d]=sop7d;
546
spcopcodes[0xdd]=sopdd;
547
spcopcodes[0x5d]=sop5d;
548
spcopcodes[0xfd]=sopfd;
549
spcopcodes[0x9d]=sop9d;
550
spcopcodes[0xbd]=sopbd;
551
552
spcopcodes[0x88]=sop88;
553
spcopcodes[0x86]=sop86;
554
spcopcodes[0x84]=sop84;
555
spcopcodes[0x94]=sop94;
556
spcopcodes[0x85]=sop85;
557
spcopcodes[0x95]=sop95;
558
spcopcodes[0x96]=sop96;
559
spcopcodes[0x87]=sop87;
560
spcopcodes[0x97]=sop97;
561
spcopcodes[0x98]=sop98;
562
spcopcodes[0x89]=sop89;
563
564
spcopcodes[0xa8]=sopa8;
565
spcopcodes[0xa6]=sopa6;
566
spcopcodes[0xa4]=sopa4;
567
spcopcodes[0xb4]=sopb4;
568
spcopcodes[0xa5]=sopa5;
569
spcopcodes[0xb5]=sopb5;
570
spcopcodes[0xb6]=sopb6;
571
spcopcodes[0xa7]=sopa7;
572
spcopcodes[0xb7]=sopb7;
573
spcopcodes[0xb8]=sopb8;
574
575
spcopcodes[0x68]=sop68;
576
spcopcodes[0x66]=sop66;
577
spcopcodes[0x64]=sop64;
578
spcopcodes[0x74]=sop74;
579
spcopcodes[0x65]=sop65;
580
spcopcodes[0x75]=sop75;
581
spcopcodes[0x76]=sop76;
582
spcopcodes[0x67]=sop67;
583
spcopcodes[0x77]=sop77;
584
585
spcopcodes[0x28]=sop28;
586
spcopcodes[0x26]=sop26;
587
spcopcodes[0x24]=sop24;
588
spcopcodes[0x34]=sop34;
589
spcopcodes[0x25]=sop25;
590
spcopcodes[0x35]=sop35;
591
spcopcodes[0x36]=sop36;
592
spcopcodes[0x27]=sop27;
593
spcopcodes[0x37]=sop37;
594
spcopcodes[0x38]=sop38;
595
spcopcodes[0x29]=sop29;
596
597
spcopcodes[0x08]=sop08;
598
spcopcodes[0x06]=sop06;
599
spcopcodes[0x04]=sop04;
600
spcopcodes[0x14]=sop14;
601
spcopcodes[0x05]=sop05;
602
spcopcodes[0x15]=sop15;
603
spcopcodes[0x16]=sop16;
604
spcopcodes[0x07]=sop07;
605
spcopcodes[0x17]=sop17;
606
spcopcodes[0x09]=sop09;
607
608
spcopcodes[0x48]=sop48;
609
spcopcodes[0x46]=sop46;
610
spcopcodes[0x44]=sop44;
611
spcopcodes[0x54]=sop54;
612
spcopcodes[0x45]=sop45;
613
spcopcodes[0x55]=sop55;
614
spcopcodes[0x56]=sop56;
615
spcopcodes[0x47]=sop47;
616
spcopcodes[0x57]=sop57;
617
spcopcodes[0x49]=sop49;
618
spcopcodes[0x58]=sop58;
619
620
spcopcodes[0x1d]=sop1d;
621
spcopcodes[0x9c]=sop9c;
622
spcopcodes[0xdc]=sopdc;
623
624
spcopcodes[0x3d]=sop3d;
625
spcopcodes[0xbc]=sopbc;
626
spcopcodes[0xfc]=sopfc;
627
628
spcopcodes[0x8f]=sop8f;
629
spcopcodes[0x78]=sop78;
630
spcopcodes[0x2f]=sop2f;
631
632
spcopcodes[0xba]=sopba;
633
spcopcodes[0xda]=sopda;
634
635
spcopcodes[0xc8]=sopc8;
636
spcopcodes[0x3e]=sop3e;
637
spcopcodes[0x1e]=sop1e;
638
639
spcopcodes[0xad]=sopad;
640
spcopcodes[0x7e]=sop7e;
641
spcopcodes[0x5e]=sop5e;
642
643
spcopcodes[0xab]=sopab;
644
spcopcodes[0xbb]=sopbb;
645
spcopcodes[0xac]=sopac;
646
647
spcopcodes[0x8b]=sop8b;
648
spcopcodes[0x9b]=sop9b;
649
spcopcodes[0x8c]=sop8c;
650
651
spcopcodes[0x1f]=sop1f;
652
spcopcodes[0x5f]=sop5f;
653
654
spcopcodes[0x60]=sop60;
655
spcopcodes[0x80]=sop80;
656
spcopcodes[0xed]=soped;
657
spcopcodes[0x20]=sop20;
658
spcopcodes[0x40]=sop40;
659
660
spcopcodes[0x3f]=sop3f;
661
spcopcodes[0x6f]=sop6f;
662
663
spcopcodes[0x2d]=sop2d;
664
spcopcodes[0x4d]=sop4d;
665
spcopcodes[0x6d]=sop6d;
666
667
spcopcodes[0xae]=sopae;
668
spcopcodes[0xce]=sopce;
669
spcopcodes[0xee]=sopee;
670
671
spcopcodes[0xcf]=sopcf;
672
spcopcodes[0x9e]=sop9e;
673
674
spcopcodes[0x2e]=sop2e;
675
spcopcodes[0xde]=sopde;
676
spcopcodes[0x6e]=sop6e;
677
spcopcodes[0xfe]=sopfe;
678
679
spcopcodes[0x1c]=sop1c;
680
681
spcopcodes[0x5c]=sop5c;
682
683
spcopcodes[0x03]=sop03;
684
spcopcodes[0x23]=sop23;
685
spcopcodes[0x43]=sop43;
686
spcopcodes[0x63]=sop63;
687
spcopcodes[0x83]=sop83;
688
spcopcodes[0xa3]=sopa3;
689
spcopcodes[0xc3]=sopc3;
690
spcopcodes[0xe3]=sope3;
691
692
spcopcodes[0x13]=sop13;
693
spcopcodes[0x33]=sop33;
694
spcopcodes[0x53]=sop53;
695
spcopcodes[0x73]=sop73;
696
spcopcodes[0x93]=sop93;
697
spcopcodes[0xb3]=sopb3;
698
spcopcodes[0xd3]=sopd3;
699
spcopcodes[0xf3]=sopf3;
700
701
spcopcodes[0x1a]=sop1a;
702
spcopcodes[0x3a]=sop3a;
703
spcopcodes[0x7a]=sop7a;
704
spcopcodes[0x9a]=sop9a;
705
spcopcodes[0x5a]=sop5a;
706
707
spcopcodes[0x9f]=sop9f;
708
709
spcopcodes[0x4b]=sop4b;
710
spcopcodes[0x5b]=sop5b;
711
spcopcodes[0x4c]=sop4c;
712
713
spcopcodes[0x0b]=sop0b;
714
spcopcodes[0x1b]=sop1b;
715
spcopcodes[0x0c]=sop0c;
716
717
spcopcodes[0x2b]=sop2b;
718
spcopcodes[0x3b]=sop3b;
719
spcopcodes[0x2c]=sop2c;
720
721
spcopcodes[0x6b]=sop6b;
722
spcopcodes[0x7b]=sop7b;
723
spcopcodes[0x6c]=sop6c;
724
725
spcopcodes[0x3c]=sop3c;
726
spcopcodes[0x7c]=sop7c;
727
728
spcopcodes[0x0e]=sop0e;
729
spcopcodes[0x4e]=sop4e;
730
731
spcopcodes[0xfa]=sopfa;
732
733
spcopcodes[0x00]=sop00;
734
spcopcodes[0xc0]=sop00;
735
736
spcopcodes[0x69]=sop69;
737
738
spcopcodes[0x8a]=sop8a;
739
spcopcodes[0xaa]=sopaa;
740
spcopcodes[0xca]=sopca;
741
spcopcodes[0xea]=sopea;
742
743
spcopcodes[0x18]=sop18;
744
745
spcopcodes[0x0d]=sop0d;
746
spcopcodes[0x8e]=sop8e;
747
748
spcopcodes[0x4f]=sop4f;
749
}
750
751