1const CYCLES: [usize; 256] = [
2 4, 10, 7, 5, 5, 5, 7, 4, 4, 10, 7, 5, 5, 5, 7, 4, 4, 10, 7, 5, 5, 5, 7, 4, 4, 10, 7, 5, 5, 5,
3 7, 4, 4, 10, 16, 5, 5, 5, 7, 4, 4, 10, 16, 5, 5, 5, 7, 4, 4, 10, 13, 5, 10, 10, 10, 4, 4, 10,
4 13, 5, 5, 5, 7, 4, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5,
5 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 7, 5, 7, 7, 7, 7, 7, 7, 7, 7, 5,
6 5, 5, 5, 5, 5, 7, 5, 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4,
7 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4,
8 4, 4, 4, 4, 4, 7, 4, 5, 10, 10, 10, 11, 11, 7, 11, 5, 10, 10, 10, 11, 17, 7, 11, 5, 10, 10, 10,
9 11, 11, 7, 11, 5, 10, 10, 10, 11, 17, 7, 11, 5, 10, 10, 18, 11, 11, 7, 11, 5, 5, 10, 4, 11, 17,
10 7, 11, 5, 10, 10, 4, 11, 11, 7, 11, 5, 5, 10, 4, 11, 17, 7, 11,
11];
12
13pub trait Memory {
14 fn read_byte(&self, addr: u16) -> u8;
15 fn read_word(&self, addr: u16) -> u16;
16
17 fn write_byte(&mut self, addr: u16, byte: u8);
18 fn write_word(&mut self, addr: u16, word: u16);
19
20 fn in_port(&self, port: u8) -> u8;
21 fn out_port(&self, port: u8, byte: u8);
22}
23
24pub struct Emulator {
25 mem: Box<dyn Memory>,
27 halt: bool,
29 cycles: usize,
31 pc: Word,
33 sp: Word,
35 s_flag: Flag,
37 z_flag: Flag,
39 h_flag: Flag,
41 p_flag: Flag,
43 c_flag: Flag,
45 a_reg: Register,
46 b_reg: Register,
47 c_reg: Register,
48 d_reg: Register,
49 e_reg: Register,
50 h_reg: Register,
51 l_reg: Register,
52 int: InterruptInfo,
54}
55
56#[derive(Debug, Default)]
57struct Register(pub Byte);
58
59#[derive(Debug, Default)]
60struct Flag(pub bool);
61
62#[derive(Debug, Default)]
63struct InterruptInfo {
64 pub pending: bool,
65 pub filp_flop: bool,
66 pub vector: Byte,
67 pub delay: Byte,
68}
69
70#[derive(Debug, Default, Clone, Copy)]
71struct Word(pub u16);
72
73#[derive(Debug, Default, Clone, Copy)]
74struct Byte(pub u8);
75
76impl Byte {
77 pub fn bit_parity(&self) -> bool {
78 let mut ones = 0;
79
80 for i in 0..8 {
81 ones += (self.0 >> i) & i;
82 }
83
84 (ones & 1) == 0
85 }
86
87 pub fn bit_carry(&self, other: Byte, alredy: bool, bits: i32) -> bool {
88 let res = (self.0 as u16) + (other.0 as u16) + (alredy as u16);
89 let carry = res ^ (self.0 as u16) ^ (other.0 as u16);
90
91 carry & (1 << bits) != 0
92 }
93}
94
95impl Emulator {
96 pub fn new(mem: Box<dyn Memory>) -> Self {
97 Self {
98 mem,
99 halt: false,
100 cycles: 0,
101 pc: Word::default(),
102 sp: Word::default(),
103 s_flag: Flag::default(),
104 z_flag: Flag::default(),
105 h_flag: Flag::default(),
106 p_flag: Flag::default(),
107 c_flag: Flag::default(),
108 a_reg: Register::default(),
109 b_reg: Register::default(),
110 c_reg: Register::default(),
111 d_reg: Register::default(),
112 e_reg: Register::default(),
113 h_reg: Register::default(),
114 l_reg: Register::default(),
115 int: InterruptInfo::default(),
116 }
117 }
118
119 fn set_flags(&mut self, value: Byte) {
120 self.z_flag.0 = value.0 == 0u8;
121 self.s_flag.0 = (value.0 >> 7) == 1;
122 self.p_flag.0 = value.bit_parity();
123 }
124
125 fn fetch_next_byte(&mut self) -> u8 {
126 let byte = self.mem.read_byte(self.pc.0);
127 self.pc.0 += 1;
128 byte
129 }
130
131 fn fetch_next_word(&mut self) -> u16 {
132 let word = self.mem.read_word(self.pc.0);
133 self.pc.0 += 2;
134 word
135 }
136
137 fn set_bc_pair(&mut self, value: u16) {
138 self.b_reg.0 = Byte((value >> 8) as u8);
139 self.c_reg.0 = Byte((value & 0xff) as u8);
140 }
141
142 fn get_bc_pair(&self) -> u16 {
143 (self.b_reg.0 .0 as u16) << 8 | self.c_reg.0 .0 as u16
144 }
145
146 fn set_de_pair(&mut self, value: u16) {
147 self.d_reg.0 = Byte((value >> 8) as u8);
148 self.e_reg.0 = Byte((value & 0xff) as u8);
149 }
150
151 fn get_de_pair(&self) -> u16 {
152 (self.d_reg.0 .0 as u16) << 8 | self.e_reg.0 .0 as u16
153 }
154
155 fn set_hl_pair(&mut self, value: u16) {
156 self.l_reg.0 = Byte((value >> 8) as u8);
157 self.h_reg.0 = Byte((value & 0xff) as u8);
158 }
159
160 fn get_hl_pair(&self) -> u16 {
161 (self.h_reg.0 .0 as u16) << 8 | self.l_reg.0 .0 as u16
162 }
163
164 fn push_stack(&mut self, value: u16) {
165 self.sp.0 -= 2;
166 self.mem.write_word(self.sp.0, value);
167 }
168
169 fn pop_stack(&mut self) -> u16 {
170 let value = self.mem.read_word(self.sp.0);
171 self.sp.0 += 2;
172 value
173 }
174
175 fn op_inr(&mut self, value: Byte) -> Byte {
176 let res = Byte(value.0 + 1);
177 self.h_flag.0 = (res.0 & 0x0f) == 0;
178 self.set_flags(res);
179 res
180 }
181
182 fn op_dcr(&mut self, value: Byte) -> Byte {
183 let res = Byte(value.0 - 1);
184 self.h_flag.0 = (res.0 & 0x0f) != 0x0f;
185 self.set_flags(res);
186 res
187 }
188
189 fn op_dad(&mut self, value: u16) {
190 self.c_flag.0 = ((((self.get_hl_pair() + value) as u32) >> 16) & 1) != 0;
191 self.set_hl_pair(self.get_hl_pair() + value);
192 }
193
194 fn op_add(&mut self, reg: Byte, value: Byte, alredy: bool) -> Byte {
195 let res = Byte(reg.0 + value.0 + (alredy as u8));
196 let byte = Byte(reg.0);
197 self.c_flag.0 = byte.bit_carry(value, alredy, 8);
198 self.h_flag.0 = byte.bit_carry(value, alredy, 4);
199
200 self.set_flags(res);
201 res
202 }
203
204 fn op_sub(&mut self, reg: Byte, value: Byte, alredy: bool) -> Byte {
205 let res = self.op_add(reg, Byte(!value.0), !alredy);
206 self.c_flag.0 = !self.c_flag.0;
207 res
208 }
209
210 fn op_daa(&mut self) {
211 let mut alredy = self.c_flag.0;
212 let mut adj = 0;
213 let lsb = self.a_reg.0 .0 & 0x0f;
214 let msb = self.a_reg.0 .0 >> 4;
215
216 if self.h_flag.0 || lsb > 9 {
217 adj += 0x06;
218 }
219
220 if self.c_flag.0 || msb > 9 || (msb >= 9 && lsb > 9) {
221 adj += 0x60;
222 alredy = true;
223 }
224
225 self.a_reg.0 = self.op_add(self.a_reg.0, Byte(adj), alredy);
226 self.c_flag.0 = alredy;
227 }
228
229 fn op_ana(&mut self, value: u8) {
230 let res = Byte(self.a_reg.0 .0 & value);
231 self.c_flag.0 = false;
232 self.h_flag.0 = ((self.a_reg.0 .0 | value) & 0x08) != 0;
233
234 self.set_flags(res);
235 self.a_reg.0 = res;
236 }
237
238 fn op_xra(&mut self, value: u8) {
239 self.a_reg.0 .0 ^= value;
240 self.c_flag.0 = false;
241 self.h_flag.0 = false;
242 self.set_flags(self.a_reg.0);
243 }
244
245 fn op_ora(&mut self, value: u8) {
246 self.a_reg.0 .0 |= value;
247 self.c_flag.0 = false;
248 self.h_flag.0 = false;
249 self.set_flags(self.a_reg.0);
250 }
251
252 fn op_cmp(&mut self, value: u8) {
253 let res = self.a_reg.0 .0 - value;
254 self.c_flag.0 = ((res as u16) >> 8) != 0;
255 self.h_flag.0 = (!(self.a_reg.0 .0 ^ res ^ value) & 0x10) != 0;
256 self.set_flags(Byte(res & 0xff));
257 }
258
259 fn op_jmp(&mut self, addr: u16) {
260 self.pc.0 = addr;
261 }
262
263 fn op_cond_jmp(&mut self, cond: bool) {
264 let addr = self.fetch_next_word();
265
266 if cond {
267 self.op_jmp(addr);
268 }
269 }
270
271 fn op_call(&mut self, addr: u16) {
272 self.push_stack(self.pc.0);
273 self.op_jmp(addr);
274 }
275
276 fn op_cond_call(&mut self, cond: bool) {
277 let addr = self.fetch_next_word();
278
279 if cond {
280 self.op_call(addr);
281 self.cycles += 6;
282 }
283 }
284
285 fn op_ret(&mut self) {
286 self.pc.0 = self.pop_stack();
287 }
288
289 fn op_cond_ret(&mut self, cond: bool) {
290 if cond {
291 self.op_ret();
292 self.cycles += 6;
293 }
294 }
295
296 pub fn exec(&mut self, op: u8) {
297 self.cycles += CYCLES[op as usize];
298
299 if self.int.delay.0 > 0 {
300 self.int.delay.0 -= 1;
301 }
302
303 match op {
304 0x00 => {}
305 0x01 => {
306 let word = self.fetch_next_word();
307 self.set_bc_pair(word);
308 }
309 0x02 => {
310 let value = self.get_bc_pair();
311 self.mem.write_byte(value, self.a_reg.0 .0);
312 }
313 0x03 => {
314 let value = self.get_bc_pair();
315 self.set_bc_pair(value + 1);
316 }
317 0x04 => {
318 self.b_reg.0 = self.op_inr(self.b_reg.0);
319 }
320 0x05 => {
321 self.b_reg.0 = self.op_dcr(self.b_reg.0);
322 }
323 0x06 => {
324 self.b_reg.0 = Byte(self.fetch_next_byte());
325 }
326 0x07 => {
327 self.c_flag.0 = (self.a_reg.0 .0 >> 7) != 0;
328 self.a_reg.0 .0 = (self.a_reg.0 .0 << 1) | self.c_flag.0 as u8;
329 }
330 0x09 => {
331 self.op_dad(self.get_bc_pair());
332 }
333 0x0a => {
334 self.a_reg.0 .0 = self.mem.read_byte(self.get_bc_pair());
335 }
336 0x0b => {
337 let value = self.get_bc_pair();
338 self.set_bc_pair(value - 1);
339 }
340 0x0c => {
341 self.c_reg.0 = self.op_inr(self.c_reg.0);
342 }
343 0x0d => {
344 self.c_reg.0 = self.op_dcr(self.c_reg.0);
345 }
346 0x0e => {
347 self.c_reg.0 = Byte(self.fetch_next_byte());
348 }
349 0x0f => {
350 self.c_flag.0 = (self.a_reg.0 .0 & 1) != 0;
351 self.a_reg.0 .0 = (self.a_reg.0 .0 >> 1) | ((self.c_flag.0 as u8) << 7)
352 }
353 0x11 => {
354 let word = self.fetch_next_word();
355 self.set_de_pair(word);
356 }
357 0x12 => {
358 let addr = self.get_de_pair();
359 self.mem.write_byte(addr, self.a_reg.0 .0);
360 }
361 0x13 => {
362 let value = self.get_de_pair();
363 self.set_de_pair(value + 1);
364 }
365 0x14 => {
366 self.d_reg.0 = self.op_inr(self.d_reg.0);
367 }
368 0x15 => {
369 self.d_reg.0 = self.op_dcr(self.d_reg.0);
370 }
371 0x16 => {
372 self.d_reg.0 = Byte(self.fetch_next_byte());
373 }
374 0x17 => {
375 let alredy = self.c_flag.0;
376 self.c_flag.0 = (self.a_reg.0 .0 >> 7) != 0;
377 self.a_reg.0 .0 = (self.a_reg.0 .0 << 1) | (alredy as u8);
378 }
379 0x19 => {
380 self.op_dad(self.get_de_pair());
381 }
382 0x1a => {
383 self.a_reg.0 .0 = self.mem.read_byte(self.get_de_pair());
384 }
385 0x1b => {
386 let value = self.get_de_pair();
387 self.set_de_pair(value - 1);
388 }
389 0x1c => {
390 self.e_reg.0 = self.op_inr(self.e_reg.0);
391 }
392 0x1d => {
393 self.e_reg.0 = self.op_dcr(self.e_reg.0);
394 }
395 0x1e => {
396 self.e_reg.0 = Byte(self.fetch_next_byte());
397 }
398 0x1f => {
399 let alredy = self.c_flag.0;
400 self.c_flag.0 = (self.a_reg.0 .0 & 1) != 0;
401 self.a_reg.0 .0 = (self.a_reg.0 .0 >> 1) | ((alredy as u8) << 7);
402 }
403 0x21 => {
404 let word = self.fetch_next_word();
405 self.set_hl_pair(word);
406 }
407 0x22 => {
408 let addr = self.fetch_next_word();
409 self.mem.write_word(addr, self.get_hl_pair());
410 }
411 0x23 => {
412 let value = self.get_hl_pair();
413 self.set_hl_pair(value + 1);
414 }
415 0x24 => {
416 self.h_reg.0 = self.op_inr(self.h_reg.0);
417 }
418 0x25 => {
419 self.h_reg.0 = self.op_dcr(self.h_reg.0);
420 }
421 0x26 => {
422 self.h_reg.0 = Byte(self.fetch_next_byte());
423 }
424 0x27 => {
425 self.op_daa();
426 }
427 0x29 => {
428 self.op_dad(self.get_hl_pair());
429 }
430 0x2a => {
431 let addr = self.fetch_next_word();
432 self.set_hl_pair(self.mem.read_word(addr))
433 }
434 0x2b => {
435 let value = self.get_hl_pair();
436 self.set_hl_pair(value - 1);
437 }
438 0x2c => {
439 self.l_reg.0 = self.op_inr(self.l_reg.0);
440 }
441 0x2d => {
442 self.l_reg.0 = self.op_dcr(self.l_reg.0);
443 }
444 0x2e => {
445 self.l_reg.0 = Byte(self.fetch_next_byte());
446 }
447 0x2f => {
448 self.a_reg.0 .0 = !self.a_reg.0 .0;
449 }
450 0x31 => {
451 let word = self.fetch_next_word();
452 self.sp = Word(word);
453 }
454 0x32 => {
455 let addr = self.fetch_next_word();
456 self.mem.write_byte(addr, self.a_reg.0 .0);
457 }
458 0x33 => {
459 self.sp.0 += 1;
460 }
461 0x34 => {
462 let byte = self.mem.read_byte(self.get_hl_pair());
463 let value = self.op_inr(Byte(byte));
464 self.mem.write_byte(self.get_hl_pair(), value.0);
465 }
466 0x35 => {
467 let byte = self.mem.read_byte(self.get_hl_pair());
468 let value = self.op_dcr(Byte(byte));
469 self.mem.write_byte(self.get_hl_pair(), value.0);
470 }
471 0x36 => {
472 let value = self.fetch_next_byte();
473 self.mem.write_byte(self.get_hl_pair(), value);
474 }
475 0x37 => {
476 self.c_flag.0 = true;
477 }
478 0x39 => {
479 self.op_dad(self.sp.0);
480 }
481 0x3a => {
482 let addr = self.fetch_next_word();
483 self.a_reg.0 .0 = self.mem.read_byte(addr);
484 }
485 0x3b => {
486 self.sp.0 -= 1;
487 }
488 0x3c => {
489 self.a_reg.0 = self.op_inr(self.a_reg.0);
490 }
491 0x3d => {
492 self.a_reg.0 = self.op_dcr(self.a_reg.0);
493 }
494 0x3e => {
495 self.a_reg.0 = Byte(self.fetch_next_byte());
496 }
497 0x3f => {
498 self.c_flag.0 = !self.c_flag.0;
499 }
500 0x40 => {
501 self.b_reg.0 .0 = self.mem.read_byte(self.get_hl_pair());
502 }
503 0x41 => {
504 self.b_reg.0 = self.c_reg.0;
505 }
506 0x42 => {
507 self.b_reg.0 = self.d_reg.0;
508 }
509 0x43 => {
510 self.b_reg.0 = self.e_reg.0;
511 }
512 0x44 => {
513 self.b_reg.0 = self.h_reg.0;
514 }
515 0x45 => {
516 self.b_reg.0 = self.l_reg.0;
517 }
518 0x46 => {
519 self.b_reg.0 .0 = self.mem.read_byte(self.get_hl_pair());
520 }
521 0x47 => {
522 self.b_reg.0 = self.a_reg.0;
523 }
524 0x48 => {
525 self.c_reg.0 = self.b_reg.0;
526 }
527 0x49 => {
528 self.c_reg.0 = self.c_reg.0;
529 }
530 0x4a => {
531 self.c_reg.0 = self.d_reg.0;
532 }
533 0x4b => {
534 self.c_reg.0 = self.e_reg.0;
535 }
536 0x4c => {
537 self.c_reg.0 = self.h_reg.0;
538 }
539 0x4d => {
540 self.c_reg.0 = self.l_reg.0;
541 }
542 0x4e => {
543 self.c_reg.0 .0 = self.mem.read_byte(self.get_hl_pair());
544 }
545 0x4f => {
546 self.c_reg.0 = self.a_reg.0;
547 }
548 0x50 => {
549 self.d_reg.0 = self.b_reg.0;
550 }
551 0x51 => {
552 self.d_reg.0 = self.c_reg.0;
553 }
554 0x52 => {
555 self.d_reg.0 = self.d_reg.0;
556 }
557 0x53 => {
558 self.d_reg.0 = self.e_reg.0;
559 }
560 0x54 => {
561 self.d_reg.0 = self.h_reg.0;
562 }
563 0x55 => {
564 self.d_reg.0 = self.l_reg.0;
565 }
566 0x56 => {
567 self.d_reg.0 .0 = self.mem.read_byte(self.get_hl_pair());
568 }
569 0x57 => {
570 self.d_reg.0 = self.a_reg.0;
571 }
572 0x58 => {
573 self.e_reg.0 = self.b_reg.0;
574 }
575 0x59 => {
576 self.e_reg.0 = self.c_reg.0;
577 }
578 0x5a => {
579 self.e_reg.0 = self.d_reg.0;
580 }
581 0x5b => {
582 self.e_reg.0 = self.e_reg.0;
583 }
584 0x5c => {
585 self.e_reg.0 = self.h_reg.0;
586 }
587 0x5d => {
588 self.e_reg.0 = self.l_reg.0;
589 }
590 0x5e => {
591 self.e_reg.0 .0 = self.mem.read_byte(self.get_hl_pair());
592 }
593 0x5f => {
594 self.e_reg.0 = self.a_reg.0;
595 }
596 0x60 => {
597 self.h_reg.0 = self.b_reg.0;
598 }
599 0x61 => {
600 self.h_reg.0 = self.c_reg.0;
601 }
602 0x62 => {
603 self.h_reg.0 = self.d_reg.0;
604 }
605 0x63 => {
606 self.h_reg.0 = self.e_reg.0;
607 }
608 0x64 => {
609 self.h_reg.0 = self.h_reg.0;
610 }
611 0x65 => {
612 self.h_reg.0 = self.l_reg.0;
613 }
614 0x66 => {
615 self.h_reg.0 .0 = self.mem.read_byte(self.get_hl_pair());
616 }
617 0x67 => {
618 self.h_reg.0 = self.a_reg.0;
619 }
620 0x68 => {
621 self.l_reg.0 = self.b_reg.0;
622 }
623 0x69 => {
624 self.l_reg.0 = self.c_reg.0;
625 }
626 0x6a => {
627 self.l_reg.0 = self.d_reg.0;
628 }
629 0x6b => {
630 self.l_reg.0 = self.e_reg.0;
631 }
632 0x6c => {
633 self.l_reg.0 = self.h_reg.0;
634 }
635 0x6d => {
636 self.l_reg.0 = self.l_reg.0;
637 }
638 0x6e => {
639 self.l_reg.0 .0 = self.mem.read_byte(self.get_hl_pair());
640 }
641 0x6f => {
642 self.l_reg.0 = self.a_reg.0;
643 }
644 0x70 => {
645 self.mem.write_byte(self.get_hl_pair(), self.b_reg.0 .0);
646 }
647 0x71 => {
648 self.mem.write_byte(self.get_hl_pair(), self.c_reg.0 .0);
649 }
650 0x72 => {
651 self.mem.write_byte(self.get_hl_pair(), self.d_reg.0 .0);
652 }
653 0x73 => {
654 self.mem.write_byte(self.get_hl_pair(), self.e_reg.0 .0);
655 }
656 0x74 => {
657 self.mem.write_byte(self.get_hl_pair(), self.h_reg.0 .0);
658 }
659 0x75 => {
660 self.mem.write_byte(self.get_hl_pair(), self.l_reg.0 .0);
661 }
662 0x76 => {
663 self.halt = true;
664 }
665 0x77 => {
666 self.mem.write_byte(self.get_hl_pair(), self.a_reg.0 .0);
667 }
668 0x78 => {
669 self.a_reg.0 = self.b_reg.0;
670 }
671 0x79 => {
672 self.a_reg.0 = self.c_reg.0;
673 }
674 0x7a => {
675 self.a_reg.0 = self.d_reg.0;
676 }
677 0x7b => {
678 self.a_reg.0 = self.e_reg.0;
679 }
680 0x7c => {
681 self.a_reg.0 = self.h_reg.0;
682 }
683 0x7d => {
684 self.a_reg.0 = self.l_reg.0;
685 }
686 0x7e => {
687 self.a_reg.0 .0 = self.mem.read_byte(self.get_hl_pair());
688 }
689 0x7f => {
690 self.a_reg.0 = self.a_reg.0;
691 }
692 0x80 => {
693 self.a_reg.0 = self.op_add(self.a_reg.0, self.b_reg.0, false);
694 }
695 0x81 => {
696 self.a_reg.0 = self.op_add(self.a_reg.0, self.c_reg.0, false);
697 }
698 0x82 => {
699 self.a_reg.0 = self.op_add(self.a_reg.0, self.d_reg.0, false);
700 }
701 0x83 => {
702 self.a_reg.0 = self.op_add(self.a_reg.0, self.e_reg.0, false);
703 }
704 0x84 => {
705 self.a_reg.0 = self.op_add(self.a_reg.0, self.h_reg.0, false);
706 }
707 0x85 => {
708 self.a_reg.0 = self.op_add(self.a_reg.0, self.l_reg.0, false);
709 }
710 0x86 => {
711 let value = self.mem.read_byte(self.get_hl_pair());
712 self.a_reg.0 = self.op_add(self.a_reg.0, Byte(value), false);
713 }
714 0x87 => {
715 self.a_reg.0 = self.op_add(self.a_reg.0, self.a_reg.0, false);
716 }
717 0x88 => {
718 self.a_reg.0 = self.op_add(self.a_reg.0, self.b_reg.0, self.c_flag.0);
719 }
720 0x89 => {
721 self.a_reg.0 = self.op_add(self.a_reg.0, self.c_reg.0, self.c_flag.0);
722 }
723 0x8a => {
724 self.a_reg.0 = self.op_add(self.a_reg.0, self.d_reg.0, self.c_flag.0);
725 }
726 0x8b => {
727 self.a_reg.0 = self.op_add(self.a_reg.0, self.e_reg.0, self.c_flag.0);
728 }
729 0x8c => {
730 self.a_reg.0 = self.op_add(self.a_reg.0, self.h_reg.0, self.c_flag.0);
731 }
732 0x8d => {
733 self.a_reg.0 = self.op_add(self.a_reg.0, self.l_reg.0, self.c_flag.0);
734 }
735 0x8e => {
736 let value = self.mem.read_byte(self.get_hl_pair());
737 self.a_reg.0 = self.op_add(self.a_reg.0, Byte(value), self.c_flag.0);
738 }
739 0x8f => {
740 self.a_reg.0 = self.op_add(self.a_reg.0, self.a_reg.0, self.c_flag.0);
741 }
742 0x90 => {
743 self.a_reg.0 = self.op_sub(self.a_reg.0, self.b_reg.0, false);
744 }
745 0x91 => {
746 self.a_reg.0 = self.op_sub(self.a_reg.0, self.c_reg.0, false);
747 }
748 0x92 => {
749 self.a_reg.0 = self.op_sub(self.a_reg.0, self.d_reg.0, false);
750 }
751 0x93 => {
752 self.a_reg.0 = self.op_sub(self.a_reg.0, self.e_reg.0, false);
753 }
754 0x94 => {
755 self.a_reg.0 = self.op_sub(self.a_reg.0, self.h_reg.0, false);
756 }
757 0x95 => {
758 self.a_reg.0 = self.op_sub(self.a_reg.0, self.l_reg.0, false);
759 }
760 0x96 => {
761 let value = self.mem.read_byte(self.get_hl_pair());
762 self.a_reg.0 = self.op_sub(self.a_reg.0, Byte(value), false);
763 }
764 0x97 => {
765 self.a_reg.0 = self.op_sub(self.a_reg.0, self.a_reg.0, false);
766 }
767 0x98 => {
768 self.a_reg.0 = self.op_sub(self.a_reg.0, self.b_reg.0, self.c_flag.0);
769 }
770 0x99 => {
771 self.a_reg.0 = self.op_sub(self.a_reg.0, self.c_reg.0, self.c_flag.0);
772 }
773 0x9a => {
774 self.a_reg.0 = self.op_sub(self.a_reg.0, self.d_reg.0, self.c_flag.0);
775 }
776 0x9b => {
777 self.a_reg.0 = self.op_sub(self.a_reg.0, self.e_reg.0, self.c_flag.0);
778 }
779 0x9c => {
780 self.a_reg.0 = self.op_sub(self.a_reg.0, self.h_reg.0, self.c_flag.0);
781 }
782 0x9d => {
783 self.a_reg.0 = self.op_sub(self.a_reg.0, self.l_reg.0, self.c_flag.0);
784 }
785 0x9e => {
786 let value = self.mem.read_byte(self.get_hl_pair());
787 self.a_reg.0 = self.op_sub(self.a_reg.0, Byte(value), self.c_flag.0);
788 }
789 0x9f => {
790 self.a_reg.0 = self.op_sub(self.a_reg.0, self.a_reg.0, self.c_flag.0);
791 }
792 0xa0 => {
793 self.op_ana(self.b_reg.0 .0);
794 }
795 0xa1 => {
796 self.op_ana(self.c_reg.0 .0);
797 }
798 0xa2 => {
799 self.op_ana(self.d_reg.0 .0);
800 }
801 0xa3 => {
802 self.op_ana(self.e_reg.0 .0);
803 }
804 0xa4 => {
805 self.op_ana(self.h_reg.0 .0);
806 }
807 0xa5 => {
808 self.op_ana(self.l_reg.0 .0);
809 }
810 0xa6 => {
811 let value = self.mem.read_byte(self.get_hl_pair());
812 self.op_ana(value);
813 }
814 0xa7 => {
815 self.op_ana(self.a_reg.0 .0);
816 }
817 0xa8 => {
818 self.op_xra(self.b_reg.0 .0);
819 }
820 0xa9 => {
821 self.op_xra(self.c_reg.0 .0);
822 }
823 0xaa => {
824 self.op_xra(self.d_reg.0 .0);
825 }
826 0xab => {
827 self.op_xra(self.e_reg.0 .0);
828 }
829 0xac => {
830 self.op_xra(self.h_reg.0 .0);
831 }
832 0xad => {
833 self.op_xra(self.l_reg.0 .0);
834 }
835 0xae => {
836 let value = self.mem.read_byte(self.get_hl_pair());
837 self.op_xra(value);
838 }
839 0xaf => {
840 self.op_xra(self.a_reg.0 .0);
841 }
842 0xb0 => {
843 self.op_ora(self.b_reg.0 .0);
844 }
845 0xb1 => {
846 self.op_ora(self.c_reg.0 .0);
847 }
848 0xb2 => {
849 self.op_ora(self.d_reg.0 .0);
850 }
851 0xb3 => {
852 self.op_ora(self.e_reg.0 .0);
853 }
854 0xb4 => {
855 self.op_ora(self.h_reg.0 .0);
856 }
857 0xb5 => {
858 self.op_ora(self.l_reg.0 .0);
859 }
860 0xb6 => {
861 let value = self.mem.read_byte(self.get_hl_pair());
862 self.op_ora(value);
863 }
864 0xb7 => {
865 self.op_ora(self.a_reg.0 .0);
866 }
867 0xb8 => {
868 self.op_cmp(self.b_reg.0 .0);
869 }
870 0xb9 => {
871 self.op_cmp(self.c_reg.0 .0);
872 }
873 0xba => {
874 self.op_cmp(self.d_reg.0 .0);
875 }
876 0xbb => {
877 self.op_cmp(self.e_reg.0 .0);
878 }
879 0xbc => {
880 self.op_cmp(self.h_reg.0 .0);
881 }
882 0xbd => {
883 self.op_cmp(self.l_reg.0 .0);
884 }
885 0xbe => {
886 let value = self.mem.read_byte(self.get_hl_pair());
887 self.op_cmp(value);
888 }
889 0xbf => {
890 self.op_cmp(self.a_reg.0 .0);
891 }
892 0xc0 => {
893 self.op_cond_ret(!self.z_flag.0);
894 }
895 0xc1 => {
896 let value = self.pop_stack();
897 self.set_bc_pair(value)
898 }
899 0xc2 => {
900 self.op_cond_jmp(!self.z_flag.0);
901 }
902 0xc3 => {
903 let addr = self.fetch_next_word();
904 self.op_jmp(addr);
905 }
906 0xc4 => {
907 self.op_cond_call(!self.z_flag.0);
908 }
909 0xc5 => {
910 self.push_stack(self.get_bc_pair());
911 }
912 0xc6 => {
913 let value = self.fetch_next_byte();
914 self.a_reg.0 = self.op_add(self.a_reg.0, Byte(value), false);
915 }
916 0xc7 => {
917 self.op_call(0x00);
918 }
919 0xc8 => {
920 self.op_cond_ret(self.z_flag.0);
921 }
922 0xc9 => {
923 self.op_ret();
924 }
925 0xca => {
926 self.op_cond_jmp(self.z_flag.0);
927 }
928 0xcc => {
929 self.op_cond_call(self.z_flag.0);
930 }
931 0xcd => {
932 let addr = self.fetch_next_word();
933 self.op_call(addr);
934 }
935 0xce => {
936 let value = self.fetch_next_byte();
937 self.a_reg.0 = self.op_add(self.a_reg.0, Byte(value), self.c_flag.0);
938 }
939 0xcf => {
940 self.op_call(0x08);
941 }
942 0xd0 => {
943 self.op_cond_ret(!self.c_flag.0);
944 }
945 0xd1 => {
946 let value = self.pop_stack();
947 self.set_de_pair(value)
948 }
949 0xd2 => {
950 self.op_cond_jmp(!self.c_flag.0);
951 }
952 0xd3 => {
953 let port = self.fetch_next_byte();
954 self.mem.out_port(port, self.a_reg.0 .0);
955 }
956 0xd4 => {
957 self.op_cond_call(!self.c_flag.0);
958 }
959 0xd5 => {
960 self.push_stack(self.get_de_pair());
961 }
962 0xd6 => {
963 let value = self.fetch_next_byte();
964 self.a_reg.0 = self.op_sub(self.a_reg.0, Byte(value), false);
965 }
966 0xd7 => {
967 self.op_call(0x10);
968 }
969 0xd8 => {
970 self.op_cond_ret(self.c_flag.0);
971 }
972 0xda => {
973 self.op_cond_jmp(self.c_flag.0);
974 }
975 0xdb => {
976 let port = self.fetch_next_byte();
977 self.a_reg.0 .0 = self.mem.in_port(port);
978 }
979 0xdc => {
980 self.op_cond_call(self.c_flag.0);
981 }
982 0xde => {
983 let value = self.fetch_next_byte();
984 self.a_reg.0 = self.op_sub(self.a_reg.0, Byte(value), self.c_flag.0);
985 }
986 0xdf => {
987 self.op_call(0x18);
988 }
989 0xe0 => {
990 self.op_cond_ret(!self.p_flag.0);
991 }
992 0xe1 => {
993 let value = self.pop_stack();
994 self.set_hl_pair(value)
995 }
996 0xe2 => {
997 self.op_cond_jmp(!self.p_flag.0);
998 }
999 0xe3 => {
1000 let value = self.mem.read_word(self.sp.0);
1001 self.mem.write_word(self.sp.0, self.get_hl_pair());
1002 self.set_hl_pair(value);
1003 }
1004 0xe4 => {
1005 self.op_cond_call(!self.p_flag.0);
1006 }
1007 0xe5 => {
1008 self.push_stack(self.get_hl_pair());
1009 }
1010 0xe6 => {
1011 let value = self.fetch_next_byte();
1012 self.op_ana(value);
1013 }
1014 0xe7 => {
1015 self.op_call(0x20);
1016 }
1017 0xe8 => {
1018 self.op_cond_ret(self.p_flag.0);
1019 }
1020 0xe9 => {
1021 self.pc.0 = self.get_hl_pair();
1022 }
1023 0xea => {
1024 self.op_cond_jmp(self.p_flag.0);
1025 }
1026 0xeb => {
1027 let value = self.get_de_pair();
1028 self.set_de_pair(self.get_hl_pair());
1029 self.set_hl_pair(value);
1030 }
1031 0xec => {
1032 self.op_cond_call(self.p_flag.0);
1033 }
1034 0xee => {
1035 let value = self.fetch_next_byte();
1036 self.op_xra(value);
1037 }
1038 0xef => {
1039 self.op_call(0x28);
1040 }
1041 0xf0 => {
1042 self.op_cond_ret(!self.s_flag.0);
1043 }
1044 0xf1 => {
1045 let value = self.pop_stack();
1046 self.a_reg.0 .0 = (value >> 8) as u8;
1047
1048 let psw = (value & 0xff) as u8;
1049 self.s_flag.0 = ((psw >> 7) & 1) != 0;
1050 self.z_flag.0 = ((psw >> 6) & 1) != 0;
1051 self.h_flag.0 = ((psw >> 4) & 1) != 0;
1052 self.p_flag.0 = ((psw >> 2) & 1) != 0;
1053 self.c_flag.0 = ((psw >> 0) & 1) != 0;
1054 }
1055 0xf2 => {
1056 self.op_cond_jmp(!self.s_flag.0);
1057 }
1058 0xf3 => {
1059 self.int.filp_flop = true;
1060 }
1061 0xf4 => {
1062 self.op_cond_call(!self.s_flag.0);
1063 }
1064 0xf5 => {
1065 let mut psw: u8 = 0;
1066 psw |= (self.s_flag.0 as u8) << 7;
1067 psw |= (self.z_flag.0 as u8) << 6;
1068 psw |= (self.h_flag.0 as u8) << 4;
1069 psw |= (self.p_flag.0 as u8) << 2;
1070 psw |= 1 << 1;
1071 psw |= (self.c_flag.0 as u8) << 0;
1072
1073 self.push_stack((self.a_reg.0 .0 as u16) << 8 | (psw as u16));
1074 }
1075 0xf6 => {
1076 let value = self.fetch_next_byte();
1077 self.op_ora(value);
1078 }
1079 0xf7 => {
1080 self.op_call(0x30);
1081 }
1082 0xf8 => {
1083 self.op_cond_ret(self.s_flag.0);
1084 }
1085 0xf9 => {
1086 self.sp.0 = self.get_hl_pair();
1087 }
1088 0xfa => {
1089 self.op_cond_jmp(self.s_flag.0);
1090 }
1091 0xfb => {
1092 self.int.filp_flop = false;
1093 self.int.delay.0 = 1;
1094 }
1095 0xfc => {
1096 self.op_cond_call(self.s_flag.0);
1097 }
1098 0xfe => {
1099 let value = self.fetch_next_byte();
1100 self.op_cmp(value);
1101 }
1102 0xff => {
1103 self.op_call(0x38);
1104 }
1105
1106 0x08 | 0x10 | 0x18 | 0x20 | 0x28 | 0x30 | 0x38 => {}
1108 0xd9 => {
1109 self.op_ret();
1110 }
1111 0xdd | 0xed | 0xfd => {
1112 let addr = self.fetch_next_word();
1113 self.op_call(addr);
1114 }
1115 0xcb => {
1116 let addr = self.fetch_next_word();
1117 self.op_jmp(addr);
1118 }
1119 }
1120 }
1121
1122 pub fn run(&mut self) {
1123 while !self.halt {
1124 let op = self.fetch_next_byte();
1125 self.exec(op);
1126 }
1127 }
1128}