Listing of file='PASCAL.BAS;01' on disk='vmedia/tiny_pascal-sector.ccvf'
0 REM 10 CLEAR 5000:PLOT 6,7,15,27,11,12 15 PRINT TAB( 15)"PASCAL SUBSET COMPILER" 17 PRINT TAB( 15)"eeeeeeeeeeeeeeeeeeeeee" 20 PRINT :PRINT TAB( 30)"FROM BYTE MAGAZINE (KIN-MAN CHUNG)" 30 PRINT :PRINT :REM COMPUCOLOR VERSION BY T G PRICE 8/80 40 N0= 32:REM # OF RESERVED WORDS 50 T0= 50:REM SYM TABLE SIZE 60 N1= 32767:REM LARGEST INT 70 N2= 8:REM IDENT LEN 80 DIM W0$(N0):REM RESERVED WORDS 90 DIM T$(T0):REM SYMBOL TABLE 100 DIM T0$(T0):REM KIND OF IDENT IN SYM TABLE : C,V,P 110 REM L$ IS LINE BUFFER OF MAX LEN 64 120 REM A$ OF LEN N2 IS IDENT:B$ OF LEN 5 IS RESERVED WORD 130 DIM S(100),S$(100):REM STACKS 140 DIM T1(T0):REM LEVEL OF ID IN SYM TABLE 150 DIM T2(T0):REM VAL FOR CONST OR ADR FOR INT OF ID IN S T 160 DIM T3(T0):REM ARRAY DIM OR # OF PROC PARAMETERS 170 W0$(1)= "AND":W0$(2)= "ARRAY":W0$(3)= "BEGIN" 173 W0$(4)= "CALL":W0$(5)= "CASE":W0$(6)= "CONST" 176 W0$(7)= "DIV":W0$(8)= "DO":W0$(9)= "DOWNT" 179 W0$(10)= "ELSE":W0$(11)= "END":W0$(12)= "FOR" 182 W0$(13)= "FUNC":W0$(14)= "IF":W0$(15)= "INTEG" 185 W0$(16)= "MEM":W0$(17)= "MOD":W0$(18)= "NOT" 188 W0$(19)= "OF":W0$(20)= "OR":W0$(21)= "PROC" 191 W0$(22)= "SHL":W0$(23)= "SHR":W0$(24)= "THEN" 194 W0$(25)= "TO":W0$(26)= "TYPE":W0$(27)= "UNTIL" 197 W0$(28)= "VAR":W0$(29)= "WHILE":W0$(30)= "WRITE" 198 W0$(31)= "READ":W0$(32)= "REPEA" 200 REM SPACE FILLER 210 DIM M$(9),C$(80) 220 M$(1)= "LIT":M$(2)= "OPR":M$(3)= "LOD" 223 M$(4)= "STO":M$(5)= "CAL":M$(6)= "INT" 227 M$(7)= "JMP":M$(8)= "JPC":M$(9)= "CSP" 229 REM P-CODE MNEMONICS 230 P8= 1 240 INPUT "ENTER P-CODE START ADDRESS:";P7:PRINT "" 245 P9= P7 250 PRINT :PRINT TAB( 25)"PCODE STARTS AT";P7 260 Q9= 65535:REM LAST USABLE MEM 280 PRINT :INPUT "DO YOU WISH THE P-CODES DISPLAYED ?";Y$ 290 Y9= 1:IF Y$= "Y"THEN Y9= 0 295 PRINT :INPUT "PASCAL SOURCE FILE >";L$ 296 INPUT "HOW MANY BLOCKS";SZ 297 FILE "R",3,L$+ ".P",1;1,128* SZ,1 298 C0= 1:L$= "" 300 X$= " ":GOSUB 1240:REM GET A TOKEN 310 GOSUB 5340:REM BLOCK 320 K$= ".":E= 9:GOSUB 420:REM ERROR CHECK 330 POKE P9,255:POKE P9+ 1,255:REM POKE IN EOF MARKER 340 PRINT :PRINT :PRINT "COMPILATION COMPLETE." 350 FILE "C",3:PRINT "P-CODE STARTS AT"P7" : ENDS AT"P9 360 END 390 REM **************** 400 REM ERROR ROUTINES 410 REM **************** 420 REM ERROR CHECK FOR CURRENT TOKEN 430 IF S0$= K$THEN RETURN 450 E9= E 470 GOSUB 610 480 PRINT "FATAL ERROR - COMPILATION TERMINATED":END 500 REM **************** 510 REM ERROR CHECK FOR NEXT TOKEN 520 GOSUB 1240 530 IF S0$= K$THEN RETURN 550 E9= E 570 GOSUB 610 580 PRINT "FATAL ERROR - COMPILATION TERMINATED":END 600 REM **************** 610 REM ERROR MESSAGES 615 PRINT "ERROR #"E9" DETECTED - "; 620 ON INT ((E9+ 4)/ 5)GOTO 630,640,650,660,670,680,690,700 630 ON E9GOTO 710,720,730,740,750 640 ON E9- 5GOTO 990,990,990,760,770 650 ON E9- 10GOTO 780,790,800,990,990 660 ON E9- 15GOTO 810,820,830,840,850 670 ON E9- 20GOTO 860,870,880,990,890 680 ON E9- 25GOTO 900,910,920,990,930 690 ON E9- 30GOTO 940,990,950,960,970 700 ON E9- 35GOTO 980 710 PRINT "MEM FULL":RETURN 720 PRINT "CONST EXPECTED":RETURN 730 PRINT "'=' EXPECTED":RETURN 740 PRINT "IDENTIFIER EXPECTED":RETURN 750 PRINT "';' OR ':' MISSING":RETURN 760 PRINT "'.' EXPECTED":RETURN 770 PRINT "';' MISSING":RETURN 780 PRINT "UNDECLARED IDENT":RETURN 790 PRINT "ILLEGAL IDENT":RETURN 800 PRINT "':=' EXPECTED":RETURN 810 PRINT "'THEN' EXPECTED":RETURN 820 PRINT "';' OR 'END' EXPECTED":RETURN 830 PRINT "'DO' EXPECTED":RETURN 840 PRINT "INCORRECT SYMBOL":RETURN 850 PRINT "RELATIONAL OPERATOR EXPECTED":RETURN 860 PRINT "USE OF PROC IDENT IN EXPR":RETURN 870 PRINT "')' EXPECTED":RETURN 880 PRINT "ILLEGAL FACTOR":RETURN 890 PRINT "'BEGIN' EXPECTED":RETURN 900 PRINT "'OF' EXPECTED":RETURN 910 PRINT "ILLEGAL HEX CONST":RETURN 920 PRINT "'TO' OR 'DOWNTO' EXPECTED":RETURN 930 PRINT "NUMBER OUT OF RANGE":RETURN 940 PRINT "'(' EXPECTED":RETURN 950 PRINT "'[' EXPECTED":RETURN 960 PRINT "']' EXPECTED":RETURN 970 PRINT "PARAMETERS MISMATCHED":RETURN 980 PRINT "DATA TYPE NOT RECOGNISED":RETURN 990 PRINT "BUG":RETURN 1000 REM **************** 1010 REM SCANNER 1020 REM **************** 1030 REM GETCHAR 1040 GET 3,1,C0;X$[1]:C0= C0+ 1 1050 IF X$= CHR$ (13)THEN PRINT L$:L$= "":C0= C0+ 1:GOTO 1040 1060 L$= L$+ X$ 1170 RETURN 1230 REM **************** 1240 REM GET A TOKEN 1250 REM RETURN S0$=TOKEN, A$=STRING, N3=NUMERIC 1260 IF X$< > " "AND X$< > CHR$ (9)THEN 1275 1270 GOSUB 1030:GOTO 1260:REM FLUSH BLANKS 1275 IF X$= "."THEN S0$= X$:RETURN 1280 IF X$< "A"THEN 1460:REM IDENTIFIER? 1290 IF X$> "Z"THEN 1460 1300 K= 0:A$= "" 1310 IF K> = N2THEN 1330:REM ONLY FIRST N2 LETTERS USED 1320 K= K+ 1:A$= A$+ X$ 1330 GOSUB 1030 1340 T= ASC (X$) 1350 IF T> 47AND T< 58OR T> 64AND T< 91THEN 1310:REM D OR L 1360 REM SEARCH FOR RESERVED WORDS 1370 B$= LEFT$ (A$,5) 1380 FOR I= 1TO N0 1390 IF B$= W0$(I)THEN S0$= B$:RETURN 1400 NEXT I 1410 S0$= "IDENT":RETURN 1460 Z$= "" 1470 IF X$< "0"OR X$> "9"THEN 1580:REM AN INTEGER? 1490 S0$= "NUM" 1500 Z$= Z$+ X$ 1510 GOSUB 1030 1520 IF ASC (X$)> = 48AND ASC (X$)< = 57THEN 1500 1530 N3= VAL (Z$) 1540 IF N3< = N1THEN RETURN 1550 E= 30:GOSUB 550 1560 N3= N1:RETURN 1570 REM CHECK FOR SPECIAL SYMBOL 1580 IF X$< > ":"THEN 1640 1590 GOSUB 1030 1600 IF X$= "="THEN 1620 1610 S0$= ":":RETURN 1620 S0$= ":=" 1630 GOSUB 1030:RETURN 1640 IF X$< > "<"THEN 1710 1650 GOSUB 1030 1660 IF X$= ">"THEN 1690 1670 IF X$= "="THEN 1700 1680 S0$= "<":RETURN 1690 S0$= "<>":GOSUB 1030:RETURN 1700 S0$= "<=":GOSUB 1030:RETURN 1710 IF X$< > ">"THEN 1750 1720 GOSUB 1030:S0$= ">" 1730 IF X$< > "="THEN RETURN 1740 S0$= ">=":GOSUB 1030:RETURN 1750 IF X$< > "'"THEN 1790 1760 S0$= "STR":C$= "" 1770 GOSUB 1030:IF X$= "'"THEN GOSUB 1030:RETURN 1780 C$= C$+ X$:GOTO 1770 1790 IF X$< > "!"THEN 1820:REM IGNORE COMMENTS 1800 GOSUB 1030:IF X$< > "!"THEN 1800 1810 GOSUB 1030:GOTO 1240 1820 IF X$< > "%"THEN 1930:REM HEX CONSTANT 1830 GOSUB 1030:S0$= "NUM":N3= 0 1840 FOR I= 1TO 4 1850 T= ASC (X$) 1860 IF T> = 48AND T< = 57THEN 1880 1870 IF T> = 65AND T< = 70THEN T= T- 7:GOTO 1880 1875 GOTO 1910 1880 T= T- 48 1890 N3= N3* 16+ T:GOSUB 1030:NEXT I 1900 RETURN 1910 IF I> 1THEN E= 27:GOSUB 550 1920 S0$= "%":RETURN 1930 S0$= X$:GOTO 1030 1940 REM **************** 1950 REM ENTER SYMBOL INTO TABLE 1960 T1= T1+ 1 1970 T$(T1)= A$ 1980 T0$(T1)= K$:REM STORE TYPE 1990 IF K$< > "C"THEN 2010 2000 T2(T1)= N3:RETURN :REM STORE VALUE 2010 T1(T1)= L1:REM STORE LEVEL OF IDENT 2020 IF K$< > "V"THEN RETURN 2030 IF F9= 0THEN RETURN :REM SP WAS ALLOC FOR PROC PARS 2040 T2(T1)= D0:D0= D0+ 1:RETURN :REM STORE OFFSET 2050 REM **************** 2060 REM FIND IDENT A$ IN T$,STARTING FROM T1 AND UP 2070 REM RETURN POINTER TO TABLE IF FOUND ELSE RETURN 0 2080 FOR I= T1TO 1STEP - 1 2090 IF A$= T$(I)THEN GOTO 2130 2100 NEXT I 2120 I= 0 2130 RETURN 2140 REM **************** 2150 REM PARSER AND CODER 2160 REM **************** 2170 REM CONST DECLARATION 2180 K$= "IDENT":E= 4:GOSUB 420 2190 K$= "=":E= 3:GOSUB 510 2200 GOSUB 1240:GOSUB 2240 2210 K$= "C":GOSUB 1950 2220 GOTO 1240 2230 REM **************** 2240 REM CONSTANT 2250 IF S0$= "NUM"THEN RETURN 2260 IF S0$= "IDENT"THEN 2290:REM CONST? 2270 K$= "STR":E= 2:GOSUB 420 2280 N3= ASC (C$):RETURN :REM TAKE 1ST CHAR 2290 GOSUB 2060:IF I= 0THEN E= 2:GOSUB 550 2300 IF T0$(I)< > "C"THEN E= 2:GOSUB 550 2310 N3= T2(I):RETURN 2320 GOTO 1240 2330 REM **************** 2340 REM VAR DECLARATION 2350 K$= "IDENT":E= 4:GOSUB 420 2360 K$= "V":GOSUB 1950:GOTO 1240 2370 REM **************** 2380 REM SIMPLE EXPRESSION 2390 IF S0$= "+"THEN 2420 2400 IF S0$< > "-"THEN 2590 2410 Y$= S0$:GOSUB 6180 2420 GOSUB 1240 2430 GOSUB 2610 2440 GOSUB 6240 2450 IF Y$= "-"THEN X1= 1:X2= 0:X3= 1:GOSUB 6310 2460 IF S0$= "+"THEN 2500 2470 IF S0$= "-"THEN 2500 2480 IF S0$= "OR"THEN 2500 2490 RETURN 2500 Y$= S0$:GOSUB 6180 2510 GOSUB 1240 2520 GOSUB 2610 2530 GOSUB 6240 2540 IF Y$= "-"THEN 2570 2550 IF Y$= "+"THEN 2580 2560 X1= 1:X2= 0:X3= 14:GOSUB 6310:GOTO 2460 2570 X1= 1:X2= 0:X3= 3:GOSUB 6310:GOTO 2460 2580 X1= 1:X2= 0:X3= 2:GOSUB 6310:GOTO 2460 2590 GOSUB 2610:GOTO 2460 2600 REM **************** 2610 REM TERM 2620 GOSUB 2850 2630 IF S0$= "*"THEN 2700 2640 IF S0$= "DIV"THEN 2700 2650 IF S0$= "AND"THEN 2700 2660 IF S0$= "MOD"THEN 2700 2670 IF S0$= "SHL"THEN 2700 2680 IF S0$= "SHR"THEN 2700 2690 RETURN 2700 Y$= S0$:GOSUB 6180:REM PUSH 2710 GOSUB 1240:GOSUB 2850 2720 GOSUB 6240 2730 IF Y$= "DIV"THEN 2790 2740 IF Y$= "MOD"THEN 2800 2750 IF Y$= "*"THEN 2810 2760 IF Y$= "SHL"THEN 2820 2770 IF Y$= "SHR"THEN 2830 2780 X1= 1:X2= 0:X3= 15:GOSUB 6310:GOTO 2630:REM "AND" 2790 X1= 1:X2= 0:X3= 5:GOSUB 6310:GOTO 2630 2800 X1= 1:X2= 0:X3= 7:GOSUB 6310:GOTO 2630 2810 X1= 1:X2= 0:X3= 4:GOSUB 6310:GOTO 2630 2820 X1= 1:X2= 0:X3= 17:GOSUB 6310:GOTO 2630 2830 X1= 1:X2= 0:X3= 18:GOSUB 6310:GOTO 2630 2840 REM **************** 2850 REM FACTOR 2860 IF S0$= "IDENT"THEN 2940 2870 IF S0$= "NUM"THEN 3060 2880 IF S0$= "STR"THEN 3080 2890 IF S0$= "("THEN 3100 2900 IF S0$= "MEM"THEN 3140 2910 IF S0$= "NOT"THEN 3260 2920 E= 23:GOTO 550 2930 REM *** IDENTIFIER 2940 GOSUB 2060 2950 IF I= 0THEN E= 11:GOTO 550 2960 IF T0$(I)= "P"THEN E= 21:GOTO 550:REM PROC NAME 2970 IF T0$(I)< > "Y"THEN 3000 2980 X1= 5:X2= 0:X3= 1:GOSUB 6310:REM FUNC 2990 I= I- 1:GOTO 4290:REM T2(I)=ADD OF FUNC 3000 IF T0$(I)= "A"THEN 3190:REM ARRAY 3010 IF T0$(I)< > "C"THEN 3030 3020 X1= 0:X2= 0:X3= T2(I):GOSUB 6310 3025 GOTO 1240:REM CONST 3030 X1= 2:X2= L1- T1(I):X3= T2(I):GOSUB 6310:REM ID 3040 GOTO 1240 3050 REM *** NUMERIC CONST 3060 X1= 0:X2= 0:X3= N3:GOSUB 6310:GOTO 1240 3070 REM *** STRING CONST 3080 X1= 0:X2= 0:X3= ASC (C$):GOSUB 6310:GOTO 1240 3090 REM *** PAREN EXPR 3100 GOSUB 1240:GOSUB 3290 3110 IF S0$= ")"THEN 1240 3120 E= 22:GOSUB 550:RETURN 3130 REM *** READ MEMORY 3140 K$= "[":E= 33:GOSUB 510 3150 GOSUB 1240:GOSUB 3290 3160 K$= "]":E= 34:GOSUB 420 3170 GOSUB 1240 3180 X1= 2:X2= 255:X3= 0:GOSUB 6310:RETURN 3190 X= I:GOSUB 6120 3200 K$= "[":E= 33:GOSUB 510 3210 GOSUB 1240:GOSUB 3290 3220 K$= "]":E= 34:GOSUB 420 3230 GOSUB 6150:X1= 18:X2= L1- T1(X):X3= T2(X):GOSUB 6310 3240 GOTO 1240 3250 REM *** NEGATE 3260 GOSUB 1240:GOSUB 2850 3270 X1= 1:X2= 0:X3= 16:GOSUB 6310:RETURN 3280 REM **************** 3290 REM EXPRESSION 3300 GOSUB 2390:REM SIMPLE EXP 3310 IF S0$= "="THEN 3380 3320 IF S0$= "<>"THEN 3380 3330 IF S0$= "<"THEN 3380 3340 IF S0$= "<="THEN 3380 3350 IF S0$= ">"THEN 3380 3360 IF S0$= ">="THEN 3380 3370 RETURN 3380 Y$= S0$:GOSUB 6180:REM PUSH 3390 GOSUB 1240:GOSUB 2390 3400 GOSUB 6240:REM POP 3410 IF Y$= "="THEN X1= 1:X2= 0:X3= 8:GOSUB 6310 3420 IF Y$= "<>"THEN X1= 1:X2= 0:X3= 9:GOSUB 6310 3430 IF Y$= "<"THEN X1= 1:X2= 0:X3= 10:GOSUB 6310 3440 IF Y$= ">="THEN X1= 1:X2= 0:X3= 11:GOSUB 6310 3450 IF Y$= ">"THEN X1= 1:X2= 0:X3= 12:GOSUB 6310 3460 IF Y$= "<="THEN X1= 1:X2= 0:X3= 13:GOSUB 6310 3470 RETURN 3480 REM **************** 3490 REM STATEMENT 3500 IF S0$= "IDENT"THEN 3630 3510 IF S0$= "IF"THEN 4440 3520 IF S0$= "FOR"THEN 5170 3530 IF S0$= "WHILE"THEN 4800 3540 IF S0$= "CASE"THEN 4890 3550 IF S0$= "REPEA"THEN 4730 3560 IF S0$= "BEGIN"THEN 4590 3570 IF S0$= "READ"THEN 4040 3580 IF S0$= "WRITE"THEN 3870 3590 IF S0$= "MEM"THEN 4650 3600 IF S0$= "CALL"THEN 4240 3610 RETURN 3620 REM *** ASSIGNMNT 3630 GOSUB 2060 3640 IF I= 0THEN E= 11:GOSUB 550 3650 IF T0$(I)= "A"THEN 3700:REM ARRAY 3660 IF T0$(I)= "V"THEN 3760:REM INT VAR 3670 IF T0$(I)= "Y"THEN 3760:REM FUNC RETURN VALUE 3680 IF T0$(I)= "P"THEN 4290:REM PROC CALL 3690 E= 12:GOSUB 550 3700 X= I:GOSUB 6120:REM PUSH TBL ADD 3710 X= 16:GOSUB 6120:REM INDEX ADD MODE 3720 K$= "[":E= 33:GOSUB 510 3730 GOSUB 1240:GOSUB 3290 3740 K$= "]":E= 34:GOSUB 420 3750 GOTO 3780 3760 X= I:GOSUB 6120 3770 X= 0:GOSUB 6120 3780 GOSUB 1240 3790 IF S0$= ":="THEN 3810 3800 E= 13:GOSUB 550:GOTO 3820 3810 GOSUB 1240 3820 GOSUB 3290:GOSUB 6150 3830 K= X:GOSUB 6150 3840 X1= 3+ K:X2= L1- T1(X):X3= T2(X):GOSUB 6310 3850 RETURN 3860 REM *** WRITE 3870 K$= "(":E= 31:GOSUB 510 3880 GOSUB 1240:IF S0$< > "STR"THEN 3950 3890 L= LEN (C$):IF L> 1THEN 3910 3900 X1= 0:X2= 0:X3= ASC (C$):GOSUB 6310 3905 X1= 8:X2= 0:X3= 1:GOSUB 6310:GOTO 3940 3910 FOR I= 1TO L 3920 X1= 0:X2= 0:X3= ASC (MID$ (C$,I,1)):GOSUB 6310:NEXT I 3930 X1= 0:X2= 0:X3= L:GOSUB 6310 3935 X1= 8:X2= 0:X3= 8:GOSUB 6310 3940 GOSUB 1240:GOTO 4000 3950 GOSUB 3290:K= 1 3960 IF S0$= "#"THEN K= 3:REM DEC 3970 IF S0$= "%"THEN K= 5:REM HEX 3980 IF K> 1THEN GOSUB 1240 3990 X1= 8:X2= 0:X3= K:GOSUB 6310 4000 IF S0$= ","THEN 3880 4010 K$= ")":E= 22:GOSUB 420 4020 GOTO 1240 4030 REM *** READ 4040 K$= "(":E= 31:GOSUB 510 4050 K$= "IDENT":E= 4:GOSUB 510 4060 GOSUB 2060:IF I= 0THEN E= 11:GOSUB 550 4070 X= I:GOSUB 6120 4080 IF T0$(I)= "A"THEN 4190 4090 IF T0$(I)= "V"THEN L= 0:GOTO 4100 4095 E= 4:GOSUB 550 4100 GOSUB 1240:K= 0 4110 IF S0$= "#"THEN K= 2:REM DEC 4120 IF S0$= "%"THEN K= 4:REM HEX 4130 X1= 8:X2= 0:X3= K:GOSUB 6310 4140 IF K> 0THEN GOSUB 1240 4150 GOSUB 6150: 4155 X1= L+ 3:X2= L1- T1(X):X3= T2(X):GOSUB 6310 4160 IF S0$= ","THEN 4050 4170 K$= ")":E= 31:GOSUB 420 4180 GOTO 1240 4190 K$= "[":E= 33:GOSUB 510 4200 GOSUB 1240:GOSUB 3290 4210 K$= "]":E= 34:GOSUB 420 4220 L= 16:GOTO 4100 4230 REM *** ABSOLUTE MEM CALL 4240 K$= "(":E= 31:GOSUB 510 4250 GOSUB 1240:GOSUB 3290 4260 K$= ")":E= 22:GOSUB 420 4270 X1= 4:X2= 255:X3= 0:GOSUB 6310:GOTO 1240 4280 REM *** PROC OR FUNC CALL 4290 K2= 0:K3= I 4300 IF T3(I)= 0THEN 4400:REM NO PARAMETER 4310 K$= "(":E= 31:GOSUB 510 4320 X= K2:GOSUB 6120 4330 X= K3:GOSUB 6120 4340 GOSUB 1240:GOSUB 3290 4350 GOSUB 6150:K3= X 4360 GOSUB 6150:K2= X:K2= K2+ 1 4370 IF S0$= ","THEN 4320 4380 IF K2< > T3(K3)THEN E= 35:GOSUB 550 4390 K$= ")":E= 22:GOSUB 420 4400 X1= 4:X2= L1- T1(K3):X3= T2(K3):GOSUB 6310 4410 IF K2< > 0THEN X1= 5:X2= 0:X3= - K2:GOSUB 6310 4420 GOTO 1240 4430 REM *** IF 4440 GOSUB 1240 4450 GOSUB 3290 4460 K$= "THEN":E= 16:GOSUB 420 4470 GOSUB 1240 4480 X= C1:GOSUB 6120:REM FORWARD REF POINT 4490 X1= 7:X2= 0:X3= 0:GOSUB 6310:REM JPC 4500 GOSUB 3490 4510 IF S0$< > "ELSE"THEN 6520 4520 GOSUB 6150:K= X 4530 X= C1:GOSUB 6120 4540 X1= 6:X2= 0:X3= 0:GOSUB 6310:REM JMP 4550 X= K:GOSUB 6540:REM FIXUP FORWD REF 4560 GOSUB 1240:GOSUB 3490 4570 GOTO 6520 4580 REM *** COMPOUND STMNT 4590 GOSUB 1240 4600 GOSUB 3490 4610 IF S0$= ";"THEN 4590 4620 IF S0$= "END"THEN 1240:RETURN 4630 E= 17:GOSUB 550:RETURN 4640 REM *** WRITE MEM 4650 K$= "[":E= 33:GOSUB 510 4660 GOSUB 1240:GOSUB 3290 4670 IF S0$< > "]"THEN E= 34:GOSUB 550 4680 K$= ":=":E= 13:GOSUB 510 4690 GOSUB 1240:GOSUB 3290 4700 X1= 3:X2= 255:X3= 0:GOSUB 6310 4710 RETURN 4720 REM *** REPEAT .. UNTIL 4730 X= C1:GOSUB 6120 4740 GOSUB 1240:GOSUB 3490 4750 IF S0$= ";"THEN 4740 4760 K$= "UNTIL":E= 10:GOSUB 420 4770 GOSUB 1240:GOSUB 3290 4780 GOSUB 6150:X1= 7:X2= 0:X3= X:GOSUB 6310 4785 RETURN 4790 REM *** WHILE .. DO 4800 GOSUB 1240:X= C1:GOSUB 6120 4810 GOSUB 3290:X= C1:GOSUB 6120 4820 X1= 7:X2= 0:X3= 0:GOSUB 6310 4830 K$= "DO":E= 18:GOSUB 420 4840 GOSUB 1240:GOSUB 3490 4850 GOSUB 6150:K= X:GOSUB 6150 4860 X1= 6:X2= 0:X3= X:GOSUB 6310 4870 X= K:GOTO 6540 4880 REM *** CASE .. OF 4890 GOSUB 1240:GOSUB 3290 4900 K$= "OF":E= 25:GOSUB 420 4910 I2= 1:REM # OF CASE STATEMENTS 4920 I1= 0:REM # OF CASE LABELS 4930 GOSUB 1240:GOSUB 2240 4940 X1= 1:X2= 0:X3= 21:GOSUB 6310 4941 X1= 0:X2= 0:X3= N3:GOSUB 6310 4942 X1= 1:X2= 0:X3= 8:GOSUB 6310 4950 GOSUB 1240:IF S0$= ":"THEN 4990 4960 K$= ",":E= 5:GOSUB 420 4970 X= C1:GOSUB 6120:X1= 7:X2= 1:X3= 0 4975 GOSUB 6310:REM A MATCH FOUND? 4980 I1= I1+ 1:GOTO 4930 4990 K= C1:X1= 7:X2= 0:X3= 0: 4995 GOSUB 6310:REM GO TO NEXT CASE STMNT IF NO MATCH 4997 IF I1= 0THEN 5010 5000 FOR I= 1TO I1:GOSUB 6520 5005 NEXT I:REM FIXUP FRWRD REFS 5010 X= K:GOSUB 6120 5020 GOSUB 1240:X= I2:GOSUB 6120 5030 GOSUB 3490:GOSUB 6150:I2= X 5040 IF S0$= "ELSE"THEN 5090 5050 IF S0$< > ";"THEN 5130 5060 K= C1:X1= 6:X2= 0:X3= 0 5065 GOSUB 6310:REM EXIT AFTER A CASE STMNT 5070 GOSUB 6520 5080 X= K:GOSUB 6120:I2= I2+ 1:GOTO 4920 5090 K= C1:X1= 6:X2= 0:X3= 0 5095 GOSUB 6310:GOSUB 6520 5100 X= K:GOSUB 6120 5110 GOSUB 1240:X= I2:GOSUB 6120 5120 GOSUB 3490:GOSUB 6150:I2= X 5130 K$= "END":E= 17:GOSUB 420 5140 FOR I= 1TO I2:GOSUB 6520 5145 NEXT I:REM FIXUP FORWD REFS 5150 X1= 5:X2= 0:X3= - 1:GOSUB 6310 5155 GOTO 1240:REM POP VAL OF CASE EXPR 5160 REM *** FOR 5170 K$= "IDENT":E= 4:GOSUB 510 5180 GOSUB 3630:GOSUB 6120 5190 F9= 1:IF S0$= "TO"THEN 5210:REM REMEMBER UP OR DOWN 5200 K$= "DOWNT":E= 28:GOSUB 420:F9= 0 5210 GOSUB 1240:GOSUB 3290 5220 GOSUB 6150:K= X:X= C1:GOSUB 6120 5230 X1= 1:X2= 0:X3= 21:GOSUB 6310 5235 X1= 2:X2= L1- T1(K):X3= T2(K):GOSUB 6310 5240 X1= 1:X2= 0:X3= 13- F9- F9:GOSUB 6310 5245 X= C1:GOSUB 6120 5246 X1= 7:X2= 0:X3= 0:GOSUB 6310 5250 X= F9:GOSUB 6120:X= K:GOSUB 6120 5260 K$= "DO":E= 18:GOSUB 420:GOSUB 1240 5270 GOSUB 3490:GOSUB 6150 5275 X1= 2:X2= L1- T1(X):X3= T2(X):GOSUB 6310 5280 K= X:GOSUB 6150 5285 X1= 1:X2= 0:X3= 20- X:GOSUB 6310 5290 X1= 3:X2= L1- T1(K):X3= T2(K):GOSUB 6310 5300 GOSUB 6150:K= X:GOSUB 6150 5305 X1= 6:X2= 0:X3= X:GOSUB 6310 5310 X= K:GOSUB 6540 5320 X1= 5:X2= 0:X3= - 1:GOSUB 6310 5325 RETURN :REM POP OFF VAL OF LOOP CNTRL VAR 5330 REM **************** 5340 REM BLOCK 5350 D0= 3:REM RSRVD FOR STATIC LINK,DYNAMIC LINK & RET ADR 5360 T2(T1- K1)= C1:REM INIT ADR OF PROC BLOCK 5370 X1= 6:X2= 0:X3= 0:GOSUB 6310 5375 REM JMP TO STARTING BLOCK ADR 5380 X= T1- K1:GOSUB 6120 5390 IF S0$= "CONST"THEN 5460 5400 IF S0$= "VAR"THEN 5550 5410 IF S0$= "PROC"THEN 5730 5420 IF S0$= "FUNC"THEN 5770 5430 IF S0$= "BEGIN"THEN 5980 5440 E= 25:GOSUB 550 5450 REM *** CONST DCL 5460 GOSUB 1240 5470 GOSUB 2170 5480 K$= ";":E= 5:GOSUB 420:GOSUB 1240 5490 IF S0$= "VAR"THEN 5550 5500 IF S0$= "PROC"THEN 5730 5510 IF S0$= "FUNC"THEN 5770 5520 IF S0$= "BEGIN"THEN 5980 5530 GOTO 5470 5540 REM *** VAR DCL 5550 L= 0:F9= 1 5560 GOSUB 1240:GOSUB 2340 5570 L= L+ 1:IF S0$= ","THEN 5560 5580 K$= ":":E= 5:GOSUB 420 5590 GOSUB 1240:IF S0$= "ARRAY"THEN 5610 5600 K$= "INTEG":E= 36:GOSUB 420:GOTO 5670 5610 K$= "[":E= 33:GOSUB 510:GOSUB 1240:GOSUB 2240 5620 K$= "]":E= 34:GOSUB 510 5621 K$= "OF":E= 26:GOSUB 510 5622 K$= "INTEG":E= 36:GOSUB 510 5630 D0= D0- L 5640 FOR I= T1- L+ 1TO T1 5650 T0$(I)= "A":T3(I)= N3+ 1 5660 T2(I)= D0:D0= D0+ N3+ 1:NEXT I 5670 K$= ";":E= 5:GOSUB 510 5680 GOSUB 1240:IF S0$= "PROC"THEN 5730 5690 IF S0$= "FUNC"THEN 5770 5700 IF S0$= "BEGIN"THEN 5980 5710 L= 0:F9= 1:GOSUB 2340:GOTO 5570 5720 REM *** PROC DCL 5730 K$= "IDENT":E= 4:GOSUB 510 5740 K1= 0:K$= "P":GOSUB 1950 5750 L1= L1+ 1:GOTO 5810 5760 REM *** FUNC DCL 5770 K$= "IDENT":E= 4:GOSUB 510 5780 K$= "F":GOSUB 1950:REM FUNC ADR 5790 L1= L1+ 1:K1= 1 5800 K$= "Y":GOSUB 1950:REM FUNC VAL 5810 K2= K1:GOSUB 1240 5820 X= T1:GOSUB 6120 5830 X= D0:GOSUB 6120 5840 IF S0$< > "("THEN 5890 5850 GOSUB 1240:F9= 0:GOSUB 2340:K1= K1+ 1 5860 IF S0$= ","THEN 5850 5870 K$= ")":E= 22:GOSUB 420 5880 GOSUB 1240:T3(T1- K1)= K1- K2 5890 K$= ";":E= 5:GOSUB 420 5900 FOR I= 1TO K1:REM FUNC VAL & PARS HAVE - OFFSET 5910 T2(T1- I+ 1)= - I:NEXT I 5920 GOSUB 1240:GOSUB 5340:L1= L1- 1 5930 GOSUB 6150:D0= X 5940 GOSUB 6150:T1= X 5950 K$= ";":E= 5:GOSUB 420 5960 GOSUB 1240:GOTO 5410 5970 REM *** START OF EXEC STMNTS 5980 GOSUB 1240:GOSUB 6150:K= X 5990 X= T2(K):GOSUB 6540 6000 T2(K)= C1:REM START BLK ADR 6010 X1= 5:X2= 0:X3= D0:GOSUB 6310 6020 GOSUB 3490 6030 IF S0$< > ";"THEN 6050 6040 GOSUB 1240:GOTO 6020 6050 IF S0$< > "END"THEN E= 17:GOSUB 550 6060 GOSUB 1240 6070 X1= 1:X2= 0:X3= 0:GOSUB 6310 6080 RETURN 6090 REM **************** 6100 REM END PARSER AND CODER 6110 REM **************** 6120 REM PUSH X INTO STACK 6130 S(S9)= X:S9= S9+ 1:RETURN 6140 REM **************** 6150 REM POP X FROM STACK 6160 S9= S9- 1:X= S(S9):RETURN 6170 REM **************** 6180 REM PUSH Y$ INTO STACK 6190 S$(P8)= Y$ 6200 P8= P8+ 1 6210 RETURN 6240 REM **************** 6245 REM POP Y$ FROM STACK 6250 P8= P8- 1 6260 Y$= S$(P8) 6270 RETURN 6300 REM **************** 6310 REM GENERATE CODES 6320 B$= " " 6330 POKE P9,X1:POKE P9+ 1,X2 6340 POKE P9+ 2,X3- INT (X3/ 256)* 256 6350 GOSUB 6450:POKE P9+ 3,N 6360 IF Y9< > 0THEN 6400:REM DON'T ECHO INPT FRM KEYBRD 6370 IF X1< 16THEN 6390 6380 B$= "X ":X1= X1- 16:REM INDEX 6390 PRINT C1," ",M$(X1+ 1)+ B$,X2,X3 6400 C1= C1+ 1:P9= P9+ 4 6410 IF P9> = Q9THEN E= 1:GOSUB 550 6420 RETURN 6430 REM **************** 6450 N= INT (X3/ 256) 6460 IF N< 0THEN N= N+ 256 6470 RETURN 6510 REM **************** 6520 REM FIX UP FORWARD REF 6530 GOSUB 6150 6540 M= P7+ X* 4 6550 POKE M+ 2,C1- INT (C1/ 256)* 256:X3= C1 6555 GOSUB 6450:POKE M+ 3,N 6560 IF Y9< > 0THEN RETURN 6570 PRINT "ADR AT",X,"CHANGED TO",C1 6580 RETURN