Code for the littler Buttons the Computer used in the Turing Machine portion of the book.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
Zed A. Shaw 182d9143ad The first version of buttons was a joke. 4 years ago
__tests__ The first version of buttons was a joke. 4 years ago
cypress Initial start of Buttons Computer on its own project. 4 years ago
sass Better design and lots of little fixes all over. 4 years ago
src The first version of buttons was a joke. 4 years ago
static Better design and lots of little fixes all over. 4 years ago
.gitignore Initial start of Buttons Computer on its own project. 4 years ago
LICENSE The official license. 4 years ago
README.md The first version of buttons was a joke. 4 years ago
cypress.json Initial start of Buttons Computer on its own project. 4 years ago
ecosystem.config.js Initial start of Buttons Computer on its own project. 4 years ago
gulpfile.js Initial start of Buttons Computer on its own project. 4 years ago
package-lock.json Initial start of Buttons Computer on its own project. 4 years ago
package.json The first version of buttons was a joke. 4 years ago
rollup.config.js Initial start of Buttons Computer on its own project. 4 years ago

README.md

Buttons the Computer

This is a simple demo project for the Learn JS the Hard Way Course 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 "clicks" 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 clicks 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:

PUSH 1
PUSH 2
ADD
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.

Feature Requests

Currently have the following feature requests:

  1. SWAP operation would simplify a lot of calculations.
  2. A share this code link to share the code with others.
  3. PEEK and POKE for writing to a RAM spot.
  4. IN and OUT for reading and writing numbers.
  5. Edit it as CODE instead of clicking if you want.
  6. Better line number display.