10 ' CALCULATOR PROGRAM BOTH DECIMAL AND HEX IS SUPPORTED 20 ' HANK SZYSZKA 10/14/1981 BEARSVILLE, NEW YORK 30 ' 40 ' Modified to run on Amstrad computers by Advantage Computer User Group 50 REM *** July 1986 *** V1.1 *** 60 clrs$=CHR$(27)+"E"+CHR$(27)+"H"+CHR$(12) 70 PRINT CLRS$ 80 ' 90 DEFINT I,P 100 ' CALC RESTART HERE 110 IF SP<>0 THEN GOTO 360 120 PRINT CLRS$ 130 COL=0:ROW=5 140 GOSUB 1300 'SET CURSOR ROUTINE 150 PRINT "+ = + = + = C O M P U T E R C A L C U L A T O R + = + = + =":PRINT:PRINT 160 A$="LAST OPERAND: "+OPR$:GOSUB 1320 170 TB=47:A$="HEXADECIMAL REGISTER":GOSUB 1320:A$="":GOSUB 1360 180 PRINT:A$="OLD TOTAL":GOSUB 1320:TB=(43-(LEN(STR$(OT)))):A$=STR$(OT):GOSUB 1320 190 HX=OT:GOSUB 1100 : HX=OT:GOSUB 1130 200 PRINT:A$="ENTERED":GOSUB 1320:TB=(43-(LEN(STR$(ENTRY)))):A$=STR$(ENTRY):GOSUB 1320 210 HX=ENTRY:GOSUB 1100 : HX=ENTRY:GOSUB 1130 220 PRINT:A$="NEW TOTAL":GOSUB 1320:TB=(43-(LEN(STR$(NT)))):A$=STR$(NT):GOSUB 1320 230 HX=NT:GOSUB 1100 : HX=NT:GOSUB 1130 240 PRINT:A$="MEMORY":GOSUB 1320:TB=(43-(LEN(STR$(MEM)))):A$=STR$(MEM):GOSUB 1320 250 HX=MEM:GOSUB 1100 : HX=MEM:GOSUB 1130 260 A$="":GOSUB 1360 270 A$="ADD------ + CLEAR ALL------- C SET MEMORY- S HEX------ X" 280 GOSUB 1360 290 A$="SUBTRACT- - CLEAR, SAVE MEM- Q USE MEMORY- M INFO----- I" 300 GOSUB 1360 310 A$="MULTIPLY- * DECIMAL POINT--- . QUIT------- 'QUIT'" 320 GOSUB 1360 330 A$="DIVIDE--- / RESET----------- R REPEAT----- 'ENTER'" 340 GOSUB 1360 350 A$="":GOSUB 1360 360 A$="ENTER:":GOSUB 1210 ' GET INPUT DATA 370 OPR$="" 380 OT=NT:ENTRY=VAL(NVA$) 390 IF NVA$ = "QUIT" THEN GOSUB 1330 : GOTO 1390 400 IF NVA$="I" THEN GOSUB 1290 : GOSUB 830 : GOTO 100 410 IF LEFT$(NVA$,1) = " " THEN GOTO 950 420 IF LEFT$(NVA$,1) = "*" THEN GOSUB 750 : GOSUB 780 : GOTO 100 430 IF LEFT$(NVA$,1) = "/" THEN GOSUB 750 : GOSUB 570 : GOTO 100 440 IF LEFT$(NVA$,1) = "-" THEN GOSUB 750 : GOSUB 620 : GOTO 100 450 IF LEFT$(NVA$,1) = "+" THEN GOSUB 750 : NVA$=VA$ 460 IF LEFT$(NVA$,1) = "X" THEN GOSUB 750 : GOSUB 680 : GOTO 100 470 IF NVA$="C" THEN VA$="0":ENTRY=0:NT=0:MEM=0:OT=0:OPR$=" CLEAR ALL:":GOTO 100 480 IF NVA$="S" THEN MEM=NT :OPR$=" MEMORY SAVE:": GOTO 100 490 IF NVA$="Q" THEN OT=0 :NT=0:ENTRY=0:OPR$=" CLEAR MEMORY:": GOTO 100 500 IF NVA$="M" THEN ENTRY=MEM : NT=NT+ENTRY:OPR$=" MEMORY USE:": GOTO 100 510 IF NVA$="R" THEN ENTRY=0:OPR$=" RESET:":GOTO 100 520 NT=NT+(VAL(NVA$)) 530 ENTRY=VAL(NVA$) 540 IF NVA$="" THEN GOTO 100 550 OPR$=" ADDITION:" 560 GOTO 100 570 ' DIVIDE ROUTINE *********** 580 IF VA$="M" THEN ENTRY=MEM:NT=NT/ENTRY:GOTO 600 590 NT = NT / (VAL(VA$)) 600 OPR$=" DIVIDE :" 610 RETURN 620 ' SUBTRACT ROUTINE ************* 630 IF VA$="M" THEN NT=NT-MEM :ENTRY=-MEM: GOTO 660 640 NT = NT-(VAL(VA$)) 650 ENTRY=-VAL(VA$) 660 OPR$=" SUBTRACT:" 670 RETURN 680 ' HEX CONVERSION HERE 690 OPR$=" HEX DATA ENTRY: " 700 HN$=VA$ : GOSUB 990 710 ENTRY=ST 720 NT=NT+ENT 730 ' 740 RETURN 750 VA$=RIGHT$(NVA$,(LEN(NVA$)-1)) 760 ENTRY=VAL(VA$) 770 RETURN 780 ' MULTIPLY ROUTINE ***************** 790 IF VA$="M" THEN ENTRY=MEM:NT=NT*MEM:GOTO 810 800 NT = VAL(VA$)*NT 810 OPR$=" MULTIPLY :" 820 RETURN 830 ' HERE FOR HELP MESSAGES 840 COL=0:ROW=5:GOSUB 1300 : GOSUB 1360 850 A$="MAXIMUM INPUT: 16 DECIMAL DIGITS, 4 HEXADICIMAL DIGITS.":GOSUB 1360 860 A$=" OUTPUT: 16 DECIMAL DIGITS, 4 HEXADICIMAL DIGITS.":GOSUB 1360 870 A$="VALUES MAY BE CHAINED BY SEPARATING THEM WITH A BLANK,":GOSUB 1360 880 A$="THE OPERATORS (+,-,*,/,X) PRECEED THE VALUE WITH NO":GOSUB 1360 890 A$="INTERVENING BLANK, EG, 1 +2 *4 /5 -2 (DEFALT OPERATOR IS ADD)." 900 GOSUB 1360 910 A$="FUNCTION CHAINING OF (C,Q,R,S,I) IS NOT PERMITTED.":GOSUB 1360 920 OPR$=" INFORMATION " 930 A$="PRESS RETURN KEY:":GOSUB 1210 940 GOTO 100 950 OPR$=" IMPROPER ENTRY:" 960 NVA$="0":VA$="0" 970 GOTO 100 980 '********** HEX CONVERSION ROUTINE ************ 990 L=LEN(HN$):P=L:ST=0 1000 C$="123456789ABCDEF" 1010 FOR I%=1 TO L 1020 P=P-1 1030 H$=MID$(HN$,I%,1) 'GET DIGIT 1040 T=INSTR (C$,H$) 1050 IF H$>"F" THEN OPR$=" ERROR *****":GOTO 100 1060 ST=ST+(T*(16^(P))) 1070 NEXT I% 1080 RETURN 1090 ' DECIMAL TO HEX TRANSLATE 1100 IF HX<0 THEN HX=HX-(2*HX) 1110 GOSUB 1160 :TB=55:GOSUB 1330 1120 RETURN 1130 ' CONVERT HEX ENTRY TO HEX PRINT OUT 1140 GOSUB 1160 :TB=64:GOSUB 1330:A$="":GOSUB 1360 1150 RETURN 1160 IF HX>65535 THEN A$="OVERFLOW":RETURN 1170 IF HX<-32768 THEN A$="OVERFLOW":RETURN 1180 LET A$=HEX$(HX) 1190 IF HX<0 THEN A$="FF"+A$ 1200 RETURN 1210 ' HERE FOR LINE INPUT FUNCTION 1220 COL=0:ROW=21:GOSUB 1300 1230 TB=0:GOSUB 1320 1240 IF SAV$="" THEN LINE INPUT ;SAV$ 1250 SP=INSTR(SAV$," "):IF SP=0 AND SAV$="" GOTO 1280 1260 IF SP=0 AND SAV$<>"" THEN NVA$=SAV$ :SAV$="": GOTO 1280 1270 NVA$=LEFT$(SAV$,SP-1):SAV$=MID$(SAV$,SP+1) 1280 RETURN 1290 PRINT CLRS$:RETURN 1300 ' CURSOR POSITIONING ROUTINE 1310 RETURN 1320 ' PRINT OUTPUT ROUTINE 1330 PRINT TAB(TB);A$; 1340 A$="":TB=0 1350 RETURN 1360 PRINT A$ 1370 A$="" 1380 RETURN 1390 END 1400 LINE INPUT #1,A$ ' DUMMY ENTRY FOR LINE INPUT BUG. DECIMAL AND HEX IS SUPPORTED 20 ' HANK SZYSZKA 10/14/1981 BEARSVILLE, NEW YORK 30 ' 40 ' Modifie