pr 00.5
This commit is contained in:
parent
92df0ae074
commit
97c6ccb6f2
38
Cargo.lock
generated
38
Cargo.lock
generated
@ -1914,7 +1914,21 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "prometeu-core"
|
name = "prometeu-firmware"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"prometeu-abi",
|
||||||
|
"prometeu-bytecode",
|
||||||
|
"prometeu-hardware",
|
||||||
|
"prometeu-hardware-contract",
|
||||||
|
"prometeu-kernel",
|
||||||
|
"prometeu-vm",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "prometeu-hardware"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"prometeu-abi",
|
"prometeu-abi",
|
||||||
@ -1927,20 +1941,6 @@ dependencies = [
|
|||||||
"url",
|
"url",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "prometeu-firmware"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"prometeu-abi",
|
|
||||||
"prometeu-bytecode",
|
|
||||||
"prometeu-core",
|
|
||||||
"prometeu-hardware-contract",
|
|
||||||
"prometeu-kernel",
|
|
||||||
"prometeu-vm",
|
|
||||||
"serde",
|
|
||||||
"serde_json",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "prometeu-hardware-contract"
|
name = "prometeu-hardware-contract"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -1957,10 +1957,9 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"prometeu-abi",
|
"prometeu-abi",
|
||||||
"prometeu-bytecode",
|
"prometeu-bytecode",
|
||||||
"prometeu-core",
|
"prometeu-hardware",
|
||||||
"prometeu-hardware-contract",
|
"prometeu-hardware-contract",
|
||||||
"prometeu-vm",
|
"prometeu-vm",
|
||||||
"serde",
|
|
||||||
"serde_json",
|
"serde_json",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1981,8 +1980,11 @@ dependencies = [
|
|||||||
"clap",
|
"clap",
|
||||||
"cpal",
|
"cpal",
|
||||||
"pixels",
|
"pixels",
|
||||||
"prometeu-core",
|
"prometeu-abi",
|
||||||
"prometeu-firmware",
|
"prometeu-firmware",
|
||||||
|
"prometeu-hardware",
|
||||||
|
"prometeu-hardware-contract",
|
||||||
|
"prometeu-kernel",
|
||||||
"ringbuf",
|
"ringbuf",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"winit",
|
"winit",
|
||||||
|
|||||||
@ -3,7 +3,7 @@ members = [
|
|||||||
"crates/prometeu-abi",
|
"crates/prometeu-abi",
|
||||||
"crates/prometeu-vm",
|
"crates/prometeu-vm",
|
||||||
"crates/prometeu-kernel",
|
"crates/prometeu-kernel",
|
||||||
"crates/prometeu-core",
|
"crates/prometeu-hardware",
|
||||||
"crates/prometeu-runtime-desktop",
|
"crates/prometeu-runtime-desktop",
|
||||||
"crates/prometeu",
|
"crates/prometeu",
|
||||||
"crates/prometeu-bytecode",
|
"crates/prometeu-bytecode",
|
||||||
|
|||||||
@ -31,7 +31,7 @@ This repository is organized as a Rust workspace and contains several components
|
|||||||
|
|
||||||
- **[crates/](./crates)**: Software implementation in Rust.
|
- **[crates/](./crates)**: Software implementation in Rust.
|
||||||
- **[prometeu](./crates/prometeu)**: Unified command-line interface (CLI).
|
- **[prometeu](./crates/prometeu)**: Unified command-line interface (CLI).
|
||||||
- **[prometeu-core](./crates/prometeu-core)**: The logical core, VM, and internal OS.
|
- **[prometeu-hardware](./crates/prometeu-hardware)**: The virtual hardware (GPU, SPU, Input).
|
||||||
- **[prometeu-runtime-desktop](crates/prometeu-runtime-desktop)**: Host for execution on Desktop systems.
|
- **[prometeu-runtime-desktop](crates/prometeu-runtime-desktop)**: Host for execution on Desktop systems.
|
||||||
- **[docs/](./docs)**: Technical documentation and system specifications.
|
- **[docs/](./docs)**: Technical documentation and system specifications.
|
||||||
- **[devtools-protocol/](devtools)**: Definition of the communication protocol for development tools.
|
- **[devtools-protocol/](devtools)**: Definition of the communication protocol for development tools.
|
||||||
|
|||||||
@ -1,20 +0,0 @@
|
|||||||
mod asset;
|
|
||||||
mod gfx;
|
|
||||||
mod pad;
|
|
||||||
mod touch;
|
|
||||||
mod audio;
|
|
||||||
mod memory_banks;
|
|
||||||
pub mod hardware;
|
|
||||||
|
|
||||||
pub use crate::model::HandleId;
|
|
||||||
pub use asset::AssetManager;
|
|
||||||
pub use audio::{Audio, AudioCommand, Channel, MAX_CHANNELS, OUTPUT_SAMPLE_RATE};
|
|
||||||
pub use gfx::Gfx;
|
|
||||||
pub use memory_banks::MemoryBanks;
|
|
||||||
pub use pad::Pad;
|
|
||||||
pub use touch::Touch;
|
|
||||||
|
|
||||||
pub use prometeu_hardware_contract::{
|
|
||||||
AssetBridge, AudioBridge, BlendMode, GfxBridge, HardwareBridge, InputSignals, LoopMode,
|
|
||||||
PadBridge, TouchBridge,
|
|
||||||
};
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
//! # Prometeu Core
|
|
||||||
//!
|
|
||||||
//! This crate contains the engine and hardware definitions for the Prometeu Virtual Console.
|
|
||||||
//! It serves as the bridge between the physical host (desktop/web) and the virtualized
|
|
||||||
//! environment where games and apps run.
|
|
||||||
//!
|
|
||||||
//! ## Main Components:
|
|
||||||
//! - [`hardware`]: Virtual peripheral definitions (Graphics, Audio, Input).
|
|
||||||
//! - [`virtual_machine`]: The stack-based execution engine for Prometeu ByteCode.
|
|
||||||
//! - [`prometeu_os`]: Resource management, filesystem access, and syscall dispatching.
|
|
||||||
//! - [`model`]: Common data structures (Colors, Sprites, Cartridges).
|
|
||||||
//! - [`fs`]: Virtualized filesystem abstraction for sandboxed access.
|
|
||||||
//! - [`log`]: Centralized logging and telemetry service.
|
|
||||||
//!
|
|
||||||
//! The "Source of Truth" for the console's behavior lives here.
|
|
||||||
|
|
||||||
pub mod hardware;
|
|
||||||
// pub mod fs;
|
|
||||||
|
|
||||||
pub mod fs {
|
|
||||||
pub use prometeu_kernel::fs::*;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub mod prometeu_os {
|
|
||||||
pub use prometeu_kernel::*;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Facade/reexports for ABI modules (temporary during PR-00.x)
|
|
||||||
pub use prometeu_abi as abi;
|
|
||||||
pub use prometeu_abi::debugger_protocol;
|
|
||||||
pub use prometeu_abi::log;
|
|
||||||
pub use prometeu_abi::model;
|
|
||||||
pub use prometeu_abi::telemetry;
|
|
||||||
|
|
||||||
pub use hardware::hardware::Hardware;
|
|
||||||
@ -5,7 +5,7 @@ edition = "2024"
|
|||||||
license.workspace = true
|
license.workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
prometeu-core = { path = "../prometeu-core" }
|
prometeu-hardware = { path = "../prometeu-hardware" }
|
||||||
prometeu-vm = { path = "../prometeu-vm" }
|
prometeu-vm = { path = "../prometeu-vm" }
|
||||||
prometeu-kernel = { path = "../prometeu-kernel" }
|
prometeu-kernel = { path = "../prometeu-kernel" }
|
||||||
prometeu-bytecode = { path = "../prometeu-bytecode" }
|
prometeu-bytecode = { path = "../prometeu-bytecode" }
|
||||||
|
|||||||
@ -1,13 +1,12 @@
|
|||||||
|
use prometeu_abi::model::Cartridge;
|
||||||
|
use prometeu_abi::telemetry::CertificationConfig;
|
||||||
|
use prometeu_hardware_contract::{HardwareBridge, InputSignals};
|
||||||
|
use prometeu_kernel::PrometeuOS;
|
||||||
use prometeu_vm::VirtualMachine;
|
use prometeu_vm::VirtualMachine;
|
||||||
use crate::firmware::boot_target::BootTarget;
|
use crate::firmware::boot_target::BootTarget;
|
||||||
use crate::firmware::firmware_state::{FirmwareState, LoadCartridgeStep, ResetStep};
|
use crate::firmware::firmware_state::{FirmwareState, LoadCartridgeStep, ResetStep};
|
||||||
use crate::firmware::prometeu_context::PrometeuContext;
|
use crate::firmware::prometeu_context::PrometeuContext;
|
||||||
use prometeu_core::hardware::{HardwareBridge, InputSignals};
|
|
||||||
use prometeu_core::abi::model::Cartridge;
|
|
||||||
use crate::prometeu_hub::PrometeuHub;
|
use crate::prometeu_hub::PrometeuHub;
|
||||||
use prometeu_core::prometeu_os::PrometeuOS;
|
|
||||||
|
|
||||||
use prometeu_core::abi::telemetry::CertificationConfig;
|
|
||||||
|
|
||||||
/// PROMETEU Firmware.
|
/// PROMETEU Firmware.
|
||||||
///
|
///
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
|
use prometeu_abi::log::{LogLevel, LogSource};
|
||||||
|
use prometeu_abi::model::Color;
|
||||||
use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep};
|
use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep};
|
||||||
use crate::firmware::prometeu_context::PrometeuContext;
|
use crate::firmware::prometeu_context::PrometeuContext;
|
||||||
use prometeu_core::abi::log::{LogLevel, LogSource};
|
|
||||||
use prometeu_core::abi::model::Color;
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct AppCrashesStep {
|
pub struct AppCrashesStep {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
|
use prometeu_abi::log::{LogLevel, LogSource};
|
||||||
use crate::firmware::firmware_state::{AppCrashesStep, FirmwareState};
|
use crate::firmware::firmware_state::{AppCrashesStep, FirmwareState};
|
||||||
use crate::firmware::prometeu_context::PrometeuContext;
|
use crate::firmware::prometeu_context::PrometeuContext;
|
||||||
use prometeu_core::abi::log::{LogLevel, LogSource};
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct GameRunningStep;
|
pub struct GameRunningStep;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
use crate::firmware::firmware_state::{AppCrashesStep, FirmwareState};
|
use crate::firmware::firmware_state::{AppCrashesStep, FirmwareState};
|
||||||
use crate::firmware::prometeu_context::PrometeuContext;
|
use crate::firmware::prometeu_context::PrometeuContext;
|
||||||
use prometeu_core::abi::log::{LogLevel, LogSource};
|
use prometeu_abi::log::{LogLevel, LogSource};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct HubHomeStep;
|
pub struct HubHomeStep;
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
use crate::firmware::boot_target::BootTarget;
|
use crate::firmware::boot_target::BootTarget;
|
||||||
use crate::firmware::firmware_state::{FirmwareState, HubHomeStep, LoadCartridgeStep};
|
use crate::firmware::firmware_state::{FirmwareState, HubHomeStep, LoadCartridgeStep};
|
||||||
use crate::firmware::prometeu_context::PrometeuContext;
|
use crate::firmware::prometeu_context::PrometeuContext;
|
||||||
use prometeu_core::abi::log::{LogLevel, LogSource};
|
use prometeu_abi::log::{LogLevel, LogSource};
|
||||||
use prometeu_core::abi::model::CartridgeLoader;
|
use prometeu_abi::model::CartridgeLoader;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct LaunchHubStep;
|
pub struct LaunchHubStep;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
use crate::firmware::firmware_state::{FirmwareState, GameRunningStep, HubHomeStep};
|
use crate::firmware::firmware_state::{FirmwareState, GameRunningStep, HubHomeStep};
|
||||||
use crate::firmware::prometeu_context::PrometeuContext;
|
use crate::firmware::prometeu_context::PrometeuContext;
|
||||||
use prometeu_core::abi::log::{LogLevel, LogSource};
|
use prometeu_abi::log::{LogLevel, LogSource};
|
||||||
use prometeu_core::abi::model::{AppMode, Cartridge, Color, Rect};
|
use prometeu_abi::model::{AppMode, Cartridge, Color, Rect};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct LoadCartridgeStep {
|
pub struct LoadCartridgeStep {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
|
use prometeu_abi::log::{LogLevel, LogSource};
|
||||||
use crate::firmware::boot_target::BootTarget;
|
use crate::firmware::boot_target::BootTarget;
|
||||||
use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep, SplashScreenStep};
|
use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep, SplashScreenStep};
|
||||||
use crate::firmware::prometeu_context::PrometeuContext;
|
use crate::firmware::prometeu_context::PrometeuContext;
|
||||||
use prometeu_core::abi::log::{LogLevel, LogSource};
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct ResetStep;
|
pub struct ResetStep;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep};
|
use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep};
|
||||||
use crate::firmware::prometeu_context::PrometeuContext;
|
use crate::firmware::prometeu_context::PrometeuContext;
|
||||||
use prometeu_core::abi::log::{LogLevel, LogSource};
|
use prometeu_abi::log::{LogLevel, LogSource};
|
||||||
use prometeu_core::abi::model::Color;
|
use prometeu_abi::model::Color;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct SplashScreenStep {
|
pub struct SplashScreenStep {
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
|
use prometeu_hardware_contract::{HardwareBridge, InputSignals};
|
||||||
|
use prometeu_kernel::PrometeuOS;
|
||||||
use prometeu_vm::VirtualMachine;
|
use prometeu_vm::VirtualMachine;
|
||||||
use crate::firmware::boot_target::BootTarget;
|
use crate::firmware::boot_target::BootTarget;
|
||||||
use prometeu_core::hardware::{HardwareBridge, InputSignals};
|
|
||||||
use crate::prometeu_hub::PrometeuHub;
|
use crate::prometeu_hub::PrometeuHub;
|
||||||
use prometeu_core::prometeu_os::PrometeuOS;
|
|
||||||
|
|
||||||
pub struct PrometeuContext<'a> {
|
pub struct PrometeuContext<'a> {
|
||||||
pub vm: &'a mut VirtualMachine,
|
pub vm: &'a mut VirtualMachine,
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
use prometeu_core::hardware::HardwareBridge;
|
use prometeu_abi::log::{LogLevel, LogSource};
|
||||||
use prometeu_core::abi::log::{LogLevel, LogSource};
|
use prometeu_abi::model::{Color, Rect};
|
||||||
use prometeu_core::abi::model::{Color, Rect};
|
use prometeu_hardware_contract::HardwareBridge;
|
||||||
|
use prometeu_kernel::PrometeuOS;
|
||||||
use crate::prometeu_hub::window_manager::WindowManager;
|
use crate::prometeu_hub::window_manager::WindowManager;
|
||||||
use prometeu_core::prometeu_os::PrometeuOS;
|
|
||||||
|
|
||||||
/// PrometeuHub: Launcher and system UI environment.
|
/// PrometeuHub: Launcher and system UI environment.
|
||||||
pub struct PrometeuHub {
|
pub struct PrometeuHub {
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use prometeu_core::abi::model::{Color, Rect, Window, WindowId};
|
use prometeu_abi::model::{Color, Rect, Window, WindowId};
|
||||||
|
|
||||||
/// PROMETEU Window Manager.
|
/// PROMETEU Window Manager.
|
||||||
pub struct WindowManager {
|
pub struct WindowManager {
|
||||||
@ -50,7 +50,7 @@ impl WindowManager {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use prometeu_core::abi::model::Rect;
|
use prometeu_abi::model::Rect;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_window_manager_focus() {
|
fn test_window_manager_focus() {
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "prometeu-core"
|
name = "prometeu-hardware"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license.workspace = true
|
license.workspace = true
|
||||||
@ -1,10 +1,10 @@
|
|||||||
use crate::hardware::memory_banks::{SoundBankPoolInstaller, TileBankPoolInstaller};
|
|
||||||
use crate::model::{AssetEntry, BankStats, BankType, Color, HandleId, LoadStatus, PreloadEntry, Sample, SlotRef, SlotStats, SoundBank, TileBank, TileSize};
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::{Arc, Mutex, RwLock};
|
use std::sync::{Arc, Mutex, RwLock};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
use prometeu_abi::model::{AssetEntry, BankStats, BankType, Color, HandleId, LoadStatus, PreloadEntry, Sample, SlotRef, SlotStats, SoundBank, TileBank, TileSize};
|
||||||
use prometeu_hardware_contract::AssetBridge;
|
use prometeu_hardware_contract::AssetBridge;
|
||||||
|
use crate::memory_banks::{SoundBankPoolInstaller, TileBankPoolInstaller};
|
||||||
|
|
||||||
/// Resident metadata for a decoded/materialized asset inside a BankPolicy.
|
/// Resident metadata for a decoded/materialized asset inside a BankPolicy.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -673,7 +673,7 @@ impl AssetManager {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::hardware::memory_banks::{MemoryBanks, SoundBankPoolAccess, TileBankPoolAccess};
|
use crate::memory_banks::{MemoryBanks, SoundBankPoolAccess, TileBankPoolAccess};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_asset_loading_flow() {
|
fn test_asset_loading_flow() {
|
||||||
@ -1,6 +1,5 @@
|
|||||||
use crate::hardware::memory_banks::SoundBankPoolAccess;
|
|
||||||
use crate::model::Sample;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use prometeu_abi::model::Sample;
|
||||||
use prometeu_hardware_contract::AudioBridge;
|
use prometeu_hardware_contract::AudioBridge;
|
||||||
|
|
||||||
/// Maximum number of simultaneous audio voices supported by the hardware.
|
/// Maximum number of simultaneous audio voices supported by the hardware.
|
||||||
@ -10,6 +9,7 @@ pub const OUTPUT_SAMPLE_RATE: u32 = 48000;
|
|||||||
|
|
||||||
/// Looping mode for samples (re-exported from the hardware contract).
|
/// Looping mode for samples (re-exported from the hardware contract).
|
||||||
pub use prometeu_hardware_contract::LoopMode;
|
pub use prometeu_hardware_contract::LoopMode;
|
||||||
|
use crate::memory_banks::SoundBankPoolAccess;
|
||||||
|
|
||||||
/// State of a single playback voice (channel).
|
/// State of a single playback voice (channel).
|
||||||
///
|
///
|
||||||
@ -1,5 +1,5 @@
|
|||||||
use crate::hardware::memory_banks::TileBankPoolAccess;
|
use crate::memory_banks::TileBankPoolAccess;
|
||||||
use crate::model::{Color, HudTileLayer, ScrollableTileLayer, Sprite, TileBank, TileMap, TileSize};
|
use prometeu_abi::model::{Color, HudTileLayer, ScrollableTileLayer, Sprite, Tile, TileBank, TileMap, TileSize};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use prometeu_hardware_contract::GfxBridge;
|
use prometeu_hardware_contract::GfxBridge;
|
||||||
|
|
||||||
@ -119,7 +119,7 @@ impl Gfx {
|
|||||||
/// Initializes the graphics system with a specific resolution and shared memory banks.
|
/// Initializes the graphics system with a specific resolution and shared memory banks.
|
||||||
pub fn new(w: usize, h: usize, tile_banks: Arc<dyn TileBankPoolAccess>) -> Self {
|
pub fn new(w: usize, h: usize, tile_banks: Arc<dyn TileBankPoolAccess>) -> Self {
|
||||||
const EMPTY_SPRITE: Sprite = Sprite {
|
const EMPTY_SPRITE: Sprite = Sprite {
|
||||||
tile: crate::model::Tile { id: 0, flip_x: false, flip_y: false, palette_id: 0 },
|
tile: Tile { id: 0, flip_x: false, flip_y: false, palette_id: 0 },
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
bank_id: 0,
|
bank_id: 0,
|
||||||
@ -483,7 +483,7 @@ impl Gfx {
|
|||||||
|
|
||||||
/// Internal helper to copy a single tile's pixels to the framebuffer.
|
/// Internal helper to copy a single tile's pixels to the framebuffer.
|
||||||
/// Handles flipping and palette resolution.
|
/// Handles flipping and palette resolution.
|
||||||
fn draw_tile_pixels(back: &mut [u16], screen_w: usize, screen_h: usize, x: i32, y: i32, tile: crate::model::Tile, bank: &TileBank) {
|
fn draw_tile_pixels(back: &mut [u16], screen_w: usize, screen_h: usize, x: i32, y: i32, tile: Tile, bank: &TileBank) {
|
||||||
let size = bank.tile_size as usize;
|
let size = bank.tile_size as usize;
|
||||||
|
|
||||||
for local_y in 0..size {
|
for local_y in 0..size {
|
||||||
@ -662,7 +662,7 @@ impl Gfx {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::hardware::MemoryBanks;
|
use crate::memory_banks::MemoryBanks;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_draw_pixel() {
|
fn test_draw_pixel() {
|
||||||
@ -1,6 +1,11 @@
|
|||||||
use crate::hardware::memory_banks::{SoundBankPoolAccess, SoundBankPoolInstaller, TileBankPoolAccess, TileBankPoolInstaller};
|
|
||||||
use crate::hardware::{AssetBridge, AssetManager, Audio, AudioBridge, Gfx, GfxBridge, HardwareBridge, MemoryBanks, Pad, PadBridge, Touch, TouchBridge};
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use prometeu_hardware_contract::{AssetBridge, AudioBridge, GfxBridge, HardwareBridge, PadBridge, TouchBridge};
|
||||||
|
use crate::asset::AssetManager;
|
||||||
|
use crate::audio::Audio;
|
||||||
|
use crate::gfx::Gfx;
|
||||||
|
use crate::memory_banks::{MemoryBanks, SoundBankPoolAccess, SoundBankPoolInstaller, TileBankPoolAccess, TileBankPoolInstaller};
|
||||||
|
use crate::pad::Pad;
|
||||||
|
use crate::touch::Touch;
|
||||||
|
|
||||||
/// Aggregate structure for all virtual hardware peripherals.
|
/// Aggregate structure for all virtual hardware peripherals.
|
||||||
///
|
///
|
||||||
14
crates/prometeu-hardware/src/lib.rs
Normal file
14
crates/prometeu-hardware/src/lib.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
mod asset;
|
||||||
|
mod gfx;
|
||||||
|
mod pad;
|
||||||
|
mod touch;
|
||||||
|
mod audio;
|
||||||
|
mod memory_banks;
|
||||||
|
pub mod hardware;
|
||||||
|
|
||||||
|
pub use crate::asset::AssetManager;
|
||||||
|
pub use crate::audio::{Audio, AudioCommand, Channel, MAX_CHANNELS, OUTPUT_SAMPLE_RATE};
|
||||||
|
pub use crate::gfx::Gfx;
|
||||||
|
pub use crate::memory_banks::MemoryBanks;
|
||||||
|
pub use crate::pad::Pad;
|
||||||
|
pub use crate::touch::Touch;
|
||||||
@ -1,5 +1,5 @@
|
|||||||
use crate::model::{SoundBank, TileBank};
|
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
use prometeu_abi::model::{SoundBank, TileBank};
|
||||||
|
|
||||||
/// Non-generic interface for peripherals to access graphical tile banks.
|
/// Non-generic interface for peripherals to access graphical tile banks.
|
||||||
pub trait TileBankPoolAccess: Send + Sync {
|
pub trait TileBankPoolAccess: Send + Sync {
|
||||||
@ -1,6 +1,5 @@
|
|||||||
use prometeu_hardware_contract::PadBridge;
|
use prometeu_abi::model::Button;
|
||||||
use crate::hardware::InputSignals;
|
use prometeu_hardware_contract::{InputSignals, PadBridge};
|
||||||
use crate::model::Button;
|
|
||||||
|
|
||||||
#[derive(Default, Clone, Copy, Debug)]
|
#[derive(Default, Clone, Copy, Debug)]
|
||||||
pub struct Pad {
|
pub struct Pad {
|
||||||
@ -1,6 +1,5 @@
|
|||||||
use prometeu_hardware_contract::TouchBridge;
|
use prometeu_abi::model::Button;
|
||||||
use crate::hardware::InputSignals;
|
use prometeu_hardware_contract::{InputSignals, TouchBridge};
|
||||||
use crate::model::Button;
|
|
||||||
|
|
||||||
#[derive(Default, Clone, Copy, Debug)]
|
#[derive(Default, Clone, Copy, Debug)]
|
||||||
pub struct Touch {
|
pub struct Touch {
|
||||||
@ -1,7 +1,7 @@
|
|||||||
use prometeu_core::Hardware;
|
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use prometeu_abi::virtual_machine::{Value, VmFault};
|
use prometeu_abi::virtual_machine::{Value, VmFault};
|
||||||
|
use prometeu_hardware::hardware::Hardware;
|
||||||
use prometeu_hardware_contract::{HostContext, HostReturn, NativeInterface};
|
use prometeu_hardware_contract::{HostContext, HostReturn, NativeInterface};
|
||||||
use prometeu_vm::{LogicalFrameEndingReason, VirtualMachine};
|
use prometeu_vm::{LogicalFrameEndingReason, VirtualMachine};
|
||||||
|
|
||||||
@ -5,7 +5,6 @@ edition = "2024"
|
|||||||
license.workspace = true
|
license.workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde = { version = "1.0.228", features = ["derive"] }
|
|
||||||
serde_json = "1.0.149"
|
serde_json = "1.0.149"
|
||||||
prometeu-vm = { path = "../prometeu-vm" }
|
prometeu-vm = { path = "../prometeu-vm" }
|
||||||
prometeu-bytecode = { path = "../prometeu-bytecode" }
|
prometeu-bytecode = { path = "../prometeu-bytecode" }
|
||||||
@ -13,4 +12,4 @@ prometeu-abi = { path = "../prometeu-abi" }
|
|||||||
prometeu-hardware-contract = { path = "../prometeu-hardware-contract" }
|
prometeu-hardware-contract = { path = "../prometeu-hardware-contract" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
prometeu-core = { path = "../prometeu-core" }
|
prometeu-hardware = { path = "../prometeu-hardware" }
|
||||||
|
|||||||
@ -415,11 +415,11 @@ impl PrometeuOS {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use prometeu_hardware::hardware::Hardware;
|
||||||
use prometeu_abi::virtual_machine::Value;
|
use prometeu_abi::virtual_machine::Value;
|
||||||
use prometeu_hardware_contract::{HostReturn, InputSignals};
|
use prometeu_hardware_contract::{HostReturn, InputSignals};
|
||||||
use super::*;
|
use super::*;
|
||||||
use prometeu_abi::model::{AppMode, Cartridge};
|
use prometeu_abi::model::{AppMode, Cartridge};
|
||||||
use prometeu_core::Hardware;
|
|
||||||
|
|
||||||
fn call_syscall(os: &mut PrometeuOS, id: u32, vm: &mut VirtualMachine, hw: &mut dyn HardwareBridge) -> Result<(), VmFault> {
|
fn call_syscall(os: &mut PrometeuOS, id: u32, vm: &mut VirtualMachine, hw: &mut dyn HardwareBridge) -> Result<(), VmFault> {
|
||||||
let args_count = Syscall::from_u32(id).expect(&format!("Invalid syscall id: 0x{:08X}", id)).args_count();
|
let args_count = Syscall::from_u32(id).expect(&format!("Invalid syscall id: 0x{:08X}", id)).args_count();
|
||||||
|
|||||||
@ -14,8 +14,11 @@ dist = true
|
|||||||
include = ["../../VERSION.txt"]
|
include = ["../../VERSION.txt"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
prometeu-core = { path = "../prometeu-core" }
|
prometeu-abi = { path = "../prometeu-abi" }
|
||||||
prometeu-firmware = { path = "../prometeu-firmware" }
|
prometeu-firmware = { path = "../prometeu-firmware" }
|
||||||
|
prometeu-kernel = { path = "../prometeu-kernel" }
|
||||||
|
prometeu-hardware = { path = "../prometeu-hardware" }
|
||||||
|
prometeu-hardware-contract = { path="../prometeu-hardware-contract" }
|
||||||
winit = "0.30.12"
|
winit = "0.30.12"
|
||||||
pixels = "0.15.0"
|
pixels = "0.15.0"
|
||||||
cpal = "0.15.3"
|
cpal = "0.15.3"
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
||||||
use prometeu_core::hardware::{AudioCommand, Channel, LoopMode, MAX_CHANNELS, OUTPUT_SAMPLE_RATE};
|
use prometeu_hardware::{AudioCommand, Channel, MAX_CHANNELS, OUTPUT_SAMPLE_RATE};
|
||||||
use ringbuf::traits::{Consumer, Producer, Split};
|
use ringbuf::traits::{Consumer, Producer, Split};
|
||||||
use ringbuf::HeapRb;
|
use ringbuf::HeapRb;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
use prometeu_hardware_contract::LoopMode;
|
||||||
|
|
||||||
pub struct HostAudio {
|
pub struct HostAudio {
|
||||||
pub producer: Option<ringbuf::wrap::CachingProd<Arc<HeapRb<AudioCommand>>>>,
|
pub producer: Option<ringbuf::wrap::CachingProd<Arc<HeapRb<AudioCommand>>>>,
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use prometeu_core::telemetry::CertificationConfig;
|
use prometeu_abi::telemetry::CertificationConfig;
|
||||||
|
|
||||||
pub fn load_cap_config(path: &str) -> Option<CertificationConfig> {
|
pub fn load_cap_config(path: &str) -> Option<CertificationConfig> {
|
||||||
let content = std::fs::read_to_string(path).ok()?;
|
let content = std::fs::read_to_string(path).ok()?;
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
use prometeu_core::debugger_protocol::*;
|
use prometeu_abi::debugger_protocol::*;
|
||||||
use prometeu_firmware::{BootTarget, Firmware};
|
use prometeu_firmware::{BootTarget, Firmware};
|
||||||
use prometeu_core::abi::model::CartridgeLoader;
|
use prometeu_abi::model::CartridgeLoader;
|
||||||
use prometeu_core::Hardware;
|
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use std::net::{TcpListener, TcpStream};
|
use std::net::{TcpListener, TcpStream};
|
||||||
|
use prometeu_hardware::hardware::Hardware;
|
||||||
|
|
||||||
/// Host-side implementation of the PROMETEU DevTools Protocol.
|
/// Host-side implementation of the PROMETEU DevTools Protocol.
|
||||||
///
|
///
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
use prometeu_core::fs::{FsBackend, FsEntry, FsError};
|
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use prometeu_kernel::fs::{FsBackend, FsEntry, FsError};
|
||||||
|
|
||||||
pub struct HostDirBackend {
|
pub struct HostDirBackend {
|
||||||
root: PathBuf,
|
root: PathBuf,
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
use prometeu_core::hardware::InputSignals;
|
|
||||||
use prometeu_core::Hardware;
|
|
||||||
use winit::event::{ElementState, MouseButton, WindowEvent};
|
use winit::event::{ElementState, MouseButton, WindowEvent};
|
||||||
use winit::keyboard::{KeyCode, PhysicalKey};
|
use winit::keyboard::{KeyCode, PhysicalKey};
|
||||||
use winit::window::Window;
|
use winit::window::Window;
|
||||||
|
use prometeu_hardware::hardware::Hardware;
|
||||||
|
use prometeu_hardware_contract::InputSignals;
|
||||||
|
|
||||||
pub struct HostInputHandler {
|
pub struct HostInputHandler {
|
||||||
pub signals: InputSignals,
|
pub signals: InputSignals,
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use prometeu_core::log::{LogEvent, LogLevel, LogSource};
|
use prometeu_abi::log::{LogEvent, LogLevel, LogSource};
|
||||||
|
|
||||||
pub struct HostConsoleSink {
|
pub struct HostConsoleSink {
|
||||||
last_seq: Option<u64>,
|
last_seq: Option<u64>,
|
||||||
|
|||||||
@ -8,7 +8,6 @@ use crate::utilities::draw_rgb565_to_rgba8;
|
|||||||
use pixels::wgpu::PresentMode;
|
use pixels::wgpu::PresentMode;
|
||||||
use pixels::{Pixels, PixelsBuilder, SurfaceTexture};
|
use pixels::{Pixels, PixelsBuilder, SurfaceTexture};
|
||||||
use prometeu_firmware::{BootTarget, Firmware};
|
use prometeu_firmware::{BootTarget, Firmware};
|
||||||
use prometeu_core::Hardware;
|
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
use winit::application::ApplicationHandler;
|
use winit::application::ApplicationHandler;
|
||||||
use winit::dpi::LogicalSize;
|
use winit::dpi::LogicalSize;
|
||||||
@ -16,8 +15,10 @@ use winit::event::{ElementState, WindowEvent};
|
|||||||
use winit::event_loop::{ActiveEventLoop, ControlFlow};
|
use winit::event_loop::{ActiveEventLoop, ControlFlow};
|
||||||
use winit::keyboard::{KeyCode, PhysicalKey};
|
use winit::keyboard::{KeyCode, PhysicalKey};
|
||||||
use winit::window::{Window, WindowAttributes, WindowId};
|
use winit::window::{Window, WindowAttributes, WindowId};
|
||||||
|
use prometeu_abi::model::Color;
|
||||||
use prometeu_core::telemetry::CertificationConfig;
|
use prometeu_abi::telemetry::CertificationConfig;
|
||||||
|
use prometeu_hardware::hardware::Hardware;
|
||||||
|
use prometeu_hardware::AudioCommand;
|
||||||
|
|
||||||
/// The Desktop implementation of the PROMETEU Runtime.
|
/// The Desktop implementation of the PROMETEU Runtime.
|
||||||
///
|
///
|
||||||
@ -124,9 +125,9 @@ impl HostRunner {
|
|||||||
|
|
||||||
fn display_dbg_overlay(&mut self) {
|
fn display_dbg_overlay(&mut self) {
|
||||||
let tel = &self.firmware.os.telemetry_last;
|
let tel = &self.firmware.os.telemetry_last;
|
||||||
let color_text = prometeu_core::model::Color::WHITE;
|
let color_text = Color::WHITE;
|
||||||
let color_bg = prometeu_core::model::Color::INDIGO; // Dark blue to stand out
|
let color_bg = Color::INDIGO; // Dark blue to stand out
|
||||||
let color_warn = prometeu_core::model::Color::RED;
|
let color_warn = Color::RED;
|
||||||
|
|
||||||
self.hardware.gfx.fill_rect(5, 5, 175, 100, color_bg);
|
self.hardware.gfx.fill_rect(5, 5, 175, 100, color_bg);
|
||||||
self.hardware.gfx.draw_text(10, 10, &format!("FPS: {:.1}", self.stats.current_fps), color_text);
|
self.hardware.gfx.draw_text(10, 10, &format!("FPS: {:.1}", self.stats.current_fps), color_text);
|
||||||
@ -259,7 +260,7 @@ impl ApplicationHandler for HostRunner {
|
|||||||
|
|
||||||
// 2. Maintain filesystem connection if it was lost (e.g., directory removed).
|
// 2. Maintain filesystem connection if it was lost (e.g., directory removed).
|
||||||
if let Some(root) = &self.fs_root {
|
if let Some(root) = &self.fs_root {
|
||||||
use prometeu_core::fs::FsState;
|
use prometeu_kernel::fs::FsState;
|
||||||
if matches!(self.firmware.os.fs_state, FsState::Unmounted | FsState::Error(_)) {
|
if matches!(self.firmware.os.fs_state, FsState::Unmounted | FsState::Error(_)) {
|
||||||
if std::path::Path::new(root).exists() {
|
if std::path::Path::new(root).exists() {
|
||||||
let backend = HostDirBackend::new(root);
|
let backend = HostDirBackend::new(root);
|
||||||
@ -298,9 +299,9 @@ impl ApplicationHandler for HostRunner {
|
|||||||
if is_paused != self.last_paused_state {
|
if is_paused != self.last_paused_state {
|
||||||
self.last_paused_state = is_paused;
|
self.last_paused_state = is_paused;
|
||||||
let cmd = if is_paused {
|
let cmd = if is_paused {
|
||||||
prometeu_core::hardware::AudioCommand::MasterPause
|
AudioCommand::MasterPause
|
||||||
} else {
|
} else {
|
||||||
prometeu_core::hardware::AudioCommand::MasterResume
|
AudioCommand::MasterResume
|
||||||
};
|
};
|
||||||
self.hardware.audio.commands.push(cmd);
|
self.hardware.audio.commands.push(cmd);
|
||||||
}
|
}
|
||||||
@ -343,10 +344,10 @@ impl ApplicationHandler for HostRunner {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use prometeu_core::debugger_protocol::DEVTOOLS_PROTOCOL_VERSION;
|
|
||||||
use prometeu_firmware::BootTarget;
|
use prometeu_firmware::BootTarget;
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use std::net::TcpStream;
|
use std::net::TcpStream;
|
||||||
|
use prometeu_abi::debugger_protocol::DEVTOOLS_PROTOCOL_VERSION;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_debug_port_opens() {
|
fn test_debug_port_opens() {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
use prometeu_firmware::Firmware;
|
use prometeu_firmware::Firmware;
|
||||||
use prometeu_core::Hardware;
|
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
use winit::window::Window;
|
use winit::window::Window;
|
||||||
|
use prometeu_hardware::hardware::Hardware;
|
||||||
|
|
||||||
pub struct HostStats {
|
pub struct HostStats {
|
||||||
pub last_stats_update: Instant,
|
pub last_stats_update: Instant,
|
||||||
|
|||||||
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user