| @@ -149,7 +149,28 @@ static uint8_t z80_inst_ld_dd_nn(Z80 *z80, uint8_t opcode) | |||||
| // EX AF, AF′ | // EX AF, AF′ | ||||
| // EXX | |||||
| /* | |||||
| EXX (0xD9): | |||||
| Exchange the 2-byte registers with their shadows | |||||
| (BC <=> BC', DE <=> DE', HL <=> HL'). | |||||
| */ | |||||
| static uint8_t z80_inst_exx(Z80 *z80, uint8_t opcode) | |||||
| { | |||||
| (void) opcode; | |||||
| uint16_t bc = get_pair(z80, REG_BC), | |||||
| de = get_pair(z80, REG_DE), | |||||
| hl = get_pair(z80, REG_HL); | |||||
| set_pair(z80, REG_BC, get_pair(z80, REG_BC_)); | |||||
| set_pair(z80, REG_DE, get_pair(z80, REG_DE_)); | |||||
| set_pair(z80, REG_HL, get_pair(z80, REG_HL_)); | |||||
| set_pair(z80, REG_BC_, bc); | |||||
| set_pair(z80, REG_DE_, de); | |||||
| set_pair(z80, REG_HL_, hl); | |||||
| z80->regfile.pc++; | |||||
| return 4; | |||||
| } | |||||
| // EX (SP), HL | // EX (SP), HL | ||||
| @@ -253,11 +274,43 @@ static uint8_t z80_inst_nop(Z80 *z80, uint8_t opcode) | |||||
| return 4; | return 4; | ||||
| } | } | ||||
| // HALT | |||||
| /* | |||||
| HALT (0x76): | |||||
| Suspend CPU operation by repeatedly executing NOPs until an interrupt or | |||||
| reset. | |||||
| */ | |||||
| static uint8_t z80_inst_halt(Z80 *z80, uint8_t opcode) | |||||
| { | |||||
| (void) z80; | |||||
| (void) opcode; | |||||
| return 4; | |||||
| } | |||||
| // DI | |||||
| /* | |||||
| DI (0xF3): | |||||
| Disable maskable interrupts by resetting both flip-flops. | |||||
| */ | |||||
| static uint8_t z80_inst_di(Z80 *z80, uint8_t opcode) | |||||
| { | |||||
| (void) opcode; | |||||
| z80->regfile.iff1 = false; | |||||
| z80->regfile.iff2 = false; | |||||
| z80->regfile.pc++; | |||||
| return 4; | |||||
| } | |||||
| // EI | |||||
| /* | |||||
| EI (0xFB): | |||||
| Enable maskable interrupts by setting both flip-flops. | |||||
| */ | |||||
| static uint8_t z80_inst_ei(Z80 *z80, uint8_t opcode) | |||||
| { | |||||
| (void) opcode; | |||||
| z80->regfile.iff1 = true; | |||||
| z80->regfile.iff2 = true; | |||||
| z80->regfile.pc++; | |||||
| return 4; | |||||
| } | |||||
| // IM 0 | // IM 0 | ||||
| @@ -534,7 +587,7 @@ static uint8_t (*instruction_lookup_table[256])(Z80*, uint8_t) = { | |||||
| [0x73] = z80_inst_unimplemented, // TODO | [0x73] = z80_inst_unimplemented, // TODO | ||||
| [0x74] = z80_inst_unimplemented, // TODO | [0x74] = z80_inst_unimplemented, // TODO | ||||
| [0x75] = z80_inst_unimplemented, // TODO | [0x75] = z80_inst_unimplemented, // TODO | ||||
| [0x76] = z80_inst_unimplemented, // TODO | |||||
| [0x76] = z80_inst_halt, | |||||
| [0x77] = z80_inst_unimplemented, // TODO | [0x77] = z80_inst_unimplemented, // TODO | ||||
| [0x78] = z80_inst_unimplemented, // TODO | [0x78] = z80_inst_unimplemented, // TODO | ||||
| [0x79] = z80_inst_unimplemented, // TODO | [0x79] = z80_inst_unimplemented, // TODO | ||||
| @@ -633,7 +686,7 @@ static uint8_t (*instruction_lookup_table[256])(Z80*, uint8_t) = { | |||||
| [0xD6] = z80_inst_unimplemented, // TODO | [0xD6] = z80_inst_unimplemented, // TODO | ||||
| [0xD7] = z80_inst_unimplemented, // TODO | [0xD7] = z80_inst_unimplemented, // TODO | ||||
| [0xD8] = z80_inst_unimplemented, // TODO | [0xD8] = z80_inst_unimplemented, // TODO | ||||
| [0xD9] = z80_inst_unimplemented, // TODO | |||||
| [0xD9] = z80_inst_exx, | |||||
| [0xDA] = z80_inst_unimplemented, // TODO | [0xDA] = z80_inst_unimplemented, // TODO | ||||
| [0xDB] = z80_inst_unimplemented, // TODO | [0xDB] = z80_inst_unimplemented, // TODO | ||||
| [0xDC] = z80_inst_unimplemented, // TODO | [0xDC] = z80_inst_unimplemented, // TODO | ||||
| @@ -659,7 +712,7 @@ static uint8_t (*instruction_lookup_table[256])(Z80*, uint8_t) = { | |||||
| [0xF0] = z80_inst_unimplemented, // TODO | [0xF0] = z80_inst_unimplemented, // TODO | ||||
| [0xF1] = z80_inst_unimplemented, // TODO | [0xF1] = z80_inst_unimplemented, // TODO | ||||
| [0xF2] = z80_inst_unimplemented, // TODO | [0xF2] = z80_inst_unimplemented, // TODO | ||||
| [0xF3] = z80_inst_unimplemented, // TODO | |||||
| [0xF3] = z80_inst_di, | |||||
| [0xF4] = z80_inst_unimplemented, // TODO | [0xF4] = z80_inst_unimplemented, // TODO | ||||
| [0xF5] = z80_inst_unimplemented, // TODO | [0xF5] = z80_inst_unimplemented, // TODO | ||||
| [0xF6] = z80_inst_unimplemented, // TODO | [0xF6] = z80_inst_unimplemented, // TODO | ||||
| @@ -667,7 +720,7 @@ static uint8_t (*instruction_lookup_table[256])(Z80*, uint8_t) = { | |||||
| [0xF8] = z80_inst_unimplemented, // TODO | [0xF8] = z80_inst_unimplemented, // TODO | ||||
| [0xF9] = z80_inst_unimplemented, // TODO | [0xF9] = z80_inst_unimplemented, // TODO | ||||
| [0xFA] = z80_inst_unimplemented, // TODO | [0xFA] = z80_inst_unimplemented, // TODO | ||||
| [0xFB] = z80_inst_unimplemented, // TODO | |||||
| [0xFB] = z80_inst_ei, | |||||
| [0xFC] = z80_inst_unimplemented, // TODO | [0xFC] = z80_inst_unimplemented, // TODO | ||||
| [0xFD] = z80_inst_unimplemented, // TODO | [0xFD] = z80_inst_unimplemented, // TODO | ||||
| [0xFE] = z80_inst_unimplemented, // TODO | [0xFE] = z80_inst_unimplemented, // TODO | ||||