Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libgambatte/src/cpu.cpp
2 views
1
/***************************************************************************
2
* Copyright (C) 2007 by Sindre Aamås *
3
* [email protected] *
4
* *
5
* This program is free software; you can redistribute it and/or modify *
6
* it under the terms of the GNU General Public License version 2 as *
7
* published by the Free Software Foundation. *
8
* *
9
* This program is distributed in the hope that it will be useful, *
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12
* GNU General Public License version 2 for more details. *
13
* *
14
* You should have received a copy of the GNU General Public License *
15
* version 2 along with this program; if not, write to the *
16
* Free Software Foundation, Inc., *
17
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
18
***************************************************************************/
19
#include "cpu.h"
20
#include "memory.h"
21
#include "savestate.h"
22
23
namespace gambatte {
24
25
CPU::CPU()
26
: memory(Interrupter(SP, PC)),
27
cycleCounter_(0),
28
PC(0x100),
29
SP(0xFFFE),
30
HF1(0xF),
31
HF2(0xF),
32
ZF(0),
33
CF(0x100),
34
A(0x01),
35
B(0x00),
36
C(0x13),
37
D(0x00),
38
E(0xD8),
39
H(0x01),
40
L(0x4D),
41
skip(false),
42
tracecallback(0)
43
{
44
}
45
46
long CPU::runFor(const unsigned long cycles) {
47
process(cycles/* << memory.isDoubleSpeed()*/);
48
49
const long csb = memory.cyclesSinceBlit(cycleCounter_);
50
51
if (cycleCounter_ & 0x80000000)
52
cycleCounter_ = memory.resetCounters(cycleCounter_);
53
54
return csb;
55
}
56
57
// (HF2 & 0x200) == true means HF is set.
58
// (HF2 & 0x400) marks the subtract flag.
59
// (HF2 & 0x800) is set for inc/dec.
60
// (HF2 & 0x100) is set if there's a carry to add.
61
static void calcHF(const unsigned HF1, unsigned& HF2) {
62
unsigned arg1 = HF1 & 0xF;
63
unsigned arg2 = (HF2 & 0xF) + (HF2 >> 8 & 1);
64
65
if (HF2 & 0x800) {
66
arg1 = arg2;
67
arg2 = 1;
68
}
69
70
if (HF2 & 0x400)
71
arg1 -= arg2;
72
else
73
arg1 = (arg1 + arg2) << 5;
74
75
HF2 |= arg1 & 0x200;
76
}
77
78
#define F() (((HF2 & 0x600) | (CF & 0x100)) >> 4 | ((ZF & 0xFF) ? 0 : 0x80))
79
80
#define FROM_F(f_in) do { \
81
unsigned from_f_var = f_in; \
82
\
83
ZF = ~from_f_var & 0x80; \
84
HF2 = from_f_var << 4 & 0x600; \
85
CF = from_f_var << 4 & 0x100; \
86
} while (0)
87
88
void CPU::setStatePtrs(SaveState &state) {
89
memory.setStatePtrs(state);
90
}
91
92
void CPU::loadState(const SaveState &state) {
93
memory.loadState(state/*, cycleCounter_*/);
94
95
cycleCounter_ = state.cpu.cycleCounter;
96
PC = state.cpu.PC & 0xFFFF;
97
SP = state.cpu.SP & 0xFFFF;
98
A = state.cpu.A & 0xFF;
99
B = state.cpu.B & 0xFF;
100
C = state.cpu.C & 0xFF;
101
D = state.cpu.D & 0xFF;
102
E = state.cpu.E & 0xFF;
103
FROM_F(state.cpu.F);
104
H = state.cpu.H & 0xFF;
105
L = state.cpu.L & 0xFF;
106
skip = state.cpu.skip;
107
}
108
109
#define BC() ( B << 8 | C )
110
#define DE() ( D << 8 | E )
111
#define HL() ( H << 8 | L )
112
113
#define READ(dest, addr) do { (dest) = memory.read(addr, cycleCounter); cycleCounter += 4; } while (0)
114
// #define PC_READ(dest, addr) do { (dest) = memory.pc_read(addr, cycleCounter); cycleCounter += 4; } while (0)
115
#define PC_READ(dest) do { (dest) = memory.read_excb(PC, cycleCounter, false); PC = (PC + 1) & 0xFFFF; cycleCounter += 4; } while (0)
116
#define PC_READ_FIRST(dest) do { (dest) = memory.read_excb(PC, cycleCounter, true); PC = (PC + 1) & 0xFFFF; cycleCounter += 4; } while (0)
117
#define FF_READ(dest, addr) do { (dest) = memory.ff_read(addr, cycleCounter); cycleCounter += 4; } while (0)
118
119
#define WRITE(addr, data) do { memory.write(addr, data, cycleCounter); cycleCounter += 4; } while (0)
120
#define FF_WRITE(addr, data) do { memory.ff_write(addr, data, cycleCounter); cycleCounter += 4; } while (0)
121
122
#define PC_MOD(data) do { PC = data; cycleCounter += 4; } while (0)
123
124
#define PUSH(r1, r2) do { \
125
SP = (SP - 1) & 0xFFFF; \
126
WRITE(SP, (r1)); \
127
SP = (SP - 1) & 0xFFFF; \
128
WRITE(SP, (r2)); \
129
} while (0)
130
131
//CB OPCODES (Shifts, rotates and bits):
132
//swap r (8 cycles):
133
//Swap upper and lower nibbles of 8-bit register, reset flags, check zero flag:
134
#define swap_r(r) do { \
135
CF = HF2 = 0; \
136
ZF = (r); \
137
(r) = (ZF << 4 | ZF >> 4) & 0xFF; \
138
} while (0)
139
140
//rlc r (8 cycles):
141
//Rotate 8-bit register left, store old bit7 in CF. Reset SF and HCF, Check ZF:
142
#define rlc_r(r) do { \
143
CF = (r) << 1; \
144
ZF = CF | CF >> 8; \
145
(r) = ZF & 0xFF; \
146
HF2 = 0; \
147
} while (0)
148
149
//rl r (8 cycles):
150
//Rotate 8-bit register left through CF, store old bit7 in CF, old CF value becomes bit0. Reset SF and HCF, Check ZF:
151
#define rl_r(r) do { \
152
const unsigned rl_r_var_oldcf = CF >> 8 & 1; \
153
CF = (r) << 1; \
154
ZF = CF | rl_r_var_oldcf; \
155
(r) = ZF & 0xFF; \
156
HF2 = 0; \
157
} while (0)
158
159
//rrc r (8 cycles):
160
//Rotate 8-bit register right, store old bit0 in CF. Reset SF and HCF, Check ZF:
161
#define rrc_r(r) do { \
162
ZF = (r); \
163
CF = ZF << 8; \
164
(r) = (ZF | CF) >> 1 & 0xFF; \
165
HF2 = 0; \
166
} while (0)
167
168
//rr r (8 cycles):
169
//Rotate 8-bit register right through CF, store old bit0 in CF, old CF value becomes bit7. Reset SF and HCF, Check ZF:
170
#define rr_r(r) do { \
171
const unsigned rr_r_var_oldcf = CF & 0x100; \
172
CF = (r) << 8; \
173
(r) = ZF = ((r) | rr_r_var_oldcf) >> 1; \
174
HF2 = 0; \
175
} while (0)
176
177
//sla r (8 cycles):
178
//Shift 8-bit register left, store old bit7 in CF. Reset SF and HCF, Check ZF:
179
#define sla_r(r) do { \
180
ZF = CF = (r) << 1; \
181
(r) = ZF & 0xFF; \
182
HF2 = 0; \
183
} while (0)
184
185
//sra r (8 cycles):
186
//Shift 8-bit register right, store old bit0 in CF. bit7=old bit7. Reset SF and HCF, Check ZF:
187
#define sra_r(r) do { \
188
CF = (r) << 8; \
189
ZF = (r) >> 1; \
190
(r) = ZF | ((r) & 0x80); \
191
HF2 = 0; \
192
} while (0)
193
194
//srl r (8 cycles):
195
//Shift 8-bit register right, store old bit0 in CF. Reset SF and HCF, Check ZF:
196
#define srl_r(r) do { \
197
ZF = (r); \
198
CF = (r) << 8; \
199
ZF >>= 1; \
200
(r) = ZF; \
201
HF2 = 0; \
202
} while (0)
203
204
//bit n,r (8 cycles):
205
//bit n,(hl) (12 cycles):
206
//Test bitn in 8-bit value, check ZF, unset SF, set HCF:
207
#define bitn_u8(bitmask, u8) do { \
208
ZF = (u8) & (bitmask); \
209
HF2 = 0x200; \
210
} while (0)
211
212
#define bit0_u8(u8) bitn_u8(1, (u8))
213
#define bit1_u8(u8) bitn_u8(2, (u8))
214
#define bit2_u8(u8) bitn_u8(4, (u8))
215
#define bit3_u8(u8) bitn_u8(8, (u8))
216
#define bit4_u8(u8) bitn_u8(0x10, (u8))
217
#define bit5_u8(u8) bitn_u8(0x20, (u8))
218
#define bit6_u8(u8) bitn_u8(0x40, (u8))
219
#define bit7_u8(u8) bitn_u8(0x80, (u8))
220
221
//set n,r (8 cycles):
222
//Set bitn of 8-bit register:
223
#define set0_r(r) ( (r) |= 0x1 )
224
#define set1_r(r) ( (r) |= 0x2 )
225
#define set2_r(r) ( (r) |= 0x4 )
226
#define set3_r(r) ( (r) |= 0x8 )
227
#define set4_r(r) ( (r) |= 0x10 )
228
#define set5_r(r) ( (r) |= 0x20 )
229
#define set6_r(r) ( (r) |= 0x40 )
230
#define set7_r(r) ( (r) |= 0x80 )
231
232
//set n,(hl) (16 cycles):
233
//Set bitn of value at address stored in HL:
234
#define setn_mem_hl(n) do { \
235
const unsigned setn_mem_hl_var_addr = HL(); \
236
unsigned setn_mem_hl_var_tmp; \
237
\
238
READ(setn_mem_hl_var_tmp, setn_mem_hl_var_addr); \
239
setn_mem_hl_var_tmp |= 1 << (n); \
240
\
241
WRITE(setn_mem_hl_var_addr, setn_mem_hl_var_tmp); \
242
} while (0)
243
244
//res n,r (8 cycles):
245
//Unset bitn of 8-bit register:
246
#define res0_r(r) ( (r) &= 0xFE )
247
#define res1_r(r) ( (r) &= 0xFD )
248
#define res2_r(r) ( (r) &= 0xFB )
249
#define res3_r(r) ( (r) &= 0xF7 )
250
#define res4_r(r) ( (r) &= 0xEF )
251
#define res5_r(r) ( (r) &= 0xDF )
252
#define res6_r(r) ( (r) &= 0xBF )
253
#define res7_r(r) ( (r) &= 0x7F )
254
255
//res n,(hl) (16 cycles):
256
//Unset bitn of value at address stored in HL:
257
#define resn_mem_hl(n) do { \
258
const unsigned resn_mem_hl_var_addr = HL(); \
259
unsigned resn_mem_hl_var_tmp; \
260
\
261
READ(resn_mem_hl_var_tmp, resn_mem_hl_var_addr); \
262
resn_mem_hl_var_tmp &= ~(1 << (n)); \
263
\
264
WRITE(resn_mem_hl_var_addr, resn_mem_hl_var_tmp); \
265
} while (0)
266
267
268
//16-BIT LOADS:
269
//ld rr,nn (12 cycles)
270
//set rr to 16-bit value of next 2 bytes in memory
271
#define ld_rr_nn(r1, r2) do { \
272
PC_READ(r2); \
273
PC_READ(r1); \
274
} while (0)
275
276
//push rr (16 cycles):
277
//Push value of register pair onto stack:
278
#define push_rr(r1, r2) do { \
279
PUSH(r1, r2); \
280
cycleCounter += 4; \
281
} while (0)
282
283
//pop rr (12 cycles):
284
//Pop two bytes off stack into register pair:
285
#define pop_rr(r1, r2) do { \
286
READ(r2, SP); \
287
SP = (SP + 1) & 0xFFFF; \
288
READ(r1, SP); \
289
SP = (SP + 1) & 0xFFFF; \
290
} while (0)
291
292
//8-BIT ALU:
293
//add a,r (4 cycles):
294
//add a,(addr) (8 cycles):
295
//Add 8-bit value to A, check flags:
296
#define add_a_u8(u8) do { \
297
HF1 = A; \
298
HF2 = u8; \
299
ZF = CF = A + HF2; \
300
A = ZF & 0xFF; \
301
} while (0)
302
303
//adc a,r (4 cycles):
304
//adc a,(addr) (8 cycles):
305
//Add 8-bit value+CF to A, check flags:
306
#define adc_a_u8(u8) do { \
307
HF1 = A; \
308
HF2 = (CF & 0x100) | (u8); \
309
ZF = CF = (CF >> 8 & 1) + (u8) + A; \
310
A = ZF & 0xFF; \
311
} while (0)
312
313
//sub a,r (4 cycles):
314
//sub a,(addr) (8 cycles):
315
//Subtract 8-bit value from A, check flags:
316
#define sub_a_u8(u8) do { \
317
HF1 = A; \
318
HF2 = u8; \
319
ZF = CF = A - HF2; \
320
A = ZF & 0xFF; \
321
HF2 |= 0x400; \
322
} while (0)
323
324
//sbc a,r (4 cycles):
325
//sbc a,(addr) (8 cycles):
326
//Subtract CF and 8-bit value from A, check flags:
327
#define sbc_a_u8(u8) do { \
328
HF1 = A; \
329
HF2 = 0x400 | (CF & 0x100) | (u8); \
330
ZF = CF = A - ((CF >> 8) & 1) - (u8); \
331
A = ZF & 0xFF; \
332
} while (0)
333
334
//and a,r (4 cycles):
335
//and a,(addr) (8 cycles):
336
//bitwise and 8-bit value into A, check flags:
337
#define and_a_u8(u8) do { \
338
HF2 = 0x200; \
339
CF = 0; \
340
A &= (u8); \
341
ZF = A; \
342
} while (0)
343
344
//or a,r (4 cycles):
345
//or a,(hl) (8 cycles):
346
//bitwise or 8-bit value into A, check flags:
347
#define or_a_u8(u8) do { \
348
CF = HF2 = 0; \
349
A |= (u8); \
350
ZF = A; \
351
} while (0)
352
353
//xor a,r (4 cycles):
354
//xor a,(hl) (8 cycles):
355
//bitwise xor 8-bit value into A, check flags:
356
#define xor_a_u8(u8) do { \
357
CF = HF2 = 0; \
358
A ^= (u8); \
359
ZF = A; \
360
} while (0)
361
362
//cp a,r (4 cycles):
363
//cp a,(addr) (8 cycles):
364
//Compare (subtract without storing result) 8-bit value to A, check flags:
365
#define cp_a_u8(u8) do { \
366
HF1 = A; \
367
HF2 = u8; \
368
ZF = CF = A - HF2; \
369
HF2 |= 0x400; \
370
} while (0)
371
372
//inc r (4 cycles):
373
//Increment value of 8-bit register, check flags except CF:
374
#define inc_r(r) do { \
375
HF2 = (r) | 0x800; \
376
ZF = (r) + 1; \
377
(r) = ZF & 0xFF; \
378
} while (0)
379
380
//dec r (4 cycles):
381
//Decrement value of 8-bit register, check flags except CF:
382
#define dec_r(r) do { \
383
HF2 = (r) | 0xC00; \
384
ZF = (r) - 1; \
385
(r) = ZF & 0xFF; \
386
} while (0)
387
388
//16-BIT ARITHMETIC
389
//add hl,rr (8 cycles):
390
//add 16-bit register to HL, check flags except ZF:
391
/*#define add_hl_rr(rh, rl) do { \
392
L = HF1 = L + (rl); \
393
HF1 >>= 8; \
394
HF1 += H; \
395
HF2 = (rh); \
396
H = CF = HF1 + (rh); \
397
cycleCounter += 4; \
398
} while (0)*/
399
400
#define add_hl_rr(rh, rl) do { \
401
CF = L + (rl); \
402
L = CF & 0xFF; \
403
HF1 = H; \
404
HF2 = (CF & 0x100) | (rh); \
405
CF = H + (CF >> 8) + (rh); \
406
H = CF & 0xFF; \
407
cycleCounter += 4; \
408
} while (0)
409
410
//inc rr (8 cycles):
411
//Increment 16-bit register:
412
#define inc_rr(rh, rl) do { \
413
const unsigned inc_rr_var_tmp = (rl) + 1; \
414
(rl) = inc_rr_var_tmp & 0xFF; \
415
(rh) = ((rh) + (inc_rr_var_tmp >> 8)) & 0xFF; \
416
cycleCounter += 4; \
417
} while (0)
418
419
//dec rr (8 cycles):
420
//Decrement 16-bit register:
421
#define dec_rr(rh, rl) do { \
422
const unsigned dec_rr_var_tmp = (rl) - 1; \
423
(rl) = dec_rr_var_tmp & 0xFF; \
424
(rh) = ((rh) - (dec_rr_var_tmp >> 8 & 1)) & 0xFF; \
425
cycleCounter += 4; \
426
} while (0)
427
428
#define sp_plus_n(sumout) do { \
429
unsigned sp_plus_n_var_n; \
430
PC_READ(sp_plus_n_var_n); \
431
sp_plus_n_var_n = (sp_plus_n_var_n ^ 0x80) - 0x80; \
432
\
433
const unsigned sp_plus_n_var_sum = SP + sp_plus_n_var_n; \
434
CF = SP ^ sp_plus_n_var_n ^ sp_plus_n_var_sum; \
435
HF2 = CF << 5 & 0x200; \
436
ZF = 1; \
437
cycleCounter += 4; \
438
(sumout) = sp_plus_n_var_sum & 0xFFFF; \
439
} while (0)
440
441
//JUMPS:
442
//jp nn (16 cycles):
443
//Jump to address stored in the next two bytes in memory:
444
#define jp_nn() do { \
445
unsigned jp_nn_var_l, jp_nn_var_h; \
446
\
447
PC_READ(jp_nn_var_l); \
448
PC_READ(jp_nn_var_h); \
449
\
450
PC_MOD(jp_nn_var_h << 8 | jp_nn_var_l); \
451
} while (0)
452
453
//jr disp (12 cycles):
454
//Jump to value of next (signed) byte in memory+current address:
455
#define jr_disp() do { \
456
unsigned jr_disp_var_tmp; \
457
\
458
PC_READ(jr_disp_var_tmp); \
459
jr_disp_var_tmp = (jr_disp_var_tmp ^ 0x80) - 0x80; \
460
\
461
PC_MOD((PC + jr_disp_var_tmp) & 0xFFFF); \
462
} while (0)
463
464
// CALLS, RESTARTS AND RETURNS:
465
// call nn (24 cycles):
466
// Jump to 16-bit immediate operand and push return address onto stack:
467
#define call_nn() do { \
468
unsigned const npc = (PC + 2) & 0xFFFF; \
469
jp_nn(); \
470
PUSH(npc >> 8, npc & 0xFF); \
471
} while (0)
472
473
//rst n (16 Cycles):
474
//Push present address onto stack, jump to address n (one of 00h,08h,10h,18h,20h,28h,30h,38h):
475
#define rst_n(n) do { \
476
PUSH(PC >> 8, PC & 0xFF); \
477
PC_MOD(n); \
478
} while (0)
479
480
//ret (16 cycles):
481
//Pop two bytes from the stack and jump to that address:
482
#define ret() do { \
483
unsigned ret_var_l, ret_var_h; \
484
\
485
pop_rr(ret_var_h, ret_var_l); \
486
\
487
PC_MOD(ret_var_h << 8 | ret_var_l); \
488
} while (0)
489
490
void CPU::process(const unsigned long cycles) {
491
memory.setEndtime(cycleCounter_, cycles);
492
memory.updateInput();
493
494
//unsigned char A = A_;
495
unsigned long cycleCounter = cycleCounter_;
496
497
while (memory.isActive()) {
498
//unsigned short PC = PC_;
499
500
if (memory.halted()) {
501
if (cycleCounter < memory.nextEventTime()) {
502
const unsigned long cycles = memory.nextEventTime() - cycleCounter;
503
cycleCounter += cycles + (-cycles & 3);
504
}
505
} else while (cycleCounter < memory.nextEventTime()) {
506
unsigned char opcode;
507
508
if (tracecallback) {
509
int result[14];
510
result[0] = cycleCounter;
511
result[1] = PC;
512
result[2] = SP;
513
result[3] = A;
514
result[4] = B;
515
result[5] = C;
516
result[6] = D;
517
result[7] = E;
518
result[8] = F();
519
result[9] = H;
520
result[10] = L;
521
result[11] = skip;
522
PC_READ_FIRST(opcode);
523
result[12] = opcode;
524
result[13] = memory.debugGetLY();
525
tracecallback((void *)result);
526
}
527
else {
528
PC_READ_FIRST(opcode);
529
}
530
531
if (skip) {
532
PC = (PC - 1) & 0xFFFF;
533
skip = false;
534
}
535
536
switch (opcode) {
537
//nop (4 cycles):
538
//Do nothing for 4 cycles:
539
case 0x00:
540
break;
541
case 0x01:
542
ld_rr_nn(B, C);
543
break;
544
case 0x02:
545
WRITE(BC(), A);
546
break;
547
case 0x03:
548
inc_rr(B, C);
549
break;
550
case 0x04:
551
inc_r(B);
552
break;
553
case 0x05:
554
dec_r(B);
555
break;
556
case 0x06:
557
PC_READ(B);
558
break;
559
560
//rlca (4 cycles):
561
//Rotate 8-bit register A left, store old bit7 in CF. Reset SF, HCF, ZF:
562
case 0x07:
563
CF = A << 1;
564
A = (CF | CF >> 8) & 0xFF;
565
HF2 = 0;
566
ZF = 1;
567
break;
568
569
//ld (nn),SP (20 cycles):
570
//Put value of SP into address given by next 2 bytes in memory:
571
case 0x08:
572
{
573
unsigned l, h;
574
575
PC_READ(l);
576
PC_READ(h);
577
578
const unsigned addr = h << 8 | l;
579
580
WRITE(addr, SP & 0xFF);
581
WRITE((addr + 1) & 0xFFFF, SP >> 8);
582
}
583
break;
584
585
case 0x09:
586
add_hl_rr(B, C);
587
break;
588
case 0x0A:
589
READ(A, BC());
590
break;
591
case 0x0B:
592
dec_rr(B, C);
593
break;
594
case 0x0C:
595
inc_r(C);
596
break;
597
case 0x0D:
598
dec_r(C);
599
break;
600
case 0x0E:
601
PC_READ(C);
602
break;
603
604
//rrca (4 cycles):
605
//Rotate 8-bit register A right, store old bit0 in CF. Reset SF, HCF, ZF:
606
case 0x0F:
607
CF = A << 8 | A;
608
A = CF >> 1 & 0xFF;
609
HF2 = 0;
610
ZF = 1;
611
break;
612
613
//stop (4 cycles):
614
//Halt CPU and LCD display until button pressed:
615
case 0x10:
616
PC = (PC + 1) & 0xFFFF;
617
618
cycleCounter = memory.stop(cycleCounter);
619
620
if (cycleCounter < memory.nextEventTime()) {
621
const unsigned long cycles = memory.nextEventTime() - cycleCounter;
622
cycleCounter += cycles + (-cycles & 3);
623
}
624
625
break;
626
case 0x11:
627
ld_rr_nn(D, E);
628
break;
629
case 0x12:
630
WRITE(DE(), A);
631
break;
632
case 0x13:
633
inc_rr(D, E);
634
break;
635
case 0x14:
636
inc_r(D);
637
break;
638
case 0x15:
639
dec_r(D);
640
break;
641
case 0x16:
642
PC_READ(D);
643
break;
644
645
//rla (4 cycles):
646
//Rotate 8-bit register A left through CF, store old bit7 in CF, old CF value becomes bit0. Reset SF, HCF, ZF:
647
case 0x17:
648
{
649
const unsigned oldcf = CF >> 8 & 1;
650
CF = A << 1;
651
A = (CF | oldcf) & 0xFF;
652
}
653
654
HF2 = 0;
655
ZF = 1;
656
break;
657
658
case 0x18:
659
jr_disp();
660
break;
661
case 0x19:
662
add_hl_rr(D, E);
663
break;
664
case 0x1A:
665
READ(A, DE());
666
break;
667
case 0x1B:
668
dec_rr(D, E);
669
break;
670
case 0x1C:
671
inc_r(E);
672
break;
673
case 0x1D:
674
dec_r(E);
675
break;
676
case 0x1E:
677
PC_READ(E);
678
break;
679
680
//rra (4 cycles):
681
//Rotate 8-bit register A right through CF, store old bit0 in CF, old CF value becomes bit7. Reset SF, HCF, ZF:
682
case 0x1F:
683
{
684
const unsigned oldcf = CF & 0x100;
685
CF = A << 8;
686
A = (A | oldcf) >> 1;
687
}
688
689
HF2 = 0;
690
ZF = 1;
691
break;
692
693
//jr nz,disp (12;8 cycles):
694
//Jump to value of next (signed) byte in memory+current address if ZF is unset:
695
case 0x20:
696
if (ZF & 0xFF) {
697
jr_disp();
698
} else {
699
PC_MOD((PC + 1) & 0xFFFF);
700
}
701
break;
702
703
case 0x21:
704
ld_rr_nn(H, L);
705
break;
706
707
//ldi (hl),a (8 cycles):
708
//Put A into memory address in hl. Increment HL:
709
case 0x22:
710
{
711
unsigned addr = HL();
712
713
WRITE(addr, A);
714
715
addr = (addr + 1) & 0xFFFF;
716
L = addr;
717
H = addr >> 8;
718
}
719
break;
720
721
case 0x23:
722
inc_rr(H, L);
723
break;
724
case 0x24:
725
inc_r(H);
726
break;
727
case 0x25:
728
dec_r(H);
729
break;
730
case 0x26:
731
PC_READ(H);
732
break;
733
734
735
//daa (4 cycles):
736
//Adjust register A to correctly represent a BCD. Check ZF, HF and CF:
737
case 0x27:
738
/*{
739
unsigned correction = ((A > 0x99) || (CF & 0x100)) ? 0x60 : 0x00;
740
741
calcHF(HF1, HF2);
742
743
if ((A & 0x0F) > 0x09 || (HF2 & 0x200))
744
correction |= 0x06;
745
746
HF1 = A;
747
HF2 = (HF2 & 0x400) | correction;
748
CF = (correction & 0x40) << 2;
749
A = (HF2 & 0x400) ? A - correction : (A + correction);
750
ZF = A;
751
}*/
752
753
calcHF(HF1, HF2);
754
755
{
756
unsigned correction = (CF & 0x100) ? 0x60 : 0x00;
757
758
if (HF2 & 0x200)
759
correction |= 0x06;
760
761
if (!(HF2 &= 0x400)) {
762
if ((A & 0x0F) > 0x09)
763
correction |= 0x06;
764
765
if (A > 0x99)
766
correction |= 0x60;
767
768
A += correction;
769
} else
770
A -= correction;
771
772
CF = correction << 2 & 0x100;
773
ZF = A;
774
A &= 0xFF;
775
}
776
break;
777
778
//jr z,disp (12;8 cycles):
779
//Jump to value of next (signed) byte in memory+current address if ZF is set:
780
case 0x28:
781
if (ZF & 0xFF) {
782
PC_MOD((PC + 1) & 0xFFFF);
783
} else {
784
jr_disp();
785
}
786
break;
787
788
//add hl,hl (8 cycles):
789
//add 16-bit register HL to HL, check flags except ZF:
790
case 0x29:
791
add_hl_rr(H, L);
792
break;
793
794
//ldi a,(hl) (8 cycles):
795
//Put value at address in hl into A. Increment HL:
796
case 0x2A:
797
{
798
unsigned addr = HL();
799
800
READ(A, addr);
801
802
addr = (addr + 1) & 0xFFFF;
803
L = addr;
804
H = addr >> 8;
805
}
806
break;
807
808
case 0x2B:
809
dec_rr(H, L);
810
break;
811
case 0x2C:
812
inc_r(L);
813
break;
814
case 0x2D:
815
dec_r(L);
816
break;
817
case 0x2E:
818
PC_READ(L);
819
break;
820
821
//cpl (4 cycles):
822
//Complement register A. (Flip all bits), set SF and HCF:
823
case 0x2F: /*setSubtractFlag(); setHalfCarryFlag();*/
824
HF2 = 0x600;
825
A ^= 0xFF;
826
break;
827
828
//jr nc,disp (12;8 cycles):
829
//Jump to value of next (signed) byte in memory+current address if CF is unset:
830
case 0x30:
831
if (CF & 0x100) {
832
PC_MOD((PC + 1) & 0xFFFF);
833
} else {
834
jr_disp();
835
}
836
break;
837
838
//ld sp,nn (12 cycles)
839
//set sp to 16-bit value of next 2 bytes in memory
840
case 0x31:
841
{
842
unsigned l, h;
843
844
PC_READ(l);
845
PC_READ(h);
846
847
SP = h << 8 | l;
848
}
849
break;
850
851
//ldd (hl),a (8 cycles):
852
//Put A into memory address in hl. Decrement HL:
853
case 0x32:
854
{
855
unsigned addr = HL();
856
857
WRITE(addr, A);
858
859
addr = (addr - 1) & 0xFFFF;
860
L = addr;
861
H = addr >> 8;
862
}
863
break;
864
865
case 0x33:
866
SP = (SP + 1) & 0xFFFF;
867
cycleCounter += 4;
868
break;
869
870
//inc (hl) (12 cycles):
871
//Increment value at address in hl, check flags except CF:
872
case 0x34:
873
{
874
const unsigned addr = HL();
875
876
READ(HF2, addr);
877
ZF = HF2 + 1;
878
WRITE(addr, ZF & 0xFF);
879
HF2 |= 0x800;
880
}
881
break;
882
883
//dec (hl) (12 cycles):
884
//Decrement value at address in hl, check flags except CF:
885
case 0x35:
886
{
887
const unsigned addr = HL();
888
889
READ(HF2, addr);
890
ZF = HF2 - 1;
891
WRITE(addr, ZF & 0xFF);
892
HF2 |= 0xC00;
893
}
894
break;
895
896
//ld (hl),n (12 cycles):
897
//set memory at address in hl to value of next byte in memory:
898
case 0x36:
899
{
900
unsigned tmp;
901
902
PC_READ(tmp);
903
WRITE(HL(), tmp);
904
}
905
break;
906
907
//scf (4 cycles):
908
//Set CF. Unset SF and HCF:
909
case 0x37: /*setCarryFlag(); unsetSubtractFlag(); unsetHalfCarryFlag();*/
910
CF = 0x100;
911
HF2 = 0;
912
break;
913
914
//jr c,disp (12;8 cycles):
915
//Jump to value of next (signed) byte in memory+current address if CF is set:
916
case 0x38: //PC+=(((int8_t)memory.read(PC++))*CarryFlag()); Cycles(8); break;
917
if (CF & 0x100) {
918
jr_disp();
919
} else {
920
PC_MOD((PC + 1) & 0xFFFF);
921
}
922
break;
923
924
//add hl,sp (8 cycles):
925
//add SP to HL, check flags except ZF:
926
case 0x39: /*add_hl_rr(SP>>8, SP); break;*/
927
CF = L + SP;
928
L = CF & 0xFF;
929
HF1 = H;
930
HF2 = ((CF ^ SP) & 0x100) | SP >> 8;
931
CF >>= 8;
932
CF += H;
933
H = CF & 0xFF;
934
cycleCounter += 4;
935
break;
936
937
//ldd a,(hl) (8 cycles):
938
//Put value at address in hl into A. Decrement HL:
939
case 0x3A:
940
{
941
unsigned addr = HL();
942
943
A = memory.read(addr, cycleCounter);
944
cycleCounter += 4;
945
946
addr = (addr - 1) & 0xFFFF;
947
L = addr;
948
H = addr >> 8;
949
}
950
break;
951
952
case 0x3B:
953
SP = (SP - 1) & 0xFFFF;
954
cycleCounter += 4;
955
break;
956
case 0x3C:
957
inc_r(A);
958
break;
959
case 0x3D:
960
dec_r(A);
961
break;
962
case 0x3E:
963
PC_READ(A);
964
break;
965
966
//ccf (4 cycles):
967
//Complement CF (unset if set vv.) Unset SF and HCF.
968
case 0x3F: /*complementCarryFlag(); unsetSubtractFlag(); unsetHalfCarryFlag();*/
969
CF ^= 0x100;
970
HF2 = 0;
971
break;
972
973
//ld r,r (4 cycles):next_irqEventTime
974
//ld r,(r) (8 cycles):
975
case 0x40:
976
B = B;
977
break;
978
case 0x41:
979
B = C;
980
break;
981
case 0x42:
982
B = D;
983
break;
984
case 0x43:
985
B = E;
986
break;
987
case 0x44:
988
B = H;
989
break;
990
case 0x45:
991
B = L;
992
break;
993
case 0x46:
994
READ(B, HL());
995
break;
996
case 0x47:
997
B = A;
998
break;
999
case 0x48:
1000
C = B;
1001
break;
1002
case 0x49:
1003
C = C;
1004
break;
1005
case 0x4A:
1006
C = D;
1007
break;
1008
case 0x4B:
1009
C = E;
1010
break;
1011
case 0x4C:
1012
C = H;
1013
break;
1014
case 0x4D:
1015
C = L;
1016
break;
1017
case 0x4E:
1018
READ(C, HL());
1019
break;
1020
case 0x4F:
1021
C = A;
1022
break;
1023
case 0x50:
1024
D = B;
1025
break;
1026
case 0x51:
1027
D = C;
1028
break;
1029
case 0x52:
1030
D = D;
1031
break;
1032
case 0x53:
1033
D = E;
1034
break;
1035
case 0x54:
1036
D = H;
1037
break;
1038
case 0x55:
1039
D = L;
1040
break;
1041
case 0x56:
1042
READ(D, HL());
1043
break;
1044
case 0x57:
1045
D = A;
1046
break;
1047
case 0x58:
1048
E = B;
1049
break;
1050
case 0x59:
1051
E = C;
1052
break;
1053
case 0x5A:
1054
E = D;
1055
break;
1056
case 0x5B:
1057
E = E;
1058
break;
1059
case 0x5C:
1060
E = H;
1061
break;
1062
case 0x5D:
1063
E = L;
1064
break;
1065
case 0x5E:
1066
READ(E, HL());
1067
break;
1068
case 0x5F:
1069
E = A;
1070
break;
1071
case 0x60:
1072
H = B;
1073
break;
1074
case 0x61:
1075
H = C;
1076
break;
1077
case 0x62:
1078
H = D;
1079
break;
1080
case 0x63:
1081
H = E;
1082
break;
1083
case 0x64:
1084
H = H;
1085
break;
1086
case 0x65:
1087
H = L;
1088
break;
1089
case 0x66:
1090
READ(H, HL());
1091
break;
1092
case 0x67:
1093
H = A;
1094
break;
1095
case 0x68:
1096
L = B;
1097
break;
1098
case 0x69:
1099
L = C;
1100
break;
1101
case 0x6A:
1102
L = D;
1103
break;
1104
case 0x6B:
1105
L = E;
1106
break;
1107
case 0x6C:
1108
L = H;
1109
break;
1110
case 0x6D:
1111
L = L;
1112
break;
1113
case 0x6E:
1114
READ(L, HL());
1115
break;
1116
case 0x6F:
1117
L = A;
1118
break;
1119
case 0x70:
1120
WRITE(HL(), B);
1121
break;
1122
case 0x71:
1123
WRITE(HL(), C);
1124
break;
1125
case 0x72:
1126
WRITE(HL(), D);
1127
break;
1128
case 0x73:
1129
WRITE(HL(), E);
1130
break;
1131
case 0x74:
1132
WRITE(HL(), H);
1133
break;
1134
case 0x75:
1135
WRITE(HL(), L);
1136
break;
1137
1138
//halt (4 cycles):
1139
case 0x76:
1140
if (!memory.ime() && (memory.ff_read(0xFF0F, cycleCounter) & memory.ff_read(0xFFFF, cycleCounter) & 0x1F)) {
1141
if (memory.isCgb())
1142
cycleCounter += 4;
1143
else
1144
skip = true;
1145
} else {
1146
memory.halt();
1147
1148
if (cycleCounter < memory.nextEventTime()) {
1149
const unsigned long cycles = memory.nextEventTime() - cycleCounter;
1150
cycleCounter += cycles + (-cycles & 3);
1151
}
1152
}
1153
1154
break;
1155
case 0x77:
1156
WRITE(HL(), A);
1157
break;
1158
case 0x78:
1159
A = B;
1160
break;
1161
case 0x79:
1162
A = C;
1163
break;
1164
case 0x7A:
1165
A = D;
1166
break;
1167
case 0x7B:
1168
A = E;
1169
break;
1170
case 0x7C:
1171
A = H;
1172
break;
1173
case 0x7D:
1174
A = L;
1175
break;
1176
case 0x7E:
1177
READ(A, HL());
1178
break;
1179
case 0x7F:
1180
// A = A;
1181
break;
1182
case 0x80:
1183
add_a_u8(B);
1184
break;
1185
case 0x81:
1186
add_a_u8(C);
1187
break;
1188
case 0x82:
1189
add_a_u8(D);
1190
break;
1191
case 0x83:
1192
add_a_u8(E);
1193
break;
1194
case 0x84:
1195
add_a_u8(H);
1196
break;
1197
case 0x85:
1198
add_a_u8(L);
1199
break;
1200
case 0x86:
1201
{
1202
unsigned data;
1203
1204
READ(data, HL());
1205
1206
add_a_u8(data);
1207
}
1208
break;
1209
case 0x87:
1210
add_a_u8(A);
1211
break;
1212
case 0x88:
1213
adc_a_u8(B);
1214
break;
1215
case 0x89:
1216
adc_a_u8(C);
1217
break;
1218
case 0x8A:
1219
adc_a_u8(D);
1220
break;
1221
case 0x8B:
1222
adc_a_u8(E);
1223
break;
1224
case 0x8C:
1225
adc_a_u8(H);
1226
break;
1227
case 0x8D:
1228
adc_a_u8(L);
1229
break;
1230
case 0x8E:
1231
{
1232
unsigned data;
1233
1234
READ(data, HL());
1235
1236
adc_a_u8(data);
1237
}
1238
break;
1239
case 0x8F:
1240
adc_a_u8(A);
1241
break;
1242
case 0x90:
1243
sub_a_u8(B);
1244
break;
1245
case 0x91:
1246
sub_a_u8(C);
1247
break;
1248
case 0x92:
1249
sub_a_u8(D);
1250
break;
1251
case 0x93:
1252
sub_a_u8(E);
1253
break;
1254
case 0x94:
1255
sub_a_u8(H);
1256
break;
1257
case 0x95:
1258
sub_a_u8(L);
1259
break;
1260
case 0x96:
1261
{
1262
unsigned data;
1263
1264
READ(data, HL());
1265
1266
sub_a_u8(data);
1267
}
1268
break;
1269
//A-A is always 0:
1270
case 0x97:
1271
HF2 = 0x400;
1272
CF = ZF = A = 0;
1273
break;
1274
case 0x98:
1275
sbc_a_u8(B);
1276
break;
1277
case 0x99:
1278
sbc_a_u8(C);
1279
break;
1280
case 0x9A:
1281
sbc_a_u8(D);
1282
break;
1283
case 0x9B:
1284
sbc_a_u8(E);
1285
break;
1286
case 0x9C:
1287
sbc_a_u8(H);
1288
break;
1289
case 0x9D:
1290
sbc_a_u8(L);
1291
break;
1292
case 0x9E:
1293
{
1294
unsigned data;
1295
1296
READ(data, HL());
1297
1298
sbc_a_u8(data);
1299
}
1300
break;
1301
case 0x9F:
1302
sbc_a_u8(A);
1303
break;
1304
case 0xA0:
1305
and_a_u8(B);
1306
break;
1307
case 0xA1:
1308
and_a_u8(C);
1309
break;
1310
case 0xA2:
1311
and_a_u8(D);
1312
break;
1313
case 0xA3:
1314
and_a_u8(E);
1315
break;
1316
case 0xA4:
1317
and_a_u8(H);
1318
break;
1319
case 0xA5:
1320
and_a_u8(L);
1321
break;
1322
case 0xA6:
1323
{
1324
unsigned data;
1325
1326
READ(data, HL());
1327
1328
and_a_u8(data);
1329
}
1330
break;
1331
//A&A will always be A:
1332
case 0xA7:
1333
ZF = A;
1334
CF = 0;
1335
HF2 = 0x200;
1336
break;
1337
case 0xA8:
1338
xor_a_u8(B);
1339
break;
1340
case 0xA9:
1341
xor_a_u8(C);
1342
break;
1343
case 0xAA:
1344
xor_a_u8(D);
1345
break;
1346
case 0xAB:
1347
xor_a_u8(E);
1348
break;
1349
case 0xAC:
1350
xor_a_u8(H);
1351
break;
1352
case 0xAD:
1353
xor_a_u8(L);
1354
break;
1355
case 0xAE:
1356
{
1357
unsigned data;
1358
1359
READ(data, HL());
1360
1361
xor_a_u8(data);
1362
}
1363
break;
1364
//A^A will always be 0:
1365
case 0xAF:
1366
CF = HF2 = ZF = A = 0;
1367
break;
1368
case 0xB0:
1369
or_a_u8(B);
1370
break;
1371
case 0xB1:
1372
or_a_u8(C);
1373
break;
1374
case 0xB2:
1375
or_a_u8(D);
1376
break;
1377
case 0xB3:
1378
or_a_u8(E);
1379
break;
1380
case 0xB4:
1381
or_a_u8(H);
1382
break;
1383
case 0xB5:
1384
or_a_u8(L);
1385
break;
1386
case 0xB6:
1387
{
1388
unsigned data;
1389
1390
READ(data, HL());
1391
1392
or_a_u8(data);
1393
}
1394
break;
1395
//A|A will always be A:
1396
case 0xB7:
1397
ZF = A;
1398
HF2 = CF = 0;
1399
break;
1400
case 0xB8:
1401
cp_a_u8(B);
1402
break;
1403
case 0xB9:
1404
cp_a_u8(C);
1405
break;
1406
case 0xBA:
1407
cp_a_u8(D);
1408
break;
1409
case 0xBB:
1410
cp_a_u8(E);
1411
break;
1412
case 0xBC:
1413
cp_a_u8(H);
1414
break;
1415
case 0xBD:
1416
cp_a_u8(L);
1417
break;
1418
case 0xBE:
1419
{
1420
unsigned data;
1421
1422
READ(data, HL());
1423
1424
cp_a_u8(data);
1425
}
1426
break;
1427
//A always equals A:
1428
case 0xBF:
1429
CF = ZF = 0;
1430
HF2 = 0x400;
1431
break;
1432
1433
//ret nz (20;8 cycles):
1434
//Pop two bytes from the stack and jump to that address, if ZF is unset:
1435
case 0xC0:
1436
cycleCounter += 4;
1437
1438
if (ZF & 0xFF) {
1439
ret();
1440
}
1441
break;
1442
1443
case 0xC1:
1444
pop_rr(B, C);
1445
break;
1446
1447
//jp nz,nn (16;12 cycles):
1448
//Jump to address stored in next two bytes in memory if ZF is unset:
1449
case 0xC2:
1450
if (ZF & 0xFF) {
1451
jp_nn();
1452
} else {
1453
PC_MOD((PC + 2) & 0xFFFF);
1454
cycleCounter += 4;
1455
}
1456
break;
1457
1458
case 0xC3:
1459
jp_nn();
1460
break;
1461
1462
//call nz,nn (24;12 cycles):
1463
//Push address of next instruction onto stack and then jump to address stored in next two bytes in memory, if ZF is unset:
1464
case 0xC4:
1465
if (ZF & 0xFF) {
1466
call_nn();
1467
} else {
1468
PC_MOD((PC + 2) & 0xFFFF);
1469
cycleCounter += 4;
1470
}
1471
break;
1472
1473
case 0xC5:
1474
push_rr(B, C);
1475
break;
1476
case 0xC6:
1477
{
1478
unsigned data;
1479
1480
PC_READ(data);
1481
1482
add_a_u8(data);
1483
}
1484
break;
1485
case 0xC7:
1486
rst_n(0x00);
1487
break;
1488
1489
//ret z (20;8 cycles):
1490
//Pop two bytes from the stack and jump to that address, if ZF is set:
1491
case 0xC8:
1492
cycleCounter += 4;
1493
1494
if (!(ZF & 0xFF)) {
1495
ret();
1496
}
1497
1498
break;
1499
1500
//ret (16 cycles):
1501
//Pop two bytes from the stack and jump to that address:
1502
case 0xC9:
1503
ret();
1504
break;
1505
1506
//jp z,nn (16;12 cycles):
1507
//Jump to address stored in next two bytes in memory if ZF is set:
1508
case 0xCA:
1509
if (ZF & 0xFF) {
1510
PC_MOD((PC + 2) & 0xFFFF);
1511
cycleCounter += 4;
1512
} else {
1513
jp_nn();
1514
}
1515
break;
1516
1517
1518
//CB OPCODES (Shifts, rotates and bits):
1519
case 0xCB:
1520
PC_READ(opcode);
1521
1522
switch (opcode) {
1523
case 0x00:
1524
rlc_r(B);
1525
break;
1526
case 0x01:
1527
rlc_r(C);
1528
break;
1529
case 0x02:
1530
rlc_r(D);
1531
break;
1532
case 0x03:
1533
rlc_r(E);
1534
break;
1535
case 0x04:
1536
rlc_r(H);
1537
break;
1538
case 0x05:
1539
rlc_r(L);
1540
break;
1541
//rlc (hl) (16 cycles):
1542
//Rotate 8-bit value stored at address in HL left, store old bit7 in CF. Reset SF and HCF. Check ZF:
1543
case 0x06:
1544
{
1545
const unsigned addr = HL();
1546
1547
READ(CF, addr);
1548
CF <<= 1;
1549
1550
ZF = CF | (CF >> 8);
1551
1552
WRITE(addr, ZF & 0xFF);
1553
1554
HF2 = 0;
1555
}
1556
break;
1557
case 0x07:
1558
rlc_r(A);
1559
break;
1560
case 0x08:
1561
rrc_r(B);
1562
break;
1563
case 0x09:
1564
rrc_r(C);
1565
break;
1566
case 0x0A:
1567
rrc_r(D);
1568
break;
1569
case 0x0B:
1570
rrc_r(E);
1571
break;
1572
case 0x0C:
1573
rrc_r(H);
1574
break;
1575
case 0x0D:
1576
rrc_r(L);
1577
break;
1578
//rrc (hl) (16 cycles):
1579
//Rotate 8-bit value stored at address in HL right, store old bit0 in CF. Reset SF and HCF. Check ZF:
1580
case 0x0E:
1581
{
1582
const unsigned addr = HL();
1583
1584
READ(ZF, addr);
1585
1586
CF = ZF << 8;
1587
1588
WRITE(addr, (ZF | CF) >> 1 & 0xFF);
1589
1590
HF2 = 0;
1591
}
1592
break;
1593
case 0x0F:
1594
rrc_r(A);
1595
break;
1596
case 0x10:
1597
rl_r(B);
1598
break;
1599
case 0x11:
1600
rl_r(C);
1601
break;
1602
case 0x12:
1603
rl_r(D);
1604
break;
1605
case 0x13:
1606
rl_r(E);
1607
break;
1608
case 0x14:
1609
rl_r(H);
1610
break;
1611
case 0x15:
1612
rl_r(L);
1613
break;
1614
//rl (hl) (16 cycles):
1615
//Rotate 8-bit value stored at address in HL left thorugh CF, store old bit7 in CF, old CF value becoms bit0. Reset SF and HCF. Check ZF:
1616
case 0x16:
1617
{
1618
const unsigned addr = HL();
1619
const unsigned oldcf = CF >> 8 & 1;
1620
1621
READ(CF, addr);
1622
CF <<= 1;
1623
1624
ZF = CF | oldcf;
1625
1626
WRITE(addr, ZF & 0xFF);
1627
1628
HF2 = 0;
1629
}
1630
break;
1631
case 0x17:
1632
rl_r(A);
1633
break;
1634
case 0x18:
1635
rr_r(B);
1636
break;
1637
case 0x19:
1638
rr_r(C);
1639
break;
1640
case 0x1A:
1641
rr_r(D);
1642
break;
1643
case 0x1B:
1644
rr_r(E);
1645
break;
1646
case 0x1C:
1647
rr_r(H);
1648
break;
1649
case 0x1D:
1650
rr_r(L);
1651
break;
1652
//rr (hl) (16 cycles):
1653
//Rotate 8-bit value stored at address in HL right thorugh CF, store old bit0 in CF, old CF value becoms bit7. Reset SF and HCF. Check ZF:
1654
case 0x1E:
1655
{
1656
const unsigned addr = HL();
1657
1658
READ(ZF, addr);
1659
1660
const unsigned oldcf = CF & 0x100;
1661
CF = ZF << 8;
1662
ZF = (ZF | oldcf) >> 1;
1663
1664
WRITE(addr, ZF);
1665
1666
HF2 = 0;
1667
}
1668
break;
1669
case 0x1F:
1670
rr_r(A);
1671
break;
1672
case 0x20:
1673
sla_r(B);
1674
break;
1675
case 0x21:
1676
sla_r(C);
1677
break;
1678
case 0x22:
1679
sla_r(D);
1680
break;
1681
case 0x23:
1682
sla_r(E);
1683
break;
1684
case 0x24:
1685
sla_r(H);
1686
break;
1687
case 0x25:
1688
sla_r(L);
1689
break;
1690
//sla (hl) (16 cycles):
1691
//Shift 8-bit value stored at address in HL left, store old bit7 in CF. Reset SF and HCF. Check ZF:
1692
case 0x26:
1693
{
1694
const unsigned addr = HL();
1695
1696
READ(CF, addr);
1697
CF <<= 1;
1698
1699
ZF = CF;
1700
1701
WRITE(addr, ZF & 0xFF);
1702
1703
HF2 = 0;
1704
}
1705
break;
1706
case 0x27:
1707
sla_r(A);
1708
break;
1709
case 0x28:
1710
sra_r(B);
1711
break;
1712
case 0x29:
1713
sra_r(C);
1714
break;
1715
case 0x2A:
1716
sra_r(D);
1717
break;
1718
case 0x2B:
1719
sra_r(E);
1720
break;
1721
case 0x2C:
1722
sra_r(H);
1723
break;
1724
case 0x2D:
1725
sra_r(L);
1726
break;
1727
//sra (hl) (16 cycles):
1728
//Shift 8-bit value stored at address in HL right, store old bit0 in CF, bit7=old bit7. Reset SF and HCF. Check ZF:
1729
case 0x2E:
1730
{
1731
const unsigned addr = HL();
1732
1733
READ(CF, addr);
1734
1735
ZF = CF >> 1;
1736
1737
WRITE(addr, ZF | (CF & 0x80));
1738
1739
CF <<= 8;
1740
HF2 = 0;
1741
}
1742
break;
1743
case 0x2F:
1744
sra_r(A);
1745
break;
1746
case 0x30:
1747
swap_r(B);
1748
break;
1749
case 0x31:
1750
swap_r(C);
1751
break;
1752
case 0x32:
1753
swap_r(D);
1754
break;
1755
case 0x33:
1756
swap_r(E);
1757
break;
1758
case 0x34:
1759
swap_r(H);
1760
break;
1761
case 0x35:
1762
swap_r(L);
1763
break;
1764
//swap (hl) (16 cycles):
1765
//Swap upper and lower nibbles of 8-bit value stored at address in HL, reset flags, check zero flag:
1766
case 0x36:
1767
{
1768
const unsigned addr = HL();
1769
1770
READ(ZF, addr);
1771
1772
WRITE(addr, (ZF << 4 | ZF >> 4) & 0xFF);
1773
1774
CF = HF2 = 0;
1775
}
1776
break;
1777
case 0x37:
1778
swap_r(A);
1779
break;
1780
case 0x38:
1781
srl_r(B);
1782
break;
1783
case 0x39:
1784
srl_r(C);
1785
break;
1786
case 0x3A:
1787
srl_r(D);
1788
break;
1789
case 0x3B:
1790
srl_r(E);
1791
break;
1792
case 0x3C:
1793
srl_r(H);
1794
break;
1795
case 0x3D:
1796
srl_r(L);
1797
break;
1798
//srl (hl) (16 cycles):
1799
//Shift 8-bit value stored at address in HL right, store old bit0 in CF. Reset SF and HCF. Check ZF:
1800
case 0x3E:
1801
{
1802
const unsigned addr = HL();
1803
1804
READ(CF, addr);
1805
1806
ZF = CF >> 1;
1807
1808
WRITE(addr, ZF);
1809
1810
CF <<= 8;
1811
HF2 = 0;
1812
}
1813
break;
1814
case 0x3F:
1815
srl_r(A);
1816
break;
1817
case 0x40:
1818
bit0_u8(B);
1819
break;
1820
case 0x41:
1821
bit0_u8(C);
1822
break;
1823
case 0x42:
1824
bit0_u8(D);
1825
break;
1826
case 0x43:
1827
bit0_u8(E);
1828
break;
1829
case 0x44:
1830
bit0_u8(H);
1831
break;
1832
case 0x45:
1833
bit0_u8(L);
1834
break;
1835
case 0x46:
1836
{
1837
unsigned data;
1838
1839
READ(data, HL());
1840
1841
bit0_u8(data);
1842
}
1843
break;
1844
case 0x47:
1845
bit0_u8(A);
1846
break;
1847
case 0x48:
1848
bit1_u8(B);
1849
break;
1850
case 0x49:
1851
bit1_u8(C);
1852
break;
1853
case 0x4A:
1854
bit1_u8(D);
1855
break;
1856
case 0x4B:
1857
bit1_u8(E);
1858
break;
1859
case 0x4C:
1860
bit1_u8(H);
1861
break;
1862
case 0x4D:
1863
bit1_u8(L);
1864
break;
1865
case 0x4E:
1866
{
1867
unsigned data;
1868
1869
READ(data, HL());
1870
1871
bit1_u8(data);
1872
}
1873
break;
1874
case 0x4F:
1875
bit1_u8(A);
1876
break;
1877
case 0x50:
1878
bit2_u8(B);
1879
break;
1880
case 0x51:
1881
bit2_u8(C);
1882
break;
1883
case 0x52:
1884
bit2_u8(D);
1885
break;
1886
case 0x53:
1887
bit2_u8(E);
1888
break;
1889
case 0x54:
1890
bit2_u8(H);
1891
break;
1892
case 0x55:
1893
bit2_u8(L);
1894
break;
1895
case 0x56:
1896
{
1897
unsigned data;
1898
1899
READ(data, HL());
1900
1901
bit2_u8(data);
1902
}
1903
break;
1904
case 0x57:
1905
bit2_u8(A);
1906
break;
1907
case 0x58:
1908
bit3_u8(B);
1909
break;
1910
case 0x59:
1911
bit3_u8(C);
1912
break;
1913
case 0x5A:
1914
bit3_u8(D);
1915
break;
1916
case 0x5B:
1917
bit3_u8(E);
1918
break;
1919
case 0x5C:
1920
bit3_u8(H);
1921
break;
1922
case 0x5D:
1923
bit3_u8(L);
1924
break;
1925
case 0x5E:
1926
{
1927
unsigned data;
1928
1929
READ(data, HL());
1930
1931
bit3_u8(data);
1932
}
1933
break;
1934
case 0x5F:
1935
bit3_u8(A);
1936
break;
1937
case 0x60:
1938
bit4_u8(B);
1939
break;
1940
case 0x61:
1941
bit4_u8(C);
1942
break;
1943
case 0x62:
1944
bit4_u8(D);
1945
break;
1946
case 0x63:
1947
bit4_u8(E);
1948
break;
1949
case 0x64:
1950
bit4_u8(H);
1951
break;
1952
case 0x65:
1953
bit4_u8(L);
1954
break;
1955
case 0x66:
1956
{
1957
unsigned data;
1958
1959
READ(data, HL());
1960
1961
bit4_u8(data);
1962
}
1963
break;
1964
case 0x67:
1965
bit4_u8(A);
1966
break;
1967
case 0x68:
1968
bit5_u8(B);
1969
break;
1970
case 0x69:
1971
bit5_u8(C);
1972
break;
1973
case 0x6A:
1974
bit5_u8(D);
1975
break;
1976
case 0x6B:
1977
bit5_u8(E);
1978
break;
1979
case 0x6C:
1980
bit5_u8(H);
1981
break;
1982
case 0x6D:
1983
bit5_u8(L);
1984
break;
1985
case 0x6E:
1986
{
1987
unsigned data;
1988
1989
READ(data, HL());
1990
1991
bit5_u8(data);
1992
}
1993
break;
1994
case 0x6F:
1995
bit5_u8(A);
1996
break;
1997
case 0x70:
1998
bit6_u8(B);
1999
break;
2000
case 0x71:
2001
bit6_u8(C);
2002
break;
2003
case 0x72:
2004
bit6_u8(D);
2005
break;
2006
case 0x73:
2007
bit6_u8(E);
2008
break;
2009
case 0x74:
2010
bit6_u8(H);
2011
break;
2012
case 0x75:
2013
bit6_u8(L);
2014
break;
2015
case 0x76:
2016
{
2017
unsigned data;
2018
2019
READ(data, HL());
2020
2021
bit6_u8(data);
2022
}
2023
break;
2024
case 0x77:
2025
bit6_u8(A);
2026
break;
2027
case 0x78:
2028
bit7_u8(B);
2029
break;
2030
case 0x79:
2031
bit7_u8(C);
2032
break;
2033
case 0x7A:
2034
bit7_u8(D);
2035
break;
2036
case 0x7B:
2037
bit7_u8(E);
2038
break;
2039
case 0x7C:
2040
bit7_u8(H);
2041
break;
2042
case 0x7D:
2043
bit7_u8(L);
2044
break;
2045
case 0x7E:
2046
{
2047
unsigned data;
2048
2049
READ(data, HL());
2050
2051
bit7_u8(data);
2052
}
2053
break;
2054
case 0x7F:
2055
bit7_u8(A);
2056
break;
2057
case 0x80:
2058
res0_r(B);
2059
break;
2060
case 0x81:
2061
res0_r(C);
2062
break;
2063
case 0x82:
2064
res0_r(D);
2065
break;
2066
case 0x83:
2067
res0_r(E);
2068
break;
2069
case 0x84:
2070
res0_r(H);
2071
break;
2072
case 0x85:
2073
res0_r(L);
2074
break;
2075
case 0x86:
2076
resn_mem_hl(0);
2077
break;
2078
case 0x87:
2079
res0_r(A);
2080
break;
2081
case 0x88:
2082
res1_r(B);
2083
break;
2084
case 0x89:
2085
res1_r(C);
2086
break;
2087
case 0x8A:
2088
res1_r(D);
2089
break;
2090
case 0x8B:
2091
res1_r(E);
2092
break;
2093
case 0x8C:
2094
res1_r(H);
2095
break;
2096
case 0x8D:
2097
res1_r(L);
2098
break;
2099
case 0x8E:
2100
resn_mem_hl(1);
2101
break;
2102
case 0x8F:
2103
res1_r(A);
2104
break;
2105
case 0x90:
2106
res2_r(B);
2107
break;
2108
case 0x91:
2109
res2_r(C);
2110
break;
2111
case 0x92:
2112
res2_r(D);
2113
break;
2114
case 0x93:
2115
res2_r(E);
2116
break;
2117
case 0x94:
2118
res2_r(H);
2119
break;
2120
case 0x95:
2121
res2_r(L);
2122
break;
2123
case 0x96:
2124
resn_mem_hl(2);
2125
break;
2126
case 0x97:
2127
res2_r(A);
2128
break;
2129
case 0x98:
2130
res3_r(B);
2131
break;
2132
case 0x99:
2133
res3_r(C);
2134
break;
2135
case 0x9A:
2136
res3_r(D);
2137
break;
2138
case 0x9B:
2139
res3_r(E);
2140
break;
2141
case 0x9C:
2142
res3_r(H);
2143
break;
2144
case 0x9D:
2145
res3_r(L);
2146
break;
2147
case 0x9E:
2148
resn_mem_hl(3);
2149
break;
2150
case 0x9F:
2151
res3_r(A);
2152
break;
2153
case 0xA0:
2154
res4_r(B);
2155
break;
2156
case 0xA1:
2157
res4_r(C);
2158
break;
2159
case 0xA2:
2160
res4_r(D);
2161
break;
2162
case 0xA3:
2163
res4_r(E);
2164
break;
2165
case 0xA4:
2166
res4_r(H);
2167
break;
2168
case 0xA5:
2169
res4_r(L);
2170
break;
2171
case 0xA6:
2172
resn_mem_hl(4);
2173
break;
2174
case 0xA7:
2175
res4_r(A);
2176
break;
2177
case 0xA8:
2178
res5_r(B);
2179
break;
2180
case 0xA9:
2181
res5_r(C);
2182
break;
2183
case 0xAA:
2184
res5_r(D);
2185
break;
2186
case 0xAB:
2187
res5_r(E);
2188
break;
2189
case 0xAC:
2190
res5_r(H);
2191
break;
2192
case 0xAD:
2193
res5_r(L);
2194
break;
2195
case 0xAE:
2196
resn_mem_hl(5);
2197
break;
2198
case 0xAF:
2199
res5_r(A);
2200
break;
2201
case 0xB0:
2202
res6_r(B);
2203
break;
2204
case 0xB1:
2205
res6_r(C);
2206
break;
2207
case 0xB2:
2208
res6_r(D);
2209
break;
2210
case 0xB3:
2211
res6_r(E);
2212
break;
2213
case 0xB4:
2214
res6_r(H);
2215
break;
2216
case 0xB5:
2217
res6_r(L);
2218
break;
2219
case 0xB6:
2220
resn_mem_hl(6);
2221
break;
2222
case 0xB7:
2223
res6_r(A);
2224
break;
2225
case 0xB8:
2226
res7_r(B);
2227
break;
2228
case 0xB9:
2229
res7_r(C);
2230
break;
2231
case 0xBA:
2232
res7_r(D);
2233
break;
2234
case 0xBB:
2235
res7_r(E);
2236
break;
2237
case 0xBC:
2238
res7_r(H);
2239
break;
2240
case 0xBD:
2241
res7_r(L);
2242
break;
2243
case 0xBE:
2244
resn_mem_hl(7);
2245
break;
2246
case 0xBF:
2247
res7_r(A);
2248
break;
2249
case 0xC0:
2250
set0_r(B);
2251
break;
2252
case 0xC1:
2253
set0_r(C);
2254
break;
2255
case 0xC2:
2256
set0_r(D);
2257
break;
2258
case 0xC3:
2259
set0_r(E);
2260
break;
2261
case 0xC4:
2262
set0_r(H);
2263
break;
2264
case 0xC5:
2265
set0_r(L);
2266
break;
2267
case 0xC6:
2268
setn_mem_hl(0);
2269
break;
2270
case 0xC7:
2271
set0_r(A);
2272
break;
2273
case 0xC8:
2274
set1_r(B);
2275
break;
2276
case 0xC9:
2277
set1_r(C);
2278
break;
2279
case 0xCA:
2280
set1_r(D);
2281
break;
2282
case 0xCB:
2283
set1_r(E);
2284
break;
2285
case 0xCC:
2286
set1_r(H);
2287
break;
2288
case 0xCD:
2289
set1_r(L);
2290
break;
2291
case 0xCE:
2292
setn_mem_hl(1);
2293
break;
2294
case 0xCF:
2295
set1_r(A);
2296
break;
2297
case 0xD0:
2298
set2_r(B);
2299
break;
2300
case 0xD1:
2301
set2_r(C);
2302
break;
2303
case 0xD2:
2304
set2_r(D);
2305
break;
2306
case 0xD3:
2307
set2_r(E);
2308
break;
2309
case 0xD4:
2310
set2_r(H);
2311
break;
2312
case 0xD5:
2313
set2_r(L);
2314
break;
2315
case 0xD6:
2316
setn_mem_hl(2);
2317
break;
2318
case 0xD7:
2319
set2_r(A);
2320
break;
2321
case 0xD8:
2322
set3_r(B);
2323
break;
2324
case 0xD9:
2325
set3_r(C);
2326
break;
2327
case 0xDA:
2328
set3_r(D);
2329
break;
2330
case 0xDB:
2331
set3_r(E);
2332
break;
2333
case 0xDC:
2334
set3_r(H);
2335
break;
2336
case 0xDD:
2337
set3_r(L);
2338
break;
2339
case 0xDE:
2340
setn_mem_hl(3);
2341
break;
2342
case 0xDF:
2343
set3_r(A);
2344
break;
2345
case 0xE0:
2346
set4_r(B);
2347
break;
2348
case 0xE1:
2349
set4_r(C);
2350
break;
2351
case 0xE2:
2352
set4_r(D);
2353
break;
2354
case 0xE3:
2355
set4_r(E);
2356
break;
2357
case 0xE4:
2358
set4_r(H);
2359
break;
2360
case 0xE5:
2361
set4_r(L);
2362
break;
2363
case 0xE6:
2364
setn_mem_hl(4);
2365
break;
2366
case 0xE7:
2367
set4_r(A);
2368
break;
2369
case 0xE8:
2370
set5_r(B);
2371
break;
2372
case 0xE9:
2373
set5_r(C);
2374
break;
2375
case 0xEA:
2376
set5_r(D);
2377
break;
2378
case 0xEB:
2379
set5_r(E);
2380
break;
2381
case 0xEC:
2382
set5_r(H);
2383
break;
2384
case 0xED:
2385
set5_r(L);
2386
break;
2387
case 0xEE:
2388
setn_mem_hl(5);
2389
break;
2390
case 0xEF:
2391
set5_r(A);
2392
break;
2393
case 0xF0:
2394
set6_r(B);
2395
break;
2396
case 0xF1:
2397
set6_r(C);
2398
break;
2399
case 0xF2:
2400
set6_r(D);
2401
break;
2402
case 0xF3:
2403
set6_r(E);
2404
break;
2405
case 0xF4:
2406
set6_r(H);
2407
break;
2408
case 0xF5:
2409
set6_r(L);
2410
break;
2411
case 0xF6:
2412
setn_mem_hl(6);
2413
break;
2414
case 0xF7:
2415
set6_r(A);
2416
break;
2417
case 0xF8:
2418
set7_r(B);
2419
break;
2420
case 0xF9:
2421
set7_r(C);
2422
break;
2423
case 0xFA:
2424
set7_r(D);
2425
break;
2426
case 0xFB:
2427
set7_r(E);
2428
break;
2429
case 0xFC:
2430
set7_r(H);
2431
break;
2432
case 0xFD:
2433
set7_r(L);
2434
break;
2435
case 0xFE:
2436
setn_mem_hl(7);
2437
break;
2438
case 0xFF:
2439
set7_r(A);
2440
break;
2441
// default: break;
2442
}
2443
break;
2444
2445
2446
//call z,nn (24;12 cycles):
2447
//Push address of next instruction onto stack and then jump to address stored in next two bytes in memory, if ZF is set:
2448
case 0xCC:
2449
if (ZF & 0xFF) {
2450
PC_MOD((PC + 2) & 0xFFFF);
2451
cycleCounter += 4;
2452
} else {
2453
call_nn();
2454
}
2455
break;
2456
2457
case 0xCD:
2458
call_nn();
2459
break;
2460
case 0xCE:
2461
{
2462
unsigned data;
2463
2464
PC_READ(data);
2465
2466
adc_a_u8(data);
2467
}
2468
break;
2469
case 0xCF:
2470
rst_n(0x08);
2471
break;
2472
2473
//ret nc (20;8 cycles):
2474
//Pop two bytes from the stack and jump to that address, if CF is unset:
2475
case 0xD0:
2476
cycleCounter += 4;
2477
2478
if (!(CF & 0x100)) {
2479
ret();
2480
}
2481
2482
break;
2483
2484
case 0xD1:
2485
pop_rr(D, E);
2486
break;
2487
2488
//jp nc,nn (16;12 cycles):
2489
//Jump to address stored in next two bytes in memory if CF is unset:
2490
case 0xD2:
2491
if (CF & 0x100) {
2492
PC_MOD((PC + 2) & 0xFFFF);
2493
cycleCounter += 4;
2494
} else {
2495
jp_nn();
2496
}
2497
break;
2498
2499
case 0xD3: /*doesn't exist*/
2500
skip = true;
2501
memory.di();
2502
break;
2503
2504
//call nc,nn (24;12 cycles):
2505
//Push address of next instruction onto stack and then jump to address stored in next two bytes in memory, if CF is unset:
2506
case 0xD4:
2507
if (CF & 0x100) {
2508
PC_MOD((PC + 2) & 0xFFFF);
2509
cycleCounter += 4;
2510
} else {
2511
call_nn();
2512
}
2513
break;
2514
2515
case 0xD5:
2516
push_rr(D, E);
2517
break;
2518
case 0xD6:
2519
{
2520
unsigned data;
2521
2522
PC_READ(data);
2523
2524
sub_a_u8(data);
2525
}
2526
break;
2527
case 0xD7:
2528
rst_n(0x10);
2529
break;
2530
2531
//ret c (20;8 cycles):
2532
//Pop two bytes from the stack and jump to that address, if CF is set:
2533
case 0xD8:
2534
cycleCounter += 4;
2535
2536
if (CF & 0x100) {
2537
ret();
2538
}
2539
2540
break;
2541
2542
//reti (16 cycles):
2543
//Pop two bytes from the stack and jump to that address, then enable interrupts:
2544
case 0xD9:
2545
{
2546
unsigned l, h;
2547
2548
pop_rr(h, l);
2549
2550
memory.ei(cycleCounter);
2551
2552
PC_MOD(h << 8 | l);
2553
}
2554
break;
2555
2556
//jp c,nn (16;12 cycles):
2557
//Jump to address stored in next two bytes in memory if CF is set:
2558
case 0xDA: //PC=( ((PC+2)*(1-CarryFlag())) + (((memory.read(PC+1)<<8)+memory.read(PC))*CarryFlag()) ); Cycles(12); break;
2559
if (CF & 0x100) {
2560
jp_nn();
2561
} else {
2562
PC_MOD((PC + 2) & 0xFFFF);
2563
cycleCounter += 4;
2564
}
2565
break;
2566
2567
case 0xDB: /*doesn't exist*/
2568
skip = true;
2569
memory.di();
2570
break;
2571
2572
//call z,nn (24;12 cycles):
2573
//Push address of next instruction onto stack and then jump to address stored in next two bytes in memory, if CF is set:
2574
case 0xDC:
2575
if (CF & 0x100) {
2576
call_nn();
2577
} else {
2578
PC_MOD((PC + 2) & 0xFFFF);
2579
cycleCounter += 4;
2580
}
2581
break;
2582
2583
case 0xDD: /*doesn't exist*/
2584
skip = true;
2585
memory.di();
2586
break;
2587
2588
case 0xDE:
2589
{
2590
unsigned data;
2591
2592
PC_READ(data);
2593
2594
sbc_a_u8(data);
2595
}
2596
break;
2597
case 0xDF:
2598
rst_n(0x18);
2599
break;
2600
2601
//ld ($FF00+n),a (12 cycles):
2602
//Put value in A into address (0xFF00 + next byte in memory):
2603
case 0xE0:
2604
{
2605
unsigned tmp;
2606
2607
PC_READ(tmp);
2608
2609
FF_WRITE(0xFF00 | tmp, A);
2610
}
2611
break;
2612
2613
case 0xE1:
2614
pop_rr(H, L);
2615
break;
2616
2617
//ld ($FF00+C),a (8 ycles):
2618
//Put A into address (0xFF00 + register C):
2619
case 0xE2:
2620
FF_WRITE(0xFF00 | C, A);
2621
break;
2622
case 0xE3: /*doesn't exist*/
2623
skip = true;
2624
memory.di();
2625
break;
2626
case 0xE4: /*doesn't exist*/
2627
skip = true;
2628
memory.di();
2629
break;
2630
case 0xE5:
2631
push_rr(H, L);
2632
break;
2633
case 0xE6:
2634
{
2635
unsigned data;
2636
2637
PC_READ(data);
2638
2639
and_a_u8(data);
2640
}
2641
break;
2642
case 0xE7:
2643
rst_n(0x20);
2644
break;
2645
2646
//add sp,n (16 cycles):
2647
//Add next (signed) byte in memory to SP, reset ZF and SF, check HCF and CF:
2648
case 0xE8:
2649
/*{
2650
int8_t tmp = int8_t(memory.pc_read(PC++, cycleCounter));
2651
HF2 = (((SP & 0xFFF) + tmp) >> 3) & 0x200;
2652
CF = SP + tmp;
2653
SP = CF;
2654
CF >>= 8;
2655
ZF = 1;
2656
cycleCounter += 12;
2657
}*/
2658
sp_plus_n(SP);
2659
cycleCounter += 4;
2660
break;
2661
2662
//jp hl (4 cycles):
2663
//Jump to address in hl:
2664
case 0xE9:
2665
PC = HL();
2666
break;
2667
2668
//ld (nn),a (16 cycles):
2669
//set memory at address given by the next 2 bytes to value in A:
2670
//Incrementing PC before call, because of possible interrupt.
2671
case 0xEA:
2672
{
2673
unsigned l, h;
2674
2675
PC_READ(l);
2676
PC_READ(h);
2677
2678
WRITE(h << 8 | l, A);
2679
}
2680
break;
2681
2682
case 0xEB: /*doesn't exist*/
2683
skip = true;
2684
memory.di();
2685
break;
2686
case 0xEC: /*doesn't exist*/
2687
skip = true;
2688
memory.di();
2689
break;
2690
case 0xED: /*doesn't exist*/
2691
skip = true;
2692
memory.di();
2693
break;
2694
case 0xEE:
2695
{
2696
unsigned data;
2697
2698
PC_READ(data);
2699
2700
xor_a_u8(data);
2701
}
2702
break;
2703
case 0xEF:
2704
rst_n(0x28);
2705
break;
2706
2707
//ld a,($FF00+n) (12 cycles):
2708
//Put value at address (0xFF00 + next byte in memory) into A:
2709
case 0xF0:
2710
{
2711
unsigned tmp;
2712
2713
PC_READ(tmp);
2714
2715
FF_READ(A, 0xFF00 | tmp);
2716
}
2717
break;
2718
2719
case 0xF1: /*pop_rr(A, F); Cycles(12); break;*/
2720
{
2721
unsigned F;
2722
2723
pop_rr(A, F);
2724
2725
FROM_F(F);
2726
}
2727
break;
2728
2729
//ld a,($FF00+C) (8 cycles):
2730
//Put value at address (0xFF00 + register C) into A:
2731
case 0xF2:
2732
FF_READ(A, 0xFF00 | C);
2733
break;
2734
2735
//di (4 cycles):
2736
case 0xF3:
2737
memory.di();
2738
break;
2739
2740
case 0xF4: /*doesn't exist*/
2741
skip = true;
2742
memory.di();
2743
break;
2744
case 0xF5: /*push_rr(A, F); Cycles(16); break;*/
2745
calcHF(HF1, HF2);
2746
2747
{
2748
unsigned F = F();
2749
2750
push_rr(A, F);
2751
}
2752
break;
2753
2754
case 0xF6:
2755
{
2756
unsigned data;
2757
2758
PC_READ(data);
2759
2760
or_a_u8(data);
2761
}
2762
break;
2763
case 0xF7:
2764
rst_n(0x30);
2765
break;
2766
2767
//ldhl sp,n (12 cycles):
2768
//Put (sp+next (signed) byte in memory) into hl (unsets ZF and SF, may enable HF and CF):
2769
case 0xF8:
2770
/*{
2771
int8_t tmp = int8_t(memory.pc_read(PC++, cycleCounter));
2772
HF2 = (((SP & 0xFFF) + tmp) >> 3) & 0x200;
2773
CF = SP + tmp;
2774
L = CF;
2775
CF >>= 8;
2776
H = CF;
2777
ZF = 1;
2778
cycleCounter += 8;
2779
}*/
2780
{
2781
unsigned sum;
2782
sp_plus_n(sum);
2783
L = sum & 0xFF;
2784
H = sum >> 8;
2785
}
2786
break;
2787
2788
//ld sp,hl (8 cycles):
2789
//Put value in HL into SP
2790
case 0xF9:
2791
SP = HL();
2792
cycleCounter += 4;
2793
break;
2794
2795
//ld a,(nn) (16 cycles):
2796
//set A to value in memory at address given by the 2 next bytes.
2797
case 0xFA:
2798
{
2799
unsigned l, h;
2800
2801
PC_READ(l);
2802
PC_READ(h);
2803
2804
READ(A, h << 8 | l);
2805
}
2806
break;
2807
2808
//ei (4 cycles):
2809
//Enable Interrupts after next instruction:
2810
case 0xFB:
2811
memory.ei(cycleCounter);
2812
break;
2813
2814
case 0xFC: /*doesn't exist*/
2815
skip = true;
2816
memory.di();
2817
break;
2818
case 0xFD: /*doesn't exist*/
2819
skip = true;
2820
memory.di();
2821
break;
2822
case 0xFE:
2823
{
2824
unsigned data;
2825
2826
PC_READ(data);
2827
2828
cp_a_u8(data);
2829
}
2830
break;
2831
case 0xFF:
2832
rst_n(0x38);
2833
break;
2834
// default: break;
2835
}
2836
}
2837
2838
//PC_ = PC;
2839
cycleCounter = memory.event(cycleCounter);
2840
}
2841
2842
//A_ = A;
2843
cycleCounter_ = cycleCounter;
2844
}
2845
2846
void CPU::GetRegs(int *dest)
2847
{
2848
dest[0] = PC;
2849
dest[1] = SP;
2850
dest[2] = A;
2851
dest[3] = B;
2852
dest[4] = C;
2853
dest[5] = D;
2854
dest[6] = E;
2855
dest[7] = F();
2856
dest[8] = H;
2857
dest[9] = L;
2858
}
2859
2860
SYNCFUNC(CPU)
2861
{
2862
SSS(memory);
2863
NSS(cycleCounter_);
2864
NSS(PC);
2865
NSS(SP);
2866
NSS(HF1);
2867
NSS(HF2);
2868
NSS(ZF);
2869
NSS(CF);
2870
NSS(A);
2871
NSS(B);
2872
NSS(C);
2873
NSS(D);
2874
NSS(E);
2875
NSS(H);
2876
NSS(L);
2877
NSS(skip);
2878
}
2879
2880
}
2881
2882