1  REM  **** HP BASIC PROGRAM LIBRARY  *******************************
2  REM
3  REM        STOP:  COMPUTER LITERACY - PSEUDO MACHINE LANGUAGE
4  REM
5  REM       36208  REV B  --  10/73
6  REM
7  REM ****  CONTRIBUTED PROGRAM **************************************
10  DIM A$[10],B$[10]
20  DIM A[500],C$[72]
25  DIM D$[72]
30  B$="0123456789"
40  A$="000000000 "
45  R=0
50  PRINT "TYPE AN 'E' TO INDICATE YOU HAVE FINISHED INPUTTING."
70  PRINT 
80  MAT A=ZER
90  PRINT "BEGIN TYPING IN YOUR   S T O P   PROGRAM."
100  FOR K=1 TO 72
110  C$[K,K]=" "
120  NEXT K
130  INPUT C$
140  IF C$="E" THEN 540
150  I=J=0
160  IF C$[4,4]="," THEN 190
170  PRINT "ILLEGAL FORMAT. RE-TYPE STATEMENT."
180  GOTO 130
190  IF C$[10,10]=" " THEN 230
200  IF C$[5,5]="-" THEN 230
210  IF C$[5,5]="+" THEN 230
220  GOTO 170
230  FOR K=11 TO 72
240  IF C$[K,K]#" " THEN 170
250  NEXT K
252  GOSUB 261
253  IF L=99 THEN 170
254  GOTO 350
261  C5=2
270  FOR K=1 TO 3
280  FOR L=1 TO 10
290  IF C$[K,K]=B$[L,L] THEN 320
300  NEXT L
310  L=99
315  GOTO 342
320  I=I+((L-1)*10^C5)
330  C5=C5-1
340  NEXT K
342  RETURN 
350  C5=4
360  IF C$[10,10]=" " THEN 400
370  I1=6
380  I2=10
390  GOTO 420
400  I1=5
410  I2=9
420  FOR K=I1 TO I2
430  FOR L=1 TO 10
440  IF C$[K,K]=B$[L,L] THEN 470
450  NEXT L
460  GOTO 170
470  J=J+((L-1)*10^C5)
480  C5=C5-1
490  NEXT K
500  IF C$[5,5]#"-" THEN 520
510  J=J*(-1)
520  A[I]=J
530  GOTO 100
540  PRINT "TYPE 0 TO RUN, 1 TO EDIT, 2 TO LIST, 3 TO STEP."
550  INPUT Z
560  PRINT 
570  IF Z=1 THEN 620
580  IF Z=0 THEN 650
590  IF Z=2 THEN 1940
600  IF Z=3 THEN 650
610  GOTO 540
620  PRINT "BEGIN EDITING."
630  PRINT 
640  GOTO 100
650  PRINT "INPUT THE STARTING ADDRESS."
660  INPUT C$
662  I=0
664  FOR K=4 TO 72
666  IF C$[K,K]#" " THEN 690
668  NEXT K
670  GOSUB 261
672  IF L=99 THEN 690
674  Q3=I
676  PRINT 
680  GOTO 710
690  PRINT "BAD ADDRESS! TRY AGAIN!"
700  GOTO 650
710  IF Z#3 THEN 870
720  PRINT "  ADD.";"   ACCUM."
730  GOTO 870
740  IF Z#3 THEN 840
750  PRINT 
760  I=Q3
770  GOSUB 2080
780  P3=R
790  GOSUB 2260
800  PRINT "  "A$[1,3]"    "A$[5,10]
810  A$[1,10]="000000000 "
820  INPUT Z
830  GOTO 860
840  IF Z=0 THEN 860
850  GOTO 540
860  Q3=Q3+1
870  A=A[Q3]
880  GOSUB 1050
890  IF X>0 AND X <= 12 THEN 910
900  IF X#15 AND X#17 THEN 950
910  N=1
920  IF X=N THEN 970
930  N=N+1
940  GOTO 920
950  PRINT '10"ILLEGAL OPCODE!"'10
960  GOTO 540
970  GOTO N OF 1120,1160,1220,1280,1340,1400,1440,1480,1540,1570,1610,1680
980  IF N=15 THEN 1760
990  IF N=17 THEN 1790
1000  PRINT "ILLEGAL PROGRAM ADDRESS REFERENCED."
1010  GOTO 540
1020  PRINT "ILLEGAL OPCODE."
1030  GOTO 540
1040  REM THIS SUBROUTINE RETURNS THE OPCODE
1050  X=INT(A*.001)
1060  RETURN 
1070  REM THIS SUBROUTINE RETURNS THE OPERAND
1080  X=A-(INT(A*.001)*1000)
1090  IF X<0 OR X>999 THEN 1000
1100  IF X=0 AND N#17 THEN 1000
1110  RETURN 
1120  REM OPCODE 01
1130  GOSUB 1080
1140  R=A[X]
1150  GOTO 740
1160  REM OPCODE 02
1170  GOSUB 1080
1180  R=R+A[X]
1190  R2=R
1200  GOSUB 1850
1210  GOTO 740
1220  REM OPCODE 03
1230  GOSUB 1080
1240  R=R-A[X]
1250  R2=R
1260  GOSUB 1850
1270  GOTO 740
1280  REM OPCODE 04
1290  GOSUB 1080
1300  R=R*A[X]
1310  R2=R
1320  GOSUB 1850
1330  GOTO 740
1340  REM OPCODE 05
1350  GOSUB 1080
1360  IF A[X]#0 THEN 1380
1370  GOTO 1710
1380  R=INT(R/A[X])
1390  GOTO 740
1400  REM OPCODE 06
1410  GOSUB 1080
1420  A[X]=R
1430  GOTO 740
1440  REM OPCODE 07
1450  GOSUB 1080
1452  P3=A[X]
1454  A$[1,10]="000000000 "
1456  GOSUB 2260
1460  PRINT A$[5,10]
1462  A$[1,10]="000000000 "
1470  GOTO 740
1480  REM OPCODE 08
1490  IF R<0 THEN 1510
1500  GOTO 740
1510  GOSUB 1080
1520  Q3=X
1530  GOTO 870
1540  REM OPCODE 09
1550  PRINT "HALT"'10
1560  GOTO 540
1570  REM OPCODE 10   UNCONDITIONAL JUMP
1580  GOSUB 1080
1590  Q3=X
1600  GOTO 870
1610  REM OPCODE 11  MULTI-COLUMN PRINT
1620  GOSUB 1080
1630  IF ABS(A[X]) <= 99999. THEN 1660
1640  R2=A[X]
1650  GOTO 1850
1660  PRINT A[X];
1670  GOTO 740
1680  REM OPCODE 12
1690  GOSUB 1080
1700  IF A[X]#0 THEN 1740
1710  PRINT "ATTEMPT TO DIVIDE BY ZERO AT LOCATION "Q3
1720  PRINT 
1730  GOTO 540
1740  R=R-INT(R/A[X])*A[X]
1750  GOTO 740
1760  REM OPCODE 15
1770  IF R=0 THEN 1510
1780  GOTO 740
1790  REM OPCODE 17
1800  GOSUB 1080
1810  R1=R/10^X
1820  IF ABS(R1) <= 99999. THEN 1920
1830  R2=R1
1840  GOSUB 1850
1850  IF ABS(R2) <= 99999. THEN 1910
1860  PRINT "ACCUMULATOR OVERFLOW. HIGH ORDER DIGITS TRUNCATED."
1870  R3=INT(R2/100000.)
1880  R=R2-R3*100000.
1890  PRINT "VALUE OF ACCUMULATOR IS "R
1900  PRINT 
1910  RETURN 
1920  P3=R1
1922  A$[1,10]="000000000 "
1924  GOSUB 2260
1926  PRINT A$[5,10]
1928  A$[1,10]="000000000 "
1930  GOTO 740
1940  PRINT "INPUT THE STARTING AND ENDING ADDRESSES FOR THE LISTING."
1950  INPUT D$
1952  IF D$[4,4]#"," THEN 2000
1954  FOR K=8 TO 72
1956  IF D$[K,K]#" " THEN 2000
1958  NEXT K
1960  C$=D$[1,3]
1962  I=0
1964  GOSUB 261
1966  IF L=99 THEN 2000
1968  Z1=I
1970  I=0
1972  C$=D$[5,7]
1974  GOSUB 261
1976  IF L=99 THEN 2000
1978  Z2=I
1979  PRINT 
1980  IF Z1>0 AND Z1<Z2 THEN 1990
1982  GOTO 2000
1990  IF Z2<1000 THEN 2020
2000  PRINT "ILLEGAL LIST PARAMETERS."
2010  GOTO 1940
2020  FOR I=Z1 TO Z2
2030  A$[4,4]=","
2040  GOSUB 2080
2050  P3=A[I]
2060  GOSUB 2260
2070  GOTO 2460
2080  IF I>9 THEN 2120
2090  A$[1,2]="00"
2100  A$[3,3]=B$[I+1]
2110  GOTO 2250
2120  IF I>99 THEN 2190
2130  A$[1,1]="0"
2140  L1=INT(I/10)
2150  A$[2,2]=B$[L1+1]
2160  L1=I-L1*10
2170  A$[3,3]=B$[L1+1]
2180  GOTO 2250
2190  L1=INT(I/100)
2200  A$[1,1]=B$[L1+1]
2210  L2=INT((I-L1*100)/10)
2220  A$[2,2]=B$[L2+1]
2230  L1=I-((L1*100)+(L2*10))
2240  A$[3,3]=B$[L1+1]
2250  RETURN 
2260  IF P3 >= 0 THEN 2310
2270  P3=P3*(-1)
2280  P1=6
2290  A$[5,5]="-"
2300  GOTO 2320
2310  P1=5
2320  IF P3>9999 THEN 2350
2330  L1=0
2340  GOTO 2360
2350  L1=INT(P3/10000)
2360  A$[P1,P1]=B$[L1+1]
2370  L2=INT((P3-L1*10000)/1000)
2380  A$[P1+1,P1+1]=B$[L2+1]
2390  L3=INT((P3-((L1*10000)+(L2*1000)))/100)
2400  A$[P1+2,P1+2]=B$[L3+1]
2410  L4=INT((P3-((L1*10000)+(L2*1000)+(L3*100)))/10)
2420  A$[P1+3,P1+3]=B$[L4+1]
2430  L5=P3-((L1*10000)+(L2*1000)+(L3*100)+(L4*10))
2440  A$[P1+4,P1+4]=B$[L5+1]
2450  RETURN 
2460  PRINT A$
2470  IF A$[5,5]#"-" THEN 2480
2480  A$[1,10]="000000000 "
2490  NEXT I
2500  PRINT 
2510  GOTO 540
2520  STOP 
2530  END 
