gb/src/work_ram.rs

67 lines
1.4 KiB
Rust
Raw Normal View History

2021-01-03 06:28:07 +00:00
#[derive(Debug, Clone)]
2021-03-16 06:05:13 +00:00
pub struct WorkRam {
bank: Box<[u8; 4096]>,
2021-01-03 06:28:07 +00:00
}
2021-03-16 06:05:13 +00:00
impl WorkRam {
pub fn write_byte(&mut self, addr: u16, byte: u8) {
self.bank[addr as usize - 0xC000] = byte;
2021-01-03 06:28:07 +00:00
}
pub fn read_byte(&self, addr: u16) -> u8 {
self.bank[addr as usize - 0xC000]
2021-01-03 06:28:07 +00:00
}
}
2021-03-16 06:05:13 +00:00
impl Default for WorkRam {
2021-01-03 06:28:07 +00:00
fn default() -> Self {
Self {
bank: Box::new([0u8; 4096]),
2021-01-03 06:28:07 +00:00
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum BankNumber {
2021-01-19 07:36:44 +00:00
One = 1,
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7,
2021-01-03 06:28:07 +00:00
}
#[derive(Debug, Clone)]
2021-03-16 06:05:13 +00:00
pub struct VariableWorkRam {
2021-01-03 06:28:07 +00:00
current: BankNumber,
bank_n: Box<[[u8; 4096]; 7]>, // 4K for Variable amount of Banks (Banks 1 -> 7) in Game Boy Colour
2021-01-03 06:28:07 +00:00
}
2021-03-16 06:05:13 +00:00
impl Default for VariableWorkRam {
2021-01-03 06:28:07 +00:00
fn default() -> Self {
Self {
current: BankNumber::One,
bank_n: Box::new([[0u8; 4096]; 7]),
2021-01-03 06:28:07 +00:00
}
}
}
2021-03-16 06:05:13 +00:00
impl VariableWorkRam {
2021-01-03 06:28:07 +00:00
pub fn set_current_bank(&mut self, bank: BankNumber) {
self.current = bank;
}
pub fn get_current_bank(&self) -> BankNumber {
self.current
}
pub fn write_byte(&mut self, addr: u16, byte: u8) {
self.bank_n[self.current as usize][addr as usize - 0xD000] = byte;
2021-01-03 06:28:07 +00:00
}
pub fn read_byte(&self, addr: u16) -> u8 {
self.bank_n[self.current as usize][addr as usize - 0xD000]
2021-01-03 06:28:07 +00:00
}
}