Varvara
This article is incomplete. You can help this wiki by expanding it.
Varvara is a fantasy computer system that uses runs a stack-based virtual machine called Uxn. Its main programming language is a Forth-like language called Uxntal.
Uxn
Memory
The Uxn virtual CPU can address 64kb of memory; programs can move stacks into addressable range to allow reading and writing directly into stack memory. In this way, peripherals such as a controller, mouse, and keyboard can be addressed.
Memory | RAM | Data | 64kb |
---|---|---|---|
Stacks | Working Stack | Data | 254 bytes |
Error | 1 byte | ||
Pointer | 1 byte | ||
Return Stack | Data | 254 bytes | |
Error | 1 byte | ||
Pointer | 1 byte | ||
I/O | Devices | Data | 256 bytes |
Uxn is a single-page virtual machine with 32 opcodes. This system has no registers, and instead uses a 127-level stack.
Devices
Devices are external systems connected to the Uxn CPU, such as the screen, the mouse and the keyboard. Each device has 16 bytes, also called ports, of I/O memory. Vectors are ports holding an address in memory to evaluate when a device event is triggered, such as when the mouse is moved, or a key is pressed.
- 00 - System device
- 10 - Console device
- 20 - Screen device
- 30, 40, 50, 60 - Audio device
- 70 - MIDI device
- 80 - Controller
- 90 - Mouse
- a0, b0 - File
- c0 - Datetime
- d0 - Unused
- e0, f0 - Reserved
The two reserved devices can be used for implementation specific features that do not need to be part of the specs, or other Uxn/Varvara instances.
Uxntal
According to the implentation spec, "Tal is the programming language for the Uxn virtual machine." Tal, commonly referred to as Uxntal, is a unique flavor of assembly language. Uxntal source files are assembled from human-readable source files into Uxn-compatible ROM files with the .tal extension.
The language itself works similarly to Forth, another stack-based language.
Opcodes
Uxn can perform 32 different operations, and each operation has 3 possible modes. The items in the following table include the Program Counter(PC), Memory(M), Devices(D) and Return Stack(rs).
Stack | Memory | ||
---|---|---|---|
BRK/LIT - Literal | a b c M[PC+1] | LDZ - Load Zeropage | a b M[c8] |
INC - Increment | a b c+1 | STZ - Save Zeropage | a {M[c8]=b} |
POP - Pop | a b | LDR - Load Rel | a b M[PC+c8] |
NIP - Nip | a c | STR - Save Rel | a {M[PC+c8]=b} |
SWP - Swap | a c b | LDA - Load Abs | a b M[c16] |
ROT - Rotate | c b a | STA - Save Abs | a {M[c16]=b} |
DUP - Duplicate | a b c c | DEI - Device In | a b D[c8] |
OVR - Over | a b c b | DEO - Device Out | a {D[c8]=b} |
Logic | Arithmetic | ||
EQU - Equal | a b?c | ADD - Add | a b+c |
NEQ - Not Equal | a b!c | SUB - Subtract | a b-c |
GTH - Greater | a b>c | MUL - Multiply | a b*c |
LTH - Lesser | a b<c | DIV - Divide | a b/c |
JMP - Jump |
a b {PC+=c} | AND - And | a b&c |
JCN - JumpCond | a {(b8)PC+=c} | ORA - Or | a b|c |
JSR - JumpStash | a b {rs.PC PC+=c} | EOR - ExclusiveOr | a b^c |
STH - Stash | a b {rs.c} | SFT - Shift | a b>>c8l<<c8h |