#instructions #assembly #bytecode #symbolic #architecture #compiler #execute

bin+lib ttk91

A parser, compiler and emulator library for the TTK91 instruction architecture

2 unstable releases

0.2.0 May 25, 2020
0.1.0-alpha.1 Jan 2, 2020

#610 in WebAssembly

MIT license

200KB
4.5K SLoC

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

  • Parse TTK91 programs from both the symbolic and the bytecode formats
  • Compile symbolic assembly into bytecode
  • Generate source map for the bytecode
  • Execute bytecode
  • Extensible IO and Memory interfaces
  • Command-line utilities

Example

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

This crate comes with multiple command-line utilities. These utilities can be enables with the tools feature or individually with the ttk91repl and ttk91run features.

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.

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

The ttk91run command-line tool is capable of emulating TTK91 programs in both the symbolic and the bytecode formats.

$ ttk91run tests/hello.k91
28
$ ttk91run tests/hello.b91
28

Dependencies

~3–11MB
~81K SLoC