UNPKG

hack-emulator-js

Version:

a hack emulator for the nand2tetris project

7,803 lines (7,801 loc) 171 kB
// This file is part of www.nand2tetris.org // and the book "The Elements of Computing Systems" // by Nisan and Schocken, MIT Press. // File name: projects/06/pong/Pong.asm // The Pong game program was originally written in the high-level Jack language. // The Jack code was then translated by the Jack compiler into VM code. // The VM code was then translated by the VM translator into the Hack // assembly code shown here. @256 D=A @SP M=D @133 0;JMP @R15 M=D @SP AM=M-1 D=M A=A-1 D=M-D M=0 @END_EQ D;JNE @SP A=M-1 M=-1 (END_EQ) @R15 A=M 0;JMP @R15 M=D @SP AM=M-1 D=M A=A-1 D=M-D M=0 @END_GT D;JLE @SP A=M-1 M=-1 (END_GT) @R15 A=M 0;JMP @R15 M=D @SP AM=M-1 D=M A=A-1 D=M-D M=0 @END_LT D;JGE @SP A=M-1 M=-1 (END_LT) @R15 A=M 0;JMP @5 D=A @LCL A=M-D D=M @R13 M=D @SP AM=M-1 D=M @ARG A=M M=D D=A @SP M=D+1 @LCL D=M @R14 AM=D-1 D=M @THAT M=D @R14 AM=M-1 D=M @THIS M=D @R14 AM=M-1 D=M @ARG M=D @R14 AM=M-1 D=M @LCL M=D @R13 A=M 0;JMP @SP A=M M=D @LCL D=M @SP AM=M+1 M=D @ARG D=M @SP AM=M+1 M=D @THIS D=M @SP AM=M+1 M=D @THAT D=M @SP AM=M+1 M=D @4 D=A @R13 D=D+M @SP D=M-D @ARG M=D @SP MD=M+1 @LCL M=D @R14 A=M 0;JMP @0 D=A @R13 M=D @sys.init D=A @R14 M=D @RET_ADDRESS_CALL0 D=A @95 0;JMP (RET_ADDRESS_CALL0) (ball.new) @15 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @memory.alloc D=A @R14 M=D @RET_ADDRESS_CALL1 D=A @95 0;JMP (RET_ADDRESS_CALL1) @SP AM=M-1 D=M @THIS M=D @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 M=D @ARG A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @10 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @ARG D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @6 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @THIS D=M @11 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @ARG D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @12 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @ARG D=M @5 A=D+A D=M @SP AM=M+1 A=A-1 M=D @6 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @THIS D=M @13 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @SP M=M+1 A=M-1 M=0 @THIS D=M @14 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ball.show D=A @R14 M=D @RET_ADDRESS_CALL2 D=A @95 0;JMP (RET_ADDRESS_CALL2) @SP AM=M-1 D=M @R5 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (ball.dispose) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @memory.dealloc D=A @R14 M=D @RET_ADDRESS_CALL3 D=A @95 0;JMP (RET_ADDRESS_CALL3) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (ball.show) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @SP M=M+1 A=M-1 M=0 @SP A=M-1 M=!M @1 D=A @R13 M=D @screen.setcolor D=A @R14 M=D @RET_ADDRESS_CALL4 D=A @95 0;JMP (RET_ADDRESS_CALL4) @SP AM=M-1 D=M @R5 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ball.draw D=A @R14 M=D @RET_ADDRESS_CALL5 D=A @95 0;JMP (RET_ADDRESS_CALL5) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (ball.hide) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @SP M=M+1 A=M-1 M=0 @1 D=A @R13 M=D @screen.setcolor D=A @R14 M=D @RET_ADDRESS_CALL6 D=A @95 0;JMP (RET_ADDRESS_CALL6) @SP AM=M-1 D=M @R5 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ball.draw D=A @R14 M=D @RET_ADDRESS_CALL7 D=A @95 0;JMP (RET_ADDRESS_CALL7) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (ball.draw) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @5 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @5 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @4 D=A @R13 M=D @screen.drawrectangle D=A @R14 M=D @RET_ADDRESS_CALL8 D=A @95 0;JMP (RET_ADDRESS_CALL8) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (ball.getleft) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (ball.getright) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @5 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @54 0;JMP (ball.setdestination) @3 D=A (LOOP_ball.setdestination) D=D-1 @SP AM=M+1 A=A-1 M=0 @LOOP_ball.setdestination D;JGT @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 M=D @ARG A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @math.abs D=A @R14 M=D @RET_ADDRESS_CALL9 D=A @95 0;JMP (RET_ADDRESS_CALL9) @SP AM=M-1 D=M @LCL A=M M=D @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @math.abs D=A @R14 M=D @RET_ADDRESS_CALL10 D=A @95 0;JMP (RET_ADDRESS_CALL10) @SP AM=M-1 D=M @LCL A=M+1 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT0 D=A @38 0;JMP (RET_ADDRESS_LT0) @THIS D=M @7 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @THIS D=M @7 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ball.setdestination$if_true0 D;JNE @ball.setdestination$if_false0 0;JMP (ball.setdestination$if_true0) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M+1 A=A+1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M M=D @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M+1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @ARG A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT1 D=A @38 0;JMP (RET_ADDRESS_LT1) @THIS D=M @8 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT2 D=A @38 0;JMP (RET_ADDRESS_LT2) @THIS D=M @9 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @ball.setdestination$if_end0 0;JMP (ball.setdestination$if_false0) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT3 D=A @38 0;JMP (RET_ADDRESS_LT3) @THIS D=M @8 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @ARG A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT4 D=A @38 0;JMP (RET_ADDRESS_LT4) @THIS D=M @9 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D (ball.setdestination$if_end0) @2 D=A @SP AM=M+1 A=A-1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL11 D=A @95 0;JMP (RET_ADDRESS_CALL11) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 M=D @2 D=A @SP AM=M+1 A=A-1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL12 D=A @95 0;JMP (RET_ADDRESS_CALL12) @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 A=A+1 M=D @2 D=A @SP AM=M+1 A=A-1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL13 D=A @95 0;JMP (RET_ADDRESS_CALL13) @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 A=A+1 A=A+1 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (ball.move) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ball.hide D=A @R14 M=D @RET_ADDRESS_CALL14 D=A @95 0;JMP (RET_ADDRESS_CALL14) @SP AM=M-1 D=M @R5 M=D @THIS D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_LT5 D=A @38 0;JMP (RET_ADDRESS_LT5) @SP AM=M-1 D=M @ball.move$if_true0 D;JNE @ball.move$if_false0 0;JMP (ball.move$if_true0) @THIS D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @5 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 M=D @ball.move$if_end0 0;JMP (ball.move$if_false0) @THIS D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @6 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 M=D @THIS D=M @9 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ball.move$if_true1 D;JNE @ball.move$if_false1 0;JMP (ball.move$if_true1) @THIS D=M @7 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ball.move$if_true2 D;JNE @ball.move$if_false2 0;JMP (ball.move$if_true2) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THIS A=M M=D @ball.move$if_end2 0;JMP (ball.move$if_false2) @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THIS A=M+1 M=D (ball.move$if_end2) @ball.move$if_end1 0;JMP (ball.move$if_false1) @THIS D=M @7 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ball.move$if_true3 D;JNE @ball.move$if_false3 0;JMP (ball.move$if_true3) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M M=D @ball.move$if_end3 0;JMP (ball.move$if_false3) @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M+1 M=D (ball.move$if_end3) (ball.move$if_end1) (ball.move$if_end0) @THIS D=M @8 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ball.move$if_true4 D;JNE @ball.move$if_false4 0;JMP (ball.move$if_true4) @THIS D=M @7 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ball.move$if_true5 D;JNE @ball.move$if_false5 0;JMP (ball.move$if_true5) @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THIS A=M+1 M=D @ball.move$if_end5 0;JMP (ball.move$if_false5) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THIS A=M M=D (ball.move$if_end5) @ball.move$if_end4 0;JMP (ball.move$if_false4) @THIS D=M @7 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ball.move$if_true6 D;JNE @ball.move$if_false6 0;JMP (ball.move$if_true6) @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M+1 M=D @ball.move$if_end6 0;JMP (ball.move$if_false6) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M M=D (ball.move$if_end6) (ball.move$if_end4) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @10 A=D+A D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_GT0 D=A @22 0;JMP (RET_ADDRESS_GT0) @SP A=M-1 M=!M @SP AM=M-1 D=M @ball.move$if_true7 D;JNE @ball.move$if_false7 0;JMP (ball.move$if_true7) @SP M=M+1 A=M-1 M=1 @THIS D=M @14 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @THIS D=M @10 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M M=D (ball.move$if_false7) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @11 A=D+A D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT6 D=A @38 0;JMP (RET_ADDRESS_LT6) @SP A=M-1 M=!M @SP AM=M-1 D=M @ball.move$if_true8 D;JNE @ball.move$if_false8 0;JMP (ball.move$if_true8) @2 D=A @SP AM=M+1 A=A-1 M=D @THIS D=M @14 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @THIS D=M @11 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M M=D (ball.move$if_false8) @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @12 A=D+A D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_GT1 D=A @22 0;JMP (RET_ADDRESS_GT1) @SP A=M-1 M=!M @SP AM=M-1 D=M @ball.move$if_true9 D;JNE @ball.move$if_false9 0;JMP (ball.move$if_true9) @3 D=A @SP AM=M+1 A=A-1 M=D @THIS D=M @14 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @THIS D=M @12 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 M=D (ball.move$if_false9) @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @13 A=D+A D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT7 D=A @38 0;JMP (RET_ADDRESS_LT7) @SP A=M-1 M=!M @SP AM=M-1 D=M @ball.move$if_true10 D;JNE @ball.move$if_false10 0;JMP (ball.move$if_true10) @4 D=A @SP AM=M+1 A=A-1 M=D @THIS D=M @14 D=D+A @R13 M=D @SP AM=M-1 D=M @R13 A=M M=D @THIS D=M @13 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 M=D (ball.move$if_false10) @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ball.show D=A @R14 M=D @RET_ADDRESS_CALL15 D=A @95 0;JMP (RET_ADDRESS_CALL15) @SP AM=M-1 D=M @R5 M=D @THIS D=M @14 A=D+A D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (ball.bounce) @5 D=A (LOOP_ball.bounce) D=D-1 @SP AM=M+1 A=A-1 M=0 @LOOP_ball.bounce D;JGT @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @10 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.divide D=A @R14 M=D @RET_ADDRESS_CALL16 D=A @95 0;JMP (RET_ADDRESS_CALL16) @SP AM=M-1 D=M @LCL A=M+1 A=A+1 M=D @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @10 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.divide D=A @R14 M=D @RET_ADDRESS_CALL17 D=A @95 0;JMP (RET_ADDRESS_CALL17) @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_EQ0 D=A @6 0;JMP (RET_ADDRESS_EQ0) @SP AM=M-1 D=M @ball.bounce$if_true0 D;JNE @ball.bounce$if_false0 0;JMP (ball.bounce$if_true0) @10 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 A=A+1 M=D @ball.bounce$if_end0 0;JMP (ball.bounce$if_false0) @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_LT8 D=A @38 0;JMP (RET_ADDRESS_LT8) @SP A=M-1 M=!M @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @RET_ADDRESS_EQ1 D=A @6 0;JMP (RET_ADDRESS_EQ1) @SP AM=M-1 D=M A=A-1 M=D&M @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_LT9 D=A @38 0;JMP (RET_ADDRESS_LT9) @SP AM=M-1 D=M A=A-1 M=D|M @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @SP A=M-1 D=!M M=D+1 @RET_ADDRESS_EQ2 D=A @6 0;JMP (RET_ADDRESS_EQ2) @SP AM=M-1 D=M A=A-1 M=D&M @SP AM=M-1 D=M @ball.bounce$if_true1 D;JNE @ball.bounce$if_false1 0;JMP (ball.bounce$if_true1) @20 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 A=A+1 M=D @ball.bounce$if_end1 0;JMP (ball.bounce$if_false1) @5 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 A=A+1 M=D (ball.bounce$if_end1) (ball.bounce$if_end0) @THIS D=M @14 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @RET_ADDRESS_EQ3 D=A @6 0;JMP (RET_ADDRESS_EQ3) @SP AM=M-1 D=M @ball.bounce$if_true2 D;JNE @ball.bounce$if_false2 0;JMP (ball.bounce$if_true2) @506 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M M=D @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @50 D=A @SP AM=M+1 A=A-1 M=D @SP A=M-1 D=!M M=D+1 @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL18 D=A @95 0;JMP (RET_ADDRESS_CALL18) @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.divide D=A @R14 M=D @RET_ADDRESS_CALL19 D=A @95 0;JMP (RET_ADDRESS_CALL19) @SP AM=M-1 D=M @LCL A=M+1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @LCL D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL20 D=A @95 0;JMP (RET_ADDRESS_CALL20) @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @LCL A=M+1 M=D @ball.bounce$if_end2 0;JMP (ball.bounce$if_false2) @THIS D=M @14 A=D+A D=M @SP AM=M+1 A=A-1 M=D @2 D=A @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_EQ4 D=A @6 0;JMP (RET_ADDRESS_EQ4) @SP AM=M-1 D=M @ball.bounce$if_true3 D;JNE @ball.bounce$if_false3 0;JMP (ball.bounce$if_true3) @SP M=M+1 A=M-1 M=0 @SP AM=M-1 D=M @LCL A=M M=D @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @50 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL21 D=A @95 0;JMP (RET_ADDRESS_CALL21) @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.divide D=A @R14 M=D @RET_ADDRESS_CALL22 D=A @95 0;JMP (RET_ADDRESS_CALL22) @SP AM=M-1 D=M @LCL A=M+1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @LCL D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL23 D=A @95 0;JMP (RET_ADDRESS_CALL23) @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @LCL A=M+1 M=D @ball.bounce$if_end3 0;JMP (ball.bounce$if_false3) @THIS D=M @14 A=D+A D=M @SP AM=M+1 A=A-1 M=D @3 D=A @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_EQ5 D=A @6 0;JMP (RET_ADDRESS_EQ5) @SP AM=M-1 D=M @ball.bounce$if_true4 D;JNE @ball.bounce$if_false4 0;JMP (ball.bounce$if_true4) @250 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M+1 M=D @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @25 D=A @SP AM=M+1 A=A-1 M=D @SP A=M-1 D=!M M=D+1 @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL24 D=A @95 0;JMP (RET_ADDRESS_CALL24) @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.divide D=A @R14 M=D @RET_ADDRESS_CALL25 D=A @95 0;JMP (RET_ADDRESS_CALL25) @SP AM=M-1 D=M @LCL A=M M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @LCL D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL26 D=A @95 0;JMP (RET_ADDRESS_CALL26) @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @LCL A=M M=D @ball.bounce$if_end4 0;JMP (ball.bounce$if_false4) @SP M=M+1 A=M-1 M=0 @SP AM=M-1 D=M @LCL A=M+1 M=D @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @25 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL27 D=A @95 0;JMP (RET_ADDRESS_CALL27) @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.divide D=A @R14 M=D @RET_ADDRESS_CALL28 D=A @95 0;JMP (RET_ADDRESS_CALL28) @SP AM=M-1 D=M @LCL A=M M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @LCL D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @math.multiply D=A @R14 M=D @RET_ADDRESS_CALL29 D=A @95 0;JMP (RET_ADDRESS_CALL29) @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @LCL A=M M=D (ball.bounce$if_end4) (ball.bounce$if_end3) (ball.bounce$if_end2) @THIS D=M @SP AM=M+1 A=A-1 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @3 D=A @R13 M=D @ball.setdestination D=A @R14 M=D @RET_ADDRESS_CALL30 D=A @95 0;JMP (RET_ADDRESS_CALL30) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (bat.new) @5 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @memory.alloc D=A @R14 M=D @RET_ADDRESS_CALL31 D=A @95 0;JMP (RET_ADDRESS_CALL31) @SP AM=M-1 D=M @THIS M=D @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 M=D @ARG A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 M=D @ARG D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 M=D @2 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.show D=A @R14 M=D @RET_ADDRESS_CALL32 D=A @95 0;JMP (RET_ADDRESS_CALL32) @SP AM=M-1 D=M @R5 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (bat.dispose) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @memory.dealloc D=A @R14 M=D @RET_ADDRESS_CALL33 D=A @95 0;JMP (RET_ADDRESS_CALL33) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (bat.show) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @SP M=M+1 A=M-1 M=0 @SP A=M-1 M=!M @1 D=A @R13 M=D @screen.setcolor D=A @R14 M=D @RET_ADDRESS_CALL34 D=A @95 0;JMP (RET_ADDRESS_CALL34) @SP AM=M-1 D=M @R5 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.draw D=A @R14 M=D @RET_ADDRESS_CALL35 D=A @95 0;JMP (RET_ADDRESS_CALL35) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (bat.hide) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @SP M=M+1 A=M-1 M=0 @1 D=A @R13 M=D @screen.setcolor D=A @R14 M=D @RET_ADDRESS_CALL36 D=A @95 0;JMP (RET_ADDRESS_CALL36) @SP AM=M-1 D=M @R5 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.draw D=A @R14 M=D @RET_ADDRESS_CALL37 D=A @95 0;JMP (RET_ADDRESS_CALL37) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (bat.draw) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @4 D=A @R13 M=D @screen.drawrectangle D=A @R14 M=D @RET_ADDRESS_CALL38 D=A @95 0;JMP (RET_ADDRESS_CALL38) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (bat.setdirection) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (bat.getleft) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (bat.getright) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @54 0;JMP (bat.setwidth) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.hide D=A @R14 M=D @RET_ADDRESS_CALL39 D=A @95 0;JMP (RET_ADDRESS_CALL39) @SP AM=M-1 D=M @R5 M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.show D=A @R14 M=D @RET_ADDRESS_CALL40 D=A @95 0;JMP (RET_ADDRESS_CALL40) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (bat.move) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @RET_ADDRESS_EQ6 D=A @6 0;JMP (RET_ADDRESS_EQ6) @SP AM=M-1 D=M @bat.move$if_true0 D;JNE @bat.move$if_false0 0;JMP (bat.move$if_true0) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_LT10 D=A @38 0;JMP (RET_ADDRESS_LT10) @SP AM=M-1 D=M @bat.move$if_true1 D;JNE @bat.move$if_false1 0;JMP (bat.move$if_true1) @SP M=M+1 A=M-1 M=0 @SP AM=M-1 D=M @THIS A=M M=D (bat.move$if_false1) @SP M=M+1 A=M-1 M=0 @1 D=A @R13 M=D @screen.setcolor D=A @R14 M=D @RET_ADDRESS_CALL41 D=A @95 0;JMP (RET_ADDRESS_CALL41) @SP AM=M-1 D=M @R5 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP M=M+1 A=M-1 M=1 @SP AM=M-1 D=M A=A-1 M=D+M @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @4 D=A @R13 M=D @screen.drawrectangle D=A @R14 M=D @RET_ADDRESS_CALL42 D=A @95 0;JMP (RET_ADDRESS_CALL42) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @SP A=M-1 M=!M @1 D=A @R13 M=D @screen.setcolor D=A @R14 M=D @RET_ADDRESS_CALL43 D=A @95 0;JMP (RET_ADDRESS_CALL43) @SP AM=M-1 D=M @R5 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @3 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @4 D=A @R13 M=D @screen.drawrectangle D=A @R14 M=D @RET_ADDRESS_CALL44 D=A @95 0;JMP (RET_ADDRESS_CALL44) @SP AM=M-1 D=M @R5 M=D @bat.move$if_end0 0;JMP (bat.move$if_false0) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THIS A=M M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @511 D=A @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_GT2 D=A @22 0;JMP (RET_ADDRESS_GT2) @SP AM=M-1 D=M @bat.move$if_true2 D;JNE @bat.move$if_false2 0;JMP (bat.move$if_true2) @511 D=A @SP AM=M+1 A=A-1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M M=D (bat.move$if_false2) @SP M=M+1 A=M-1 M=0 @1 D=A @R13 M=D @screen.setcolor D=A @R14 M=D @RET_ADDRESS_CALL45 D=A @95 0;JMP (RET_ADDRESS_CALL45) @SP AM=M-1 D=M @R5 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @SP AM=M-1 D=M A=A-1 M=M-D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @4 D=A @R13 M=D @screen.drawrectangle D=A @R14 M=D @RET_ADDRESS_CALL46 D=A @95 0;JMP (RET_ADDRESS_CALL46) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @SP A=M-1 M=!M @1 D=A @R13 M=D @screen.setcolor D=A @R14 M=D @RET_ADDRESS_CALL47 D=A @95 0;JMP (RET_ADDRESS_CALL47) @SP AM=M-1 D=M @R5 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @3 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @4 D=A @R13 M=D @screen.drawrectangle D=A @R14 M=D @RET_ADDRESS_CALL48 D=A @95 0;JMP (RET_ADDRESS_CALL48) @SP AM=M-1 D=M @R5 M=D (bat.move$if_end0) @SP M=M+1 A=M-1 M=0 @54 0;JMP (main.main) @SP AM=M+1 A=A-1 M=0 @0 D=A @R13 M=D @ponggame.newinstance D=A @R14 M=D @RET_ADDRESS_CALL49 D=A @95 0;JMP (RET_ADDRESS_CALL49) @SP AM=M-1 D=M @R5 M=D @0 D=A @R13 M=D @ponggame.getinstance D=A @R14 M=D @RET_ADDRESS_CALL50 D=A @95 0;JMP (RET_ADDRESS_CALL50) @SP AM=M-1 D=M @LCL A=M M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ponggame.run D=A @R14 M=D @RET_ADDRESS_CALL51 D=A @95 0;JMP (RET_ADDRESS_CALL51) @SP AM=M-1 D=M @R5 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ponggame.dispose D=A @R14 M=D @RET_ADDRESS_CALL52 D=A @95 0;JMP (RET_ADDRESS_CALL52) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (ponggame.new) @7 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @memory.alloc D=A @R14 M=D @RET_ADDRESS_CALL53 D=A @95 0;JMP (RET_ADDRESS_CALL53) @SP AM=M-1 D=M @THIS M=D @0 D=A @R13 M=D @screen.clearscreen D=A @R14 M=D @RET_ADDRESS_CALL54 D=A @95 0;JMP (RET_ADDRESS_CALL54) @SP AM=M-1 D=M @R5 M=D @50 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 A=A+1 A=A+1 M=D @230 D=A @SP AM=M+1 A=A-1 M=D @229 D=A @SP AM=M+1 A=A-1 M=D @THIS D=M @6 A=D+A D=M @SP AM=M+1 A=A-1 M=D @7 D=A @SP AM=M+1 A=A-1 M=D @4 D=A @R13 M=D @bat.new D=A @R14 M=D @RET_ADDRESS_CALL55 D=A @95 0;JMP (RET_ADDRESS_CALL55) @SP AM=M-1 D=M @THIS A=M M=D @253 D=A @SP AM=M+1 A=A-1 M=D @222 D=A @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @511 D=A @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @229 D=A @SP AM=M+1 A=A-1 M=D @6 D=A @R13 M=D @ball.new D=A @R14 M=D @RET_ADDRESS_CALL56 D=A @95 0;JMP (RET_ADDRESS_CALL56) @SP AM=M-1 D=M @THIS A=M+1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @400 D=A @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @3 D=A @R13 M=D @ball.setdestination D=A @R14 M=D @RET_ADDRESS_CALL57 D=A @95 0;JMP (RET_ADDRESS_CALL57) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @238 D=A @SP AM=M+1 A=A-1 M=D @511 D=A @SP AM=M+1 A=A-1 M=D @240 D=A @SP AM=M+1 A=A-1 M=D @4 D=A @R13 M=D @screen.drawrectangle D=A @R14 M=D @RET_ADDRESS_CALL58 D=A @95 0;JMP (RET_ADDRESS_CALL58) @SP AM=M-1 D=M @R5 M=D @22 D=A @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @2 D=A @R13 M=D @output.movecursor D=A @R14 M=D @RET_ADDRESS_CALL59 D=A @95 0;JMP (RET_ADDRESS_CALL59) @SP AM=M-1 D=M @R5 M=D @8 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @string.new D=A @R14 M=D @RET_ADDRESS_CALL60 D=A @95 0;JMP (RET_ADDRESS_CALL60) @83 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL61 D=A @95 0;JMP (RET_ADDRESS_CALL61) @99 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL62 D=A @95 0;JMP (RET_ADDRESS_CALL62) @111 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL63 D=A @95 0;JMP (RET_ADDRESS_CALL63) @114 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL64 D=A @95 0;JMP (RET_ADDRESS_CALL64) @101 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL65 D=A @95 0;JMP (RET_ADDRESS_CALL65) @58 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL66 D=A @95 0;JMP (RET_ADDRESS_CALL66) @32 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL67 D=A @95 0;JMP (RET_ADDRESS_CALL67) @48 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL68 D=A @95 0;JMP (RET_ADDRESS_CALL68) @1 D=A @R13 M=D @output.printstring D=A @R14 M=D @RET_ADDRESS_CALL69 D=A @95 0;JMP (RET_ADDRESS_CALL69) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 M=D @SP M=M+1 A=M-1 M=0 @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 M=D @SP M=M+1 A=M-1 M=0 @SP AM=M-1 D=M @THIS A=M+1 A=A+1 M=D @SP M=M+1 A=M-1 M=0 @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 A=A+1 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (ponggame.dispose) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.dispose D=A @R14 M=D @RET_ADDRESS_CALL70 D=A @95 0;JMP (RET_ADDRESS_CALL70) @SP AM=M-1 D=M @R5 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ball.dispose D=A @R14 M=D @RET_ADDRESS_CALL71 D=A @95 0;JMP (RET_ADDRESS_CALL71) @SP AM=M-1 D=M @R5 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @memory.dealloc D=A @R14 M=D @RET_ADDRESS_CALL72 D=A @95 0;JMP (RET_ADDRESS_CALL72) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (ponggame.newinstance) @0 D=A @R13 M=D @ponggame.new D=A @R14 M=D @RET_ADDRESS_CALL73 D=A @95 0;JMP (RET_ADDRESS_CALL73) @SP AM=M-1 D=M @ponggame.0 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (ponggame.getinstance) @ponggame.0 D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (ponggame.run) @SP AM=M+1 A=A-1 M=0 @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D (ponggame.run$while_exp0) @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP A=M-1 M=!M @SP A=M-1 M=!M @SP AM=M-1 D=M @ponggame.run$while_end0 D;JNE (ponggame.run$while_exp1) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_EQ7 D=A @6 0;JMP (RET_ADDRESS_EQ7) @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP A=M-1 M=!M @SP AM=M-1 D=M A=A-1 M=D&M @SP A=M-1 M=!M @SP AM=M-1 D=M @ponggame.run$while_end1 D;JNE @0 D=A @R13 M=D @keyboard.keypressed D=A @R14 M=D @RET_ADDRESS_CALL74 D=A @95 0;JMP (RET_ADDRESS_CALL74) @SP AM=M-1 D=M @LCL A=M M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.move D=A @R14 M=D @RET_ADDRESS_CALL75 D=A @95 0;JMP (RET_ADDRESS_CALL75) @SP AM=M-1 D=M @R5 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ponggame.moveball D=A @R14 M=D @RET_ADDRESS_CALL76 D=A @95 0;JMP (RET_ADDRESS_CALL76) @SP AM=M-1 D=M @R5 M=D @ponggame.run$while_exp1 0;JMP (ponggame.run$while_end1) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @130 D=A @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_EQ8 D=A @6 0;JMP (RET_ADDRESS_EQ8) @SP AM=M-1 D=M @ponggame.run$if_true0 D;JNE @ponggame.run$if_false0 0;JMP (ponggame.run$if_true0) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @2 D=A @R13 M=D @bat.setdirection D=A @R14 M=D @RET_ADDRESS_CALL77 D=A @95 0;JMP (RET_ADDRESS_CALL77) @SP AM=M-1 D=M @R5 M=D @ponggame.run$if_end0 0;JMP (ponggame.run$if_false0) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @132 D=A @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_EQ9 D=A @6 0;JMP (RET_ADDRESS_EQ9) @SP AM=M-1 D=M @ponggame.run$if_true1 D;JNE @ponggame.run$if_false1 0;JMP (ponggame.run$if_true1) @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @2 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @bat.setdirection D=A @R14 M=D @RET_ADDRESS_CALL78 D=A @95 0;JMP (RET_ADDRESS_CALL78) @SP AM=M-1 D=M @R5 M=D @ponggame.run$if_end1 0;JMP (ponggame.run$if_false1) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @140 D=A @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_EQ10 D=A @6 0;JMP (RET_ADDRESS_EQ10) @SP AM=M-1 D=M @ponggame.run$if_true2 D;JNE @ponggame.run$if_false2 0;JMP (ponggame.run$if_true2) @SP M=M+1 A=M-1 M=0 @SP A=M-1 M=!M @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 M=D (ponggame.run$if_false2) (ponggame.run$if_end1) (ponggame.run$if_end0) (ponggame.run$while_exp2) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_EQ11 D=A @6 0;JMP (RET_ADDRESS_EQ11) @SP A=M-1 M=!M @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP A=M-1 M=!M @SP AM=M-1 D=M A=A-1 M=D&M @SP A=M-1 M=!M @SP AM=M-1 D=M @ponggame.run$while_end2 D;JNE @0 D=A @R13 M=D @keyboard.keypressed D=A @R14 M=D @RET_ADDRESS_CALL79 D=A @95 0;JMP (RET_ADDRESS_CALL79) @SP AM=M-1 D=M @LCL A=M M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.move D=A @R14 M=D @RET_ADDRESS_CALL80 D=A @95 0;JMP (RET_ADDRESS_CALL80) @SP AM=M-1 D=M @R5 M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ponggame.moveball D=A @R14 M=D @RET_ADDRESS_CALL81 D=A @95 0;JMP (RET_ADDRESS_CALL81) @SP AM=M-1 D=M @R5 M=D @ponggame.run$while_exp2 0;JMP (ponggame.run$while_end2) @ponggame.run$while_exp0 0;JMP (ponggame.run$while_end0) @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ponggame.run$if_true3 D;JNE @ponggame.run$if_false3 0;JMP (ponggame.run$if_true3) @10 D=A @SP AM=M+1 A=A-1 M=D @27 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @output.movecursor D=A @R14 M=D @RET_ADDRESS_CALL82 D=A @95 0;JMP (RET_ADDRESS_CALL82) @SP AM=M-1 D=M @R5 M=D @9 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @string.new D=A @R14 M=D @RET_ADDRESS_CALL83 D=A @95 0;JMP (RET_ADDRESS_CALL83) @71 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL84 D=A @95 0;JMP (RET_ADDRESS_CALL84) @97 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL85 D=A @95 0;JMP (RET_ADDRESS_CALL85) @109 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL86 D=A @95 0;JMP (RET_ADDRESS_CALL86) @101 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL87 D=A @95 0;JMP (RET_ADDRESS_CALL87) @32 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL88 D=A @95 0;JMP (RET_ADDRESS_CALL88) @79 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL89 D=A @95 0;JMP (RET_ADDRESS_CALL89) @118 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL90 D=A @95 0;JMP (RET_ADDRESS_CALL90) @101 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL91 D=A @95 0;JMP (RET_ADDRESS_CALL91) @114 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL92 D=A @95 0;JMP (RET_ADDRESS_CALL92) @1 D=A @R13 M=D @output.printstring D=A @R14 M=D @RET_ADDRESS_CALL93 D=A @95 0;JMP (RET_ADDRESS_CALL93) @SP AM=M-1 D=M @R5 M=D (ponggame.run$if_false3) @SP M=M+1 A=M-1 M=0 @54 0;JMP (ponggame.moveball) @5 D=A (LOOP_ponggame.moveball) D=D-1 @SP AM=M+1 A=A-1 M=0 @LOOP_ponggame.moveball D;JGT @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ball.move D=A @R14 M=D @RET_ADDRESS_CALL94 D=A @95 0;JMP (RET_ADDRESS_CALL94) @SP AM=M-1 D=M @THIS A=M+1 A=A+1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_GT3 D=A @22 0;JMP (RET_ADDRESS_GT3) @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @5 A=D+A D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_EQ12 D=A @6 0;JMP (RET_ADDRESS_EQ12) @SP A=M-1 M=!M @SP AM=M-1 D=M A=A-1 M=D&M @SP AM=M-1 D=M @ponggame.moveball$if_true0 D;JNE @ponggame.moveball$if_false0 0;JMP (ponggame.moveball$if_true0) @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 A=A+1 M=D @SP M=M+1 A=M-1 M=0 @SP AM=M-1 D=M @LCL A=M M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.getleft D=A @R14 M=D @RET_ADDRESS_CALL95 D=A @95 0;JMP (RET_ADDRESS_CALL95) @SP AM=M-1 D=M @LCL A=M+1 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @bat.getright D=A @R14 M=D @RET_ADDRESS_CALL96 D=A @95 0;JMP (RET_ADDRESS_CALL96) @SP AM=M-1 D=M @LCL A=M+1 A=A+1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ball.getleft D=A @R14 M=D @RET_ADDRESS_CALL97 D=A @95 0;JMP (RET_ADDRESS_CALL97) @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 M=D @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @ball.getright D=A @R14 M=D @RET_ADDRESS_CALL98 D=A @95 0;JMP (RET_ADDRESS_CALL98) @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 A=A+1 M=D @THIS A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @4 D=A @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_EQ13 D=A @6 0;JMP (RET_ADDRESS_EQ13) @SP AM=M-1 D=M @ponggame.moveball$if_true1 D;JNE @ponggame.moveball$if_false1 0;JMP (ponggame.moveball$if_true1) @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @LCL D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_GT4 D=A @22 0;JMP (RET_ADDRESS_GT4) @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT11 D=A @38 0;JMP (RET_ADDRESS_LT11) @SP AM=M-1 D=M A=A-1 M=D|M @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 M=D @THIS D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP A=M-1 M=!M @SP AM=M-1 D=M @ponggame.moveball$if_true2 D;JNE @ponggame.moveball$if_false2 0;JMP (ponggame.moveball$if_true2) @LCL D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @10 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @RET_ADDRESS_LT12 D=A @38 0;JMP (RET_ADDRESS_LT12) @SP AM=M-1 D=M @ponggame.moveball$if_true3 D;JNE @ponggame.moveball$if_false3 0;JMP (ponggame.moveball$if_true3) @SP M=M+1 A=M-1 M=1 @SP A=M-1 D=!M M=D+1 @SP AM=M-1 D=M @LCL A=M M=D @ponggame.moveball$if_end3 0;JMP (ponggame.moveball$if_false3) @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @10 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @RET_ADDRESS_GT5 D=A @22 0;JMP (RET_ADDRESS_GT5) @SP AM=M-1 D=M @ponggame.moveball$if_true4 D;JNE @ponggame.moveball$if_false4 0;JMP (ponggame.moveball$if_true4) @SP M=M+1 A=M-1 M=1 @SP AM=M-1 D=M @LCL A=M M=D (ponggame.moveball$if_false4) (ponggame.moveball$if_end3) @THIS D=M @6 A=D+A D=M @SP AM=M+1 A=A-1 M=D @2 D=A @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=M-D @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 A=A+1 A=A+1 M=D @THIS A=M D=M @SP AM=M+1 A=A-1 M=D @THIS D=M @6 A=D+A D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @bat.setwidth D=A @R14 M=D @RET_ADDRESS_CALL99 D=A @95 0;JMP (RET_ADDRESS_CALL99) @SP AM=M-1 D=M @R5 M=D @THIS D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THIS A=M+1 A=A+1 A=A+1 A=A+1 M=D @22 D=A @SP AM=M+1 A=A-1 M=D @7 D=A @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @output.movecursor D=A @R14 M=D @RET_ADDRESS_CALL100 D=A @95 0;JMP (RET_ADDRESS_CALL100) @SP AM=M-1 D=M @R5 M=D @THIS D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @output.printint D=A @R14 M=D @RET_ADDRESS_CALL101 D=A @95 0;JMP (RET_ADDRESS_CALL101) @SP AM=M-1 D=M @R5 M=D (ponggame.moveball$if_false2) (ponggame.moveball$if_false1) @THIS A=M+1 D=M @SP AM=M+1 A=A-1 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @ball.bounce D=A @R14 M=D @RET_ADDRESS_CALL102 D=A @95 0;JMP (RET_ADDRESS_CALL102) @SP AM=M-1 D=M @R5 M=D (ponggame.moveball$if_false0) @SP M=M+1 A=M-1 M=0 @54 0;JMP (array.new) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_GT6 D=A @22 0;JMP (RET_ADDRESS_GT6) @SP A=M-1 M=!M @SP AM=M-1 D=M @array.new$if_true0 D;JNE @array.new$if_false0 0;JMP (array.new$if_true0) @2 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @sys.error D=A @R14 M=D @RET_ADDRESS_CALL103 D=A @95 0;JMP (RET_ADDRESS_CALL103) @SP AM=M-1 D=M @R5 M=D (array.new$if_false0) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @memory.alloc D=A @R14 M=D @RET_ADDRESS_CALL104 D=A @95 0;JMP (RET_ADDRESS_CALL104) @54 0;JMP (array.dispose) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THIS M=D @THIS D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @memory.dealloc D=A @R14 M=D @RET_ADDRESS_CALL105 D=A @95 0;JMP (RET_ADDRESS_CALL105) @SP AM=M-1 D=M @R5 M=D @SP M=M+1 A=M-1 M=0 @54 0;JMP (keyboard.init) @SP M=M+1 A=M-1 M=0 @54 0;JMP (keyboard.keypressed) @24576 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @memory.peek D=A @R14 M=D @RET_ADDRESS_CALL106 D=A @95 0;JMP (RET_ADDRESS_CALL106) @54 0;JMP (keyboard.readchar) @SP A=M M=0 AD=A+1 M=0 @SP M=D+1 @SP M=M+1 A=M-1 M=0 @1 D=A @R13 M=D @output.printchar D=A @R14 M=D @RET_ADDRESS_CALL107 D=A @95 0;JMP (RET_ADDRESS_CALL107) @SP AM=M-1 D=M @R5 M=D (keyboard.readchar$while_exp0) @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_EQ14 D=A @6 0;JMP (RET_ADDRESS_EQ14) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_GT7 D=A @22 0;JMP (RET_ADDRESS_GT7) @SP AM=M-1 D=M A=A-1 M=D|M @SP A=M-1 M=!M @SP AM=M-1 D=M @keyboard.readchar$while_end0 D;JNE @0 D=A @R13 M=D @keyboard.keypressed D=A @R14 M=D @RET_ADDRESS_CALL108 D=A @95 0;JMP (RET_ADDRESS_CALL108) @SP AM=M-1 D=M @LCL A=M M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_GT8 D=A @22 0;JMP (RET_ADDRESS_GT8) @SP AM=M-1 D=M @keyboard.readchar$if_true0 D;JNE @keyboard.readchar$if_false0 0;JMP (keyboard.readchar$if_true0) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M+1 M=D (keyboard.readchar$if_false0) @keyboard.readchar$while_exp0 0;JMP (keyboard.readchar$while_end0) @0 D=A @R13 M=D @string.backspace D=A @R14 M=D @RET_ADDRESS_CALL109 D=A @95 0;JMP (RET_ADDRESS_CALL109) @1 D=A @R13 M=D @output.printchar D=A @R14 M=D @RET_ADDRESS_CALL110 D=A @95 0;JMP (RET_ADDRESS_CALL110) @SP AM=M-1 D=M @R5 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @output.printchar D=A @R14 M=D @RET_ADDRESS_CALL111 D=A @95 0;JMP (RET_ADDRESS_CALL111) @SP AM=M-1 D=M @R5 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (keyboard.readline) @5 D=A (LOOP_keyboard.readline) D=D-1 @SP AM=M+1 A=A-1 M=0 @LOOP_keyboard.readline D;JGT @80 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @string.new D=A @R14 M=D @RET_ADDRESS_CALL112 D=A @95 0;JMP (RET_ADDRESS_CALL112) @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 M=D @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @output.printstring D=A @R14 M=D @RET_ADDRESS_CALL113 D=A @95 0;JMP (RET_ADDRESS_CALL113) @SP AM=M-1 D=M @R5 M=D @0 D=A @R13 M=D @string.newline D=A @R14 M=D @RET_ADDRESS_CALL114 D=A @95 0;JMP (RET_ADDRESS_CALL114) @SP AM=M-1 D=M @LCL A=M+1 M=D @0 D=A @R13 M=D @string.backspace D=A @R14 M=D @RET_ADDRESS_CALL115 D=A @95 0;JMP (RET_ADDRESS_CALL115) @SP AM=M-1 D=M @LCL A=M+1 A=A+1 M=D (keyboard.readline$while_exp0) @LCL D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP A=M-1 M=!M @SP A=M-1 M=!M @SP AM=M-1 D=M @keyboard.readline$while_end0 D;JNE @0 D=A @R13 M=D @keyboard.readchar D=A @R14 M=D @RET_ADDRESS_CALL116 D=A @95 0;JMP (RET_ADDRESS_CALL116) @SP AM=M-1 D=M @LCL A=M M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_EQ15 D=A @6 0;JMP (RET_ADDRESS_EQ15) @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 A=A+1 M=D @LCL D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP A=M-1 M=!M @SP AM=M-1 D=M @keyboard.readline$if_true0 D;JNE @keyboard.readline$if_false0 0;JMP (keyboard.readline$if_true0) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_EQ16 D=A @6 0;JMP (RET_ADDRESS_EQ16) @SP AM=M-1 D=M @keyboard.readline$if_true1 D;JNE @keyboard.readline$if_false1 0;JMP (keyboard.readline$if_true1) @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @string.eraselastchar D=A @R14 M=D @RET_ADDRESS_CALL117 D=A @95 0;JMP (RET_ADDRESS_CALL117) @SP AM=M-1 D=M @R5 M=D @keyboard.readline$if_end1 0;JMP (keyboard.readline$if_false1) @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @2 D=A @R13 M=D @string.appendchar D=A @R14 M=D @RET_ADDRESS_CALL118 D=A @95 0;JMP (RET_ADDRESS_CALL118) @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 M=D (keyboard.readline$if_end1) (keyboard.readline$if_false0) @keyboard.readline$while_exp0 0;JMP (keyboard.readline$while_end0) @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (keyboard.readint) @SP A=M M=0 AD=A+1 M=0 @SP M=D+1 @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @keyboard.readline D=A @R14 M=D @RET_ADDRESS_CALL119 D=A @95 0;JMP (RET_ADDRESS_CALL119) @SP AM=M-1 D=M @LCL A=M M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @string.intvalue D=A @R14 M=D @RET_ADDRESS_CALL120 D=A @95 0;JMP (RET_ADDRESS_CALL120) @SP AM=M-1 D=M @LCL A=M+1 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @string.dispose D=A @R14 M=D @RET_ADDRESS_CALL121 D=A @95 0;JMP (RET_ADDRESS_CALL121) @SP AM=M-1 D=M @R5 M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (math.init) @SP AM=M+1 A=A-1 M=0 @16 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @array.new D=A @R14 M=D @RET_ADDRESS_CALL122 D=A @95 0;JMP (RET_ADDRESS_CALL122) @SP AM=M-1 D=M @math.1 M=D @16 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @array.new D=A @R14 M=D @RET_ADDRESS_CALL123 D=A @95 0;JMP (RET_ADDRESS_CALL123) @SP AM=M-1 D=M @math.0 M=D @SP M=M+1 A=M-1 M=0 @math.0 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP M=M+1 A=M-1 M=1 @SP AM=M-1 D=M @R5 M=D @SP AM=M-1 D=M @THAT M=D @R5 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THAT A=M M=D (math.init$while_exp0) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @15 D=A @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT13 D=A @38 0;JMP (RET_ADDRESS_LT13) @SP A=M-1 M=!M @SP AM=M-1 D=M @math.init$while_end0 D;JNE @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @LCL A=M M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @math.0 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @SP AM=M-1 D=M A=A-1 M=M-D @math.0 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THAT M=D @THAT A=M D=M @SP AM=M+1 A=A-1 M=D @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @SP AM=M-1 D=M A=A-1 M=M-D @math.0 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THAT M=D @THAT A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @R5 M=D @SP AM=M-1 D=M @THAT M=D @R5 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @THAT A=M M=D @math.init$while_exp0 0;JMP (math.init$while_end0) @SP M=M+1 A=M-1 M=0 @54 0;JMP (math.abs) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_LT14 D=A @38 0;JMP (RET_ADDRESS_LT14) @SP AM=M-1 D=M @math.abs$if_true0 D;JNE @math.abs$if_false0 0;JMP (math.abs$if_true0) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP A=M-1 D=!M M=D+1 @SP AM=M-1 D=M @ARG A=M M=D (math.abs$if_false0) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (math.multiply) @5 D=A (LOOP_math.multiply) D=D-1 @SP AM=M+1 A=A-1 M=0 @LOOP_math.multiply D;JGT @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_LT15 D=A @38 0;JMP (RET_ADDRESS_LT15) @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_GT9 D=A @22 0;JMP (RET_ADDRESS_GT9) @SP AM=M-1 D=M A=A-1 M=D&M @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_GT10 D=A @22 0;JMP (RET_ADDRESS_GT10) @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_LT16 D=A @38 0;JMP (RET_ADDRESS_LT16) @SP AM=M-1 D=M A=A-1 M=D&M @SP AM=M-1 D=M A=A-1 M=D|M @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 A=A+1 M=D @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @math.abs D=A @R14 M=D @RET_ADDRESS_CALL124 D=A @95 0;JMP (RET_ADDRESS_CALL124) @SP AM=M-1 D=M @ARG A=M M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @math.abs D=A @R14 M=D @RET_ADDRESS_CALL125 D=A @95 0;JMP (RET_ADDRESS_CALL125) @SP AM=M-1 D=M @ARG A=M+1 M=D @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT17 D=A @38 0;JMP (RET_ADDRESS_LT17) @SP AM=M-1 D=M @math.multiply$if_true0 D;JNE @math.multiply$if_false0 0;JMP (math.multiply$if_true0) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @LCL A=M+1 M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ARG A=M M=D @LCL A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @ARG A=M+1 M=D (math.multiply$if_false0) (math.multiply$while_exp0) @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @RET_ADDRESS_LT18 D=A @38 0;JMP (RET_ADDRESS_LT18) @SP A=M-1 M=!M @SP AM=M-1 D=M @math.multiply$while_end0 D;JNE @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @math.0 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THAT M=D @THAT A=M D=M @SP AM=M+1 A=A-1 M=D @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D&M @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_GT11 D=A @22 0;JMP (RET_ADDRESS_GT11) @SP AM=M-1 D=M @math.multiply$if_true1 D;JNE @math.multiply$if_false1 0;JMP (math.multiply$if_true1) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @LCL A=M M=D @LCL A=M+1 A=A+1 D=M @SP AM=M+1 A=A-1 M=D @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @math.0 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @THAT M=D @THAT A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @LCL A=M+1 A=A+1 M=D (math.multiply$if_false1) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @ARG A=M M=D @LCL D=M @3 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=1 @SP AM=M-1 D=M A=A-1 M=D+M @SP AM=M-1 D=M @LCL A=M+1 A=A+1 A=A+1 M=D @math.multiply$while_exp0 0;JMP (math.multiply$while_end0) @LCL D=M @4 A=D+A D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M @math.multiply$if_true2 D;JNE @math.multiply$if_false2 0;JMP (math.multiply$if_true2) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @SP A=M-1 D=!M M=D+1 @SP AM=M-1 D=M @LCL A=M M=D (math.multiply$if_false2) @LCL A=M D=M @SP AM=M+1 A=A-1 M=D @54 0;JMP (math.divide) @4 D=A (LOOP_math.divide) D=D-1 @SP AM=M+1 A=A-1 M=0 @LOOP_math.divide D;JGT @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_EQ17 D=A @6 0;JMP (RET_ADDRESS_EQ17) @SP AM=M-1 D=M @math.divide$if_true0 D;JNE @math.divide$if_false0 0;JMP (math.divide$if_true0) @3 D=A @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @sys.error D=A @R14 M=D @RET_ADDRESS_CALL126 D=A @95 0;JMP (RET_ADDRESS_CALL126) @SP AM=M-1 D=M @R5 M=D (math.divide$if_false0) @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_LT19 D=A @38 0;JMP (RET_ADDRESS_LT19) @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_GT12 D=A @22 0;JMP (RET_ADDRESS_GT12) @SP AM=M-1 D=M A=A-1 M=D&M @ARG A=M D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_GT13 D=A @22 0;JMP (RET_ADDRESS_GT13) @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @SP M=M+1 A=M-1 M=0 @RET_ADDRESS_LT20 D=A @38 0;JMP (RET_ADDRESS_LT20) @SP AM=M-1 D=M A=A-1 M=D&M @SP AM=M-1 D=M A=A-1 M=D|M @SP AM=M-1 D=M @LCL A=M+1 A=A+1 M=D @SP M=M+1 A=M-1 M=0 @math.1 D=M @SP AM=M+1 A=A-1 M=D @SP AM=M-1 D=M A=A-1 M=D+M @ARG A=M+1 D=M @SP AM=M+1 A=A-1 M=D @1 D=A @R13 M=D @math.abs D=A @R14 M=D @RET_ADDRESS_CALL127 D=A @95 0;JMP (RET_ADDRESS_CALL127)