From de021c2effa9d46bdde4123e9f740a792805f309 Mon Sep 17 00:00:00 2001 From: Franco Colmenarez Date: Mon, 15 Nov 2021 09:46:59 -0500 Subject: [PATCH] Replace AddressRange struct by ranges --- src/bus.rs | 60 +++++++++++++++++++----------------------------------- src/ppu.rs | 4 ++-- src/rom.rs | 12 +++++------ 3 files changed, 29 insertions(+), 47 deletions(-) diff --git a/src/bus.rs b/src/bus.rs index 816af4d..febf1a7 100644 --- a/src/bus.rs +++ b/src/bus.rs @@ -1,5 +1,6 @@ use std::rc::Rc; use std::cell::RefCell; +use std::ops::RangeInclusive; use crate::utils::{ get_bit, BitIndex, @@ -16,37 +17,18 @@ use crate::cpu::{Interrupt}; use crate::timer::{Timer, TIMER_DIVIDER_REGISTER_ADDRESS}; use crate::joypad::{Joypad, JOYPAD_ADDRESS}; -pub struct AddressRange { - begin: u16, - end: u16, -} - -impl AddressRange { - pub fn begin(&self) -> u16 { - self.begin - } - - pub fn end(&self) -> u16 { - self.end - } - - pub fn in_range(&self, address: u16) -> bool { - address >= self.begin && address <= self.end - } -} - -pub const BANK_ZERO: AddressRange = AddressRange{begin: 0x0000, end: 0x3FFF}; -pub const BANK_SWITCHABLE: AddressRange = AddressRange{begin: 0x4000, end: 0x7FFF}; -pub const VIDEO_RAM: AddressRange = AddressRange{begin: 0x8000, end: 0x9FFF}; -pub const EXTERNAL_RAM: AddressRange = AddressRange{begin: 0xA000, end: 0xBFFF}; -pub const WORK_RAM_1: AddressRange = AddressRange{begin: 0xC000, end: 0xCFFF}; -pub const WORK_RAM_2: AddressRange = AddressRange{begin: 0xD000, end: 0xDFFF}; -pub const ECHO_RAM: AddressRange = AddressRange{begin: 0xE000, end: 0xFDFF}; -pub const SPRITE_ATTRIBUTE_TABLE: AddressRange = AddressRange{begin: 0xFE00, end: 0xFE9F}; -pub const NOT_USABLE: AddressRange = AddressRange{begin: 0xFEA0, end: 0xFEFF}; -pub const IO_REGISTERS: AddressRange = AddressRange{begin: 0xFF00, end: 0xFF7F}; -pub const HIGH_RAM: AddressRange = AddressRange{begin: 0xFF80, end: 0xFFFE}; -pub const INTERRUPT_ENABLE_REGISTER: AddressRange = AddressRange{begin: 0xFFFF, end: 0xFFFF}; +pub const BANK_ZERO: RangeInclusive = 0x0000..=0x3FFF; +pub const BANK_SWITCHABLE: RangeInclusive = 0x4000..=0x7FFF; +pub const VIDEO_RAM: RangeInclusive = 0x8000..=0x9FFF; +pub const EXTERNAL_RAM: RangeInclusive = 0xA000..=0xBFFF; +pub const WORK_RAM_1: RangeInclusive = 0xC000..=0xCFFF; +pub const WORK_RAM_2: RangeInclusive = 0xD000..=0xDFFF; +pub const ECHO_RAM: RangeInclusive = 0xE000..=0xFDFF; +pub const SPRITE_ATTRIBUTE_TABLE: RangeInclusive = 0xFE00..=0xFE9F; +pub const NOT_USABLE: RangeInclusive = 0xFEA0..=0xFEFF; +pub const IO_REGISTERS: RangeInclusive = 0xFF00..=0xFF7F; +pub const HIGH_RAM: RangeInclusive = 0xFF80..=0xFFFE; +pub const INTERRUPT_ENABLE_REGISTER: RangeInclusive = 0xFFFF..=0xFFFF; pub const INTERRUPT_ENABLE_ADDRESS: u16 = 0xFFFF; pub const INTERRUPT_FLAG_ADDRESS: u16 = 0xFF0F; @@ -104,7 +86,7 @@ impl Bus { } pub fn read(&self, address: u16) -> u8 { - if BANK_ZERO.in_range(address) || BANK_SWITCHABLE.in_range(address) || EXTERNAL_RAM.in_range(address) { + if BANK_ZERO.contains(&address) || BANK_SWITCHABLE.contains(&address) || EXTERNAL_RAM.contains(&address) { return self.game_rom.read(address); } else if address == INTERRUPT_ENABLE_ADDRESS || address == INTERRUPT_FLAG_ADDRESS { return 0b11100000 | self.data[address as usize]; @@ -125,19 +107,19 @@ impl Bus { // print!("{}", data as char); } - if BANK_ZERO.in_range(address) || BANK_SWITCHABLE.in_range(address) || EXTERNAL_RAM.in_range(address) { + if BANK_ZERO.contains(&address) || BANK_SWITCHABLE.contains(&address) || EXTERNAL_RAM.contains(&address) { self.game_rom.write(address, data); - } else if WORK_RAM_1.in_range(address) || WORK_RAM_2.in_range(address) { + } else if WORK_RAM_1.contains(&address) || WORK_RAM_2.contains(&address) { self.data[address as usize] = data; // Copy to the ECHO RAM if address <= 0xDDFF { - self.data[(ECHO_RAM.begin() + (address - WORK_RAM_1.begin())) as usize] = data; + self.data[(ECHO_RAM.min().unwrap() + (address - WORK_RAM_1.min().unwrap())) as usize] = data; } - } else if EXTERNAL_RAM.in_range(address) { + } else if EXTERNAL_RAM.contains(&address) { // self.game_rom.write(address, data); - } else if ECHO_RAM.in_range(address) { + } else if ECHO_RAM.contains(&address) { self.data[address as usize] = data; - self.data[(WORK_RAM_1.begin() + (address - ECHO_RAM.begin())) as usize] = data; // Copy to the working RAM + self.data[(WORK_RAM_1.min().unwrap() + (address - ECHO_RAM.min().unwrap())) as usize] = data; // Copy to the working RAM } else if address == TIMER_DIVIDER_REGISTER_ADDRESS { self.timer.borrow_mut().reset(); } else if address == LCD_CONTROL_ADDRESS { @@ -163,7 +145,7 @@ impl Bus { self.data[address as usize] = data; let source = (data as usize) * 0x100; let mut count = 0; - let oam_addr = SPRITE_ATTRIBUTE_TABLE.begin() as usize; + let oam_addr = SPRITE_ATTRIBUTE_TABLE.min().unwrap() as usize; while count < 160 { self.data[oam_addr + count] = self.data[source + count]; count += 1; diff --git a/src/ppu.rs b/src/ppu.rs index df53b50..c6c1125 100644 --- a/src/ppu.rs +++ b/src/ppu.rs @@ -340,8 +340,8 @@ impl PPU { let palette_0 = bus.read(OBJECT_PALETTE_0_ADDRESS); let palette_1 = bus.read(OBJECT_PALETTE_1_ADDRESS); let long_sprites = self.get_lcd_control(bus, LCDControl::ObjectSize); - let mut addr = SPRITE_ATTRIBUTE_TABLE.begin(); - while addr <= SPRITE_ATTRIBUTE_TABLE.end() { + let mut addr = SPRITE_ATTRIBUTE_TABLE.min().unwrap(); + while addr <= SPRITE_ATTRIBUTE_TABLE.max().unwrap() { // The gameboy only supports 10 sprites per line, // but since we are on an emulator we can avoud that limitation if self.sprite_buffer.len() >= 10 { diff --git a/src/rom.rs b/src/rom.rs index 8453b3f..7740a23 100644 --- a/src/rom.rs +++ b/src/rom.rs @@ -190,15 +190,15 @@ impl ROM { }; }, MBC::MBC1 => { - if BANK_ZERO.in_range(address) { + if BANK_ZERO.contains(&address) { return self.data[address as usize]; - } else if BANK_SWITCHABLE.in_range(address) { + } else if BANK_SWITCHABLE.contains(&address) { return self.data[((self.rom_bank as usize * 0x4000) + (address as usize & 0x3FFF)) as usize]; - } else if EXTERNAL_RAM.in_range(address) { + } else if EXTERNAL_RAM.contains(&address) { if !self.info.has_ram { return 0xFF; } - return match self.ram.get((address - EXTERNAL_RAM.begin() + (0x2000 * self.ram_bank as u16)) as usize) { + return match self.ram.get((address - EXTERNAL_RAM.min().unwrap() + (0x2000 * self.ram_bank as u16)) as usize) { Some(data) => *data, None => 0xFF, }; @@ -235,11 +235,11 @@ impl ROM { 1 => BankingMode::Advanced, _ => unreachable!(), } - } else if EXTERNAL_RAM.in_range(address) { + } else if EXTERNAL_RAM.contains(&address) { if !self.ram_enable || !self.info.has_ram { return; } - let address = address as usize - EXTERNAL_RAM.begin() as usize + (EXTERNAL_RAM.begin() as usize * self.ram_bank as usize); + let address = address as usize - EXTERNAL_RAM.min().unwrap() as usize + (EXTERNAL_RAM.min().unwrap() as usize * self.ram_bank as usize); if let Some(elem) = self.ram.get_mut(address) { *elem = data; }