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 Z19 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