Overview

The ttk91 crate provides a library for dealing with TTK91 bytecode and symbolic assembly files, compiling assembly to bytecode and executing bytecode. The crate also includes tools for doing these tasks from the command-line. The ttk91-wasm crate provides a (limited) WebAssembly interface for this crate, via which ttk91-web uses this crate.

Features

Example

```rust use ttk91::{ symbolic::Program, emulator::{Emulator, StdIo, Memory}, };

fn main() { // Simple TTK91 program that adds 13 and 15 together and outputs the answer. let symbolic_source = r#" ;; DATA X DC 13 Y DC 15

    ;; CODE
    MAIN    LOAD    R1, X
            ADD     R1, Y
            OUT     R1, =CRT
            SVC     SP, =HALT
"#;

// Parse the symbolic assembly into symbolic IR.
let symbolic = Program::parse(symbolic_source).unwrap();

// Translate the symbolic IR into bytecode IR.
let compiled = symbolic.compile();

// Convert the bytecode IR to bytecode.
let memory = compiled.to_words();

// Load the bytecode into an emulator which uses the standard output.
let mut emulator = Emulator::new(memory, StdIo);

// Execute the bytecode.
emulator.run()
    .expect("an error occured while emulating the program");

} ```

Command-line utilities

ttk91repl

The ttk91repl provides a Read-Execute-Print-Loop environment for the TTK91 symbolic assembly language. It supports alternating between writing and executing code and provides multiple commands suitable for debugging both TTK91 programs and the emulator itself.

text 0x8000> LOAD R1, =5 0x8001> OUT R1, =CRT 5 0x0002> .register r1 Register R1 = 5 0x8002> SUB R1, =1 0x8003> JNZER R1, 0x8001 4 3 2 1 0x8004>

ttk91run

Runs TTK91 programs with input and output piped to standard streams. If the supplied file contains assembly, compiles it to bytecode before executing it.

shell $ ttk91run tests/hello.b91 28