@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)
@4
D=A
@SP
A=M
M=D
@SP
M=M+1
//push CONSTANT
@Main.fibonacci2RA
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
@1
D=D-A
@5
D=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Main.fibonacci
0;JMP
(Main.fibonacci2RA)
//CALLFUNC
(Sys.init$WHILE)
//LABEL
@Sys.init$WHILE
0;JMP
//GOTO
(Main.fibonacci)
@0
D=A
@ARG
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
//push ARGUMENT
@2
D=A
@SP
A=M
M=D
@SP
M=M+1
//push CONSTANT
@SP
M=M-1
A=M
D=M
A=A-1
D=M-D
@TRUE0
D;JLT
@SP
A=M
A=A-1
M=0
@FALSE0
0;JMP
(TRUE0)
@SP
A=M
A=A-1
M=-1
(FALSE0)
//LT
@SP
M=M-1
A=M
D=M
@Main.fibonacci$IF_TRUE
D;JNE
//IFGOTO
@Main.fibonacci$IF_FALSE
0;JMP
//GOTO
(Main.fibonacci$IF_TRUE)
//LABEL
@0
D=A
@ARG
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
//push ARGUMENT
@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
(Main.fibonacci$IF_FALSE)
//LABEL
@0
D=A
@ARG
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
//push ARGUMENT
@2
D=A
@SP
A=M
M=D
@SP
M=M+1
//push CONSTANT
@SP
M=M-1
A=M
D=M
A=A-1
M=M-D
//SUB
@Main.fibonacci0RA
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
@1
D=D-A
@5
D=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Main.fibonacci
0;JMP
(Main.fibonacci0RA)
//CALLFUNC
@0
D=A
@ARG
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
//push ARGUMENT
@1
D=A
@SP
A=M
M=D
@SP
M=M+1
//push CONSTANT
@SP
M=M-1
A=M
D=M
A=A-1
M=M-D
//SUB
@Main.fibonacci1RA
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
@1
D=D-A
@5
D=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Main.fibonacci
0;JMP
(Main.fibonacci1RA)
//CALLFUNC
@SP
M=M-1
A=M
D=M
A=A-1
M=M+D
//ADD
@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
