APPLICATIONSPROGRAMMATION ★ LABEL-BASIC (CPC AMSTRAD INTERNATIONAL)|CPC Amstrad International) ★

Label-Basic (CPC Amstrad International)Applications Programmation
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Ein berühmter Quizmaster könnte Ihnen folgende Frage stellen: »Was fällt Ihnen alles ein, wenn Sie an das Wort Programmbibliothek denken? Sie haben 15 Sekunden Zeit — Dalli Dalli!«

Die Uhr läuft — fangen wir also an:

Strukturierte Programme — Programmierung von Modulen - beliebiges und müheloses »Linken« der Programmteile — und? Und?!

Das Zauberwort, das jeder CPC-Besitzer bisher beschämt verschweigen mußte (und das den Aufbau einer Programmbibliothek erst wirklich sinnvoll macht), heißt »Symbolische Adressierung in BASIC«.

Bisher konnte diese Programmierungstechnik, die neben einer höheren Übersichtlichkeit der Programme auch deren — von Zeilennummern unabhängige — Abarbeitung ermöglicht, auf dem CPC nicht realisiert werden — versuchen Sie doch einmal »GOSUB Daten.lesen«...

(Zu Deutsch: Wer Sprungmarken sät, wird »Syntax error« ernten.)

Bisher war das Zusammenfügen der Programmteile eine ebenso mühsame wie zeitraubende Angelegenheit; so mancher BASIC-Programmierer wird nach durchtippter Nacht (wie passe ich bloß die Zeilennummern an??) auf dem Zahnfleisch zur Arbeit gegangen sein...

Bisher?! Bisher!!

Denn nun gehört dieses Ärgernis — zumindest für alle 464-Besitzer - der Vergangenheit an. Keine Angst, dies ist kein neuer BASIC-Interpreter, keine RSX-Erweiterung und schon gar nicht ein speicherplatzmordendes Monstrum, sondern klein, aber oho! Auch der Befürchtung, daß bei der Anwendung des hier vorgestellten Programms alle anderen Programme unter großen Mühen angepaßt werden müßten, sei hier mit aller Deutlichkeit widersprochen. Alles, was Sie benötigen, ist der Basiclader und ein bißchen Zeit zum Abtippen... es lohnt sich!

Der Basiclader

Was von diesem Programm nach der Installierung übrig bleibt, sind einzig und allein ganze 186 Bytes Maschinencode, die Sie fast überall im freien RAM unterbringen können — der BL macht das für Sie. Er nimmt auch die Anpassung der Sprungadressen und die Verlegung der alten Patches in die MC-Routine vor, was das Nebeneinander von z.B. X-BASIC und LABEL-BASIC gewährleistet.

Sie sollten jedoch folgendes beachten: SAVEn Sie den Basiclader, bevor Sie ihn starten, da er sich anschließend selbst löscht. Dies ist notwendig, da die MC-Routine bei einem versehentlichen zweiten Start ihre eigene Aufrufadresse als Rücksprungadresse rettet und der CPC so in eine Endlos-Schleife hineingerät, in der nur noch der berühmte »Dreifingergriff« einen Ausweg bietet...

Die Frage »Soll MEMORY gesetzt werden?« darf nur dann mit »n« beantwortet werden, wenn der Maschinencode in einen bereits geschützten Speicherbereich geladen wird (also oberhalb HIMEM oder in den Soundpuffer oder...). Andernfalls wird das Programm durch den NEW-Befehl auf Nimmerwiedersehen beseitigt! Durch den UNT-Befehl ist der BASIC-Lader in der Lage, sowohl dezimale als auch hexadezimale Adressen zu verarbeiten.

Zwei Fallen für den Syntax error!

Dies ähnelt auf jeden Fall der in der Serie »Der gläserne CPC« (Heft 5/86 und 6/86) vorgestellten Programmierungstechnik von X-BASIC. Der wohl wichtigste Unterschied zu X-BASIC ist der, daß hier keine neuen Befehls-Token verwendet werden, sondern solche, die der CPC ohnehin schon verwendet, nämlich die Funktions-Token. Diese lösen, wenn sie ohne vorangehenden Befehl angetroffen werden, ebenfalls einen »Syntax error« aus, der dann entsprechend bearbeitet werden kann. (&AC07, Patch für Befehl ausführen). Über diesen User-Vektor werden die Befehle »USING TO« und »TO < Label > realisiert, die die Vorarbeit für die eigentlichen Sprungbefehle, nämlich die Initialisierung der Sprungmarken leisten. Der Vorteil der »schon vorhandenen« Befehle liegt klar auf der Hand: der BASIC-Interpreter muß gar nicht erst korrigiert werden, um die »neuen« Befehle LISTen zu können!

Die zweite Falle wird dem »Syntax error« dann bei der Ausführung der »stinknormalen« BASIC-Sprungbefehle gestellt, wenn statt der erwarteten Zeilennummer oder -adresse eine Variable, d.h. ein Label angetroffen wird. (&AC04, Patch für Error-Einsprung). Dieser Vektor macht es uns auf relativ einfache Weise möglich, die Sprungbefehle so zu verbiegen, daß sie künftig auch Labels akzeptieren!

Hierzu ist (da der CPC nur über Umwege verrät, welchen Befehl er gerade ausführen wollte) eine Schleife notwendig, die feststellt, in welcher seiner Routinen ein CALL erfolgte, der mit einem Error quittiert werden mußte (!). Hier hilft dann nur noch hartnäckiges Blättern und Vergleichen im ROM-Listing weiter, um die Rücksprungadressen der richtigen Routinen ausfindig zu machen...

Dabei stellt man schncll fest, daß es zwar 10 Sprungbefehle gibt, die Anzahl der Rücksprungadressen aber durch die Mehrfachbenutzung einiger Unterprogramme bereits auf 7 zusammenschmilzt (es hätten ruhig noch weniger sein können). Diese 7 CALLs verteilen sich nun auf ganze zwei Arbeitsprogramme, in denen der Fehler auftreten kann: &CEE1 - &CEF8: Zeilennummer nach > DE< holen &E767 - &E799: Zeilenadresse holen Die Aufgabenstellung der Routinen bringt es mit sich, daß auch bei der Bearbeitung der Sprungmarken Unterschiede gemacht werden müssen. Dies ist aber wesentlich einfacher und tausendmal sinnvoller, als das Rad völlig neu zu erfinden! Auf diese Weise ist es lediglich nötig, sich einige Gedanken über die Programmierung der Labels zu machen.

Grundsätzliches zu den Labels

Das Wichtigste gleich zum Anfang: Labels sind zwar vom Typ her den Variablen zuzuordnen; sie müssen jedoch immer wie Konstanten behandelt werden. Das heißt im Klartext: Versuchen Sie nie, den Wert eines Labels zu verändern, da dies wegen der besonderen Bearbeitung durch LABEL-BASIC zum Absturz Ihres Programms führen kann!

Der Grund hierfür liegt einfach darin, daß in den Labels nicht etwa eine Zeilennummer, sondern die tatsächliche Adresse der BASIC-Zeile gespeichert wird. Bei der Ausführung der Sprungbefehle wird dieser Wert dann um 1 erniedrigt, damit der BASIC-Interpreter an der richtigen Stelle w'eiterlesen kann. Die Speicherung der Zeilenadressen hat eine Erhöhung der Arbeitsgeschwindigkeit zur Folge, da das zeitraubende Suchen nach der entsprechenden Zeilennummer entfällt.

Symbolische Adressierung oder: Wie programmiert man Labels?

Nichts einfacher als das! Sie können ihre Programme ganz normal in BASIC mit Zeilennummern erstellen; letztere werden auch weiterhin akzeptiert. Dadurch ergibt sich schon von selbst, daß Sie Sprünge über kurze Distanzen, also innerhalb
der Programmteile, wie zuvor mit Zeilennummern programmieren können. Alle wichtigen Einsprungstellen kennzeichnen Sie außerdem mit einem Label, das, wie alle Variablen, bis zu 40 Zeichen lang sein darf. Es ist jedoch sinnvoll, sich auf kurze Labelnamen zu beschränken, da diese schneller bearbeitet werden.

Beachten Sie bitte die folgenden Erläuterungen zu den LABEL-BASIC-Befehlen und den erweiterten BASIC-Sprungbefehlen:

USING TO
KOMMANDO:

Führt die Wertzuweisung an die Labels durch.

Dieser Befehl sollte immer am Anfang des Hauptprogramms bzw. der Initialisierung gegeben werden; er muß jedoch nach Typvereinbarungen (DEFINT, DEFREAL, DEFSTR) erfolgen, weil die davon betroffenen Labels auf Null gesetzt werden. Dies gilt auch für »ERASE« und »CLEAR«!

Und so wirkt »USING TO«:

Das gesamte Programm wird nach Labels durchsucht, die direkt nach der Zeilennummer mit »TO« vereinbart werden müssen. Durch einen kleinen Programmiertrick wird ein auftretender Fehler in genau der Zeile angezeigt, in der er verursacht wurde. Labels, die nicht am Anfang der Zeile vereinbart werden, gelten als »unbekannt« und führen bei einem Sprungbefehl zum Abbruch mit »Line does not exist in ...«
TO < Label >
FUNKTION:
Dient der Wertzuweisung durch »USING TO«. Die Vereinbarung muß als erste Anweisung in einer Programmzeile stehen! »TO« prüft während des Programmablaufs die Gültigkeit des zugewiesenen Labels und verzweigt, wenn erforderlich, zur Wertzuweisung.

