diff --git a/src/cpu.rs b/src/cpu.rs index 83ebe87..d329494 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -168,7 +168,7 @@ impl Cpu { pub fn push_stack_8(&mut self, byte: u8) { let decremented_stack_pointer = self.stack_pointer.overflowing_sub(1); self.stack_pointer = decremented_stack_pointer.0; - self.bus.memory.write_8(self.stack_pointer, byte); + self.bus.memory.write_8(&self.onfault, self.stack_pointer, byte); } pub fn pop_stack_8(&mut self) -> u8 { let byte = self.bus.memory.read_8(&self.onfault, self.stack_pointer); @@ -179,7 +179,7 @@ impl Cpu { pub fn push_stack_16(&mut self, half: u16) { let decremented_stack_pointer = self.stack_pointer.overflowing_sub(2); self.stack_pointer = decremented_stack_pointer.0; - self.bus.memory.write_16(self.stack_pointer, half); + self.bus.memory.write_16(&self.onfault, self.stack_pointer, half); } pub fn pop_stack_16(&mut self) -> u16 { let half = self.bus.memory.read_16(&self.onfault, self.stack_pointer); @@ -190,7 +190,7 @@ impl Cpu { pub fn push_stack_32(&mut self, word: u32) { let decremented_stack_pointer = self.stack_pointer.overflowing_sub(4); self.stack_pointer = decremented_stack_pointer.0; - self.bus.memory.write_32(self.stack_pointer, word); + self.bus.memory.write_32(&self.onfault, self.stack_pointer, word); } pub fn pop_stack_32(&mut self) -> u32 { let word = self.bus.memory.read_32(&self.onfault, self.stack_pointer); @@ -345,7 +345,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_add(source_value as u8); if should_run { - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -353,7 +353,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_add(source_value as u16); if should_run { - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -361,7 +361,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_add(source_value); if should_run { - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -375,7 +375,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_add(source_value as u8); if should_run { - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -383,7 +383,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_add(source_value as u16); if should_run { - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -391,7 +391,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_add(source_value); if should_run { - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -444,7 +444,7 @@ impl Cpu { Size::Byte => { if should_run { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_add(1); - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -452,7 +452,7 @@ impl Cpu { Size::Half => { if should_run { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_add(1); - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -460,7 +460,7 @@ impl Cpu { Size::Word => { if should_run { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_add(1); - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -474,7 +474,7 @@ impl Cpu { Size::Byte => { if should_run { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_add(1); - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -482,7 +482,7 @@ impl Cpu { Size::Half => { if should_run { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_add(1); - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -490,7 +490,7 @@ impl Cpu { Size::Word => { if should_run { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_add(1); - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -543,7 +543,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_sub(source_value as u8); if should_run { - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -551,7 +551,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_sub(source_value as u16); if should_run { - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -559,7 +559,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_sub(source_value); if should_run { - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -573,7 +573,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_sub(source_value as u8); if should_run { - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -581,7 +581,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_sub(source_value as u16); if should_run { - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -589,7 +589,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_sub(source_value); if should_run { - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -642,7 +642,7 @@ impl Cpu { Size::Byte => { if should_run { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_sub(1); - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -650,7 +650,7 @@ impl Cpu { Size::Half => { if should_run { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_sub(1); - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -658,7 +658,7 @@ impl Cpu { Size::Word => { if should_run { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_sub(1); - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -672,7 +672,7 @@ impl Cpu { Size::Byte => { if should_run { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_sub(1); - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -680,7 +680,7 @@ impl Cpu { Size::Half => { if should_run { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_sub(1); - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -688,7 +688,7 @@ impl Cpu { Size::Word => { if should_run { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_sub(1); - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -741,7 +741,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_mul(source_value as u8); if should_run { - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -749,7 +749,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_mul(source_value as u16); if should_run { - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -757,7 +757,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_mul(source_value); if should_run { - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -771,7 +771,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_mul(source_value as u8); if should_run { - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -779,7 +779,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_mul(source_value as u16); if should_run { - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -787,7 +787,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_mul(source_value); if should_run { - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; self.flag.carry = result.1; } @@ -837,21 +837,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_div(source_value as u8); if should_run { - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_div(source_value as u16); if should_run { - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_div(source_value); if should_run { - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; } } @@ -864,21 +864,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).overflowing_div(source_value as u8); if should_run { - self.bus.memory.write_8(pointer, result.0); + self.bus.memory.write_8(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).overflowing_div(source_value as u16); if should_run { - self.bus.memory.write_16(pointer, result.0); + self.bus.memory.write_16(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).overflowing_div(source_value); if should_run { - self.bus.memory.write_32(pointer, result.0); + self.bus.memory.write_32(&self.onfault, pointer, result.0); self.flag.zero = result.0 == 0; } } @@ -927,21 +927,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) % source_value as u8; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) % source_value as u16; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) % source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -954,21 +954,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) % source_value as u8; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) % source_value as u16; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) % source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -1018,21 +1018,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) & source_value as u8; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) & source_value as u16; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) & source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -1045,21 +1045,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) & source_value as u8; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) & source_value as u16; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) & source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -1108,21 +1108,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) | source_value as u8; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) | source_value as u16; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) | source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -1135,21 +1135,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) | source_value as u8; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) | source_value as u16; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) | source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -1198,21 +1198,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) ^ source_value as u8; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) ^ source_value as u16; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) ^ source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -1225,21 +1225,21 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) ^ source_value as u8; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) ^ source_value as u16; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) ^ source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -1288,21 +1288,21 @@ impl Cpu { Size::Byte => { let result =!self.bus.memory.read_8(&self.onfault, pointer); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = !self.bus.memory.read_16(&self.onfault, pointer); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = !self.bus.memory.read_32(&self.onfault, pointer); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -1315,21 +1315,21 @@ impl Cpu { Size::Byte => { let result = !self.bus.memory.read_8(&self.onfault, pointer); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Half => { let result = !self.bus.memory.read_16(&self.onfault, pointer); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; } } Size::Word => { let result = !self.bus.memory.read_32(&self.onfault, pointer); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; } } @@ -1381,7 +1381,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) << source_value; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 7) != 0; } @@ -1389,7 +1389,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) << source_value; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 15) != 0; } @@ -1397,7 +1397,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) << source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 31) != 0; } @@ -1411,7 +1411,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) << source_value; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 7) != 0; } @@ -1419,7 +1419,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) << source_value; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 15) != 0; } @@ -1427,7 +1427,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) << source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 31) != 0; } @@ -1480,7 +1480,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) >> source_value as i32; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1488,7 +1488,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) >> source_value as i32; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1496,7 +1496,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) >> source_value as i32; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1510,7 +1510,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) >> source_value as i32; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1518,7 +1518,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) >> source_value as i32; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1526,7 +1526,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) >> source_value as i32; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1579,7 +1579,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) >> source_value; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1587,7 +1587,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) >> source_value; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1595,7 +1595,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) >> source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1609,7 +1609,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) >> source_value; if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1617,7 +1617,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) >> source_value; if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1625,7 +1625,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) >> source_value; if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1678,7 +1678,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).rotate_left(source_value); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 7) != 0; } @@ -1686,7 +1686,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).rotate_left(source_value); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 15) != 0; } @@ -1694,7 +1694,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).rotate_left(source_value); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 31) != 0; } @@ -1708,7 +1708,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).rotate_left(source_value); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 7) != 0; } @@ -1716,7 +1716,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).rotate_left(source_value); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 15) != 0; } @@ -1724,7 +1724,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).rotate_left(source_value); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 31) != 0; } @@ -1777,7 +1777,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).rotate_right(source_value); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1785,7 +1785,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).rotate_right(source_value); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1793,7 +1793,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).rotate_right(source_value); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1807,7 +1807,7 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer).rotate_right(source_value); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1815,7 +1815,7 @@ impl Cpu { Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer).rotate_right(source_value); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1823,7 +1823,7 @@ impl Cpu { Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer).rotate_right(source_value); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); self.flag.zero = result == 0; self.flag.carry = source_value & (1 << 0) != 0; } @@ -1871,19 +1871,19 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) | (1 << source_value); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) | (1 << source_value); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) | (1 << source_value); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); } } } @@ -1895,19 +1895,19 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) | (1 << source_value); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) | (1 << source_value); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) | (1 << source_value); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); } } } @@ -1952,19 +1952,19 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) & !(1 << source_value); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) & !(1 << source_value); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) & !(1 << source_value); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); } } } @@ -1976,19 +1976,19 @@ impl Cpu { Size::Byte => { let result = self.bus.memory.read_8(&self.onfault, pointer) & !(1 << source_value); if should_run { - self.bus.memory.write_8(pointer, result); + self.bus.memory.write_8(&self.onfault, pointer, result); } } Size::Half => { let result = self.bus.memory.read_16(&self.onfault, pointer) & !(1 << source_value); if should_run { - self.bus.memory.write_16(pointer, result); + self.bus.memory.write_16(&self.onfault, pointer, result); } } Size::Word => { let result = self.bus.memory.read_32(&self.onfault, pointer) & !(1 << source_value); if should_run { - self.bus.memory.write_32(pointer, result); + self.bus.memory.write_32(&self.onfault, pointer, result); } } } @@ -2201,17 +2201,17 @@ impl Cpu { match size { Size::Byte => { if should_run { - self.bus.memory.write_8(pointer, source_value as u8); + self.bus.memory.write_8(&self.onfault, pointer, source_value as u8); } } Size::Half => { if should_run { - self.bus.memory.write_16(pointer, source_value as u16); + self.bus.memory.write_16(&self.onfault, pointer, source_value as u16); } } Size::Word => { if should_run { - self.bus.memory.write_32(pointer, source_value); + self.bus.memory.write_32(&self.onfault, pointer, source_value); } } } @@ -2222,17 +2222,17 @@ impl Cpu { match size { Size::Byte => { if should_run { - self.bus.memory.write_8(pointer, source_value as u8); + self.bus.memory.write_8(&self.onfault, pointer, source_value as u8); } } Size::Half => { if should_run { - self.bus.memory.write_16(pointer, source_value as u16); + self.bus.memory.write_16(&self.onfault, pointer, source_value as u16); } } Size::Word => { if should_run { - self.bus.memory.write_32(pointer, source_value); + self.bus.memory.write_32(&self.onfault, pointer, source_value); } } } @@ -2357,7 +2357,7 @@ impl Cpu { let pointer = self.relative_to_absolute(self.read_register(register)); if should_run { // INFO: register contains a relative address instead of an absolute address - self.bus.memory.write_32(pointer, self.relative_to_absolute(source_value)); + self.bus.memory.write_32(&self.onfault, pointer, self.relative_to_absolute(source_value)); } instruction_pointer_offset += 1; // increment past 8 bit register number } @@ -2365,7 +2365,7 @@ impl Cpu { let word = self.bus.memory.read_32(&self.onfault, self.instruction_pointer + instruction_pointer_offset); let pointer = self.relative_to_absolute(word); if should_run { - self.bus.memory.write_32(pointer, self.relative_to_absolute(source_value)); + self.bus.memory.write_32(&self.onfault, pointer, self.relative_to_absolute(source_value)); } instruction_pointer_offset += 4; // increment past 32 bit pointer } @@ -2431,19 +2431,19 @@ impl Cpu { Size::Byte => { if should_run { let value = self.pop_stack_8(); - self.bus.memory.write_8(pointer, value); + self.bus.memory.write_8(&self.onfault, pointer, value); } } Size::Half => { if should_run { let value = self.pop_stack_16(); - self.bus.memory.write_16(pointer, value); + self.bus.memory.write_16(&self.onfault, pointer, value); } } Size::Word => { if should_run { let value = self.pop_stack_32(); - self.bus.memory.write_32(pointer, value); + self.bus.memory.write_32(&self.onfault, pointer, value); } } } @@ -2455,19 +2455,19 @@ impl Cpu { Size::Byte => { if should_run { let value = self.pop_stack_8(); - self.bus.memory.write_8(pointer, value); + self.bus.memory.write_8(&self.onfault, pointer, value); } } Size::Half => { if should_run { let value = self.pop_stack_16(); - self.bus.memory.write_16(pointer, value); + self.bus.memory.write_16(&self.onfault, pointer, value); } } Size::Word => { if should_run { let value = self.pop_stack_32(); - self.bus.memory.write_32(pointer, value); + self.bus.memory.write_32(&self.onfault, pointer, value); } } } @@ -2515,7 +2515,7 @@ impl Cpu { let value = self.bus.read_io(source_value); instruction_pointer_offset += 1; // increment past 8 bit register number if should_run { - self.bus.memory.write_32(pointer, value); + self.bus.memory.write_32(&self.onfault, pointer, value); } } Operand::ImmediatePtr(_) => { @@ -2523,7 +2523,7 @@ impl Cpu { let value = self.bus.read_io(source_value); instruction_pointer_offset += 4; // increment past 32 bit pointer if should_run { - self.bus.memory.write_32(pointer, value); + self.bus.memory.write_32(&self.onfault, pointer, value); } } _ => panic!("Attempting to use an immediate value as a destination"), diff --git a/src/main.rs b/src/main.rs index 87a0875..6e3918d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,7 @@ pub mod setjmp; use audio::AudioChannel; use bus::Bus; -use cpu::{Cpu, Exception, Interrupt}; +use cpu::{Cpu, Interrupt}; use keyboard::Keyboard; use mouse::Mouse; use disk::DiskController; @@ -86,9 +86,9 @@ fn main() { let audio_channel_2 = Arc::new(Mutex::new(AudioChannel::new(2))); let audio_channel_3 = Arc::new(Mutex::new(AudioChannel::new(3))); - let (exception_sender, exception_receiver) = mpsc::channel::(); + //let (exception_sender, exception_receiver) = mpsc::channel::(); - let memory = Memory::new(read_rom().as_slice(), exception_sender); + let memory = Memory::new(read_rom().as_slice()); let mut bus = Bus { memory: memory.clone(), audio_channel_0: audio_channel_0.clone(), @@ -116,12 +116,12 @@ fn main() { let ram_size = memory_cpu.ram().len(); let ram_bottom_address = MEMORY_RAM_START; let ram_top_address = ram_bottom_address + ram_size - 1; - println!("RAM: {:.2} MiB mapped at {:#010X}-{:#010X}", ram_size / 1048576, ram_bottom_address, ram_top_address); + println!("RAM: {:.2} MiB mapped at physical {:#010X}-{:#010X}", ram_size / 1048576, ram_bottom_address, ram_top_address); let rom_size = memory_cpu.rom().len(); let rom_bottom_address = MEMORY_ROM_START; let rom_top_address = rom_bottom_address + rom_size - 1; - println!("ROM: {:.2} KiB mapped at {:#010X}-{:#010X}", rom_size / 1024, rom_bottom_address, rom_top_address); + println!("ROM: {:.2} KiB mapped at physical {:#010X}-{:#010X}", rom_size / 1024, rom_bottom_address, rom_top_address); let mut cpu = Cpu::new(bus); @@ -163,9 +163,9 @@ fn main() { cpu.interrupt(Interrupt::Exception(exception)); } while !cpu.halted { - if let Ok(exception) = exception_receiver.try_recv() { + /*if let Ok(exception) = exception_receiver.try_recv() { cpu.interrupt(Interrupt::Exception(exception)); - } + }*/ if let Ok(interrupt) = interrupt_receiver.try_recv() { cpu.interrupt(interrupt); } diff --git a/src/memory.rs b/src/memory.rs index de0197a..7fe0d31 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -7,7 +7,6 @@ use crate::setjmp::{JumpEnv, longjmp}; use std::cell::UnsafeCell; use std::collections::HashMap; use std::sync::Arc; -use std::sync::mpsc::Sender; use std::io::Write; use std::fs::File; @@ -33,11 +32,10 @@ struct MemoryInner { mmu_enabled: Box, tlb: Box>, paging_directory_address: Box, - exception_sender: Sender, } impl MemoryInner { - pub fn new(rom: &[u8], exception_sender: Sender) -> Self { + pub fn new(rom: &[u8]) -> Self { let mut this = Self { // HACK: allocate directly on the heap to avoid a stack overflow // at runtime while trying to move around a 64MB array @@ -46,7 +44,6 @@ impl MemoryInner { mmu_enabled: Box::from(false), tlb: Box::from(HashMap::with_capacity(1024)), paging_directory_address: Box::from(0x00000000), - exception_sender, }; this.rom.as_mut_slice().write(rom).expect("failed to copy ROM to memory"); this @@ -63,8 +60,8 @@ unsafe impl Send for Memory {} unsafe impl Sync for Memory {} impl Memory { - pub fn new(rom: &[u8], exception_sender: Sender) -> Self { - Self(Arc::new(UnsafeCell::new(MemoryInner::new(rom, exception_sender)))) + pub fn new(rom: &[u8]) -> Self { + Self(Arc::new(UnsafeCell::new(MemoryInner::new(rom)))) } fn inner(&self) -> &mut MemoryInner { @@ -76,7 +73,6 @@ impl Memory { pub fn mmu_enabled(&self) -> &mut bool { &mut self.inner().mmu_enabled } pub fn tlb(&self) -> &mut HashMap { &mut self.inner().tlb } pub fn paging_directory_address(&self) -> &mut u32 { &mut self.inner().paging_directory_address } - pub fn exception_sender(&self) -> &mut Sender { &mut self.inner().exception_sender } pub fn dump(&self) { let mut file = File::create("memory.dump").expect("failed to open memory dump file"); @@ -230,47 +226,42 @@ impl Memory { (self.read_opt_8(address + 3).unwrap_or_else(|| unsafe { longjmp(onfault, Exception::PageFaultRead(address + 3)) }) as u32) << 24 } - pub fn write_8(&mut self, mut address: u32, byte: u8) { + pub fn write_8(&mut self, onfault: &JumpEnv, mut address: u32, byte: u8) { let original_address = address; let mut writable = true; - let mut ok = true; if *self.mmu_enabled() { (address, writable) = self.virtual_to_physical(address as u32).unwrap_or_else(|| { - self.exception_sender().send(Exception::PageFaultWrite(original_address)).unwrap(); - ok = false; - (0, false) + unsafe { longjmp(onfault, Exception::PageFaultWrite(original_address)) } }); } - if ok { - if writable { - let address = address as usize; + if writable { + let address = address as usize; - if address >= MEMORY_ROM_START && address < MEMORY_ROM_START + MEMORY_ROM_SIZE { - error(&format!("attempting to write to ROM address: {:#010X}", address)); - } - - match self.ram().get_mut(address - MEMORY_RAM_START) { - Some(value) => { - *value = byte; - } - None => { - self.exception_sender().send(Exception::PageFaultWrite(original_address)).unwrap(); - } - } - } else { - self.exception_sender().send(Exception::PageFaultWrite(original_address)).unwrap(); + if address >= MEMORY_ROM_START && address < MEMORY_ROM_START + MEMORY_ROM_SIZE { + error(&format!("attempting to write to ROM address: {:#010X}", address)); } + + match self.ram().get_mut(address - MEMORY_RAM_START) { + Some(value) => { + *value = byte; + } + None => { + unsafe { longjmp(onfault, Exception::PageFaultWrite(original_address)) } + } + } + } else { + unsafe { longjmp(onfault, Exception::PageFaultWrite(original_address)) } } } - pub fn write_16(&mut self, address: u32, half: u16) { - self.write_8(address, (half & 0x00FF) as u8); - self.write_8(address + 1, (half >> 8) as u8); + pub fn write_16(&mut self, onfault: &JumpEnv, address: u32, half: u16) { + self.write_8(onfault, address, (half & 0x00FF) as u8); + self.write_8(onfault, address + 1, (half >> 8) as u8); } - pub fn write_32(&mut self, address: u32, word: u32) { - self.write_8(address, (word & 0x000000FF) as u8); - self.write_8(address + 1, ((word & 0x0000FF00) >> 8) as u8); - self.write_8(address + 2, ((word & 0x00FF0000) >> 16) as u8); - self.write_8(address + 3, ((word & 0xFF000000) >> 24) as u8); + pub fn write_32(&mut self, onfault: &JumpEnv, address: u32, word: u32) { + self.write_8(onfault, address, (word & 0x000000FF) as u8); + self.write_8(onfault, address + 1, ((word & 0x0000FF00) >> 8) as u8); + self.write_8(onfault, address + 2, ((word & 0x00FF0000) >> 16) as u8); + self.write_8(onfault, address + 3, ((word & 0xFF000000) >> 24) as u8); } }