stupidcomputer
ee93c4db4c
added more tests to the ISA -- covers all the instructions except RST (reset). fixed a bug in the ISA -- when comparing two numbers, we really compared their pointers. in C, it's the difference between ``` int a = 10; int b = 12; int *ap = &a; int *bp = &b; if (ap < bp) { /* do stuff */ } ``` the problem is that you're comparing the pointers, *not* the values they refer to. it instead should be like if (*ap < *bp) { /* do stuff */ } because you need to *dereference* the value before comparing. that's what happens in cli/data/computer.py now. |
||
---|---|---|
.vscode | ||
cli | ||
computer-spec | ||
.gitignore | ||
LICENSE | ||
README.md | ||
pyproject.toml | ||
setup.py | ||
shell.nix |
README.md
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.