1 /******************************************************************************
\r
3 * CZ80 XY 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 *JumpTableXY[Opcode];
\r
18 /*-----------------------------------------
\r
20 -----------------------------------------*/
\r
24 /*-----------------------------------------
\r
25 LD r8 (same register)
\r
26 -----------------------------------------*/
\r
28 OPXY(0x40): // LD B,B
\r
29 OPXY(0x49): // LD C,C
\r
30 OPXY(0x52): // LD D,D
\r
31 OPXY(0x5b): // LD E,E
\r
32 OPXY(0x64): // LD H,H
\r
33 OPXY(0x6d): // LD L,L
\r
34 OPXY(0x7f): // LD A,A
\r
37 /*-----------------------------------------
\r
39 -----------------------------------------*/
\r
41 OPXY(0x41): // LD B,C
\r
42 OPXY(0x42): // LD B,D
\r
43 OPXY(0x43): // LD B,E
\r
44 OPXY(0x47): // LD B,A
\r
46 OPXY(0x48): // LD C,B
\r
47 OPXY(0x4a): // LD C,D
\r
48 OPXY(0x4b): // LD C,E
\r
49 OPXY(0x4f): // LD C,A
\r
51 OPXY(0x50): // LD D,B
\r
52 OPXY(0x51): // LD D,C
\r
53 OPXY(0x53): // LD D,E
\r
54 OPXY(0x57): // LD D,A
\r
56 OPXY(0x58): // LD E,B
\r
57 OPXY(0x59): // LD E,C
\r
58 OPXY(0x5a): // LD E,D
\r
59 OPXY(0x5f): // LD E,A
\r
61 OPXY(0x78): // LD A,B
\r
62 OPXY(0x79): // LD A,C
\r
63 OPXY(0x7a): // LD A,D
\r
64 OPXY(0x7b): // LD A,E
\r
67 OPXY(0x44): // LD B,HX
\r
68 OPXY(0x4c): // LD C,HX
\r
69 OPXY(0x54): // LD D,HX
\r
70 OPXY(0x5c): // LD E,HX
\r
71 OPXY(0x7c): // LD A,HX
\r
72 zR8((Opcode >> 3) & 7) = data->B.H;
\r
75 OPXY(0x45): // LD B,LX
\r
76 OPXY(0x4d): // LD C,LX
\r
77 OPXY(0x55): // LD D,LX
\r
78 OPXY(0x5d): // LD E,LX
\r
79 OPXY(0x7d): // LD A,LX
\r
80 zR8((Opcode >> 3) & 7) = data->B.L;
\r
83 OPXY(0x60): // LD HX,B
\r
84 OPXY(0x61): // LD HX,C
\r
85 OPXY(0x62): // LD HX,D
\r
86 OPXY(0x63): // LD HX,E
\r
87 OPXY(0x67): // LD HX,A
\r
88 data->B.H = zR8(Opcode & 7);
\r
91 OPXY(0x68): // LD LX,B
\r
92 OPXY(0x69): // LD LX,C
\r
93 OPXY(0x6a): // LD LX,D
\r
94 OPXY(0x6b): // LD LX,E
\r
95 OPXY(0x6f): // LD LX,A
\r
96 data->B.L = zR8(Opcode & 7);
\r
99 OPXY(0x65): // LD HX,LX
\r
100 data->B.H = data->B.L;
\r
103 OPXY(0x6c): // LD LX,HX
\r
104 data->B.L = data->B.H;
\r
107 OPXY(0x06): // LD B,#imm
\r
108 OPXY(0x0e): // LD C,#imm
\r
109 OPXY(0x16): // LD D,#imm
\r
110 OPXY(0x1e): // LD E,#imm
\r
111 OPXY(0x3e): // LD A,#imm
\r
114 OPXY(0x26): // LD HX,#imm
\r
115 data->B.H = READ_ARG();
\r
118 OPXY(0x2e): // LD LX,#imm
\r
119 data->B.L = READ_ARG();
\r
122 OPXY(0x0a): // LD A,(BC)
\r
123 goto OP_LOAD_A_mBC;
\r
125 OPXY(0x1a): // LD A,(DE)
\r
126 goto OP_LOAD_A_mDE;
\r
128 OPXY(0x3a): // LD A,(nn)
\r
129 goto OP_LOAD_A_mNN;
\r
131 OPXY(0x02): // LD (BC),A
\r
132 goto OP_LOAD_mBC_A;
\r
134 OPXY(0x12): // LD (DE),A
\r
135 goto OP_LOAD_mDE_A;
\r
137 OPXY(0x32): // LD (nn),A
\r
138 goto OP_LOAD_mNN_A;
\r
140 OPXY(0x46): // LD B,(IX+o)
\r
141 OPXY(0x4e): // LD C,(IX+o)
\r
142 OPXY(0x56): // LD D,(IX+o)
\r
143 OPXY(0x5e): // LD E,(IX+o)
\r
144 OPXY(0x66): // LD H,(IX+o)
\r
145 OPXY(0x6e): // LD L,(IX+o)
\r
146 OPXY(0x7e): // LD A,(IX+o)
\r
147 adr = data->W + (INT8)READ_ARG();
\r
148 zR8((Opcode >> 3) & 7) = READ_MEM8(adr);
\r
151 OPXY(0x70): // LD (IX+o),B
\r
152 OPXY(0x71): // LD (IX+o),C
\r
153 OPXY(0x72): // LD (IX+o),D
\r
154 OPXY(0x73): // LD (IX+o),E
\r
155 OPXY(0x74): // LD (IX+o),H
\r
156 OPXY(0x75): // LD (IX+o),L
\r
157 OPXY(0x77): // LD (IX+o),A
\r
158 adr = data->W + (INT8)READ_ARG();
\r
159 WRITE_MEM8(adr, zR8(Opcode & 7));
\r
162 OPXY(0x36): // LD (IX+o),#imm
\r
163 adr = data->W + (INT8)READ_ARG();
\r
164 WRITE_MEM8(adr, READ_ARG());
\r
167 /*-----------------------------------------
\r
169 -----------------------------------------*/
\r
171 OPXY(0x01): // LD BC,nn
\r
172 OPXY(0x11): // LD DE,nn
\r
173 goto OP_LOAD_RR_imm16;
\r
175 OPXY(0x21): // LD IX,nn
\r
176 data->W = READ_ARG16();
\r
179 OPXY(0x31): // LD SP,nn
\r
180 goto OP_LOAD_SP_imm16;
\r
182 OPXY(0x2a): // LD IX,(w)
\r
185 OPXY(0x22): // LD (w),IX
\r
188 OPXY(0xf9): // LD SP,IX
\r
191 /*-----------------------------------------
\r
193 -----------------------------------------*/
\r
195 OPXY(0xc1): // POP BC
\r
196 OPXY(0xd1): // POP DE
\r
198 OPXY(0xf1): // POP AF
\r
201 OPXY(0xe1): // POP IX
\r
204 /*-----------------------------------------
\r
206 -----------------------------------------*/
\r
208 OPXY(0xc5): // PUSH BC
\r
209 OPXY(0xd5): // PUSH DE
\r
211 OPXY(0xf5): // PUSH AF
\r
214 OPXY(0xe5): // PUSH IX
\r
217 /*-----------------------------------------
\r
219 -----------------------------------------*/
\r
221 OPXY(0x08): // EX AF,AF'
\r
224 OPXY(0xeb): // EX DE,HL
\r
230 OPXY(0xe3): // EX (SP),IX
\r
233 /*-----------------------------------------
\r
235 -----------------------------------------*/
\r
237 OPXY(0x04): // INC B
\r
238 OPXY(0x0c): // INC C
\r
239 OPXY(0x14): // INC D
\r
240 OPXY(0x1c): // INC E
\r
241 OPXY(0x3c): // INC A
\r
244 OPXY(0x24): // INC HX
\r
246 zF = (zF & CF) | SZHV_inc[data->B.H];
\r
249 OPXY(0x2c): // INC LX
\r
251 zF = (zF & CF) | SZHV_inc[data->B.L];
\r
254 OPXY(0x34): // INC (IX+o)
\r
255 adr = data->W + (INT8)READ_ARG();
\r
259 /*-----------------------------------------
\r
261 -----------------------------------------*/
\r
263 OPXY(0x05): // DEC B
\r
264 OPXY(0x0d): // DEC C
\r
265 OPXY(0x15): // DEC D
\r
266 OPXY(0x1d): // DEC E
\r
267 OPXY(0x3d): // DEC A
\r
270 OPXY(0x25): // DEC HX
\r
272 zF = (zF & CF) | SZHV_dec[data->B.H];
\r
275 OPXY(0x2d): // DEC LX
\r
277 zF = (zF & CF) | SZHV_dec[data->B.L];
\r
280 OPXY(0x35): // DEC (IX+o)
\r
281 adr = data->W + (INT8)READ_ARG();
\r
285 /*-----------------------------------------
\r
287 -----------------------------------------*/
\r
289 OPXY(0x80): // ADD A,B
\r
290 OPXY(0x81): // ADD A,C
\r
291 OPXY(0x82): // ADD A,D
\r
292 OPXY(0x83): // ADD A,E
\r
293 OPXY(0x87): // ADD A,A
\r
296 OPXY(0xc6): // ADD A,n
\r
299 OPXY(0x84): // ADD A,HX
\r
303 OPXY(0x85): // ADD A,LX
\r
307 OPXY(0x86): // ADD A,(IX+o)
\r
308 adr = data->W + (INT8)READ_ARG();
\r
309 val = READ_MEM8(adr);
\r
313 /*-----------------------------------------
\r
315 -----------------------------------------*/
\r
317 OPXY(0x88): // ADC A,B
\r
318 OPXY(0x89): // ADC A,C
\r
319 OPXY(0x8a): // ADC A,D
\r
320 OPXY(0x8b): // ADC A,E
\r
321 OPXY(0x8f): // ADC A,A
\r
324 OPXY(0xce): // ADC A,n
\r
327 OPXY(0x8c): // ADC A,HX
\r
331 OPXY(0x8d): // ADC A,LX
\r
335 OPXY(0x8e): // ADC A,(IX+o)
\r
336 adr = data->W + (INT8)READ_ARG();
\r
337 val = READ_MEM8(adr);
\r
341 /*-----------------------------------------
\r
343 -----------------------------------------*/
\r
345 OPXY(0x90): // SUB B
\r
346 OPXY(0x91): // SUB C
\r
347 OPXY(0x92): // SUB D
\r
348 OPXY(0x93): // SUB E
\r
349 OPXY(0x97): // SUB A
\r
352 OPXY(0xd6): // SUB A,n
\r
355 OPXY(0x94): // SUB HX
\r
359 OPXY(0x95): // SUB LX
\r
363 OPXY(0x96): // SUB (IX+o)
\r
364 adr = data->W + (INT8)READ_ARG();
\r
365 val = READ_MEM8(adr);
\r
369 /*-----------------------------------------
\r
371 -----------------------------------------*/
\r
373 OPXY(0x98): // SBC A,B
\r
374 OPXY(0x99): // SBC A,C
\r
375 OPXY(0x9a): // SBC A,D
\r
376 OPXY(0x9b): // SBC A,E
\r
377 OPXY(0x9f): // SBC A,A
\r
380 OPXY(0xde): // SBC A,n
\r
383 OPXY(0x9c): // SBC A,HX
\r
387 OPXY(0x9d): // SBC A,LX
\r
391 OPXY(0x9e): // SBC A,(IX+o)
\r
392 adr = data->W + (INT8)READ_ARG();
\r
393 val = READ_MEM8(adr);
\r
397 /*-----------------------------------------
\r
399 -----------------------------------------*/
\r
401 OPXY(0xb8): // CP B
\r
402 OPXY(0xb9): // CP C
\r
403 OPXY(0xba): // CP D
\r
404 OPXY(0xbb): // CP E
\r
405 OPXY(0xbf): // CP A
\r
408 OPXY(0xfe): // CP n
\r
411 OPXY(0xbc): // CP HX
\r
415 OPXY(0xbd): // CP LX
\r
419 OPXY(0xbe): // CP (IX+o)
\r
420 adr = data->W + (INT8)READ_ARG();
\r
421 val = READ_MEM8(adr);
\r
425 /*-----------------------------------------
\r
427 -----------------------------------------*/
\r
429 OPXY(0xa0): // AND B
\r
430 OPXY(0xa1): // AND C
\r
431 OPXY(0xa2): // AND D
\r
432 OPXY(0xa3): // AND E
\r
433 OPXY(0xa7): // AND A
\r
436 OPXY(0xe6): // AND A,n
\r
439 OPXY(0xa4): // AND HX
\r
443 OPXY(0xa5): // AND LX
\r
447 OPXY(0xa6): // AND (IX+o)
\r
448 adr = data->W + (INT8)READ_ARG();
\r
449 val = READ_MEM8(adr);
\r
453 /*-----------------------------------------
\r
455 -----------------------------------------*/
\r
457 OPXY(0xa8): // XOR B
\r
458 OPXY(0xa9): // XOR C
\r
459 OPXY(0xaa): // XOR D
\r
460 OPXY(0xab): // XOR E
\r
461 OPXY(0xaf): // XOR A
\r
464 OPXY(0xee): // XOR A,n
\r
467 OPXY(0xac): // XOR HX
\r
471 OPXY(0xad): // XOR LX
\r
475 OPXY(0xae): // XOR (IX+o)
\r
476 adr = data->W + (INT8)READ_ARG();
\r
477 val = READ_MEM8(adr);
\r
481 /*-----------------------------------------
\r
483 -----------------------------------------*/
\r
485 OPXY(0xb0): // OR B
\r
486 OPXY(0xb1): // OR C
\r
487 OPXY(0xb2): // OR D
\r
488 OPXY(0xb3): // OR E
\r
489 OPXY(0xb7): // OR A
\r
492 OPXY(0xf6): // OR A,n
\r
495 OPXY(0xb4): // OR HX
\r
499 OPXY(0xb5): // OR LX
\r
503 OPXY(0xb6): // OR (IX+o)
\r
504 adr = data->W + (INT8)READ_ARG();
\r
505 val = READ_MEM8(adr);
\r
509 /*-----------------------------------------
\r
510 MISC ARITHMETIC & CPU CONTROL
\r
511 -----------------------------------------*/
\r
525 OPXY(0x76): // HALT
\r
534 /*-----------------------------------------
\r
536 -----------------------------------------*/
\r
538 OPXY(0x03): // INC BC
\r
541 OPXY(0x13): // INC DE
\r
544 OPXY(0x23): // INC IX
\r
547 OPXY(0x33): // INC SP
\r
550 /*-----------------------------------------
\r
552 -----------------------------------------*/
\r
554 OPXY(0x0b): // DEC BC
\r
557 OPXY(0x1b): // DEC DE
\r
560 OPXY(0x2b): // DEC IX
\r
563 OPXY(0x3b): // DEC SP
\r
566 /*-----------------------------------------
\r
568 -----------------------------------------*/
\r
570 OPXY(0x09): // ADD IX,BC
\r
571 goto OP_ADD16_xx_BC;
\r
573 OPXY(0x19): // ADD IX,DE
\r
574 goto OP_ADD16_xx_DE;
\r
576 OPXY(0x29): // ADD IX,IX
\r
577 goto OP_ADD16_xx_xx;
\r
579 OPXY(0x39): // ADD IX,SP
\r
580 goto OP_ADD16_xx_SP;
\r
582 /*-----------------------------------------
\r
584 -----------------------------------------*/
\r
586 OPXY(0x07): // RLCA
\r
589 OPXY(0x0f): // RRCA
\r
598 /*-----------------------------------------
\r
600 -----------------------------------------*/
\r
602 OPXY(0xc3): // JP nn
\r
605 OPXY(0xe9): // JP (IX)
\r
608 OPXY(0xc2): // JP NZ,nn
\r
611 OPXY(0xca): // JP Z,nn
\r
614 OPXY(0xd2): // JP NC,nn
\r
617 OPXY(0xda): // JP C,nn
\r
620 OPXY(0xe2): // JP PO,nn
\r
623 OPXY(0xea): // JP PE,nn
\r
626 OPXY(0xf2): // JP P,nn
\r
629 OPXY(0xfa): // JP M,nn
\r
632 /*-----------------------------------------
\r
634 -----------------------------------------*/
\r
636 OPXY(0x10): // DJNZ n
\r
639 OPXY(0x18): // JR n
\r
642 OPXY(0x20): // JR NZ,n
\r
645 OPXY(0x28): // JR Z,n
\r
648 OPXY(0x30): // JR NC,n
\r
651 OPXY(0x38): // JR C,n
\r
654 /*-----------------------------------------
\r
656 -----------------------------------------*/
\r
658 OPXY(0xcd): // CALL nn
\r
661 OPXY(0xc4): // CALL NZ,nn
\r
664 OPXY(0xcc): // CALL Z,nn
\r
667 OPXY(0xd4): // CALL NC,nn
\r
670 OPXY(0xdc): // CALL C,nn
\r
673 OPXY(0xe4): // CALL PO,nn
\r
676 OPXY(0xec): // CALL PE,nn
\r
679 OPXY(0xf4): // CALL P,nn
\r
682 OPXY(0xfc): // CALL M,nn
\r
685 /*-----------------------------------------
\r
687 -----------------------------------------*/
\r
692 OPXY(0xc0): // RET NZ
\r
695 OPXY(0xc8): // RET Z
\r
698 OPXY(0xd0): // RET NC
\r
701 OPXY(0xd8): // RET C
\r
704 OPXY(0xe0): // RET PO
\r
707 OPXY(0xe8): // RET PE
\r
710 OPXY(0xf0): // RET P
\r
713 OPXY(0xf8): // RET M
\r
716 /*-----------------------------------------
\r
718 -----------------------------------------*/
\r
720 OPXY(0xc7): // RST 0
\r
721 OPXY(0xcf): // RST 1
\r
722 OPXY(0xd7): // RST 2
\r
723 OPXY(0xdf): // RST 3
\r
724 OPXY(0xe7): // RST 4
\r
725 OPXY(0xef): // RST 5
\r
726 OPXY(0xf7): // RST 6
\r
727 OPXY(0xff): // RST 7
\r
730 /*-----------------------------------------
\r
732 -----------------------------------------*/
\r
734 OPXY(0xd3): // OUT (n),A
\r
737 /*-----------------------------------------
\r
739 -----------------------------------------*/
\r
741 OPXY(0xdb): // IN A,(n)
\r
744 /*-----------------------------------------
\r
746 -----------------------------------------*/
\r
748 OPXY(0xcb): // XYCB prefix (BIT & SHIFT INSTRUCTIONS)
\r
753 adr = data->W + (INT8)READ_ARG();
\r
754 Opcode = READ_ARG();
\r
755 #if CZ80_EMULATE_R_EXACTLY
\r
758 #include "cz80_opXYCB.c"
\r
761 OPXY(0xed): // ED prefix
\r
764 OPXY(0xdd): // DD prefix (IX)
\r
767 OPXY(0xfd): // FD prefix (IY)
\r
770 #if !CZ80_USE_JUMPTABLE
\r