This commit is contained in:
bQUARKz 2026-02-19 10:54:17 +00:00
parent d24533cc62
commit 929dcde0c6
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
9 changed files with 37 additions and 148 deletions

View File

@ -155,10 +155,6 @@ pub enum OpCode {
/// Returns from the current function.
/// Stack: [return_val] -> [return_val]
Ret = 0x51,
/// Starts a new local scope (for blocks/loops).
PushScope = 0x52,
/// Ends the current local scope, discarding its local variables.
PopScope = 0x53,
// --- 6.8 Peripherals and System ---
/// Invokes a system function (Firmware/OS).
@ -219,8 +215,6 @@ impl TryFrom<u16> for OpCode {
0x43 => Ok(OpCode::SetLocal),
0x50 => Ok(OpCode::Call),
0x51 => Ok(OpCode::Ret),
0x52 => Ok(OpCode::PushScope),
0x53 => Ok(OpCode::PopScope),
0x70 => Ok(OpCode::Syscall),
0x80 => Ok(OpCode::FrameSync),
_ => Err(format!("Invalid OpCode: 0x{:04X}", value)),
@ -277,8 +271,6 @@ impl OpCode {
OpCode::SetLocal => 2,
OpCode::Call => 5,
OpCode::Ret => 4,
OpCode::PushScope => 3,
OpCode::PopScope => 3,
OpCode::Syscall => 1,
OpCode::FrameSync => 1,
}

View File

@ -462,26 +462,6 @@ impl OpCodeSpecExt for OpCode {
may_trap: false,
is_safepoint: false,
},
OpCode::PushScope => OpcodeSpec {
name: "PUSH_SCOPE",
imm_bytes: 0,
pops: 0,
pushes: 0,
is_branch: false,
is_terminator: false,
may_trap: false,
is_safepoint: false,
},
OpCode::PopScope => OpcodeSpec {
name: "POP_SCOPE",
imm_bytes: 0,
pops: 0,
pushes: 0,
is_branch: false,
is_terminator: false,
may_trap: false,
is_safepoint: false,
},
OpCode::Syscall => OpcodeSpec {
name: "SYSCALL",
imm_bytes: 4,

View File

@ -242,16 +242,17 @@ impl AssetManager {
if slot_index < slots.len() {
slots[slot_index] = Some(entry.asset_id);
}
println!(
"[AssetManager] Preloaded tile asset '{}' (id: {}) into slot {}",
entry.asset_name, entry.asset_id, slot_index
);
} else {
eprintln!(
"[AssetManager] Failed to preload tile asset '{}'",
entry.asset_name
);
// println!(
// "[AssetManager] Preloaded tile asset '{}' (id: {}) into slot {}",
// entry.asset_name, entry.asset_id, slot_index
// );
}
// else {
// eprintln!(
// "[AssetManager] Failed to preload tile asset '{}'",
// entry.asset_name
// );
// }
}
BankType::SOUNDS => {
if let Ok(bank) =
@ -268,24 +269,26 @@ impl AssetManager {
if slot_index < slots.len() {
slots[slot_index] = Some(entry.asset_id);
}
println!(
"[AssetManager] Preloaded sound asset '{}' (id: {}) into slot {}",
entry.asset_name, entry.asset_id, slot_index
);
} else {
eprintln!(
"[AssetManager] Failed to preload sound asset '{}'",
entry.asset_name
);
// println!(
// "[AssetManager] Preloaded sound asset '{}' (id: {}) into slot {}",
// entry.asset_name, entry.asset_id, slot_index
// );
}
// else {
// eprintln!(
// "[AssetManager] Failed to preload sound asset '{}'",
// entry.asset_name
// );
// }
}
}
} else {
eprintln!(
"[AssetManager] Preload failed: asset '{}' not found in table",
item.asset_name
);
}
// else {
// eprintln!(
// "[AssetManager] Preload failed: asset '{}' not found in table",
// item.asset_name
// );
// }
}
}

View File

