Add VCS links
[debian-dgen.git] / cz80 / cz80_opxy.inc
blob991060231925d00ae886b8ed9ba3ec28e2705aa0
1 /********************************************************************************/
2 /*                                                                              */
3 /* CZ80 XY opcode include source file                                           */
4 /* C Z80 emulator version 0.91                                                  */
5 /* Copyright 2004-2005 Stephane Dallongeville                                   */
6 /*                                                                              */
7 /********************************************************************************/
9 #if CZ80_USE_JUMPTABLE
10     goto *JumpTableXY[Opcode];
11 #else
12 switch (Opcode)
14 #endif
16     OPXY(0x00): // NOP
18     // 8 BITS LOAD
20     OPXY(0x40): // LD   B,B
21     OPXY(0x49): // LD   C,C
22     OPXY(0x52): // LD   D,D
23     OPXY(0x5b): // LD   E,E
24     OPXY(0x64): // LD   H,H
25     OPXY(0x6d): // LD   L,L
26     OPXY(0x7f): // LD   A,A
27         goto OP_NOP;
29     OPXY(0x41): // LD   B,C
30     OPXY(0x42): // LD   B,D
31     OPXY(0x43): // LD   B,E
32     OPXY(0x47): // LD   B,A
34     OPXY(0x48): // LD   C,B
35     OPXY(0x4a): // LD   C,D
36     OPXY(0x4b): // LD   C,E
37     OPXY(0x4f): // LD   C,A
39     OPXY(0x50): // LD   D,B
40     OPXY(0x51): // LD   D,C
41     OPXY(0x53): // LD   D,E
42     OPXY(0x57): // LD   D,A
44     OPXY(0x58): // LD   E,B
45     OPXY(0x59): // LD   E,C
46     OPXY(0x5a): // LD   E,D
47     OPXY(0x5f): // LD   E,A
49     OPXY(0x78): // LD   A,B
50     OPXY(0x79): // LD   A,C
51     OPXY(0x7a): // LD   A,D
52     OPXY(0x7b): // LD   A,E
53         goto OP_LD_R_R;
55     OPXY(0x44): // LD   B,HX
56     OPXY(0x4c): // LD   C,HX
57     OPXY(0x54): // LD   D,HX
58     OPXY(0x5c): // LD   E,HX
59     OPXY(0x7c): // LD   A,HX
60         zR8((Opcode >> 3) & 7) = data->B.H;
61         RET(4)
63     OPXY(0x45): // LD   B,LX
64     OPXY(0x4d): // LD   C,LX
65     OPXY(0x55): // LD   D,LX
66     OPXY(0x5d): // LD   E,LX
67     OPXY(0x7d): // LD   A,LX
68         zR8((Opcode >> 3) & 7) = data->B.L;
69         RET(4)
71     OPXY(0x60): // LD   HX,B
72     OPXY(0x61): // LD   HX,C
73     OPXY(0x62): // LD   HX,D
74     OPXY(0x63): // LD   HX,E
75     OPXY(0x67): // LD   HX,A
76         data->B.H = zR8(Opcode & 7);
77         RET(4)
79     OPXY(0x68): // LD   LX,B
80     OPXY(0x69): // LD   LX,C
81     OPXY(0x6a): // LD   LX,D
82     OPXY(0x6b): // LD   LX,E
83     OPXY(0x6f): // LD   LX,A
84         data->B.L = zR8(Opcode & 7);
85         RET(4)
87     OPXY(0x65): // LD   HX,LX
88         data->B.H = data->B.L;
89         RET(4)
91     OPXY(0x6c): // LD   LX,HX
92         data->B.L = data->B.H;
93         RET(4)
95     OPXY(0x06): // LD   B,#imm
96     OPXY(0x0e): // LD   C,#imm
97     OPXY(0x16): // LD   D,#imm
98     OPXY(0x1e): // LD   E,#imm
99     OPXY(0x3e): // LD   A,#imm
100         goto OP_LD_R_imm;
102     OPXY(0x26): // LD   HX,#imm
103         data->B.H = FETCH_BYTE;
104         RET(7)
106     OPXY(0x2e): // LD   LX,#imm
107         data->B.L = FETCH_BYTE;
108         RET(7)
110     OPXY(0x0a): // LD   A,(BC)
111         goto OP_LOAD_A_mBC;
113     OPXY(0x1a): // LD   A,(DE)
114         goto OP_LOAD_A_mDE;
116     OPXY(0x3a): // LD   A,(nn)
117         goto OP_LOAD_A_mNN;
119     OPXY(0x02): // LD   (BC),A
120         goto OP_LOAD_mBC_A;
122     OPXY(0x12): // LD   (DE),A
123         goto OP_LOAD_mDE_A;
125     OPXY(0x32): // LD   (nn),A
126         goto OP_LOAD_mNN_A;
128     {
129         uint16_t adr;
131     OPXY(0x46): // LD   B,(IX+o)
132     OPXY(0x56): // LD   D,(IX+o)
133     OPXY(0x5e): // LD   E,(IX+o)
134     OPXY(0x66): // LD   H,(IX+o)
135     OPXY(0x6e): // LD   L,(IX+o)
136     OPXY(0x4e): // LD   C,(IX+o)
137     OPXY(0x7e): // LD   A,(IX+o)
138         PRE_IO
139         adr = data->W + FETCH_BYTE_S;
140         READ_BYTE(adr, zR8((Opcode >> 3) & 7))
141         POST_IO
142         RET(15)
144     OPXY(0x70): // LD   (IX+o),B
145     OPXY(0x71): // LD   (IX+o),C
146     OPXY(0x72): // LD   (IX+o),D
147     OPXY(0x73): // LD   (IX+o),E
148     OPXY(0x74): // LD   (IX+o),H
149     OPXY(0x75): // LD   (IX+o),L
150     OPXY(0x77): // LD   (IX+o),A
151         PRE_IO
152         adr = data->W + FETCH_BYTE_S;
153         WRITE_BYTE(adr, zR8(Opcode & 7))
154         POST_IO
155         RET(15)
157     OPXY(0x36): // LD   (IX+o),#imm
158         PRE_IO
159         adr = data->W + FETCH_BYTE_S;
160         WRITE_BYTE(adr, FETCH_BYTE)
161         POST_IO
162         RET(15)
163     }
165     // 16 BITS LOAD
167     OPXY(0x01): // LD   BC,nn
168     OPXY(0x11): // LD   DE,nn
169         goto OP_LOAD_RR_imm16;
171     OPXY(0x21): // LD   IX,nn
172         FETCH_WORD(data->W)
173         RET(10)
175     OPXY(0x31): // LD   SP,nn
176         goto OP_LOAD_SP_imm16;
178     OPXY(0x2a): // LD   IX,(w)
179         goto OP_LD_xx_mNN;
181     OPXY(0x22): // LD   (w),IX
182         goto OP_LD_mNN_xx;
184     OPXY(0xf9): // LD   SP,IX
185         goto OP_LD_SP_xx;
188     // PUSH / POP
190     OPXY(0xf1): // POP  AF
191         goto OP_POP_AF;
193     OPXY(0xc1): // POP  BC
194     OPXY(0xd1): // POP  DE
195         goto OP_POP_RR;
197     OPXY(0xe1): // POP  IX
198         goto OP_POP;
200     OPXY(0xf5): // PUSH AF
201         goto OP_PUSH_AF;
203     OPXY(0xc5): // PUSH BC
204     OPXY(0xd5): // PUSH DE
205         goto OP_PUSH_RR;
207     OPXY(0xe5): // PUSH IX
208         goto OP_PUSH;
211     // EXCHANGE
213     OPXY(0x08): // EX   AF,AF'
214         goto OP_EX_AF_AF2;
216     OPXY(0xeb): // EX   DE,HL
217         goto OP_EX_DE_HL;
219     OPXY(0xd9): // EXX
220         goto OP_EXX;
222     OPXY(0xe3): // EX   (SP),IX
223         goto OP_EX_xx_mSP;
226     // 8 BITS ARITHMETIC
227     // INC
229     OPXY(0x04): // INC  B
230     OPXY(0x0c): // INC  C
231     OPXY(0x14): // INC  D
232     OPXY(0x1c): // INC  E
233     OPXY(0x3c): // INC  A
234         goto OP_INC_R;
236     OPXY(0x24): // INC  HX
237         data->B.H++;
238         zF = (zF & CZ80_CF) | SZXYHV_inc[data->B.H];
239         RET(4)
241     OPXY(0x2c): // INC  LX
242         data->B.L++;
243         zF = (zF & CZ80_CF) | SZXYHV_inc[data->B.L];
244         RET(4)
246     OPXY(0x34): // INC  (IX+o)
247         goto OP_INC_mIx;
249     // DEC
251     OPXY(0x05): // DEC  B
252     OPXY(0x0d): // DEC  C
253     OPXY(0x15): // DEC  D
254     OPXY(0x1d): // DEC  E
255     OPXY(0x3d): // DEC  A
256         goto OP_DEC_R;
258     OPXY(0x25): // DEC  HX
259         data->B.H--;
260         zF = (zF & CZ80_CF) | SZXYHV_dec[data->B.H];
261         RET(4)
263     OPXY(0x2d): // DEC  LX
264         data->B.L--;
265         zF = (zF & CZ80_CF) | SZXYHV_dec[data->B.L];
266         RET(4)
268     OPXY(0x35): // DEC  (IX+o)
269         goto OP_DEC_mIx;
272     // ADD
274     OPXY(0x80): // ADD  A,B
275     OPXY(0x81): // ADD  A,C
276     OPXY(0x82): // ADD  A,D
277     OPXY(0x83): // ADD  A,E
278     OPXY(0x87): // ADD  A,A
279         goto OP_ADD_R;
281     OPXY(0x84): // ADD  A,HX
282         goto OP_ADD_IxH;
284     OPXY(0x85): // ADD  A,LX
285         goto OP_ADD_IxL;
287     OPXY(0xc6): // ADD  A,n
288         goto OP_ADD_imm;
290     OPXY(0x86): // ADD  A,(IX+o)
291         goto OP_ADD_mIx;
293     // ADC
295     OPXY(0x88): // ADC  A,B
296     OPXY(0x89): // ADC  A,C
297     OPXY(0x8a): // ADC  A,D
298     OPXY(0x8b): // ADC  A,E
299     OPXY(0x8f): // ADC  A,A
300         goto OP_ADC_R;
302     OPXY(0xce): // ADC  A,n
303         goto OP_ADC_imm;
305     OPXY(0x8c): // ADC  A,HX
306         goto OP_ADC_IxH;
308     OPXY(0x8d): // ADC  A,LX
309         goto OP_ADC_IxL;
311     OPXY(0x8e): // ADC  A,(IX+o)
312         goto OP_ADC_mIx;
314     // SUB
316     OPXY(0x90): // SUB  B
317     OPXY(0x91): // SUB  C
318     OPXY(0x92): // SUB  D
319     OPXY(0x93): // SUB  E
320     OPXY(0x97): // SUB  A
321         goto OP_SUB_R;
323     OPXY(0x94): // SUB  HX
324         goto OP_SUB_IxH;
326     OPXY(0x95): // SUB  LX
327         goto OP_SUB_IxL;
329     OPXY(0xd6): // SUB  A,n
330         goto OP_SUB_imm;
332     OPXY(0x96): // SUB  (IX+o)
333         goto OP_SUB_mIx;
335     // SBC
337     OPXY(0x98): // SBC  A,B
338     OPXY(0x99): // SBC  A,C
339     OPXY(0x9a): // SBC  A,D
340     OPXY(0x9b): // SBC  A,E
341     OPXY(0x9f): // SBC  A,A
342         goto OP_SBC_R;
344     OPXY(0x9c): // SBC  A,HX
345         goto OP_SBC_IxH;
347     OPXY(0x9d): // SBC  A,LX
348         goto OP_SBC_IxL;
350     OPXY(0xde): // SBC  A,n
351         goto OP_SBC_imm;
353     OPXY(0x9e): // SBC  A,(IX+o)
354         goto OP_SBC_mIx;
356     // CP
358     OPXY(0xb8): // CP   B
359     OPXY(0xb9): // CP   C
360     OPXY(0xba): // CP   D
361     OPXY(0xbb): // CP   E
362     OPXY(0xbf): // CP   A
363         goto OP_CP_R;
365     OPXY(0xbc): // CP   HX
366         goto OP_CP_IxH;
368     OPXY(0xbd): // CP   LX
369         goto OP_CP_IxL;
371     OPXY(0xfe): // CP   n
372         goto OP_CP_imm;
374     OPXY(0xbe): // CP   (IX+o)
375         goto OP_CP_mIx;
377     // AND
379     OPXY(0xa0): // AND  B
380     OPXY(0xa1): // AND  C
381     OPXY(0xa2): // AND  D
382     OPXY(0xa3): // AND  E
383         goto OP_AND_R;
385     OPXY(0xa7): // AND  A
386         goto OP_AND_A;
388     OPXY(0xa4): // AND  HX
389         goto OP_AND_IxH;
391     OPXY(0xa5): // AND  LX
392         goto OP_AND_IxL;
394     OPXY(0xe6): // AND  A,n
395         goto OP_AND_imm;
397     OPXY(0xa6): // AND  (IX+o)
398     {
399         uint8_t val;
401         PRE_IO
402         READ_BYTE(data->W + FETCH_BYTE_S, val)
403         POST_IO
404         zA = zA & val;
405         zF = SZXYP[zA] | CZ80_HF;
406         RET(15)
407     }
409     // XOR
411     OPXY(0xa8): // XOR  B
412     OPXY(0xa9): // XOR  C
413     OPXY(0xaa): // XOR  D
414     OPXY(0xab): // XOR  E
415         goto OP_XOR_R;
417     OPXY(0xaf): // XOR  A
418         goto OP_XOR_A;
420     OPXY(0xac): // XOR  HX
421         goto OP_XOR_IxH;
423     OPXY(0xad): // XOR  LX
424         goto OP_XOR_IxL;
426     OPXY(0xee): // XOR  A,n
427         goto OP_XOR_imm;
429     OPXY(0xae): // XOR  (IX+o)
430     {
431         uint8_t val;
433         PRE_IO
434         READ_BYTE(data->W + FETCH_BYTE_S, val)
435         POST_IO
436         zA = zA ^ val;
437         zF = SZXYP[zA];
438         RET(15)
439     }
441     // OR
443     OPXY(0xb0): // OR   B
444     OPXY(0xb1): // OR   C
445     OPXY(0xb2): // OR   D
446     OPXY(0xb3): // OR   E
447         goto OP_OR_R;
449     OPXY(0xb7): // OR   A
450         goto OP_OR_A;
452     OPXY(0xb4): // OR   HX
453         goto OP_OR_IxH;
455     OPXY(0xb5): // OR   LX
456         goto OP_OR_IxL;
458     OPXY(0xf6): // OR   A,n
459         goto OP_OR_imm;
461     OPXY(0xb6): // OR   (IX+o)
462     {
463         uint8_t val;
465         PRE_IO
466         READ_BYTE(data->W + FETCH_BYTE_S, val)
467         POST_IO
468         zA = zA | val;
469         zF = SZXYP[zA];
470         RET(15)
471     }
474     // MISC ARITHMETIC & CPU CONTROL
476     OPXY(0x27): // DAA
477         goto OP_DAA;
479     OPXY(0x2f): // CPL
480         goto OP_CPL;
482     OPXY(0x37): // SCF
483         goto OP_SCF;
485     OPXY(0x3f): // CCF
486         goto OP_CCF;
488     OPXY(0x76): // HALT
489         goto OP_HALT;
491     OPXY(0xf3): // DI
492         goto OP_DI;
494     OPXY(0xfb): // EI
495         goto OP_EI;
498     // 16 BITS ARITHMETIC
500     OPXY(0x03): // INC  BC
501         goto OP_INC_BC;
503     OPXY(0x13): // INC  DE
504         goto OP_INC_DE;
506     OPXY(0x23): // INC  IX
507         goto OP_INC_xx;
509     OPXY(0x33): // INC  SP
510         goto OP_INC_SP;
512     OPXY(0x0b): // DEC  BC
513         goto OP_DEC_BC;
515     OPXY(0x1b): // DEC  DE
516         goto OP_DEC_DE;
518     OPXY(0x2b): // DEC  IX
519         goto OP_DEC_xx;
521     OPXY(0x3b): // DEC  SP
522         goto OP_DEC_SP;
524     // ADD16
526     OPXY(0x09): // ADD  IX,BC
527         goto OP_ADD16_xx_BC;
529     OPXY(0x19): // ADD  IX,DE
530         goto OP_ADD16_xx_DE;
532     OPXY(0x29): // ADD  IX,IX
533         goto OP_ADD16_xx_xx;
535     OPXY(0x39): // ADD  IX,SP
536         goto OP_ADD16_xx_SP;
539     // ROTATE
541     OPXY(0x07): // RLCA
542         goto OP_RLCA;
544     OPXY(0x0f): // RRCA
545         goto OP_RRCA;
547     OPXY(0x17): // RLA
548         goto OP_RLA;
550     OPXY(0x1f): // RRA
551         goto OP_RRA;
554     // JUMP
556     OPXY(0xc3): // JP   nn
557         goto OP_JP;
559     OPXY(0xe9): // JP   (IX)
560         goto OP_JP_xx;
563     OPXY(0xd2): // JP   NC,nn
564         goto OP_JP_NC;
566     OPXY(0xda): // JP   C,nn
567         goto OP_JP_C;
569     OPXY(0xe2): // JP   PO,nn
570         goto OP_JP_PO;
572     OPXY(0xea): // JP   PE,nn
573         goto OP_JP_PE;
575     OPXY(0xf2): // JP   P,nn
576         goto OP_JP_P;
578     OPXY(0xfa): // JP   M,nn
579         goto OP_JP_M;
581     OPXY(0xca): // JP   Z,nn
582         goto OP_JP_Z;
584     OPXY(0xc2): // JP   NZ,nn
585         goto OP_JP_NZ;
588     OPXY(0x18): // JR   n
589         goto OP_JR;
592     OPXY(0x38): // JR   C,n
593         goto OP_JR_C;
595     OPXY(0x30): // JR   NC,n
596         goto OP_JR_NC;
598     OPXY(0x28): // JR   Z,n
599         goto OP_JR_Z;
601     OPXY(0x20): // JR   NZ,n
602         goto OP_JR_NZ;
605     OPXY(0x10): // DJNZ n
606         goto OP_DJNZ;
609     // CALL & RETURN
611     OPXY(0xcd): // CALL nn
612         goto OP_CALL;
615     OPXY(0xd4): // CALL NC,nn
616         goto OP_CALL_NC;
618     OPXY(0xdc): // CALL C,nn
619         goto OP_CALL_C;
621     OPXY(0xe4): // CALL PO,nn
622         goto OP_CALL_PO;
624     OPXY(0xec): // CALL PE,nn
625         goto OP_CALL_PE;
627     OPXY(0xf4): // CALL P,nn
628         goto OP_CALL_P;
630     OPXY(0xfc): // CALL M,nn
631         goto OP_CALL_M;
633     OPXY(0xcc): // CALL Z,nn
634         goto OP_CALL_Z;
636     OPXY(0xc4): // CALL NZ,nn
637         goto OP_CALL_NZ;
640     OPXY(0xc9): // RET
641         goto OP_RET;
644     OPXY(0xd0): // RET  NC
645         goto OP_RET_NC;
647     OPXY(0xd8): // RET  C
648         goto OP_RET_C;
650     OPXY(0xe0): // RET  PO
651         goto OP_RET_PO;
653     OPXY(0xe8): // RET  PE
654         goto OP_RET_PE;
656     OPXY(0xf0): // RET  P
657         goto OP_RET_P;
659     OPXY(0xf8): // RET  M
660         goto OP_RET_M;
662     OPXY(0xc0): // RET  NZ
663         goto OP_RET_NZ;
665     OPXY(0xc8): // RET  Z
666         goto OP_RET_Z;
669     OPXY(0xc7): // RST  0
670     OPXY(0xcf): // RST  1
671     OPXY(0xd7): // RST  2
672     OPXY(0xdf): // RST  3
673     OPXY(0xe7): // RST  4
674     OPXY(0xef): // RST  5
675     OPXY(0xf7): // RST  6
676     OPXY(0xff): // RST  7
677         goto OP_RST;
680     // INPUT & OUTPUT
682     OPXY(0xd3): // OUT  (n),A
683         goto OP_OUT_mN_A;
685     OPXY(0xdb): // IN   A,(n)
686         goto OP_IN_A_mN;
689     // PREFIXE
691     OPXY(0xcb): // XYCB PREFIXE
692     {
693         uint16_t adr;
694         uint8_t src;
695         uint8_t res;
697         adr = data->W + FETCH_BYTE_S;
698         Opcode = FETCH_BYTE;
699         #include "cz80_opxycb.inc"
700     }
702     OPXY(0xed): // ED PREFIXE
703         goto ED_PREFIXE;
705     OPXY(0xdd): // DD PREFIXE (IX)
706         goto DD_PREFIXE;
708     OPXY(0xfd): // FD PREFIXE (IY)
709         goto FD_PREFIXE;
711 #if CZ80_USE_JUMPTABLE
712 #else
714 #endif