[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) # 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) # VM (2)
Learnt quite a lot. Interesting gotchas: 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). 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[4]` | `THAT` | `that`
RAM[5-12] | `temp` Segment RAM[5-12] | `temp` Segment
RAM[13-15]| General Purpose Registers 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