From a19985728057457882da27b45cebe1e8035d0626 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Fri, 20 Feb 2026 17:52:12 +0000 Subject: [PATCH] pr9.4 --- crates/console/prometeu-bytecode/src/value.rs | 1 + crates/console/prometeu-drivers/src/asset.rs | 11 ++- .../console/prometeu-hal/src/audio_bridge.rs | 2 + crates/console/prometeu-hal/src/button.rs | 2 +- crates/console/prometeu-hal/src/telemetry.rs | 90 +++++++++--------- crates/console/prometeu-vm/src/heap.rs | 71 +++++++------- crates/console/prometeu-vm/src/object.rs | 5 + crates/console/prometeu-vm/src/scheduler.rs | 3 + crates/console/prometeu-vm/src/verifier.rs | 22 ++--- .../prometeu-vm/src/virtual_machine.rs | 18 ++-- crates/dev/prometeu-test-support/src/lib.rs | 2 +- files/TODOs.md | 56 ----------- test-cartridges/README.md | 26 ----- test-cartridges/canonical/golden/ast.json | 8 -- .../canonical/golden/program.disasm.txt | 20 ---- test-cartridges/canonical/golden/program.pbc | Bin 629 -> 0 bytes test-cartridges/canonical/prometeu.json | 6 -- .../canonical/src/main/modules/main.pbs | 18 ---- test-cartridges/sdk/prometeu.json | 6 -- .../sdk/src/main/modules/gfx/color.pbs | 8 -- .../sdk/src/main/modules/gfx/gfx.pbs | 3 - .../sdk/src/main/modules/input/button.pbs | 6 -- .../sdk/src/main/modules/input/input.pbs | 20 ---- .../sdk/src/main/modules/log/log.pbs | 48 ---------- test-cartridges/test01/cartridge/assets.pa | Bin 90504 -> 0 bytes .../test01/cartridge/manifest.json | 41 -------- test-cartridges/test01/cartridge/program.pbc | Bin 3482 -> 0 bytes test-cartridges/test01/prometeu.json | 11 --- test-cartridges/test01/run.sh | 7 -- test-cartridges/test01/sdk | 1 - test-cartridges/test01/settings.json | 3 - .../test01/src/main/modules/main.pbs | 66 ------------- 32 files changed, 118 insertions(+), 463 deletions(-) delete mode 100644 test-cartridges/README.md delete mode 100644 test-cartridges/canonical/golden/ast.json delete mode 100644 test-cartridges/canonical/golden/program.disasm.txt delete mode 100644 test-cartridges/canonical/golden/program.pbc delete mode 100644 test-cartridges/canonical/prometeu.json delete mode 100644 test-cartridges/canonical/src/main/modules/main.pbs delete mode 100644 test-cartridges/sdk/prometeu.json delete mode 100644 test-cartridges/sdk/src/main/modules/gfx/color.pbs delete mode 100644 test-cartridges/sdk/src/main/modules/gfx/gfx.pbs delete mode 100644 test-cartridges/sdk/src/main/modules/input/button.pbs delete mode 100644 test-cartridges/sdk/src/main/modules/input/input.pbs delete mode 100644 test-cartridges/sdk/src/main/modules/log/log.pbs delete mode 100644 test-cartridges/test01/cartridge/assets.pa delete mode 100644 test-cartridges/test01/cartridge/manifest.json delete mode 100644 test-cartridges/test01/cartridge/program.pbc delete mode 100644 test-cartridges/test01/prometeu.json delete mode 100755 test-cartridges/test01/run.sh delete mode 120000 test-cartridges/test01/sdk delete mode 100644 test-cartridges/test01/settings.json delete mode 100644 test-cartridges/test01/src/main/modules/main.pbs diff --git a/crates/console/prometeu-bytecode/src/value.rs b/crates/console/prometeu-bytecode/src/value.rs index 62948817..ab9556ee 100644 --- a/crates/console/prometeu-bytecode/src/value.rs +++ b/crates/console/prometeu-bytecode/src/value.rs @@ -98,6 +98,7 @@ impl Value { } } + #[allow(clippy::inherent_to_string)] pub fn to_string(&self) -> String { match self { Value::Int32(i) => i.to_string(), diff --git a/crates/console/prometeu-drivers/src/asset.rs b/crates/console/prometeu-drivers/src/asset.rs index fc1710bd..7a0ce068 100644 --- a/crates/console/prometeu-drivers/src/asset.rs +++ b/crates/console/prometeu-drivers/src/asset.rs @@ -1,3 +1,4 @@ +#![allow(clippy::collapsible_if)] use crate::memory_banks::{SoundBankPoolInstaller, TileBankPoolInstaller}; use prometeu_hal::AssetBridge; use prometeu_hal::asset::{ @@ -486,12 +487,12 @@ impl AssetManager { let palette_data = &buffer[pixel_data_size..pixel_data_size + 2048]; let mut palettes = [[Color::BLACK; 16]; 64]; - for p in 0..64 { - for c in 0..16 { + for (p, pal) in palettes.iter_mut().enumerate() { + for (c, slot) in pal.iter_mut().enumerate() { let offset = (p * 16 + c) * 2; let color_raw = u16::from_le_bytes([palette_data[offset], palette_data[offset + 1]]); - palettes[p][c] = Color(color_raw); + *slot = Color(color_raw); } } @@ -687,7 +688,7 @@ impl AssetManager { match slot.asset_type { BankType::TILES => { let slots = self.gfx_slots.read().unwrap(); - let asset_id = slots.get(slot.index).and_then(|s| s.clone()); + let asset_id = slots.get(slot.index).and_then(|s| *s); let (bytes, asset_name) = if let Some(id) = &asset_id { let bytes = self @@ -708,7 +709,7 @@ impl AssetManager { } BankType::SOUNDS => { let slots = self.sound_slots.read().unwrap(); - let asset_id = slots.get(slot.index).and_then(|s| s.clone()); + let asset_id = slots.get(slot.index).and_then(|s| *s); let (bytes, asset_name) = if let Some(id) = &asset_id { let bytes = self diff --git a/crates/console/prometeu-hal/src/audio_bridge.rs b/crates/console/prometeu-hal/src/audio_bridge.rs index 116fd12c..e831640e 100644 --- a/crates/console/prometeu-hal/src/audio_bridge.rs +++ b/crates/console/prometeu-hal/src/audio_bridge.rs @@ -8,6 +8,7 @@ pub enum LoopMode { } pub trait AudioBridge { + #[allow(clippy::too_many_arguments)] fn play( &mut self, bank_id: u8, @@ -19,6 +20,7 @@ pub trait AudioBridge { priority: u8, loop_mode: LoopMode, ); + #[allow(clippy::too_many_arguments)] fn play_sample( &mut self, sample: Arc, diff --git a/crates/console/prometeu-hal/src/button.rs b/crates/console/prometeu-hal/src/button.rs index a5f2f66b..b4002e3e 100644 --- a/crates/console/prometeu-hal/src/button.rs +++ b/crates/console/prometeu-hal/src/button.rs @@ -27,7 +27,7 @@ pub struct Button { impl Button { pub fn begin_frame(&mut self, is_down_now: bool) { let was_down = self.down; - self.down = is_down_now.clone(); + self.down = is_down_now; self.pressed = !was_down && self.down; self.released = was_down && !self.down; diff --git a/crates/console/prometeu-hal/src/telemetry.rs b/crates/console/prometeu-hal/src/telemetry.rs index ce8f99e2..884765fd 100644 --- a/crates/console/prometeu-hal/src/telemetry.rs +++ b/crates/console/prometeu-hal/src/telemetry.rs @@ -50,55 +50,55 @@ impl Certifier { let mut violations = 0; - if let Some(budget) = self.config.cycles_budget_per_frame { - if telemetry.cycles_used > budget { - log_service.log( - ts_ms, - telemetry.frame_index, - LogLevel::Warn, - LogSource::Pos, - 0xCA01, - format!( - "Cert: cycles_used exceeded budget ({} > {})", - telemetry.cycles_used, budget - ), - ); - violations += 1; - } + if let Some(budget) = self.config.cycles_budget_per_frame + && telemetry.cycles_used > budget + { + log_service.log( + ts_ms, + telemetry.frame_index, + LogLevel::Warn, + LogSource::Pos, + 0xCA01, + format!( + "Cert: cycles_used exceeded budget ({} > {})", + telemetry.cycles_used, budget + ), + ); + violations += 1; } - if let Some(limit) = self.config.max_syscalls_per_frame { - if telemetry.syscalls > limit { - log_service.log( - ts_ms, - telemetry.frame_index, - LogLevel::Warn, - LogSource::Pos, - 0xCA02, - format!( - "Cert: syscalls per frame exceeded limit ({} > {})", - telemetry.syscalls, limit - ), - ); - violations += 1; - } + if let Some(limit) = self.config.max_syscalls_per_frame + && telemetry.syscalls > limit + { + log_service.log( + ts_ms, + telemetry.frame_index, + LogLevel::Warn, + LogSource::Pos, + 0xCA02, + format!( + "Cert: syscalls per frame exceeded limit ({} > {})", + telemetry.syscalls, limit + ), + ); + violations += 1; } - if let Some(limit) = self.config.max_host_cpu_us_per_frame { - if telemetry.host_cpu_time_us > limit { - log_service.log( - ts_ms, - telemetry.frame_index, - LogLevel::Warn, - LogSource::Pos, - 0xCA03, - format!( - "Cert: host_cpu_time_us exceeded limit ({} > {})", - telemetry.host_cpu_time_us, limit - ), - ); - violations += 1; - } + if let Some(limit) = self.config.max_host_cpu_us_per_frame + && telemetry.host_cpu_time_us > limit + { + log_service.log( + ts_ms, + telemetry.frame_index, + LogLevel::Warn, + LogSource::Pos, + 0xCA03, + format!( + "Cert: host_cpu_time_us exceeded limit ({} > {})", + telemetry.host_cpu_time_us, limit + ), + ); + violations += 1; } violations diff --git a/crates/console/prometeu-vm/src/heap.rs b/crates/console/prometeu-vm/src/heap.rs index 5445e095..9622f1ff 100644 --- a/crates/console/prometeu-vm/src/heap.rs +++ b/crates/console/prometeu-vm/src/heap.rs @@ -54,6 +54,7 @@ impl Heap { /// Allocate a new object with the given kind and raw payload bytes. /// Returns an opaque `HeapRef` handle. + #[cfg(test)] pub fn allocate_object(&mut self, kind: ObjectKind, payload: &[u8]) -> HeapRef { let header = ObjectHeader::new(kind, payload.len() as u32); let obj = StoredObject { header, payload: payload.to_vec(), array_elems: None, closure_env: None, coroutine: None }; @@ -65,6 +66,7 @@ impl Heap { /// Allocate a new `Array` object with the given `Value` elements. /// `payload_len` stores the element count; raw `payload` bytes are empty. + #[cfg(test)] pub fn allocate_array(&mut self, elements: Vec) -> HeapRef { let header = ObjectHeader::new(ObjectKind::Array, elements.len() as u32); let obj = StoredObject { header, payload: Vec::new(), array_elems: Some(elements), closure_env: None, coroutine: None }; @@ -128,6 +130,7 @@ impl Heap { } /// Returns a shared reference to the coroutine data for the given handle, if it is a Coroutine. + #[cfg(test)] pub fn coroutine_data(&self, r: HeapRef) -> Option<&CoroutineData> { let idx = r.0 as usize; self.objects.get(idx).and_then(|slot| slot.as_ref()).and_then(|obj| obj.coroutine.as_ref()) @@ -158,8 +161,8 @@ impl Heap { .map(|o| &mut o.header) } - /// Internal: list inner `HeapRef` children of an object without allocating. - /// Note: GC mark no longer uses this helper; kept for potential diagnostics. + // Internal: list inner `HeapRef` children of an object without allocating. + // Note: GC mark no longer uses this helper; kept for potential diagnostics. // fn children_of(&self, r: HeapRef) -> Box + '_> { // let idx = r.0 as usize; // if let Some(Some(o)) = self.objects.get(idx) { @@ -221,6 +224,7 @@ impl Heap { } /// Get the captured environment slice of a closure. Returns None if kind mismatch or invalid ref. + #[cfg(test)] pub fn closure_env_slice(&self, r: HeapRef) -> Option<&[Value]> { let idx = r.0 as usize; let slot = self.objects.get(idx)?.as_ref()?; @@ -261,14 +265,14 @@ impl Heap { ObjectKind::Array => { if let Some(elems) = obj.array_elems.as_ref() { for val in elems.iter() { - if let Value::HeapRef(child) = val { - if self.is_valid(*child) { - let marked = self - .header(*child) - .map(|h: &ObjectHeader| h.is_marked()) - .unwrap_or(false); - if !marked { stack.push(*child); } - } + if let Value::HeapRef(child) = val + && self.is_valid(*child) + { + let marked = self + .header(*child) + .map(|h: &ObjectHeader| h.is_marked()) + .unwrap_or(false); + if !marked { stack.push(*child); } } } } @@ -281,14 +285,14 @@ impl Heap { if let Some(env) = obj.closure_env.as_ref() { debug_assert_eq!(env.len(), env_len, "closure env len must match encoded env_len"); for val in env[..env_len].iter() { - if let Value::HeapRef(child) = val { - if self.is_valid(*child) { - let marked = self - .header(*child) - .map(|h: &ObjectHeader| h.is_marked()) - .unwrap_or(false); - if !marked { stack.push(*child); } - } + if let Value::HeapRef(child) = val + && self.is_valid(*child) + { + let marked = self + .header(*child) + .map(|h: &ObjectHeader| h.is_marked()) + .unwrap_or(false); + if !marked { stack.push(*child); } } } } @@ -296,14 +300,14 @@ impl Heap { ObjectKind::Coroutine => { if let Some(co) = obj.coroutine.as_ref() { for val in co.stack.iter() { - if let Value::HeapRef(child) = val { - if self.is_valid(*child) { - let marked = self - .header(*child) - .map(|h: &ObjectHeader| h.is_marked()) - .unwrap_or(false); - if !marked { stack.push(*child); } - } + if let Value::HeapRef(child) = val + && self.is_valid(*child) + { + let marked = self + .header(*child) + .map(|h: &ObjectHeader| h.is_marked()) + .unwrap_or(false); + if !marked { stack.push(*child); } } } } @@ -333,7 +337,6 @@ impl Heap { /// Current number of allocated (live) objects. pub fn len(&self) -> usize { self.objects.iter().filter(|s| s.is_some()).count() } - pub fn is_empty(&self) -> bool { self.len() == 0 } /// Enumerate handles of coroutines that are currently suspended (i.e., not running): /// Ready or Sleeping. These must be treated as GC roots by the runtime so their @@ -341,14 +344,12 @@ impl Heap { pub fn suspended_coroutine_handles(&self) -> Vec { let mut out = Vec::new(); for (idx, slot) in self.objects.iter().enumerate() { - if let Some(obj) = slot { - if obj.header.kind == ObjectKind::Coroutine { - if let Some(co) = &obj.coroutine { - if matches!(co.state, CoroutineState::Ready | CoroutineState::Sleeping) { - out.push(HeapRef(idx as u32)); - } - } - } + if let Some(obj) = slot + && obj.header.kind == ObjectKind::Coroutine + && let Some(co) = &obj.coroutine + && matches!(co.state, CoroutineState::Ready | CoroutineState::Sleeping) + { + out.push(HeapRef(idx as u32)); } } out diff --git a/crates/console/prometeu-vm/src/object.rs b/crates/console/prometeu-vm/src/object.rs index c1eda211..1ad01be9 100644 --- a/crates/console/prometeu-vm/src/object.rs +++ b/crates/console/prometeu-vm/src/object.rs @@ -51,12 +51,15 @@ #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] pub enum ObjectKind { /// Reserved/unknown kind. Should not appear in valid allocations. + #[allow(dead_code)] // Kept for stable tag layout and persisted images, even if not constructed in this crate yet Unknown = 0, /// UTF-8 string. `payload_len` is the number of bytes. + #[allow(dead_code)] // Public/stable tag retained; construction may live in higher layers String = 1, /// Homogeneous array of VM values/handles. `payload_len` is element count. + #[allow(dead_code)] // Public/stable tag retained; constructed via Heap helpers in tests Array = 2, /// Compiled closure/function value. @@ -69,9 +72,11 @@ pub enum ObjectKind { Closure = 3, /// Byte buffer / blob. `payload_len` is the number of bytes. + #[allow(dead_code)] // Public/stable tag retained for future/host APIs Bytes = 4, /// User-defined/native host object. Payload shape is host-defined. + #[allow(dead_code)] // Reserved for host/native integrations UserData = 5, /// Coroutine object: suspended execution context with its own stack/frames. diff --git a/crates/console/prometeu-vm/src/scheduler.rs b/crates/console/prometeu-vm/src/scheduler.rs index 361b282d..58c2cdf6 100644 --- a/crates/console/prometeu-vm/src/scheduler.rs +++ b/crates/console/prometeu-vm/src/scheduler.rs @@ -42,11 +42,14 @@ impl Scheduler { self.ready_queue.pop_front() } + #[cfg(test)] pub fn is_ready_empty(&self) -> bool { self.ready_queue.is_empty() } + #[cfg(test)] pub fn ready_len(&self) -> usize { self.ready_queue.len() } // ---------- Current tracking (no switching here) ---------- pub fn set_current(&mut self, coro: Option) { self.current = coro; } + #[cfg(test)] pub fn current(&self) -> Option { self.current } pub fn clear_current(&mut self) { self.current = None; } diff --git a/crates/console/prometeu-vm/src/verifier.rs b/crates/console/prometeu-vm/src/verifier.rs index 22ab16c4..ff1a5125 100644 --- a/crates/console/prometeu-vm/src/verifier.rs +++ b/crates/console/prometeu-vm/src/verifier.rs @@ -208,10 +208,8 @@ impl Verifier { } // Coroutine safety: forbid YIELD when operand stack is not empty (minimal rule) - if let OpCode::Yield = instr.opcode { - if in_height != 0 { - return Err(VerifierError::InvalidYieldContext { pc: func_start + pc, height: in_height }); - } + if let OpCode::Yield = instr.opcode && in_height != 0 { + return Err(VerifierError::InvalidYieldContext { pc: func_start + pc, height: in_height }); } // Compute out types vector with closure-aware rules @@ -317,7 +315,7 @@ impl Verifier { } } - let _pushes_final = dynamic_pushes.unwrap_or_else(|| match instr.opcode { + let _pushes_final = dynamic_pushes.unwrap_or(match instr.opcode { OpCode::MakeClosure => 1, OpCode::CallClosure => { // If we reached here, we handled it above and set dynamic_pushes @@ -340,14 +338,12 @@ impl Verifier { }); } - if instr.opcode == OpCode::Ret { - if in_height != func.return_slots { - return Err(VerifierError::BadRetStackHeight { - pc: func_start + pc, - height: in_height, - expected: func.return_slots, - }); - } + if instr.opcode == OpCode::Ret && in_height != func.return_slots { + return Err(VerifierError::BadRetStackHeight { + pc: func_start + pc, + height: in_height, + expected: func.return_slots, + }); } // Propagate to successors diff --git a/crates/console/prometeu-vm/src/virtual_machine.rs b/crates/console/prometeu-vm/src/virtual_machine.rs index e4a9d448..1f3d9516 100644 --- a/crates/console/prometeu-vm/src/virtual_machine.rs +++ b/crates/console/prometeu-vm/src/virtual_machine.rs @@ -228,7 +228,7 @@ impl VirtualMachine { // Resolve the entrypoint: empty (defaults to func 0), numeric func_idx, or symbol name. let pc = if entrypoint.is_empty() { - program.functions.get(0).map(|f| f.code_offset as usize).unwrap_or(0) + program.functions.first().map(|f| f.code_offset as usize).unwrap_or(0) } else if let Ok(func_idx) = entrypoint.parse::() { program .functions @@ -525,7 +525,7 @@ impl VirtualMachine { .imm_u32() .map_err(|e| LogicalFrameEndingReason::Panic(format!("{:?}", e)))? as usize; - let val = self.pop().map_err(|e| LogicalFrameEndingReason::Panic(e))?; + let val = self.pop().map_err(LogicalFrameEndingReason::Panic)?; match val { Value::Boolean(false) => { let func_start = self @@ -551,7 +551,7 @@ impl VirtualMachine { .imm_u32() .map_err(|e| LogicalFrameEndingReason::Panic(format!("{:?}", e)))? as usize; - let val = self.pop().map_err(|e| LogicalFrameEndingReason::Panic(e))?; + let val = self.pop().map_err(LogicalFrameEndingReason::Panic)?; match val { Value::Boolean(true) => { let func_start = self @@ -622,7 +622,7 @@ impl VirtualMachine { // Pop args top-first, then reverse to logical order arg1..argN let mut args: Vec = Vec::with_capacity(arg_count); for _ in 0..arg_count { - args.push(self.pop().map_err(|e| LogicalFrameEndingReason::Panic(e))?); + args.push(self.pop().map_err(LogicalFrameEndingReason::Panic)?); } args.reverse(); @@ -1040,7 +1040,7 @@ impl VirtualMachine { _ => Err(OpError::Panic("Invalid types for MOD".into())), })?, OpCode::BoundToInt => { - let val = self.pop().map_err(|e| LogicalFrameEndingReason::Panic(e))?; + let val = self.pop().map_err(LogicalFrameEndingReason::Panic)?; if let Value::Bounded(b) = val { self.push(Value::Int64(b as i64)); } else { @@ -1050,13 +1050,13 @@ impl VirtualMachine { } } OpCode::IntToBoundChecked => { - let val = self.pop().map_err(|e| LogicalFrameEndingReason::Panic(e))?; + let val = self.pop().map_err(LogicalFrameEndingReason::Panic)?; let int_val = val.as_integer().ok_or_else(|| { LogicalFrameEndingReason::Panic( "Expected integer for INT_TO_BOUND_CHECKED".into(), ) })?; - if int_val < 0 || int_val > 0xFFFF { + if !(0..=0xFFFF).contains(&int_val) { return Err(self.trap( TRAP_OOB, OpCode::IntToBoundChecked as u16, @@ -1101,7 +1101,7 @@ impl VirtualMachine { _ => Err(OpError::Panic("Invalid types for OR".into())), })?, OpCode::Not => { - let val = self.pop().map_err(|e| LogicalFrameEndingReason::Panic(e))?; + let val = self.pop().map_err(LogicalFrameEndingReason::Panic)?; if let Value::Boolean(b) = val { self.push(Value::Boolean(!b)); } else { @@ -1148,7 +1148,7 @@ impl VirtualMachine { _ => Err(OpError::Panic("Invalid types for Shr".into())), })?, OpCode::Neg => { - let val = self.pop().map_err(|e| LogicalFrameEndingReason::Panic(e))?; + let val = self.pop().map_err(LogicalFrameEndingReason::Panic)?; match val { Value::Int32(a) => self.push(Value::Int32(a.wrapping_neg())), Value::Int64(a) => self.push(Value::Int64(a.wrapping_neg())), diff --git a/crates/dev/prometeu-test-support/src/lib.rs b/crates/dev/prometeu-test-support/src/lib.rs index b82b322d..d0ccd5cd 100644 --- a/crates/dev/prometeu-test-support/src/lib.rs +++ b/crates/dev/prometeu-test-support/src/lib.rs @@ -22,7 +22,7 @@ pub fn rng_from_seed(seed: u64) -> StdRng { /// Convenience helper that returns a RNG with a fixed well-known seed. pub fn deterministic_rng() -> StdRng { - rng_from_seed(0xC0FFEE_5EED) + rng_from_seed(0x00C0_FFEE_5EED) } /// Returns the next u64 from the provided RNG. diff --git a/files/TODOs.md b/files/TODOs.md index dcc95527..e69de29b 100644 --- a/files/TODOs.md +++ b/files/TODOs.md @@ -1,56 +0,0 @@ -# PR-9.4 — Final Cleanup & Quality Sweep - -## Briefing - -This PR performs the final cleanup pass. - -Goal: Zero warnings. No dead code. No outdated examples. - -## Target - -1. Remove dead modules/files. -2. Remove unused imports and code. -3. Eliminate compiler warnings. -4. Update outdated examples. -5. Remove stale TODOs referencing removed architecture. - -Optional (if present): - -* Enforce `cargo clippy` clean baseline. -* Ensure `rustfmt` compliance. - -## Acceptance Checklist - -* [ ] No dead code. -* [ ] Zero compiler warnings. -* [ ] Clippy clean (if configured). -* [ ] Examples reflect new baseline. -* [ ] No TODO referencing RC/HIP. - -## Tests - -* Full test suite passes. -* Clean build with warnings denied (if configured). - -## Junie Instructions - -You MAY: - -* Remove unused code. -* Refactor minor clarity issues. - -You MUST NOT: - -* Introduce new features. -* Change runtime semantics. - -If cleanup requires semantic change, STOP and split into new PR. - ---- - -## Final Definition of Done - -* Architecture documented clearly. -* Public API minimal and controlled. -* No temporary flags remain. -* Codebase clean, warning-free, and aligned with the new VM baseline. diff --git a/test-cartridges/README.md b/test-cartridges/README.md deleted file mode 100644 index a6b98316..00000000 --- a/test-cartridges/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# PROMETEU Test Cartridges - -This directory contains example cartridges and test suites to validate the behavior of the PROMETEU runtime and development tools. - -## Available Cartridges - -### 🟩 [color-square-ts](color-square-ts) -A simple cartridge that demonstrates: -- System initialization. -- Rendering a colored square in the framebuffer. -- Basic execution loop. - -## Cartridge Structure - -A PROMETEU cartridge (in its unpacked form) generally consists of: -- `manifest.json`: Application metadata (ID, title, version, mode). -- `program.pbc`: Compiled bytecode for the PROMETEU VM. -- `assets/`: Resources such as tiles, sprites, and audio samples. - -## How to use - -You can run any of these cartridges using the main CLI: - -```bash -prometeu run test-cartridges/ -``` diff --git a/test-cartridges/canonical/golden/ast.json b/test-cartridges/canonical/golden/ast.json deleted file mode 100644 index 3f4e0529..00000000 --- a/test-cartridges/canonical/golden/ast.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "kind": "File", - "imports": [], - "decls": [ - 30, - 40 - ] -} \ No newline at end of file diff --git a/test-cartridges/canonical/golden/program.disasm.txt b/test-cartridges/canonical/golden/program.disasm.txt deleted file mode 100644 index a5f49e45..00000000 --- a/test-cartridges/canonical/golden/program.disasm.txt +++ /dev/null @@ -1,20 +0,0 @@ -0000 PushConst U32(1) -0006 SetLocal U32(0) -000C GetLocal U32(0) -0012 GetLocal U32(0) -0018 SetLocal U32(1) -001E SetLocal U32(0) -0024 GetLocal U32(0) -002A GetLocal U32(1) -0030 Call U32(1) -0036 SetLocal U32(2) -003C FrameSync -003E Ret -0040 GetLocal U32(0) -0046 GetLocal U32(0) -004C GetLocal U32(1) -0052 Add -0054 Mul -0056 GetLocal U32(1) -005C Mul -005E Ret diff --git a/test-cartridges/canonical/golden/program.pbc b/test-cartridges/canonical/golden/program.pbc deleted file mode 100644 index 3646ac8573f5be88286c9c5f6abe6e09b079a715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 629 zcmZvaO-lk%6ozl5(IQMD!Zsn&DxnDz7p;a7T(z(dq(y~;O;9)nO1l<8we1%b7!=fR z3Hl8^@0~+fc;Gqjeb2{bn3;BT=oERMr>7Ij1(<;=*nnAhf-cO#HyksNLt8WhR5N}_ znmII-@jKbMjMJoUFZ$f%OJE{1WMgxl3d-6x*Ltw1N~)wcS{AZ*mDJGCrR n_CJYV(cr?wpx(bie~}-MS%uNC7o_p!AV{yzZ~Dn-*LQyam8>?# diff --git a/test-cartridges/canonical/prometeu.json b/test-cartridges/canonical/prometeu.json deleted file mode 100644 index 1e54e60e..00000000 --- a/test-cartridges/canonical/prometeu.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "canonical", - "version": "0.1.0", - "script_fe": "pbs", - "entry": "src/main/modules/main.pbs" -} diff --git a/test-cartridges/canonical/src/main/modules/main.pbs b/test-cartridges/canonical/src/main/modules/main.pbs deleted file mode 100644 index fb5f29d8..00000000 --- a/test-cartridges/canonical/src/main/modules/main.pbs +++ /dev/null @@ -1,18 +0,0 @@ -declare struct Vec2(x: int, y: int) -[ - (x: int, y: int): (x, y) as default - (s: int): (s, s) as square -] -[[ - ZERO: square(0) -]] -{ - pub fn len(self: this): int { - return x * x + y * y; - } -} - -fn frame(): void { - let zero = Vec2.ZERO; - let zz = zero.len(); -} diff --git a/test-cartridges/sdk/prometeu.json b/test-cartridges/sdk/prometeu.json deleted file mode 100644 index 6fb932c6..00000000 --- a/test-cartridges/sdk/prometeu.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "sdk", - "version": "0.1.0", - "script_fe": "pbs", - "kind": "lib" -} \ No newline at end of file diff --git a/test-cartridges/sdk/src/main/modules/gfx/color.pbs b/test-cartridges/sdk/src/main/modules/gfx/color.pbs deleted file mode 100644 index f17de0c8..00000000 --- a/test-cartridges/sdk/src/main/modules/gfx/color.pbs +++ /dev/null @@ -1,8 +0,0 @@ -pub declare struct Color(raw: bounded) -[[ - BLACK: Color(0b), - WHITE: Color(65535b), - RED: Color(63488b), - GREEN: Color(2016b), - BLUE: Color(31b) -]] \ No newline at end of file diff --git a/test-cartridges/sdk/src/main/modules/gfx/gfx.pbs b/test-cartridges/sdk/src/main/modules/gfx/gfx.pbs deleted file mode 100644 index 5e584b6c..00000000 --- a/test-cartridges/sdk/src/main/modules/gfx/gfx.pbs +++ /dev/null @@ -1,3 +0,0 @@ -pub declare contract Gfx host { - fn clear(color: Color): void; -} \ No newline at end of file diff --git a/test-cartridges/sdk/src/main/modules/input/button.pbs b/test-cartridges/sdk/src/main/modules/input/button.pbs deleted file mode 100644 index 56c8f6e0..00000000 --- a/test-cartridges/sdk/src/main/modules/input/button.pbs +++ /dev/null @@ -1,6 +0,0 @@ -pub declare struct Button( - pressed: bool, - released: bool, - down: bool, - hold_frames: bounded -) \ No newline at end of file diff --git a/test-cartridges/sdk/src/main/modules/input/input.pbs b/test-cartridges/sdk/src/main/modules/input/input.pbs deleted file mode 100644 index 9ed46967..00000000 --- a/test-cartridges/sdk/src/main/modules/input/input.pbs +++ /dev/null @@ -1,20 +0,0 @@ -pub declare contract Pad host { - fn up(): Button; - fn down(): Button; - fn left(): Button; - fn right(): Button; - fn a(): Button; - fn b(): Button; - fn x(): Button; - fn y(): Button; - fn l(): Button; - fn r(): Button; - fn start(): Button; - fn select(): Button; -} - -pub declare contract Touch host { - fn screen_x(): int; - fn screen_y(): int; - fn finger(): Button; -} \ No newline at end of file diff --git a/test-cartridges/sdk/src/main/modules/log/log.pbs b/test-cartridges/sdk/src/main/modules/log/log.pbs deleted file mode 100644 index e53f1a9d..00000000 --- a/test-cartridges/sdk/src/main/modules/log/log.pbs +++ /dev/null @@ -1,48 +0,0 @@ -// Injeção pelo hardware -declare contract LogHost host { - fn write(level: int, msg: string): void; - fn writeTag(level: int, tag: int, msg: string): void; -} - -// exposicao do modulo, com sugar sintatico, nada injetado aqui -pub service Log { - fn trace(msg: string): void { - LogHost.write(0, msg); - } - - fn trace(tag: int, msg: string): void { - LogHost.writeTag(0, tag, msg); - } - - fn debug(msg: string): void { - LogHost.write(1, msg); - } - - fn debug(tag: int, msg: string): void { - LogHost.writeTag(1, tag, msg); - } - - fn info(msg: string): void { - LogHost.write(2, msg); - } - - fn info(tag: int, msg: string): void { - LogHost.writeTag(2, tag, msg); - } - - fn warn(msg: string): void { - LogHost.write(3, msg); - } - - fn warn(tag: int, msg: string): void { - LogHost.writeTag(3, tag, msg); - } - - fn err(msg: string): void { - LogHost.write(4, msg); - } - - fn err(tag: int, msg: string): void { - LogHost.writeTag(4, tag, msg); - } -} \ No newline at end of file diff --git a/test-cartridges/test01/cartridge/assets.pa b/test-cartridges/test01/cartridge/assets.pa deleted file mode 100644 index 1062286afd4a4e1b15d0efd7209f6e6a021c790c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90504 zcmeI*XLJ+Swg+%a?!EWkt0YUZtUlvVY+9T^LN}OjV_JYqF(iZ%LQN=!Yq&J$5^PKf z5D0{3TF$7;vMk$j@4feKW6MwP-Ilyh_v?FW>)Sa?UuHCCmez0Wz5fOVWFrH!G0O(q z*N#VA>7EiFZoui_7h$g>)2V#=6Xpnu%qivW2!eZ=8yc(auoA48O2WE{82{QO* zJRXM`JIXvxZ=~8q*@t%oX9Ps}Ui0jAjc{6Gx7jMyY_CzO!S1Ql@dLx>`=54qwR2mt z8X{_oD{q!%6u&F9(_F|~kjqvi$zDsAi7BGl#1%wAB;<;=A~I1*bc%Qqx%8a;oKmKu z=W7an&|WIdsW7bBQ9s>uyKQ5aurFxHZOr+->x{dhyQ#gU&ZfrUuFD#aG4I{}>L7BM zZR7wYJ35rPmvxT4lk3huE_f=ujjh0Q@oBsd&%_<^xfoa2$KTAm%Xt`kFvg8>nD#PC z9G)GL95~{;)l24P>ddrHv|eqVY`m6~G@UfDeq{H+g&t{#P3z9af!YgIE6eAVd{%T< zWx|QOYD$7fp^fiL~&vnYLFupL7rNzVBxpv@rCuhz}{2(N`J6F&=C) z?pq#Put%7RvGC{k7(R}_#JTuBY`+i}$a#+35H^W*m*E+`ma;oyO{ibcZ+-&rzqvO# zJ2^0HW?9TLNg&VF&6%7xx_oeVZ)Rt6Yh2T-x=*X^D@IF9w6h8xsS{NJN{W1^bU^$- zbepI}OOZ7)Mnd!)Z6{Jh*Th!R9NCYGce(cJtD29CVoMUr4_DRHCN)m9JnA^ulQgh! zWX{B#>3GsS<2mMRYj67jr^jx~y&8NM2BwER4!;w%gJ#ay5t9}BH%>CIjn5FqVYc{n zyjTB=o$kxWA!dIc@=j{f7aF&#N}&M8Om$&Lg{SDfT)@l8x4w zEwSR;IXP9h9`|(dJsD6MJQFq(Sw!7S?_h?;(l|Qq1%9`{3~RxT;tl!}QiFeumt&*C zQo%lcJ=dB;ibc!?^ek##q%!P!@S=bUpLowJu0@XHwl-F-X6{C=2F_Ei<9@@j{j0k# zwl_C_+)!2XUFGVsWyOaIi}RE6+;S}xF|sQXj@Vg5C(fV{{dIVuFOdV$Lzsw@B)!tt za-^J6ZOykStkc$%8dWZ?A?g=5Pqm@0%YBE3_KfX%pE|SGaF6LW%ayjVjx#P#Jm&j| z{M~~WhJ6~zpf*G&Gk;>eWnbe8_%{V=;Y%z9FT!Jup6?PF(VrrkaSZs<0d0+1H7K?9XTyNjhVIaRd(g% z65paPG;Mj8a}Ox4%K9Zo#Y;rV!~?`eM#v7WK^^EhL5R#HY0?kn@yb1_O7+eHjyAG% zenndKXx%qWL2XT)&wDcl(?(BCp4OcupEWsYvDap~L$FJY`+o2Deyf5mhTe%dN0}d8 z#0Y22XEV8tyyb#4;dj_<{5O0OAHg5t5qJvrnb22|$!q6~#;RksGiqpF6iS3ss5WrB zUx!zM`)TJ__GQ+s=3T~}r1t5yiSCi90r%edooTH-jhpLCsuktGl!%Lr3ihboRf7t$ ze37(JoG$tcp+Sp~1u{kPNP>A> zF2#KCyZ9hJg-h{7{4$m)+%A~rE#Youf5e(*d>M@>RS~Mt3qfrE9B*%rjV{+5UfJYX zXic=_LY-z(J6b%(`krZGFSOmZ*-g?&5x8IA=U(>XpG8 zqa3q`R+sFyInmrIJU9B52Ka|0gwKkyr#+_o#;k~4%?ai`mOFi8ciAe-?3U3@gUqR{@q5GX`s=%0IzDevH7u!} ztdy6%Ev_r1Y98f%o|~xHAyZ3I#9YxL;yQ}f{~k_gBbq=eqFNLoc`Dr}->bZ@a>{>H z@U?bV>BWlb>V$f2)BZMomtEi3VCQJtWV^1D+-cHeQE2mv!vPnDhuV9g|DB-P(4L3_ z%86)8W)kZwb`sZ=zgKWq_ye{Wm+POa0sJ=Zfq#s}3upKTc<(r}*efwC#*eg$sMc_0 z$niiQze`>NZcOKO_6MxLH%~J@Lpn8mYU2Dz<^bv$=-{?qYjm&6sXA1?rQ}GFTq97o zmrAYWIz@=;sM@KZxJXn|S?*DNu#Vi6 z-J0AP-Rm%DII5eNnI@6RCe!A<)&=&N&Pnb%ucLmgfgzz-L=>f)c92mSLuL|$JO!2FDxBlH* zfUn1&Vsc@IfXP44eZu~MwU}8H?N6N@$qh3Je(2Bg`N5;p#m{k;?J~=?rpbnDW>&vn zJGOb~+rFQ=TH6H8Ki6Y50~M-LjaFB%CcjVhRQZd%Mf#~^M$|^w5UI#Re?r30Im9A7 zMYuRqg2|i}LAhJ?D1I_@Hn_CtS0gabtPTRw25`&baIdIYXwunYV06hr#~U}_+h*OBV#RsQ~Y6W z5XU37in)<4qV`7igh_%^1IWHRJjJd$$6!0YRlM0eqj-ZkQ**}?hyT=nvirAo+m?L| zhP4kXzbV^Se7$fm|EoNDuAgF_?4Be+>@VUG=_p)(9qwosvLG6XanV9amGqYUuChV( zQGQ>+J8e#BT}4FA)%wup!nO-tTl$s^C5+8^A3u{|m|%)qM%kJ>7Q3AE@bkImKNJ)i z#)!11ilb*U&$Di`k8>mV7X?W82wRKi>wk|P{0H0;=V6h;TK+O#I_FaC`j|=jI@+bE z8{yxCa01o7v%E6gs+>&h{j4eGbYmKcGEJF?8Hpd*&~vq;sU@LNS-Y)@RUTXtSM*HNmw%e5uVMS%tBYNpCU=_XH>Hi&-| zWe}xkF|ySE@BIM1MPCuSL_djrq-xmNz#A zZ)Eqx?&&?Gy~exDQ>+)*dplRVed}f6w=3{PNJ+RN>KrYEaXRKz?5~_%yfHp5T!6Xa zH}QV`J4=awif3XEg$D(8{EggW?9D89=3k>5D7uLL&{sjp{*B%V9_cPJhjyDu3z8|> z&|pS4NgA^r3hi6mb-t~=DXG4%`gX;!($m`C3Ig+As*Wm;$=^vCk|t3hF^x7OXZ^dE ziZakVf+<=fmPj_pW-FHGX6E^7@(UjnKPzji#A;tOB({(`a=Y*JUl=|;eroEBL7LHN zv%^-K?c$t_+#Y%2zK;T?f&;_-qXwxL=|(Yev2!^NylnoYz!B@kzQ>#OC!`Wj#Wh%$ zP$AgF&*P4=+gaJnDEblVy~tZ(Uj+vT{Nm%~xz+WSW3FwzWrt~(VaH6{`;M`}A+vsJ z_ont&&7loXYt~n?%VLVx7Cz69%bQUS$^B#}B@to^Q5bOo1?o?TFFJ@kiE+Y7yiG!u z70N4=u6d{OsfDCsQdvahzM9VZ{mr56-CfeYheJ2VGT+~vxn-DbnqhgucD-YyYqiHN zpH6=~_|IW`BbQKTqW3dJtYY>7F_%c+fh60?}`jy4%(5z!a& zATZt!d3m`fJD;`x$@-=F8{^lcoavVn??&Sp=blB}W@%?kBQ zZl$6}#+4G{}?q+87Y`3m@Xn|jWy=TI@^AaGsC^uYn2}gB!zlLSW?uqbqo~K8C%P_!gCd@ z60XBS@SpKv{r_G9Pr%P&e-*A3bn%4TrEC_fp0OhON6O2HJE7ZxZ2ix954!VRwmF=& zxo(kdl1FgH5k_D->>}Qwf3mdr zCj2d?72XrfL+E)Rf3IVNt=Q{%d{Y9?q_d9Cz3rvpi#Z*6_^CsrP5b zE)PBIEA4V<-_TrIpHkym*;m@H^(ow+Z;_`~%H-qH6p6KXh;SvoM&9}p5`?}-QG~6C zExruqw{OyHvi|3c^sg&0U8Z^y^+UIur_L~nIjO*STfSiDwfSiDwfSiDw zfSiDwfSiDwfSiDwfSiDwfSiDwfSiDwK+Or%oak*4YEGc$1Zqy8<^*a^pymW>PN3!l zYEGc$1Zqy8<^*a^pymW>PM}){x^K;oD-OH0&`Aa&I!ypfjK8I=LF`Q zz=T+s5DODxVL~iSh=mEUFd-Hu#KMGFm=FsSVqrooOo)XEu`nSPCd9&oSjg6aY#qqf zfovVf)`4st$ku^u9mv*!Y#qqffovVf)`4st$ku^u9mv*!RANXahE!rmC5BXDNF|0; zVn`*1RANXahE!rmC5BXDNF|0;Vn`*1RN~E6sb+hPQVn)brH&sMKHvYeyQ`hslGOlm z0&)U!0&)U!0&)U!0&)U!0&)U!0&)U!0&)U!0&)U!0&-%7K0%e}260=|A>Jenkh>`3 zR5#Sj0+17s6Oa>-6Oa>-6Oa>-6Oa>-6Oa>-6Oa>-6Oa>-6Oa>-6L0$gr^jx~y&8NM z2BwER4!;w%gJ#ay5d(4pasqM!asqM!asqM!asqM!asqM!asqM!asqM!asqM!a$?OP z#UkbcdKNV=QW-6Oa>-6Oa>-6Oa>-6Oa>-6Oa>-6Oa>- z6Oa>-6LN`f(HEMwyvw-<6jx>alB41!qGaL$0yzOW0XYFV0XYFV0XYFV0XYFV0XYFV z0XYFV0XYFV0XYFVQCCsw9yKPmns%17@zrNe0-6Oa>-6Oa>-6Oa>-6Oa>-6Oa>-6Oa>-6Oa>-6OfZcq(zsAE20YVQmM6ErwCCU zRXY_F7lE9BoPeBwoPeBwoPeBwoPeBwoPeBwoPeBwoPeBwoPeBwoJgIHyHUJye1ihF zhNOj`h+0hRrZ0^-6$^3#asqM!asqM!asqM!asqM!asqM!asqM!asqM!asqM!a^ewN z#oS02QF|kM!X&||0c77Do?=&>BghHJ3CIb^3CIb^3CIb^3CIb^3CIb^3CIb^3CIb^ z3CIb^NnFwQ8bkHt+>45bGDB&)I9arrc!Kx{tcSaJX6e*xEfMO6|3c1tz1f)SJ8T2@kUTjKNlX37b0;jD;%#x z;@czf*CO%$Nc>nNeip5HYCf9dB{0kDnAeRsQz1Pcy-OY4WEppyfmC#8{K<$;`Yc+N za}^gWI(IksQ-Z)(@Vw&U7GbzWhIziLo%V`j?FbBGP*c#Y?JtO~w=!TZ~Y2WyiZ<#H@8?q*>d+zdSRS={FR zvK2Sl-+7YHcb&IPlsu|P!P`-8yYIgaoAh%m`YJTI@H%$-KC({??V0u$2f7QZOQ)zA zR~l$-(iwOg(8{D|!ZmX}&C*Z7p9XpxNNhu#?Ke*!)LvZlX) zp91que*hl@IyLG)JMP>~V3FyY;d8)Ursu+2z`drY!ZSc`AdRoWYhab>jqpdo8q+2C zW1wRCL-3)+qq?5r;(^KKsgBMIE;0-{hQT@B% z-C(cj9{4)&rs+QT!(hMZ``}feH>AcNfFA@$Our331df{C1MdfVgQ|Z5Ga3w-9s?f- z22GELPXwn;Uu0|&eHN{!>UH*JH~7``9{65xArzO^8(ICogP#FcO#cA?5yU|~E}bx~ zv+)xcXZk$t1&}m-iS{y>W?FG+z44V#XX93oGTjVMgE^*CaGejGbM?O+eh1JOLR$0u z8{|#@0sjXqG_AUQ4i=mK5`GdaF}<8z6|gj-SDJp3*bY#N=!)r`#9juQB6^!?o!?i% z4%0fHp8|c|H2?SDI&%38yJu}@#*kez@4GE^g`4Ba<3-z zV$-eg1z@G=CGZtM?LxrVqg1 z1^uSqfFB0OP3t*o1^R=knf?!Usy_ zRU5nW*_;M=OU*)o9D!WkTPDI+(7B$zuJ!qO84d7OGtpPn`&(KF diff --git a/test-cartridges/test01/prometeu.json b/test-cartridges/test01/prometeu.json deleted file mode 100644 index 4d6511aa..00000000 --- a/test-cartridges/test01/prometeu.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "test01", - "version": "0.1.0", - "script_fe": "pbs", - "kind": "app", - "entry": "src/main/modules/main.pbs", - "out": "build/program.pbc", - "dependencies": { - "sdk": "../sdk" - } -} diff --git a/test-cartridges/test01/run.sh b/test-cartridges/test01/run.sh deleted file mode 100755 index 473d9e14..00000000 --- a/test-cartridges/test01/run.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/zsh - -set -e - -sdk/prometeu build . -cp build/program.pbc cartridge/program.pbc -sdk/prometeu run cartridge diff --git a/test-cartridges/test01/sdk b/test-cartridges/test01/sdk deleted file mode 120000 index 5cd18364..00000000 --- a/test-cartridges/test01/sdk +++ /dev/null @@ -1 +0,0 @@ -../../dist-staging/stable/prometeu-aarch64-apple-darwin \ No newline at end of file diff --git a/test-cartridges/test01/settings.json b/test-cartridges/test01/settings.json deleted file mode 100644 index 99bba6f4..00000000 --- a/test-cartridges/test01/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "prometeuPbs.serverPath": "/Users/niltonconstantino/personal/workspace.personal/intrepid/prometeu/runtime/target/debug/prometeu-lsp --studio" -} diff --git a/test-cartridges/test01/src/main/modules/main.pbs b/test-cartridges/test01/src/main/modules/main.pbs deleted file mode 100644 index 6797c6cb..00000000 --- a/test-cartridges/test01/src/main/modules/main.pbs +++ /dev/null @@ -1,66 +0,0 @@ -import { Color, Gfx } from "@sdk:gfx"; -import { Pad, Touch } from "@sdk:input"; -import { Log } from "@sdk:log"; - -declare struct Vec2(x: int, y: int) -[ - (x: int, y: int): (x, y) as default { } - (s: int): (s, s) as square { } -] -[[ - ZERO: square(0) -]] -{ - fn getX(self: this): int { - return x; - } - - fn getY(self: this): int { - return y; - } -} - -fn add(a: int, b: int): int { - return a + b; -} - -fn is_higher(a: int, b: int): bool { - let c: int = a + b; - return c >= 30; -} - -fn add2(a: int, b: int): int { - let c = add(a, b); - return c; -} - -fn frame(): void { - let zero = Vec2.ZERO; - let zz = add2(zero.getX(), zero.getY()); - - // 1. Locals & Arithmetic - let x = 10; - let y = 20; - let z = add(x, y); - - // 2. Control Flow (if) - if z == 30 { - // 3. Syscall Clear - Gfx.clear(Color.GREEN); - } else { - Gfx.clear(Color.RED); - } - - // 4. Input Snapshot & Nested Member Access - let pad_a = Pad.a(); - let touch_f = Touch.finger(); - let is_pressed = pad_a.down || touch_f.down; - if is_pressed { - Gfx.clear(Color.BLUE); - } - - if Pad.b().pressed { - Log.debug("B Pressed"); - Gfx.clear(Color.RED); - } -}