From 155b72ce6d8597e928ed0127813630c2de89d171 Mon Sep 17 00:00:00 2001 From: Werner Date: Mon, 15 Nov 2021 21:22:09 -0300 Subject: [PATCH] Initial instructions --- .cargo/config.toml | 2 + .gitignore | 2 + Cargo.toml | 14 ++++ Source/lib.rs | 201 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 219 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 Source/lib.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..0243837 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +target-dir = "Binaries" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..33080b4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +Binaries/ +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f5f8b7c --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "machine" +version = "0.0.2" +description = "Virtual Machine" +repository = "https://github.com/GuilhermeWerner/Machine" +license = "MIT" +edition = "2021" +publish = false + +[lib] +name = "Machine" +crate-type = ["rlib"] +path = "Source/lib.rs" + diff --git a/Source/lib.rs b/Source/lib.rs new file mode 100644 index 0000000..8672082 --- /dev/null +++ b/Source/lib.rs @@ -0,0 +1,201 @@ +#![allow(non_snake_case)] + +#[repr(u8)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, TryFromPrimitive)] +pub enum Instruction { + /// No operation. + /// + /// ```no_run + /// nop + /// ``` + Nop = 0x00, + + /// Load register from memory. + /// + /// ```no_run + /// ldr r1 0050 // r1 = mem[0050] + /// ``` + Ldr = 0x01, + + /// Store register in memory. + /// + /// ```no_run + /// str 0050 r1 // mem[0050] = r1 + /// ``` + Str = 0x02, + + /// Move register. + /// + /// ```no_run + /// mov r1 r2 // r1 = r2 + /// ``` + Mov = 0x03, + + /// Arithmetic addition `+`. + /// + /// ```no_run + /// add r1 r2 r3 // r1 = r2 + r3 + /// ``` + Add = 0x04, + + /// Add with carry. + /// + /// ```no_run + /// adc r1 r2 r3 r4 // r1 = r2 + r3 + r4 + /// ``` + Adc, + + /// Arithmetic subtraction `-`. + /// + /// ```no_run + /// sub r1 r2 r3 // r1 = r2 - r3 + /// ``` + Sub, + + /// Subtract with carry. + /// + /// ```no_run + /// sbc r1 r2 r3 r4 // r1 = r2 - r3 - 1 - r4 + /// ``` + Sbc, + + /// Arithmetic multiplication `*`. + /// + /// ```no_run + /// mul r1 r2 r3 // r1 = r2 * r3 + /// ``` + Mul, + + /// Arithmetic division `/`. + /// + /// ```no_run + /// div r1 r2 r3 // r1 = r2 / r3 + /// ``` + Div, + + /// Arithmetic remainder `/`. + /// + /// ```no_run + /// rem r1 r2 r3 // r1 = r2 % r3 + /// ``` + Rem, + + /// Arithmetic negation `-`. + /// + /// ```no_run + /// not r1 r2 // r1 = -r2 + /// ``` + Neg, + + /// Bitwise AND `&`. + /// + /// ```no_run + /// and r1 r2 r3 // r1 = r2 & r3 + /// ``` + And, + + /// Bitwise OR `|`. + /// + /// ```no_run + /// or r1 r2 r3 // r1 = r2 | r3 + /// ``` + Or, + + /// Bitwise XOR `^`. + /// + /// ```no_run + /// xor r1 r2 r3 // r1 = r2 ^ r3 + /// ``` + Xor, + + /// Logical negation `!` + /// + /// ```no_run + /// not r1 r2 // r1 = !r2 + /// ``` + Not, + + /// Bitwise NAND. + /// + /// ```no_run + /// nand r1 r2 r3 // r1 = !(r2 & r3) + /// ``` + Nand, + + /// Bitwise NOR. + /// + /// ```no_run + /// nor r1 r2 r3 // r1 = !(r2 | r3) + /// ``` + Nor, + + /// Bitwise XNOR. + /// + /// ```no_run + /// xnor r1 r2 r3 // r1 = !(r2 ^ r3) + /// ``` + Xnor, + + /// Shift left `<<`. + /// + /// ```no_run + /// shl r1 r2 r3 // r1 = r2 << r3 + /// ``` + Shl, + + /// Shift right `>>`. + /// + /// ```no_run + /// shr r1 r2 r3 // r1 = r2 >> r3 + /// ``` + Shr, + + /// Equality comparation. + /// + /// ```no_run + /// eq r1 r2 r3 // r1 = r2 == r3 + /// ``` + Eq, + + /// Inequality comparation. + /// + /// ```no_run + /// neq r1 r2 r3 // r1 = r2 != r3 + /// ``` + Neq, + + /// Less comparation. + /// + /// ```no_run + /// lt r1 r2 r3 // r1 = r2 < r3 + /// ``` + Lt, + + /// Less-equal comparation. + /// + /// ```no_run + /// le r1 r2 r3 // r1 = r2 <= r3 + /// ``` + Le, + + /// Greater comparation. + /// + /// ```no_run + /// gt r1 r2 r3 // r1 = r2 > r3 + /// ``` + Gt, + + /// Greater-equal comparation. + /// + /// ```no_run + /// ge r1 r2 r3 // r1 = r2 >= r3 + /// ``` + Ge, + + /// Halt execution. + /// + /// ```no_run + /// hlt + /// ``` + Hlt = 0xFF, +}