10  REM-BASCAL-BASE CALCULATOR
15  REM HP 36847A, 6/74
20  REM-PETER KATZ, 10,30,73, RAVENSWOOD
30  PRINT "DO YOU WANT INSTRUCTIONS";
40  INPUT B$[1,1]
50  IF B$[1,1]="N" THEN 170
60  PRINT "THIS PROGRAM IS A BASE CALCULATOR"
70  PRINT "FIRST YOU TELL THE COMPUTER YOUR COMMAND;"
80  PRINT "EITHER ADD, SUBTRACT, MULTIPLY, OR DIVIDE,"
90  PRINT "THEN INPUT ANY TWO NUMBERS AND THEIR RESPECTIVE BASES (2-10),"
100  PRINT "AND THE BASE IN WHICH YOU WANT THE ANSWER PRINTED."
110  PRINT "THE COMPUTER WILL FIGURE OUT THE ANSWER AND PRINT IT"
120  PRINT "IN THAT BASE."
130  PRINT "NEGATIVE NUMBERS ARE ACCEPTABLE, BUT NOT FRACTIONS"
140  PRINT "OR DECIMALS."
150  PRINT "IN DIVISION, THE QUOTIENT IS ROUNDED OFF TO THE NEAREST"
160  PRINT "WHOLE NUMBER.  (.5 AND UP IS ROUNDED TO 1)"
170  PRINT 
180  DIM A$[4],R$[15]
190  A$="ASMD"
200  PRINT "ENTER YOUR COMMAND";
210  INPUT F$[1,1]
220  FOR F=1 TO 4
230  IF F$[1,1]=A$[F,F] THEN 270
240  NEXT F
250  PRINT "INVALID COMMAND"
260  GOTO 200
270  PRINT "ENTER FIRST NUMBER";
280  INPUT B[1]
290  PRINT "AND ITS BASE";
300  INPUT Q[1]
310  PRINT "INPUT THE SECOND NUMBER";
320  INPUT B[2]
330  PRINT "AND ITS BASE";
340  INPUT Q[2]
350  PRINT "ENTER DESIRED BASE";
360  INPUT Z
370  REM ****FOR NEXT LOOP CHECKS IF NUMBER AND BASE ARE ACCEPTABLE
380  REM ****AND PUTS THE NUMBER INTO BASE 10
390  FOR D=1 TO 2
400  N[D]=ABS(B[D])
410  IF Q[D]<2 OR Q[D]>10 OR Z<2 OR Z>10 THEN 1090
420  IF Q[D]#INT(Q[D]) OR Z#INT(Z) OR N[D]#INT(N[D]) THEN 1090
430  M=0
440  A=1
450  IF N[D]<10^A THEN 480
460  A=A+1
470  GOTO 450
480  A=A-1
490  IF A=0 THEN 560
500  W=INT(.1^A*N[D]+.00005)
510  IF W >= Q[D] THEN 1090
520  X=W*Q[D]^A
530  N[D]=N[D]-10^A*W
540  M=M+X
550  GOTO 480
560  IF N[D] >= Q[D] THEN 1090
570  P[D]=SGN(B[D])*(M+N[D])
580  NEXT D
590  GOTO F OF 610,650,690,730
600  REM ****ADD ROUTINE****
610  R=P[1]+P[2]
620  R$="SUM"
630  GOTO 820
640  REM ****SUBTRACT ROUTINE****
650  R=P[1]-P[2]
660  R$="DIFFERENCE"
670  GOTO 820
680  REM ****MULTIPLY ROUTINE****
690  R=P[1]*P[2]
700  R$="PRODUCT"
710  GOTO 820
720  REM ****DIVISION ROUTINE****
730  R=P[1]/P[2]
740  R$="QUOTIENT"
750  IF R=INT(R) THEN 820
760  IF R-INT(R) >= .5 THEN 800
770  R=INT(R)
780  IF R=0 THEN 1130
790  GOTO 820
800  R=INT(R)+1
810  REM ****COMPUTER PUTS THE RESULT INTO DESIRED BASE
820  X=0
830  A=1
840  P=ABS(R)
850  IF P<Z^A THEN 880
860  A=A+1
870  GOTO 850
880  A=A-1
890  IF A=0 THEN 1020
900  B=1
910  J=B*Z^A
920  IF J>P THEN 950
930  B=B+1
940  GOTO 910
950  B=B-1
960  IF B>9 THEN 1090
970  J=B*Z^A
980  Y=B*10^A
990  X=X+Y
1000  P=P-J
1010  GOTO 880
1020  E=SGN(R)*(X+P)
1030  PRINT 
1040  PRINT "THE "R$" IN BASE "Z" IS "E
1050  PRINT 
1060  PRINT 
1070  GOTO 200
1080  REM ****ERROR ROUTINES
1090  PRINT 
1100  PRINT "SOMETHING IS WRONG, START OVER"
1110  PRINT 
1120  GOTO 200
1130  PRINT 
1140  PRINT "QUOTIENT TOO SMALL TOO BE COMPUTED"
1150  PRINT 
1160  GOTO 200
1170  END 
