mirror of
https://github.com/FranLMSP/rultra64.git
synced 2026-01-01 07:51:34 -05:00
Some load and store instructions
This commit is contained in:
59
src/cpu.rs
59
src/cpu.rs
@@ -408,6 +408,24 @@ impl CPU {
|
||||
// self.lwr(rt, offset, base, mmu);
|
||||
todo!("Receive MMU parameter");
|
||||
}
|
||||
// SB
|
||||
0b1010_00 => {
|
||||
// let (rt, offset, base) = params_rt_offset_base(opcode);
|
||||
// self.sb(rt, offset, base, mmu);
|
||||
todo!("Receive MMU parameter");
|
||||
}
|
||||
// SH
|
||||
0b1010_00 => {
|
||||
// let (rt, offset, base) = params_rt_offset_base(opcode);
|
||||
// self.sh(rt, offset, base, mmu);
|
||||
todo!("Receive MMU parameter");
|
||||
}
|
||||
// SW
|
||||
0b1010_00 => {
|
||||
// let (rt, offset, base) = params_rt_offset_base(opcode);
|
||||
// self.sw(rt, offset, base, mmu);
|
||||
todo!("Receive MMU parameter");
|
||||
}
|
||||
_ => unimplemented!(),
|
||||
}
|
||||
}
|
||||
@@ -869,6 +887,22 @@ impl CPU {
|
||||
let result = ((t & bitmask) | result) as i32;
|
||||
self.registers.set_by_number(rt, result as i64)
|
||||
}
|
||||
|
||||
pub fn sb(&mut self, rt: usize, offset: i16, base: usize, mmu: &mut MMU) {
|
||||
let address = self.registers.get_by_number(base) + (offset as i64);
|
||||
let byte = self.registers.get_by_number(rt).to_le_bytes()[0] as u8;
|
||||
mmu.write_virtual(address, (self.registers.get_by_number(rt) as i8).to_be_bytes());
|
||||
}
|
||||
|
||||
pub fn sh(&mut self, rt: usize, offset: i16, base: usize, mmu: &mut MMU) {
|
||||
let address = self.registers.get_by_number(base) + (offset as i64);
|
||||
mmu.write_virtual(address, (self.registers.get_by_number(rt) as i16).to_be_bytes());
|
||||
}
|
||||
|
||||
pub fn sw(&mut self, rt: usize, offset: i16, base: usize, mmu: &mut MMU) {
|
||||
let address = self.registers.get_by_number(base) + (offset as i64);
|
||||
mmu.write_virtual(address, (self.registers.get_by_number(rt) as i32).to_be_bytes());
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -1514,4 +1548,29 @@ mod cpu_instructions_tests {
|
||||
fn test_lwr() {
|
||||
todo!("test LWR");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_sb() {
|
||||
todo!("test SB");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_sh() {
|
||||
todo!("test SH");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_sw() {
|
||||
todo!("test sw");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_swl() {
|
||||
todo!("test swl");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_swr() {
|
||||
todo!("test swr");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,4 +60,12 @@ impl MMU {
|
||||
pub fn read_physical(&self, _address: i64, _bytes: usize) -> Vec<u8> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
pub fn write_virtual(&self, address: i64, data: Vec<u8>) {
|
||||
let converted_address = MMU::convert(address);
|
||||
self.write_physical(converted_address, data)
|
||||
}
|
||||
|
||||
pub fn write_physical(&self, _address: i64, _data: Vec<u8>) {
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user