menu: add reset hotkey
[picodrive.git] / cpu / cz80 / cz80_opCB.c
1 /******************************************************************************\r
2  *\r
3  * CZ80 CB opcode include source file\r
4  * CZ80 emulator version 0.9\r
5  * Copyright 2004-2005 Stéphane Dallongeville\r
6  *\r
7  * (Modified by NJ)\r
8  *\r
9  *****************************************************************************/\r
10 \r
11 #if CZ80_USE_JUMPTABLE\r
12         goto *JumpTableCB[Opcode];\r
13 #else\r
14 switch (Opcode)\r
15 {\r
16 #endif\r
17 \r
18 /*-----------------------------------------\r
19  RLC\r
20 -----------------------------------------*/\r
21 \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
29                 src = zR8(Opcode);\r
30                 res = (src << 1) | (src >> 7);\r
31                 zF = SZP[res] | (src >> 7);\r
32                 zR8(Opcode) = res;\r
33                 RET(8)\r
34 \r
35         OPCB(0x06): // RLC  (HL)\r
36                 adr = zHL;\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
41                 RET(15)\r
42 \r
43 /*-----------------------------------------\r
44  RRC\r
45 -----------------------------------------*/\r
46 \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
58                 RET(8)\r
59 \r
60         OPCB(0x0e): // RRC  (HL)\r
61                 adr = zHL;\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
66                 RET(15)\r
67 \r
68 /*-----------------------------------------\r
69  RL\r
70 -----------------------------------------*/\r
71 \r
72         OPCB(0x10): // RL   B\r
73         OPCB(0x11): // RL   C\r
74         OPCB(0x12): // RL   D\r
75         OPCB(0x13): // RL   E\r
76         OPCB(0x14): // RL   H\r
77         OPCB(0x15): // RL   L\r
78         OPCB(0x17): // RL   A\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
83                 RET(8)\r
84 \r
85         OPCB(0x16): // RL   (HL)\r
86                 adr = zHL;\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
91                 RET(15)\r
92 \r
93 /*-----------------------------------------\r
94  RR\r
95 -----------------------------------------*/\r
96 \r
97         OPCB(0x18): // RR   B\r
98         OPCB(0x19): // RR   C\r
99         OPCB(0x1a): // RR   D\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
108                 RET(8)\r
109 \r
110         OPCB(0x1e): // RR   (HL)\r
111                 adr = zHL;\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
116                 RET(15)\r
117 \r
118 /*-----------------------------------------\r
119  SLA\r
120 -----------------------------------------*/\r
121 \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
130                 res = src << 1;\r
131                 zF = SZP[res] | (src >> 7);\r
132                 zR8(Opcode & 7) = res;\r
133                 RET(8)\r
134 \r
135         OPCB(0x26): // SLA  (HL)\r
136                 adr = zHL;\r
137                 src = READ_MEM8(adr);\r
138                 res = src << 1;\r
139                 zF = SZP[res] | (src >> 7);\r
140                 WRITE_MEM8(adr, res);\r
141                 RET(15)\r
142 \r
143 /*-----------------------------------------\r
144  SRA\r
145 -----------------------------------------*/\r
146 \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
158                 RET(8)\r
159 \r
160         OPCB(0x2e): // SRA  (HL)\r
161                 adr = zHL;\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
166                 RET(15)\r
167 \r
168 /*-----------------------------------------\r
169  SLL\r
170 -----------------------------------------*/\r
171 \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
183                 RET(8)\r
184 \r
185         OPCB(0x36): // SLL  (HL)\r
186                 adr = zHL;\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
191                 RET(15)\r
192 \r
193 /*-----------------------------------------\r
194  SRL\r
195 -----------------------------------------*/\r
196 \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
205                 res = src >> 1;\r
206                 zF = SZP[res] | (src & CF);\r
207                 zR8(Opcode & 7) = res;\r
208                 RET(8)\r
209 \r
210         OPCB(0x3e): // SRL  (HL)\r
211                 adr = zHL;\r
212                 src = READ_MEM8(adr);\r
213                 res = src >> 1;\r
214                 zF = SZP[res] | (src & CF);\r
215                 WRITE_MEM8(adr, res);\r
216                 RET(15)\r
217 \r
218 /*-----------------------------------------\r
219  BIT\r
220 -----------------------------------------*/\r
221 \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
229 \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
237 \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
245 \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
253 \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
261 \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
269 \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
277 \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
286                 RET(8)\r
287 \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
298                 RET(12)\r
299 \r
300 /*-----------------------------------------\r
301  RES\r
302 -----------------------------------------*/\r
303 \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
311 \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
319 \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
327 \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
335 \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
343 \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
351 \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
359 \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
368                 RET(8)\r
369 \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
378                 adr = zHL;\r
379                 res = READ_MEM8(adr);\r
380                 res &= ~(1 << ((Opcode >> 3) & 7));\r
381                 WRITE_MEM8(adr, res);\r
382                 RET(15)\r
383 \r
384 /*-----------------------------------------\r
385  SET\r
386 -----------------------------------------*/\r
387 \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
395 \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
403 \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
411 \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
419 \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
427 \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
435 \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
443 \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
452                 RET(8)\r
453 \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
462                 adr = zHL;\r
463                 res = READ_MEM8(adr);\r
464                 res |= 1 << ((Opcode >> 3) & 7);\r
465                 WRITE_MEM8(adr, res);\r
466                 RET(15)\r
467 \r
468 #if !CZ80_USE_JUMPTABLE\r
469 }\r
470 #endif\r