diff --git a/Cargo.lock b/Cargo.lock
index f5158d0..96497fe 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -43,6 +43,12 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "allocator-api2"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56fc6cf8dc8c4158eed8649f9b8b0ea1518eb62b544fe9490d66fa0b349eafe9"
+
 [[package]]
 name = "android_system_properties"
 version = "0.1.5"
@@ -81,6 +87,12 @@ version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973"
 
+[[package]]
+name = "beef"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1"
+
 [[package]]
 name = "bit"
 version = "0.1.1"
@@ -158,6 +170,12 @@ dependencies = [
  "unicode-width",
 ]
 
+[[package]]
+name = "convert_case"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+
 [[package]]
 name = "core-foundation-sys"
 version = "0.8.4"
@@ -227,14 +245,27 @@ dependencies = [
  "syn 2.0.13",
 ]
 
+[[package]]
+name = "delegate"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d358e0ec5c59a5e1603b933def447096886121660fc680dc1e64a0753981fe3c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
 [[package]]
 name = "derive_more"
 version = "0.99.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
 dependencies = [
+ "convert_case",
  "proc-macro2",
  "quote",
+ "rustc_version",
  "syn 1.0.109",
 ]
 
@@ -336,6 +367,12 @@ dependencies = [
  "num-traits",
 ]
 
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
 [[package]]
 name = "getrandom"
 version = "0.2.8"
@@ -365,13 +402,45 @@ dependencies = [
  "ahash 0.8.3",
 ]
 
+[[package]]
+name = "hashbrown"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
+dependencies = [
+ "ahash 0.8.3",
+ "allocator-api2",
+]
+
+[[package]]
+name = "hbasm"
+version = "0.1.0"
+source = "git+https://git.ablecorp.us/ableos/holey-bytes#b7c34775e4514c05bf0927bd2bd2f6de90715f0d"
+dependencies = [
+ "hashbrown 0.14.0",
+ "hbbytecode",
+ "lasso",
+ "logos",
+ "paste",
+]
+
+[[package]]
+name = "hbbytecode"
+version = "0.1.0"
+source = "git+https://git.ablecorp.us/ableos/holey-bytes#b7c34775e4514c05bf0927bd2bd2f6de90715f0d"
+
 [[package]]
 name = "hbvm"
 version = "0.1.0"
-source = "git+https://git.ablecorp.us/ableos/holey-bytes#76302b4ca8aeda6597ee51cb1cf5f59a5d385c4f"
+source = "git+https://git.ablecorp.us/ableos/holey-bytes#b7c34775e4514c05bf0927bd2bd2f6de90715f0d"
 dependencies = [
+ "delegate",
+ "derive_more",
  "hashbrown 0.13.2",
+ "hbbytecode",
  "log",
+ "paste",
+ "static_assertions",
 ]
 
 [[package]]
