[08] Update notes

This commit is contained in:
Nemo 2020-06-09 00:00:12 +05:30
parent aed6f0a372
commit 2a27bff08c
2 changed files with 8 additions and 9 deletions

View File

@ -67,10 +67,17 @@ I think there are definitely some tricks with reducing lookup table sizes, but I
# VM (1)
See `vm/README.md` for more details. Observations go here, implementation notes are there.
The implementation is written in Modern PHP with static typing. Uses the following 3 classes
- `CommandType` as a Enum for using command types as constants
- `Parser`, mostly as defined in the specification
- `CodeWriter`, mostly as defined in the specification
- `VMTranslator` which combines the above
# VM (2)
Learnt quite a lot. Interesting gotchas:
1. Stack manipuation is hard. Keeping track of registers is hard. I was going by the diagrams which always have "arguments" going from 0..n, which screws up the one case where you don't have arguments for a function, and ARG points to the same location where the return address is stored. In case the VM writes the return value to ARG[0], and you have zero arguments - it will also overwrite the return address, and your whole stack will go haywire (I got cool designs on my screen because of this).
2. I got into a weird state where FibonacciElement test was passing, but the SimpleFunction was failing for me. Ended up wasting a lot of time reverting back and forth to figure out the differences. If you're stuck here, check the [project page](https://www.nand2tetris.org/project08) for details on the intermediate `NestedCall.vm` testcase, which comes with a [detailed survival guide](https://www.nand2tetris.org/copy-of-hdl-survival-guide) and RAM states at various points in the call history: https://www.nand2tetris.org/copy-of-nestedcall.

View File

@ -27,11 +27,3 @@ Register | Name | Usage
`RAM[4]` | `THAT` | `that`
RAM[5-12] | `temp` Segment
RAM[13-15]| General Purpose Registers
The implementation is written in Modern PHP with static typing. Uses the following 3 classes
- `CommandType` as a Enum for using command types as constants
- `Parser`, mostly as defined in the specification
- `CodeWriter`, mostly as defined in the specification
- `VMTranslator` which combines the above