Add other instructions
This commit is contained in:
parent
d58425bf75
commit
e15a2e2aaf
@ -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
|
||||
|
||||
|
18
src/foot.asm
18
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
|
||||
@ -31,6 +31,22 @@
|
||||
#ruledef
|
||||
{
|
||||
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
|
||||
|
27
src/main.rs
27
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(),
|
||||
|
27
src/vm.rs
27
src/vm.rs
@ -144,7 +144,7 @@ impl TryFrom<u32> 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]
|
||||
|
Loading…
x
Reference in New Issue
Block a user