## wo: A truth machine in wo3

In `wo3`, we get two extra instructions for a total of four. OISCs can be Turing complete, so four instructions should be enough to give us some brunt. At this point, some amount of math is probably a good idea. Instruction three, then, is `ADD`, which does what you think it does. Since we’re capable of entering negatives, we can pretty much get to any number we want at this point, albeit terribly inefficiently.

Branching would be very convenient at this point as well, so a simple `SKIPZERO` instruction gets the no. 4 position; it pops a value from the stack and if that value is zero, it skips until past the next instruction. All odd (input) words are skipped until an even (instruction) word is encountered, at which point that is skipped and the next word is interpreted. `Skip if zero` is a standard simple conditional branch, but I’ll likely change this to `skip if (skip register)`, so a user can theoretically set the branch condition via a register (with a command certain to be available in `wo4`).

`wo3` allows us to write a two-byte truth machine. A truth machine is a miniature programming exercise to demonstrate io, conditionals, and branching. Given an input of 0 or 1, it either prints `0` and exits, or infinitely prints `1`, respectively. It’s worth pointing out now that the default value of the primary stack in `wo` is MNum, but upon invocation a use will be able to set the initial stack to whatever they’d like — a primitive form of input. We can fit three words (two complete) in a `wo3` byte, so `000` (Print Stack), `110` (SKIPZERO), `001` (Input ‘0’), and `010` (GOTO) fill up a byte and a half, and since we’ll never print it, we can pad the last four bits with input – `1111` will work. The stack will grow with every loop, but it will act as a truth machine as far as a user is concerned; it prints the stack, if the top of the stack is not zero it `GOTO`s word zero. `0001100010101111`: two bytes, `‰ŕ` in Cork1.

### Current Instruction Set:

0, 0, PRNTPST:
Print the contents of the primary stack (PST)
1, 1, GOTO:
Pop top of stack, go to corresponding word
MNum: Go to word indicated by storage register R2 (more on this later)
Nonexistent word exits
Pop two values off of the stack, push their sum
3, 11, SKIPZERO:
Pop one value off of the stack, if == 0, skip all words through next instruction

1. Unsure of the best encoding to use to represent the data. Single-byte encodings with few non-printing characters are ideal. Cork, to my knowledge, has only the soft hyphen and zero-width space. ↩︎

this post is part of the series, wo:
1. Introduction
2. Word size
3. Numbers
4. A truth machine in wo3
5. Implementing the interpreter
6. Stacks
7. Registers
8. 9-byte modulo