@@ -468,6 +537,7 @@ dependencies = [
  "embedded-graphics",
  "error-stack 0.3.1",
  "hashbrown 0.12.3",
+ "hbasm",
  "hbvm",
  "limine",
  "log",
@@ -483,6 +553,16 @@ dependencies = [
  "xml",
 ]
 
+[[package]]
+name = "lasso"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4644821e1c3d7a560fe13d842d13f587c07348a1a05d3a797152d41c90c56df2"
+dependencies = [
+ "ahash 0.8.3",
+ "hashbrown 0.13.2",
+]
+
 [[package]]
 name = "libc"
 version = "0.2.141"
@@ -528,6 +608,38 @@ dependencies = [
  "cfg-if",
 ]
 
+[[package]]
+name = "logos"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c000ca4d908ff18ac99b93a062cb8958d331c3220719c52e77cb19cc6ac5d2c1"
+dependencies = [
+ "logos-derive",
+]
+
+[[package]]
+name = "logos-codegen"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc487311295e0002e452025d6b580b77bb17286de87b57138f3b5db711cded68"
+dependencies = [
+ "beef",
+ "fnv",
+ "proc-macro2",
+ "quote",
+ "regex-syntax",
+ "syn 2.0.13",
+]
+
+[[package]]
+name = "logos-derive"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbfc0d229f1f42d790440136d941afd806bc9e949e2bcb8faa813b0f00d1267e"
+dependencies = [
+ "logos-codegen",
+]
+
 [[package]]
 name = "memchr"
 version = "2.5.0"
@@ -740,6 +852,12 @@ dependencies = [
  "lock_api",
 ]
 
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
 [[package]]
 name = "supports-color"
 version = "1.3.1"
diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml
index 0e831a9..2f9df3b 100644
--- a/kernel/Cargo.toml
+++ b/kernel/Cargo.toml
@@ -7,6 +7,8 @@ version = "0.2.0"
 [dependencies]
 
 hbvm = { git = "https://git.ablecorp.us/ableos/holey-bytes" }
+hbasm = { git = "https://git.ablecorp.us/ableos/holey-bytes" }
+
 embedded-graphics = "0.7.1"
 
 
diff --git a/kernel/src/host.rs b/kernel/src/host.rs
new file mode 100644
index 0000000..965116f
--- /dev/null
+++ b/kernel/src/host.rs
@@ -0,0 +1,101 @@
+//! the system interface
+
+// use {
+//     crate::ipc::message::Message,
+//     alloc::vec::Vec,
+//     crossbeam_queue::{ArrayQueue, SegQueue},
+//     // hbvm::engine::Engine,
+//     log::trace,
+//     HostError::MemoryError,
+// };
+/// Host errors
+pub enum HostError {
+    /// A host memory error
+    MemoryError,
+}
+
+// / Check f0 register  for the handle
+// / check f1 for the message ptr
+// / check f2 for the message length
+// pub fn ipc_send(engine: &mut Engine) -> Result<(), HostError> {
+//     let _handle = engine.registers.f0;
+//     let message_start = engine.registers.f1;
+//     let message_length = engine.registers.f2;
+
+//     let mut ipc_msg: Vec<u8> = alloc::vec![];
+
+//     for x in message_start..message_start + message_length {
+//         let byte = engine.read_mem_addr_8(x);
+//         match byte {
+//             Ok(byte) => ipc_msg.push(byte),
+//             Err(_) => return Err(MemoryError),
+//         }
+//     }
+//     log::trace!("Message bytes {:?}", ipc_msg);
+//     Ok(())
+// }
+
+// // pub fn ipc_recv(_engine: &mut Engine) {}
+
+// /// Check f0 for the buffer type
+// /// 0 means an unbound buffer
+// /// 1 means a bound buffer
+// /// Check f1 if the buffer is bound
+// ///
+// /// f2 Return a handle to the sender
+// /// f3 returns a handle the the reciever
+// pub fn ipc_mkbuf(engine: &mut Engine) {
+//     match engine.registers.f0 as usize {
+//         0 => {
+//             trace!("Making a new ipc unbound buffer");
+//             let _buf: SegQueue<Message> = SegQueue::new();
+//         }
+//         1 => {
+//             let buf_len = engine.registers.f1 as usize;
+//             trace!("Making a new ipc buffer with capacity {}", buf_len);
+//             let _buf: ArrayQueue<Message> = ArrayQueue::new(buf_len);
+//         }
+//         _ => {}
+//     }
+// }
+
+// // pub fn rpc_discover(_engine: &mut Engine) {}
+// // pub fn rpc_register(_engine: &mut Engine) {}
+// // pub fn rpc_call(_engine: &mut Engine) {}
+
+use hbvm::vm::{
+    mem::{Memory, MemoryAccessReason, PageSize},
+    trap::HandleTrap,
+    value::Value,
+};
+
+/// AbleOS HBVM traphandler
+pub struct TrapHandler;
+impl HandleTrap for TrapHandler {
+    fn page_fault(
+        &mut self,
+        _: MemoryAccessReason,
+        _: &mut Memory,
+        _: u64,
+        _: PageSize,
+        _: *mut u8,
+    ) -> bool {
+        false
+    }
+
+    fn invalid_op(&mut self, _: &mut [Value; 256], _: &mut usize, _: &mut Memory, _: u8) -> bool
+    where
+        Self: Sized,
+    {
+        log::trace!("Invalid opcode");
+
+        false
+    }
+
+    fn ecall(&mut self, _: &mut [Value; 256], _: &mut usize, _: &mut Memory)
+    where
+        Self: Sized,
+    {
+        log::trace!("ableOS system call made");
+    }
+}
diff --git a/kernel/src/host_functions.rs b/kernel/src/host_functions.rs
deleted file mode 100644
index 1f39fef..0000000
--- a/kernel/src/host_functions.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-//! the system interface
-
-use {
-    crate::ipc::message::Message,
-    alloc::vec::Vec,
-    crossbeam_queue::{ArrayQueue, SegQueue},
-    hbvm::engine::Engine,
-    log::trace,
-    HostError::MemoryError,
-};
-/// Host errors
-pub enum HostError {
-    /// A host memory error
-    MemoryError,
-}
-
-/// Check f0 register  for the handle
-/// check f1 for the message ptr
-/// check f2 for the message length
-pub fn ipc_send(engine: &mut Engine) -> Result<(), HostError> {
-    let _handle = engine.registers.f0;
-    let message_start = engine.registers.f1;
-    let message_length = engine.registers.f2;
-
-    let mut ipc_msg: Vec<u8> = alloc::vec![];
-
-    for x in message_start..message_start + message_length {
-        let byte = engine.read_mem_addr_8(x);
-        match byte {
-            Ok(byte) => ipc_msg.push(byte),
-            Err(_) => return Err(MemoryError),
-        }
-    }
-    log::trace!("Message bytes {:?}", ipc_msg);
-    Ok(())
-}
-
-// pub fn ipc_recv(_engine: &mut Engine) {}
-
-/// Check f0 for the buffer type
-/// 0 means an unbound buffer
-/// 1 means a bound buffer
-/// Check f1 if the buffer is bound
-///
-/// f2 Return a handle to the sender
-/// f3 returns a handle the the reciever
-pub fn ipc_mkbuf(engine: &mut Engine) {
-    match engine.registers.f0 as usize {
-        0 => {
-            trace!("Making a new ipc unbound buffer");
-            let _buf: SegQueue<Message> = SegQueue::new();
-        }
-        1 => {
-            let buf_len = engine.registers.f1 as usize;
-            trace!("Making a new ipc buffer with capacity {}", buf_len);
-            let _buf: ArrayQueue<Message> = ArrayQueue::new(buf_len);
-        }
-        _ => {}
-    }
-}
-
-// pub fn rpc_discover(_engine: &mut Engine) {}
-// pub fn rpc_register(_engine: &mut Engine) {}
-// pub fn rpc_call(_engine: &mut Engine) {}
diff --git a/kernel/src/kmain.rs b/kernel/src/kmain.rs
index 8bd3972..98cd84f 100644
--- a/kernel/src/kmain.rs
+++ b/kernel/src/kmain.rs
@@ -3,7 +3,6 @@
 use {
     crate::{alloc::string::ToString, arch::logging::SERIAL_CONSOLE, device_tree::DeviceTree},
     clparse::Arguments,
-    hbvm::engine::Engine,
     log::{debug, trace},
     spin::{Lazy, Mutex},
     xml::XMLElement,
@@ -42,12 +41,40 @@ pub fn kmain(cmdline: &str, bootstrap: Option<&'static [u8]>) -> ! {
     // TODO: schedule the disk driver from the initramfs
     // TODO: schedule the filesystem driver from the initramfs
     // TODO: schedule the init system from the initramfs
+    let code = "li r1, 8
+li r2, 10
+add r1, r1, r2
 
-    let bytes = alloc::vec![0];
-    let mut prog = Engine::new(bytes);
-    // prog.enviroment_call_table[0] = read_device_tree;
-    let _ = prog.run();
-    prog.dump();
+
+ecall"
+        .to_string();
+
+    let mut prog = alloc::vec![];
+    // TODO: Port hbasm to be fully nostd
+    if let Err(e) = hbasm::assembly(&code, &mut prog) {
+        log::error!(
+            "Error {:?} at {:?} (`{}`)",
+            e.kind,
+            e.span.clone(),
+            &code[e.span],
+        );
+    }
+
+    use hbvm::validate::validate;
+
+    #[allow(clippy::redundant_else)]
+    if let Err(e) = validate(&prog) {
+        log::error!("Program validation error: {e:?}");
+    } else {
+        log::info!("valid program");
+        unsafe {
+            use {crate::host::TrapHandler, hbvm::vm::Vm};
+            let mut vm = Vm::new_unchecked(&prog, TrapHandler);
+            vm.memory.insert_test_page();
+            log::info!("Program interrupt: {:?}", vm.run());
+            log::info!("{:?}", vm.registers);
+        }
+    }
 
     // TODO: change this to a driver
     {
diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs
index ada0dd7..1c712d2 100644
--- a/kernel/src/lib.rs
+++ b/kernel/src/lib.rs
@@ -23,7 +23,7 @@ mod allocator;
 mod arch;
 pub mod device_tree;
 pub mod handle;
-pub mod host_functions;
+pub mod host;
 pub mod ipc;
 mod kmain;
 mod logger;