1 /******************************************************************************
\r
3 * CZ80 CB opcode include source file
\r
4 * CZ80 emulator version 0.9
\r
5 * Copyright 2004-2005 Stéphane Dallongeville
\r
9 *****************************************************************************/
\r
11 #if CZ80_USE_JUMPTABLE
\r
12 goto *JumpTableCB[Opcode];
\r
18 /*-----------------------------------------
\r
20 -----------------------------------------*/
\r
22 OPCB(0x00): // RLC B
\r
23 OPCB(0x01): // RLC C
\r
24 OPCB(0x02): // RLC D
\r
25 OPCB(0x03): // RLC E
\r
26 OPCB(0x04): // RLC H
\r
27 OPCB(0x05): // RLC L
\r
28 OPCB(0x07): // RLC A
\r
30 res = (src << 1) | (src >> 7);
\r
31 zF = SZP[res] | (src >> 7);
\r
35 OPCB(0x06): // RLC (HL)
\r
37 src = READ_MEM8(adr);
\r
38 res = (src << 1) | (src >> 7);
\r
39 zF = SZP[res] | (src >> 7);
\r
40 WRITE_MEM8(adr, res);
\r
43 /*-----------------------------------------
\r
45 -----------------------------------------*/
\r
47 OPCB(0x08): // RRC B
\r
48 OPCB(0x09): // RRC C
\r
49 OPCB(0x0a): // RRC D
\r
50 OPCB(0x0b): // RRC E
\r
51 OPCB(0x0c): // RRC H
\r
52 OPCB(0x0d): // RRC L
\r
53 OPCB(0x0f): // RRC A
\r
54 src = zR8(Opcode & 7);
\r
55 res = (src >> 1) | (src << 7);
\r
56 zF = SZP[res] | (src & CF);
\r
57 zR8(Opcode & 7) = res;
\r
60 OPCB(0x0e): // RRC (HL)
\r
62 src = READ_MEM8(adr);
\r
63 res = (src >> 1) | (src << 7);
\r
64 zF = SZP[res] | (src & CF);
\r
65 WRITE_MEM8(adr, res);
\r
68 /*-----------------------------------------
\r
70 -----------------------------------------*/
\r
79 src = zR8(Opcode & 7);
\r
80 res = (src << 1) | (zF & CF);
\r
81 zF = SZP[res] | (src >> 7);
\r
82 zR8(Opcode & 7) = res;
\r
85 OPCB(0x16): // RL (HL)
\r
87 src = READ_MEM8(adr);
\r
88 res = (src << 1) | (zF & CF);
\r
89 zF = SZP[res] | (src >> 7);
\r
90 WRITE_MEM8(adr, res);
\r
93 /*-----------------------------------------
\r
95 -----------------------------------------*/
\r
100 OPCB(0x1b): // RR E
\r
101 OPCB(0x1c): // RR H
\r
102 OPCB(0x1d): // RR L
\r
103 OPCB(0x1f): // RR A
\r
104 src = zR8(Opcode & 7);
\r
105 res = (src >> 1) | (zF << 7);
\r
106 zF = SZP[res] | (src & CF);
\r
107 zR8(Opcode & 7) = res;
\r
110 OPCB(0x1e): // RR (HL)
\r
112 src = READ_MEM8(adr);
\r
113 res = (src >> 1) | (zF << 7);
\r
114 zF = SZP[res] | (src & CF);
\r
115 WRITE_MEM8(adr, res);
\r
118 /*-----------------------------------------
\r
120 -----------------------------------------*/
\r
122 OPCB(0x20): // SLA B
\r
123 OPCB(0x21): // SLA C
\r
124 OPCB(0x22): // SLA D
\r
125 OPCB(0x23): // SLA E
\r
126 OPCB(0x24): // SLA H
\r
127 OPCB(0x25): // SLA L
\r
128 OPCB(0x27): // SLA A
\r
129 src = zR8(Opcode & 7);
\r
131 zF = SZP[res] | (src >> 7);
\r
132 zR8(Opcode & 7) = res;
\r
135 OPCB(0x26): // SLA (HL)
\r
137 src = READ_MEM8(adr);
\r
139 zF = SZP[res] | (src >> 7);
\r
140 WRITE_MEM8(adr, res);
\r
143 /*-----------------------------------------
\r
145 -----------------------------------------*/
\r
147 OPCB(0x28): // SRA B
\r
148 OPCB(0x29): // SRA C
\r
149 OPCB(0x2a): // SRA D
\r
150 OPCB(0x2b): // SRA E
\r
151 OPCB(0x2c): // SRA H
\r
152 OPCB(0x2d): // SRA L
\r
153 OPCB(0x2f): // SRA A
\r
154 src = zR8(Opcode & 7);
\r
155 res = (src >> 1) | (src & 0x80);
\r
156 zF = SZP[res] | (src & CF);
\r
157 zR8(Opcode & 7) = res;
\r
160 OPCB(0x2e): // SRA (HL)
\r
162 src = READ_MEM8(adr);
\r
163 res = (src >> 1) | (src & 0x80);
\r
164 zF = SZP[res] | (src & CF);
\r
165 WRITE_MEM8(adr, res);
\r
168 /*-----------------------------------------
\r
170 -----------------------------------------*/
\r
172 OPCB(0x30): // SLL B
\r
173 OPCB(0x31): // SLL C
\r
174 OPCB(0x32): // SLL D
\r
175 OPCB(0x33): // SLL E
\r
176 OPCB(0x34): // SLL H
\r
177 OPCB(0x35): // SLL L
\r
178 OPCB(0x37): // SLL A
\r
179 src = zR8(Opcode & 7);
\r
180 res = (src << 1) | 0x01;
\r
181 zF = SZP[res] | (src >> 7);
\r
182 zR8(Opcode & 7) = res;
\r
185 OPCB(0x36): // SLL (HL)
\r
187 src = READ_MEM8(adr);
\r
188 res = (src << 1) | 0x01;
\r
189 zF = SZP[res] | (src >> 7);
\r
190 WRITE_MEM8(adr, res);
\r
193 /*-----------------------------------------
\r
195 -----------------------------------------*/
\r
197 OPCB(0x38): // SRL B
\r
198 OPCB(0x39): // SRL C
\r
199 OPCB(0x3a): // SRL D
\r
200 OPCB(0x3b): // SRL E
\r
201 OPCB(0x3c): // SRL H
\r
202 OPCB(0x3d): // SRL L
\r
203 OPCB(0x3f): // SRL A
\r
204 src = zR8(Opcode & 7);
\r
206 zF = SZP[res] | (src & CF);
\r
207 zR8(Opcode & 7) = res;
\r
210 OPCB(0x3e): // SRL (HL)
\r
212 src = READ_MEM8(adr);
\r
214 zF = SZP[res] | (src & CF);
\r
215 WRITE_MEM8(adr, res);
\r
218 /*-----------------------------------------
\r
220 -----------------------------------------*/
\r
222 OPCB(0x40): // BIT 0,B
\r
223 OPCB(0x41): // BIT 0,C
\r
224 OPCB(0x42): // BIT 0,D
\r
225 OPCB(0x43): // BIT 0,E
\r
226 OPCB(0x44): // BIT 0,H
\r
227 OPCB(0x45): // BIT 0,L
\r
228 OPCB(0x47): // BIT 0,A
\r
230 OPCB(0x48): // BIT 1,B
\r
231 OPCB(0x49): // BIT 1,C
\r
232 OPCB(0x4a): // BIT 1,D
\r
233 OPCB(0x4b): // BIT 1,E
\r
234 OPCB(0x4c): // BIT 1,H
\r
235 OPCB(0x4d): // BIT 1,L
\r
236 OPCB(0x4f): // BIT 1,A
\r
238 OPCB(0x50): // BIT 2,B
\r
239 OPCB(0x51): // BIT 2,C
\r
240 OPCB(0x52): // BIT 2,D
\r
241 OPCB(0x53): // BIT 2,E
\r
242 OPCB(0x54): // BIT 2,H
\r
243 OPCB(0x55): // BIT 2,L
\r
244 OPCB(0x57): // BIT 2,A
\r
246 OPCB(0x58): // BIT 3,B
\r
247 OPCB(0x59): // BIT 3,C
\r
248 OPCB(0x5a): // BIT 3,D
\r
249 OPCB(0x5b): // BIT 3,E
\r
250 OPCB(0x5c): // BIT 3,H
\r
251 OPCB(0x5d): // BIT 3,L
\r
252 OPCB(0x5f): // BIT 3,A
\r
254 OPCB(0x60): // BIT 4,B
\r
255 OPCB(0x61): // BIT 4,C
\r
256 OPCB(0x62): // BIT 4,D
\r
257 OPCB(0x63): // BIT 4,E
\r
258 OPCB(0x64): // BIT 4,H
\r
259 OPCB(0x65): // BIT 4,L
\r
260 OPCB(0x67): // BIT 4,A
\r
262 OPCB(0x68): // BIT 5,B
\r
263 OPCB(0x69): // BIT 5,C
\r
264 OPCB(0x6a): // BIT 5,D
\r
265 OPCB(0x6b): // BIT 5,E
\r
266 OPCB(0x6c): // BIT 5,H
\r
267 OPCB(0x6d): // BIT 5,L
\r
268 OPCB(0x6f): // BIT 5,A
\r
270 OPCB(0x70): // BIT 6,B
\r
271 OPCB(0x71): // BIT 6,C
\r
272 OPCB(0x72): // BIT 6,D
\r
273 OPCB(0x73): // BIT 6,E
\r
274 OPCB(0x74): // BIT 6,H
\r
275 OPCB(0x75): // BIT 6,L
\r
276 OPCB(0x77): // BIT 6,A
\r
278 OPCB(0x78): // BIT 7,B
\r
279 OPCB(0x79): // BIT 7,C
\r
280 OPCB(0x7a): // BIT 7,D
\r
281 OPCB(0x7b): // BIT 7,E
\r
282 OPCB(0x7c): // BIT 7,H
\r
283 OPCB(0x7d): // BIT 7,L
\r
284 OPCB(0x7f): // BIT 7,A
\r
285 zF = (zF & CF) | HF | SZ_BIT[zR8(Opcode & 7) & (1 << ((Opcode >> 3) & 7))];
\r
288 OPCB(0x46): // BIT 0,(HL)
\r
289 OPCB(0x4e): // BIT 1,(HL)
\r
290 OPCB(0x56): // BIT 2,(HL)
\r
291 OPCB(0x5e): // BIT 3,(HL)
\r
292 OPCB(0x66): // BIT 4,(HL)
\r
293 OPCB(0x6e): // BIT 5,(HL)
\r
294 OPCB(0x76): // BIT 6,(HL)
\r
295 OPCB(0x7e): // BIT 7,(HL)
\r
296 src = READ_MEM8(zHL);
\r
297 zF = (zF & CF) | HF | SZ_BIT[src & (1 << ((Opcode >> 3) & 7))];
\r
300 /*-----------------------------------------
\r
302 -----------------------------------------*/
\r
304 OPCB(0x80): // RES 0,B
\r
305 OPCB(0x81): // RES 0,C
\r
306 OPCB(0x82): // RES 0,D
\r
307 OPCB(0x83): // RES 0,E
\r
308 OPCB(0x84): // RES 0,H
\r
309 OPCB(0x85): // RES 0,L
\r
310 OPCB(0x87): // RES 0,A
\r
312 OPCB(0x88): // RES 1,B
\r
313 OPCB(0x89): // RES 1,C
\r
314 OPCB(0x8a): // RES 1,D
\r
315 OPCB(0x8b): // RES 1,E
\r
316 OPCB(0x8c): // RES 1,H
\r
317 OPCB(0x8d): // RES 1,L
\r
318 OPCB(0x8f): // RES 1,A
\r
320 OPCB(0x90): // RES 2,B
\r
321 OPCB(0x91): // RES 2,C
\r
322 OPCB(0x92): // RES 2,D
\r
323 OPCB(0x93): // RES 2,E
\r
324 OPCB(0x94): // RES 2,H
\r
325 OPCB(0x95): // RES 2,L
\r
326 OPCB(0x97): // RES 2,A
\r
328 OPCB(0x98): // RES 3,B
\r
329 OPCB(0x99): // RES 3,C
\r
330 OPCB(0x9a): // RES 3,D
\r
331 OPCB(0x9b): // RES 3,E
\r
332 OPCB(0x9c): // RES 3,H
\r
333 OPCB(0x9d): // RES 3,L
\r
334 OPCB(0x9f): // RES 3,A
\r
336 OPCB(0xa0): // RES 4,B
\r
337 OPCB(0xa1): // RES 4,C
\r
338 OPCB(0xa2): // RES 4,D
\r
339 OPCB(0xa3): // RES 4,E
\r
340 OPCB(0xa4): // RES 4,H
\r
341 OPCB(0xa5): // RES 4,L
\r
342 OPCB(0xa7): // RES 4,A
\r
344 OPCB(0xa8): // RES 5,B
\r
345 OPCB(0xa9): // RES 5,C
\r
346 OPCB(0xaa): // RES 5,D
\r
347 OPCB(0xab): // RES 5,E
\r
348 OPCB(0xac): // RES 5,H
\r
349 OPCB(0xad): // RES 5,L
\r
350 OPCB(0xaf): // RES 5,A
\r
352 OPCB(0xb0): // RES 6,B
\r
353 OPCB(0xb1): // RES 6,C
\r
354 OPCB(0xb2): // RES 6,D
\r
355 OPCB(0xb3): // RES 6,E
\r
356 OPCB(0xb4): // RES 6,H
\r
357 OPCB(0xb5): // RES 6,L
\r
358 OPCB(0xb7): // RES 6,A
\r
360 OPCB(0xb8): // RES 7,B
\r
361 OPCB(0xb9): // RES 7,C
\r
362 OPCB(0xba): // RES 7,D
\r
363 OPCB(0xbb): // RES 7,E
\r
364 OPCB(0xbc): // RES 7,H
\r
365 OPCB(0xbd): // RES 7,L
\r
366 OPCB(0xbf): // RES 7,A
\r
367 zR8(Opcode & 7) &= ~(1 << ((Opcode >> 3) & 7));
\r
370 OPCB(0x86): // RES 0,(HL)
\r
371 OPCB(0x8e): // RES 1,(HL)
\r
372 OPCB(0x96): // RES 2,(HL)
\r
373 OPCB(0x9e): // RES 3,(HL)
\r
374 OPCB(0xa6): // RES 4,(HL)
\r
375 OPCB(0xae): // RES 5,(HL)
\r
376 OPCB(0xb6): // RES 6,(HL)
\r
377 OPCB(0xbe): // RES 7,(HL)
\r
379 res = READ_MEM8(adr);
\r
380 res &= ~(1 << ((Opcode >> 3) & 7));
\r
381 WRITE_MEM8(adr, res);
\r
384 /*-----------------------------------------
\r
386 -----------------------------------------*/
\r
388 OPCB(0xc0): // SET 0,B
\r
389 OPCB(0xc1): // SET 0,C
\r
390 OPCB(0xc2): // SET 0,D
\r
391 OPCB(0xc3): // SET 0,E
\r
392 OPCB(0xc4): // SET 0,H
\r
393 OPCB(0xc5): // SET 0,L
\r
394 OPCB(0xc7): // SET 0,A
\r
396 OPCB(0xc8): // SET 1,B
\r
397 OPCB(0xc9): // SET 1,C
\r
398 OPCB(0xca): // SET 1,D
\r
399 OPCB(0xcb): // SET 1,E
\r
400 OPCB(0xcc): // SET 1,H
\r
401 OPCB(0xcd): // SET 1,L
\r
402 OPCB(0xcf): // SET 1,A
\r
404 OPCB(0xd0): // SET 2,B
\r
405 OPCB(0xd1): // SET 2,C
\r
406 OPCB(0xd2): // SET 2,D
\r
407 OPCB(0xd3): // SET 2,E
\r
408 OPCB(0xd4): // SET 2,H
\r
409 OPCB(0xd5): // SET 2,L
\r
410 OPCB(0xd7): // SET 2,A
\r
412 OPCB(0xd8): // SET 3,B
\r
413 OPCB(0xd9): // SET 3,C
\r
414 OPCB(0xda): // SET 3,D
\r
415 OPCB(0xdb): // SET 3,E
\r
416 OPCB(0xdc): // SET 3,H
\r
417 OPCB(0xdd): // SET 3,L
\r
418 OPCB(0xdf): // SET 3,A
\r
420 OPCB(0xe0): // SET 4,B
\r
421 OPCB(0xe1): // SET 4,C
\r
422 OPCB(0xe2): // SET 4,D
\r
423 OPCB(0xe3): // SET 4,E
\r
424 OPCB(0xe4): // SET 4,H
\r
425 OPCB(0xe5): // SET 4,L
\r
426 OPCB(0xe7): // SET 4,A
\r
428 OPCB(0xe8): // SET 5,B
\r
429 OPCB(0xe9): // SET 5,C
\r
430 OPCB(0xea): // SET 5,D
\r
431 OPCB(0xeb): // SET 5,E
\r
432 OPCB(0xec): // SET 5,H
\r
433 OPCB(0xed): // SET 5,L
\r
434 OPCB(0xef): // SET 5,A
\r
436 OPCB(0xf0): // SET 6,B
\r
437 OPCB(0xf1): // SET 6,C
\r
438 OPCB(0xf2): // SET 6,D
\r
439 OPCB(0xf3): // SET 6,E
\r
440 OPCB(0xf4): // SET 6,H
\r
441 OPCB(0xf5): // SET 6,L
\r
442 OPCB(0xf7): // SET 6,A
\r
444 OPCB(0xf8): // SET 7,B
\r
445 OPCB(0xf9): // SET 7,C
\r
446 OPCB(0xfa): // SET 7,D
\r
447 OPCB(0xfb): // SET 7,E
\r
448 OPCB(0xfc): // SET 7,H
\r
449 OPCB(0xfd): // SET 7,L
\r
450 OPCB(0xff): // SET 7,A
\r
451 zR8(Opcode & 7) |= 1 << ((Opcode >> 3) & 7);
\r
454 OPCB(0xc6): // SET 0,(HL)
\r
455 OPCB(0xce): // SET 1,(HL)
\r
456 OPCB(0xd6): // SET 2,(HL)
\r
457 OPCB(0xde): // SET 3,(HL)
\r
458 OPCB(0xe6): // SET 4,(HL)
\r
459 OPCB(0xee): // SET 5,(HL)
\r
460 OPCB(0xf6): // SET 6,(HL)
\r
461 OPCB(0xfe): // SET 7,(HL)
\r
463 res = READ_MEM8(adr);
\r
464 res |= 1 << ((Opcode >> 3) & 7);
\r
465 WRITE_MEM8(adr, res);
\r
468 #if !CZ80_USE_JUMPTABLE
\r