@ -188,17 +188,18 @@ impl Audio {
.and_then(|bank| bank.samples.get(sample_id as usize).map(Arc::clone));
if let Some(s) = sample {
println!(
"[Audio] Resolved sample from bank {} sample {}. Playing on voice {}.",
bank_id, sample_id, voice_id
);
// println!(
// "[Audio] Resolved sample from bank {} sample {}. Playing on voice {}.",
// bank_id, sample_id, voice_id
// );
self.play_sample(s, voice_id, volume, pan, pitch, priority, loop_mode);
} else {
eprintln!(
"[Audio] Failed to resolve sample from bank {} sample {}.",
bank_id, sample_id
);
}
// else {
// eprintln!(
// "[Audio] Failed to resolve sample from bank {} sample {}.",
// bank_id, sample_id
// );
// }
}
pub fn play_sample(

View File

@ -1,74 +0,0 @@
// use std::fs;
// use std::path::Path;
// use prometeu_core::{Value, VmFault};
// use prometeu_drivers::hardware::Hardware;
// use prometeu_hal::{HostContext, HostReturn, NativeInterface};
// use prometeu_vm::{LogicalFrameEndingReason, VirtualMachine};
//
// struct MockNative;
// impl NativeInterface for MockNative {
// fn syscall(&mut self, id: u32, _args: &[Value], ret: &mut HostReturn, _ctx: &mut HostContext) -> Result<(), VmFault> {
// if id == 0x2010 { // InputPadSnapshot
// for _ in 0..48 {
// ret.push_bool(false);
// }
// } else if id == 0x2011 { // InputTouchSnapshot
// for _ in 0..6 {
// ret.push_int(0);
// }
// } else {
// // Push one result for others that might expect it
// // Based on results_count() in syscalls.rs, most return 1 except GfxClear565 (0)
// if id != 0x1010 {
// ret.push_null();
// }
// }
// Ok(())
// }
// }
//
// #[test]
// fn test_canonical_cartridge_heartbeat() {
// let mut pbc_path = Path::new("../../test-cartridges/canonical/golden/program.pbc").to_path_buf();
// if !pbc_path.exists() {
// pbc_path = Path::new("test-cartridges/canonical/golden/program.pbc").to_path_buf();
// }
//
// let pbc_bytes = fs::read(pbc_path).expect("Failed to read canonical PBC. Did you run the generation test?");
//
// // Determine entrypoint from the compiled module exports
// let entry_symbol = "src/main/modules:frame";
//
// let mut vm = VirtualMachine::new(vec![], vec![]);
// vm.initialize(pbc_bytes, entry_symbol).expect("Failed to initialize VM with canonical cartridge");
// vm.prepare_call(entry_symbol);
//
// let mut native = MockNative;
// let mut hw = Hardware::new();
// let mut ctx = HostContext::new(Some(&mut hw));
//
// // Run for a reasonable budget
// let report = vm.run_budget(1000, &mut native, &mut ctx).expect("VM failed to run");
//
// // Acceptance criteria:
// // 1. No traps
// match report.reason {
// LogicalFrameEndingReason::Trap(trap) => panic!("VM trapped: {:?}", trap),
// LogicalFrameEndingReason::Panic(msg) => panic!("VM panicked: {}", msg),
// LogicalFrameEndingReason::Halted => {},
// LogicalFrameEndingReason::EndOfRom => {},
// LogicalFrameEndingReason::FrameSync => {},
// LogicalFrameEndingReason::BudgetExhausted => {},
// LogicalFrameEndingReason::Breakpoint => {},
// }
//
// // 2. Deterministic output state (if any)
// // Observação: a PVM agora sinaliza FRAME_SYNC imediatamente antes do RET do entry point.
// // Quando o motivo é FRAME_SYNC, não exigimos pilha vazia (a limpeza final ocorre após o RET).
// // Para os demais motivos (RET/Halted/EndOfRom), a pilha deve estar vazia para frame(): void.
// if !matches!(report.reason, LogicalFrameEndingReason::FrameSync) {
// assert_eq!(vm.operand_stack.len(), 0, "Stack should be empty after frame() execution");
// }
//
// println!("Heartbeat test passed!");
// }

View File

@ -26,7 +26,7 @@ impl<'a> HostReturn<'a> {
self.stack.push(Value::Null);
}
pub fn push_gate(&mut self, g: usize) {
// Temporary: cast incoming gate to HeapRef index. Real allocator will provide proper handles.
// Temporary: cast incoming handle/HeapRef index. Real allocator will provide proper handles.
self.stack.push(Value::HeapRef(HeapRef(g as u32)));
}
pub fn push_string(&mut self, s: String) {

View File

@ -210,9 +210,6 @@ mod tests {
let mut heap = Heap::new();
// Create two arrays that reference each other: A -> B, B -> A
let a_placeholder = HeapRef(0); // temporary
let b_placeholder = HeapRef(0);
// Allocate empty arrays first to get handles
let a = heap.allocate_array(vec![]);
let b = heap.allocate_array(vec![]);

View File

@ -1,3 +0,0 @@
pub struct ScopeFrame {
pub scope_stack_base: usize,
}

View File

@ -915,9 +915,6 @@ impl VirtualMachine {
}
self.pc = frame.return_pc as usize;
}
// Scope opcodes are no-ops under the new architecture (PR-2.1)
OpCode::PushScope => {}
OpCode::PopScope => {}
OpCode::Syscall => {
let pc_at_syscall = start_pc as u32;
let id = instr
@ -1335,15 +1332,12 @@ mod tests {
let func_addr = rom.len();
// func:
// PUSH_SCOPE
// PUSH_I64 20
// GET_LOCAL 0 -- should be 10 (arg)
// ADD -- 10 + 20 = 30
// SET_LOCAL 0 -- store result in local 0 (the arg slot)
// POP_SCOPE
// GET_LOCAL 0 -- read 30 back
// RET
rom.extend_from_slice(&(OpCode::PushScope as u16).to_le_bytes());
rom.extend_from_slice(&(OpCode::PushI64 as u16).to_le_bytes());
rom.extend_from_slice(&20i64.to_le_bytes());
rom.extend_from_slice(&(OpCode::GetLocal as u16).to_le_bytes());
@ -1351,7 +1345,6 @@ mod tests {
rom.extend_from_slice(&(OpCode::Add as u16).to_le_bytes());
rom.extend_from_slice(&(OpCode::SetLocal as u16).to_le_bytes());
rom.extend_from_slice(&0u32.to_le_bytes());
rom.extend_from_slice(&(OpCode::PopScope as u16).to_le_bytes());
rom.extend_from_slice(&(OpCode::GetLocal as u16).to_le_bytes());
rom.extend_from_slice(&0u32.to_le_bytes());
rom.extend_from_slice(&(OpCode::Ret as u16).to_le_bytes());