/customasm

💻 An assembler for custom, user-defined instruction sets! https://hlorenzi.github.io/customasm/web/

Primary LanguageRustApache License 2.0Apache-2.0

customasm

This is an assembler that takes custom instruction set definitions and uses them to assemble source files.
This can be useful if you'd like to test out a new virtual machine's bytecode, or even if you're eager to write programs for that new processor architecture you just implemented in FPGA!

Latest Release Releases Discord

📱 Try it right now in your browser!

🎁 Check out the Releases section for pre-built binaries.

📖 Check out the User Guide on how to use the main features!

📋 Check out the documentation for more in-depth instructions.

🕹 Check out an example project which targets the NES!

You can compile from source by simply doing cargo build. There's also a battery of tests available at cargo test.

Example

Given the following file:

#cpudef
{
    #bits 8
    
    load r1, {value} -> 0x11 @ value[7:0]
    load r2, {value} -> 0x12 @ value[7:0]
    load r3, {value} -> 0x13 @ value[7:0]
    add  r1, r2      -> 0x21
    sub  r3, {value} -> 0x33 @ value[7:0]
    jnz  {address}   -> 0x40 @ address[15:0]
    ret              -> 0x50
}

#addr 0x100

multiply3x4:
    load r1, 0
    load r2, 3
    load r3, 4
    
    .loop:
        add r1, r2
        sub r3, 1
        jnz .loop
    
    ret

...the assembler would use the #cpudef rules to convert the instructions into binary code:

  outp | addr | data

 100:0 |  100 |          ; multiply3x4:
 100:0 |  100 | 11 00    ; load r1, 0
 102:0 |  102 | 12 03    ; load r2, 3
 104:0 |  104 | 13 04    ; load r3, 4
 106:0 |  106 |          ; .loop:
 106:0 |  106 | 21       ; add r1, r2
 107:0 |  107 | 33 01    ; sub r3, 1
 109:0 |  109 | 40 01 06 ; jnz .loop
 10c:0 |  10c | 50       ; ret

Command Line Usage

Usage: customasm [options] <asm-file-1> ... <asm-file-N>

Options:
    -f, --format FORMAT The format of the output file. Possible formats:
                        binary, annotated, annotatedbin, binstr, hexstr,
                        bindump, hexdump, mif, intelhex, deccomma, hexcomma,
                        decc, hexc, logisim8, logisim16
                        
    -o, --output FILE   The name of the output file.
    -s, --symbol FILE   The name of the output symbol file.
    -p, --print         Print output to stdout instead of writing to a file.
    -q, --quiet         Suppress progress reports.
    -v, --version       Display version information.
    -h, --help          Display this information.