# Last modified on Wed Feb 8 14:43:42 PST 1995 by heydon # # Add two user-supplied numbers # # PROCEDURE r1 := ReadNum() IS <10> # t1 :: Print("Enter a number: ") # ; t1 := Readln() # ; r1 := Atof(t1) # END # # PROCEDURE Main() IS <11> # r1, r2, t1 :: r1 := ReadNum() # ; r2 := ReadNum() # ; t1 := FmtReal(Atof(r1 + r2)) # ; Print("Sum: "); Print(t1); Print("\n") # END # # BEGIN <12> # Main() # END. V0 "Enter a number: " V1 "Invalid arguments to ADD" V2 "Sum: " V3 "\n" # PROCEDURE ReadNum # L[-1] = r1 # L[1] = t1 C1 # INCSP 1 (make space for t1, which is now local variable 1) .INCSP b1 # PUSHG 0 "Enter a number:" .PUSHG c0 # CALLEXT Print .CALLEXT c0 # POPSP 1 (Print IN) # INCSP 1 (Readln result) # CALLEXT 1, Readln .CALLEXT c1 # POPL t1 .POPL s1 # INCSP 1 (Atof result) .INCSP b1 # PUSHL t1 .PUSHL s1 # CALLEXT 2, Atof .CALLEXT c3 # DECSP 1 (Discard argument) .DECSP b1 # POPL r1 .POPL s-1 # Remove space for temporary .DECSP b1 # RET .RET # PROCEDURE Main() IS <11> # r1, r2, t1 :: r1 := ReadNum() # ; r2 := ReadNum() # ; t1 := FmtReal(r1 + r2) # ; Print(t1) C2 # INCSP 3 (r1, r2, t1) .INCSP b3 # INCSP 1 (out var for Readnum) .INCSP b1 # CALL Readnum .CALL c1 # POPL r1 .POPL s1 # INCSP 1 (out var for Readnum #2) .INCSP b1 # CALL ReadNum .CALL c1 # POPL r2 .POPL s2 # PUSHL r1 .PUSHL s1 # PUSHL r2 .PUSHL s2 # ADD UNDEF .ADD s3 # JUMP DEF .JUMP s2 # UNDEF: ERROR .ERROR b1 # DEF: POPL t1 .POPL s3 # PUSHG 2 "Sum: " .PUSHG c2 # CALLEXT Print .CALLEXT c0 # INCSP 1 .INCSP b1 # PUSHL t1 .PUSHL s3 # CALLEXT FmtReal .CALLEXT c2 # DECSP 1 .DECSP b1 # CALLEXT Print .CALLEXT c0 # PUSHG 3 "\n" .PUSHG c3 # CALLEXT Print .CALLEXT c0 # RET .RET # Change one of the numbers following the END to a non-number to see # Error Handling END 1.2 2.3