Begin work on a revamped HBVM
This commit is contained in:
parent
4223055c0c
commit
f990f05c4c
|
@ -1,45 +1,28 @@
|
|||
Holey Bytes has two bit widths
|
||||
8 bit to help with byte level manipulation and 64 bit numbers because nothing else should ever be used in a modern setting
|
||||
# Math operations
|
||||
```
|
||||
MATH_OP
|
||||
Add
|
||||
Sub
|
||||
Mul
|
||||
Div
|
||||
Mod
|
||||
```
|
||||
```
|
||||
MATH_TYPE
|
||||
Unsigned
|
||||
Signed
|
||||
FloatingPoint
|
||||
```
|
||||
|
||||
this leaves us with an amount of registers that should be defined
|
||||
I'd like to use a letter and a number to represent registers
|
||||
like `a0` or `d0` the first of which would be reserved for 8 bit numbers and the later of which 64 bit.
|
||||
|
||||
|
||||
|
||||
holeybytes will be a load-store machine
|
||||
```
|
||||
MATH_OP_SIDES
|
||||
Register Constant
|
||||
Register Register
|
||||
Constant Constant
|
||||
Constant Register
|
||||
```
|
||||
`[MATH_OP] [MATH_OP_SIDES] [MATH_TYPE] [IMM_LHS] [IMM_RHS] [REG]`
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
instructions
|
||||
### NOP
|
||||
`0`
|
||||
|
||||
### ADD_8 TYPE LHS RHS LOCATION
|
||||
`1`
|
||||
### SUB TYPE LHS RHS LOCATION
|
||||
`2`
|
||||
### MUL TYPE LHS RHS LOCATION
|
||||
`3`
|
||||
### MUL TYPE LHS RHS LOCATION
|
||||
`4`
|
||||
### DIV TYPE LHS RHS LOCATION
|
||||
`5`
|
||||
|
||||
### JUMP ADDR
|
||||
`100`
|
||||
an unconditional jump to an address
|
||||
|
||||
### JUMP_EQ LHS RHS ADDR
|
||||
`101`
|
||||
A conditional jump
|
||||
if LHS is equal to RHS then jump to address
|
||||
### JUMP_NEQ LHS RHS ADDR
|
||||
`102`
|
||||
A conditional jump
|
||||
if LHS is not equal to RHS then jump to address
|
||||
|
||||
### RET
|
||||
pop off the callstack
|
|
@ -1,6 +1,7 @@
|
|||
#[repr(u8)]
|
||||
pub enum Operations {
|
||||
NOP = 0,
|
||||
|
||||
ADD = 1,
|
||||
SUB = 2,
|
||||
MUL = 3,
|
||||
|
@ -37,18 +38,19 @@ pub enum PageMapTypes {
|
|||
RealPage = 1,
|
||||
}
|
||||
|
||||
pub enum SubTypes {
|
||||
EightBit = 1,
|
||||
SixtyFourBit = 2,
|
||||
Register8 = 3,
|
||||
Register64 = 4,
|
||||
}
|
||||
pub enum MathOpSubTypes {
|
||||
Unsigned = 0,
|
||||
Signed = 1,
|
||||
FloatingPoint = 2,
|
||||
}
|
||||
|
||||
pub enum MathOpSides {
|
||||
RegisterConstant = 0,
|
||||
RegisterRegister = 1,
|
||||
ConstantConstant = 2,
|
||||
ConstantRegister = 3,
|
||||
}
|
||||
|
||||
pub enum RWSubTypes {
|
||||
AddrToReg = 0,
|
||||
RegToAddr,
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
#[rustfmt::skip]
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct Registers {
|
||||
pub a0: u8, pub b0: u8, pub c0: u8, pub d0: u64, pub e0: u64, pub f0: u64,
|
||||
pub a1: u8, pub b1: u8, pub c1: u8, pub d1: u64, pub e1: u64, pub f1: u64,
|
||||
pub a2: u8, pub b2: u8, pub c2: u8, pub d2: u64, pub e2: u64, pub f2: u64,
|
||||
pub a3: u8, pub b3: u8, pub c3: u8, pub d3: u64, pub e3: u64, pub f3: u64,
|
||||
pub a4: u8, pub b4: u8, pub c4: u8, pub d4: u64, pub e4: u64, pub f4: u64,
|
||||
pub a5: u8, pub b5: u8, pub c5: u8, pub d5: u64, pub e5: u64, pub f5: u64,
|
||||
pub a6: u8, pub b6: u8, pub c6: u8, pub d6: u64, pub e6: u64, pub f6: u64,
|
||||
pub a7: u8, pub b7: u8, pub c7: u8, pub d7: u64, pub e7: u64, pub f7: u64,
|
||||
pub a8: u8, pub b8: u8, pub c8: u8, pub d8: u64, pub e8: u64, pub f8: u64,
|
||||
pub a9: u8, pub b9: u8, pub c9: u8, pub d9: u64, pub e9: u64, pub f9: u64,
|
||||
pub a0: u64, pub b0: u64, pub c0: u64, pub d0: u64, pub e0: u64, pub f0: u64,
|
||||
pub a1: u64, pub b1: u64, pub c1: u64, pub d1: u64, pub e1: u64, pub f1: u64,
|
||||
pub a2: u64, pub b2: u64, pub c2: u64, pub d2: u64, pub e2: u64, pub f2: u64,
|
||||
pub a3: u64, pub b3: u64, pub c3: u64, pub d3: u64, pub e3: u64, pub f3: u64,
|
||||
pub a4: u64, pub b4: u64, pub c4: u64, pub d4: u64, pub e4: u64, pub f4: u64,
|
||||
pub a5: u64, pub b5: u64, pub c5: u64, pub d5: u64, pub e5: u64, pub f5: u64,
|
||||
pub a6: u64, pub b6: u64, pub c6: u64, pub d6: u64, pub e6: u64, pub f6: u64,
|
||||
pub a7: u64, pub b7: u64, pub c7: u64, pub d7: u64, pub e7: u64, pub f7: u64,
|
||||
pub a8: u64, pub b8: u64, pub c8: u64, pub d8: u64, pub e8: u64, pub f8: u64,
|
||||
pub a9: u64, pub b9: u64, pub c9: u64, pub d9: u64, pub e9: u64, pub f9: u64,
|
||||
}
|
||||
|
||||
impl Registers {
|
||||
|
|
|
@ -7,10 +7,10 @@ use {
|
|||
|
||||
#[test]
|
||||
fn invalid_program() {
|
||||
let prog = vec![1, 23];
|
||||
let prog = vec![1, 0];
|
||||
let mut eng = Engine::new(prog);
|
||||
let ret = eng.run();
|
||||
assert_eq!(ret, Err(InvalidOpcodePair(1, 23)));
|
||||
assert_eq!(ret, Err(InvalidOpcodePair(1, 0)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -52,9 +52,9 @@ fn invalid_system_call() {
|
|||
|
||||
#[test]
|
||||
fn add_u8() {
|
||||
use crate::bytecode::ops::{Operations::ADD, SubTypes::EightBit};
|
||||
use crate::bytecode::ops::{MathOpSides::ConstantConstant, Operations::ADD};
|
||||
|
||||
let prog = vec![ADD as u8, EightBit as u8, 1, 1, 0xA0];
|
||||
let prog = vec![ADD as u8, ConstantConstant as u8, 100, 98, 0xA0];
|
||||
let mut eng = Engine::new(prog);
|
||||
let _ = eng.run();
|
||||
assert_eq!(eng.registers.a0, 2);
|
||||
|
@ -62,18 +62,18 @@ fn add_u8() {
|
|||
|
||||
#[test]
|
||||
fn sub_u8() {
|
||||
use crate::bytecode::ops::{Operations::SUB, SubTypes::EightBit};
|
||||
use crate::bytecode::ops::Operations::SUB;
|
||||
|
||||
let prog = vec![SUB as u8, EightBit as u8, 2, 1, 0xA0];
|
||||
let prog = vec![SUB as u8];
|
||||
let mut eng = Engine::new(prog);
|
||||
let _ = eng.run();
|
||||
assert_eq!(eng.registers.a0, 1);
|
||||
}
|
||||
#[test]
|
||||
fn mul_u8() {
|
||||
use crate::bytecode::ops::{Operations::MUL, SubTypes::EightBit};
|
||||
use crate::bytecode::ops::{MathOpSides::ConstantConstant, Operations::MUL};
|
||||
|
||||
let prog = vec![MUL as u8, EightBit as u8, 1, 1, 0xA0];
|
||||
let prog = vec![MUL as u8, ConstantConstant as u8, 1, 2, 0xA0];
|
||||
let mut eng = Engine::new(prog);
|
||||
let _ = eng.run();
|
||||
assert_eq!(eng.registers.a0, 2);
|
||||
|
@ -81,9 +81,9 @@ fn mul_u8() {
|
|||
|
||||
#[test]
|
||||
fn div_u8() {
|
||||
use crate::bytecode::ops::{Operations::DIV, SubTypes::EightBit};
|
||||
use crate::bytecode::ops::Operations::DIV;
|
||||
|
||||
let prog = vec![DIV as u8, EightBit as u8, 1, 1, 0xA0];
|
||||
let prog = vec![DIV as u8];
|
||||
let mut eng = Engine::new(prog);
|
||||
let _ = eng.run();
|
||||
assert_eq!(eng.registers.a0, 2);
|
||||
|
@ -123,3 +123,11 @@ fn set_memory_8() {
|
|||
let ret = eng.memory.set_addr8(256, 1);
|
||||
assert_eq!(ret, Ok(()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_memory_64() {
|
||||
let prog = vec![];
|
||||
let mut eng = Engine::new(prog);
|
||||
let ret = eng.memory.set_addr64(256, 1);
|
||||
assert_eq!(ret, Ok(()));
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ impl Memory {
|
|||
}
|
||||
Ok(())
|
||||
}
|
||||
pub fn set_addr64(&mut self, address: u64, value: u64) -> u64 {
|
||||
pub fn set_addr64(&mut self, address: u64, value: u64) -> Result<(), RuntimeErrors> {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue