PROJEKT

64'er

DAS MAGAZIN FÜR COMPUTER-FANS ONLINE


HYPRA-ASS — Ein Assembler der Spitzenklasse

64'er Ausgabe 7/Juli 1985, Seite 66 bis 69

Machen Sie es wie die Profis. Schreiben Sie Programme in Maschinensprache. Dieser leistungsstarke Makro-Assembler macht es möglich.

HYPRA-ASS ist ein rein in Maschinensprache geschriebener Drei-Pass-Makroassembler mit integriertem Editor für den C 64 mit Floppy 1541. Er wird mit LOAD "HYPRA-ASS",8 geladen und durch RUN gestartet. nach dem Start meldet sich HYPRA-ASS mit »break in 0« und »ready«. Alle Basic-Befehle sind nach dem Start noch zu verwenden, bis auf die Befehle LET und FOR, die Variablen anlegen. Der Befehl RUN dient jetzt zum Starten der Assemblierung.

Der Quelltext
Der Quelltext wird vom HYPRA-ASS-Editor in Basic-Programmzeilen abgelegt. Soweit wie möglich werden unnötige Blanks dabei eliminiert. Für die einzelnen Quelltextzeilen gelten die folgenden Vereinbarungen:

  1. Bei der Eingabe einer Zeile wird hinter der Zeilennummer ein Minuszeichen eingegeben.
  2. Jede Zeile enthält höchstens einen Assemblerbefehl.
  3. Vor einem Assemblerbefehl darf in derselben Zeile höchstens ein Label stehen.
  4. Label beginnen direkt hinter dem Minuszeichen.
  5. Vor jedem Assemblerbefehl steht mindestens ein Blank.
  6. Label und Assemblerbefehl werden durch mindestens ein Blank voneinander getrennt.
  7. Ein Label darf nicht allein in einer Zeile stehen.
  8. Kommentar wird durch ein Semikolon vom Rest der Zeile getrennt.
  9. Reine Kommentarzeilen müssen als erstes Zeichen hinter dem Minuszeichen ein Semikolon haben.
  10. Pseudo-Ops (.ba, .eq…) können direkt hinter dem Minuszeichen beginnen.

Beispiele:

100  
-.ba $C000
110  
-initialisierung
120  
-; reine Kommentarzeile
130  
-    lda $14; Kommentar hinter einem Befehl
140  
-marke   ldx $15; mit Label davor

Zur bequemeren Eingabe und Bearbeitung des Quelltextes stellt HYPRA-ASS im Editor ingesamt 25 Befehle zur Verfügung (Bild 1).

Rechnungen im Quelltext
HYPRA-ASS erlaubt die vier Grundrechenarten plus Potenzierung, die logischen Operationen NOT, AND und OR, die Vergleiche »gleich«, »kleiner« und »größer«, sowie den Einsatz der Funktionen <(…) und >(…), die das Low- beziehungsweise Highbyte eines Arguments liefern. Die logischen Operatoren und die Vergleiche werden wie folgt abgekürzt:
!n! = not   !a! = and   !o! = or   !=! = gleich
!<! = kleiner als   !>! = größer als

Das Ergebnis eines Vergleiches ist -1, falls wahr, 0, falls nicht wahr: (1!=!2)=0  (1!=!1)=-1

Auch die NOT-Verknüpfung arbeitet wie in Basic: !n!1 = -2. Das Argument in den Low-/Highbyte-Funktionen muß im Bereich 0 ≤ Argument ≤ 65535 liegen.

Außer Dezimalzahlen sind Hex-Zahlen erlaubt, die durch ein vorangestelltes Dollarzeichen kenntlich gemacht werden:
$C000 = 49152   $10 = 16   $a = 10…

Die Hexzahlen können auch in den Basic-Befehlen verwendet werden

HYPRA-ASS-Variable (Label)
Der Wert einer HYPRA-ASS-Variablen kann zwischen 0 und $FFFF liegen. Variablennamen können beliebig lang sein, wobei das erste Zeichen des Variablennamens ein Buchstabe sein muß. Weitere Zeichen können Buchstaben, Ziffern oder das Hochkomma sein. Alle Zeichen des Namens sind signifikant.

