mirror of
https://github.com/FranLMSP/rmg-001.git
synced 2024-11-23 10:12:11 +00:00
Refactor address ranges
This commit is contained in:
parent
88d5f08660
commit
1444e8b63d
88
src/bus.rs
88
src/bus.rs
@ -1,40 +1,38 @@
|
|||||||
use crate::utils::{join_bytes};
|
use crate::utils::{join_bytes};
|
||||||
use crate::rom::ROM;
|
use crate::rom::ROM;
|
||||||
|
|
||||||
pub enum MemoryMap {
|
pub struct AddressRange {
|
||||||
BankZero,
|
begin: u16,
|
||||||
BankSwitchable,
|
end: u16,
|
||||||
VideoRAM,
|
|
||||||
ExternalRAM,
|
|
||||||
WorkRAM1,
|
|
||||||
WorkRAM2,
|
|
||||||
EchoRAM,
|
|
||||||
SpriteAttributeTable,
|
|
||||||
NotUsable,
|
|
||||||
IORegisters,
|
|
||||||
HighRAM,
|
|
||||||
InterruptEnableRegister,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MemoryMap {
|
impl AddressRange {
|
||||||
pub fn get_map(address: u16) -> Self {
|
pub fn begin(&self) -> u16 {
|
||||||
match address {
|
self.begin
|
||||||
0x0000..=0x3FFF => Self::BankZero,
|
}
|
||||||
0x4000..=0x7FFF => Self::BankSwitchable,
|
|
||||||
0x8000..=0x9FFF => Self::VideoRAM,
|
pub fn end(&self) -> u16 {
|
||||||
0xA000..=0xBFFF => Self::ExternalRAM,
|
self.end
|
||||||
0xC000..=0xCFFF => Self::WorkRAM1,
|
}
|
||||||
0xD000..=0xDFFF => Self::WorkRAM2,
|
|
||||||
0xE000..=0xFDFF => Self::EchoRAM, // Mirror of C000~DDFF
|
pub fn in_range(&self, address: u16) -> bool {
|
||||||
0xFE00..=0xFE9F => Self::SpriteAttributeTable,
|
address >= self.begin && address <= self.end
|
||||||
0xFEA0..=0xFEFF => Self::NotUsable,
|
|
||||||
0xFF00..=0xFF7F => Self::IORegisters,
|
|
||||||
0xFF80..=0xFFFE => Self::HighRAM,
|
|
||||||
0xFFFF => Self::InterruptEnableRegister,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 struct Bus {
|
pub struct Bus {
|
||||||
game_rom: ROM,
|
game_rom: ROM,
|
||||||
data: [u8; 0x10000],
|
data: [u8; 0x10000],
|
||||||
@ -62,17 +60,16 @@ impl Bus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn read(&self, address: u16) -> u8 {
|
pub fn read(&self, address: u16) -> u8 {
|
||||||
match MemoryMap::get_map(address) {
|
if BANK_ZERO.in_range(address) || BANK_SWITCHABLE.in_range(address) {
|
||||||
MemoryMap::BankZero => self.game_rom.read(address),
|
return self.game_rom.read(address);
|
||||||
MemoryMap::BankSwitchable => self.game_rom.read(address),
|
} else if IO_REGISTERS.in_range(address) {
|
||||||
MemoryMap::WorkRAM1 | MemoryMap::WorkRAM2 | MemoryMap::InterruptEnableRegister => self.data[address as usize],
|
return match address {
|
||||||
MemoryMap::IORegisters => match address {
|
|
||||||
0xFF44 => 0x90,
|
0xFF44 => 0x90,
|
||||||
0xFF4D => 0xFF,
|
0xFF4D => 0xFF,
|
||||||
_ => self.data[address as usize],
|
_ => self.data[address as usize],
|
||||||
}
|
}
|
||||||
_ => self.data[address as usize],
|
|
||||||
}
|
}
|
||||||
|
self.data[address as usize]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_16bit(&self, address: u16) -> u16 {
|
pub fn read_16bit(&self, address: u16) -> u16 {
|
||||||
@ -83,23 +80,20 @@ impl Bus {
|
|||||||
if address == 0xFF01 {
|
if address == 0xFF01 {
|
||||||
print!("{}", data as char);
|
print!("{}", data as char);
|
||||||
}
|
}
|
||||||
match MemoryMap::get_map(address) {
|
|
||||||
MemoryMap::BankZero | MemoryMap::BankSwitchable => {
|
if BANK_ZERO.in_range(address) || BANK_SWITCHABLE.in_range(address) {
|
||||||
// println!("WRITING TO ROM");
|
println!("WRITING TO ROM");
|
||||||
},
|
} else if WORK_RAM_1.in_range(address) || WORK_RAM_2.in_range(address) {
|
||||||
MemoryMap::WorkRAM1 | MemoryMap::WorkRAM2 => {
|
|
||||||
self.data[address as usize] = data;
|
self.data[address as usize] = data;
|
||||||
// Copy to the ECHO RAM
|
// Copy to the ECHO RAM
|
||||||
if address <= 0xDDFF {
|
if address <= 0xDDFF {
|
||||||
// self.data[(0xE000 + (address - 0xC000)) as usize] = data;
|
self.data[(ECHO_RAM.begin() + (address - WORK_RAM_1.begin())) as usize] = data;
|
||||||
|
}
|
||||||
|
} else if ECHO_RAM.in_range(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
|
||||||
}
|
}
|
||||||
},
|
|
||||||
MemoryMap::EchoRAM => {
|
|
||||||
self.data[address as usize] = data;
|
self.data[address as usize] = data;
|
||||||
// self.data[(0xC000 + (address - 0xE000)) as usize] = data; // Copy to the working RAM
|
|
||||||
},
|
|
||||||
_ => self.data[address as usize] = data,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_16bit(&mut self, address: u16, data: u16) {
|
pub fn write_16bit(&mut self, address: u16, data: u16) {
|
||||||
|
@ -3,7 +3,7 @@ use crate::utils::{
|
|||||||
get_bit,
|
get_bit,
|
||||||
set_bit,
|
set_bit,
|
||||||
};
|
};
|
||||||
use crate::bus::Bus;
|
use crate::bus::{Bus, BANK_ZERO};
|
||||||
|
|
||||||
struct ColorPalette(u8, u8, u8, u8);
|
struct ColorPalette(u8, u8, u8, u8);
|
||||||
|
|
||||||
@ -91,6 +91,10 @@ impl PPU {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_sprite(address: u16) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
fn get_scroll_x(bus: &Bus) -> u8 {
|
fn get_scroll_x(bus: &Bus) -> u8 {
|
||||||
bus.read(SCROLL_X_ADDRESS)
|
bus.read(SCROLL_X_ADDRESS)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user