@@ 1,3 1,4 @@
+fn exec_rlc_a(cpu: *sm83) void = abort("TODO");
fn exec_rlc_b(cpu: *sm83) void = abort("TODO");
fn exec_rlc_c(cpu: *sm83) void = abort("TODO");
fn exec_rlc_d(cpu: *sm83) void = abort("TODO");
@@ 5,7 6,8 @@ fn exec_rlc_e(cpu: *sm83) void = abort("TODO");
fn exec_rlc_h(cpu: *sm83) void = abort("TODO");
fn exec_rlc_l(cpu: *sm83) void = abort("TODO");
fn exec_rlc_hl(cpu: *sm83) void = abort("TODO");
-fn exec_rlc_a(cpu: *sm83) void = abort("TODO");
+
+fn exec_rrc_a(cpu: *sm83) void = abort("TODO");
fn exec_rrc_b(cpu: *sm83) void = abort("TODO");
fn exec_rrc_c(cpu: *sm83) void = abort("TODO");
fn exec_rrc_d(cpu: *sm83) void = abort("TODO");
@@ 13,7 15,8 @@ fn exec_rrc_e(cpu: *sm83) void = abort("TODO");
fn exec_rrc_h(cpu: *sm83) void = abort("TODO");
fn exec_rrc_l(cpu: *sm83) void = abort("TODO");
fn exec_rrc_hl(cpu: *sm83) void = abort("TODO");
-fn exec_rrc_a(cpu: *sm83) void = abort("TODO");
+
+fn exec_rl_a(cpu: *sm83) void = abort("TODO");
fn exec_rl_b(cpu: *sm83) void = abort("TODO");
fn exec_rl_c(cpu: *sm83) void = abort("TODO");
fn exec_rl_d(cpu: *sm83) void = abort("TODO");
@@ 21,7 24,8 @@ fn exec_rl_e(cpu: *sm83) void = abort("TODO");
fn exec_rl_h(cpu: *sm83) void = abort("TODO");
fn exec_rl_l(cpu: *sm83) void = abort("TODO");
fn exec_rl_hl(cpu: *sm83) void = abort("TODO");
-fn exec_rl_a(cpu: *sm83) void = abort("TODO");
+
+fn exec_rr_a(cpu: *sm83) void = abort("TODO");
fn exec_rr_b(cpu: *sm83) void = abort("TODO");
fn exec_rr_c(cpu: *sm83) void = abort("TODO");
fn exec_rr_d(cpu: *sm83) void = abort("TODO");
@@ 29,7 33,8 @@ fn exec_rr_e(cpu: *sm83) void = abort("TODO");
fn exec_rr_h(cpu: *sm83) void = abort("TODO");
fn exec_rr_l(cpu: *sm83) void = abort("TODO");
fn exec_rr_hl(cpu: *sm83) void = abort("TODO");
-fn exec_rr_a(cpu: *sm83) void = abort("TODO");
+
+fn exec_sla_a(cpu: *sm83) void = abort("TODO");
fn exec_sla_b(cpu: *sm83) void = abort("TODO");
fn exec_sla_c(cpu: *sm83) void = abort("TODO");
fn exec_sla_d(cpu: *sm83) void = abort("TODO");
@@ 37,7 42,8 @@ fn exec_sla_e(cpu: *sm83) void = abort("TODO");
fn exec_sla_h(cpu: *sm83) void = abort("TODO");
fn exec_sla_l(cpu: *sm83) void = abort("TODO");
fn exec_sla_hl(cpu: *sm83) void = abort("TODO");
-fn exec_sla_a(cpu: *sm83) void = abort("TODO");
+
+fn exec_sra_a(cpu: *sm83) void = abort("TODO");
fn exec_sra_b(cpu: *sm83) void = abort("TODO");
fn exec_sra_c(cpu: *sm83) void = abort("TODO");
fn exec_sra_d(cpu: *sm83) void = abort("TODO");
@@ 45,15 51,27 @@ fn exec_sra_e(cpu: *sm83) void = abort("TODO");
fn exec_sra_h(cpu: *sm83) void = abort("TODO");
fn exec_sra_l(cpu: *sm83) void = abort("TODO");
fn exec_sra_hl(cpu: *sm83) void = abort("TODO");
-fn exec_sra_a(cpu: *sm83) void = abort("TODO");
-fn exec_swap_b(cpu: *sm83) void = abort("TODO");
-fn exec_swap_c(cpu: *sm83) void = abort("TODO");
-fn exec_swap_d(cpu: *sm83) void = abort("TODO");
-fn exec_swap_e(cpu: *sm83) void = abort("TODO");
-fn exec_swap_h(cpu: *sm83) void = abort("TODO");
-fn exec_swap_l(cpu: *sm83) void = abort("TODO");
-fn exec_swap_hl(cpu: *sm83) void = abort("TODO");
-fn exec_swap_a(cpu: *sm83) void = abort("TODO");
+
+fn swap(reg: *u8) void = {
+ const lower = *reg & 0xF;
+ const upper = *reg & 0xF0;
+ *reg |= (upper >> 8) | (lower << 8);
+};
+
+fn exec_swap_a(cpu: *sm83) void = swap(&cpu.regs.A);
+fn exec_swap_b(cpu: *sm83) void = swap(&cpu.regs.B);
+fn exec_swap_c(cpu: *sm83) void = swap(&cpu.regs.C);
+fn exec_swap_d(cpu: *sm83) void = swap(&cpu.regs.D);
+fn exec_swap_e(cpu: *sm83) void = swap(&cpu.regs.E);
+fn exec_swap_h(cpu: *sm83) void = swap(&cpu.regs.H);
+fn exec_swap_l(cpu: *sm83) void = swap(&cpu.regs.L);
+fn exec_swap_hl(cpu: *sm83) void = {
+ let v = readb(cpu, cpu.regs.HL);
+ swap(&v);
+ writeb(cpu, cpu.regs.HL, v);
+};
+
+fn exec_srl_a(cpu: *sm83) void = abort("TODO");
fn exec_srl_b(cpu: *sm83) void = abort("TODO");
fn exec_srl_c(cpu: *sm83) void = abort("TODO");
fn exec_srl_d(cpu: *sm83) void = abort("TODO");
@@ 61,7 79,7 @@ fn exec_srl_e(cpu: *sm83) void = abort("TODO");
fn exec_srl_h(cpu: *sm83) void = abort("TODO");
fn exec_srl_l(cpu: *sm83) void = abort("TODO");
fn exec_srl_hl(cpu: *sm83) void = abort("TODO");
-fn exec_srl_a(cpu: *sm83) void = abort("TODO");
+
fn exec_bit_0_b(cpu: *sm83) void = abort("TODO");
fn exec_bit_0_c(cpu: *sm83) void = abort("TODO");
fn exec_bit_0_d(cpu: *sm83) void = abort("TODO");
@@ 126,6 144,7 @@ fn exec_bit_7_h(cpu: *sm83) void = abort("TODO");
fn exec_bit_7_l(cpu: *sm83) void = abort("TODO");
fn exec_bit_7_hl(cpu: *sm83) void = abort("TODO");
fn exec_bit_7_a(cpu: *sm83) void = abort("TODO");
+
fn exec_res_0_b(cpu: *sm83) void = abort("TODO");
fn exec_res_0_c(cpu: *sm83) void = abort("TODO");
fn exec_res_0_d(cpu: *sm83) void = abort("TODO");
@@ 190,6 209,7 @@ fn exec_res_7_h(cpu: *sm83) void = abort("TODO");
fn exec_res_7_l(cpu: *sm83) void = abort("TODO");
fn exec_res_7_hl(cpu: *sm83) void = abort("TODO");
fn exec_res_7_a(cpu: *sm83) void = abort("TODO");
+
fn exec_set_0_b(cpu: *sm83) void = abort("TODO");
fn exec_set_0_c(cpu: *sm83) void = abort("TODO");
fn exec_set_0_d(cpu: *sm83) void = abort("TODO");