clean up
This commit is contained in:
parent
d24533cc62
commit
929dcde0c6
@ -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,
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
// );
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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!");
|
||||
// }
|
||||
@ -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) {
|
||||
|
||||
@ -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![]);
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
pub struct ScopeFrame {
|
||||
pub scope_stack_base: usize,
|
||||
}
|
||||
@ -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());
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user