/a 100,10 Automatische Zeilennumerierung. Hier mit der Startnummer 100 und der Schrittweite 10.
Die automatische Zeilennumerierung wird ausgeschaltet, indem man direkt hinter dem ausgegebenen Minuszeichen RETURN eingibt.
/o Re-New eines Quelltextes, der mit NEW gelöscht wurde, falls der Text nicht anderweitig zerstört wurde.
/d
/d 100
/d-100
/d 100-
/d 100 bis 200
Löschen von Zeilen und Zeilenbereichen. Auch für das Löschen einzelner Zeilen sollte man den /d-Befehl verwenden, da man das Minuszeichen hinter der Zeilennummer doch immer wieder vergißt.
/e
/e 100
/e-100
/e 100-
/e 100 bis 200
Formatiertes Listen von Zeilen und Zeilenbereichen. Label, Assembler-Befehle werden gemäß den Tabulatoren übersichtlich untereinander geschrieben.
/t0,13
/t1,24
/t2,0
/t3,10
setzt die Tabulatoren T0, T1, T2, T3
T0 = Tabulator für Assemblerbefehle
T1 = Tabulator für den Kommentar bei der formatierten Ausgabe
T2 = Tabulator für die Anzahl der Blanks, die am Anfang einer Ausgabezeile ausgegeben werden
T3 = Tabulator für die Symboltabelle
/x Verlassen des Assemblers. Beim Verlassen des Programms wird ein Reset durchgeführt.
/p 1,100,200 Setzen eines Arbeitsbereichs (Page). Hier Bereich 1 von Zeile 100 bis 200, beide einschließlich. Bis zu 30 solcher Arbeitsbereiche sind erlaubt. Die Parameter der Arbeitsbereiche werden im Kassettenpuffer abgelegt.
/ziffer(n) Formatiertes Listen der Page.
/n 1,100,10 Neu-Durchnumerieren einer Page mit Startnummer und Schrittweite
/f 1,"string" Suchen einer Zeichenkette in einer Page. Dabei sind im String Fragezeichen als Joker erlaubt. Das Fragezeichen ersetzt ein beliebiges Zeichen. Zu beachten ist jedoch, daß im Quelltext unnötige Blanks entfernt wurden, wie ein Vergleich mit den Befehlen /e und LIST zeigt.
/r 1,"string1","string2" Ersetzen von Zeichenketten. String 2 darf nicht leer sein. Überall in der Page wird die Zeichenkette aus String 2 durch die aus String 1 ersetzt. Auch beim Ersetzen ist in String 2 das Fragezeichen als Joker erlaubt. Da String 1 leer sein darf, können mit diesem Befehl auch Zeichenketten gelöscht werden.
/u 9000 Setzen des Quelltextstarts (Programmstarts). Normalerweise ist als Startwert die Adresse 7000 eingestellt. Durch Hochlegen des Starts kann man zum Beispiel einen Monitor in dem nun freien Bereich unterbringen.
/b Anzeige der aktuellen Speicherkonfiguration. Es wird angezeigt:
a) der normale Quelltextstart 7000 als Merkhilfe
b) der aktuelle Quelltextstart
c) das Quelltextende
d) die Anzahl der noch verbleibenden Bytes für den Quelltext
/l"name"
/s"name"
/v"name"
/m"name"
Kurzform der Befehle LOAD, SAVE, VERIFY und MERGE
/g 8 Die zugehörige Gerätenummer kann mit diesem Befehl eingestellt werden. Voreingestellt ist das Gert 8.
Zur Unterstützung des Umgangs mit dem Floppy-Laufwerk 1541 sind drei Befehle implementiert:
/i - Lesen des Inhaltsverzeichnis von Floppy ohne Verlust des geschriebenen Quelltextes
/k - Lesen des Fehlerkanals
/e - Übermittung von Befehlen an die Floppy
Diese drei Befehle entsprechen denen des DOS 5.1
Auch zur Farbgebung des Bildschirms sind zwei Befehle vorhanden, die die Hintergrund- und Rahmenfarbe setzen.
/ch 0 - Setzen der Hintergrundfarbe
/cr 0 - Setzen der Rahmenfarbe
Nach erfolgter Assemblierung kann nun die erzeugte Symboltabelle mit zwei Befehlen ausgegeben werden:
/! - Ausgabe in unsortierter Form
/!! - Ausgabe sortiert
Es werden nur Label ausgegeben, die entweder global oder von der Ordnung Null sind.
Beide Dumps können mit der CTRL-Taste verlangsamt und mit der STOP-Taste angehalten werden.
Mit OPEN…, CMD… können die Dumps an andere Geräte gesendet werden.
Als Ergänzung zum Basic-Befehl PRINT, der aufgrund der Tokenbildung nicht alle Labelnamen verarbeiten kann, kann der Befehl ← verwendet werden.
Basic-Funktionen wie PEEK sind nur über den PRINT-Befehl erreichbar. Die Funktionen <(…) und >(…) sind außerhalb des Quelltextes nur durch ← zu verwenden. Mit dem ←-Befehl kann genau wie im Quelltext gerechnet werden.
Bild 1. Die Editorbefehle

Im Zusammenhang mit der Verwendung von Makros muß zwischen globalen und lokalen Variablen unterschieden werden. Jede Variable erhält beim Anlegen eine sogenannte Ordnungszahl, die tatsächlich angibt, im wievielten Makroaufruf das Anlegen stattfand. Befinde ich mich in gar keinem Makro, ist die Ordnungszahl entsprechend Null.

Variablen mit unterschiedlicher Ordnungszahl sind trotz gleichen Namens nicht gleich. Man kann also davon sprechen, daß Variablen gleicher Ordnungszahl lokal sind.

Die Konstruktion mittels Ordnungszahlen dient dazu, Fehler durch doppelte Benutzung von Labeln bei mehrmaligem Aufruf von Makros zu verhindern, indem Makros bei jedem Aufruf sozusagen einen komplett neuen Satz von Labeln erhalten.

Allerdings sind aus einem Makro »heraus gesehen« alle Variablen mit anderer Ordnungszahl als im Makro selbst »unsichtbar«. Um aber bequem Makros in Makros aufrufen und Label verwenden zu können, die in mehreren Makros benutzt werden sollen (etwa Betriebssystemroutinen), gibt es die globalen Variablen.

Globale Variablen sind, wie der Name schon verrät, im Gegensatz zu den lokalen Variablen unabhängig von der Ordnungszahl überall definiert.

Alle Makronamen sind per Definition global

Alle Variablen sind bei HYPRA-ASS redefinierbar gehalten, das heißt, alle Variablen können durch eine Wertzuweisung jederzeit verändert werden.

Eine doppelte Benutzung von Labeln vor Assemblerbefehlen wird jedoch durch einen »Label twice«-Error (Bild 2) geahndet, da dies zu einem falschen Ergebnis der Assemblierung führen würde.

Die Makros von HYPRA-ASS
Makros sind meist kürzere Befehlsfolgen, die im Quelltext häufiger vorkommen und deshalb unter einem Makro zusammengefaßt werden. Zu jedem Makro gehört ein Makroname, mit dem es aufgerufen werden kann. An jedes HYPRA-ASS-Makro können beliebig viele Parameter übergeben werden, deren aktueller Wert dann bei der Assemblierung im Makro eingesetzt wird. Makros können bei HYPRA-ASS an beliebiger Stelle im Quelltext definiert werden. Alle Makronamen sind global, alle Parameter und makrointernen Label sind lokal. Das heißt, verschiedene Makros können durchaus Label bzw. Parameter gleichen Namens verwenden.

Ein Beispiel für ein einfaches Makro:
Es wird immer wieder die Befehlsfolge benötigt, Akkumulator und X-Register mit dem Inhalt zweier aufeinanderfolgender Speicherzellen zu laden. Ein Makro dazu könnte folgendermaßen aussehen:

100  
-.ma ldax (adresse)
110  
-        lda adresse
120  
-        ldx adresse+1
130  
-.rt

Der .ma-Pseudobefehl wird gefolgt von einem Variablennamen, dem Makronamen und einer Parameterlist in runden Klammern, falls Parameter vorhanden sind. Hier ist es ein Parameter, die Adresse der Speicherzelle, die in den Akku soll. Sind mehrere Parameter vorhanden, werden sie durch Kommata getrennt. In die Parameter setzt der Assembler bei jedem Aufruf den aktuellen Wert, der im Aufruf steht. Rufe ich also ldax (2) auf, so entsteht bei der Assemblierung des Makro die Folge lda 2, ldx3, entsprechend führt der Aufruf mit ldax (label) zu lda label, ldx label+1.

Die Parameterliste darf in der Definitionszeile eines Makros nur aus einer Folge von Variablennamen bestehen, während im Aufruf als aktuelle Parameter beliebige Ausdrücke erlaubt sind. Hinter der Definitionszeile mit dem .ma-Pseudo folgt dann der eigentliche Makroinhalt, das heißt das, was bei einem Aufruf des Makros assembliert werden soll.
Natürlich sind hier nicht nur einfache Befehle wie im Beispiel gestattet. Genausogut können im Makro Verzweigungen und Sprünge ausgeführt werden, es kann bedingt assembliert werden, und weitere Makros können aufgerufen werden. Für die Schachtelung von Makros besteht keine Grenze außer der Fassungskapazität des Prozessorstacks.

Als Beispiel — wird ein Makro mit zehn internen Labeln 100 mal aufgerufen, ergibt sich schon für die dadurch erzeugten lokalen Label ein Platzbedarf von genau 7 000 Byte. Sollte irgendwann der Fall eintreten, daß Label und Quelltext zusammen nicht mehr ins RAM passen, erhalten Sie den »too many labels« (Bild 2). Dies ist allerdings mehr ein theoretischer Fall, denn auch bei der Assemblierung von HYPRA-ASS selbst wurden trotz extensiver Benutzung von Labels nicht einmal 500 gebraucht. Sie können aber davon ausgehen, daß Ihnen immer mindestens Platz für 1 170 Label zur Verfügung steht — in den allermeisten Fällen sogar erheblich mehr.

Selbstaufrufe von Makros sind auch nicht verboten. Inwieweit eine solche Konstruktion überhaupt sinnvoll sein kann, bleibt jedem selbst zu prüfen.

Zurück zur Makrodefinition: Jede Makrodefinition muß unbedingt mit dem Pseudobefehl .rt (return) abgeschlossen sein. Trifft der Assembler bei der Abarbeitung eines Makro auf .rt, so heißt das für ihn, die Assemblierung hinter dem Aufruf fortzusetzen. Vor der .ma und .rt-Anweisung dürfen in derselben Zeile keine Label stehen. Die Makrodefinition selbst wird in Pass 1 und Pass 2 überlesen. Es zählen also nur die Makroaufrufe bei der Assemblierung.

Der Aufruf eines Makro erfolgt durch den Pseudobefehl …, gefolgt vom Makronamen und der aktuellen Parameterliste in runden Klammern.

Wertzuweisung an Label
Zwei Pseudobefehle stehen zur Verfügung, um Label einen Wert zuzuweisen:

.eq   
— weist einem Label einen Wert zu, ohne die Ordnungszahl des Labels dabei zu verändern.
.gl   
— erklärt gleichzeitig das Label als global.

Beide Pseudos werden der eigentlichen Wertzuweisung vorangestellt, so wie LET in Basic:

100    
-.eq mark = $FFC0
110    
-.gl label = $200
Zusätzlich zu den Fehlermeldungen, die von Interpreterroutinen wie »illegal quantity« oder »syntax«, gibt HYPRA-ASS folgende Meldungen aus:
  1. can't number term — ein Ausdruck kann von HYPRA-ASS nicht berechnet werden. Möglicher Grund kann die falsche Abkürzung eines Operators sein.
  2. end of line expected — bei der Abarbeitung einer Zeile wurde statt des Zeilenendes etwas anderes gefunden.
  3. no mnemonic — ein Mnemonic kann nicht identifiziert werden.
  4. unknown pseudo — ein Pseudo-Op wurde falsch abgekürzt.
  5. illegal register — ein Assemblerbefehl existiert in der gewählten Adressierungsart nicht mit dem gewählten Register.
  6. wrong address — ein Assemblerbefehl existiert nicht in der gewählten Adressierungsart.
  7. illegal label — das erste Zeichen eines Labels war kein Buchstabe.
  8. unknown label — in Pass 2 wurde ein unbekannter Labelname entdeckt
  9. branch too far — eine Verzweigung führt über eine zu große Distanz.
  10. label declared twice — ein Labelname wurde zweimal benutzt
  11. too many labels — Label und Quelltext passen zusammen nicht mehr in den Speicher
  12. no macro to close — die Anzahl der .ma-Anweisungen stimmt nicht mit der Anzahl der .rt-Anweisungen überein.
  13. parameter — im Makroaufruf stimmt die Parameterliste nicht mit der Parameterliste der Definition überein
  14. return — es liegt keine Rückkehradresse auf dem Stack, als eine .rt-Anweisung ausgeführt werden sollte.

Hinzuweisen ist noch auf eine einfache Möglichkeit, den »label twice-error« zu vermeiden:
legt man eine Makrodefinition um einen beliebigen Block des Quelltextes, so sind alle Label in dem Block automatisch lokal. Auf diese Weise kann schon vorhandener Quelltext in neuen eingefügt werden, ohne daß man sich um doppelt verwendete Labelnamen kümmern muß.

Bild 2. Fehlermeldungen von HYPRA-ASS

Bei der Wertzuweisung an Label ist immer der Bereich einzuhalten, in dem ein Labelwert liegen darf (0 bis $FFFF).

Einfügen von Tabellen und Text
Drei Pseudo-Ops erleichtern das Einfügen von Tabellen und Text in den Quelltext. Dies sind:

.by    
— erlaubt das Einfügen von Bytewerten (Werten zwischen 0
und $FF). Einzelne Bytewerte werden durch Kommata vonein-
ander getrennt. Auch Strings der Länge 1 sind als Bytewerte 
erlaubt. Beispiel:
100 -.by 0, "a", 123, "x", $fa
.wo   
— erlaubt das Einfügen von Adressen (Werten zwischen 0
und $FFFF). Mehrere Adressen werden durch Kommata von-
einander getrennt. Die Adressen werden in der Folge 
Low/Highbyte in den Objektcode aufgenommen Beispiel:
100 -.wo marke-1, label*2-1
.tx   
— erlaubt das Einfügen von Text in den Quelltext. Die einzel-
nen Zeichen des Textes werden als ASCII-Code im Objektco-
de aufgenommen. Beispiel:
100 -.tx "beispieltext"

Überall im Quelltext, wo Bytewerte erwartet werden, etwa bei der unmittelbaren Adressierung, können Strings der Länge 1 verwendet werden. Ein Befehl lda #"a" ist also erlaubt.

Die bedingte Assemblierung
Zur Unterstützung der bedingten Assemblierung bietet HYPRA-ASS ein IF/ELSE/ENDIF-Konstrukt und eine IF/THEN-Konstrukt. Außerdem steht ein unbedingter Sprungbefehl zur Verfügung

.on    
— entspricht dem IF/THEN von Basic. Hinter .on folgt ein Aus-
druck, ein Komma und ein zweiter Ausdruck. Ist der erste
Ausdruck wahr, wird zu der Zeilennummer gesprungen, die
der zweite Ausdruck angibt. Beispiel:
100 -.on switch !=! 7, 400
Es wird die Assemblierung in Zeile 400 fortgesetzt, wenn
switch gleich 7 ist.
.go    
— ergibt einen unbedingten Sprung zu der Zeile, die der Aus-
druck hinter .go angibt. Beispiel:
100 -.go 1000
.if    
— wird gefolgt von einem Ausdruck. Ist der Ausdruck wahr,
wird die Assemblierung hinter der .if-Zeile fortgesetzt, bis
.el    
— gefunden wird. Daraufhin wird
.ei    
— gesucht und dahinter die Assemblierung fortgesetzt.

Entsprechend erfolgt die Assemblierung von .el bis .ei, falls der Ausdruck hinter .if falsch ist. .el kann auch fehlen, es wird dann direkt hinter .ei fortgefahren.

Auf eine Schachtelung von IF-Konstrukten wurde wegen des Zwecks der bedingten Assemblierung verzichtet. Beispiel:

100    
-.if switch !=! 6
110    
-              lda # 0
120    
-.el
130    
-              lda # 2
140    
-.ei

Wenn switch gleich 6 ist, erhält man lda # 0, sonst wird lda # 2 erzeugt. Vor den Pseudos .if, .el und .ei dürfen keine Label in derselben Zeile stehen.

Verkettung von Quelltexten
Mit dem Pseudo .ap (append) kann ein weiterer Quelltext am Ende des Pass 2 automatisch nachgeladen werden, wobei der Programmzähler aus der vorangegangenen Assemblierung erhalten bleibt.

Hinter .ap muß der Name des nachzuladenden Files in Anführungszeichen stehen.

Eine Besonderheit von HYPRA-ASS bildet im Zusammenhang mit verketteten Quelltexten der Pseudo-Opcode .co (common).

Dieser Befehl bewirkt zunächst, daß alle Variablen/Label, die hinter der .co-Anweisung in einer Liste stehen an den nachgeladenen Teil übergeben werden.

Zweitens bleiben alle Quelltextzeilen bis zur common-Zeile beim Nachladen erhalten. Steht also etwa ein Makro vor der common-Zeile, wird auch das Makro übergeben. Zu beachten ist dabei:

  1. Es sollten keine Makroaufrufe im common-Bereich stehen, es sei denn innerhalb eines Makro
  2. Die .ba-Anweisung, die die Startadresse des Objektcodes bestimmt, sollte außerhalb des common-Bereiches liegen, damit nach dem Nachladen nicht wieder mit der gleichen Startadresse assembiliert wird.
  3. Wertzuweisungen an Label sollten ebenfalls außerhalb des common-Bereiches liegen, um Platz für den nachgeladenen Quelltext zu gewinnen.

Direktes Senden des Objektcodes zur Floppy
Der Pseudobefehl .ob (object), gefolgt vom Filenamen ,p,w in Anführungszeichen, sendet den erzeugten Objektcode direkt zur Floppy.

Geschlossen wird das so erzeugte Objektfile durch den Pseudobefehl .en.

Sollte während der Assemblierung ein Fehler entdeckt werden und das Objektfile nicht schon durch die HYPRA-ASS-Fehlerroutine geschlossen worden sein, geben Sie bitte CLOSE 14 ein.

Ausgabe von formatierten Listings

1) .li 1,3,0    
sendet ein formatiertes Listing des Quelltextes unter
der logischen Filenummer 1 an das Gerät 3 mit der
Sekundäradresse 0 (Bildschirm). Die Parameter hin-
ter .li entsprechen denen des OPEN-Befehls. So ist
es auch möglich, mit li 2,8,2 "test,u,w" das Listing
auf eine Userdatei zu leiten und so weiter.
  

Der .li-Pseudobefehl muß der erste Befehl im Quelltext sein, wenn alle Zeilen gelistet werden sollen. Die Zeilen bis einschließlich .li werden nicht ausgegeben. Die gelisteten Zeilen haben folgendes Format:
c000 a0b0c0: 1000 -marke befehl ;kommentar

Die Steuerung der Formatierung erfolgt mit dem Editorbefehl /t. Bei Zeilen, die Pseudobefehle enthalten, wie .eq… werden keine Adressen und Opcodes ausgegeben.

2) .sy 1,3,0    
sendet am Ende von Pass 2 die sortierte Symbolta-
belle. Die Formatierung wird hier durch /t3,… gesteu-
ert. Die Labelwerte werden hexadezimal ausgegeben.

Eine Zeile der Symboltabelle sieht dann folgendermaßen aus:
sprungziel = $ffd2

Das Listing des Quelltextes erhält die Kopfzeile »HYPRA-ASS Assemblerlisting:«. Die Symboltabelle erhält die Kopfzeile »Symbols in alphabetical order«.

3) .dp t0,t1,t2,t3    
setzt aus dem Quelltext heraus die Tabulatoren
t0 = Tabulator für Assemblerbefehle
t1 = Tabulator für den Kommentar bei der formatierten Ausgabe
t2 = Tabulator für die Anzahl der Blanks, die am An-
fang einer Ausgabezeile ausgegeben werden.
t3 = Tabulator für die Symboltabelle
4) .st            
beendet die Assemblierung

Am Ende des zweiten Passes wird immer die Meldung »end of assembly« gefolgt von der Assemblierungsdauer in Minuten, Sekunden und Zehntelsekunden ausgegeben. Dahinter folgt die Zeile »base = $XXXX last byte at $YYYY«.

Eine Zusammenfassung aller Pseudobefehle finden Sie in Bild 3.

1) .ba $COOO gibt die Startadresse der Assemblierung an. Bei anderen Assemblern heißt dieser Befehl auch org oder *=.
2) .eq label=wert weist einem Label einen Wert zu
3) .gl label=wert weist einem globalen Label einen Wert zu
4) .by 1,2,"a" Einfügen von Byte-Werten in den Quelltext
5) .wo 1234,label Einfügen von Adressen in der Folge low/high
6) .tx "text" Einfügen von Text als ASCII-Werte
7) .ap "file" Verketten von Quelltexten
8) .ob "file,p,w" Senden des Objektcodes zur Floppy
9) .en Schließen des Objektfiles
10) .on ausdruck,sprung bedingter Sprung, wenn Ausdruck wahr
11) .go sprung unbedingter Sprung
12) .if ausdruck Fortführung der Assemblierung bei ELSE, falls Ausdruck falsch. Ansonsten hinter .if bis zu ELSE oder ENDIF.
13) .el Alternative zu den Zeilen, die hinter .if stehen
14) .ei Ende der IF-Konstruktion
15) .co var1,var2 Übergabe von Labeln und Quelltext an nachgeladene Teile
16) .ma makro (par1,par2) Makrodefinitionszeile
17) .rt Ende der Makrodefinition
18) …makro(par1,par2) Makroaufruf
19) .li lfn, dn, ba sendet formatiertes Listing unter der File-Nummer lfn zum Gerät dn mit der Sekundäradresse ba
20) .sy lfn, dn, ba sendet formatierte Symboltabelle unter der File-Nummer lfn zum Gerät dn mit der Sekundäradresse ba
21) .st beendet die Assemblierung
22) .dp t0, t1, t2, t3 setzt die Tabulatoren T0, T1, T2, T3 aus dem Quelltext heraus
Vor den Anweisungen 12, 13, 14, 16 und 17 dürfen in derselben Zeile keine Label stehen.

Bild 3. Zusammenfassung aller Pseudobefehle


HYPRA-ASS-Editor


Eines der Ziele bei der Entwicklung von HYPRA-ASS war es auch, die Editierung von Quelltexten möglichst bequem zu machen. Dazu wurden etliche Funktionen, die im normalen Basic-Editor stets gebraucht, aber nie vorhanden sind, in den HYPRA-ASS-Editor eingebaut.

Als Grundlage des HYPRA-ASS-Editors blieb dabei der Basic-Editor erhalten.

Ein HYPRA-ASS-Quelltext wird also im Prinzip genauso eingegeben werden wie ein Basic-Programm. Allerdings muß hinter der Zeilennummer immer ein Minuszeichen eingegeben werden, das den Beginn der Quelltextzeile bildet. So eingegebene Quelltextzeilen werden als ASCII-Zeilen in den Speicher übernommen. Alle überflüssigen Blanks werden entfernt.

Jede eingegebene Zeile wird sofort nach der Übernahme formatiert ausgegeben, um die Übersichtlichkeit des Quelltextes zu gewährleisten. Eine Tabelle aller Editorbefehle finden Sie in Bild 1.

(Gerd Möllmann/ah)

© Originalartikel: WEKA Verlagsgesellschaft, 64'er
© HTML-Veröffentlichung: Projekt 64'er online
Erfassung des Artikels: Jörg Bleimann



8-Bit-Nirvana | Impressum