LISTING OF : GRASSCAL.BAS PAGE 1 ( 1)›--------------------------------------------------------------------------------››› 10 REM SAVE "D:GRASSCAL.BAS› 20 REM .[Inv][^Q][27 ^R][^E][Norm]› 30 REM .[Inv][Sft =] Grand Rapids Atari System [Sft =][Norm]› 40 REM .[Inv][Sft =][8 Sp]Supporters[9 Sp][Sft =][Norm]› 50 REM .[Inv][Sft =][27 Sp][Sft =][Norm]› 60 REM .[Inv][Sft =][8 Sp]Present the[8 Sp][Sft =][Norm]› 70 REM .[Inv][Sft =][27 Sp][Sft =][Norm]› 80 REM .[Inv][Sft =][3 Sp][^H][Norm] GRASS Calculator [^H][Inv][3 Sp]› [Sft =][Norm]› 90 REM .[Inv][Sft =][27 Sp][Sft =][Norm]› 100 REM [Inv][Sft =][8 Sp]Written by:[8 Sp][Sft =][Norm]› 110 REM [Inv][Sft =] Gary Heitz & Tim Feenstra [Sft =][Norm]› 120 REM [Inv][^Z][27 ^R][^C][Norm]› 130 CLR › 140 DIM OP$(1),CL$(15),IN$(15),DISPLAY$(15),HEX$(15),DEC$(1),TEMP$(17)› 150 CL$ = "[15 Sp]"› 160 GRAPHICS 0› :GOSUB 1900› 170 POKE 710,0› :POKE 709,12› 180 POKE 752,1› 190 CLOSE #1› :OPEN #1,4,0,"K:"› 200 REM [Inv][3 *] DISPLAY [3 *][Norm]› 210 POSITION 2,1› 220 ? "[4 Sp][^B][Sft =][^V][5 Sp][^H][Inv][3 Sp]GRASS[4 Sp][^H][Norm]› [3 Sp][^B][Sft =][^V]"› 230 ? "[4 Sp][^F][Sft =][^G][4 Sp][^H][Inv] CALCULATOR [^H][Norm][4 Sp]› [^F][Sft =][^G]"› 240 POSITION 2,5› 250 ? "[Inv][^Q][^R][^E][4 Sp]Atari[7 Sp][Norm][^G] ^ Means to hold"› 260 ? "[Inv][Sft =]M[Sft =][Norm][14 Sp]0[Inv-sp] [^V] the CONTROL key"› 270 ? "[Inv][^A][^R][^D][16 Sp][Norm] [^V] and press the"› 280 ? "[Inv Sft =] [Inv Sft =][14 Sp]0[Inv-sp] [^V] next character."› 290 ? "[Inv][^Z][^R][^X][15 ^R] [Norm] [^V] [15 -]"› 300 ? "[Inv-sp]^Quit[Inv-sp]MC[Inv-sp]MR[Inv-sp]M-[Inv-sp]M+[Inv-sp] [^V] › P Print [Inv]OFF[Norm]"› 310 ? "[19 Inv-sp] [^V]"› 320 ? "[Inv-sp] 0. [Inv-sp][Inv-sp]A[Inv-sp]B[Inv-sp]C[Inv-sp]D[Inv-sp]E› [Inv-sp]F[Inv-sp] [^V] # Dec. places"› 330 ? "[19 Inv-sp] [^V]"› 340 ? "[Inv-sp]^Rt [Inv-sp][Inv-sp] % [Inv-sp]7[Inv-sp]8[Inv-sp]9[Inv-sp]/› [Inv-sp] [^V] T +/-"› 350 ? "[19 Inv-sp] [^V]"› 360 ? "[Inv-sp]^Sqr[Inv-sp][Inv-sp]+/-[Inv-sp]4[Inv-sp]5[Inv-sp]6[Inv-sp]X› [Inv-sp] [^V]^C Memory Clear"› 370 ? "[19 Inv-sp] [^V]^M Mem. to Main"› 380 ? "[Inv-sp]^Dec[Inv-sp][Inv-sp] Z [Inv-sp]1[Inv-sp]2[Inv-sp]3[Inv-sp]-› [Inv-sp] [^V]^- Memory -"› 390 ? "[19 Inv-sp] [^V]^+ Memory +"› 400 ? "[Inv-sp]^Hex[Inv-sp][Inv-sp]CLR[Inv-sp]0[Inv-sp].[Inv-sp]=[Inv-sp]+› [Inv-sp] [^V]"› 410 ? "[19 Inv-sp] [^V] Z Clear Current";› 420 ? "[^G][18 Sp][^G][^V]CLR Clear All"› 430 ? " [19 ^M]";› 440 REM [Inv][3 *] GET 1st NUMBER [3 *][Norm]› 450 TRAP 440› :TOTAL = 0› :DISPLAY$ = "0"› LISTING OF : GRASSCAL.BAS PAGE 2 ( 2)›--------------------------------------------------------------------------------››› :IF PRNT› THEN LPRINT › 460 POSITION 3,8› :? " [Inv Sft =]";CL$;"[Curs Lft]0"› 470 GOSUB 890› 480 IF KEY=ASC("P") OR KEY=ASC("#") OR KEY=ASC("[^C]")› THEN IN$ = "0"› 490 IF KEY=ASC("[^Q]")› THEN GRAPHICS 0› : END › 500 IF LEN(IN$)=0› THEN 440› 510 IF HEX› THEN TOTAL = NUM› 520 IF HEX=0› THEN TOTAL = VAL(IN$)› 530 REM [Inv][3 *] OPERATION [3 *][Norm]› 540 TRAP 730› :OP$ = " "› 550 IF KEY=ASC("+")› THEN OP$ = "+"› 560 IF KEY=ASC("-")› THEN OP$ = "-"› 570 IF KEY=ASC("/")› THEN OP$ = "/"› 580 IF KEY=ASC("*") OR KEY=ASC("X")› THEN OP$ = "X"› 590 IF KEY=ASC("=")› THEN OP$ = "="› 600 IF KEY=ASC("[^S]")› THEN OP$ = "S"› : TOTAL = TOTAL*TOTAL› 610 IF KEY=ASC("[^R]")› THEN OP$ = "R"› : TOTAL = SQR(TOTAL)› 620 IF KEY=ASC("[^H]")› THEN OP$ = "H"› : GOSUB 1290› : GOTO 760› 630 IF KEY=ASC("[^D]")› THEN OP$ = "D"› : GOSUB 1430› : GOTO 760› 640 IF KEY=ASC("[Tab]") OR KEY=ASC("[Sft-Tab]")› THEN KEY = 0› : OP$ = " "› 650 IF KEY=ASC("[Curs Lft]")› THEN MEMTOTAL = MEMTOTAL+TOTAL› : OP$ = "="› : GOSUB 1220› 660 IF KEY=ASC("[Curs Up]")› THEN MEMTOTAL = MEMTOTAL-TOTAL› : OP$ = "="› : GOSUB 1220› 670 IF KEY=ASC("[^C]")› THEN MEMTOTAL = 0› : OP$ = "="› : GOSUB 1220› 680 IF KEY=ASC("P")› LISTING OF : GRASSCAL.BAS PAGE 3 ( 3)›--------------------------------------------------------------------------------››› THEN GOSUB 1760› 690 IF KEY=ASC("T")› THEN TOTAL = 0-TOTAL› : OP$ = "="› 700 IF KEY=ASC("#")› THEN GOSUB 1810› 710 IF KEY=ASC("%")› THEN TOTAL = TOTAL/100› : OP$ = "="› 720 IF OP$=" "› THEN 440› 730 REM [Inv][3 *] GET 2nd NUMBER [3 *][Norm]› 740 DISPLAY$ = STR$(TOTAL)› 750 IF PLACES› THEN GOSUB 1540› 760 IF OP$="="› THEN GOSUB 1140› 770 GOSUB 890› 780 IF KEY=ASC("[^Q]")› THEN GRAPHICS 0› : END › 790 IF LEN(IN$)› THEN IF OP$="S" OR OP$="R" OR OP$=">" OR OP$="<"› THEN 510› 800 IF LEN(IN$)=0› THEN 530› 810 NUM = VAL(IN$)› 820 IF OP$="="› THEN TOTAL = NUM› 830 REM [Inv][3 *] BASIC MATH ROUTINES [3 *][Norm]› 840 IF OP$="+"› THEN TOTAL = TOTAL+NUM› 850 IF OP$="-"› THEN TOTAL = TOTAL-NUM› 860 IF OP$="X"› THEN TOTAL = TOTAL*NUM› 870 IF OP$="/"› THEN TOTAL = TOTAL/NUM› 880 GOTO 530› 890 REM [Inv][3 *] INPUT [3 *][Norm]› 900 PLACE = 1› 910 IN$ = ""› 920 HEX = 0› 930 GET #1,KEY› 940 IF KEY>127› THEN KEY = KEY-128› : POKE 694,0› 950 IF KEY>ASC("Z")› THEN IF PEEK(702)<>64› THEN POKE 702,64› : KEY = KEY-32› 960 IF KEY=ASC("Z") AND LEN(IN$)› THEN POSITION 5,8› : ? CL$;"[Curs Lft]0"› : GOTO 890› 970 IF KEY=ASC("Z")› THEN 930› 980 IF KEY=ASC(".")› THEN 1030› LISTING OF : GRASSCAL.BAS PAGE 4 ( 4)›--------------------------------------------------------------------------------››› 990 IF KEY=ASC("[^M]")› THEN IN$ = STR$(MEMTOTAL)› : PLACE = LEN(IN$)› : GOTO 1040› 1000 IF IN$="" AND KEY=ASC("$")› THEN HEX = 1› : GOTO 1060› 1010 IF HEX› THEN IF KEY>=ASC("A") AND KEY<=ASC("F")› THEN 1030› 1020 IF KEYASC("9")› THEN 1100› 1030 IN$(PLACE,PLACE) = CHR$(KEY)› 1040 PLACE = PLACE+1› 1050 IF PLACE>15› THEN PLACE = 15› 1060 IF HEX› THEN DISPLAY$ = "$"› : DISPLAY$(2) = IN$› 1070 IF HEX=0› THEN DISPLAY$ = IN$› 1080 GOSUB 1160› 1090 GOTO 930› 1100 REM [Inv][3 *] RETURN FROM INPUT [3 *][Norm]› 1110 IF HEX› THEN DISPLAY$ = IN$› : GOSUB 1460› : IN$ = STR$(NUM)› 1120 IF LEN(IN$)› THEN GOSUB 1140› 1130 RETURN › 1140 REM [Inv][3 *] PRINT NUMBER [3 *][Norm]› 1150 IF PRNT› THEN GOSUB 1860› 1160 POSITION 3,8› :? OP$› 1170 POSITION 5,8› :? CL$› 1180 X = LEN(DISPLAY$)› 1190 POSITION 20-X,8› 1200 ? DISPLAY$› 1210 RETURN › 1220 REM [Inv][3 *] PRINT MEMORY [3 *][Norm]› 1230 TEMP$ = STR$(MEMTOTAL)› 1240 POSITION 5,6› :? CL$› 1250 X = LEN(TEMP$)› 1260 POSITION 20-X,6› 1270 ? TEMP$› 1280 RETURN › 1290 REM [Inv][3 *] DEC TO HEX [3 *][Norm]› 1300 IF TOTAL>=1000000000› THEN POSITION 5,8› : ? " Too Large! "› : GOTO 1700› 1310 I = 9› 1320 NUM = TOTAL› 1330 HEX$ = CL$› 1340 HEX$ = ""› LISTING OF : GRASSCAL.BAS PAGE 5 ( 5)›--------------------------------------------------------------------------------››› 1350 X = NUM› :NUM = INT(NUM/16)› 1360 X = X-NUM*16› 1370 IF X<10› THEN HEX$(I,I) = STR$(X)› : GOTO 1390› 1380 HEX$(I,I) = CHR$(X-10+ASC("A"))› 1390 IF NUM<>0› THEN I = I-1› : GOTO 1350› 1400 DISPLAY$ = "$"› 1410 DISPLAY$(2) = HEX$(I)› 1420 RETURN › 1430 REM [Inv][3 *] HEX TO DEC [3 *][Norm]› 1440 GOSUB 1290› 1450 DISPLAY$ = HEX$(I)› 1460 NUM = 0› 1470 FOR I = 1 TO LEN(DISPLAY$)› 1480 HEX$ = DISPLAY$(I,I)› 1490 IF DISPLAY$(I,I)<="9"› THEN NUM = NUM*16+VAL(HEX$)› : GOTO 1510› 1500 NUM = NUM*16+ASC(HEX$)-ASC("A")+10› 1510 NEXT I› 1520 DISPLAY$ = STR$(NUM)› 1530 RETURN › 1540 REM [Inv][3 *] ADD .00 [3 *][Norm]› 1550 IF HEX› THEN RETURN › 1560 FOR I = 1 TO LEN(DISPLAY$)› : IF DISPLAY$(I,I)="E"› THEN POP › : GOTO 1690› 1570 NEXT I› 1580 FOR I = 1 TO LEN(DISPLAY$)› 1590 IF DISPLAY$(I,I)="."› THEN POP › : LOC = I› : GOTO 1610› 1600 NEXT I› :DISPLAY$(LEN(DISPLAY$)+1) = ".00"› :GOTO 1690› 1610 IF LEN(DISPLAY$)=LOC+2› THEN 1690› 1620 IF LEN(DISPLAY$)=LOC+1› THEN DISPLAY$(LOC+2) = "0"› : GOTO 1690› 1630 X = ASC(DISPLAY$(LOC+3))› :X = X-48› 1640 IF X<=4› THEN DISPLAY$(LOC+3) = ""› : GOTO 1680› 1650 TEMP$ = DISPLAY$(LOC+1,LOC+2)› :X = VAL(TEMP$)› :X = X+1› 1660 IF X<10› THEN DISPLAY$(LOC+1) = "0"› : DISPLAY$(LOC+2) = STR$(X)› : GOTO 1680› LISTING OF : GRASSCAL.BAS PAGE 6 ( 6)›--------------------------------------------------------------------------------››› 1670 DISPLAY$(LOC+1) = STR$(X)› 1680 TOTAL = VAL(DISPLAY$)› 1690 RETURN › 1700 REM [Inv][3 *] PAUSE [3 *][Norm]› 1710 POKE 20,0› 1720 X = PEEK(20)› 1730 IF X<100› THEN 1720› 1740 POP › 1750 GOTO 440› 1760 REM [Inv][3 *] PRINTER ON/OFF [3 *][Norm]› 1770 PRNT = 1-PRNT› 1780 IF PRNT› THEN POSITION 33,10› : ? "[Inv]ON[Norm] "› 1790 IF NOT PRNT› THEN POSITION 33,10› : ? "[Inv]OFF[Norm]"› 1800 RETURN › 1810 REM [Inv][3 *] DECIMAL PLACES [3 *][Norm]› 1820 PLACES = 1-PLACES› 1830 IF PLACES› THEN POSITION 3,12› : ? "0.00"› 1840 IF NOT PLACES› THEN POSITION 3,12› : ? " 0. "› 1850 RETURN › 1860 REM [Inv][3 *] PRINT TO PRINTER [3 *][Norm]› 1870 IF PLACES› THEN GOSUB 1540› 1880 TEMP$ = OP$› :TEMP$(2) = " "› :TEMP$(3) = DISPLAY$› :LPRINT TEMP$› 1890 RETURN › 1900 REM [Inv][3 *] KILL THE BREAK KEY [3 *][Norm]› 1910 X = PEEK(16)-128› :IF X› THEN POKE 16,X› : POKE 53774,X› 1920 RETURN ›