# saturnus-objects
HP 48 and HP 49 RPL objects for hosts of the
[saturnus](https://github.com/ractive/saturnus) emulator core
([`saturnus-core`](https://crates.io/crates/saturnus-core)), with no I/O or
protocol stack: like the core it builds for `wasm32-unknown-unknown`.
- `object`: the typed object model (`Object`, JSON through serde) and an
exact decoder of the calculator's nibble format.
- `ram`: a read-only view of a paused machine's user memory, straight
from RAM (no Kermit server, nothing written): the HOME tree with each
variable's type, size and checksum as `BYTES` reports them, the current
directory, the data stack and the flags, plus a change counter for
cheap polling. HP 48SX, 48GX and 49G.
- `names`: command names read at run time from the loaded ROM's own
library tables.
- `decompile`: the calculator's text for programs, algebraics, units and
data objects, in the display mode the flags select.
- `menus`: the ROM's built-in menus.
- `transfer`: the objects of Kermit transfers: binary transfer files
(`HPHP48-x`, `HPHP49-x`) decoded and encoded, the text of programs and
algebraics from the ASCII transfer of the same object, RPL source text
for a host command. The Kermit exchange itself is the host's (for
example [`kermit-proto`](https://crates.io/crates/kermit-proto)).
- `charset`: the HP character set as Unicode, and the ASCII trigraphs
(`\->`) of host commands.
## Usage
```rust,no_run
use saturnus_core::{Machine, Model};
use saturnus_objects::{Settings, display, memory_tree, stack_objects};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let rom = std::fs::read("gxrom-r")?;
let mut m = Machine::new(Model::Hp48gx, &rom)?;
m.run_cycles(8_000_000).map_err(|h| format!("halted: {h:?}"))?;
for var in memory_tree(&m)? {
println!("{} ({}, {} bytes)", var.name, var.kind, var.size);
}
for (level, obj) in stack_objects(&m)?.iter().enumerate() {
println!("{}: {}", level + 1, display(obj, &Settings::default()));
}
Ok(())
}
```
No ROM is included; see the
[saturnus repository](https://github.com/ractive/saturnus) for where to
get one legitimately.
## Licence
MIT. Parts of the code were generated by AI systems under human
supervision; see the repository's `AI_NOTICE`.