From e15a2e2aaf492d9864e6ac094ee331146f54f725 Mon Sep 17 00:00:00 2001 From: shylie Date: Fri, 7 Mar 2025 09:04:26 -0500 Subject: [PATCH] Add other instructions --- examples/first.asm | 4 ++-- src/foot.asm | 20 ++++++++++++++++++-- src/main.rs | 27 +++++++++++++++++++++------ src/vm.rs | 27 +++++++++++---------------- 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/examples/first.asm b/examples/first.asm index e82b1bb..2c30fd6 100644 --- a/examples/first.asm +++ b/examples/first.asm @@ -1,10 +1,10 @@ ;#include "../src/foot.asm" +label: CNST. r0, 0xFBFF CNST. r29, 0x400 -label: -CNST.r [r0++], 0b1100110011001100 +ADDI.r [r0++], [r0], r0 CNST. r31, label diff --git a/src/foot.asm b/src/foot.asm index 2cc4563..08cd966 100644 --- a/src/foot.asm +++ b/src/foot.asm @@ -2,7 +2,7 @@ #subruledef operand { - #{immediate: s5} => 0b000 @ immediate + #{immediate: u5} => 0b000 @ immediate r{register: u5} => 0b001 @ register [r{register: u5}++] => 0b010 @ register [r{register: u5}--] => 0b011 @ register @@ -30,7 +30,23 @@ #ruledef { - CNST{flags: crflags} {dst: operand}, {imm: i16} => imm @ flags @ 0b0000 @ dst + CNST{flags: crflags} {dst: operand}, {imm: i16} => imm @ flags @ 0b0000 @ dst + CMPR{flags: crflags} {dst: operand}, {a: operand} => 0x00 @ a @ flags @ 0b0001 @ dst + BWNG{flags: crflags} {dst: operand}, {a: operand} => 0x01 @ a @ flags @ 0b0001 @ dst + ARNG{flags: crflags} {dst: operand}, {a: operand} => 0x02 @ a @ flags @ 0b0001 @ dst + LONG{flags: crflags} {dst: operand}, {a: operand} => 0x03 @ a @ flags @ 0b0001 @ dst + BWOR{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b0010 @ dst + BAND{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b0011 @ dst + BXOR{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b0100 @ dst + URSH{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b0101 @ dst + SRSH{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b0110 @ dst + ZLSH{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b0111 @ dst + CLSH{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b1000 @ dst + ADDI{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b1001 @ dst + SUBT{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b1010 @ dst + MULT{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b1011 @ dst + DIVI{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b1100 @ dst + MODU{flags: crflags} {dst: operand}, {a: operand}, {b: operand} => b @ a @ flags @ 0b1101 @ dst } #bankdef mem diff --git a/src/main.rs b/src/main.rs index 643223d..fa83a81 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,3 @@ -#![windows_subsystem = "windows"] - mod vm; use std::sync::Arc; @@ -9,9 +7,9 @@ use pixels::{Pixels, SurfaceTexture}; use winit::application::ApplicationHandler; use winit::dpi::LogicalSize; -use winit::event::WindowEvent; +use winit::event::{StartCause, WindowEvent}; use winit::event_loop::{ActiveEventLoop, ControlFlow, EventLoop}; -use winit::window::{Window, WindowAttributes, WindowId}; +use winit::window::{Window, WindowAttributes, WindowButtons, WindowId}; pub struct App { @@ -32,6 +30,11 @@ impl App } } + fn update(&mut self) + { + self.vm.cycle(); + } + fn draw(&mut self) { let pixels = &mut self.pixels.as_mut().unwrap(); @@ -64,6 +67,19 @@ impl App impl ApplicationHandler for App { + fn new_events(&mut self, _: &ActiveEventLoop, cause: StartCause) + { + match cause + { + StartCause::Poll => + { + self.update(); + self.draw() + }, + _ => {} + } + } + fn resumed(&mut self, event_loop: &ActiveEventLoop) { const WIDTH: u32 = 128; @@ -72,6 +88,7 @@ impl ApplicationHandler for App let window = event_loop.create_window( WindowAttributes::default() .with_resizable(false) + .with_enabled_buttons(WindowButtons::CLOSE | WindowButtons::MINIMIZE) .with_inner_size(LogicalSize::new(WIDTH * 4, HEIGHT * 4)) .with_title("foot vm") ).unwrap(); @@ -85,8 +102,6 @@ impl ApplicationHandler for App fn window_event(&mut self, event_loop: &ActiveEventLoop, _: WindowId, event: WindowEvent) { - self.vm.cycle(); - match event { WindowEvent::RedrawRequested => self.draw(), diff --git a/src/vm.rs b/src/vm.rs index 5d808cd..f61a79a 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -144,7 +144,7 @@ impl TryFrom for Instruction { let a: Operand = (value & 0xFF).try_into()?; let b: Operand = ((value >> 8) & 0xFF).try_into()?; - match value >> 24 + match (value >> 24) & 0xF { 2 => Ok(BWOR(ceflag, rflag, dst, b, a)), 3 => Ok(BAND(ceflag, rflag, dst, b, a)), @@ -179,7 +179,7 @@ const MEMORY_SIZE: usize = 1 << 16; pub struct FootVM { memory: [u16; MEMORY_SIZE], - registers: [u16; 32], + pub registers: [u16; 32], status: Status } @@ -294,7 +294,9 @@ impl FootVM { let first_word = self[self.program_counter()]; let second_word = self[self.program_counter() + 1]; - match ((second_word as u32) << 16 | first_word as u32).try_into() + let full_instruction_bits = (second_word as u32) << 16 | first_word as u32; + *self.mut_program_counter() = self.program_counter().wrapping_add(2); + match full_instruction_bits.try_into() { Ok(CNST(cef, rep, dst, imm)) => run_instruction!(self, cef, rep, cnst, dst, imm), @@ -330,10 +332,8 @@ impl FootVM run_instruction!(self, cef, rep, divi, dst, a, b), Ok(MODU(cef, rep, dst, b, a)) => run_instruction!(self, cef, rep, modu, dst, a, b), - Err(_) => () + Err(_) => {} } - - *self.mut_program_counter() += 2; } fn cnst(&mut self, dst: Operand, imm: u16) @@ -429,35 +429,35 @@ impl FootVM { let a = self.load_operand(src_a); let b = self.load_operand(src_b); - self.store_operand(dst, ((a as i16) + (b as i16)) as u16); + self.store_operand(dst, a.wrapping_add(b)); } fn subt(&mut self, dst: Operand, src_a: Operand, src_b: Operand) { let a = self.load_operand(src_a); let b = self.load_operand(src_b); - self.store_operand(dst, ((a as i16) - (b as i16)) as u16); + self.store_operand(dst, a.wrapping_sub(b)); } fn mult(&mut self, dst: Operand, src_a: Operand, src_b: Operand) { let a = self.load_operand(src_a); let b = self.load_operand(src_b); - self.store_operand(dst, ((a as i16) * (b as i16)) as u16); + self.store_operand(dst, a.wrapping_mul(b)); } fn divi(&mut self, dst: Operand, src_a: Operand, src_b: Operand) { let a = self.load_operand(src_a); let b = self.load_operand(src_b); - self.store_operand(dst, ((a as i16) / (b as i16)) as u16); + self.store_operand(dst, a.wrapping_div(b)); } fn modu(&mut self, dst: Operand, src_a: Operand, src_b: Operand) { let a = self.load_operand(src_a); let b = self.load_operand(src_b); - self.store_operand(dst, ((a as i16) % (b as i16)) as u16); + self.store_operand(dst, a.wrapping_rem(b)); } fn store_operand(&mut self, dst: Operand, value: u16) @@ -520,11 +520,6 @@ impl FootVM &mut self.registers[31] } - fn stack_pointer(&self) -> u16 - { - self.registers[30] - } - fn loop_count(&self) -> u16 { self.registers[29]