MCODER II

MCODER ist der erste echte Compiler für den ZX81.

Er wurde sorgfältig programmiert um so wenig als möglich Speicherplatz zu beanspruchen (gerade mal weniger als 4K) um so den größtmöglichen Platz für Ihre Programme frei zu halten.

Obwohl MCODER ein sehr raffiniertes und nützliches Werkzeug ist, dürfen Sie keine Wunder erwarten. Sie müssen sich erst mit seiner Arbeitsweise vertraut machen, wenn Sie es es optimal benutzen möchten.

Wie lade ich MCODER?

MCODER muß immer im Speicher des ZX81 enthalten sein, bevor Sie Programme eingeben und austesten. Es wird von Band mittels LOAD "" geladen. MCODER enthält seine eigene Prüfroutine, um sicherzustellen, daß es richtig geladen wurde. Wenn aus irgendeinem Grund das Programm fehlerhaft sein sollte, wird eine Fehlermeldung angezeigt und Sie sollten es noch einmal laden.

Einmal geladen müssen Sie daran denken, daß MCODER die Zeilen 1-3 benutzt und diese nicht gelöscht werden dürfen.

Wie verwende ich MCODER?

Die Verwendung von MCODER ist ein wirklich einfacher Vorgang. Zu allererst geben Sie dWie beim ZX81-BASIC-Programm ein, daß Sie übersetzen möchten. Es ist unbedingt erforderlich, daß gründlich testen bevor es übersetzt wird, da es im übersetzten Programm keine BREAK-Funktion gibt. Vor dem Schreiben eines Programmes wird dringend empfohlen, daß Sie sich die Liste der Befehle durchlesen, die MCODER übersetzt und Sie sicherstellen, daß Ihr BASIC-Programm ausschließlich aus diesen Befehlen besteht.

Wenn Sie dann mit Ihrem Programm zufrieden sind, können Sie es durch den Befehl LET L=USR 17300 übersetzen lassen. Die BASIC-Anweisungen werden bei der Übersetzung auf dem Bildschirm ausgegeben.

Wenn MCODER einen Befehl oder eine Anweisung findet, die er nicht übersetzen kann, wird er zu BASIC zurückkehren und einen Inverse-S-Cursor bei oder nahe dem schuldigem Befehl anzeigen.

Mögliche Fehler sind unter anderem:

  1. Die Verwendung ungültiger Variablennamen
  2. GOTO 'variable' oder GOSUB 'variable', was nicht zulässig ist
  3. Eine unzulässige Anweisung, wie etwa SAVE oder DIM A$(10)

Wenn ein Fehler gemeldet wird, sollten Sie ihn korrigieren und neu übersetzen lassen.

Am Ende einer erfolgreichen Übersetzung werden Ihnen drei Dinge angezeigt:

  1. Die letzte Speicherstelle des erzeugten Codes
  2. Die Anweisung zum Starten des übersetzen Codes
  3. Eine Frage, ob Sie das übersetze Programm direkt ausführen lassen wollen (RUN? - antworten Sie mit Y (ja) oder N (nein))

Kann ich BASIC-Programme übersetzen, die ich bereits auf Kassette habe?

JA- laden Sie einfach MCODER zuerst und dann das Programm, daß Sie übersetzen möchten. Durch LET L=USR 32462 nach dem Laden Ihres Programmes wird MCODER in Position gebracht. Sie können nun wie oben gezeigt fortfahren.

Es ist wichtig zu betonen, daß Sie wahrscheinlich erhebliche Änderungen an Ihrem BASIC-Programm vornehmen müssen, da es unwahrscheinlich ist, daß es für MCODER geeignet geschrieben wurde.

Welche Anweisungen wird MCODER übersetzen?

Beachten Sie, daß Variablennamen lediglich aus A-Z und 0-9 bestehen dürfen. Arithmetik ist auf die vier Grundrechenarten + - * / beschränkt.

ANDBoolsches UND. Nur beim IF-Befehl zulässig.
ABSWie beim ZX81-BASIC
CHR$Wie beim ZX81-BASIC
CLSWie beim ZX81-BASIC
CLEARWie beim ZX81-BASIC
CODEWie beim ZX81-BASIC
COPYWie beim ZX81-BASIC
DIM A(V)

MCODER unterstützt lediglich eindimensionale Felder. Zur Laufzeit muß mindestens 2*V Bytes freier Speicherplatz vorhanden sein. Die Feldgrenzen werden nicht überprüft, daher vergewissern Sie sich bitte, daß es unter normalem BASIC funktioniert. Wenn Sie ein Feld re-definieren, wird eine neue Version des Feldes angelegt, aber das alte wird nicht gelöscht. Das bedeutet, daß eine wiederholte Zuweisung evtl. den Speicher des Systems füllen und eine Fehlermeldung 4 (kein freier Speicher mehr) erzeugen kann wenn ein Feld oder ein String zugewiesen wird.

Der Feld- und Zeichenkettenspeicher erstreckt sich von STKEND bis 256 Bytes unter RAMTOP. Alle Felder, Zeichenketten und Variablen werden gelöscht wenn Sie ein MCODER-Programm erneut aufrufen und der Speicher wird wieder verfügbar gemacht. Es gibt keine Zeichenkettenfelder.

FAST

Wie beim ZX81-BASIC, außer daß MCODER nicht zum SLOW-Mode zurückkehrt wenn der Bildschirm voll ist, während INPUT oder PAUSE.

FOR X = V TO U

X wird in Schritten von 1 erhöht von V bis U. NEXT X steht am Ende der Schleife. Beachten Sie, daß (U-V) kleiner als 32767 sein muß.

GOSUB N

Ruft Zeile N als Unterprogramm auf. Wenn N nicht existiert, wird zur nächsten Zeile nach N verzweigt. Beachten Sie, daß N eine ganzzahlige positive Konstante sein muß.

GOTO N

Springt bedingungslos zur Zeile N. Ansonsten wie GOSUB.

IF V op U THEN

wobei op einer der Operanden AND, OR, <>, =, <=, >=, < oder > ist. Beachten Sie, daß V und U sich nicht um mehr als 32767 unterscheiden dürfen. Auf Zeichenketten sind AND und OR nicht anwendbar.

INKEY$Wie beim ZX81-BASIC
INPUT A
INPUT A$

Wie beim ZX81-BASIC. Bei Zahlen ist ein vorangestelltes Minuszeichen zulässig. Bei Zeichenketten beträgt die maximale Länge 31 Zeichen. Kein Graphics-Mode.

INTMit enthalten um das Austesten unter ZX81-BASIC zu erleichtern.
LEN A$Wie beim ZX81-BASIC außer daß A$ nicht mittels TO geteilt werden kann.
LETWie beim ZX81-BASIC
LPRINTWie beim ZX81-BASIC
NEWWie beim ZX81-BASIC
NEXTSee FOR - NEXT
ORBoolsches ODER nur verfügbar bei IF-Befehlen
PAUSE V

Hält im SLOW-Mode das Programm für V/50 Sekunden an. Im Gegensatz zum Sinclair-BASIC wird nicht aus dem FAST- in den SLOW-Mode gewechselt. Zu Beginn und Ende der PAUSE gibt es kein Bildschirmflackern. V muß positiv und kleiner als 32768 sein. Drücken von SHIFT+EDIT kehrt zu BASIC zurück, jede andere Taste führt zum Fortsetzen des Programmes mit der nächsten Anweisung.

PEEKWie beim ZX81-BASIC
PLOTWie beim ZX81-BASIC
POKEWie beim ZX81-BASIC
PRINTWie beim ZX81-BASIC
RANDWie beim ZX81-BASIC
REM

Wird wie gewohnt ignoriert, außer daß "REM?" prüft, ob SHIFT+EDIT gedrückt sind und ggfs. zu BASIC mit der Fehlermeldung D zurückkehrt. Dies ist nützlich, um aus Endlosschleifen herauszuspringen.

RETURN

Kehrt von einem durch GOSUB aufgerufenem Unterprogramm zurück. Stellen Sie sicher, daß zu jedem GOSUB ein zugehöriges RETURN existiert, da dies nicht überprüft wird.

RND

Liefert eine zufällige Ganzzahl im Bereich von 0 und 32767 (NICHT identisch mit der ZX81-BASIC-Funktion!) Um den selben Effekt unter BASIC zu erhalten, verwenden Sie bitte USR 16550.

SCROLLWie beim ZX81-BASIC
SGNWie beim ZX81-BASIC
SLOWWie beim ZX81-BASIC
SQRGanzzahlige Quadratwurzel
STOP

Wenn MCODER eine STOP-Anweisung findet, wird der Übersetzungsvorgang an dieser Stelle abgeschlossen. Wenn Sie einen STOP mitten in Ihrem Programm wünschen, verwenden Sie die Anweisung LET L=USR 3292. Dies wird eine Fehlermeldung 9 erzeugen und das Programm anhalten.

Strings

Vorgegeben ist eine maximale Zeichenkettenlänge von 32 Zeichen. Wenn Sie die maximale Zeichenkettenlänge überschreiten, schreiben Sie in was immer im Speicher folgt (entweder eine andere Zeichenkette oder ein Feld). Vergleichen Sie in jedem Fall den Abschnitt "Weitere Möglichkeiten". Das Aufteilen von Zeichenketten kann nicht in der Form A$( TO M) oder A$(M TO ) geschehen. Es gibt keine Felder aus Zeichenketten.

UNPLOTWie beim ZX81-BASIC
USRWie beim ZX81-BASIC

Verbessertes Scrollen der Bildschirmausgabe

Unter Sinclair BASIC wird die Fehlermeldung 5 angezeigt, wenn die Ausgabe das untere Ende des Schirms erreicht hat. Unter MCODER wird ein inverses ? am unteren linken Ende des Schirms angezeigt, wenn die Ausgabe diesen Punkt erreicht hat. Das Drücken von CONT bewirkt ein CLS und das Programm fährt weiter fort (das Gedrückt-halten von CONT wiederholt diesen Vorgang unbestimmt oft).

