| @@ -147,6 +147,15 @@ static inline void set_flags_bitshift(Z80 *z80, uint8_t res, uint8_t bit) | |||||
| } | } | ||||
| /* | /* | ||||
| Set the flags for a RLD or RRD instruction. | |||||
| */ | |||||
| static inline void set_flags_rd(Z80 *z80) | |||||
| { | |||||
| uint8_t a = z80->regs.a; | |||||
| set_flags(z80, 0, 0, PARITY(a), F3(a), 0, F5(a), ZERO(a), SIGN(a), 0xFE); | |||||
| } | |||||
| /* | |||||
| Set the flags for a DAA instruction. | Set the flags for a DAA instruction. | ||||
| */ | */ | ||||
| static inline void set_flags_daa(Z80 *z80, uint8_t old, uint8_t adjust) | static inline void set_flags_daa(Z80 *z80, uint8_t old, uint8_t adjust) | ||||
| @@ -1767,9 +1767,39 @@ static uint8_t z80_inst_srl_hl(Z80 *z80, uint8_t opcode) | |||||
| TODO | TODO | ||||
| */ | */ | ||||
| // TODO: RLD | |||||
| /* | |||||
| RLD (0xED6F): | |||||
| Low nibble of (HL) is copied to high nibble of (HL). Old high nibble of | |||||
| (HL) is copied to low nibble of A. Old low nibble of A is copied to low | |||||
| nibble of (HL). | |||||
| */ | |||||
| static uint8_t z80_inst_rld(Z80 *z80, uint8_t opcode) | |||||
| { | |||||
| (void) opcode; | |||||
| uint8_t hl = mmu_read_byte(z80->mmu, z80->regs.hl); | |||||
| uint8_t newhl = (hl << 4) | (z80->regs.a & 0x0F); | |||||
| z80->regs.a = (z80->regs.a & 0xF0) | (hl >> 4); | |||||
| mmu_write_byte(z80->mmu, z80->regs.hl, newhl); | |||||
| set_flags_rd(z80); | |||||
| return 18; | |||||
| } | |||||
| // TODO: RRD | |||||
| /* | |||||
| RRD (0xED67): | |||||
| Low nibble of A is copied to high nibble of (HL). Old high nibble of | |||||
| (HL) is copied to low nibble of (HL). Old low nibble of (HL) is copied to | |||||
| low nibble of A. | |||||
| */ | |||||
| static uint8_t z80_inst_rrd(Z80 *z80, uint8_t opcode) | |||||
| { | |||||
| (void) opcode; | |||||
| uint8_t hl = mmu_read_byte(z80->mmu, z80->regs.hl); | |||||
| uint8_t newhl = (z80->regs.a << 4) | (hl >> 4); | |||||
| z80->regs.a = (z80->regs.a & 0xF0) | (hl & 0x0F); | |||||
| mmu_write_byte(z80->mmu, z80->regs.hl, newhl); | |||||
| set_flags_rd(z80); | |||||
| return 18; | |||||
| } | |||||
| /* | /* | ||||
| BIT b, r (0xCB40, 0xCB41, 0xCB42, 0xCB43, 0xCB44, 0xCB45, 0xCB47, 0xCB48, | BIT b, r (0xCB40, 0xCB41, 0xCB42, 0xCB43, 0xCB44, 0xCB45, 0xCB47, 0xCB48, | ||||
| @@ -364,7 +364,7 @@ static DispatchTable instruction_table_extended = { | |||||
| [0x64] = z80_inst_neg, | [0x64] = z80_inst_neg, | ||||
| [0x65] = z80_inst_retn, | [0x65] = z80_inst_retn, | ||||
| [0x66] = z80_inst_im, | [0x66] = z80_inst_im, | ||||
| [0x67] = z80_inst_unimplemented, // TODO | |||||
| [0x67] = z80_inst_rrd, | |||||
| [0x68] = z80_inst_in_r_c, | [0x68] = z80_inst_in_r_c, | ||||
| [0x69] = z80_inst_out_c_r, | [0x69] = z80_inst_out_c_r, | ||||
| [0x6A] = z80_inst_adc_hl_ss, | [0x6A] = z80_inst_adc_hl_ss, | ||||
| @@ -372,7 +372,7 @@ static DispatchTable instruction_table_extended = { | |||||
| [0x6C] = z80_inst_neg, | [0x6C] = z80_inst_neg, | ||||
| [0x6D] = z80_inst_retn, | [0x6D] = z80_inst_retn, | ||||
| [0x6E] = z80_inst_im, | [0x6E] = z80_inst_im, | ||||
| [0x6F] = z80_inst_unimplemented, // TODO | |||||
| [0x6F] = z80_inst_rld, | |||||
| [0x70] = z80_inst_in_r_c, | [0x70] = z80_inst_in_r_c, | ||||
| [0x71] = z80_inst_out_c_r, | [0x71] = z80_inst_out_c_r, | ||||
| [0x72] = z80_inst_sbc_hl_ss, | [0x72] = z80_inst_sbc_hl_ss, | ||||