desmos-computer/README.md

64 lines
5.9 KiB
Markdown

# desmos-computer
## What is this?
- a client-server architecture for synchronizing a file containing Desmos expressions to a graph, (`cli/lib/server.py` and `cli/lib/clientside.py`)
- an instruction set architecture for Turing machines whose cells contain IEEE 754 compliant integers in each cell, (`cli/data/computer.py`)
- an assembler for that instruction set architecture, (not yet!)
- and other utilities. (disassembler, etc.)
## How does the ISA work?
The 'CPU', implemented in Desmos, takes in a list (aka an array, Turing tape, etc.) and starts execution at cell 1 (lists have 1-based indexes in Desmos).
The list also serves as the memory, as well. (Think like Befunge's `p` command.)
*Todo: disconnect opcode definitions and opcodes from the actual CPU implementation. Because of this, don't rely on this table! Check the implementation in `data/computer.desmos`.*
| Instruction mnemonic | Behavior | First parameter | Second parameter | Third parameter |
|-|-|-|-|-|
| `jmp` | Modify the instruction pointer and continue execution at the new location. | New instruction pointer | *n/a* | *n/a* |
| `add` | Take the values in addresses `a` and `b` and add them; store the result in address `c`. | address `a` | address `b` | address `c` |
| `sub` | See `add` instruction. | *ld.* | *ld.* | *ld.* |
| `div` | See `add` instruction. | *ld.* | *ld.* | *ld.* |
| `mul` | See `add` instruction. | *ld.* | *ld.* | *ld.* |
| `cmp` | Compare the numbers in `a` and `b`. If `a` > `b`, set the greater than flag. Ditto for equals and less operators, as well. | address `a` | address `b` | *n/a* |
| `rst` | Clear the equals, greater, and less than flags. | *n/a* | *n/a* | *n/a* |
| `eld` | Write the state of the equals flag to address `a`. If it's set, than `1` is written; `0` otherwise. | address `a` | *n/a* | *n/a* |
| `gld` | Same as `eld`, but for the greater than flag. | *ld.* | *n/a* | *n/a* |
| `lld` | Same as `eld`, but for the less than flag. | *ld.* | *n/a* | *n/a* |
| `be` | Branch to address `a` if the equal flag is set. | address `a` | *n/a* | *n/a* |
| `bne` | Same as `be`, but the !equal flag. | *ld.* | *n/a* | *n/a* |
| `bg` | Same as `be`, but the greater than flag. | *ld.* | *n/a* | *n/a* |
| `bl` | Same as `be`, but the less than flag. | *ld.* | *n/a* | *n/a* |
| `sto` | STOre the immediate value `v` into address `a`. | `v` | address `a` | *n/a* |
| `mov` | MOVe the value in the address `a` into address `b`. | address `a` | address `b` | *n/a* |
There are some other instructions, like `psto` and similar variants. They're experimental.
## Instruction design in general
Things we're optimizing for:
- *Pack as many things into one instruction as possible.* Execution of stuff in instructions is cheap, but each instruction execution is expensive.
- *No stacks.* Stacks require too much computation on the ISA side itself that isn't provided by the Desmos 'standard library' of instructions.
In general: *embed the intelligence into the machine code, **not** the CPU/ISA!*
## Things to do
- [x] Write a test suite for the various instruction of the ISA executing *in Desmos*
- [ ] Write an assembler to compile a custom Assembly language to native Desmos list format.
- [ ] Simplify all this into a command line tool.
- [x] Simplify the synchronization stack.
- [ ] Write documentation for all of this.
## Running tests
- Enter the nix-shell, then start a web browser.
- Navigate to `https://desmos.com/calculator`, and open the dev console
- Run `python3 -m cli sync -c` to copy the userscript to your clipboard
- Run the userscript in the console
- Run `python3 -m unittest ./cli/tests/isa.py`, or other test groups if needed
- Keep the Desmos tab focused, as it may impede the ISA testing process
## License
This project is licensed under the AGPLv3. See the `LICENSE` file for more information.
Copyright rndusr, randomuser, stupidcomputer 2024.