| 363 | } |
| 364 | |
| 365 | static void cpu_execute_daa(void) { |
| 366 | eZ80registers_t *r = &cpu.registers; |
| 367 | uint8_t old = r->A; |
| 368 | uint8_t v = 0; |
| 369 | if ((r->A & 0xF) > 9 || r->flags.H) { |
| 370 | v += 6; |
| 371 | } |
| 372 | if (((r->A + v) >> 4) > 9 || cpuflag_carry_b(r->A + v) || r->flags.C) { |
| 373 | v += 0x60; |
| 374 | } |
| 375 | if (r->flags.N) { |
| 376 | r->A -= v; |
| 377 | r->F = cpuflag_sign_b(r->A) | cpuflag_zero(r->A) |
| 378 | | cpuflag_undef(r->F) | cpuflag_parity(r->A) |
| 379 | | cpuflag_subtract(r->flags.N) | cpuflag_c(v >= 0x60) |
| 380 | | cpuflag_halfcarry_b_sub(old, v, 0); |
| 381 | } else { |
| 382 | r->A += v; |
| 383 | r->F = cpuflag_sign_b(r->A) | cpuflag_zero(r->A) |
| 384 | | cpuflag_undef(r->F) | cpuflag_parity(r->A) |
| 385 | | cpuflag_subtract(r->flags.N) | cpuflag_c(v >= 0x60) |
| 386 | | cpuflag_halfcarry_b_add(old, v, 0); |
| 387 | } |
| 388 | } |
| 389 | |
| 390 | static uint32_t cpu_dec_bc_partial_mode() { |
| 391 | uint32_t value = cpu_mask_mode(cpu.registers.BC - 1, cpu.L); |
no outgoing calls
no test coverage detected