[08] Fixes frame restoration, so return works properly now

This commit is contained in:
Nemo 2020-06-04 00:48:54 +05:30
parent b052ab617c
commit 91b8ef006e
4 changed files with 96 additions and 26 deletions

View File

@ -120,6 +120,6 @@ wc -l file.hack
## Function Calling Commands ## Function Calling Commands
- [ ] `SimpleFunction.vm` - [x] `SimpleFunction.vm` (128)
- [ ] `FibonacciElement.vm` - [ ] `FibonacciElement.vm`
- [ ] `StaticsTest.vm` - [ ] `StaticsTest.vm`

View File

@ -78,21 +78,52 @@ A=A-1
M=M-D M=M-D
@SP @SP
M=M-1 // end sub (L8) M=M-1 // end sub (L8)
@SP
A=M-1
D=M
@ARG
A=M
M=D
@ARG @ARG
D=M+1 D=M+1
@SP @SP
M=D // @SP = ARG+1 M=D // @SP = ARG+1
@LCL @LCL
D=M // D=@LCL D=M
@THAT @R13
MD=D-1 // THAT = LCL-1 M=D // Save LCL to R13
@THIS A=D-1 // A=*LCL-1
MD=D-1 // THIS = LCL-2 D=M // D=*(*LCL-1)
@ARG @THAT // A=THAT
MD=D-1 // ARG = LCL-3 M=D // *that = *(*lcl-1)
@LCL @R13
MD=D-1 // LCL = LCL-4 A=M-1
A=D-1 // A = LCL-5 A=A-1 // A=*LCL-2
D=M // D=*(*LCL-2)
@THIS // A=THIS
M=D // *THIS = *(*lcl-2)
@R13
A=M-1
A=A-1
A=A-1 // A=*LCL-3
D=M // D=*(*LCL-3)
@ARG // A=ARG
M=D // *ARG = *(*lcl-3)
@R13
A=M-1
A=A-1
A=A-1
A=A-1 // A=*LCL-4
D=M // D=*(*LCL-4)
@LCL // A=LCL
M=D // *LCL = *(*lcl-4)
@R13
A=M-1
A=A-1
A=A-1
A=A-1
A=A-1 // A=*LCL-5
A=M // A=*(*LCL-5)
0;JMP // Jump to *(LCL-5) 0;JMP // Jump to *(LCL-5)
@97 @128
0;JMP 0;JMP

View File

@ -1 +1,2 @@
| RAM[0] | RAM[1] | RAM[2] | RAM[3] | RAM[4] |RAM[310]| | RAM[0] | RAM[1] | RAM[2] | RAM[3] | RAM[4] |RAM[310]|
| 311 | 305 | 300 | 3010 | 4010 | 1196 |

View File

@ -14,26 +14,64 @@ class CodeWriter {
public function writeReturn() { public function writeReturn() {
$this->write([ $this->write([
"@SP",
"A=M-1",
"D=M",// Popped value to D
// And then write it to *ARG = pop()
"@ARG",
"A=M",
"M=D",
// SP=ARG+1 // SP=ARG+1
"@ARG", "@ARG",
"D=M+1", "D=M+1",
"@SP", "@SP",
"M=D // @SP = ARG+1", "M=D // @SP = ARG+1",
// THAT = LCL-1
"@LCL", "@LCL",
"D=M // D=@LCL", "D=M",
"@THAT", "@R13",
"MD=D-1 // THAT = LCL-1", "M=D // Save LCL to R13",
// THIS = LCL-2
"@THIS", // now we go restoring THAT, THIS, ARG, LCL
"MD=D-1 // THIS = LCL-2", "A=D-1 // A=*LCL-1",
// ARG = LCL-3 "D=M // D=*(*LCL-1)",
"@ARG", "@THAT // A=THAT",
"MD=D-1 // ARG = LCL-3", "M=D // *that = *(*lcl-1)",
// LCL = LCL-4 // now we restore THIS
"@LCL", "@R13",
"MD=D-1 // LCL = LCL-4", "A=M-1",
"A=D-1 // A = LCL-5", "A=A-1 // A=*LCL-2",
"D=M // D=*(*LCL-2)",
"@THIS // A=THIS",
"M=D // *THIS = *(*lcl-2)",
// now we restore ARG
"@R13",
"A=M-1",
"A=A-1",
"A=A-1 // A=*LCL-3",
"D=M // D=*(*LCL-3)",
"@ARG // A=ARG",
"M=D // *ARG = *(*lcl-3)",
// now we restore LCL
"@R13",
"A=M-1",
"A=A-1",
"A=A-1",
"A=A-1 // A=*LCL-4",
"D=M // D=*(*LCL-4)",
"@LCL // A=LCL",
"M=D // *LCL = *(*lcl-4)",
// Now we hyperjump
"@R13",
"A=M-1",
"A=A-1",
"A=A-1",
"A=A-1",
"A=A-1 // A=*LCL-5",
"A=M // A=*(*LCL-5)",
"0;JMP // Jump to *(LCL-5)", "0;JMP // Jump to *(LCL-5)",
]); ]);
} }