core: bus: Change read_x methods of Bus trait to take &mut self
Former-commit-id: ee95b949585420e1daf95ea50939b1a8c9b77349 Former-commit-id: 651203037284fc46eb669cd0e40dc2ebd85bd96b
This commit is contained in:
parent
85bef5a1c0
commit
3fa858f969
|
@ -1,20 +1,20 @@
|
|||
pub type Addr = u32;
|
||||
|
||||
pub trait Bus {
|
||||
fn read_32(&self, addr: Addr) -> u32 {
|
||||
fn read_32(&mut self, addr: Addr) -> u32 {
|
||||
self.read_16(addr) as u32 | (self.read_16(addr + 2) as u32) << 16
|
||||
}
|
||||
|
||||
fn read_16(&self, addr: Addr) -> u16 {
|
||||
fn read_16(&mut self, addr: Addr) -> u16 {
|
||||
self.default_read_16(addr)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn default_read_16(&self, addr: Addr) -> u16 {
|
||||
fn default_read_16(&mut self, addr: Addr) -> u16 {
|
||||
self.read_8(addr) as u16 | (self.read_8(addr + 1) as u16) << 8
|
||||
}
|
||||
|
||||
fn read_8(&self, addr: Addr) -> u8;
|
||||
fn read_8(&mut self, addr: Addr) -> u8;
|
||||
|
||||
fn write_32(&mut self, addr: Addr, value: u32) {
|
||||
self.write_16(addr, (value & 0xffff) as u16);
|
||||
|
@ -33,7 +33,7 @@ pub trait Bus {
|
|||
|
||||
fn write_8(&mut self, addr: Addr, value: u8);
|
||||
|
||||
fn get_bytes(&self, range: std::ops::Range<u32>) -> Vec<u8> {
|
||||
fn get_bytes(&mut self, range: std::ops::Range<u32>) -> Vec<u8> {
|
||||
let mut bytes = Vec::new();
|
||||
for b in range {
|
||||
bytes.push(self.read_8(b));
|
||||
|
@ -44,17 +44,17 @@ pub trait Bus {
|
|||
|
||||
/// Helper trait for reading memory as if we were an all-powerfull debugger
|
||||
pub trait DebugRead: Bus {
|
||||
fn debug_read_32(&self, addr: Addr) -> u32 {
|
||||
fn debug_read_32(&mut self, addr: Addr) -> u32 {
|
||||
self.debug_read_16(addr) as u32 | (self.debug_read_16(addr + 2) as u32) << 16
|
||||
}
|
||||
|
||||
fn debug_read_16(&self, addr: Addr) -> u16 {
|
||||
fn debug_read_16(&mut self, addr: Addr) -> u16 {
|
||||
self.debug_read_8(addr) as u16 | (self.debug_read_8(addr + 1) as u16) << 8
|
||||
}
|
||||
|
||||
fn debug_read_8(&self, addr: Addr) -> u8;
|
||||
fn debug_read_8(&mut self, addr: Addr) -> u8;
|
||||
|
||||
fn debug_get_bytes(&self, range: std::ops::Range<u32>) -> Vec<u8> {
|
||||
fn debug_get_bytes(&mut self, range: std::ops::Range<u32>) -> Vec<u8> {
|
||||
let mut bytes = Vec::new();
|
||||
for b in range {
|
||||
bytes.push(self.debug_read_8(b));
|
||||
|
|
|
@ -64,7 +64,7 @@ impl Cartridge {
|
|||
&self.bytes
|
||||
}
|
||||
|
||||
// 'clones' the cartridge without the ROM buffer
|
||||
// 'Clones' the cartridge without the ROM buffer
|
||||
pub fn thin_copy(&self) -> Cartridge {
|
||||
Cartridge {
|
||||
header: self.header.clone(),
|
||||
|
@ -96,7 +96,7 @@ fn is_gpio_access(addr: u32) -> bool {
|
|||
}
|
||||
|
||||
impl Bus for Cartridge {
|
||||
fn read_8(&self, addr: Addr) -> u8 {
|
||||
fn read_8(&mut self, addr: Addr) -> u8 {
|
||||
let offset = (addr & 0x01ff_ffff) as usize;
|
||||
match addr & 0xff000000 {
|
||||
SRAM_LO | SRAM_HI => match &self.backup {
|
||||
|
@ -114,7 +114,7 @@ impl Bus for Cartridge {
|
|||
}
|
||||
}
|
||||
|
||||
fn read_16(&self, addr: u32) -> u16 {
|
||||
fn read_16(&mut self, addr: u32) -> u16 {
|
||||
if is_gpio_access(addr) {
|
||||
if let Some(gpio) = &self.gpio {
|
||||
if !(gpio.is_readable()) {
|
||||
|
@ -165,7 +165,7 @@ impl Bus for Cartridge {
|
|||
}
|
||||
|
||||
impl DebugRead for Cartridge {
|
||||
fn debug_read_8(&self, addr: Addr) -> u8 {
|
||||
fn debug_read_8(&mut self, addr: Addr) -> u8 {
|
||||
let offset = (addr & 0x01ff_ffff) as usize;
|
||||
self.bytes[offset]
|
||||
}
|
||||
|
|
|
@ -298,7 +298,7 @@ impl Gpu {
|
|||
}
|
||||
|
||||
/// helper method that reads the palette index from a base address and x + y
|
||||
pub fn read_pixel_index(&self, addr: u32, x: u32, y: u32, format: PixelFormat) -> usize {
|
||||
pub fn read_pixel_index(&mut self, addr: u32, x: u32, y: u32, format: PixelFormat) -> usize {
|
||||
match format {
|
||||
PixelFormat::BPP4 => self.read_pixel_index_bpp4(addr, x, y),
|
||||
PixelFormat::BPP8 => self.read_pixel_index_bpp8(addr, x, y),
|
||||
|
@ -306,7 +306,7 @@ impl Gpu {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub fn read_pixel_index_bpp4(&self, addr: u32, x: u32, y: u32) -> usize {
|
||||
pub fn read_pixel_index_bpp4(&mut self, addr: u32, x: u32, y: u32) -> usize {
|
||||
let ofs = addr + index2d!(u32, x / 2, y, 4);
|
||||
let ofs = ofs as usize;
|
||||
let byte = self.vram.read_8(ofs as u32);
|
||||
|
@ -318,13 +318,13 @@ impl Gpu {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub fn read_pixel_index_bpp8(&self, addr: u32, x: u32, y: u32) -> usize {
|
||||
pub fn read_pixel_index_bpp8(&mut self, addr: u32, x: u32, y: u32) -> usize {
|
||||
let ofs = addr;
|
||||
self.vram.read_8(ofs + index2d!(u32, x, y, 8)) as usize
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn get_palette_color(&self, index: u32, palette_bank: u32, offset: u32) -> Rgb15 {
|
||||
pub fn get_palette_color(&mut self, index: u32, palette_bank: u32, offset: u32) -> Rgb15 {
|
||||
if index == 0 || (palette_bank != 0 && index % 16 == 0) {
|
||||
return Rgb15::TRANSPARENT;
|
||||
}
|
||||
|
@ -659,7 +659,7 @@ impl Gpu {
|
|||
}
|
||||
|
||||
impl Bus for Gpu {
|
||||
fn read_8(&self, addr: Addr) -> u8 {
|
||||
fn read_8(&mut self, addr: Addr) -> u8 {
|
||||
let page = (addr >> 24) as usize;
|
||||
match page {
|
||||
PAGE_PALRAM => self.palette_ram.read_8(addr & 0x3ff),
|
||||
|
@ -716,7 +716,7 @@ impl Bus for Gpu {
|
|||
}
|
||||
|
||||
impl DebugRead for Gpu {
|
||||
fn debug_read_8(&self, addr: Addr) -> u8 {
|
||||
fn debug_read_8(&mut self, addr: Addr) -> u8 {
|
||||
let page = (addr >> 24) as usize;
|
||||
match page {
|
||||
PAGE_PALRAM => self.palette_ram.read_8(addr & 0x3ff),
|
||||
|
|
|
@ -55,7 +55,7 @@ impl ObjAttrs {
|
|||
}
|
||||
|
||||
impl Gpu {
|
||||
fn get_affine_matrix(&self, affine_index: u32) -> AffineMatrix {
|
||||
fn get_affine_matrix(&mut self, affine_index: u32) -> AffineMatrix {
|
||||
let mut offset = AFFINE_FILL + affine_index * 16 * 2;
|
||||
let pa = self.oam.read_16(offset) as i16 as i32;
|
||||
offset += 2 + AFFINE_FILL;
|
||||
|
@ -68,7 +68,7 @@ impl Gpu {
|
|||
AffineMatrix { pa, pb, pc, pd }
|
||||
}
|
||||
|
||||
fn read_obj_attrs(&self, obj: usize) -> ObjAttrs {
|
||||
fn read_obj_attrs(&mut self, obj: usize) -> ObjAttrs {
|
||||
let addr = ATTRS_SIZE * (obj as u32);
|
||||
let attr0 = Attribute0(self.oam.read_16(addr + 0));
|
||||
let attr1 = Attribute1(self.oam.read_16(addr + 2));
|
||||
|
|
|
@ -124,16 +124,13 @@ impl Gpu {
|
|||
let tile_index = self.vram.read_8(map_addr) as u32;
|
||||
let tile_addr = char_block + tile_index * 0x40;
|
||||
|
||||
let color = self.get_palette_color(
|
||||
self.read_pixel_index(
|
||||
tile_addr,
|
||||
(t.0 % 8) as u32,
|
||||
(t.1 % 8) as u32,
|
||||
PixelFormat::BPP8,
|
||||
) as u32,
|
||||
0,
|
||||
0,
|
||||
);
|
||||
let pixel_index = self.read_pixel_index(
|
||||
tile_addr,
|
||||
(t.0 % 8) as u32,
|
||||
(t.1 % 8) as u32,
|
||||
PixelFormat::BPP8,
|
||||
) as u32;
|
||||
let color = self.get_palette_color(pixel_index, 0, 0);
|
||||
self.backgrounds[bg].line[screen_x as usize] = color;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@ impl Gpu {
|
|||
}
|
||||
|
||||
#[allow(unused)]
|
||||
fn layer_to_pixel(&self, x: usize, y: usize, layer: &RenderLayer) -> Rgb15 {
|
||||
fn layer_to_pixel(&mut self, x: usize, y: usize, layer: &RenderLayer) -> Rgb15 {
|
||||
match layer.kind {
|
||||
RenderLayerKind::Background0 => self.backgrounds[0].line[x],
|
||||
RenderLayerKind::Background1 => self.backgrounds[1].line[x],
|
||||
|
|
|
@ -78,7 +78,7 @@ impl InterruptConnect for IoDevices {
|
|||
}
|
||||
|
||||
impl Bus for IoDevices {
|
||||
fn read_16(&self, addr: Addr) -> u16 {
|
||||
fn read_16(&mut self, addr: Addr) -> u16 {
|
||||
let io = self;
|
||||
let io_addr = addr + IO_BASE;
|
||||
if addr > 0x0800 {
|
||||
|
@ -134,7 +134,7 @@ impl Bus for IoDevices {
|
|||
}
|
||||
}
|
||||
|
||||
fn read_8(&self, addr: Addr) -> u8 {
|
||||
fn read_8(&mut self, addr: Addr) -> u8 {
|
||||
let t = self.read_16(addr & !1);
|
||||
if addr & 1 != 0 {
|
||||
(t >> 8) as u8
|
||||
|
@ -300,7 +300,7 @@ impl Bus for IoDevices {
|
|||
}
|
||||
|
||||
impl DebugRead for IoDevices {
|
||||
fn debug_read_8(&self, addr: Addr) -> u8 {
|
||||
fn debug_read_8(&mut self, addr: Addr) -> u8 {
|
||||
self.read_8(addr)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -288,7 +288,8 @@ impl SysBus {
|
|||
}
|
||||
|
||||
impl Bus for SysBus {
|
||||
fn read_32(&self, addr: Addr) -> u32 {
|
||||
#[inline]
|
||||
fn read_32(&mut self, addr: Addr) -> u32 {
|
||||
match addr & 0xff000000 {
|
||||
BIOS_ADDR => self.bios.read_32(addr),
|
||||
EWRAM_ADDR => self.onboard_work_ram.read_32(addr & 0x3_fffc),
|
||||
|
@ -314,7 +315,8 @@ impl Bus for SysBus {
|
|||
}
|
||||
}
|
||||
|
||||
fn read_16(&self, addr: Addr) -> u16 {
|
||||
#[inline]
|
||||
fn read_16(&mut self, addr: Addr) -> u16 {
|
||||
match addr & 0xff000000 {
|
||||
BIOS_ADDR => self.bios.read_16(addr),
|
||||
EWRAM_ADDR => self.onboard_work_ram.read_16(addr & 0x3_fffe),
|
||||
|
@ -340,7 +342,8 @@ impl Bus for SysBus {
|
|||
}
|
||||
}
|
||||
|
||||
fn read_8(&self, addr: Addr) -> u8 {
|
||||
#[inline]
|
||||
fn read_8(&mut self, addr: Addr) -> u8 {
|
||||
match addr & 0xff000000 {
|
||||
BIOS_ADDR => self.bios.read_8(addr),
|
||||
EWRAM_ADDR => self.onboard_work_ram.read_8(addr & 0x3_ffff),
|
||||
|
@ -366,6 +369,7 @@ impl Bus for SysBus {
|
|||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn write_32(&mut self, addr: Addr, value: u32) {
|
||||
match addr & 0xff000000 {
|
||||
BIOS_ADDR => {}
|
||||
|
@ -390,6 +394,7 @@ impl Bus for SysBus {
|
|||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn write_16(&mut self, addr: Addr, value: u16) {
|
||||
match addr & 0xff000000 {
|
||||
BIOS_ADDR => {}
|
||||
|
@ -414,6 +419,7 @@ impl Bus for SysBus {
|
|||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn write_8(&mut self, addr: Addr, value: u8) {
|
||||
match addr & 0xff000000 {
|
||||
BIOS_ADDR => {}
|
||||
|
@ -440,7 +446,7 @@ impl Bus for SysBus {
|
|||
}
|
||||
|
||||
impl DebugRead for SysBus {
|
||||
fn debug_read_8(&self, addr: Addr) -> u8 {
|
||||
fn debug_read_8(&mut self, addr: Addr) -> u8 {
|
||||
match addr & 0xff000000 {
|
||||
BIOS_ADDR => self.bios.debug_read_8(addr),
|
||||
EWRAM_ADDR => self.onboard_work_ram.debug_read_8(addr & 0x3_ffff),
|
||||
|
|
|
@ -274,7 +274,7 @@ impl BoxedMemory {
|
|||
}
|
||||
|
||||
impl Bus for BoxedMemory {
|
||||
fn read_8(&self, addr: Addr) -> u8 {
|
||||
fn read_8(&mut self, addr: Addr) -> u8 {
|
||||
unsafe { *self.mem.get_unchecked(addr as usize) }
|
||||
}
|
||||
|
||||
|
@ -286,7 +286,7 @@ impl Bus for BoxedMemory {
|
|||
}
|
||||
|
||||
impl DebugRead for BoxedMemory {
|
||||
fn debug_read_8(&self, addr: Addr) -> u8 {
|
||||
fn debug_read_8(&mut self, addr: Addr) -> u8 {
|
||||
self.mem[addr as usize]
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue