Compucolor.org – Virtual Media

Listing of file='INTERP.BAS;01' on disk='vmedia/tiny_pascal-sector.ccvf'

10 DIM S(500),TR(15),MN(26),BR(5)
20 DIM M$(9)
30 M$(0)= "LIT":M$(1)= "OPR":M$(2)= "LOD"
40 M$(3)= "STO":M$(4)= "CAL":M$(5)= "INT"
50 M$(6)= "JMP":M$(7)= "JPC":M$(8)= "CSP"
60 PRINT "STARTING ADDRESS?"
70 INPUT Z
80 GOSUB 250
90 PC= P:GOSUB 320
100 BP= 0
110 PRINT ">"
120 INPUT CMD$
130 GOSUB 470
140 IF P> = 0THEN 110
150 PRINT
160 PRINT K;" INSTRUCTIONS EXECUTED"
170 END
180 B1= B
190 IF LE< = 0THEN 230
200 B1= S(B1)
210 LE= LE- 1
220 GOTO 190
230 BA= B1
240 RETURN
250 T= 0:B= 1:P= 0:ST= 0
260 S(1)= 0:S(2)= 0:S(3)= - 1
270 P0= 0:TP= 15:K= 0
280 FOR I= 0TO 15
290 TR(I)= - 1
300 NEXT I
310 RETURN
320 X= PC* 4+ Z
330 N= PEEK (X)
340 IF N< = 8THEN E$= " ":GOTO 360
350 N= N- 16:E$= "X"
360 X3= PEEK (X+ 3)* 256+ PEEK (X+ 2)
370 PRINT " ",PC," ",M$(N)+ E$,"  ",PEEK (X+ 1),"  ",X3
380 RETURN
390 IF P< 0THEN ST= 1:RETURN
400 FOR I= 1TO BP
410 IF BR(I)< > PTHEN 450
420 PRINT "BREAK: "
430 PC= P:GOSUB 320
440 ST= 1
450 NEXT I
460 RETURN
470 IF CMD$< > "R"THEN 520
480 ST= 0
490 GOSUB 1010:GOSUB 390
500 IF ST= 0THEN 490
510 RETURN
520 IF CMD$< > "S"THEN 550
530 GOSUB 1010:PC= P:GOSUB 320
540 RETURN
550 IF CMD$< > "X"THEN 590
560 PRINT "P=",P,"B=",B,"T=",T
570 PRINT "S(T)=",S(T),"S(T-1)=",S(T- 1)
580 RETURN
590 IF CMD$< > "G"THEN 640
600 GOSUB 250
610 GOSUB 1010:GOSUB 390
620 IF ST= 0THEN 610
630 RETURN
640 IF CMD$< > "T"THEN 700
650 PRINT "*TRACE*"
660 FOR I= 0TO 15
670 TP= TP+ 1:IF TP> 15THEN TP= 0
680 IF TR(TP)> = 0THEN PC= TR(TP):GOSUB 320
690 NEXT I
700 IF CMD$< > "K"THEN 760
710 INPUT I
720 FOR J= ITO I+ 6
730 PRINT S(J)
740 NEXT J
750 RETURN
760 IF CMD$< > "B"THEN 800
770 IF BP= 5THEN RETURN
780 BP= BP+ 1:PRINT BP,":"
790 INPUT BR(BP):RETURN
800 IF CMD$< > "C"THEN 820
810 BP= 0:RETURN
820 IF CMD$< > "Y"THEN 870
830 FOR I= 0TO BP
840 PRINT " ",BR(I)
850 NEXT I
860 RETURN
870 IF CMD$< > "E"THEN 910
880 INPUT P0
890 PC= P0:GOSUB 320
900 RETURN
910 IF CMD$< > "V"THEN 950
920 IF P0= 0THEN RETURN
930 P0= P0- 1:PC= P0:GOSUB 320
940 RETURN
950 IF CMD$< > "N"THEN 980
960 P0= P0+ 1:PC= P0:GOSUB 320
970 RETURN
980 IF CMD$< > "Q"THEN RETURN
990 P= - 1
1000 RETURN
1010 X= P* 4+ Z
1020 A= PEEK (X+ 3)* 256+ PEEK (X+ 2)
1030 TP= TP+ 1
1040 IF TP> 15THEN TP= 0
1050 TR(TP)= P
1060 P= P+ 1:P0= P:K= K+ 1
1070 F= PEEK (X)
1080 IF F< = 8THEN IX= 0:GOTO 1100
1090 IX= 1:F= F- 16
1100 IF F> 0THEN 1120
1110 T= T+ 1:S(T)= A:RETURN
1120 IF F> 1THEN 1570
1130 ON INT (A/ 5)+ 1GOTO 1140,1150,1160,1170,1180
1140 ON A+ 1GOTO 1190,1200,1210,1220,1230
1150 ON A- 4GOTO 1240,1250,1260,1270,1290
1160 ON A- 9GOTO 1310,1330,1350,1370,1390
1170 ON A- 14GOTO 1400,1410,1420,1480,1540
1180 ON A- 19GOTO 1550,1560
1190 T= B- 1:B= S(T+ 2):P= S(T+ 3):RETURN
1200 S(T)= - S(T):RETURN
1210 T= T- 1:S(T)= S(T)+ S(T+ 1):RETURN
1220 T= T- 1:S(T)= S(T)- S(T+ 1):RETURN
1230 T= T- 1:S(T)= S(T)* S(T+ 1):RETURN
1240 T= T- 1:S(T)= INT (S(T)/ S(T+ 1)+ .5):RETURN
1250 S(T)= S(T)AND 1:RETURN
1260 T= T- 1:S(T)= S(T)- S(T+ 1)* INT (S(T)/ S(T+ 1)):RETURN
1270 T= T- 1:IF S(T)= S(T+ 1)THEN S(T)= 1:RETURN
1280 S(T)= 0:RETURN
1290 T= T- 1:IF S(T)= S(T+ 1)THEN S(T)= 0:RETURN
1300 S(T)= 1:RETURN
1310 T= T- 1:IF S(T)< S(T+ 1)THEN S(T)= 1:RETURN
1320 S(T)= 0:RETURN
1330 T= T- 1:IF S(T)< S(T+ 1)THEN S(T)= 0:RETURN
1340 S(T)= 1:RETURN
1350 T= T- 1:IF S(T)> S(T+ 1)THEN S(T)= 1:RETURN
1360 S(T)= 0:RETURN
1370 T= T- 1:IF S(T)> S(T+ 1)THEN S(T)= 0:RETURN
1380 S(T)= 1:RETURN
1390 T= T- 1:S(T)= S(T)OR S(T+ 1):RETURN
1400 T= T- 1:S(T)= S(T)AND S(T+ 1):RETURN
1410 S(T)= NOT S(T):RETURN
1420 T= T- 1
1430 IF S(T+ 1)= 0THEN RETURN
1440 FOR IX= 1TO S(T+ 1)
1450 S(T)= S(T)* 2
1460 NEXT IX
1470 RETURN
1480 T= T- 1
1490 IF S(T)= 0THEN RETURN
1500 FOR IX= 1TO S(T+ 1)
1510 S(T)= INT (S(T)/ 2)
1520 NEXT IX
1530 RETURN
1540 S(T)= S(T)+ 1:RETURN
1550 S(T)= S(T)- 1:RETURN
1560 T= T+ 1:S(T)= S(T- 1):RETURN
1570 IF F> 2THEN 1640
1580 L= PEEK (X+ 1)
1590 IF L= 255THEN S(T)= PEEK (S(T)):RETURN
1600 IF IX= 1THEN A= A+ S(T)
1610 T= T+ 1- IX
1620 LE= L:GOSUB 180
1630 S(T)= S(BA+ A):RETURN
1640 IF F> 3THEN 1720
1650 L= PEEK (X+ 1)
1660 IF L= 255THEN 1700
1670 IF IX= 1THEN A= S(T- 1)+ A
1680 LE= L:GOSUB 180
1690 S(BA+ A)= S(T):T= T- 1- IX:RETURN
1700 POKE S(T- 1),S(T)
1710 T= T- 2:RETURN
1720 IF F> 4THEN 1780
1730 L= PEEK (X+ 1)
1740 IF L= 255THEN POKE 33283,S(T)/ 256:POKE 33284,S(T)- INT (S(T)/ 256)* 256:QQ= CALL (S(T)):T= T- 1:RETURN
1750 LE= L:GOSUB 180
1760 S(T+ 1)= BA:S(T+ 2)= B:S(T+ 3)= P
1770 B= T+ 1:P= A:RETURN
1780 IF F> 5THEN 1810
1785 PRINT "A="A"";
1790 IF T< = (480- A)THEN T= T+ A:RETURN
1800 PRINT "STACK OVFL":ST= 1:RETURN
1810 IF F> 6THEN 1830
1820 P= A:RETURN
1830 IF F> 7THEN 1860
1840 IF S(T)= PEEK (X+ 1)THEN P= A
1850 T= T- 1:RETURN
1860 IF A> 0THEN 1890
1870 T= T+ 1:INPUT C$
1880 S(T)= ASC (C$):RETURN
1890 IF A> 1THEN 1920
1900 C$= CHR$ (S(T))
1910 PRINT C$;:T= T- 1:RETURN
1920 IF A> 2THEN 1950
1930 T= T+ 1:INPUT N
1940 S(T)= N:RETURN
1950 IF A> 3THEN 1970
1960 PRINT S(T);:T= T- 1:RETURN
1970 IF A> 4THEN 1990
1980 PRINT :PRINT "*** REQUIRES 'INHEX' ***":GOTO 150
1990 IF A= 8THEN 2010
2000 PRINT :PRINT "*** REQUIRES 'OUTHEX' ***":GOTO 150
2010 C$= "":FOR IX= T- S(T)TO T- 1
2020 C$= C$+ CHR$ (S(IX)):NEXT IX
2030 PRINT C$;:T= T- S(T)- 1:RETURN