|
|
|
# Buttons the Computer
|
|
|
|
|
|
|
|
This is a simple demo project for the [Learn JS the Hard Way Course](https://learnjsthehardway.com)
|
|
|
|
and also the implementation of the first module introducing the concept of a Turing Machine. In the
|
|
|
|
beginning of the course I'll be introducing a very simple little computer that is a functional
|
|
|
|
Turing Machine, although not something you'd actually want to use. It's purpose is to show how
|
|
|
|
basic computation works, and to provide a simple assembly language anyone can understand. It also
|
|
|
|
provides a simply UI that you can code the computer by only clicking on buttons.
|
|
|
|
|
|
|
|
This project was implemented in one day on a Saturday while playing Diablo III on breaks. If you
|
|
|
|
find bugs awesome, let me know. I'll most likely find more as I work on it, but don't expect this
|
|
|
|
to be a billion dollar project.
|
|
|
|
|
|
|
|
# The Machine
|
|
|
|
|
|
|
|
Buttons is a simple stack machine with arbitrary registers and a limited amount of power known as
|
|
|
|
"ticks" of which you have 128. What does that mean in practice?
|
|
|
|
|
|
|
|
1. You do most of your calculations by working a stack with PUSH and POP.
|
|
|
|
2. You can store things in a register and name that register anything you want.
|
|
|
|
3. Every operation takes 1 tick to process.
|
|
|
|
4. You have only 128 ticks to complete your calculation.
|
|
|
|
5. You can do all of this with only a single mouse with two buttons.
|
|
|
|
6. The data type for the stack is whatever JavaScript does with numbers.
|
|
|
|
|
|
|
|
|
|
|
|
# Operations
|
|
|
|
|
|
|
|
The current operations are:
|
|
|
|
|
|
|
|
* ADD - Add the two numbers on the top of the stack, replace them with the result.
|
|
|
|
* SUB - Subtract just like add.
|
|
|
|
* DIV - Divide just like add.
|
|
|
|
* MUL - Multiply just like add.
|
|
|
|
* MOD - Modulus just like add.
|
|
|
|
* POP - Take the top of the stack off and throw it away.
|
|
|
|
* PUSH - Push a new value onto the stack.
|
|
|
|
* HALT - Stop the computer with a message, probably an error.
|
|
|
|
* JUMP - Jump to a line number. Lines start at 0.
|
|
|
|
* JZ - JUMP but only if the top of the stack is 0.
|
|
|
|
* JNZ - JUMP but only if the top of the stack IS NOT 0.
|
|
|
|
* CLR - Clear the machine, kind of a soft reset, good for debugging in a loop.
|
|
|
|
* STOR - Take the top of the stack and assign it to a register by a name.
|
|
|
|
* RSTOR - Take the named register and push it onto the stack.
|
|
|
|
|
|
|
|
# Samples
|
|
|
|
|
|
|
|
You can try these example programs out at [buttons.computer](https://buttons.computer):
|
|
|
|
|
|
|
|
```asm
|
|
|
|
PUSH 1
|
|
|
|
PUSH 2
|
|
|
|
ADD
|
|
|
|
```
|
|
|
|
|
|
|
|
```asm
|
|
|
|
PUSH 1
|
|
|
|
PUSH 1
|
|
|
|
ADD
|
|
|
|
JUMP 1
|
|
|
|
```
|
|
|
|
|
|
|
|
```
|
|
|
|
PUSH 20
|
|
|
|
PUSH 1
|
|
|
|
SUB
|
|
|
|
JZ 5
|
|
|
|
JUMP 1
|
|
|
|
```
|
|
|
|
|
|
|
|
```
|
|
|
|
PUSH -20
|
|
|
|
PUSH 1
|
|
|
|
ADD
|
|
|
|
JNZ 5
|
|
|
|
JUMP 1
|
|
|
|
```
|
|
|
|
|
|
|
|
```
|
|
|
|
PUSH 100
|
|
|
|
STOR AX
|
|
|
|
PUSH 50
|
|
|
|
ADD
|
|
|
|
RSTOR AX
|
|
|
|
SUB
|
|
|
|
```
|
|
|
|
|
|
|
|
```
|
|
|
|
PUSH 0
|
|
|
|
STOR AX
|
|
|
|
RSTOR BAD NAME
|
|
|
|
PUSH 100
|
|
|
|
ADD
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
# License
|
|
|
|
|
|
|
|
This software is fully Copyright (C) Zed A. Shaw 2020. It's like a painting at a museum. You can
|
|
|
|
look at it and admire its beauty, but you don't own it and can't take it home with you.
|
|
|
|
|
|
|
|
|