better instructions...

This commit is contained in:
Alex Janka 2023-02-24 15:59:51 +11:00
parent 17a140e77c
commit ce76c32a21

View file

@ -6,19 +6,27 @@ use std::ops::{BitAnd, BitOr};
impl Cpu { impl Cpu {
pub(crate) fn pop_word(&mut self) -> u16 { pub(crate) fn pop_word(&mut self) -> u16 {
let address = self.reg.sp;
self.reg.sp = self.reg.sp.wrapping_add(0x2);
let mut word: u16 = 0x0; let mut word: u16 = 0x0;
word.set_low(self.memory.get(address)); word.set_low(self.memory.get(self.reg.sp));
word.set_high(self.memory.get(address.wrapping_add(1))); self.sp_inc();
word.set_high(self.memory.get(self.reg.sp));
self.sp_inc();
word word
} }
pub(crate) fn push(&mut self, word: u16) { pub(crate) fn push(&mut self, word: u16) {
let address = self.reg.sp; self.sp_dec();
self.memory.set(address.wrapping_sub(1), word.get_high()); self.memory.set(self.reg.sp, word.get_high());
self.memory.set(address.wrapping_sub(2), word.get_low()); self.sp_dec();
self.reg.sp = address.wrapping_sub(2); self.memory.set(self.reg.sp, word.get_low());
}
fn sp_inc(&mut self) {
self.reg.sp = self.reg.sp.wrapping_add(1);
}
fn sp_dec(&mut self) {
self.reg.sp = self.reg.sp.wrapping_sub(1);
} }
pub(crate) fn ld_immediate_byte(&mut self) -> u8 { pub(crate) fn ld_immediate_byte(&mut self) -> u8 {
@ -34,11 +42,12 @@ impl Cpu {
pub(crate) fn rotate_with_carry(&mut self, byte: u8, direction: Direction) -> u8 { pub(crate) fn rotate_with_carry(&mut self, byte: u8, direction: Direction) -> u8 {
let (mut rotated, carry) = rotate(byte, &direction); let (mut rotated, carry) = rotate(byte, &direction);
self.clear_flag(Flags::Carry);
if carry { if carry {
rotated += get_rotation_carry(&direction); rotated += get_rotation_carry(&direction);
self.set_flag(Flags::Carry); self.set_flag(Flags::Carry);
} }
self.set_or_clear_flag(Flags::Zero, rotated == 0x0); self.clear_flag(Flags::Zero);
self.clear_flag(Flags::HalfCarry); self.clear_flag(Flags::HalfCarry);
self.clear_flag(Flags::NSubtract); self.clear_flag(Flags::NSubtract);
rotated rotated
@ -52,8 +61,10 @@ impl Cpu {
} }
if carry { if carry {
self.set_flag(Flags::Carry); self.set_flag(Flags::Carry);
} else {
self.clear_flag(Flags::Carry);
} }
self.set_or_clear_flag(Flags::Zero, rotated == 0x0); self.clear_flag(Flags::Zero);
self.clear_flag(Flags::HalfCarry); self.clear_flag(Flags::HalfCarry);
self.clear_flag(Flags::NSubtract); self.clear_flag(Flags::NSubtract);
rotated rotated