1 POKE2053,143:LOAD"PRECOMPILER.H",8,1 10 REM ******************************** 20 REM * * 30 REM * PROGRAMM: BASIC-PRECOMPILER * 40 REM * AUTOR : HOANG-THAI NGUYEN * 50 REM * ADRESSE : HANS-A-KAMPMANN 12 * 60 REM * 3418 USLAR 1 * 80 REM * * 90 REM ******************************** 100 : 110 REM ***************************** 120 REM VARIABLEN & ARRAYS DEFINIEREN 130 REM ***************************** 140 : 150 CLR:WO=49183:LI=49286:DE=49444 160 PM%=500:CM%=100:LM%=100:MM%=100 170 DIMP$(PM%),CS%(CM%),LT$(LM%),LT%(LM%),M$(1,MM%) 180 : 190 REM ************* 200 REM HAUPTPROGRAMM 210 REM ************* 220 : 230 POKE53280,6:POKE53281,14:POKE646,0:REM FARBEN SETZEN 240 PRINT"[147]BASIC-PRECOMPILER":REM TITEL AUSGEBEN 250 PRINT"WRITTEN BY HOANG-THAI NGUYEN" 260 : 270 INPUT"FILE-NAME: ";W$:PRINT:REM FILE-NAME ABFRAGEN 280 IFW$="*"THENEND:REM PROGRAMMENDE 290 : 300 INPUT"NUMBER OF FIRST LINE: ";F%:REM 1.ZEILENNR ABFRAGEN 310 IFF%<0ORLEN(W$)>16THEN240:REM ABFRAGEN WIEDERHOLEN 320 : 330 REM ******************** 340 REM PARAMETER EINSTELLEN 350 REM ******************** 360 : 370 REM WENN ASCII, DANN 76, SONST (BSC) 32 IN 49520 SCHREIBEN 380 POKE49520,76:REM ( BEI TEXTOMAT ) 390 REM ASCII-KODE DER LEERZEICHEN 400 POKE49544,32:REM BLANK-KODE 410 POKE49545,160:REM SHIFT-BLANK-KODE 420 POKE49546,164:REM "[164]"-KODE ( BEI TEXTOMAT ) 430 REM ASCII-KODE DES ENDZEICHEN EINER ZEILE 440 POKE49340,95:REM "_"-KODE ( BEI TEXTOMAT ) 450 : 460 REM *********************** 470 REM FILE OPEN & COMPILIEREN 480 REM *********************** 490 : 500 OPEN2,8,2,W$+",P,R":REM FILE OPEN 510 GET#2,W$:GET#2,W$:REM PRG-ADRESSE UEBERLESEN 520 IFST<>0THENCLOSE2:END:REM FILE NOT FOUND 530 : 540 PRINT"PASS 1 IN PROGRESS":GOSUB910:REM PASS 1 550 CLOSE2:REM FILE SCHLIESSEN 560 : 570 IFP$(Z%)<>"ENDPROGRAM"THEN500:REM NAECHTES FILE LESEN 580 : 590 C%=C%-1:IFC%<0THEN660:REM STACKZEIGER=0 600 : 610 PRINT"STACK POINTER =";C%+1:REM STACKZEIGER AUSGEBEN 620 IF(CS%(C%)AND24576)=8192THENPRINT"REPEAT..?":END 630 IF(CS%(C%)AND24576)=16384THENPRINT"WHILE..DO..?":END 640 PRINT"IF..THEN..ELSE..?":END 650 : 660 PRINT"PASS 2 IN PROGRESS":GOSUB2650:REM PASS 2 670 POKE1024,32:REM LINKE OBERE ECKE LOESCHEN 680 : 690 REM ************************ 700 REM OBJ-PROGRAMM ABSPEICHERN 710 REM ************************ 720 : 730 INPUT"PROGRAM-NAME: ";W$:REM PROGRAMMNAME ABFRAGEN 740 IFW$="*"THENEND:REM PROGRAMMENDE 750 IFLEN(W$)>16THEN730:REM PROGRAMMNAME ZU LANG 760 PRINT"WRITING ";W$:REM PROGRAMM ABSPEICHERN 770 OPEN1,8,1,W$+",P,W":REM FILE OPEN 780 PRINT#1,CHR$(1);CHR$(8);:REM PROGRAMMANFANGSADRESSE SCHREIBEN 790 Z%=0:REM AUF 1.ZEILE ZEIGEN 800 REM PROGRAMMZEILE SCHREIBEN 810 IFP$(Z%)<>"ENDPROGRAM"THENPRINT#1,P$(Z%);:Z%=Z%+1:GOTO810 820 : 830 REM PROGRAMMENDE 840 PRINT#1,CHR$(0);CHR$(0);:CLOSE1:END 850 : 860 REM ************************ 870 REM >>>> UNTERPROGRAMME <<<< 880 REM ************************ 890 : 900 REM *********** 910 REM DURCHLAUF 1 920 REM *********** 930 : 940 POKE1024,Z%AND255:SYSLI,Z$:T$=Z$:REM ZEILE LESEN 950 : 960 IFZ$<>"ENDPROGRAM"THEN1010 970 : 980 REM ENDE DES 1.DURCHLAUFEN 990 P$(Z%)=Z$:RETURN:REM ENDE 1.DURCHLAUFEN 1000 : 1010 IFLEFT$(Z$,1)<>"#"THEN1120 1020 : 1030 REM LABEL DEFINIEREN 1040 IFL%>LM%THENC%=1:GOTO3120:REM TABELLE IST VOLL 1050 Z$=RIGHT$(Z$,LEN(Z$)-1):REM 1.ZEICHEN ELIMINIEREN 1060 SYSWO,W$,Z$:REM LABEL IN W$ 1070 IFW$=""THENC%=3:GOTO3120 1080 GOSUB2940:REM PRUEFEN OB LABEL SCHON DEFINIERT WURDE 1090 IFI>=0THENC%=130:GOTO3120:REM LABEL SCHON DEFINIERT 1100 LT$(L%)=W$:LT%(L%)=F%+Z%:L%=L%+1:REM LABEL EINTRAGEN 1110 : 1120 IFLEFT$(Z$,1)<>"@"THEN1250 1130 : 1140 REM MACRO-DEFINITION 1150 IFM%>MM%THENC%=4:GOTO3120:REM TABELLE IST VOLL 1160 Z$=RIGHT$(Z$,LEN(Z$)-1):REM 1.ZEICHEN ELIMINIEREN 1170 SYSWO,W$,Z$:REM MACRO-NAME IN W$ 1180 IFW$=""THENC%=5:GOTO3120 1190 GOSUB3030:REM IST MACRO DEFINIERT 1200 IFI>=0THENC%=134:GOTO3120:REM MACRO SCHON DEFINIERT 1210 IFZ$=""THENC%=135:GOTO3120:REM ZEILE LEER 1220 M$(0,M%)=W$:M$(1,M%)=Z$:REM MACRO EINTRAGEN 1230 M%=M%+1:REM ZEILE WEITERPRUEFEN 1240 : 1250 IFLEFT$(Z$,1)<>"!"THEN1350 1260 : 1270 REM MACRO-AUFRUF 1280 Z$=RIGHT$(Z$,LEN(Z$)-1):REM 1.ZEICHEN ELIMINIEREN 1290 SYSWO,W$,Z$:REM MACRO-NAME IN W$ 1300 IFW$=""THENC%=8:GOTO3120 1310 GOSUB3030:REM IN TABELLE SUCHEN 1320 IFI<0THENC%=137:GOTO3120:REM MACRO NICHT DEFINIERT 1330 Z$=M$(1,I)+Z$:T$=Z$:REM MACRO-ZEILE IN Z$ 1340 : 1350 IFLEFT$(Z$,1)<>"\"THEN1430 1360 : 1370 REM TEXTFILES VERKETTEN 1380 W$=RIGHT$(Z$,LEN(Z$)-1):REM FILE-NAME IN W$ 1390 IFW$=""THENC%=23:GOTO3120 1400 IFLEN(W$)>16THENC%=24:GOTO3120 1410 RETURN:REM ENDE 1420 : 1430 IFZ$=""THEN940:REM NAECHSTE ZEILE 1440 SYSWO,W$,Z$:REM WORT IN W$ 1450 IFW$=":"ANDLEN(P$(Z%))=0THEN1430:REM DOPPELPUNKT UEBERLESEN 1460 IFW$=":"ANDRIGHT$(P$(Z%),1)=":"THEN1430:REM 2.DOPPELPUNKT UEBERLESEN 1470 : 1480 IFW$<>"REPEAT"THEN1560 1490 : 1500 REM REPEAT 1510 IFC%>CM%THENC%=10:GOTO3120:REM STACK IST VOLL 1520 IFP$(Z%)<>""THENZ%=Z%+1:REM ZEILE INKREMENTIEREN 1530 CS%(C%)=Z%OR8192:C%=C%+1:REM ZEILENNR EINTRAGEN 1540 GOTO1430:REM NAECHSTES WORT 1550 : 1560 IFW$<>"ENDWHILE"THEN1660 1570 : 1580 REM ENDWHILE 1590 C%=C%-1:IFC%<0THENC%=11:GOTO3120 1600 IF(CS%(C%)AND24576)<>16384THENC%=11:GOTO3120 1610 I=CS%(C%)AND8191:P$(I)=P$(I)+STR$(F%+Z%+1):REM SPRUNGZEILE SETZEN 1620 IFZ%>PM%THENC%=12:GOTO3120:REM TEXT ZU LANG 1630 P$(Z%)="G[207]"+STR$(F%+I):REM SCHLEIFE FORTSETZEN 1640 Z%=Z%+1:GOTO1430:REM NAECHSTES WORT 1650 : 1660 IFW$<>"ENDIF"THEN1740 1670 : 1680 REM ENDIF 1690 C%=C%-1:IFC%<0THENC%=13:GOTO3120 1700 IFCS%(C%)>8191THENC%=13:GOTO3120 1710 I=CS%(C%):P$(I)=P$(I)+STR$(F%+Z%):REM SPRUNGZEILE SETZEN 1720 GOTO1430:REM NAECHSTES WORT 1730 : 1740 IFW$<>"CASE"THEN1910 1750 : 1760 REM CASE..ENDCASE 1770 I=Z%:REM CASE-ZEILE MERKEN 1780 SYSLI,Z$:REM ZEILE LESEN 1790 SYSWO,W$,Z$:REM KONDITIONSAUSDRUCK IN W$ 1800 IFZ%>PM%THENC%=12:GOTO3120 1810 P$(Z%)="IF"+W$+"THEN ":REM KONDITIONSABFRAGE 1820 SYSWO,W$,Z$:IFW$<>"REM"ORW$<>""THENP$(Z%)=P$(Z%)+W$:GOTO1820 1830 Z%=Z%+1:SYSLI,Z$:REM ZEILE LESEN 1840 IFZ$="ENDCASE"THEN1880 1850 P$(Z%-1)=P$(Z%-1)+":G[207]":GOTO1790:REM NAECHSTE ZEILE 1860 : 1870 REM ENDCASE 1880 W$=STR$(F%+Z%):IFZ%>I+1THENFORI=ITOZ%-2:P$(I)=P$(I)+W$:NEXT 1890 SYSWO,W$,Z$:GOTO1430:REM NAECHSTES WORT 1900 : 1910 IFW$<>"UNTIL"THEN2020 1920 : 1930 REM UNTIL 1940 C%=C%-1:IFC%<0THENC%=14:GOTO3120 1950 IF(CS%(C%)AND24576)<>8192THENC%=14:GOTO3120 1960 IFZ%>PM%THENC%=12:GOTO3120 1970 SYSWO,W$,Z$:REM KONDITIONSAUSDRUCK IN W$ 1980 IFW$=""THENC%=15:GOTO3120 1990 I=CS%(C%)AND8191:P$(Z%)="IF("+W$+")=0THEN"+STR$(F%+I):REMKONDITIONSABFRAGE 2000 Z%=Z%+1:GOTO1430:REM NAECHSTES WORT 2010 : 2020 IFW$<>"WHILE"THEN2160 2030 : 2040 REM WHILE 2050 IFC%>CM%THENC%=10:GOTO3120 2060 IFP$(Z%)<>""THENZ%=Z%+1 2070 SYSWO,W$,Z$:REM KONDITIONSAUSDRUCK IN W$ 2080 IFW$=""THENC%=16:GOTO3120 2090 IFZ%>PM%THENC%=12:GOTO3120 2100 P$(Z%)="IF("+W$+")=0THEN" 2110 SYSWO,W$,Z$:REM NAECHSTES WORT IN W$ 2120 IFW$<>"DO"THENC%=17:GOTO3120 2130 CS%(C%)=Z%OR16384:C%=C%+1:REM WHILE-ZEILE EINTRAGEN 2140 Z%=Z%+1:GOTO1430:REM NAECHSTES WORT PRUEFEN 2150 : 2160 IFW$<>"REM"THEN2220 2170 : 2180 REM KOMMENTAR 2190 IFLEN(P$(Z%))=0THEN940:REM GANZE ZEILE IGNORIEREN 2200 Z%=Z%+1:GOTO940:REM NAECHSTE ZEILE 2210 : 2220 IFW$<>"IF"THEN2350 2230 : 2240 REM IF 2250 IFC%>CM%THENC%=10:GOTO3120 2260 SYSWO,W$,Z$:REM KONDITIONSAUSDRUCK IN W$ 2270 IFW$=""THENC%=18:GOTO3120 2280 IFZ%>PM%THENC%=12:GOTO3120 2290 P$(Z%)="IF("+W$+")=0THEN" 2300 CS%(C%)=Z%:C%=C%+1:REM IF-ZEILE EINTRAGEN 2310 Z%=Z%+1:SYSWO,W$,Z$:REM NAECHSTES WORT IN W$ 2320 IFW$<>"THEN"THENC%=19:GOTO3120 2330 GOTO1430:REM NAECHSTES WORT 2340 : 2350 IFW$<>"ELSE"THEN2460 2360 : 2370 REM ELSE 2380 C%=C%-1:IFC%<0THENC%=20:GOTO3120 2390 IFCS%(C%)>8191THENC%=20:GOTO3120 2400 I=CS%(C%):P$(I)=P$(I)+STR$(F%+Z%+1) 2410 IFZ%>PM%THENC%=12:GOTO3120 2420 P$(Z%)=P$(Z%)+"G[207]":REM UNBEDINGTER SPRUNG ANHAENGEN 2430 CS%(C%)=Z%:C%=C%+1:REM ZEILE MERKEN 2440 Z%=Z%+1:GOTO1430:REM NAECHSTES WORT 2450 : 2460 IFW$<>"GOTO"ANDW$<>"GOSUB"THEN2560 2470 : 2480 REM GOTO 2490 IFLEN(P$(Z%))<>0THENW$=" "+W$ 2500 IFZ%>PM%THENC%=12:GOTO3120 2510 P$(Z%)=P$(Z%)+W$+" " 2520 IFZ$=""THENC%=21:GOTO3120 2530 IFLEFT$(Z$,1)=":"THENC%=21:GOTO3120 2540 SYSWO,W$,Z$:W$=W$+" ":REM SPRUNGMARKE+BLANK 2550 : 2560 IFZ%>PM%THENC%=12:GOTO3120 2570 P$(Z%)=P$(Z%)+W$:REM WORT IN ZEILE EINFUEGEN 2580 IFZ$<>""THEN1430:REM NAECHSTES WORT 2590 Z%=Z%+1:GOTO940:REM NAECHSTE ZEILE 2600 : 2610 REM *********** 2620 REM DURCHLAUF 2 2630 REM *********** 2640 : 2650 Z%=0:C%=2049:REM AUF 1.ZEILE ZEIGEN & LINKADRESSE=2049 2660 POKE1024,Z%AND255:IFP$(Z%)="ENDPROGRAM"THENRETURN:REM ENDE 2670 : 2680 Z$=P$(Z%):T$=Z$:P$(Z%)="" 2690 IFRIGHT$(Z$,1)=":"THENZ$=LEFT$(Z$,LEN(Z$)-1):GOTO2690 2700 SYSWO,W$,Z$:REM WORT IN W$ 2710 IFW$="GOTO"ORW$="GOSUB"THEN2830:REM GOTO/GOSUB-BEFEHL GEFUNDEN 2720 P$(Z%)=P$(Z%)+W$:IFZ$<>""THEN2700:REM WEITERPRUEFEN 2730 : 2740 REM ZEILE TOKENISIEREN 2750 SYSDE,P$(Z%):REM ZEILE IN TOKENS UMWANDELN 2760 C%=C%+5+LEN(P$(Z%)):REM LINKADRESSE BERECHNEN 2770 L%=INT(C%/256):REM LINKADRESSE HIGH-BYTE 2780 M%=INT(F%/256):REM ZEILENNR HIGH-BYTE 2790 REM PROGRAMMZEILE BILDEN 2800 P$(Z%)=CHR$(C%AND255)+CHR$(L%)+CHR$(F%AND255)+CHR$(M%)+P$(Z%)+CHR$(0) 2810 Z%=Z%+1:F%=F%+1:GOTO2660:REM NAECHSTE ZEILE 2820 : 2830 P$(Z%)=P$(Z%)+W$:REM BEFEHL ANHAENGEN 2840 SYSWO,W$,Z$:REM SPRUNGMARKE IN W$ 2850 GOSUB2940:REM SPRUNGMARKE IN TABLLE SUCHEN 2860 IFI<0THENC%=150:GOTO3120 2870 W$=STR$(LT%(I)):W$=RIGHT$(W$,LEN(W$)-1):REM SPRUNGZEILE IN W$ UMWANDELN 2880 GOTO2720:REM SPRUNGZEILE ANHAENGEN 2890 : 2900 REM *************** 2910 REM SUCHROUTINE LT$ 2920 REM *************** 2930 : 2940 I=0:REM AUF 1.ELEMENT ZEIGEN 2950 IFW$=LT$(I)THENRETURN:REM WORT GEFUNDEN 2960 I=I+1:IFI127THENPRINTW$;:REM TEXTZEILE AUSGEBEN 3130 RESTORE:FORI=1TOC%AND127:READW$:NEXT:REM TEXT LESEN 3140 PRINTW$:CLOSE2:END:REM PROGRAMMENDE 3150 : 3160 DATA"TABLE OVERFLOW"," REDEFINITION OF LABEL","#?","MACRO TABLE OVERFLOW" 3170 DATA"@?"," REDEFINITION OF MACRO"," MACRO ?","!?"," UNDEF'D MACRO" 3180 DATA"STACK OVERFLOW","?WHILE..DO","TEXT TOO LONG","?IF..THEN","?REPEAT" 3190 DATA"UNTIL ?","WHILE ?","WHILE..?","IF?","IF..?","?IF..THEN" 3200 DATA"GOTO/GOSUB ?"," UNDEF'D LABEL","?FILE-NAME","FILE-NAME TOO LONG"