[08] Fixes frame restoration, so return works properly now
This commit is contained in:
parent
b052ab617c
commit
91b8ef006e
|
@ -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`
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 |
|
||||||
|
|
|
@ -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)",
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue