From ef6d87f617eacc3e68f4f96047acf0c364ec906e Mon Sep 17 00:00:00 2001 From: Ross Andrews Date: Sun, 20 Feb 2022 22:06:38 -0600 Subject: [PATCH] Low res graphics, paletted and direct --- src/display.rs | 73 ++++++++++++++++++++++++++++++++++++++++++-------- src/main.rs | 15 ++++++++--- 2 files changed, 73 insertions(+), 15 deletions(-) diff --git a/src/display.rs b/src/display.rs index 5e8df07..2411331 100644 --- a/src/display.rs +++ b/src/display.rs @@ -16,12 +16,12 @@ struct DisplayRegisters { impl Default for DisplayRegisters { fn default() -> Self { Self { - mode: 4, + mode: 5, screen: 0x10000, palette: 0x20000 - 0x100, font: 0x20000 - 0x100 - 0x2000, - height: 60, - width: 80, + height: 128, + width: 128, row_offset: 0, col_offset: 0 } @@ -73,6 +73,8 @@ pub fn draw(machine: &P, frame: &mut[u8]) { (false, true, false) => draw_direct_high_text(machine, reg, frame), (false, false, false) => draw_direct_low_text(machine, reg, frame), (true, false, false) => draw_paletted_low_text(machine, reg, frame), + (false, false, true) => draw_direct_low_gfx(machine, reg, frame), + (true, false, true) => draw_paletted_low_gfx(machine, reg, frame), (_, _, _) => {panic!("Unimplemented mode {}", reg.mode)} } } @@ -105,7 +107,7 @@ fn draw_direct_high_gfx(machine: &P, reg: DisplayRegisters, frame: let (vulcan_row, vulcan_col) = ((display_row >> 2) as u32, (display_col >> 2) as u32); let vb = machine.peek(Word::from(to_byte_address((vulcan_col, vulcan_row), reg))); - let (red, green, blue) = (vb >> 5, (vb >> 3) & 7, (vb & 3) << 1); + let (red, green, blue) = (vb >> 5, (vb >> 2) & 7, (vb & 3) << 1); pixel[0] = red << 5; pixel[1] = green << 5; @@ -122,7 +124,7 @@ fn draw_paletted_high_gfx(machine: &P, reg: DisplayRegisters, frame let addr = to_byte_address((vulcan_col, vulcan_row), reg); let color_idx = machine.peek(Word::from(addr)); let color = machine.peek(Word::from(reg.palette + color_idx as u32)); - let (red, green, blue) = (color >> 5, (color >> 3) & 7, (color & 3) << 1); + let (red, green, blue) = (color >> 5, (color >> 2) & 7, (color & 3) << 1); pixel[0] = red << 5; pixel[1] = green << 5; @@ -148,8 +150,8 @@ fn draw_paletted_high_text(machine: &P, reg: DisplayRegisters, fram let fg_color = machine.peek(Word::from(reg.palette + fg_color_idx as u32)); let bg_color = machine.peek(Word::from(reg.palette + bg_color_idx as u32)); - let (fg_red, fg_green, fg_blue) = (fg_color >> 5, (fg_color >> 3) & 7, (fg_color & 3) << 1); - let (bg_red, bg_green, bg_blue) = (bg_color >> 5, (bg_color >> 3) & 7, (bg_color & 3) << 1); + let (fg_red, fg_green, fg_blue) = (fg_color >> 5, (fg_color >> 2) & 7, (fg_color & 3) << 1); + let (bg_red, bg_green, bg_blue) = (bg_color >> 5, (bg_color >> 2) & 7, (bg_color & 3) << 1); if char_byte & (1 << (7 - char_col)) != 0 { pixel[0] = fg_red << 5; @@ -177,7 +179,7 @@ fn draw_direct_high_text(machine: &P, reg: DisplayRegisters, frame: let color_addr = addr + (reg.width * reg.height); let color = machine.peek(Word::from(color_addr)); - let (red, green, blue) = (color >> 5, (color >> 3) & 7, (color & 3) << 1); + let (red, green, blue) = (color >> 5, (color >> 2) & 7, (color & 3) << 1); if char_byte & (1 << (7 - char_col)) != 0 { pixel[0] = red << 5; @@ -205,7 +207,7 @@ fn draw_direct_low_text(machine: &P, reg: DisplayRegisters, frame: let color_addr = addr + (reg.width * reg.height); let color = machine.peek(Word::from(color_addr)); - let (red, green, blue) = (color >> 5, (color >> 3) & 7, (color & 3) << 1); + let (red, green, blue) = (color >> 5, (color >> 2) & 7, (color & 3) << 1); if char_byte & (1 << (7 - char_col)) != 0 { pixel[0] = red << 5; @@ -237,8 +239,8 @@ fn draw_paletted_low_text(machine: &P, reg: DisplayRegisters, frame let fg_color = machine.peek(Word::from(reg.palette + fg_color_idx as u32)); let bg_color = machine.peek(Word::from(reg.palette + bg_color_idx as u32)); - let (fg_red, fg_green, fg_blue) = (fg_color >> 5, (fg_color >> 3) & 7, (fg_color & 3) << 1); - let (bg_red, bg_green, bg_blue) = (bg_color >> 5, (bg_color >> 3) & 7, (bg_color & 3) << 1); + let (fg_red, fg_green, fg_blue) = (fg_color >> 5, (fg_color >> 2) & 7, (fg_color & 3) << 1); + let (bg_red, bg_green, bg_blue) = (bg_color >> 5, (bg_color >> 2) & 7, (bg_color & 3) << 1); if char_byte & (1 << (7 - char_col)) != 0 { pixel[0] = fg_red << 5; @@ -252,3 +254,52 @@ fn draw_paletted_low_text(machine: &P, reg: DisplayRegisters, frame pixel[3] = 0xff; } } + +fn draw_direct_low_gfx(machine: &P, reg: DisplayRegisters, frame: &mut [u8]) { + for (i, pixel) in frame.chunks_exact_mut(4).enumerate() { + let (display_row, display_col) = (i / 640, i % 640); + + if display_row >= (240 - 64 * 3) && display_row < (240 + 64 * 3) && + display_col >= (320 - 64 * 3) && display_col < (320 + 64 * 3) { + let (vulcan_row, vulcan_col) = (((display_row - (240 - 64 * 3)) / 3) as u32, ((display_col - (320 - 64 * 3)) / 3) as u32); + + let vb = machine.peek(Word::from(to_byte_address((vulcan_col, vulcan_row), reg))); + let (red, green, blue) = (vb >> 5, (vb >> 2) & 7, (vb & 3) << 1); + + pixel[0] = red << 5; + pixel[1] = green << 5; + pixel[2] = blue << 5; + } else { + pixel[0] = 0; + pixel[1] = 0; + pixel[2] = 0; + } + + pixel[3] = 0xff; + } +} + +fn draw_paletted_low_gfx(machine: &P, reg: DisplayRegisters, frame: &mut [u8]) { + for (i, pixel) in frame.chunks_exact_mut(4).enumerate() { + let (display_row, display_col) = (i / 640, i % 640); + + if display_row >= (240 - 64 * 3) && display_row < (240 + 64 * 3) && + display_col >= (320 - 64 * 3) && display_col < (320 + 64 * 3) { + let (vulcan_row, vulcan_col) = (((display_row - (240 - 64 * 3)) / 3) as u32, ((display_col - (320 - 64 * 3)) / 3) as u32); + + let color_idx = machine.peek(Word::from(to_byte_address((vulcan_col, vulcan_row), reg))); + let vb = machine.peek(Word::from(reg.palette + color_idx as u32)); + let (red, green, blue) = (vb >> 5, (vb >> 2) & 7, (vb & 3) << 1); + + pixel[0] = red << 5; + pixel[1] = green << 5; + pixel[2] = blue << 5; + } else { + pixel[0] = 0; + pixel[1] = 0; + pixel[2] = 0; + } + + pixel[3] = 0xff; + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index f323be5..4b84a04 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,10 +42,17 @@ fn main() { let memory = Memory::from(rng); let mut cpu = CPU::new(memory); display::reset(&mut cpu); - // for n in 0..256 { - // let color = ((n / 32) << 3) as u8; - // cpu.poke(Word::from(0x20000 - 0x100 + n as u32), color); - // } + for n in 0..128 { + cpu.poke(Word::from(0x10000 + 128 * n), 0b11100000); + cpu.poke(Word::from(0x10000 + n), 0xff); + cpu.poke(Word::from(0x10000 + 128 * n + 127), 0b00000011); + cpu.poke(Word::from(0x10000 + 128 * 127 + n), 0b00011100); + + cpu.poke(Word::from(0x10000 + 128 * n), 1); + cpu.poke(Word::from(0x10000 + n), 2); + cpu.poke(Word::from(0x10000 + 128 * n + 127), 3); + cpu.poke(Word::from(0x10000 + 128 * 127 + n), 4); + } window_loop(event_loop, window, pixels, cpu) }