Das Drücken von SHIFT+EDIT hält das Programm an, die Taste D (SLOW) bewirkt das Scrollen mit maximal einer Zeile pro Sekunde, die Taste Z (COPY) schickt eine Hardcopy des Bildschirminhaltes an den Drucker.

Jede andere Taste bewirkt das aufwärtsscrollen des Schirms solange die Taste gedrückt ist, wenn die Taste losgelassen wird, hört der Schirm auf zu scrollen. Die Auswahl dieser Möglichkeiten kann jedesmal wenn das Fragezeichen angezeigt wird, auf's neue getroffen werden.

Was Sie im Kopf behalten müssen

Wenn Sie ein mit MCODER übersetztes Programm ablaufen lassen, muß MCODER immer mit enthalten sein, da er das Laufzeitsystem und die arithmetischen Routinen enthält.

Sie dürfen nicht die SCROLL-Anweisung des Sinclair-BASICs verwenden, wenn Sie beabsichtigen, BASIC und übersetzten Code zu mischen, da dieser Befehl die Regelmässigkeit des display files (DFILE) zerstört, die MCODER benötigt.

Weitere Möglichkeiten von MCODER

Sie können wählen, wo der durch MCODER erzeugte Code abgelegt werden soll durch den Aufruf von RAND USR 17287. MCODER wird "CODE" anzeigen, worauf Sie mit einer positven ganzzahligen numerischen Eingabe antworten sollten, ab welcher Stelle der Code abgelegt werden soll. Um herauszufinden, wie lang der erzeugte Code ist, lassen Sie ab Adresse 0 ablegen.

Es gibt eine Reihe anderer nützlicher Speicherstellen. POKE 16417,N bewirkt, daß ihr Programm ohne ein '?' anzuzeigen den Bildschirm um N Zeilen nach oben scrollt. Nach dem Scrollen wird die Speicherstelle 16417 wieder Null enthalten.

Die Speicherstellen 16507 und 16508 enthalten die vorgegebene Länge der ZEichenketten, die Sie in Ihrem Programm mittels POKE verändern können, um den vorgegebenen Wert zu verändern. Dieser Wert wird beim Start Ihres Programmes zurückgesetzt.

Die Speicherstellen 16536 und 16537 werden verwendet um die obersten Zeilen vor dem Scrollen zu schützen. Der Wert sollte n*33 betragen, wobei n die Anzahl der Zeilen ist, die stehen gelassen werden sollen.

16535 ist die Speicherstelle, die das automatische Scrollen während des Übersetzungsvorganges bewirkt. Wenn hier mittels POKE eine 0 hineingeschrieben wird, wird der Compiler mit der Ausgabe wie oben beschrieben warten. Das Drücken von D bewirkt, daß der erzeugte Code angezeigt wird.

Sie möchten möglicherweise den compilierten Code in mehrere Bereiche aufteilen. Dies kann durch folgende Vorgehensweise erreicht werden:

  1. Übersetzen Sie den ersten Teil. Die Eintrittsstelle wird angezeigt (X). Wandeln Sie die Zeile 2 durch POKE X-6,1 in Zeile 1 um.

  2. Übersetzen Sie jetzt den zweiten Teil. Eine neue Eintrittsstelle (Y) wird angezeigt. RAND USR X funktioniert noch immer um den ersten Teil aufzurufen und RAND USR X wird weiterhin den zweiten Teil aufrufen.

    (Hinweis für Benutzer mit Maschinen mit mehr als 16K Speicher: unter keinen Umständen darf ein Teil des durch MCODER erzeugten Codes die 32K-Grenze überschreiten.)

  3. Wenn Sie Ihre eigenen Maschinensprachprogramme verwenden möchten, legen Sie diese in einer REM-Zeile mit der Zeilennummer 1 ab. Das erste verfügbare Byte hat die Adresse 20498. Ihr übersetzter Code fängt dann bei 20500 an, aber die korrekte Eintrittsadresse wird Ihnen angezeigt werden.

Das BASIC-Programm kann schnell durch den Aufruf von RAND USR 17281 gelöscht werden.

Beispiel für MCODERs Geschwindigkeit

Geben Sie das folgende kurze Programm ein und übersetzen es.

100 FOR A=1 TO 50
200 FOR B=1 TO 30
300 PLOT A,B
400 NEXT B
500 NEXT A
600 STOP

Vergleichen Sie nach dem Übersetzen die Ausführungsgeschwindigkeit des übersetzen Codes mit derjenigen des Sinclair BASICs und Sie werden einen Eindruck von der Verbesserung erhalten, die MCODER bewirkt.

Copyright

MCODER II Copyright 1983 D.C. Threlfall

MCODER II

ZX81
(c) P.S.S. 1983

452, Stoney Stanton Road,
Coventry
CV6 5DG.
Telephone (0203) 667556