n4th tests work again

This commit is contained in:
2026-09-06 11:50:38 -05:00
parent ca5915bf31
commit c82a0b4e3c
5 changed files with 1027 additions and 72 deletions
+3 -1
View File
@@ -10,4 +10,6 @@ crate-type = ["cdylib"]
[dependencies]
vcore = { path = "../vcore" }
mlua = { version = "0.8.0-beta.4", features = ["lua54", "vendored", "module"] }
novaforth = { path = "../novaforth" }
tinyjson = "2.5.1"
mlua = { version = "0.12.1", features = ["lua55", "module"] }
+39 -3
View File
@@ -1,21 +1,48 @@
use std::collections::HashMap;
use mlua::prelude::*;
use vcore::{ CPU, Word };
use mlua::{UserData, UserDataMethods};
use mlua::{Error, UserData, UserDataMethods};
use vcore::memory::{PeekPoke, PeekPokeExt};
use std::iter::FromIterator;
use tinyjson::JsonValue;
use novaforth::{ROM, PRELUDE, SYMBOLS};
use vcore::opcodes::Opcode;
#[mlua::lua_module]
fn libvlua(lua: &Lua) -> LuaResult<LuaTable<'_>> {
fn libvlua(lua: &Lua) -> LuaResult<LuaTable> {
let exports = lua.create_table()?;
let cpu_constructor = lua.create_function(|_, _: ()| Ok(LuaCPU(CPU::new_random())))?;
exports.set("new", cpu_constructor)?;
let symbols: HashMap<_, _> = {
let symbols: JsonValue = SYMBOLS.parse().unwrap();
symbols.try_into().unwrap()
};
let symbol_addr = lua.create_function(move |_, sym: String| -> Result<i32, Error> {
if let Some(JsonValue::Number(num)) = symbols.get(&sym) {
return Ok(*num as i32);
}
Err(Error::runtime("Symbol not found"))
})?;
exports.set("symbol", symbol_addr)?;
let opcode_for = lua.create_function(|_, mnemonic: String| -> Result<u8, _> {
if let Ok(op) = Opcode::try_from(mnemonic.as_str()) {
return Ok(op.into())
}
Err(Error::runtime("Invalid opcode"))
})?;
exports.set("opcode_for", opcode_for)?;
Ok(exports)
}
struct LuaCPU(CPU);
impl UserData for LuaCPU {
fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) {
fn add_methods<'lua, M: UserDataMethods<Self>>(methods: &mut M) {
methods.add_method_mut("reset", |_, lcpu, ()| {
lcpu.0.reset();
Ok(())
@@ -129,5 +156,14 @@ impl UserData for LuaCPU {
lcpu.0.interrupt(irq as usize, arg.map(|n| Word::from(n)));
Ok(())
});
methods.add_method_mut("load_rom", |_, lcpu, ()| {
for (i, b) in ROM.iter().enumerate() {
lcpu.0.poke(Word::from(0x400 + i), *b)
}
lcpu.0.set_pc(0x400.into());
Ok(())
});
}
}