trying to render planeb

This commit is contained in:
kirjavascript 2021-05-05 20:39:09 +01:00
parent 3b37c1414b
commit 08f3a07e07
3 changed files with 65 additions and 15 deletions

View file

@ -26,7 +26,7 @@ fn main() {
let mut toggle = Button::new(400, 300, 80, 40, "stop");
let mut but = Button::new(400, 350, 80, 40, "frame");
let mut step = Button::new(400, 400, 80, 40, "step");
let mut stepby = IntInput::new(400, 450, 80, 40, "step by");
let stepby = IntInput::new(400, 450, 80, 40, "step by");
let mut info = TextDisplay::new(0, 0, 500, 300, "asm");
stepby.set_value("1");

View file

@ -55,7 +55,7 @@ impl Megadrive {
}
pub fn frame(&mut self) {
/* cycle counts taken from drx/kiwi */
/* cycle counts initially taken from drx/kiwi */
self.clear_screen();
@ -95,9 +95,7 @@ impl Megadrive {
self.core.mem.vdp.set_status(vdp::VINT_MASK);
}
self.core.execute(200);
self.core.execute(3420-788);
self.core.execute(3420-588);
for _ in screen_height..262 {
self.core.execute(3420);
@ -113,6 +111,7 @@ impl Megadrive {
};
}
#[allow(unused_variables)]
fn fire_beam(&mut self, line: usize) {
let (cellw, cellh) = self.core.mem.vdp.scroll_size();
let screen_width = self.core.mem.vdp.screen_width();
@ -125,8 +124,7 @@ impl Megadrive {
let hscroll_mode = self.core.mem.vdp.registers[0xB] & 3;
let planea_nametable =
((self.core.mem.vdp.registers[4] >> 3) as u32 & 3) << 10;
let planeb_nametable =
(self.core.mem.vdp.registers[4] as u32 & 3) << 10;
let index = match hscroll_mode {
0 => 0,
@ -138,10 +136,57 @@ impl Megadrive {
let hscroll = hscroll_addr + (index * 4); // 3 ?
for cell in 0..screen_width {
let planeb_nametable =
(self.core.mem.vdp.registers[4] as u32 & 3) << 10;
let planeb = &self.core.mem.vdp.VRAM[planeb_nametable as usize..];
let tiles = (0..cellw).map(|i| {
let offset = (i as usize * 2) ;
if i as usize + 1 > planeb.len() { return 0 }
(planeb[offset] as usize & 7) << 8 | planeb[offset + 1] as usize
}).collect::<Vec<_>>();
// println!("{:?} {:?}", tiles, tiles.len());
let tile_y = line & 7;
let y_offset = tile_y * 4;
// for i in 0..0xFF {
// print!("{:b} ", planeb[i]);
// }
// println!("");
// tile is 32 bytes
for pixel in 0..screen_width {
if let Some(tile) = tiles.get(pixel / 8) {
let x_offset = pixel & 6;
let px = self.core.mem.vdp.VRAM[(tile * 32) + x_offset + y_offset];
let px = if pixel & 1 == 1 {
px >> 4
} else {
px & 0xF
};
let (r, g, b) = self.core.mem.vdp.color(0, px as _);
let screen_offset = (pixel + (line * screen_width)) * 3;
self.screen[screen_offset] = r;
self.screen[screen_offset + 1] = g;
self.screen[screen_offset + 2] = b;
}
}
}
}

View file

@ -55,19 +55,23 @@ impl VDP {
}
}
pub fn cram_rgb(&self) -> [(u8, u8, u8); 64] {
let mut rgb = [(0, 0, 0); 64];
for (i, color) in self.CRAM.iter().enumerate() {
rgb[i] = cram_to_rgb(*color);
}
rgb
pub fn color(&self, line: usize, index: usize) -> (u8, u8, u8) {
cram_to_rgb(self.CRAM[index + (line * 0x10)])
}
pub fn bg_color(&self) -> (u8, u8, u8) {
let vdp_bg = self.registers[7];
let index = vdp_bg & 0xF;
let line = (vdp_bg >> 4) & 3;
cram_to_rgb(self.CRAM[(index + (line * 0x10)) as usize])
self.color(line as _, index as _)
}
pub fn cram_rgb(&self) -> [(u8, u8, u8); 64] {
let mut rgb = [(0, 0, 0); 64];
for (i, color) in self.CRAM.iter().enumerate() {
rgb[i] = cram_to_rgb(*color);
}
rgb
}
pub fn screen_width(&self) -> usize {
@ -104,6 +108,7 @@ impl VDP {
pub fn scroll_size(&self) -> (u8, u8) {
let to_cells = |size| (size + 1) * 32;
// TODO: 96 is invalid
(
to_cells(self.registers[0x10] & 3),
to_cells((self.registers[0x10] >> 4) & 3),