rlm@1
|
1 case 0x00:
|
rlm@1
|
2 // NOP
|
rlm@1
|
3 break;
|
rlm@1
|
4 case 0x01:
|
rlm@1
|
5 // LD BC, NNNN
|
rlm@1
|
6 BC.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
7 BC.B.B1=gbReadMemory(PC.W++);
|
rlm@1
|
8 break;
|
rlm@1
|
9 case 0x02:
|
rlm@1
|
10 // LD (BC),A
|
rlm@1
|
11 gbWriteMemory(BC.W,AF.B.B1);
|
rlm@1
|
12 break;
|
rlm@1
|
13 case 0x03:
|
rlm@1
|
14 // INC BC
|
rlm@1
|
15 BC.W++;
|
rlm@1
|
16 break;
|
rlm@1
|
17 case 0x04:
|
rlm@1
|
18 // INC B
|
rlm@1
|
19 BC.B.B1++;
|
rlm@1
|
20 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B1]| (BC.B.B1&0x0F? 0:H_FLAG);
|
rlm@1
|
21 break;
|
rlm@1
|
22 case 0x05:
|
rlm@1
|
23 // DEC B
|
rlm@1
|
24 BC.B.B1--;
|
rlm@1
|
25 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B1]|
|
rlm@1
|
26 ((BC.B.B1&0x0F)==0x0F? H_FLAG:0);
|
rlm@1
|
27 break;
|
rlm@1
|
28 case 0x06:
|
rlm@1
|
29 // LD B, NN
|
rlm@1
|
30 BC.B.B1=gbReadOpcode(PC.W++);
|
rlm@1
|
31 break;
|
rlm@1
|
32 case 0x07:
|
rlm@1
|
33 // RLCA
|
rlm@1
|
34 tempValue=AF.B.B1&0x80? C_FLAG:0;
|
rlm@1
|
35 AF.B.B1=((AF.B.B1<<1)|(AF.B.B1>>7)) & 0xFF;
|
rlm@1
|
36 AF.B.B0=tempValue;
|
rlm@1
|
37 break;
|
rlm@1
|
38 case 0x08:
|
rlm@1
|
39 // LD (NNNN), SP
|
rlm@1
|
40 tempRegister.B.B0=gbReadOpcode(PC.W++);
|
rlm@1
|
41 tempRegister.B.B1=gbReadOpcode(PC.W++);
|
rlm@1
|
42 gbWriteMemory(tempRegister.W++,SP.B.B0);
|
rlm@1
|
43 gbWriteMemory(tempRegister.W,SP.B.B1);
|
rlm@1
|
44 break;
|
rlm@1
|
45 case 0x09:
|
rlm@1
|
46 // ADD HL,BC
|
rlm@1
|
47 tempRegister.W=(HL.W+BC.W)&0xFFFF;
|
rlm@1
|
48 AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^BC.W^tempRegister.W)&0x1000? H_FLAG:0)|
|
rlm@1
|
49 (((long)HL.W+(long)BC.W)&0x10000? C_FLAG:0);
|
rlm@1
|
50 HL.W=tempRegister.W;
|
rlm@1
|
51 break;
|
rlm@1
|
52 case 0x0a:
|
rlm@1
|
53 // LD A,(BC)
|
rlm@1
|
54 AF.B.B1=gbReadMemory(BC.W);
|
rlm@1
|
55 break;
|
rlm@1
|
56 case 0x0b:
|
rlm@1
|
57 // DEC BC
|
rlm@1
|
58 BC.W--;
|
rlm@1
|
59 break;
|
rlm@1
|
60 case 0x0c:
|
rlm@1
|
61 // INC C
|
rlm@1
|
62 BC.B.B0++;
|
rlm@1
|
63 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B0]| (BC.B.B0&0x0F? 0:H_FLAG);
|
rlm@1
|
64 break;
|
rlm@1
|
65 case 0x0d:
|
rlm@1
|
66 // DEC C
|
rlm@1
|
67 BC.B.B0--;
|
rlm@1
|
68 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B0]|
|
rlm@1
|
69 ((BC.B.B0&0x0F)==0x0F? H_FLAG:0);
|
rlm@1
|
70 break;
|
rlm@1
|
71 case 0x0e:
|
rlm@1
|
72 // LD C, NN
|
rlm@1
|
73 BC.B.B0=gbReadOpcode(PC.W++);
|
rlm@1
|
74 break;
|
rlm@1
|
75 case 0x0f:
|
rlm@1
|
76 // RRCA
|
rlm@1
|
77 tempValue=AF.B.B1&0x01;
|
rlm@1
|
78 AF.B.B1=(AF.B.B1>>1)|(tempValue? 0x80:0);
|
rlm@1
|
79 AF.B.B0=(tempValue<<4);
|
rlm@1
|
80 break;
|
rlm@1
|
81 case 0x10:
|
rlm@1
|
82 // STOP
|
rlm@1
|
83 opcode = gbReadOpcode(PC.W++);
|
rlm@1
|
84 if(gbCgbMode) {
|
rlm@1
|
85 if(gbReadMemoryQuick(0xff4d) & 1) {
|
rlm@1
|
86 gbSpeedSwitch();
|
rlm@1
|
87
|
rlm@1
|
88 if(gbSpeed == 0)
|
rlm@1
|
89 gbWriteMemoryQuick(0xff4d, 0x00);
|
rlm@1
|
90 else
|
rlm@1
|
91 gbWriteMemoryQuick(0xff4d, 0x80);
|
rlm@1
|
92 }
|
rlm@1
|
93 }
|
rlm@1
|
94 break;
|
rlm@1
|
95 case 0x11:
|
rlm@1
|
96 // LD DE, NNNN
|
rlm@1
|
97 DE.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
98 DE.B.B1=gbReadMemory(PC.W++);
|
rlm@1
|
99 break;
|
rlm@1
|
100 case 0x12:
|
rlm@1
|
101 // LD (DE),A
|
rlm@1
|
102 gbWriteMemory(DE.W,AF.B.B1);
|
rlm@1
|
103 break;
|
rlm@1
|
104 case 0x13:
|
rlm@1
|
105 // INC DE
|
rlm@1
|
106 DE.W++;
|
rlm@1
|
107 break;
|
rlm@1
|
108 case 0x14:
|
rlm@1
|
109 // INC D
|
rlm@1
|
110 DE.B.B1++;
|
rlm@1
|
111 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B1]| (DE.B.B1&0x0F? 0:H_FLAG);
|
rlm@1
|
112 break;
|
rlm@1
|
113 case 0x15:
|
rlm@1
|
114 // DEC D
|
rlm@1
|
115 DE.B.B1--;
|
rlm@1
|
116 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B1]|
|
rlm@1
|
117 ((DE.B.B1&0x0F)==0x0F? H_FLAG:0);
|
rlm@1
|
118 break;
|
rlm@1
|
119 case 0x16:
|
rlm@1
|
120 // LD D,NN
|
rlm@1
|
121 DE.B.B1=gbReadOpcode(PC.W++);
|
rlm@1
|
122 break;
|
rlm@1
|
123 case 0x17:
|
rlm@1
|
124 // RLA
|
rlm@1
|
125 tempValue=AF.B.B1&0x80? C_FLAG:0;
|
rlm@1
|
126 AF.B.B1=((AF.B.B1<<1)|((AF.B.B0&C_FLAG)>>4)) & 0xFF;
|
rlm@1
|
127 AF.B.B0=tempValue;
|
rlm@1
|
128 break;
|
rlm@1
|
129 case 0x18:
|
rlm@1
|
130 // JR NN
|
rlm@1
|
131 PC.W+=(s8)gbReadMemory(PC.W)+1;
|
rlm@1
|
132 break;
|
rlm@1
|
133 case 0x19:
|
rlm@1
|
134 // ADD HL,DE
|
rlm@1
|
135 tempRegister.W=(HL.W+DE.W)&0xFFFF;
|
rlm@1
|
136 AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^DE.W^tempRegister.W)&0x1000? H_FLAG:0)|
|
rlm@1
|
137 (((long)HL.W+(long)DE.W)&0x10000? C_FLAG:0);
|
rlm@1
|
138 HL.W=tempRegister.W;
|
rlm@1
|
139 break;
|
rlm@1
|
140 case 0x1a:
|
rlm@1
|
141 // LD A,(DE)
|
rlm@1
|
142 AF.B.B1=gbReadMemory(DE.W);
|
rlm@1
|
143 break;
|
rlm@1
|
144 case 0x1b:
|
rlm@1
|
145 // DEC DE
|
rlm@1
|
146 DE.W--;
|
rlm@1
|
147 break;
|
rlm@1
|
148 case 0x1c:
|
rlm@1
|
149 // INC E
|
rlm@1
|
150 DE.B.B0++;
|
rlm@1
|
151 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B0]| (DE.B.B0&0x0F? 0:H_FLAG);
|
rlm@1
|
152 break;
|
rlm@1
|
153 case 0x1d:
|
rlm@1
|
154 // DEC E
|
rlm@1
|
155 DE.B.B0--;
|
rlm@1
|
156 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B0]|
|
rlm@1
|
157 ((DE.B.B0&0x0F)==0x0F? H_FLAG:0);
|
rlm@1
|
158 break;
|
rlm@1
|
159 case 0x1e:
|
rlm@1
|
160 // LD E,NN
|
rlm@1
|
161 DE.B.B0=gbReadOpcode(PC.W++);
|
rlm@1
|
162 break;
|
rlm@1
|
163 case 0x1f:
|
rlm@1
|
164 // RRA
|
rlm@1
|
165 tempValue=AF.B.B1&0x01;
|
rlm@1
|
166 AF.B.B1=(AF.B.B1>>1)|(AF.B.B0&C_FLAG? 0x80:0);
|
rlm@1
|
167 AF.B.B0=(tempValue<<4);
|
rlm@1
|
168 break;
|
rlm@1
|
169 case 0x20:
|
rlm@1
|
170 // JR NZ,NN
|
rlm@1
|
171 if(AF.B.B0&Z_FLAG)
|
rlm@1
|
172 PC.W++;
|
rlm@1
|
173 else {
|
rlm@1
|
174 PC.W+=(s8)gbReadMemory(PC.W)+1;
|
rlm@1
|
175 clockTicks++;
|
rlm@1
|
176 }
|
rlm@1
|
177 break;
|
rlm@1
|
178 case 0x21:
|
rlm@1
|
179 // LD HL,NNNN
|
rlm@1
|
180 HL.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
181 HL.B.B1=gbReadMemory(PC.W++);
|
rlm@1
|
182 break;
|
rlm@1
|
183 case 0x22:
|
rlm@1
|
184 // LDI (HL),A
|
rlm@1
|
185 gbWriteMemory(HL.W++,AF.B.B1);
|
rlm@1
|
186 break;
|
rlm@1
|
187 case 0x23:
|
rlm@1
|
188 // INC HL
|
rlm@1
|
189 HL.W++;
|
rlm@1
|
190 break;
|
rlm@1
|
191 case 0x24:
|
rlm@1
|
192 // INC H
|
rlm@1
|
193 HL.B.B1++;
|
rlm@1
|
194 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B1]| (HL.B.B1&0x0F? 0:H_FLAG);
|
rlm@1
|
195 break;
|
rlm@1
|
196 case 0x25:
|
rlm@1
|
197 // DEC H
|
rlm@1
|
198 HL.B.B1--;
|
rlm@1
|
199 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B1]|
|
rlm@1
|
200 ((HL.B.B1&0x0F)==0x0F? H_FLAG:0);
|
rlm@1
|
201 break;
|
rlm@1
|
202 case 0x26:
|
rlm@1
|
203 // LD H,NN
|
rlm@1
|
204 HL.B.B1=gbReadOpcode(PC.W++);
|
rlm@1
|
205 break;
|
rlm@1
|
206 case 0x27:
|
rlm@1
|
207 // DAA
|
rlm@1
|
208 tempRegister.W=AF.B.B1;
|
rlm@1
|
209 if(AF.B.B0&C_FLAG) tempRegister.W|=256;
|
rlm@1
|
210 if(AF.B.B0&H_FLAG) tempRegister.W|=512;
|
rlm@1
|
211 if(AF.B.B0&N_FLAG) tempRegister.W|=1024;
|
rlm@1
|
212 AF.W=DAATable[tempRegister.W];
|
rlm@1
|
213 break;
|
rlm@1
|
214 case 0x28:
|
rlm@1
|
215 // JR Z,NN
|
rlm@1
|
216 if(AF.B.B0&Z_FLAG) {
|
rlm@1
|
217 PC.W+=(s8)gbReadMemory(PC.W)+1;
|
rlm@1
|
218 clockTicks++;
|
rlm@1
|
219 } else
|
rlm@1
|
220 PC.W++;
|
rlm@1
|
221 break;
|
rlm@1
|
222 case 0x29:
|
rlm@1
|
223 // ADD HL,HL
|
rlm@1
|
224 tempRegister.W=(HL.W+HL.W)&0xFFFF; AF.B.B0= (AF.B.B0 & Z_FLAG)|
|
rlm@1
|
225 ((HL.W^HL.W^tempRegister.W)&0x1000? H_FLAG:0)|
|
rlm@1
|
226 (((long)HL.W+(long)HL.W)&0x10000? C_FLAG:0);
|
rlm@1
|
227 HL.W=tempRegister.W;
|
rlm@1
|
228 break;
|
rlm@1
|
229 case 0x2a:
|
rlm@1
|
230 // LDI A,(HL)
|
rlm@1
|
231 AF.B.B1 = gbReadMemory(HL.W++);
|
rlm@1
|
232 break;
|
rlm@1
|
233 case 0x2b:
|
rlm@1
|
234 // DEC HL
|
rlm@1
|
235 HL.W--;
|
rlm@1
|
236 break;
|
rlm@1
|
237 case 0x2c:
|
rlm@1
|
238 // INC L
|
rlm@1
|
239 HL.B.B0++;
|
rlm@1
|
240 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B0]| (HL.B.B0&0x0F? 0:H_FLAG);
|
rlm@1
|
241 break;
|
rlm@1
|
242 case 0x2d:
|
rlm@1
|
243 // DEC L
|
rlm@1
|
244 HL.B.B0--;
|
rlm@1
|
245 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B0]|
|
rlm@1
|
246 ((HL.B.B0&0x0F)==0x0F? H_FLAG:0);
|
rlm@1
|
247 break;
|
rlm@1
|
248 case 0x2e:
|
rlm@1
|
249 // LD L,NN
|
rlm@1
|
250 HL.B.B0=gbReadOpcode(PC.W++);
|
rlm@1
|
251 break;
|
rlm@1
|
252 case 0x2f:
|
rlm@1
|
253 // CPL
|
rlm@1
|
254 AF.B.B1 ^= 255;
|
rlm@1
|
255 AF.B.B0|=N_FLAG|H_FLAG;
|
rlm@1
|
256 break;
|
rlm@1
|
257 case 0x30:
|
rlm@1
|
258 // JR NC,NN
|
rlm@1
|
259 if(AF.B.B0&C_FLAG)
|
rlm@1
|
260 PC.W++;
|
rlm@1
|
261 else {
|
rlm@1
|
262 PC.W+=(s8)gbReadMemory(PC.W)+1;
|
rlm@1
|
263 clockTicks++;
|
rlm@1
|
264 }
|
rlm@1
|
265 break;
|
rlm@1
|
266 case 0x31:
|
rlm@1
|
267 // LD SP,NNNN
|
rlm@1
|
268 SP.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
269 SP.B.B1=gbReadMemory(PC.W++);
|
rlm@1
|
270 break;
|
rlm@1
|
271 case 0x32:
|
rlm@1
|
272 // LDD (HL),A
|
rlm@1
|
273 gbWriteMemory(HL.W--,AF.B.B1);
|
rlm@1
|
274 break;
|
rlm@1
|
275 case 0x33:
|
rlm@1
|
276 // INC SP
|
rlm@1
|
277 SP.W++;
|
rlm@1
|
278 break;
|
rlm@1
|
279 case 0x34:
|
rlm@1
|
280 // INC (HL)
|
rlm@1
|
281 tempValue=(gbReadMemory(HL.W)+1) & 0xFF;
|
rlm@1
|
282 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[tempValue]| (tempValue&0x0F? 0:H_FLAG);
|
rlm@1
|
283 gbWriteMemory(HL.W,tempValue);
|
rlm@1
|
284 break;
|
rlm@1
|
285 case 0x35:
|
rlm@1
|
286 // DEC (HL)
|
rlm@1
|
287 tempValue=(gbReadMemory(HL.W)-1) & 0xFF;
|
rlm@1
|
288 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[tempValue]|
|
rlm@1
|
289 ((tempValue&0x0F)==0x0F? H_FLAG:0);gbWriteMemory(HL.W,tempValue);
|
rlm@1
|
290 break;
|
rlm@1
|
291 case 0x36:
|
rlm@1
|
292 // LD (HL),NN
|
rlm@1
|
293 gbWriteMemory(HL.W,gbReadOpcode(PC.W++));
|
rlm@1
|
294 break;
|
rlm@1
|
295 case 0x37:
|
rlm@1
|
296 // SCF
|
rlm@1
|
297 AF.B.B0 = AF.B.B0 & Z_FLAG | C_FLAG;
|
rlm@1
|
298 break;
|
rlm@1
|
299 case 0x38:
|
rlm@1
|
300 // JR C,NN
|
rlm@1
|
301 if(AF.B.B0&C_FLAG) {
|
rlm@1
|
302 PC.W+=(s8)gbReadMemory(PC.W)+1;
|
rlm@1
|
303 clockTicks ++;
|
rlm@1
|
304 } else
|
rlm@1
|
305 PC.W++;
|
rlm@1
|
306 break;
|
rlm@1
|
307 case 0x39:
|
rlm@1
|
308 // ADD HL,SP
|
rlm@1
|
309 tempRegister.W=(HL.W+SP.W)&0xFFFF;
|
rlm@1
|
310 AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^SP.W^tempRegister.W)&0x1000? H_FLAG:0)|
|
rlm@1
|
311 (((long)HL.W+(long)SP.W)&0x10000? C_FLAG:0);
|
rlm@1
|
312 HL.W=tempRegister.W;
|
rlm@1
|
313 break;
|
rlm@1
|
314 case 0x3a:
|
rlm@1
|
315 // LDD A,(HL)
|
rlm@1
|
316 AF.B.B1 = gbReadMemory(HL.W--);
|
rlm@1
|
317 break;
|
rlm@1
|
318 case 0x3b:
|
rlm@1
|
319 // DEC SP
|
rlm@1
|
320 SP.W--;
|
rlm@1
|
321 break;
|
rlm@1
|
322 case 0x3c:
|
rlm@1
|
323 // INC A
|
rlm@1
|
324 AF.B.B1++;
|
rlm@1
|
325 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[AF.B.B1]| (AF.B.B1&0x0F? 0:H_FLAG);
|
rlm@1
|
326 break;
|
rlm@1
|
327 case 0x3d:
|
rlm@1
|
328 // DEC A
|
rlm@1
|
329 AF.B.B1--;
|
rlm@1
|
330 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[AF.B.B1]|
|
rlm@1
|
331 ((AF.B.B1&0x0F)==0x0F? H_FLAG:0);
|
rlm@1
|
332 break;
|
rlm@1
|
333 case 0x3e:
|
rlm@1
|
334 // LD A,NN
|
rlm@1
|
335 AF.B.B1=gbReadOpcode(PC.W++);
|
rlm@1
|
336 break;
|
rlm@1
|
337 case 0x3f:
|
rlm@1
|
338 // CCF
|
rlm@1
|
339 AF.B.B0^=C_FLAG;AF.B.B0&=~(N_FLAG|H_FLAG);
|
rlm@1
|
340 break;
|
rlm@1
|
341 case 0x40:
|
rlm@1
|
342 // LD B,B
|
rlm@1
|
343 BC.B.B1=BC.B.B1;
|
rlm@1
|
344 break;
|
rlm@1
|
345 case 0x41:
|
rlm@1
|
346 // LD B,C
|
rlm@1
|
347 BC.B.B1=BC.B.B0;
|
rlm@1
|
348 break;
|
rlm@1
|
349 case 0x42:
|
rlm@1
|
350 // LD B,D
|
rlm@1
|
351 BC.B.B1=DE.B.B1;
|
rlm@1
|
352 break;
|
rlm@1
|
353 case 0x43:
|
rlm@1
|
354 // LD B,E
|
rlm@1
|
355 BC.B.B1=DE.B.B0;
|
rlm@1
|
356 break;
|
rlm@1
|
357 case 0x44:
|
rlm@1
|
358 // LD B,H
|
rlm@1
|
359 BC.B.B1=HL.B.B1;
|
rlm@1
|
360 break;
|
rlm@1
|
361 case 0x45:
|
rlm@1
|
362 // LD B,L
|
rlm@1
|
363 BC.B.B1=HL.B.B0;
|
rlm@1
|
364 break;
|
rlm@1
|
365 case 0x46:
|
rlm@1
|
366 // LD B,(HL)
|
rlm@1
|
367 BC.B.B1=gbReadMemory(HL.W);
|
rlm@1
|
368 break;
|
rlm@1
|
369 case 0x47:
|
rlm@1
|
370 // LD B,A
|
rlm@1
|
371 BC.B.B1=AF.B.B1;
|
rlm@1
|
372 break;
|
rlm@1
|
373 case 0x48:
|
rlm@1
|
374 // LD C,B
|
rlm@1
|
375 BC.B.B0=BC.B.B1;
|
rlm@1
|
376 break;
|
rlm@1
|
377 case 0x49:
|
rlm@1
|
378 // LD C,C
|
rlm@1
|
379 BC.B.B0=BC.B.B0;
|
rlm@1
|
380 break;
|
rlm@1
|
381 case 0x4a:
|
rlm@1
|
382 // LD C,D
|
rlm@1
|
383 BC.B.B0=DE.B.B1;
|
rlm@1
|
384 break;
|
rlm@1
|
385 case 0x4b:
|
rlm@1
|
386 // LD C,E
|
rlm@1
|
387 BC.B.B0=DE.B.B0;
|
rlm@1
|
388 break;
|
rlm@1
|
389 case 0x4c:
|
rlm@1
|
390 // LD C,H
|
rlm@1
|
391 BC.B.B0=HL.B.B1;
|
rlm@1
|
392 break;
|
rlm@1
|
393 case 0x4d:
|
rlm@1
|
394 // LD C,L
|
rlm@1
|
395 BC.B.B0=HL.B.B0;
|
rlm@1
|
396 break;
|
rlm@1
|
397 case 0x4e:
|
rlm@1
|
398 // LD C,(HL)
|
rlm@1
|
399 BC.B.B0=gbReadMemory(HL.W);
|
rlm@1
|
400 break;
|
rlm@1
|
401 case 0x4f:
|
rlm@1
|
402 // LD C,A
|
rlm@1
|
403 BC.B.B0=AF.B.B1;
|
rlm@1
|
404 break;
|
rlm@1
|
405 case 0x50:
|
rlm@1
|
406 // LD D,B
|
rlm@1
|
407 DE.B.B1=BC.B.B1;
|
rlm@1
|
408 break;
|
rlm@1
|
409 case 0x51:
|
rlm@1
|
410 // LD D,C
|
rlm@1
|
411 DE.B.B1=BC.B.B0;
|
rlm@1
|
412 break;
|
rlm@1
|
413 case 0x52:
|
rlm@1
|
414 // LD D,D
|
rlm@1
|
415 DE.B.B1=DE.B.B1;
|
rlm@1
|
416 break;
|
rlm@1
|
417 case 0x53:
|
rlm@1
|
418 // LD D,E
|
rlm@1
|
419 DE.B.B1=DE.B.B0;
|
rlm@1
|
420 break;
|
rlm@1
|
421 case 0x54:
|
rlm@1
|
422 // LD D,H
|
rlm@1
|
423 DE.B.B1=HL.B.B1;
|
rlm@1
|
424 break;
|
rlm@1
|
425 case 0x55:
|
rlm@1
|
426 // LD D,L
|
rlm@1
|
427 DE.B.B1=HL.B.B0;
|
rlm@1
|
428 break;
|
rlm@1
|
429 case 0x56:
|
rlm@1
|
430 // LD D,(HL)
|
rlm@1
|
431 DE.B.B1=gbReadMemory(HL.W);
|
rlm@1
|
432 break;
|
rlm@1
|
433 case 0x57:
|
rlm@1
|
434 // LD D,A
|
rlm@1
|
435 DE.B.B1=AF.B.B1;
|
rlm@1
|
436 break;
|
rlm@1
|
437 case 0x58:
|
rlm@1
|
438 // LD E,B
|
rlm@1
|
439 DE.B.B0=BC.B.B1;
|
rlm@1
|
440 break;
|
rlm@1
|
441 case 0x59:
|
rlm@1
|
442 // LD E,C
|
rlm@1
|
443 DE.B.B0=BC.B.B0;
|
rlm@1
|
444 break;
|
rlm@1
|
445 case 0x5a:
|
rlm@1
|
446 // LD E,D
|
rlm@1
|
447 DE.B.B0=DE.B.B1;
|
rlm@1
|
448 break;
|
rlm@1
|
449 case 0x5b:
|
rlm@1
|
450 // LD E,E
|
rlm@1
|
451 DE.B.B0=DE.B.B0;
|
rlm@1
|
452 break;
|
rlm@1
|
453 case 0x5c:
|
rlm@1
|
454 // LD E,H
|
rlm@1
|
455 DE.B.B0=HL.B.B1;
|
rlm@1
|
456 break;
|
rlm@1
|
457 case 0x5d:
|
rlm@1
|
458 // LD E,L
|
rlm@1
|
459 DE.B.B0=HL.B.B0;
|
rlm@1
|
460 break;
|
rlm@1
|
461 case 0x5e:
|
rlm@1
|
462 // LD E,(HL)
|
rlm@1
|
463 DE.B.B0=gbReadMemory(HL.W);
|
rlm@1
|
464 break;
|
rlm@1
|
465 case 0x5f:
|
rlm@1
|
466 // LD E,A
|
rlm@1
|
467 DE.B.B0=AF.B.B1;
|
rlm@1
|
468 break;
|
rlm@1
|
469 case 0x60:
|
rlm@1
|
470 // LD H,B
|
rlm@1
|
471 HL.B.B1=BC.B.B1;
|
rlm@1
|
472 break;
|
rlm@1
|
473 case 0x61:
|
rlm@1
|
474 // LD H,C
|
rlm@1
|
475 HL.B.B1=BC.B.B0;
|
rlm@1
|
476 break;
|
rlm@1
|
477 case 0x62:
|
rlm@1
|
478 // LD H,D
|
rlm@1
|
479 HL.B.B1=DE.B.B1;
|
rlm@1
|
480 break;
|
rlm@1
|
481 case 0x63:
|
rlm@1
|
482 // LD H,E
|
rlm@1
|
483 HL.B.B1=DE.B.B0;
|
rlm@1
|
484 break;
|
rlm@1
|
485 case 0x64:
|
rlm@1
|
486 // LD H,H
|
rlm@1
|
487 HL.B.B1=HL.B.B1;
|
rlm@1
|
488 break;
|
rlm@1
|
489 case 0x65:
|
rlm@1
|
490 // LD H,L
|
rlm@1
|
491 HL.B.B1=HL.B.B0;
|
rlm@1
|
492 break;
|
rlm@1
|
493 case 0x66:
|
rlm@1
|
494 // LD H,(HL)
|
rlm@1
|
495 HL.B.B1=gbReadMemory(HL.W);
|
rlm@1
|
496 break;
|
rlm@1
|
497 case 0x67:
|
rlm@1
|
498 // LD H,A
|
rlm@1
|
499 HL.B.B1=AF.B.B1;
|
rlm@1
|
500 break;
|
rlm@1
|
501 case 0x68:
|
rlm@1
|
502 // LD L,B
|
rlm@1
|
503 HL.B.B0=BC.B.B1;
|
rlm@1
|
504 break;
|
rlm@1
|
505 case 0x69:
|
rlm@1
|
506 // LD L,C
|
rlm@1
|
507 HL.B.B0=BC.B.B0;
|
rlm@1
|
508 break;
|
rlm@1
|
509 case 0x6a:
|
rlm@1
|
510 // LD L,D
|
rlm@1
|
511 HL.B.B0=DE.B.B1;
|
rlm@1
|
512 break;
|
rlm@1
|
513 case 0x6b:
|
rlm@1
|
514 // LD L,E
|
rlm@1
|
515 HL.B.B0=DE.B.B0;
|
rlm@1
|
516 break;
|
rlm@1
|
517 case 0x6c:
|
rlm@1
|
518 // LD L,H
|
rlm@1
|
519 HL.B.B0=HL.B.B1;
|
rlm@1
|
520 break;
|
rlm@1
|
521 case 0x6d:
|
rlm@1
|
522 // LD L,L
|
rlm@1
|
523 HL.B.B0=HL.B.B0;
|
rlm@1
|
524 break;
|
rlm@1
|
525 case 0x6e:
|
rlm@1
|
526 // LD L,(HL)
|
rlm@1
|
527 HL.B.B0=gbReadMemory(HL.W);
|
rlm@1
|
528 break;
|
rlm@1
|
529 case 0x6f:
|
rlm@1
|
530 // LD L,A
|
rlm@1
|
531 HL.B.B0=AF.B.B1;
|
rlm@1
|
532 break;
|
rlm@1
|
533 case 0x70:
|
rlm@1
|
534 // LD (HL),B
|
rlm@1
|
535 gbWriteMemory(HL.W,BC.B.B1);
|
rlm@1
|
536 break;
|
rlm@1
|
537 case 0x71:
|
rlm@1
|
538 // LD (HL),C
|
rlm@1
|
539 gbWriteMemory(HL.W,BC.B.B0);
|
rlm@1
|
540 break;
|
rlm@1
|
541 case 0x72:
|
rlm@1
|
542 // LD (HL),D
|
rlm@1
|
543 gbWriteMemory(HL.W,DE.B.B1);
|
rlm@1
|
544 break;
|
rlm@1
|
545 case 0x73:
|
rlm@1
|
546 // LD (HL),E
|
rlm@1
|
547 gbWriteMemory(HL.W,DE.B.B0);
|
rlm@1
|
548 break;
|
rlm@1
|
549 case 0x74:
|
rlm@1
|
550 // LD (HL),H
|
rlm@1
|
551 gbWriteMemory(HL.W,HL.B.B1);
|
rlm@1
|
552 break;
|
rlm@1
|
553 case 0x75:
|
rlm@1
|
554 // LD (HL),L
|
rlm@1
|
555 gbWriteMemory(HL.W,HL.B.B0);
|
rlm@1
|
556 break;
|
rlm@1
|
557 case 0x76:
|
rlm@1
|
558 // HALT
|
rlm@1
|
559 if(IFF & 1) {
|
rlm@1
|
560 PC.W--;
|
rlm@1
|
561 IFF |= 0x80;
|
rlm@1
|
562 } else {
|
rlm@1
|
563 if((register_IE & register_IF) > 0)
|
rlm@1
|
564 IFF |= 0x100;
|
rlm@1
|
565 else {
|
rlm@1
|
566 PC.W--;
|
rlm@1
|
567 IFF |= 0x81;
|
rlm@1
|
568 }
|
rlm@1
|
569 }
|
rlm@1
|
570 break;
|
rlm@1
|
571 case 0x77:
|
rlm@1
|
572 // LD (HL),A
|
rlm@1
|
573 gbWriteMemory(HL.W,AF.B.B1);
|
rlm@1
|
574 break;
|
rlm@1
|
575 case 0x78:
|
rlm@1
|
576 // LD A,B
|
rlm@1
|
577 AF.B.B1=BC.B.B1;
|
rlm@1
|
578 break;
|
rlm@1
|
579 case 0x79:
|
rlm@1
|
580 // LD A,C
|
rlm@1
|
581 AF.B.B1=BC.B.B0;
|
rlm@1
|
582 break;
|
rlm@1
|
583 case 0x7a:
|
rlm@1
|
584 // LD A,D
|
rlm@1
|
585 AF.B.B1=DE.B.B1;
|
rlm@1
|
586 break;
|
rlm@1
|
587 case 0x7b:
|
rlm@1
|
588 // LD A,E
|
rlm@1
|
589 AF.B.B1=DE.B.B0;
|
rlm@1
|
590 break;
|
rlm@1
|
591 case 0x7c:
|
rlm@1
|
592 // LD A,H
|
rlm@1
|
593 AF.B.B1=HL.B.B1;
|
rlm@1
|
594 break;
|
rlm@1
|
595 case 0x7d:
|
rlm@1
|
596 // LD A,L
|
rlm@1
|
597 AF.B.B1=HL.B.B0;
|
rlm@1
|
598 break;
|
rlm@1
|
599 case 0x7e:
|
rlm@1
|
600 // LD A,(HL)
|
rlm@1
|
601 AF.B.B1=gbReadMemory(HL.W);
|
rlm@1
|
602 break;
|
rlm@1
|
603 case 0x7f:
|
rlm@1
|
604 // LD A,A
|
rlm@1
|
605 AF.B.B1=AF.B.B1;
|
rlm@1
|
606 break;
|
rlm@1
|
607 case 0x80:
|
rlm@1
|
608 // ADD B
|
rlm@1
|
609 tempRegister.W=AF.B.B1+BC.B.B1;
|
rlm@1
|
610 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
611 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0);
|
rlm@1
|
612 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
613 break;
|
rlm@1
|
614 case 0x81:
|
rlm@1
|
615 // ADD C
|
rlm@1
|
616 tempRegister.W=AF.B.B1+BC.B.B0;
|
rlm@1
|
617 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
618 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0);
|
rlm@1
|
619 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
620 break;
|
rlm@1
|
621 case 0x82:
|
rlm@1
|
622 // ADD D
|
rlm@1
|
623 tempRegister.W=AF.B.B1+DE.B.B1;
|
rlm@1
|
624 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
625 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0);
|
rlm@1
|
626 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
627 break;
|
rlm@1
|
628 case 0x83:
|
rlm@1
|
629 // ADD E
|
rlm@1
|
630 tempRegister.W=AF.B.B1+DE.B.B0;
|
rlm@1
|
631 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
632 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0);
|
rlm@1
|
633 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
634 break;
|
rlm@1
|
635 case 0x84:
|
rlm@1
|
636 // ADD H
|
rlm@1
|
637 tempRegister.W=AF.B.B1+HL.B.B1;
|
rlm@1
|
638 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
639 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0);
|
rlm@1
|
640 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
641 break;
|
rlm@1
|
642 case 0x85:
|
rlm@1
|
643 // ADD L
|
rlm@1
|
644 tempRegister.W=AF.B.B1+HL.B.B0;
|
rlm@1
|
645 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
646 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0);
|
rlm@1
|
647 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
648 break;
|
rlm@1
|
649 case 0x86:
|
rlm@1
|
650 // ADD (HL)
|
rlm@1
|
651 tempValue=gbReadMemory(HL.W);
|
rlm@1
|
652 tempRegister.W=AF.B.B1+tempValue;
|
rlm@1
|
653 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
654 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10 ? H_FLAG:0);
|
rlm@1
|
655 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
656 break;
|
rlm@1
|
657 case 0x87:
|
rlm@1
|
658 // ADD A
|
rlm@1
|
659 tempRegister.W=AF.B.B1+AF.B.B1;
|
rlm@1
|
660 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
661 ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0);
|
rlm@1
|
662 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
663 break;
|
rlm@1
|
664 case 0x88:
|
rlm@1
|
665 // ADC B:
|
rlm@1
|
666 tempRegister.W=AF.B.B1+BC.B.B1+(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
667 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
668 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
669 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
670 break;
|
rlm@1
|
671 case 0x89:
|
rlm@1
|
672 // ADC C
|
rlm@1
|
673 tempRegister.W=AF.B.B1+BC.B.B0+(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
674 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
675 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
676 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
677 break;
|
rlm@1
|
678 case 0x8a:
|
rlm@1
|
679 // ADC D
|
rlm@1
|
680 tempRegister.W=AF.B.B1+DE.B.B1+(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
681 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
682 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
683 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
684 break;
|
rlm@1
|
685 case 0x8b:
|
rlm@1
|
686 // ADC E
|
rlm@1
|
687 tempRegister.W=AF.B.B1+DE.B.B0+(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
688 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
689 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
690 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
691 break;
|
rlm@1
|
692 case 0x8c:
|
rlm@1
|
693 // ADC H
|
rlm@1
|
694 tempRegister.W=AF.B.B1+HL.B.B1+(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
695 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
696 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
697 break;
|
rlm@1
|
698 case 0x8d:
|
rlm@1
|
699 // ADC L
|
rlm@1
|
700 tempRegister.W=AF.B.B1+HL.B.B0+(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
701 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
702 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
703 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
704 break;
|
rlm@1
|
705 case 0x8e:
|
rlm@1
|
706 // ADC (HL)
|
rlm@1
|
707 tempValue=gbReadMemory(HL.W);
|
rlm@1
|
708 tempRegister.W=AF.B.B1+tempValue+(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
709 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
710 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
711 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
712 break;
|
rlm@1
|
713 case 0x8f:
|
rlm@1
|
714 // ADC A
|
rlm@1
|
715 tempRegister.W=AF.B.B1+AF.B.B1+(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
716 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
717 ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
718 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
719 break;
|
rlm@1
|
720 case 0x90:
|
rlm@1
|
721 // SUB B
|
rlm@1
|
722 tempRegister.W=AF.B.B1-BC.B.B1;
|
rlm@1
|
723 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
724 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
725 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
726 break;
|
rlm@1
|
727 case 0x91:
|
rlm@1
|
728 // SUB C
|
rlm@1
|
729 tempRegister.W=AF.B.B1-BC.B.B0;
|
rlm@1
|
730 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
731 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
732 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
733 break;
|
rlm@1
|
734 case 0x92:
|
rlm@1
|
735 // SUB D
|
rlm@1
|
736 tempRegister.W=AF.B.B1-DE.B.B1;
|
rlm@1
|
737 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
738 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
739 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
740 break;
|
rlm@1
|
741 case 0x93:
|
rlm@1
|
742 // SUB E
|
rlm@1
|
743 tempRegister.W=AF.B.B1-DE.B.B0;
|
rlm@1
|
744 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
745 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
746 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
747 break;
|
rlm@1
|
748 case 0x94:
|
rlm@1
|
749 // SUB H
|
rlm@1
|
750 tempRegister.W=AF.B.B1-HL.B.B1;
|
rlm@1
|
751 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
752 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
753 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
754 break;
|
rlm@1
|
755 case 0x95:
|
rlm@1
|
756 // SUB L
|
rlm@1
|
757 tempRegister.W=AF.B.B1-HL.B.B0;
|
rlm@1
|
758 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
759 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
760 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
761 break;
|
rlm@1
|
762 case 0x96:
|
rlm@1
|
763 // SUB (HL)
|
rlm@1
|
764 tempValue=gbReadMemory(HL.W);
|
rlm@1
|
765 tempRegister.W=AF.B.B1-tempValue;
|
rlm@1
|
766 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
767 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
768 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
769 break;
|
rlm@1
|
770 case 0x97:
|
rlm@1
|
771 // SUB A
|
rlm@1
|
772 AF.B.B1=0;
|
rlm@1
|
773 AF.B.B0=N_FLAG|Z_FLAG;
|
rlm@1
|
774 break;
|
rlm@1
|
775 case 0x98:
|
rlm@1
|
776 // SBC B
|
rlm@1
|
777 tempRegister.W=AF.B.B1-BC.B.B1-(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
778 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
779 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
780 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
781 break;
|
rlm@1
|
782 case 0x99:
|
rlm@1
|
783 // SBC C
|
rlm@1
|
784 tempRegister.W=AF.B.B1-BC.B.B0-(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
785 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
786 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
787 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
788 break;
|
rlm@1
|
789 case 0x9a:
|
rlm@1
|
790 // SBC D
|
rlm@1
|
791 tempRegister.W=AF.B.B1-DE.B.B1-(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
792 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
793 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
794 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
795 break;
|
rlm@1
|
796 case 0x9b:
|
rlm@1
|
797 // SBC E
|
rlm@1
|
798 tempRegister.W=AF.B.B1-DE.B.B0-(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
799 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
800 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
801 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
802 break;
|
rlm@1
|
803 case 0x9c:
|
rlm@1
|
804 // SBC H
|
rlm@1
|
805 tempRegister.W=AF.B.B1-HL.B.B1-(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
806 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
807 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
808 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
809 break;
|
rlm@1
|
810 case 0x9d:
|
rlm@1
|
811 // SBC L
|
rlm@1
|
812 tempRegister.W=AF.B.B1-HL.B.B0-(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
813 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
814 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
815 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
816 break;
|
rlm@1
|
817 case 0x9e:
|
rlm@1
|
818 // SBC (HL)
|
rlm@1
|
819 tempValue=gbReadMemory(HL.W);
|
rlm@1
|
820 tempRegister.W=AF.B.B1-tempValue-(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
821 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
822 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
823 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
824 break;
|
rlm@1
|
825 case 0x9f:
|
rlm@1
|
826 // SBC A
|
rlm@1
|
827 tempRegister.W=AF.B.B1-AF.B.B1-(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
828 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
829 ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
830 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
831 break;
|
rlm@1
|
832 case 0xa0:
|
rlm@1
|
833 // AND B
|
rlm@1
|
834 AF.B.B1&=BC.B.B1;
|
rlm@1
|
835 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
|
rlm@1
|
836 break;
|
rlm@1
|
837 case 0xa1:
|
rlm@1
|
838 // AND C
|
rlm@1
|
839 AF.B.B1&=BC.B.B0;
|
rlm@1
|
840 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
|
rlm@1
|
841 break;
|
rlm@1
|
842 case 0xa2:
|
rlm@1
|
843 // AND_D
|
rlm@1
|
844 AF.B.B1&=DE.B.B1;
|
rlm@1
|
845 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
|
rlm@1
|
846 break;
|
rlm@1
|
847 case 0xa3:
|
rlm@1
|
848 // AND E
|
rlm@1
|
849 AF.B.B1&=DE.B.B0;
|
rlm@1
|
850 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
|
rlm@1
|
851 break;
|
rlm@1
|
852 case 0xa4:
|
rlm@1
|
853 // AND H
|
rlm@1
|
854 AF.B.B1&=HL.B.B1;
|
rlm@1
|
855 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
|
rlm@1
|
856 break;
|
rlm@1
|
857 case 0xa5:
|
rlm@1
|
858 // AND L
|
rlm@1
|
859 AF.B.B1&=HL.B.B0;
|
rlm@1
|
860 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
|
rlm@1
|
861 break;
|
rlm@1
|
862 case 0xa6:
|
rlm@1
|
863 // AND (HL)
|
rlm@1
|
864 tempValue=gbReadMemory(HL.W);
|
rlm@1
|
865 AF.B.B1&=tempValue;
|
rlm@1
|
866 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
|
rlm@1
|
867 break;
|
rlm@1
|
868 case 0xa7:
|
rlm@1
|
869 // AND A
|
rlm@1
|
870 AF.B.B1&=AF.B.B1;
|
rlm@1
|
871 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
|
rlm@1
|
872 break;
|
rlm@1
|
873 case 0xa8:
|
rlm@1
|
874 // XOR B
|
rlm@1
|
875 AF.B.B1^=BC.B.B1;
|
rlm@1
|
876 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
877 break;
|
rlm@1
|
878 case 0xa9:
|
rlm@1
|
879 // XOR C
|
rlm@1
|
880 AF.B.B1^=BC.B.B0;
|
rlm@1
|
881 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
882 break;
|
rlm@1
|
883 case 0xaa:
|
rlm@1
|
884 // XOR D
|
rlm@1
|
885 AF.B.B1^=DE.B.B1;
|
rlm@1
|
886 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
887 break;
|
rlm@1
|
888 case 0xab:
|
rlm@1
|
889 // XOR E
|
rlm@1
|
890 AF.B.B1^=DE.B.B0;
|
rlm@1
|
891 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
892 break;
|
rlm@1
|
893 case 0xac:
|
rlm@1
|
894 // XOR H
|
rlm@1
|
895 AF.B.B1^=HL.B.B1;
|
rlm@1
|
896 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
897 break;
|
rlm@1
|
898 case 0xad:
|
rlm@1
|
899 // XOR L
|
rlm@1
|
900 AF.B.B1^=HL.B.B0;
|
rlm@1
|
901 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
902 break;
|
rlm@1
|
903 case 0xae:
|
rlm@1
|
904 // XOR (HL)
|
rlm@1
|
905 tempValue=gbReadMemory(HL.W);
|
rlm@1
|
906 AF.B.B1^=tempValue;
|
rlm@1
|
907 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
908 break;
|
rlm@1
|
909 case 0xaf:
|
rlm@1
|
910 // XOR A
|
rlm@1
|
911 AF.B.B1=0;
|
rlm@1
|
912 AF.B.B0=Z_FLAG;
|
rlm@1
|
913 break;
|
rlm@1
|
914 case 0xb0:
|
rlm@1
|
915 // OR B
|
rlm@1
|
916 AF.B.B1|=BC.B.B1;
|
rlm@1
|
917 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
918 break;
|
rlm@1
|
919 case 0xb1:
|
rlm@1
|
920 // OR C
|
rlm@1
|
921 AF.B.B1|=BC.B.B0;
|
rlm@1
|
922 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
923 break;
|
rlm@1
|
924 case 0xb2:
|
rlm@1
|
925 // OR D
|
rlm@1
|
926 AF.B.B1|=DE.B.B1;
|
rlm@1
|
927 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
928 break;
|
rlm@1
|
929 case 0xb3:
|
rlm@1
|
930 // OR E
|
rlm@1
|
931 AF.B.B1|=DE.B.B0;
|
rlm@1
|
932 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
933 break;
|
rlm@1
|
934 case 0xb4:
|
rlm@1
|
935 // OR H
|
rlm@1
|
936 AF.B.B1|=HL.B.B1;
|
rlm@1
|
937 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
938 break;
|
rlm@1
|
939 case 0xb5:
|
rlm@1
|
940 // OR L
|
rlm@1
|
941 AF.B.B1|=HL.B.B0;
|
rlm@1
|
942 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
943 break;
|
rlm@1
|
944 case 0xb6:
|
rlm@1
|
945 // OR (HL)
|
rlm@1
|
946 tempValue=gbReadMemory(HL.W);
|
rlm@1
|
947 AF.B.B1|=tempValue;
|
rlm@1
|
948 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
949 break;
|
rlm@1
|
950 case 0xb7:
|
rlm@1
|
951 // OR A
|
rlm@1
|
952 AF.B.B1|=AF.B.B1;
|
rlm@1
|
953 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
954 break;
|
rlm@1
|
955 case 0xb8:
|
rlm@1
|
956 // CP B:
|
rlm@1
|
957 tempRegister.W=AF.B.B1-BC.B.B1;
|
rlm@1
|
958 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
959 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
960 break;
|
rlm@1
|
961 case 0xb9:
|
rlm@1
|
962 // CP C
|
rlm@1
|
963 tempRegister.W=AF.B.B1-BC.B.B0;
|
rlm@1
|
964 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
965 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
966 break;
|
rlm@1
|
967 case 0xba:
|
rlm@1
|
968 // CP D
|
rlm@1
|
969 tempRegister.W=AF.B.B1-DE.B.B1;
|
rlm@1
|
970 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
971 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
972 break;
|
rlm@1
|
973 case 0xbb:
|
rlm@1
|
974 // CP E
|
rlm@1
|
975 tempRegister.W=AF.B.B1-DE.B.B0;
|
rlm@1
|
976 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
977 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
978 break;
|
rlm@1
|
979 case 0xbc:
|
rlm@1
|
980 // CP H
|
rlm@1
|
981 tempRegister.W=AF.B.B1-HL.B.B1;
|
rlm@1
|
982 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
983 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
984 break;
|
rlm@1
|
985 case 0xbd:
|
rlm@1
|
986 // CP L
|
rlm@1
|
987 tempRegister.W=AF.B.B1-HL.B.B0;
|
rlm@1
|
988 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
989 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
990 break;
|
rlm@1
|
991 case 0xbe:
|
rlm@1
|
992 // CP (HL)
|
rlm@1
|
993 tempValue=gbReadMemory(HL.W);
|
rlm@1
|
994 tempRegister.W=AF.B.B1-tempValue;
|
rlm@1
|
995 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
996 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
997 break;
|
rlm@1
|
998 case 0xbf:
|
rlm@1
|
999 // CP A
|
rlm@1
|
1000 AF.B.B0=N_FLAG|Z_FLAG;
|
rlm@1
|
1001 break;
|
rlm@1
|
1002 case 0xc0:
|
rlm@1
|
1003 // RET NZ
|
rlm@1
|
1004 if(!(AF.B.B0&Z_FLAG)) {
|
rlm@1
|
1005 PC.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1006 PC.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1007 clockTicks += 3;
|
rlm@1
|
1008 }
|
rlm@1
|
1009 break;
|
rlm@1
|
1010 case 0xc1:
|
rlm@1
|
1011 // POP BC
|
rlm@1
|
1012 BC.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1013 BC.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1014 break;
|
rlm@1
|
1015 case 0xc2:
|
rlm@1
|
1016 // JP NZ,NNNN
|
rlm@1
|
1017 if(AF.B.B0&Z_FLAG)
|
rlm@1
|
1018 PC.W+=2;
|
rlm@1
|
1019 else {
|
rlm@1
|
1020 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1021 tempRegister.B.B1=gbReadMemory(PC.W);
|
rlm@1
|
1022 PC.W=tempRegister.W;
|
rlm@1
|
1023 clockTicks++;
|
rlm@1
|
1024 }
|
rlm@1
|
1025 break;
|
rlm@1
|
1026 case 0xc3:
|
rlm@1
|
1027 // JP NNNN
|
rlm@1
|
1028 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1029 tempRegister.B.B1=gbReadMemory(PC.W);
|
rlm@1
|
1030 PC.W=tempRegister.W;
|
rlm@1
|
1031 break;
|
rlm@1
|
1032 case 0xc4:
|
rlm@1
|
1033 // CALL NZ,NNNN
|
rlm@1
|
1034 if(AF.B.B0&Z_FLAG)
|
rlm@1
|
1035 PC.W+=2;
|
rlm@1
|
1036 else {
|
rlm@1
|
1037 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1038 tempRegister.B.B1=gbReadMemory(PC.W++);
|
rlm@1
|
1039 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1040 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1041 PC.W=tempRegister.W;
|
rlm@1
|
1042 clockTicks += 3;
|
rlm@1
|
1043 }
|
rlm@1
|
1044 break;
|
rlm@1
|
1045 case 0xc5:
|
rlm@1
|
1046 // PUSH BC
|
rlm@1
|
1047 gbWriteMemory(--SP.W,BC.B.B1);
|
rlm@1
|
1048 gbWriteMemory(--SP.W,BC.B.B0);
|
rlm@1
|
1049 break;
|
rlm@1
|
1050 case 0xc6:
|
rlm@1
|
1051 // ADD NN
|
rlm@1
|
1052 tempValue=gbReadOpcode(PC.W++);
|
rlm@1
|
1053 tempRegister.W=AF.B.B1+tempValue;
|
rlm@1
|
1054 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
1055 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10 ? H_FLAG:0);
|
rlm@1
|
1056 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
1057 break;
|
rlm@1
|
1058 case 0xc7:
|
rlm@1
|
1059 // RST 00
|
rlm@1
|
1060 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1061 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1062 PC.W=0x0000;
|
rlm@1
|
1063 break;
|
rlm@1
|
1064 case 0xc8:
|
rlm@1
|
1065 // RET Z
|
rlm@1
|
1066 if(AF.B.B0&Z_FLAG) {
|
rlm@1
|
1067 PC.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1068 PC.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1069 clockTicks += 3;
|
rlm@1
|
1070 }
|
rlm@1
|
1071 break;
|
rlm@1
|
1072 case 0xc9:
|
rlm@1
|
1073 // RET
|
rlm@1
|
1074 PC.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1075 PC.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1076 break;
|
rlm@1
|
1077 case 0xca:
|
rlm@1
|
1078 // JP Z,NNNN
|
rlm@1
|
1079 if(AF.B.B0&Z_FLAG) {
|
rlm@1
|
1080 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1081 tempRegister.B.B1=gbReadMemory(PC.W);
|
rlm@1
|
1082 PC.W=tempRegister.W;
|
rlm@1
|
1083 clockTicks++;
|
rlm@1
|
1084 } else
|
rlm@1
|
1085 PC.W+=2;
|
rlm@1
|
1086 break;
|
rlm@1
|
1087 // CB done outside
|
rlm@1
|
1088 case 0xcc:
|
rlm@1
|
1089 // CALL Z,NNNN
|
rlm@1
|
1090 if(AF.B.B0&Z_FLAG) {
|
rlm@1
|
1091 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1092 tempRegister.B.B1=gbReadMemory(PC.W++);
|
rlm@1
|
1093 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1094 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1095 PC.W=tempRegister.W;
|
rlm@1
|
1096 clockTicks += 3;
|
rlm@1
|
1097 } else
|
rlm@1
|
1098 PC.W+=2;
|
rlm@1
|
1099 break;
|
rlm@1
|
1100 case 0xcd:
|
rlm@1
|
1101 // CALL NNNN
|
rlm@1
|
1102 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1103 tempRegister.B.B1=gbReadMemory(PC.W++);
|
rlm@1
|
1104 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1105 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1106 PC.W=tempRegister.W;
|
rlm@1
|
1107 break;
|
rlm@1
|
1108 case 0xce:
|
rlm@1
|
1109 // ADC NN
|
rlm@1
|
1110 tempValue=gbReadOpcode(PC.W++);
|
rlm@1
|
1111 tempRegister.W=AF.B.B1+tempValue+(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
1112 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
1113 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
1114 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
1115 break;
|
rlm@1
|
1116 case 0xcf:
|
rlm@1
|
1117 // RST 08
|
rlm@1
|
1118 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1119 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1120 PC.W=0x0008;
|
rlm@1
|
1121 break;
|
rlm@1
|
1122 case 0xd0:
|
rlm@1
|
1123 // RET NC
|
rlm@1
|
1124 if(!(AF.B.B0&C_FLAG)) {
|
rlm@1
|
1125 PC.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1126 PC.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1127 clockTicks += 3;
|
rlm@1
|
1128 }
|
rlm@1
|
1129 break;
|
rlm@1
|
1130 case 0xd1:
|
rlm@1
|
1131 // POP DE
|
rlm@1
|
1132 DE.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1133 DE.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1134 break;
|
rlm@1
|
1135 case 0xd2:
|
rlm@1
|
1136 // JP NC,NNNN
|
rlm@1
|
1137 if(AF.B.B0&C_FLAG)
|
rlm@1
|
1138 PC.W+=2;
|
rlm@1
|
1139 else {
|
rlm@1
|
1140 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1141 tempRegister.B.B1=gbReadMemory(PC.W);
|
rlm@1
|
1142 PC.W=tempRegister.W;
|
rlm@1
|
1143 clockTicks++;
|
rlm@1
|
1144 }
|
rlm@1
|
1145 break;
|
rlm@1
|
1146 // D3 illegal
|
rlm@1
|
1147 case 0xd4:
|
rlm@1
|
1148 // CALL NC,NNNN
|
rlm@1
|
1149 if(AF.B.B0&C_FLAG)
|
rlm@1
|
1150 PC.W+=2;
|
rlm@1
|
1151 else {
|
rlm@1
|
1152 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1153 tempRegister.B.B1=gbReadMemory(PC.W++);
|
rlm@1
|
1154 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1155 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1156 PC.W=tempRegister.W;
|
rlm@1
|
1157 clockTicks += 3;
|
rlm@1
|
1158 }
|
rlm@1
|
1159 break;
|
rlm@1
|
1160 case 0xd5:
|
rlm@1
|
1161 // PUSH DE
|
rlm@1
|
1162 gbWriteMemory(--SP.W,DE.B.B1);
|
rlm@1
|
1163 gbWriteMemory(--SP.W,DE.B.B0);
|
rlm@1
|
1164 break;
|
rlm@1
|
1165 case 0xd6:
|
rlm@1
|
1166 // SUB NN
|
rlm@1
|
1167 tempValue=gbReadOpcode(PC.W++);
|
rlm@1
|
1168 tempRegister.W=AF.B.B1-tempValue;
|
rlm@1
|
1169 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
1170 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
1171 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
1172 break;
|
rlm@1
|
1173 case 0xd7:
|
rlm@1
|
1174 // RST 10
|
rlm@1
|
1175 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1176 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1177 PC.W=0x0010;
|
rlm@1
|
1178 break;
|
rlm@1
|
1179 case 0xd8:
|
rlm@1
|
1180 // RET C
|
rlm@1
|
1181 if(AF.B.B0&C_FLAG) {
|
rlm@1
|
1182 PC.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1183 PC.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1184 clockTicks += 4;
|
rlm@1
|
1185 }
|
rlm@1
|
1186 break;
|
rlm@1
|
1187 case 0xd9:
|
rlm@1
|
1188 // RETI
|
rlm@1
|
1189 PC.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1190 PC.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1191 IFF |= 0x01;
|
rlm@1
|
1192 break;
|
rlm@1
|
1193 case 0xda:
|
rlm@1
|
1194 // JP C,NNNN
|
rlm@1
|
1195 if(AF.B.B0&C_FLAG) {
|
rlm@1
|
1196 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1197 tempRegister.B.B1=gbReadMemory(PC.W);
|
rlm@1
|
1198 PC.W=tempRegister.W;
|
rlm@1
|
1199 clockTicks++;
|
rlm@1
|
1200 } else
|
rlm@1
|
1201 PC.W+=2;
|
rlm@1
|
1202 break;
|
rlm@1
|
1203 // DB illegal
|
rlm@1
|
1204 case 0xdc:
|
rlm@1
|
1205 // CALL C,NNNN
|
rlm@1
|
1206 if(AF.B.B0&C_FLAG) {
|
rlm@1
|
1207 tempRegister.B.B0=gbReadMemory(PC.W++);
|
rlm@1
|
1208 tempRegister.B.B1=gbReadMemory(PC.W++);
|
rlm@1
|
1209 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1210 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1211 PC.W=tempRegister.W;
|
rlm@1
|
1212 clockTicks += 3;
|
rlm@1
|
1213 } else
|
rlm@1
|
1214 PC.W+=2;
|
rlm@1
|
1215 break;
|
rlm@1
|
1216 // DD illegal
|
rlm@1
|
1217 case 0xde:
|
rlm@1
|
1218 // SBC NN
|
rlm@1
|
1219 tempValue=gbReadOpcode(PC.W++);
|
rlm@1
|
1220 tempRegister.W=AF.B.B1-tempValue-(AF.B.B0&C_FLAG ? 1 : 0);
|
rlm@1
|
1221 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
1222 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
1223 AF.B.B1=tempRegister.B.B0;
|
rlm@1
|
1224 break;
|
rlm@1
|
1225 case 0xdf:
|
rlm@1
|
1226 // RST 18
|
rlm@1
|
1227 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1228 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1229 PC.W=0x0018;
|
rlm@1
|
1230 break;
|
rlm@1
|
1231 case 0xe0:
|
rlm@1
|
1232 // LD (FF00+NN),A
|
rlm@1
|
1233 gbWriteMemory(0xff00 + gbReadOpcode(PC.W++),AF.B.B1);
|
rlm@1
|
1234 break;
|
rlm@1
|
1235 case 0xe1:
|
rlm@1
|
1236 // POP HL
|
rlm@1
|
1237 HL.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1238 HL.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1239 break;
|
rlm@1
|
1240 case 0xe2:
|
rlm@1
|
1241 // LD (FF00+C),A
|
rlm@1
|
1242 gbWriteMemory(0xff00 + BC.B.B0,AF.B.B1);
|
rlm@1
|
1243 break;
|
rlm@1
|
1244 // E3 illegal
|
rlm@1
|
1245 // E4 illegal
|
rlm@1
|
1246 case 0xe5:
|
rlm@1
|
1247 // PUSH HL
|
rlm@1
|
1248 gbWriteMemory(--SP.W,HL.B.B1);
|
rlm@1
|
1249 gbWriteMemory(--SP.W,HL.B.B0);
|
rlm@1
|
1250 break;
|
rlm@1
|
1251 case 0xe6:
|
rlm@1
|
1252 // AND NN
|
rlm@1
|
1253 tempValue=gbReadOpcode(PC.W++);
|
rlm@1
|
1254 AF.B.B1&=tempValue;
|
rlm@1
|
1255 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
|
rlm@1
|
1256 break;
|
rlm@1
|
1257 case 0xe7:
|
rlm@1
|
1258 // RST 20
|
rlm@1
|
1259 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1260 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1261 PC.W=0x0020;
|
rlm@1
|
1262 break;
|
rlm@1
|
1263 case 0xe8:
|
rlm@1
|
1264 // ADD SP,NN
|
rlm@1
|
1265 offset = (s8)gbReadOpcode(PC.W++);
|
rlm@1
|
1266
|
rlm@1
|
1267 if(offset >= 0) {
|
rlm@1
|
1268 tempRegister.W = SP.W + offset;
|
rlm@1
|
1269 AF.B.B0 = (SP.W > tempRegister.W ? C_FLAG : 0) |
|
rlm@1
|
1270 ((SP.W^offset^tempRegister.W)&0x1000? H_FLAG:0);
|
rlm@1
|
1271 SP.W = tempRegister.W;
|
rlm@1
|
1272 } else {
|
rlm@1
|
1273 tempRegister.W = SP.W + offset;
|
rlm@1
|
1274 AF.B.B0 = (SP.W < tempRegister.W ? C_FLAG : 0) |
|
rlm@1
|
1275 ((SP.W^offset^tempRegister.W)&0x1000?H_FLAG:0);
|
rlm@1
|
1276 SP.W = tempRegister.W;
|
rlm@1
|
1277 }
|
rlm@1
|
1278 break;
|
rlm@1
|
1279 case 0xe9:
|
rlm@1
|
1280 // LD PC,HL
|
rlm@1
|
1281 PC.W=HL.W;
|
rlm@1
|
1282 break;
|
rlm@1
|
1283 case 0xea:
|
rlm@1
|
1284 // LD (NNNN),A
|
rlm@1
|
1285 tempRegister.B.B0=gbReadOpcode(PC.W++);
|
rlm@1
|
1286 tempRegister.B.B1=gbReadOpcode(PC.W++);
|
rlm@1
|
1287 gbWriteMemory(tempRegister.W,AF.B.B1);
|
rlm@1
|
1288 break;
|
rlm@1
|
1289 // EB illegal
|
rlm@1
|
1290 // EC illegal
|
rlm@1
|
1291 // ED illegal
|
rlm@1
|
1292 case 0xee:
|
rlm@1
|
1293 // XOR NN
|
rlm@1
|
1294 tempValue=gbReadOpcode(PC.W++);
|
rlm@1
|
1295 AF.B.B1^=tempValue;
|
rlm@1
|
1296 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
1297 break;
|
rlm@1
|
1298 case 0xef:
|
rlm@1
|
1299 // RST 28
|
rlm@1
|
1300 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1301 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1302 PC.W=0x0028;
|
rlm@1
|
1303 break;
|
rlm@1
|
1304 case 0xf0:
|
rlm@1
|
1305 // LD A,(FF00+NN)
|
rlm@1
|
1306 AF.B.B1 = gbReadMemory(0xff00+gbReadOpcode(PC.W++));
|
rlm@1
|
1307 break;
|
rlm@1
|
1308 case 0xf1:
|
rlm@1
|
1309 // POP AF
|
rlm@1
|
1310 AF.B.B0=gbReadMemory(SP.W++);
|
rlm@1
|
1311 AF.B.B1=gbReadMemory(SP.W++);
|
rlm@1
|
1312 break;
|
rlm@1
|
1313 case 0xf2:
|
rlm@1
|
1314 // LD A,(FF00+C)
|
rlm@1
|
1315 AF.B.B1 = gbReadMemory(0xff00+BC.B.B0);
|
rlm@1
|
1316 break;
|
rlm@1
|
1317 case 0xf3:
|
rlm@1
|
1318 // DI
|
rlm@1
|
1319 // IFF&=0xFE;
|
rlm@1
|
1320 IFF&=(~0x21);
|
rlm@1
|
1321 break;
|
rlm@1
|
1322 // F4 illegal
|
rlm@1
|
1323 case 0xf5:
|
rlm@1
|
1324 // PUSH AF
|
rlm@1
|
1325 gbWriteMemory(--SP.W,AF.B.B1);
|
rlm@1
|
1326 gbWriteMemory(--SP.W,AF.B.B0);
|
rlm@1
|
1327 break;
|
rlm@1
|
1328 case 0xf6:
|
rlm@1
|
1329 // OR NN
|
rlm@1
|
1330 tempValue=gbReadOpcode(PC.W++);
|
rlm@1
|
1331 AF.B.B1|=tempValue;
|
rlm@1
|
1332 AF.B.B0=ZeroTable[AF.B.B1];
|
rlm@1
|
1333 break;
|
rlm@1
|
1334 case 0xf7:
|
rlm@1
|
1335 // RST 30
|
rlm@1
|
1336 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1337 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1338 PC.W=0x0030;
|
rlm@1
|
1339 break;
|
rlm@1
|
1340 case 0xf8:
|
rlm@1
|
1341 // LD HL,SP+NN
|
rlm@1
|
1342 offset = (s8)gbReadOpcode(PC.W++);
|
rlm@1
|
1343 if(offset >= 0) {
|
rlm@1
|
1344 tempRegister.W = SP.W + offset;
|
rlm@1
|
1345 AF.B.B0 = (SP.W > tempRegister.W ? C_FLAG : 0) |
|
rlm@1
|
1346 ((SP.W^offset^tempRegister.W)&0x1000? H_FLAG:0);
|
rlm@1
|
1347 HL.W = tempRegister.W;
|
rlm@1
|
1348 } else {
|
rlm@1
|
1349 tempRegister.W = SP.W + offset;
|
rlm@1
|
1350 AF.B.B0 = (SP.W < tempRegister.W ? C_FLAG : 0) |
|
rlm@1
|
1351 ((SP.W^offset^tempRegister.W)&0x1000?H_FLAG:0);
|
rlm@1
|
1352 HL.W = tempRegister.W;
|
rlm@1
|
1353 }
|
rlm@1
|
1354 break;
|
rlm@1
|
1355 case 0xf9:
|
rlm@1
|
1356 // LD SP,HL
|
rlm@1
|
1357 SP.W=HL.W;
|
rlm@1
|
1358 break;
|
rlm@1
|
1359 case 0xfa:
|
rlm@1
|
1360 // LD A,(NNNN)
|
rlm@1
|
1361 tempRegister.B.B0=gbReadOpcode(PC.W++);
|
rlm@1
|
1362 tempRegister.B.B1=gbReadOpcode(PC.W++);
|
rlm@1
|
1363 AF.B.B1=gbReadMemory(tempRegister.W);
|
rlm@1
|
1364 break;
|
rlm@1
|
1365 case 0xfb:
|
rlm@1
|
1366 // EI
|
rlm@1
|
1367 IFF|=0x20;
|
rlm@1
|
1368 break;
|
rlm@1
|
1369 // FC illegal
|
rlm@1
|
1370 // FD illegal
|
rlm@1
|
1371 case 0xfe:
|
rlm@1
|
1372 // CP NN
|
rlm@1
|
1373 tempValue=gbReadOpcode(PC.W++);
|
rlm@1
|
1374 tempRegister.W=AF.B.B1-tempValue;
|
rlm@1
|
1375 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
|
rlm@1
|
1376 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
|
rlm@1
|
1377 break;
|
rlm@1
|
1378 case 0xff:
|
rlm@1
|
1379 // RST 38
|
rlm@1
|
1380 gbWriteMemory(--SP.W,PC.B.B1);
|
rlm@1
|
1381 gbWriteMemory(--SP.W,PC.B.B0);
|
rlm@1
|
1382 PC.W=0x0038;
|
rlm@1
|
1383 break;
|
rlm@1
|
1384 default:
|
rlm@1
|
1385 systemMessage(0, N_("Unknown opcode %02x at %04x"),
|
rlm@1
|
1386 gbReadOpcode(PC.W-1),PC.W-1);
|
rlm@1
|
1387 emulating = false;
|
rlm@1
|
1388 return;
|