desmos-computer/README.md

5.5 KiB

desmos-computer

What is this?

  • a client-server architecture for synchronizing a file containing Desmos expressions to a graph,
  • a test suite for evaluating the 'correctness' of Desmos expressions,
  • an instruction set architecture for Turing machines whose cells contain IEEE 754 compliant integers in each cell,
  • an assembler for that instruction set architecture,
  • and other utilities.

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

  • Write a test suite for evaluating arbitrary Desmos expressions and getting their expected outputs.
  • 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.

License

This project is licensed under the AGPLv3. See the LICENSE file for more information. Copyright rndusr, randomuser, stupidcomputer 2024.