// push argument 1
@1
D=A
@ARG
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
// pop pointer 1
@SP
M=M-1
A=M
D=M
@R14
M=D
@THAT
M=D
// push constant 0
@0
D=A
@SP
A=M
M=D
@SP
M=M+1
// pop that 0
@SP
M=M-1
A=M
D=M
@R14
M=D
@0
D=A
@THAT
D=M+D
@R15
M=D
@R14
D=M
@R15
A=M
M=D
// push constant 1
@1
D=A
@SP
A=M
M=D
@SP
M=M+1
// pop that 1
@SP
M=M-1
A=M
D=M
@R14
M=D
@1
D=A
@THAT
D=M+D
@R15
M=D
@R14
D=M
@R15
A=M
M=D
// push argument 0
@0
D=A
@ARG
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
// push constant 2
@2
D=A
@SP
A=M
M=D
@SP
M=M+1
// sub  0
@SP
M=M-1
A=M
D=M
M=0
@R13
M=D
@SP
M=M-1
A=M
D=M
@R14
M=D
@R13
D=M
@R14
D=M-D
(END0)
@SP
A=M
M=D
@SP
M=M+1
// pop argument 0
@SP
M=M-1
A=M
D=M
@R14
M=D
@0
D=A
@ARG
D=M+D
@R15
M=D
@R14
D=M
@R15
A=M
M=D
// label MAIN_LOOP_START 0
($MAIN_LOOP_START)
// push argument 0
@0
D=A
@ARG
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
// if-goto COMPUTE_ELEMENT 0
@SP
M=M-1
A=M
D=M
@$COMPUTE_ELEMENT
D;JNE
// goto END_PROGRAM 0
@$END_PROGRAM
-1;JMP
// label COMPUTE_ELEMENT 0
($COMPUTE_ELEMENT)
// push that 0
@0
D=A
@THAT
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
// push that 1
@1
D=A
@THAT
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
// add  0
@SP
M=M-1
A=M
D=M
M=0
@R13
M=D
@SP
M=M-1
A=M
D=M
@R14
M=D
@R13
D=M
@R14
D=M+D
(END1)
@SP
A=M
M=D
@SP
M=M+1
// pop that 2
@SP
M=M-1
A=M
D=M
@R14
M=D
@2
D=A
@THAT
D=M+D
@R15
M=D
@R14
D=M
@R15
A=M
M=D
// push pointer 1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
// push constant 1
@1
D=A
@SP
A=M
M=D
@SP
M=M+1
// add  0
@SP
M=M-1
A=M
D=M
M=0
@R13
M=D
@SP
M=M-1
A=M
D=M
@R14
M=D
@R13
D=M
@R14
D=M+D
(END2)
@SP
A=M
M=D
@SP
M=M+1
// pop pointer 1
@SP
M=M-1
A=M
D=M
@R14
M=D
@THAT
M=D
// push argument 0
@0
D=A
@ARG
A=M+D
D=M
@SP
A=M
M=D
@SP
M=M+1
// push constant 1
@1
D=A
@SP
A=M
M=D
@SP
M=M+1
// sub  0
@SP
M=M-1
A=M
D=M
M=0
@R13
M=D
@SP
M=M-1
A=M
D=M
@R14
M=D
@R13
D=M
@R14
D=M-D
(END3)
@SP
A=M
M=D
@SP
M=M+1
// pop argument 0
@SP
M=M-1
A=M
D=M
@R14
M=D
@0
D=A
@ARG
D=M+D
@R15
M=D
@R14
D=M
@R15
A=M
M=D
// goto MAIN_LOOP_START 0
@$MAIN_LOOP_START
-1;JMP
// label END_PROGRAM 0
($END_PROGRAM)
//   0
