From 48659cd7fef1824dc20a04f88ae575c0370e49f2 Mon Sep 17 00:00:00 2001 From: Ross Andrews Date: Sun, 20 Feb 2022 14:25:43 -0600 Subject: [PATCH] Basic high res gfx --- src/bus.rs | 2 +- src/cpu.rs | 11 ++++++++--- src/main.rs | 37 ++++++++++++++++++++++++++----------- src/memory.rs | 4 ++-- src/{address.rs => word.rs} | 0 5 files changed, 37 insertions(+), 17 deletions(-) rename src/{address.rs => word.rs} (100%) diff --git a/src/bus.rs b/src/bus.rs index 30fb061..a4b14dd 100644 --- a/src/bus.rs +++ b/src/bus.rs @@ -1,5 +1,5 @@ use crate::memory::PeekPoke; -use crate::address::Word; +use crate::word::Word; pub trait Device { fn tick(&mut self); diff --git a/src/cpu.rs b/src/cpu.rs index bd30eac..c5a2d26 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -1,12 +1,12 @@ use crate::opcodes::Opcode; use crate::opcodes::InvalidOpcode; use crate::memory::Memory; -use crate::address::Word; +use crate::word::Word; use crate::memory::PeekPoke; use std::convert::TryFrom; #[allow(clippy::upper_case_acronyms)] -struct CPU { +pub struct CPU { memory: Memory, // Main memory, all of it pc: Word, // program counter, address of the low byte of the instruction dp: Word, // data pointer, address of the low byte of one cell above the data stack @@ -23,8 +23,13 @@ struct Instruction { length: u8 } +impl PeekPoke for CPU { + fn peek(&self, addr: Word) -> u8 { self.memory.peek(addr) } + fn poke(&mut self, addr: Word, val: u8) { self.memory.poke(addr, val) } +} + impl CPU { - fn new(memory: Memory) -> Self { + pub fn new(memory: Memory) -> Self { Self { memory, pc: 1024.into(), diff --git a/src/main.rs b/src/main.rs index 4aa05a3..ea90002 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ mod memory; -mod address; +mod word; mod opcodes; mod cpu; mod bus; @@ -14,6 +14,10 @@ use winit::{ use pixels::{Pixels, SurfaceTexture}; use rand::RngCore; use std::time::Instant; +use winit::window::Window; +use crate::cpu::CPU; +use crate::memory::{ Memory, PeekPoke }; +use crate::word::Word; fn main() { let event_loop = EventLoop::new(); @@ -33,6 +37,14 @@ fn main() { Pixels::new(640, 480, surface_texture).unwrap() }; + let mut rng = rand::thread_rng(); + + let memory = Memory::from(rng); + let cpu = CPU::new(memory); + window_loop(event_loop, window, pixels, cpu) +} + +fn window_loop(event_loop: EventLoop<()>, window: Window, mut pixels: Pixels, mut cpu: CPU) -> ! { event_loop.run(move |event, _, control_flow| { *control_flow = ControlFlow::Poll; @@ -45,27 +57,30 @@ fn main() { } Event::MainEventsCleared => { let start = Instant::now(); - draw(pixels.get_frame()); + draw(pixels.get_frame(), &mut cpu); let draw_time = Instant::now() - start; pixels.render().expect("Problem displaying framebuffer"); let total_time = Instant::now() - start; - println!("Tick took {} total, {} to draw", total_time.as_micros(), draw_time.as_micros()); + //println!("Tick took {} total, {} to draw", total_time.as_micros(), draw_time.as_micros()); } _ => {} } }) } -fn draw(frame: &mut [u8]) { +fn draw(frame: &mut [u8], cpu: &mut CPU) { assert_eq!(frame.len(), 640 * 480 * 4); - let mut rng = rand::thread_rng(); - for (_, pixel) in frame.chunks_exact_mut(4).enumerate() { - let p = rng.next_u32(); - let [low, mid, high, _] = p.to_le_bytes(); - pixel[0] = low; - pixel[1] = mid; - pixel[2] = high; + // For now, assume 160x120 direct graphics mode + for (i, pixel) in frame.chunks_exact_mut(4).enumerate() { + let (display_row, display_col) = (i / 640, i % 640); + let (vulcan_row, vulcan_col) = (display_row >> 2, display_col >> 2); + let vb = cpu.peek(Word::from((0x10000 + vulcan_row * 160 + vulcan_col) as u32)); + let (red, green, blue) = (vb >> 5, (vb >> 3) & 7, (vb & 3) << 1); + + pixel[0] = red << 5; + pixel[1] = green << 5; + pixel[2] = blue << 5; pixel[3] = 0xff; } } \ No newline at end of file diff --git a/src/memory.rs b/src/memory.rs index 7961292..be43e71 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -1,6 +1,6 @@ use rand::Rng; -use crate::address::Word; -use crate::address::MEM_SIZE; +use crate::word::Word; +use crate::word::MEM_SIZE; pub struct Memory([u8; MEM_SIZE as usize]); diff --git a/src/address.rs b/src/word.rs similarity index 100% rename from src/address.rs rename to src/word.rs