Wichtig:
Labels müssen immer als Zahl variablen angegeben werden; Strings sind als Sprungmarken unzulässig! Die Geschwindigkeit der Abarbeitung kann erhöht werden, indem alle Labels als Integer-Variablen vereinbart werden. Ein Tip hierzu: Kennzeichnen Sie alle Labels mit einem gemeinsamen Anfangsbuchstaben.

Die »verlabelten« Sprungbefehle:

GOTO
GOSUB
ON x GOTO
ON x GOSUB
ON ERROR GOTO
ON BREAK GOSUB
RESUME
ON SQ .. GOSUB
AFTER .. GOSUB
EVERY .. GOSUB

Schreibweise (Syntax):
< Sprungbefehl > < Zeilennummer >
z.B. GOTO 1210

oder:

< Sprungbefehl > < Label >
z.B. GOSUB Ausdruck

Hinweise:
1) ON x GOTO bzw. ON x GOSUB kann Zeilennummern und Labels gemischt verarbeiten, also z.B. ON x GOSUB 1900,Laden,2120
2) Die Programmierung von z.B. »IF ... THEN 130 ELSE 250« ist bei der Verwendung von Labels nur in ausgeschriebener Form »IF ... THEN GOTO < Label > ELSE GOTO < Label > « möglich.

Achtung!!
Falls Sie Ihr Programm nach einem Probelauf ergänzt oder verändert haben, sollten Sie auf keinen Fall mit einem »GOTO« wieder einsteigen, da dann die Labels falsche Werte enthalten und so ein Absturz vorprogrammiert ist. LABEL-BASIC kontrolliert zwar auch bei jedem Sprungbefehl das verwendete Label; m.E. ist dieser Test jedoch nur in ca. 95 % aller Fälle ausreichend, so daß die Fehlermeldung »Line does not exist in ...« durchaus ausbleiben kann!

Achtung!!
Falls Sie Ihr Programm nach einem Probelauf ergänzt oder verändert haben, sollten Sie auf keinen Fall mit einem »GOTO« wieder einsteigen, da dann die Labels falsche Werte enthalten und so ein Absturz vorprogrammiert ist. LABEL-BASIC kontrolliert zwar auch bei jedem Sprungbefehl das verwendete Label; m.E. ist dieser Test jedoch nur in ca. 95 % aller Fälle ausreichend, so daß die Fehlermeldung »Line does not exist in...« durchaus ausbleiben kann!

Das Zusammen-Linken von Programmteilen...

ist mit LABEL-BASIC nur noch wenig arbeitsintensiv. Alles, was Sie hierbei beachten sollten, ist, daß alle Ihre Programm-Module mit sehr hohen Zeilennummem (ab 60000) und voneinander verschiedenen Labels ausgerüstet sind. Natürlich müssen Sie sich eine Liste der Unterprogramme gemacht haben, die Sie zusammen»linken« wollen. Ein Tip zur einfacheren Handhabung:

Programmname = Labelname!

Und so gehen Sie vor:

Wenn alle Unterprogramme symbolisch adressiert sind und Sprünge mit Zeilennummern nur noch innerhalb der Programmteile Vorkommen, können Sie diese mit der Befehlsfolge

MERGE < programmname >
RENUM
MERGE < programmname >
RENUM usw.

ohne weitere Eingaben beliebig(!) aneinanderreihen. Das so entstandene Programm SAVEn Sie erst einmal ab. Jetzt müssen Sie nur noch den Basiclader so verändern, daß er als Vorprogramm zu Ihrem neuen Programm läuft. Achten Sie darauf, daß die Anweisung »MEMORY« ausgefiihrt wird, und geben Sie dann in Zeile 430 den Befehl »RUN < programmname > «. Alles weitere wird dann von LABEL-BASIC erledigt...

Matthias Irwachiw/TM, CPCAI

★ PUBLISHER: CPC Amstrad International
★ YEARE: 1986 , 1987
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: CPC AMSTRAD INTERNATIONAL 1988
★ AUTHOR: Matthias Iwachiw
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Label-Basic    (CPC  Amstrad  International)    GERMANDATE: 2021-08-12
DL: 238
TYPE: ZIP
SiZE: 4Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Label-Basic (CPC Magazin)
» Applications » Call 0 (Schneider Aktiv Special)
» Applications » RSX Binking (CPC Amstrad International)
» Applications » Z80-Assemblerpaket
» Applications » Comal-80 (CPC Amstrad International)
» Applications » Asso (CPC Magazin)
Je participe au site:
» Vous avez des infos personnel ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 434 millisecondes et consultée 701 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.