- a client-server architecture for synchronizing a file containing Desmos expressions to a graph, (
cli/lib/server.pyandcli/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.)
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.
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!
- Write a test suite for the various instruction of the ISA executing in Desmos
- Make the test suite reliable.
- Write an assembler to compile a custom Assembly language to native Desmos list format.
- Simplify all this into a command line tool.
- Simplify the synchronization stack.
- Write documentation for all of this.
- 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 -cto copy the userscript to your clipboard - Run the userscript in the console
- Run
main()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
A note: the test suite might fail if you run it weirdly. If it fails, run it again. It might work, in which case you're good.
(This is cursed and I know it.)
This project is licensed under the AGPLv3. See the LICENSE file for more information.
Copyright rndusr, randomuser, stupidcomputer 2024.