spectrum m coder programmier anleitung Wofür braucht man M-Coder? Die einfache Antwort besteht darin, daß Maschinencode (MC) Pro- gramme sehr viel schneller als BASIC-Programme laufen, wobei man allgemein einen Schnelligkeitsfaktor von 50 erwarten kann. Mit M- Coder können Sie BASIC-Programme in Maschinensrache compilieren. M-Coder ... 16k und 48k Auf Ihrer Kassette finden Sie zwei M-Coder Versionen: Auf der ei- nen Seite die ursprüngliche Version in der 16k Fassung und auf der anderen Seite die verbesserte Version "M-Coder II", die allerdings nur auf dem 48k Spectrum lauffähig ist. M-Coder ist ein Compiler, der nur mit Integer-Zahlen im Bereich von -32768 bis 32767 arbeitet, um eine großere Geschwindigkeit von compilierten Programmen zu erzielen. Obwohl M-Coder ein nützliches und möglichst umfassended Hilfspro- gramm darstellt, erwarten Sie bitte keine Wunder. Sie werden mit dem System ein wenig üben müssen, um die besten Ergebnisse zu er- zielen. Das gilt ebenfalls für die Umschreibung von Befehlen, die der M-Coder nicht compilieren kann. Sämtliche Adress- oder Arbeitswerte, die für das 48k M-Coder II Programm gelten, erscheinen in Klammern hinter den '16k-Werten'. Irgendweiche Unterschiede, die für den M-Coder II signifikant sind, werden gesondert beschrieben. Laden des M-Coders Das Compilerprogramm muß grundsätzlich im Arbeitsspeicher des Spectrum vorhanden sein, bevor Sie damit arbeiten können. Laden Sie M-Coder normal mit LOAD "". Arbeiten mit M-Coder Sie können auf zwei verschiedenen Wegen mit M-Coder arbeiten, nachdem Sie das Programm geladen haben: 1. a) Programmieren Sie in BASIC, wie Sie es normalerweise tun würden. Zu beachten ist, daß ein STOP-Befehl an das Ende des BA- SIC-Programms gesetzt werden muß, da M-Coder bis zu diesem Befehl das Programm compilieren wird. Das bedeutet aber auch, daß Sie in einem BASIC-Programm nur einen STOP-Befehl benutzen können. (Der STOP-Befehl ist nicht nötig bei M-Coder II. Wenn Sie aber in einem zu compilierenden Programm den Befehl STOP verwenden, wird wie bei der 16k Version nur bis zu diesem Befehl in Maschinensprache übersetzt; siehe auch unter STOP). Wenn das Programm fertig er- stellt ist, lassen Sie es einmal in BASIC laufen, um etwaige Feh- ler sofort zu finden. b) Wenn Sie mit Ihrem Programm zufrieden sind, aktivieren Sie den Compiler mit RAND USR 29000 (60000). Jede übersetzte Programmzeile wird nun auf dem Bildschirm noch einmal angezeigt. Falls ein BA- SIC-Befehl vorhanden ist, der nicht übersetzt werden kann, wird ein blinkender Kursor den Fehler anzeigen und das Programm kehrt zum BASIC zurück. Wenn alles in Ordnung war, ist der erste Compi- ler-Durchlauf abgeschlossen. Jetzt pausiert das Programm solange, bis irgendeine Taste gedrückt wird. Nach dem zweiten Durchlauf mit der nochmaligen Anzeige des Programms erscheint am unteren Rand des Bildschirms die Meldung OK und Sie befinden sich wieder im BASIC. Der Compiler-Vorgang ist nun erfolgreich abgeschlossen (Bei M-Coder II erfolgen beide Durchgänge ohne Unterbrechung. Zusätzlich erscheinen auf dem Bildschirm zwei weitere Informatio- nen: 1. Die Länge des compilierten Maschinencodes und 2. die ent- sprechende Anfangs- bzw. Aufrufadresse). 2.) Auch schon fertig auf Kassette gespeicherte Programme können bearbeitet werden, indem sie einfach nach dem M-Coder Programm eingeladen weden. Wahrscheinlich werden Sie vor dem Einsatz des Compilers einige Änderungen am BASIC-Programm vornehmen müssen, damit es fehlerfrei übersetzt wird. Aufruf von compilierten Programmen Das nun compilierte Programm wird immer direkt über RAMTOP, gleichgültig, auf welche Adresse er gesetzt worden ist, abgespei- chert. Durch M-Coder ist der RAMTOP auf 26500 (40000) initiali- siert worden. Also kann das MC-Programm mit RAND (PRINT o. LET L=) USR 26500 (40000) gestartet werden. Ist es möglich, mehrere Programme übersetzen zu lassen? Ja. Sie können verschiedene Programme mit M-Coder "aufeinandersta- peln". Dazu müssen Sie den RAMTOP mit CLEAR n verschieben, wobei n Werte zwischen 24000 und 28000 (24000 und 59000) annehmen kann. Zuerst setzen Sie den RAMTOP höher, z.B. auf 27000. Dann wird ein Programm geladen bzw. geschrieben, compiliert und somit direkt über RAMTOP gespeichert. Sie können jetzt dieses Programm mit RAND USR 27000 starten. Nun wird der RAMTOP auf z.B 25000 (CLEAR 25000) erniedrigt. Jetzt kann ein weiteres Programm übersetzt und zwischen RAMTOP auf dem Anfang des ersten Programms gesetzt wer- den. Achten Sie dabei darauf, daß das zweite Programm das erste nicht überschriebt. Ein Zähler in der rechten oberen Ecke des Bildschirms, der jeweils die Endadresse des compilierten Programms anzeigt bzw. während des Compiler-Vorgangs die einzelnene bytes des MC zählt, hiltf Ihnen dabei. Beide Routinen können nur individuell benutzt werden. Gleichwertige Variablen in den gestapelten Pro- grammen werden allerdings nicht übertragen. Welche Fehler können auftreten? Wenn der RAMTOP zu hoch angesetzt wurde, wird eine 'out of memory' Fehlermeldun angezeigt. Falls eine Fehlermeldun links von einem LET- oder INPUT-Befehl erscheint, ist es nötig, die Anzahl der Va- riablen zu verringern, da M-Coder eine eigene Variablentabelle be- nutzt, die natürlich auch nur begrenzt ist. Eine Fehlermeldung er- scheint bei der 16k Version ebenfalls, wenn der STOP-Befehl am En- de des BASIC-Programms nicht vorhanden ist. Optimale Hilfe bei der Fehlersuche Sie haben die Möglichkeit, drei verschieden Stufen der Schnellig- keit des Programms mit unterschiedlichen Extras durch Einsetzen von Programmzeilen der Form REM#n zu programmieren. REM#0: Die BREAK-Funktion arbeitet nur bei "scroll?" oder INPUT- Befehlen. Dies ist der schnellst Ablauf. REM#1: Sie können das Programm jederzeit BREAKen. Dieser Ablauf ist auch zu Beginn initialisiert worden und nun zweimal so langsam. REM#2: Die BREAK-Funktion arbeitet normal und es wird zusätzlich oben rechts auf dem Bildschirm die gerade auszuführende Programmzeile angezeigt. FOLGENDER ABSCHNITT GILT NUR FÜR M-CODER II Zugriff zu der M-Coder Variablentabelle Die Adressen der von M-Coder benutzten Variablen kann durch den folgenden Befehl angezeigt werden: PRINT USR 65240: "Variablenname in Anführungszeichen" Für dimensionierte Felder und Strings werden als Variablenname nur zwei Zeichen benötigt, wie z.B. A$ oder b9. Hierbei bekommen Sie zwei Werte angezeigt, wobei der erste auf die 'Definitionsadresse' im compilierten Programm zeigt (P=Pointer) und der zweite die Anfangsadresse in der Variablentabelle darstellt. Anmerkung: Felder in M-Coder beinhalten ein Element Null, (d.h. ein Element mehr als in BASIC), auf das die erste Adresse zeigt. Die ausgedruckte Adresse ist geändert worden und zeigt nun auf das erste Element. M-Coder Befehle Variablennamen können normal aus Groß- und Kleinbuchstaben und Zahlen bestehen. Ausdrücke, die aus mehreren Funktionen bestehen, können überall eingesetzt werden. In Verbindung mit dem Befehl LET muß der Ausdruck allerdings in Klammern gesetzt werden. Befehle und Funktionen, die nur für M-Coder II gelten, sind mit zwei Sternchen gekennzeichnet (**). Befehle AND ** Nur als Boolean-Funktion und innerhalb eines IF- Befehls verwendbar. ABS ATTR BEEP x,y Für M-Coder II: Verwenden Sie keine Klammern, wenn ein Ton von der Länge weniger als eine Sekunde gewünscht wird: z.B. BEEP 1/3,5 und nicht BEEP (1/3), 5. BORDER BRIGHT CIRCLE CHR$ ** CLS CLEAR CODE e="a" oder INKEY$. Unbeschränkte Verwendun nur bei M-Coder II COPY DATA list list muß eine Reihe von Integer-Zahlen sein. (Bei M-Coder II können auch Strings bzw. Zeichenketten eingesetzt werden). DIM Z (x) Nicht für M-Coder II: Löscht das Feld mit dem Namen Z und setzt alle Element auf Null. Es gibt nur ein Feld, das von M-Coder (16k) compiliert wird und das muß Z heißen. DIM a (v) ** Mit M-Coder II können auch mehrere eindimensionale Felder compiliert werden. Wenn das Programm abgear- beitet wird, muß allerdings noch ein Speicherplatz von 2 mal v bytes vorhanden sein. Da keine entspre- chende Überprüfung stattfindet, versichern Sie sich hier unbedingt, daß das Programm in BASIC lauffähig ist. Wenn Sie im compilierten Programm eine Neudi- mensionierung eines Feldes vornehmen, wird diese zwar angenommen und ist abrufbar, das alte Feld aber nicht gelöscht. D.h., daß bei fortlaufenden Neudimensionierungen (und Stringdefinitionen) ir- gendwan die Fehlermeldung "out of memory" erschei- nen kann. Der Speicherplatz für Strings und Felder erstreckt sich von 100 bytes über STKEND bis 256 bytes unter RAMTOP. Alle Variablen, Felder und Strings werden gelöscht, wenn Sie ein neues Pro- gramm compilieren. Die Eingabe von Stringfeldern ist nicht möglich. DRAW x,y DRAW x,y,z FLASH FOR a=x to y STEP ist immer +1 GOSUB n GOTO n IF x THEN s IN INK INKEY$ INPUT Der Kommentar bei INPUT-Befehlen wird wie bei PRINT gehandhabt. Zeichen, deren Code kleiner als 32 und größer als 164 ist, werden nicht angenommen. INT Diese Funktion ist mit einbezogen worden, damit Sie Ihre BASIC-Programme unter M-Coder Bedingungen überprüfen können. INVERSE LET LEN A$ ** Wie im BASIC. Strings können allerdings innerhalb der Funktion nicht bearbeitet werden. LPRINT NEXT a NEW ** OUT m,n OR ** Wie AND OVER PAPER PAUSE n Hält das Programm n/50 sec an. Wenn eine Taste ge- drückt wird, setzt M-Coder die Ausführung fort. Bei n=0 wartet das Programm solange, bis eine neue Taste gedrückt wird. PEEK ** PLOT m,n POINT POKE m,n PRINT (i) "..." (ii) Zahl (iii) CHR$ n (iv) AT m,n (v) TAB n (vi) Farbparameter (vii) Nur M-Coder II : Stringvariable RANDOMIZE READ REM RESTORE n RETURN RND Ergibt eine integerzahl zwischen 0 und 32767. Denselben Effekt in BASIC bekommen Sie durch USR 59997. SGN SQR Ganzzahlige Wurzel. STOP Der letzte zu übersetzende BASIC-Befehl. Bei M-Co- der II auß dieser Befehl nicht am Ende eines Pro- gramms stehen. Wenn STOP innerhalb eines Programms vorkommt, endet der Compilervorgang an dieser Stel- le. Wenn Sie innerhalb eines zu compilierenden Pro- gramms stoppen wollen, verweaden Sie an Stelle von STOP den Befehl LET L=USR 7406. STRINGS ** Normalerweise ist die übersetzungsfähige Zeichen- kettenlänge 32 Zeichen groß. Wenn Sie die maximale Länge überschrieben . Um die maximale Lä- nge zu ändern, müssen Sie vom Programm aus die Adresse 60200 mit einer Zahl (gleich Länge) zwi- schen 1 und 255 POKEn und war bevor Sie eine Stringvariable definieren, die eine andere Länge haben soll. TO ** Bei Verwendung in der Stringverarbeitung muß die allgemeine Form A$ (m TO n) (oder A$(m)) benutzt werden (und nicht z.B. A$( TO n)). USR Beispiel-Programm Wenn Sie dieses Programm eingeben und in ursprünglicher und compi- lierter Form laufen lassen, bekommen Sie einen Einblick in die Leistungsfähigkeit von M-Coder. 10 LET P=0: INK P 12 FOR F=1 TO 20 13 BEEP 1/(Z*F), F 14 NEXT F 20 LET A=0: LET B=255: LET C=175: LET D=0: CLS 30 FOR I=0 TO 255: PLOT OVER 1; I,A: NEXT I 40 FOR I=0 TO 175: PLOT OVER 1; B,I: NEXT I 50 FOR I=0 TO 255: PLOT OVER 1; ( 255-I ), C: NEXT I 60 FOR I=0 TO 175: PLOT OVER 1;D ( 175 - I ): NEXT I 70 LET A=A+1: LET B=B-1; LET C=C-1: LET D=D+1 80 LET P=P+1: IF P=7 THEN LET P=0 81 PRINT AT 10, 12; "SPECTRUM" 82 PRINT AT 11, 13: "MCODER" 85 INK P 90 IF A 175 THEN GO TO 10 100 GO TO 30 9000 STOP Abspeichern von compilierten Programmen Sie können Ihr MC-Programm durch SAVE "Name" CODE m,n ganz normal abspeichern, wobei n die Startadresse Ihres MC-Programms ist. Zu beachten ist, daß das M-Coder Programm mit abgespeichert werden muß, da das compilierte Programm einige Routinen von M-Coder be- nutzt. Der Compiler belegt den Bereich von 28990 bis 32590 (59990 bis 65368), sodaß der vollständige Befehl - SAVE "Name" CODE 26500 (40000), 6000 (25368) - lauten sollte. Wir von Profisoft hoffen, daß Sie - im Sinne von M-Coder - den Gebrauch dieses Programms schnell beherrschen werden und wünschen Ihnen viel Erfolg.