Possibly fix an issue where a 32 bit page fault would cause 4 PFs
Same for 16 bit page faults causing 2 page faults, one for each byte.
This commit is contained in:
parent
56e41e3915
commit
5c5a8722e4
|
@ -201,14 +201,12 @@ impl Memory {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn read_opt_16(&mut self, address: u32) -> Option<u16> {
|
pub fn read_opt_16(&mut self, address: u32) -> Option<u16> {
|
||||||
Some(
|
Some(self.read_opt_8(address)? as u16 |
|
||||||
(self.read_opt_8(address)? as u16) |
|
|
||||||
(self.read_opt_8(address + 1)? as u16) << 8
|
(self.read_opt_8(address + 1)? as u16) << 8
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
pub fn read_opt_32(&mut self, address: u32) -> Option<u32> {
|
pub fn read_opt_32(&mut self, address: u32) -> Option<u32> {
|
||||||
Some(
|
Some(self.read_opt_8(address)? as u32 |
|
||||||
(self.read_opt_8(address)? as u32) |
|
|
||||||
(self.read_opt_8(address + 1)? as u32) << 8 |
|
(self.read_opt_8(address + 1)? as u32) << 8 |
|
||||||
(self.read_opt_8(address + 2)? as u32) << 16 |
|
(self.read_opt_8(address + 2)? as u32) << 16 |
|
||||||
(self.read_opt_8(address + 3)? as u32) << 24
|
(self.read_opt_8(address + 3)? as u32) << 24
|
||||||
|
@ -226,26 +224,16 @@ impl Memory {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn read_16(&mut self, address: u32) -> Option<u16> {
|
pub fn read_16(&mut self, address: u32) -> Option<u16> {
|
||||||
let mut read_ok = true;
|
Some(self.read_8(address)? as u16 |
|
||||||
let value = self.read_8(address).unwrap_or_else(|| { read_ok = false; 0 }) as u16 |
|
(self.read_8(address + 1)? as u16) << 8
|
||||||
(self.read_8(address + 1).unwrap_or_else(|| { read_ok = false; 0 }) as u16) << 8;
|
)
|
||||||
if read_ok {
|
|
||||||
Some(value)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pub fn read_32(&mut self, address: u32) -> Option<u32> {
|
pub fn read_32(&mut self, address: u32) -> Option<u32> {
|
||||||
let mut read_ok = true;
|
Some(self.read_8(address)? as u32 |
|
||||||
let value = self.read_8(address).unwrap_or_else(|| { read_ok = false; 0 }) as u32 |
|
(self.read_8(address + 1)? as u32) << 8 |
|
||||||
(self.read_8(address + 1).unwrap_or_else(|| { read_ok = false; 0 }) as u32) << 8 |
|
(self.read_8(address + 2)? as u32) << 16 |
|
||||||
(self.read_8(address + 2).unwrap_or_else(|| { read_ok = false; 0 }) as u32) << 16 |
|
(self.read_8(address + 3)? as u32) << 24
|
||||||
(self.read_8(address + 3).unwrap_or_else(|| { read_ok = false; 0 }) as u32) << 24;
|
)
|
||||||
if read_ok {
|
|
||||||
Some(value)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_8(&mut self, mut address: u32, byte: u8) -> Option<()> {
|
pub fn write_8(&mut self, mut address: u32, byte: u8) -> Option<()> {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user