home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er
/
64ER_CD.iso
/
86xx
/
8612.d64
/
precompiler
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
1995-03-30
|
9KB
|
321 lines
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:IFI<L%THEN2950:REM WEITERSUCHEN
2970 I=-1:RETURN:REM WORT NICHT GEFUNDEN
2980 :
2990 REM **************
3000 REM SUCHROUTINE M$
3010 REM **************
3020 :
3030 I=0:REM AUF 1.ELEMENT ZEIGEN
3040 IFW$=M$(0,I)THENRETURN:REM WORT GEFUNDEN
3050 I=I+1:IFI<M%THEN3040:REM WEITERSUCHEN
3060 I=-1:RETURN:REM WORT NICHT GEFUNDEN
3070 :
3080 REM **********************
3090 REM FEHLERMELDUNG AUSGEBEN
3100 REM **********************
3110 :
3120 PRINTT$:IFC%>127THENPRINTW$;: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"