Unasm
UnAsm is a language created by User:Normalcat, made as a joke to see how fast they could make a readable esolang. It is quite simple, while also being much more difficult to write practical programs than many other esoteric programming languages
Syntax
The syntax in UnAsm is purposely extremely simple, spacing does not matter, as long as each command is separated via a newline or semicolon. UnAsm uses two registers to work with data, which can be saved/loaded using saveVars & loadVars. Almost all commands have a version for the first and second register. For conservation of length the r1 versions will only be shown, but the r2 versions do exist. This does not include out and outc, which only print the data from register 1.
The commands are as follows:
Command | Description |
---|---|
r1 | Sets the value of register 1 to the value provided. |
r1+ | Adds 1 to register 1. |
r1- | Removes 1 from register 1. |
r1* | Multiplies register 1 by register 2. |
r1/ | Divides register 1 by register 2. |
r1= | Sets register 1 to 0. |
r1# | Sets register 1 to a random integer between 0 (inclusive) and 256 (exclusive). |
r1r2 | Sets register 1 to the value of register 2, applies the other way aswell. |
lbl | Creates a label to jump to, with the name provided, note that this is interpreted so you cannot jump to later labels unless they have already ran and you have jumped back. |
jmp | Jumps to a label of the given name. |
rjmp | Jumps to a completely random line, including jumping to the line that ran it. |
quit | Ends the program. |
src | Prints the source code of the interpreter. |
out | Outputs register 1's value. |
outc | Outputs register 1's value as an ASCII character, however this may change depending on the interpreter. |
swap | Sets register 1 to register 2's value, and register 2 to register 1's value. |
cmp | Runs the next line only if register 1 is larger than register 2, otherwise it will skip the next line and move on. If r1/r2 aren't numbers, this should be treated as a nop. |
saveVars | Saves r1 & r2 to an in-memory slot args[0] |
loadVars | Loads r1 & r2 from an in-memory slot args[0] |
jseval | Evaluates the arguments passed using the JS eval function & puts their return value in the r1 register. Note that this may not be available in non-JS interpereters & some may require you to specify an option to enable this functionality |
Commands/Instructions that aren't known about should be ignored.
Code examples
A simple hello world program,
r1 72; outc r1 101; outc r1 108; outc; outc r1 111; outc r1 32; outc r1 87; outc r1 111; outc r1 114 ;outc r1 108; outc r1 100; outc r1 33; outc
A program to count up starting at 0, printing newlines between each number.
r2 10 lbl Loop r1+ out swap outc swap jmp Loop
Interpreters
Unasm's original interpreter (written in JavaScript), by User:Normalcat can be found at it's Github Page
A typescript recode of said interpreter, written by User:MokiyCodes, can be found in 3 forms; a library, a web-demo & a CLI. Note it includes some non-official instructions as found here