added some vdp stuff

This commit is contained in:
kirjavascript 2021-04-26 23:53:14 +01:00
parent bbedc10a84
commit a566a19c9b
3 changed files with 47 additions and 45 deletions

View file

@ -9,7 +9,7 @@ pub struct Mem {
pub rom: ROM,
pub io: IO,
pub vdp: VDP,
pub work_ram: [u8; 0x10000],
pub ram: [u8; 0x10000],
pub z80: Z80,
}
@ -19,7 +19,7 @@ impl Mem {
rom,
io: IO::new(),
vdp: VDP::new(),
work_ram: [0; 0x10000],
ram: [0; 0x10000],
z80: Z80::new(),
}
}
@ -30,65 +30,51 @@ impl AddressBus for Mem {
todo!("copy from");
}
fn read_byte(&self, _address_space: AddressSpace, address: u32) -> u32 {
match address {
match address & 0xFFFFFF {
0..=0x3FFFFF => self.rom.read_byte(address) as _,
0xA00000..=0xA03FFF => self.z80.read_byte(address) as _,
0xA04000..=0xA0FFFF => 0,
0xA10000..=0xA1001F => self.io.read_byte(address) as _,
0xA11100..=0xA112FF => self.z80.ctrl_read(address) as _,
// z80 ctrl
// vdp
0xFF0000..=0xFFFFFF => self.work_ram[address as usize & 0xFFFF] as _,
0xC00000..=0xDFFFFF => self.vdp.read(address),
0xFF0000..=0xFFFFFF => self.ram[address as usize & 0xFFFF] as _,
_ => todo!("read byte {:X}", address),
}
}
fn read_word(&self, address_space: AddressSpace, address: u32) -> u32 {
match address {
0..=0xFFFFFE => {
self.read_byte(address_space, address) << 8
| self.read_byte(address_space, address + 1)
},
_ => todo!("read word {:X}", address),
if (0xC00000..=0xDFFFFF).contains(&(address & 0xFFFFFF)) {
return self.vdp.read(address);
}
self.read_byte(address_space, address) << 8
| self.read_byte(address_space, address + 1)
}
fn read_long(&self, address_space: AddressSpace, address: u32) -> u32 {
match address {
0..=0xFFFFFC => {
self.read_word(address_space, address) << 16
| self.read_word(address_space, address + 2)
},
_ => todo!("read long {:X}", address),
}
self.read_word(address_space, address) << 16
| self.read_word(address_space, address + 2)
}
fn write_byte(&mut self, _address_space: AddressSpace, address: u32, value: u32) {
match address {
match address & 0xFFFFFF {
0..=0x3FFFFF => {},
0xA00000..=0xA03FFF => self.z80.write_byte(address, value),
0xA04000..=0xA0FFFF => {},
0xA10000..=0xA1001F => self.io.write_byte(address, value),
0xA11100..=0xA112FF => self.z80.ctrl_write(address, value),
0xC00000..=0xDFFFFF => eprintln!("vdp write byte {:X} {:X}", address, value),
0xFF0000..=0xFFFFFF => {
self.work_ram[address as usize & 0xFFFF] = value as u8;
self.ram[address as usize & 0xFFFF] = value as u8;
},
_ => todo!("write byte {:X} {:X}", address, value),
}
}
fn write_word(&mut self, address_space: AddressSpace, address: u32, value: u32) {
match address {
0..=0xFFFFFE => {
self.write_byte(address_space, address, value >> 8);
self.write_byte(address_space, address + 1, value & 0xFF);
},
_ => todo!("write word {:X} {:X}", address, value),
if (0xC00000..=0xDFFFFF).contains(&(address & 0xFFFFFF)) {
return self.vdp.write(address, value);
}
self.write_byte(address_space, address, value >> 8);
self.write_byte(address_space, address + 1, value & 0xFF);
}
fn write_long(&mut self, address_space: AddressSpace, address: u32, value: u32) {
match address {
0..=0xFFFFFC => {
self.write_word(address_space, address, value >> 16);
self.write_word(address_space, address + 2, value & 0xFFFF);
},
_ => todo!("write long {:X} {:X}", address, value),
}
self.write_word(address_space, address, value >> 16);
self.write_word(address_space, address + 2, value & 0xFFFF);
}
}

View file

@ -29,15 +29,15 @@ impl ROM {
String::from_utf8_lossy(&self.bytes[range]).to_string()
}
pub fn vectors(&self) -> Vec<u32> {
let mut i = 0;
let mut vtrs = Vec::new();
while i < 0x100 {
vtrs.push(self.read_long(i));
i += 4;
}
vtrs
}
// pub fn vectors(&self) -> Vec<u32> {
// let mut i = 0;
// let mut vtrs = Vec::new();
// while i < 0x100 {
// vtrs.push(self.read_long(i));
// i += 4;
// }
// vtrs
// }
pub fn stack_pointer(&self) -> u32 { self.read_long(0x0) }
pub fn entry_point(&self) -> u32 { self.read_long(0x4) }

View file

@ -1,11 +1,27 @@
pub struct VDP {
VRAM: [u8; 0x10000],
CRAM: [u16; 0x40],
VSRAM: [u16; 0x40],
registers: [u8; 0x20],
}
impl VDP {
pub fn new() -> Self {
Self {
VRAM: [0; 0x10000],
CRAM: [0; 0x40],
VSRAM: [0; 0x40],
registers: [0; 0x20],
}
}
pub fn read(&self, mut address: u32) -> u32 {
address &= 0xFFFFFF;
0
}
pub fn write(&mut self, mut address: u32, value: u32) {
}
}