Precompiler für Textdateien
Wenn Sie für die Erstellung eigener Programme einen leistungsfähigen Editor vermissen, verwenden Sie doch einfach Ihr Textverarbeitungsprogramm.
Der abgedruckte »Basic-Precompiler« (Listing 1 und 2) verwandelt mit einem Textverarbeitungsprogramm erstellte Textdateien in lauffähige Basic-Programme. Der Vorteil liegt auf der Hand: Mit einem guten Textverarbeitungsprogramm können Sie — im Gegensatz zum Basic-Editor des C 64 — sehr leicht Zeilen(-blöcke) verschieben, löschen oder einfügen. Das Suchen nach bestimmten Befehls- oder Zeichenketten wird durch eine »FIND«-Option erheblich erleichtert. Mit »REPLACE« können Sie beispielsweise Textstrings, Variablennamen und ähnliches leicht ersetzen. Vor allem aber sind Sie unabhängig von Zeilennummern, so daß der sonst häufig benötigte RENUMBER-Befehl überflüssig wird. Doch wie kann man die in Basic unverzichtbaren Befehle GOTO und GOSUB ohne Zeilennummern verwenden? Die Antwort lautet: Mit Hilfe freiwählbarer Marken (Labels). Anstelle eines »GOTO 1000« können Sie beispielsweise einfach »GOTO EINSPRUNG« schreiben. Auf diese Weise sind nachträgliche Änderungen im Programm (zum Beispiel das Einfügen neuer Zeilen) ohne weitere Anpassungen möglich. Außerdem ist das Programm mit der Verwendung aussagekräftiger Labelnamen übersichtlicher und auch nach Monaten noch verständlich.
Der Basic-Precompiler erlaubt auch, häufig benutzte Befehle als Makros zu definieren, die man an anderen Stellen des Programms bei Bedarf einfach mit ihrem Namen aufzurufen braucht ( hierzu später mehr).
Besonders interessant ist auch, daß die Pascal-ähnlichen Kontrollstrukturen:
IF...THEN...ELSE...ENDIF REPEAT..UNTIL
WHILE...DO...ENDWHILE und CASE...ENDCASE«
unterstützt werden. Befindet sich im Textfile eine dieser Kontrollstrukturen, wird sie automatisch in Standard-Basic-Befehle übersetzt.
Wer in Assembler oder einer anderen Compiler-Sprache programmiert und hierzu einen Quellcode mit Basic-Zeilennummern benötigt, kann auch für diesen Zweck mit einem Textverarbeitungsprogramm arbeiten und den Basic-Precompiler verwenden, da dieser bei der Übersetzung keine Syntax-Prüfung vornimmt (außer bei den neuen Kontrollstrukturen).
Die Programm-Quelldateien müssen für eine erfolgreiche Precompilierung folgende Voraussetzungen erfüllen:
- Jede Zeile darf höchstens 256 Zeichen enthalten
- Zeilen müssen mit einem Endezeichen (<RETURN>) abgeschlossen sein
- Die Befehle müssen von ihren Operanden mit einem Leerzeichen getrennt sein
- Konditionsausdrücke dürfen keine Leerzeichen enthalten (richtig: »A=XAND255« falsch: »A=X AND 255«)
- das Programm muß mit dem Schlüsselwort »ENDPROGRAM« enden
- Die Quelltext-Datei muß sich auf einer Diskette befinden.
Zum Compilieren laden Sie bitte das Programm mit »LOAD "PRECOMPILER",8« und starten es mit »RUN«. Der Basic-Precompiler lädt daraufhin automatisch das Maschinenprogramm »PRECOMPILER.H« nach (Listing 2) und fragt Sie nach dem Namen der zu compilierenden Datei und nach der ersten Zeilennummer des Compilats. Während des Compilierens erscheint — je nach Länge des Quellprogramms — der ganze Zeichensatz buchstabenweise in der linken oberen Ecke des Bildschirms, damit Sie sehen können, daß die Übersetzung richtig läuft.
Der Basic-Precompiler verarbeitet auch die neuen Befehle von Basic-Erweiterungen. Voraussetzung ist, daß die Erweiterung während des Compiliervorgangs (und natürlich beim Lauf des Programms) aktiviert und die Einsprungsadresse für die Umwandlungsroutine der neuen Tokens in Adresse $0304/$0305 abgelegt ist. Das ist bei »echten« Befehlserweiterungen, wie zum Beispiel Simons Basic, immer der Fall.
Falls während des Compiliervorgangs ein Fehler auftritt, wird das Programm mit Ausgabe einer Fehlermeldung (siehe Tabelle 1) abgebrochen. Nach der erfolgreichen Compilierung aber, werden Sie aufgefordert, den Namen einzugeben, unter dem das Programm gespeichert werden soll.
| TABLE OVERFLOW | Die Tabelle, in die die Labels eingetragen werden, ist voll. |
| #? | Ein Label sollte definiert werden. Der Compiler fand jedoch keinen Namen |
| REDEFINATION OF LABEL | Ein Label wurde erneut definiert |
| UNDEF’D LABEL | Ein nicht definiertes Label wurde aufgerufen |
| @? | Ein Makro sollte definiert werden. Der Compiler fand jedoch keinen Namen |
| MAKRO TABLE OVERFLOW | Die Tabelle, in die Makros eingetragen werden, ist voll |
| REDEFINATION OF MAKRO | Ein Makro wurde zweimal definiert |
| MACRO? | Der Compiler fand keine Anweisung hinter einem Makronamen |
| !? | Ein Makro sollte aufgerufen werden. Der Compiler fand aber keinen Namen |
| UNDEF’D MACRO | Ein nicht definiertes Makro wurde aufgerufen |
| STACK OVERFLOW | Der Compiler hat einen eigenen Stack, um Verzweigungen von Kontrollstrukturen zu speichern. Eine zu tiefe Verschachtelung kann der Compiler nicht verarbeiten |
| WHILE ? | Der Konditionsausdruck hinter WHILE fehlt |
| WHILE...? | Nach der Bedingung mit WHILE fehlt die DO-Anweisung |
| ?WHILE...DO | Die Schleife wurde nicht mit WHILE...DO definiert. Der Compiler fand aber ENDWHILE |
| IF? | Der Konditionsausdruck hinter IF fehlt |
| IF...? | Nach der Bedingung mit IF fehlt das Schlüsselwort THEN |
| ?IF...THEN | Die Verzweigung wurde mit IF..THEN vereinbart, aber nicht mit ELSE beziehungsweise ENDIF abgeschlossen. |
| ?REPEAT | Die Schleife wurde mit REPEAT definiert, aber UNTIL fehlt |
| UNTIL? | Der Konditionsausdruck hinter UNTIL fehlt |
| STACK POINTER =... | Nach dem ersten Durchlauf prüft der Compiler, ob der Stackzeiger null ist. Wenn ja, dann setzt er seine Arbeit mit dem zweiten Pass fort, andernfalls bricht er sie mit der Anzeige, welche Kontrollstruktur nicht ordnungsmäßig abgeschlossen wurde, ab |
| TEXT TO LONG | Der Speicher reicht nicht aus, den Text weiter aufzunehmen. |
| GOTO/GOSUB? | Die Sprungmarke hinter GOTO beziehungsweise GOSUB fehlt. |
| ?FILE-NAME | Der Dateiname des nachzuladenden Quelltextes fehlt. |
| FILE-NAME TOO LONG | Der Dateiname des nachzuladenden Quelltextes ist länger als 16 Zeichen |
Es ist durchaus möglich, mehrere Quelltextdateien zu einem einzigen Objektcode-Programm zusammenzufassen. Sie brauchen hierzu lediglich den Dateinamen des nächsten Quelltextes mit einem führenden Pfundzeichen in die letzte Programmzeile zu schreiben (zum Beispiel »£SOURCE 2«).
Wie bereits oben erwähnt, verwenden Sie bei der Programmerstellung Labels als Sprungziele für GOTO und GOSUB. Das Label muß bei der Definition mit einem führenden Doppelkreuz am Anfang einer Zeile stehen und mit einem Leerzeichen von dem nachstehenden Befehl getrennt sein. Der Aufruf erfolgt mit dem Labelnamen, der aus einer beliebig langen Zeichenkette bestehen darf. Zum Beispiel: GOSUB KEY
#KEY POKE 198,0: WAIT 198,1: RETURN
Nicht erlaubt sind jedoch bedingte Sprünge (IF... THEN) ohne GOTO, verwenden Sie deshalb bitte auch hier den GOTO-Befehl (zum Beispiel IF A=0 THEN GOTO label).
Der »Basic-Precompiler« erlaubt auch Makro-Instruktionen, die aber nicht mit denen der Assembler-Programmierung vergleichbar sind. Makros bedeuten hier, daß wiederholt auftretende Zeilen anfangs mit einem Kennamen definiert werden können und danach bei Bedarf lediglich mit diesem Namen aufgerufen werden brauchen. Bei der Compilierung werden sie durch die entsprechenden Befehlszeilen ersetzt. Dem Makronamen muß bei der Definition ein Klammeraffe und beim Aufruf ein Ausrufezeichen vorangestellt werden.
Die erstellten Texte werden von den verschiedenen Textverarbeitungsprogrammen in unterschiedlicher Weise gespeichert. Deshalb ist es notwendig, den Basic-Precompiler an das gewünschte Format anzupassen. Die abgedruckte Version ist ohne Änderung für Textomat-Dateien verwendbar. Zur Anpassung an andere gängige Formate brauchen nur wenige Zeilen geändert beziehungsweise eingefügt werden (Tabelle 2).
(Hoang-Thai Nguyen/nj)| Vizawrite 64: | 380 POKE 49520,32 420 POKE 49546,32 440 POKE 49340,220 515 FORI=0 TO 255:GET#2,W$:NEXT 516 GET#2,W$:IF W$ <> CHR$(220) THEN 516 |
| Master-Text: | 380 POKE 49520,32 420 POKE 49546,32 440 POKE 49340,220 |
| WORDPRO 3 PLUS: | 380 POKE 49520,32 420 POKE 49546,32 |
| StarTexter 64: | 510 REM |
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"{clr}{down}basic-precompiler":rem titel ausgeben
250 print"written by hoang-thai nguyen{down}"
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 "{CBM-@}"-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"{down}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{down}":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"{down}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%)="gO"+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)+":gO":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%)+"gO":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"
PROGRAMM : PRECOMPILER.H C000 C18B ----------------------------------- C000 : 20 FD AE 20 8B B0 A6 0D C1 C008 : E0 FF F0 03 4C 99 AD 60 8D C010 : 20 00 C0 85 FB 84 FC 20 29 C018 : 00 C0 85 FD 84 FE 60 20 9B C020 : 10 C0 A0 00 B1 FD AA D0 10 C028 : 03 91 FB 60 C8 B1 FD 91 34 C030 : FB 85 4E C8 B1 FD 91 FB E4 C038 : 85 4F A0 00 B1 4E C9 22 86 C040 : D0 0A C8 CA F0 0E B1 4E 84 C048 : C9 22 D0 F6 C9 20 F0 04 9F C050 : C8 CA D0 E8 98 A0 00 91 80 C058 : FB A8 88 C8 B1 4E C9 20 D7 C060 : F0 F9 84 50 A0 00 B1 FD 45 C068 : 38 E5 50 91 FD D0 07 C8 ED C070 : 91 FD C8 91 FD 60 C8 B1 CD C078 : FD 18 65 50 91 FD C8 B1 74 C080 : FD 69 00 91 FD 60 20 00 C7 C088 : C0 85 FB 84 FC A2 02 20 C7 C090 : C6 FF A0 00 20 70 C1 C9 9E C098 : 3A F0 F9 CD 88 C1 F0 F4 C7 C0A0 : CD 89 C1 F0 EF CD 8A C1 DB C0A8 : F0 EA C9 22 D0 0D 99 8B B7 C0B0 : C1 C8 F0 2A 20 70 C1 C9 77 C0B8 : 22 D0 F3 C9 5F F0 22 C9 12 C0C0 : 3A D0 12 A9 20 99 8B C1 9D C0C8 : C8 F0 13 A9 3A 99 8B C1 24 C0D0 : C8 F0 0B A9 20 99 8B C1 89 C0D8 : 20 70 C1 C8 D0 CC 4C 71 41 C0E0 : A5 98 F0 AE 88 C0 FF F0 54 C0E8 : A9 B9 8B C1 C9 3A F0 F4 A5 C0F0 : CD 88 C1 F0 EF CD 89 C1 A7 C0F8 : F0 EA CD 8A C1 F0 E5 C8 EF C100 : A9 00 99 8B C1 98 20 7D DD C108 : B4 A0 FF C8 B9 8B C1 F0 06 C110 : 02 91 62 D0 F6 84 61 A0 E8 C118 : 02 B9 61 00 91 FB 88 10 8A C120 : F8 4C CC FF 20 00 C0 85 81 C128 : FB 84 FC A0 00 B1 FB AA 8B C130 : C8 B1 FB 85 FD C8 B1 FB 65 C138 : 85 FE A0 00 B1 FD 99 00 D6 C140 : 02 C8 CA D0 F7 8A 99 00 AD C148 : 02 A5 7A 48 A5 7B 48 A9 6F C150 : 02 86 7A 85 7B 20 79 A5 CE C158 : 68 85 7B 68 85 7A A0 FF 1D C160 : C8 B9 00 02 F0 02 91 FD A7 C168 : D0 F6 98 A0 00 91 FB 60 2B C170 : 20 CF FF 29 7F C9 20 B0 C5 C178 : 04 18 69 40 60 C9 40 90 61 C180 : FB C9 60 B0 F4 69 80 60 EB C188 : 20 A0 A4 12