Low res graphics, paletted and direct

This commit is contained in:
2022-02-20 22:06:38 -06:00
parent 412bec82d1
commit ef6d87f617
2 changed files with 73 additions and 15 deletions
+62 -11
View File
@@ -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<P: PeekPoke>(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<P: PeekPoke>(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<P: PeekPoke>(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<P: PeekPoke>(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<P: PeekPoke>(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<P: PeekPoke>(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<P: PeekPoke>(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<P: PeekPoke>(machine: &P, reg: DisplayRegisters, frame
pixel[3] = 0xff;
}
}
fn draw_direct_low_gfx<P: PeekPoke>(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<P: PeekPoke>(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;
}
}
+11 -4
View File
@@ -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)
}