650 lines
4.0 KiB
NASM
Executable File
650 lines
4.0 KiB
NASM
Executable File
@256
|
|
D=A
|
|
@SP
|
|
M=D
|
|
@MainLoopXYZRA
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@LCL
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@ARG
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THIS
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THAT
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP
|
|
D=M
|
|
@0
|
|
D=D-A
|
|
@5
|
|
D=D-A
|
|
@ARG
|
|
M=D
|
|
@SP
|
|
D=M
|
|
@LCL
|
|
M=D
|
|
@Sys.init
|
|
0;JMP
|
|
(MainLoopXYZRARA)
|
|
//CALLFUNC
|
|
(Sys.init)
|
|
@6
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push CONSTANT
|
|
@8
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push CONSTANT
|
|
@Class1.set5RA
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@LCL
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@ARG
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THIS
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THAT
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP
|
|
D=M
|
|
@2
|
|
D=D-A
|
|
@5
|
|
D=D-A
|
|
@ARG
|
|
M=D
|
|
@SP
|
|
D=M
|
|
@LCL
|
|
M=D
|
|
@Class1.set
|
|
0;JMP
|
|
(Class1.set5RA)
|
|
//CALLFUNC
|
|
@SP
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@5
|
|
M=D
|
|
//pop TMP
|
|
@23
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push CONSTANT
|
|
@15
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push CONSTANT
|
|
@Class2.set6RA
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@LCL
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@ARG
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THIS
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THAT
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP
|
|
D=M
|
|
@2
|
|
D=D-A
|
|
@5
|
|
D=D-A
|
|
@ARG
|
|
M=D
|
|
@SP
|
|
D=M
|
|
@LCL
|
|
M=D
|
|
@Class2.set
|
|
0;JMP
|
|
(Class2.set6RA)
|
|
//CALLFUNC
|
|
@SP
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@5
|
|
M=D
|
|
//pop TMP
|
|
@Class1.get7RA
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@LCL
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@ARG
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THIS
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THAT
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP
|
|
D=M
|
|
@0
|
|
D=D-A
|
|
@5
|
|
D=D-A
|
|
@ARG
|
|
M=D
|
|
@SP
|
|
D=M
|
|
@LCL
|
|
M=D
|
|
@Class1.get
|
|
0;JMP
|
|
(Class1.get7RA)
|
|
//CALLFUNC
|
|
@Class2.get8RA
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@LCL
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@ARG
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THIS
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THAT
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP
|
|
D=M
|
|
@0
|
|
D=D-A
|
|
@5
|
|
D=D-A
|
|
@ARG
|
|
M=D
|
|
@SP
|
|
D=M
|
|
@LCL
|
|
M=D
|
|
@Class2.get
|
|
0;JMP
|
|
(Class2.get8RA)
|
|
//CALLFUNC
|
|
(Sys.init$WHILE)
|
|
//LABEL
|
|
@Sys.init$WHILE
|
|
0;JMP
|
|
//GOTO
|
|
(Class1.set)
|
|
@0
|
|
D=A
|
|
@ARG
|
|
A=M+D
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push ARGUMENT
|
|
@SP
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@Class1.0
|
|
M=D
|
|
//pop STATIC
|
|
@1
|
|
D=A
|
|
@ARG
|
|
A=M+D
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push ARGUMENT
|
|
@SP
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@Class1.1
|
|
M=D
|
|
//pop STATIC
|
|
@0
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push CONSTANT
|
|
@LCL
|
|
D=M
|
|
@R13
|
|
M=D
|
|
@5
|
|
D=A
|
|
@R13
|
|
D=M-D
|
|
A=D
|
|
D=M
|
|
@R14
|
|
M=D
|
|
@SP
|
|
A=M-1
|
|
D=M
|
|
@ARG
|
|
A=M
|
|
M=D
|
|
@ARG
|
|
D=M+1
|
|
@SP
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@THAT
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@THIS
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@ARG
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@LCL
|
|
M=D
|
|
@R14
|
|
A=M
|
|
0;JMP
|
|
//RETURN
|
|
(Class1.get)
|
|
@Class1.0
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push STATIC
|
|
@Class1.1
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push STATIC
|
|
@SP
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
A=A-1
|
|
M=M-D
|
|
//SUB
|
|
@LCL
|
|
D=M
|
|
@R13
|
|
M=D
|
|
@5
|
|
D=A
|
|
@R13
|
|
D=M-D
|
|
A=D
|
|
D=M
|
|
@R14
|
|
M=D
|
|
@SP
|
|
A=M-1
|
|
D=M
|
|
@ARG
|
|
A=M
|
|
M=D
|
|
@ARG
|
|
D=M+1
|
|
@SP
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@THAT
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@THIS
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@ARG
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@LCL
|
|
M=D
|
|
@R14
|
|
A=M
|
|
0;JMP
|
|
//RETURN
|
|
(Class2.set)
|
|
@0
|
|
D=A
|
|
@ARG
|
|
A=M+D
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push ARGUMENT
|
|
@SP
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@Class2.0
|
|
M=D
|
|
//pop STATIC
|
|
@1
|
|
D=A
|
|
@ARG
|
|
A=M+D
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push ARGUMENT
|
|
@SP
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@Class2.1
|
|
M=D
|
|
//pop STATIC
|
|
@0
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push CONSTANT
|
|
@LCL
|
|
D=M
|
|
@R13
|
|
M=D
|
|
@5
|
|
D=A
|
|
@R13
|
|
D=M-D
|
|
A=D
|
|
D=M
|
|
@R14
|
|
M=D
|
|
@SP
|
|
A=M-1
|
|
D=M
|
|
@ARG
|
|
A=M
|
|
M=D
|
|
@ARG
|
|
D=M+1
|
|
@SP
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@THAT
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@THIS
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@ARG
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@LCL
|
|
M=D
|
|
@R14
|
|
A=M
|
|
0;JMP
|
|
//RETURN
|
|
(Class2.get)
|
|
@Class2.0
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push STATIC
|
|
@Class2.1
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
//push STATIC
|
|
@SP
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
A=A-1
|
|
M=M-D
|
|
//SUB
|
|
@LCL
|
|
D=M
|
|
@R13
|
|
M=D
|
|
@5
|
|
D=A
|
|
@R13
|
|
D=M-D
|
|
A=D
|
|
D=M
|
|
@R14
|
|
M=D
|
|
@SP
|
|
A=M-1
|
|
D=M
|
|
@ARG
|
|
A=M
|
|
M=D
|
|
@ARG
|
|
D=M+1
|
|
@SP
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@THAT
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@THIS
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@ARG
|
|
M=D
|
|
@R13
|
|
M=M-1
|
|
A=M
|
|
D=M
|
|
@LCL
|
|
M=D
|
|
@R14
|
|
A=M
|
|
0;JMP
|
|
//RETURN
|