mirror of https://github.com/mlaux/gb6.git
implement shifts
This commit is contained in:
parent
bc980ec1e5
commit
bbb398f524
67
src/cpu.c
67
src/cpu.c
|
@ -164,11 +164,55 @@ static u8 rrc(struct cpu *cpu, u8 val)
|
||||||
|
|
||||||
static u8 shift_left(struct cpu *cpu, u8 value)
|
static u8 shift_left(struct cpu *cpu, u8 value)
|
||||||
{
|
{
|
||||||
return 0;
|
int result = value << 1;
|
||||||
|
if (result == 0) {
|
||||||
|
set_flag(cpu, FLAG_ZERO);
|
||||||
|
} else {
|
||||||
|
clear_flag(cpu, FLAG_ZERO);
|
||||||
|
}
|
||||||
|
if (value & 0x80) {
|
||||||
|
set_flag(cpu, FLAG_CARRY);
|
||||||
|
} else {
|
||||||
|
clear_flag(cpu, FLAG_CARRY);
|
||||||
|
}
|
||||||
|
clear_flag(cpu, FLAG_SIGN);
|
||||||
|
clear_flag(cpu, FLAG_HALF_CARRY);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 shift_right(struct cpu *cpu, u8 value)
|
static u8 shift_right(struct cpu *cpu, u8 value)
|
||||||
{
|
{
|
||||||
|
int result = (signed) value >> 1;
|
||||||
|
if (result == 0) {
|
||||||
|
set_flag(cpu, FLAG_ZERO);
|
||||||
|
} else {
|
||||||
|
clear_flag(cpu, FLAG_ZERO);
|
||||||
|
}
|
||||||
|
if (value & 0x1) {
|
||||||
|
set_flag(cpu, FLAG_CARRY);
|
||||||
|
} else {
|
||||||
|
clear_flag(cpu, FLAG_CARRY);
|
||||||
|
}
|
||||||
|
clear_flag(cpu, FLAG_SIGN);
|
||||||
|
clear_flag(cpu, FLAG_HALF_CARRY);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 srl(struct cpu *cpu, u8 value)
|
||||||
|
{
|
||||||
|
int result = value >> 1;
|
||||||
|
if (result == 0) {
|
||||||
|
set_flag(cpu, FLAG_ZERO);
|
||||||
|
} else {
|
||||||
|
clear_flag(cpu, FLAG_ZERO);
|
||||||
|
}
|
||||||
|
if (value & 0x1) {
|
||||||
|
set_flag(cpu, FLAG_CARRY);
|
||||||
|
} else {
|
||||||
|
clear_flag(cpu, FLAG_CARRY);
|
||||||
|
}
|
||||||
|
clear_flag(cpu, FLAG_SIGN);
|
||||||
|
clear_flag(cpu, FLAG_HALF_CARRY);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,7 +412,7 @@ static void extended_insn(struct cpu *cpu, u8 insn)
|
||||||
shift_left,
|
shift_left,
|
||||||
shift_right,
|
shift_right,
|
||||||
swap,
|
swap,
|
||||||
shift_right // TODO SRL
|
srl,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef GB6_DEBUG
|
#ifdef GB6_DEBUG
|
||||||
|
@ -462,6 +506,9 @@ void cpu_step(struct cpu *cpu)
|
||||||
write_bc(cpu, read16(cpu, cpu->pc));
|
write_bc(cpu, read16(cpu, cpu->pc));
|
||||||
cpu->pc += 2;
|
cpu->pc += 2;
|
||||||
break;
|
break;
|
||||||
|
case 0x02: // LD (BC), A
|
||||||
|
write8(cpu, read_bc(cpu), cpu->a);
|
||||||
|
break;
|
||||||
case 0x0f: // RRCA
|
case 0x0f: // RRCA
|
||||||
cpu->a = rrc(cpu, cpu->a);
|
cpu->a = rrc(cpu, cpu->a);
|
||||||
break;
|
break;
|
||||||
|
@ -516,7 +563,7 @@ void cpu_step(struct cpu *cpu)
|
||||||
|
|
||||||
case 0x33: cpu->sp++; break;
|
case 0x33: cpu->sp++; break;
|
||||||
case 0x34: temp = read8(cpu, read_hl(cpu)); inc_with_carry(cpu, &temp); write8(cpu, read_hl(cpu), temp); break;
|
case 0x34: temp = read8(cpu, read_hl(cpu)); inc_with_carry(cpu, &temp); write8(cpu, read_hl(cpu), temp); break;
|
||||||
case 0x35: temp = read8(cpu, read_hl(cpu)); dec_with_carry(cpu, &temp); write8(cpu, read_hl(cpu), temp); break;
|
case 0x35: temp = read8(cpu, read_hl(cpu)); dec_with_carry(cpu, &temp); write8(cpu, read_hl(cpu), temp); break;
|
||||||
|
|
||||||
case 0x3b: cpu->sp--; break;
|
case 0x3b: cpu->sp--; break;
|
||||||
case 0x3c: inc_with_carry(cpu, &cpu->a); break;
|
case 0x3c: inc_with_carry(cpu, &cpu->a); break;
|
||||||
|
@ -592,8 +639,8 @@ void cpu_step(struct cpu *cpu)
|
||||||
case 0x6d: break; // copy L to L
|
case 0x6d: break; // copy L to L
|
||||||
case 0x6e: cpu->l = read8(cpu, read_hl(cpu)); break;
|
case 0x6e: cpu->l = read8(cpu, read_hl(cpu)); break;
|
||||||
case 0x6f: cpu->l = cpu->a; break;
|
case 0x6f: cpu->l = cpu->a; break;
|
||||||
|
|
||||||
// dest = *HL
|
// dest is *HL
|
||||||
case 0x70: write8(cpu, read_hl(cpu), cpu->b); break;
|
case 0x70: write8(cpu, read_hl(cpu), cpu->b); break;
|
||||||
case 0x71: write8(cpu, read_hl(cpu), cpu->c); break;
|
case 0x71: write8(cpu, read_hl(cpu), cpu->c); break;
|
||||||
case 0x72: write8(cpu, read_hl(cpu), cpu->d); break;
|
case 0x72: write8(cpu, read_hl(cpu), cpu->d); break;
|
||||||
|
@ -690,6 +737,16 @@ void cpu_step(struct cpu *cpu)
|
||||||
if (!flag_isset(cpu, FLAG_ZERO)) {
|
if (!flag_isset(cpu, FLAG_ZERO)) {
|
||||||
push(cpu, cpu->pc);
|
push(cpu, cpu->pc);
|
||||||
cpu->pc = temp16;
|
cpu->pc = temp16;
|
||||||
|
cpu->cycle_count += instructions[opc].cycles_branch - instructions[opc].cycles;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0xcc: // CALL Z, u16
|
||||||
|
temp16 = read16(cpu, cpu->pc);
|
||||||
|
cpu->pc += 2;
|
||||||
|
if (flag_isset(cpu, FLAG_ZERO)) {
|
||||||
|
push(cpu, cpu->pc);
|
||||||
|
cpu->pc = temp16;
|
||||||
|
cpu->cycle_count += instructions[opc].cycles_branch - instructions[opc].cycles;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0xd0: // RET NC
|
case 0xd0: // RET NC
|
||||||
|
|
Loading…
Reference in New Issue