UM8

UM8 a virtual machine created by User:Palaiologos for the Esolang Reverse Engineering Contest. The contest has finished in July 2020.

It contains 13 instructions ranging from 0x0 to 0xd. The original interpreter will take ASCII hexadecimal input from stdin (in uppercase). If it encounters something else than [0-9A-D] it will stop taking input and proceed to execution.

The machine contains 3 registers: A, B and C. The instruction sets permits self-modification of the program buffer, implying the program buffer can also be used as a tape for data storage or just modifying code in general.

Instruction set (credit: Gibson)

The instruction reference is written as some pseudo-code.

• a, b, c are the registers
• pc is the program counter
• [expr] points at (expr) in the program buffer
• ; are comments/notes from me
```0 -> exit()
1 -> if (b) a = c
2 -> swap a, c
3 -> a = ~(b&c) ; NAND gate
4 -> putchar(b)
5 -> b = getchar()
6 -> swap a, b
7 -> a = [pc+c+1]
8 -> [pc+a+1] = b
9 -> a = [++pc]
A -> pc = b, [pc] = c
B -> a = !a ; logic NOT
C -> a >>= 1
D -> a <<= 1
```

NOTE Due to the way the interpreter is implemented, A jumps to b+1 and not b. However, [b] will still be set to c.

Example Programs

Cat

```154906A
```

Here is a commented disassembly to understand it better:

```1  | if (b) a = c      ; "dummy" instruction
5  | b = getchar()     ; get character from stdin
4  | putchar(b)        ; prints it
90 | a = 0
6  | a, b = b, a       ; sets b to 0
A  | pc = b, [pc] = c  ; jumps to 1, modifying the "dummy" instruction.
```

Hello World

```9169BDD6496D2163D2163D2163D216364962163DD2163DD64962163D
D2163DD64962163DDDD216364952163D2163DD6498DD6495D2163DDD
216364962163DDDD21636497DD2163D2163D64962163DD2163DD6496
D2163D2163DD6498D2163D21636495D64
```

Explainations here.

Cat halting on EOF

```942986A649629D516A
```

Truth machine

```56649C891232616369129AD1690A
```

Implementations

The original implementations from User:Palaiologos are available here.

User:Matthilde's reverse-engineering writeup and C99 implementation is available in this git repo.