Compare commits

...

3 Commits

Author SHA1 Message Date
60d098e83c cargo fix 2020-02-18 16:29:59 +01:00
aa329237ba cargo fmt 2020-02-18 16:29:29 +01:00
55373a6948 Improve DMA & MBC5 2020-02-18 16:29:05 +01:00
4 changed files with 29 additions and 12 deletions

View File

@ -92,7 +92,7 @@ impl BgMapAttributes {
} }
fn vram_bank_number(&self) -> usize { fn vram_bank_number(&self) -> usize {
(((self.0 >> 3) & 1) as usize) ((self.0 >> 3) & 1) as usize
} }
fn horizontal_flip(&self) -> bool { fn horizontal_flip(&self) -> bool {
@ -374,7 +374,7 @@ impl Display {
} }
0xFF69 => { 0xFF69 => {
let idx = self.background_palette_index as usize; let idx = self.background_palette_index as usize;
if idx < 64 { if idx < 64 {
self.background_palette_cgb[idx / 8].0[idx % 8] = val; self.background_palette_cgb[idx / 8].0[idx % 8] = val;
} else { } else {
panic!("OOB palette w/ autoinc"); panic!("OOB palette w/ autoinc");
@ -389,7 +389,7 @@ impl Display {
} }
0xFF6B => { 0xFF6B => {
let idx = self.object_palette_index as usize; let idx = self.object_palette_index as usize;
if idx < 64 { if idx < 64 {
self.object_palette_cgb[idx / 8].0[idx % 8] = val; self.object_palette_cgb[idx / 8].0[idx % 8] = val;
} else { } else {
panic!("OOB obj palette w/ autoinc"); panic!("OOB obj palette w/ autoinc");
@ -459,7 +459,10 @@ impl Display {
background_map + ((tile_index_y as usize) * 32) + tile_index_x as usize; background_map + ((tile_index_y as usize) * 32) + tile_index_x as usize;
*/ */
// Background attributes are only in this memory range. // Background attributes are only in this memory range.
assert!(vram_offset >= 0x1800 && vram_offset < 0x2000, format!("offset: {:04X}", vram_offset)); assert!(
vram_offset >= 0x1800 && vram_offset < 0x2000,
format!("offset: {:04X}", vram_offset)
);
BgMapAttributes(self.vram1[vram_offset]) BgMapAttributes(self.vram1[vram_offset])
} }
@ -670,7 +673,12 @@ impl Display {
continue; continue;
} }
let c = self.object_palette_cgb[sprite.palette() as usize].get_color(c); let c = self.object_palette_cgb[sprite.palette() as usize].get_color(c);
self.set_pixel(x.wrapping_add(x_maybe_flipped), render_y, c, PixelOrigin::Sprite); self.set_pixel(
x.wrapping_add(x_maybe_flipped),
render_y,
c,
PixelOrigin::Sprite,
);
} }
} }
} }
@ -690,8 +698,12 @@ impl Display {
} }
pub fn dump_vram(&self) { pub fn dump_vram(&self) {
std::fs::File::create("vram0.dat").unwrap().write_all(&self.vram0); std::fs::File::create("vram0.dat")
std::fs::File::create("vram1.dat").unwrap().write_all(&self.vram1); .unwrap()
.write_all(&self.vram0);
std::fs::File::create("vram1.dat")
.unwrap()
.write_all(&self.vram1);
} }
#[inline] #[inline]

View File

@ -397,19 +397,21 @@ impl Interconnect {
let mut dst: u16 = ((self.vram_dma_destination_high as u16) << 8) let mut dst: u16 = ((self.vram_dma_destination_high as u16) << 8)
| self.vram_dma_destination_low as u16; | self.vram_dma_destination_low as u16;
dst &= 0b0001_1111_1111_0000;
dst += 0x8000; dst += 0x8000;
println!( println!(
"VRAM DMA transfer from {:04X} to {:04X}; {:02X}", "VRAM DMA transfer from {:04X} to {:04X}; {:02X}",
src, dst, val src, dst, val
); );
let len: u16 = ((val & 0x7F) + 1) as u16 * 0x10 - 1; let len: u16 = ((val & 0x7F) + 1) as u16 * 0x10;
let _mode = val & 0x80 != 0;
for i in 0..len { for i in 0..len {
let v = self.read_byte(src.wrapping_add(i)); let v = self.read_byte(src.wrapping_add(i));
self.write_byte(dst.wrapping_add(i), v); self.write_byte(dst.wrapping_add(i), v);
} }
// DMA done // DMA done
self.vram_dma_length = val | 0x80; self.vram_dma_length = 0xFF; // val | 0x80;
} }
0xFF56 => { 0xFF56 => {
self.infrared_com_port = val; self.infrared_com_port = val;

View File

@ -67,10 +67,13 @@ impl MBC for MBC5 {
fn write_byte(&mut self, addr: u16, val: u8) { fn write_byte(&mut self, addr: u16, val: u8) {
match addr { match addr {
0x0000..=0x1FFF => match val { 0x0000..=0x1FFF => match val & 0x0F {
0x0A => self.ram_rtc_enabled = true, 0x0A => self.ram_rtc_enabled = true,
0x00 => self.ram_rtc_enabled = false, 0x00 => self.ram_rtc_enabled = false,
_ => println!("MBC5: Unknown MBC value {:02X} for {:04X}", val, addr), _ => {
println!("MBC5: Unknown MBC value {:02X} for {:04X}", val, addr);
self.ram_rtc_enabled = false;
}
}, },
// Lower part rom bank select // Lower part rom bank select
0x2000..=0x2FFF => self.rom_bank_no = (self.rom_bank_no & (!0xFF)) | u16::from(val), 0x2000..=0x2FFF => self.rom_bank_no = (self.rom_bank_no & (!0xFF)) | u16::from(val),

View File

@ -17,7 +17,7 @@ pub struct Timer {
// [2] = 4 = 65536 Hz // [2] = 4 = 65536 Hz
// [3] = 16 = 16384 Hz // [3] = 16 = 16384 Hz
const TIMER_SPEED: [u16; 4] = [64, 1, 4, 16]; const TIMER_SPEED: [u16; 4] = [64, 1, 4, 16];
const TIMER_ENABLE: u8 = (1 << 2); const TIMER_ENABLE: u8 = 1 << 2;
impl Timer { impl Timer {
pub fn new() -> Timer { pub fn new() -> Timer {