Hypra-Ass
Hypra-Ass | |
---|---|
Entwickler | Gerd Möllmann |
Verleger | Markt & Technik Verlag |
Release | 1985 |
Plattform(en) | C64, C128 |
Genre | Assembler |
Steuerung | |
Medien | |
Sprache(n) | |
Information | Listing des Monats in der 64'er 07/1985 |
Hypra-Ass ist ein Drei-Pass-Makro-Assembler für den Commodore 64 und die Floppy 1541. Er wurde in Maschinensprache von Gerd Möllmann geschrieben und im 64'er Magazin 07/1985 als Listing des Monats veröffentlicht.
Bedeutung[Bearbeiten | Quelltext bearbeiten]
Hypra-Ass ist ein in die Jahre gekommener Assembler, der heutzutage wohl kaum noch benutzt wird. Wenn er hier dennoch vorgestellt wird, so hat dies vor allem geschichtliche Gründe:
- Zu seiner Zeit gab es keine preisgünstige Alternative mit vergleichbarem Funktionsumfang, weshalb das Programm damals eine recht große Verbreitung fand. Selbst ein so umfangreiches Projekt wie GoDot wurde ursprünglich mit Hypra-Ass erstellt.
- Im 64'er Magazin wurden Quellcodes von Maschinenprogrammen oft im Format des Hypra-Ass abgedruckt.
Beschreibung[Bearbeiten | Quelltext bearbeiten]
Laden und Starten[Bearbeiten | Quelltext bearbeiten]
LOAD "HYPRA-ASS",8 RUN
lädt und startet den Assembler. Er meldet sich mit BREAK IN 0. Alle Funktionen sind nun einsatzbereit.
Assemblieren[Bearbeiten | Quelltext bearbeiten]
Das Assemblieren erfolgt durch Eingabe von RUN
.
Der Quelltext[Bearbeiten | Quelltext bearbeiten]
Das Eingeben, Ändern, Laden und Speichern von Quellprogrammen wird mit einer Erweiterung des BASIC-Editors erledigt.
Editor-Befehle[Bearbeiten | Quelltext bearbeiten]
/a 100,10 | Automatische Zeilennummerierung (Startzeile, Schrittweite) |
/o | OLD: Holt Quelltext zurück, der mit NEW gelöscht wurde oder wenn nach einem Reset mit SYS2168 Hypra-Ass neu gestartet wurde.
|
/d; /d 100 ; /d -100 ; /d 100- ; /d 100-200 | Löschen von Zeilen(bereichen). |
/e ; /e 100 ; /e -100 ; /e 100- ; /e 100-200 | Formatiertes Listing von Zeilen(bereichen) ausgeben. |
/t 0,13 ; /t 1,24 ; /t 2,0 ; /t 3,10 | Setzt Tabulatoren: T0 = Tabulator für Assemblerbefehle |
/x | Verlassen des Assemblers mit Reset. |
/p 1,100,200 | Setzen eines Arbeitsbereichs (Page). Maximal 30 sind sinnvoll verwendbar, auch wenn Werte bis 255 akzeptiert werden, so werden ab 30 die Bereichsangaben nicht mehr korrekt vorgehalten sie korrumpieren die bestehenden Bereiche oder gar den Bildschirmspeicher. Hier wird Bereich 1 von Zeile 100 bis 200 einschließlich definiert. |
/0 bis /29 | Formatiertes Listing der Page (0 bis 29) ausgeben. |
/n 1,100,10 | Neues Durchnummerieren einer Page mit Startnummer und Schrittweite. Achtung: Zeilennummern von den Pseudo-Ops .ON und .GO werden dabei nicht korrigiert! |
/f 1,"string" | Suchen einer Zeichenkette in einer Page (hier 1); "?" im String ist als Joker erlaubt. |
/r 1,"string1","string2" | Replace: In der Page (hier 1) wird die Zeichenkette aus String 2 durch die aus String 1 ersetzt. String 2 darf nicht leer sein. Das Fragezeichen als Joker ist erlaubt. |
/u 9000 | Setzen des Quelltextstarts; Standardwert ist 8152 ($1FD8). |
/b | Anzeige der aktuellen Speicher-Konfiguration. Vier Werte werden angezeigt: a) der normale Quelltextstart 8152 als Merkhilfe, |
/l"name" /s"name" /v"name" /m"name" |
Kurzform der Befehle LOAD, SAVE, VERIFY und MERGE. |
/g 9 | Stellt die Gerätenummer des Diskettenlaufwerks auf 9. Voreingestellt ist das Gerät 8. |
/i | Lesen des Inhaltsverzeichnisses. |
/k | Lesen des Fehlerkanals. |
/@ | Übermitteln von Floppybefehlen. |
/ch 0 | Setzen der Hintergrundfarbe. |
/cr 0 | Setzen der Rahmenfarbe. |
/! bzw. /!! | Ausgabe der Symboltabelle (nach erfolgter Assemblierung) in unsortierter bzw. sortierter Form. Lokale Label (innerhalb von Makros) werden nicht mit ausgegeben. |
← | Ergänzung zum BASIC-Befehl PRINT, der aufgrund der Token-Bildung nicht alle Labelnamen verarbeiten kann. |
Der Quelltext wird automatisch in BASIC-Programmzeilen abgelegt. Soweit wie möglich werden unnötige Leerzeichen dabei weggelassen.
Für die einzelnen Quelltextzeilen gelten folgende Regeln:
- Bei der Eingabe einer Zeile wird hinter der Zeilennummer ein Minuszeichen eingegeben.
- Jede Zeile enthält höchstens einen Assembler-Befehl.
- Vor einem Assembler-Befehl darf in derselben Zeile höchstens ein Label stehen.
- Label beginnen direkt hinter dem Minuszeichen.
- Vor jedem Assembler-Befehl steht mindestens ein Leerzeichen.
- Label und Assembler-Befehl werden mindestens durch ein Leerzeichen voneinander getrennt.
- Ein Label darf nicht allein in einer Zeile stehen.
- Kommentar wird durch ein Semikolon vom Rest der Zeile getrennt.
- Reine Kommentarzeilen müssen als erstes Zeichen hinter dem Minuszeichen ein Semikolon haben.
- Pseudo-Op-Codes (.ba, .eq usw.) können direkt hinter dem Minuszeichen beginnen.
Pseudo-Op-Codes[Bearbeiten | Quelltext bearbeiten]
.BA adresse | Definiert die Startadresse des Maschinenprogramms. |
.EQ label = wert | Weist einem Label einen Wert zu. |
.GL label = wert | Weist einem Label einen globalen Wert zu. |
.BY 1,2,“a“ | Einfügen von Byte-Werten in den Quelltext. |
.WO 1234,label | Einfügen von Adressen in den Quelltext. |
.TX "text“ | Einfügen von Textblöcken in den Quelltext. |
.AP "file“ | Append: Verketten von Quelltexten. |
.CO var1, var2 | Übergabe von Labeln (hinter .CO) und Quelltext (vor .CO). |
.OB "file,p,w“ | Senden des Objektcodes zur Floppy. |
.EN | Schließen der Objektdatei |
.ON ausdruck,zeilennummer | Bedingter Sprung, wenn Ausdruck wahr ist oder 0 ergibt. Das /N-Kommando korrigiert die Zeilennummer nicht. |
.GO zeile | Unbedingter Sprung - das /N-Kommando korrigiert die Zeilennummer nicht. |
.IF ausdruck | Bedingte Assemblierung wie nach IF. |
.EL | wie ELSE hinter .IF |
.EI | wie ENDIF hinter .IF |
.MA makro(par1,par2) | Makrodefinition: Makroname(Parameterliste) |
.RT | Ende der Makrodefinition |
...makro (par1,par2) | Makroaufruf |
.LI lfn,dn,ba | Senden eines formatierten Listings (Syntax wie bei OPEN). Mit .LI 1,3 am Programmanfang erfolgt beim Assemblieren die Listing-Ausgabe (inkl. dem erzeugten Code) unmittelbar am Bildschirm.
|
.SY lfn,dn,ba | Senden der formatierten Symboltabelle (Syntax wie bei OPEN). |
.DP t0,t1,t2,t3 | Setzt die Tabulatoren aus dem Quelltext heraus. |
Beispiel[Bearbeiten | Quelltext bearbeiten]
a) Formatierte Quelltextausgebe mit /e:
100 -.BA $C000 110 -; REINE KOMMENTARZEILE 120 - LDA $14 ; KOMMENTAR HINTER EINEM BEFEHL 130 -MARKE LDX $15 ; MIT LABEL DAVOR
b) Ausgabe mit LIST:
100 .BA $C000 110 ;REINE KOMMENTARZEILE 120 LDA$14; KOMMENTAR HINTER EINEM BEFEHL 130 MARKE LDX$15; MIT LABEL DAVOR
Variablen, Label, Makronamen und Makroparameter[Bearbeiten | Quelltext bearbeiten]
Der Wert einer Hypra-Ass-Variablen liegt immer zwischen 0 und 65535 ($FFFF). Variablennamen, Label, Makronamen und Makroparameter dürfen beliebig lang sein, wobei das erste Zeichen des Variablennamens ein Buchstabe sein muss. Weitere Zeichen können Buchstaben, Ziffern oder das Hochkomma (') sein.
Bedingte Assemblierung[Bearbeiten | Quelltext bearbeiten]
Mit den Pseudo-Op-Codes .IF, .EL und .EI bietet Hypra-Ass ein IF-THEN-ELSE-Konstrukt, wo die Auswertung eines Ausdrucks mit Hilfe von Operatoren die Assemblierung steuern kann, wobei hier völlig auf Zeilennummern verzichtet werden.
Mit .ON besteht die Möglichkeit, bedingt durch einen Ausdruck (wenn der Wert 0 ist oder die Bedingung "wahr" ist) die Assemblierung an einer anderen Zeile fortzusetzen. Bei .GO ist ein unbedingter (vergleiche GOTO) springt die Assemblierung zur angegebenen Zeile. Ungünstig dabei ist, dass der Quellcode hier von der Zeilennummerierung abhängig wird und eine Renummerierung (mittels /N) hier die Zeilennummern nicht korrigiert.
Beispiel:
100 -.if switch !=! 6 110 - lda #0 120 -.el 130 - lda #2 140 -.ei
Vor den Pseudo-Op-Codes .if, .el und .ei dürfen keine Label in derselben Zeile stehen.
Operatoren[Bearbeiten | Quelltext bearbeiten]
Die logischen Operatoren und Vergleiche werden wie folgt abgekürzt:
!n! = nicht (not) !a! = und (and) !o! = oder (or) !=! = gleich !<! = kleiner als !>! = größer als
Makros[Bearbeiten | Quelltext bearbeiten]
Um immer wiederkehrende Code-Sequenzen zu vermeiden, kann ein Makro definiert werden. Mit jedem Makroaufruf wird dann die dort festgelegte Code-Sequenz assembliert. Das vermindert die Sourcecode-Länge und verhindert generell die Gefahr Fehler beim Eintippen zu begehen.
Beispiel für ein einfaches Makro:
100 -.ma ldax (adresse) 110 - lda adresse 120 - ldx adresse+1 130 -.rt
Das Makro wird dann mit
200 - ...ldax (adresse)
aufgerufen.
Die Makroparameter dürfen nur numerisch sein und müssen wie generell bei Variablen im Bereich von 0 bis 65535 (16-Bit-Wert) liegen. Im Gegensatz zu gängigen Makrofunktiononen anderer Sprachen und Assembler, passiert hier keine ausschließlich textuelle Ersetzung. Somit sind hier auch keine Zeichenketten als Parameter möglich.
Makronamen und Makroparameter sind in ihrer Länge nicht eingeschränkt. Eine Limitierung ergibt sich im Grunde nur durch die erlaubte Zeilenlänge von 80 Zeichen.
Vor der .ma- und .rt-Anweisung dürfen in derselben Zeile kein Label stehen.
Die Makrodefinition selbst wird in Pass 1 und Pass 2 überlesen.
Hier existiert ein Bug in Hypra-Ass:
Wird ein Makro, dass ein Label enthält, mehrfach aufgerufen, so kommt es zu einer Fehlermeldung label declared twice.
Speicherbelegung[Bearbeiten | Quelltext bearbeiten]
$033E-$03FF | Zwischenspeicher für Arbeitsbereiche (Page) im Kassettenpuffer |
$0400-$7FF | Bildschirmspeicher |
$0801-$1FD7 | Hypra-Ass-Programmcode |
$1FD8-$A000 | Quellcode |
$A000-$C000 | Symboltabelle im RAM von $C000 abwärts |
$C000-$CFFF | frei z.B. für Maschinensprachemonitor oder Editor |
Fehlermeldungen[Bearbeiten | Quelltext bearbeiten]
Neben einigen von BASIC bekannten Fehlermeldungen, werden auch diverse neue Fehlermeldungen (erkennbar ohne "?" am Beginn) erzeugt.
- BRANCH TOO FAR ERROR: Das Sprungziel eines Branch-Befehls überschreitet die relative Distanz von -127 bis +128.
- ILLEGAL LABEL ERROR: Name eines Makros nicht gefunden.
- ?ILLEGAL QUANTITY ERROR: Ein Pseudo-Op-Code- oder Opcode-Parameter ist außerhalb des zulässigen Bereichs.
- NO MNEMONIC ERROR: Unbekannter Op-Code.
- PARAMETER ERROR: Ein Makroaufruf verwendet zu viele oder zu wenige Parameter.
- ?SYNTAX ERROR: Eine Befehls- oder Adressierungssyntax ist falsch.
- ?TYPE MISMATCH ERROR: Es ist bei einem Pseudo-Op-Code ein falscher Werttyp (numerisch statt zeichenkettenbasiert oder umgekehrt) angegeben.
- UNKNOWN LABEL ERROR: Name Labels oder einer Variable nicht gefunden.
- UNKNOWN PSEUDO ERROR: Unbekannter Pseudo-Op-Code.
- WRONG ADDRESS ERROR: Ein Opcode verwendet einen nicht erlaubten Adressierungsmodus.
Hypra-Ass Versionen[Bearbeiten | Quelltext bearbeiten]
- Die ursprüngliche Version aus der 64'er 1985/07 hatte noch einige Fehler.
- Ergänzungen (als Hypra-Ass Quellcode) enthielt die 64'er 1985/11; sie verbesserten den OLD-Befehl und das "Label BEQ Label"; eine Version "HYPRA-AS+" wurde erzeugt.
- Eine Erweiterung (als Hypra-Ass Quellcode) für Datasette von Edgar Bäumler gab es in der 64'er 1986/06.
- Im SH1985/08 und SH35 wurde eine korrigierte Version angeboten, die u.a. die Verbesserungen von 85/11 enthielt. Nach LIST ist eine zusätzliche Zeile "(Corrected Version)" zu sehen.
- Die Version von SH71 entspricht im Wesentlichen der von SH35, enthält aber einen zusätzlichen Patch für 4 Bytes.
- Im 64'er Magazin 1987/05 ist der Patch hypra-patch enthalten, der die Assemblierung in den Speicher unterdrückt, d. h. es kann nur auf Diskette assembliert werden. Dies verringert Speicherplatzprobleme mit großen Quelldateien und unter GEOS. Der Patch kann bei allen Versionen ausgeführt werden. Er erzeugt "HYPRA-ASS P".
- Die 64'er 1987/10 enthielt eine Erweiterung und Verbesserung von Hypra-Ass, die als "HYPRA-ASS V2" gespeichert wird. Sie wurde programmiert von Michael Haverkamp mit den folgenden besseren oder neuen Befehlen:
- /a : Änderungen sind jetzt auch in bestehenden Zeilen möglich
- /e und /i : Ausgabe wird mit SHIFT gesteuert und mit RUN/STOP beendet.
- /u funktioniert jetzt richtig
- /s x-y:"name" : speichert die Zeilen x bis y inkl. ab.
- /zx : Setzt den Quelltextstart an den Anfang der Zeile x
- /w x-y,z : verschiebt die Zeilen x bis y (inkl.) hinter die Zeile z
- Binärzahlen sind durch vorangestelltes % implementiert.
- Die Erweiterung verringert den Quelltextspeicher um 6562 Bytes, denn das Programmende liegt nun bei $221B.
- Eine geänderte Version dieser Erweiterung, welche die Ausgabe nach /e bzw. /i verbessert, gibt es im Hypra-Ass Archiv (siehe Weblinks).
- In der 64'er 1988/01 wurde ein von Michael Küper programmierter Editor vorgestellt, der an den Hypra-Ass angehängt wird. Quelltexte können hier ohne Zeilennummern eingegeben werden. Scrollen und seitenweises Blättern des Textes ist möglich genauso wie blockweises Verschieben, Speichern und Laden.
- Es gibt zwei verschiedene Speichervarianten:
- EDI 1 belegt den Speicher von $1FD8 bis $2F7B. Damit sind nur noch 28802 Bytes für den Quelltext frei, aber der Bereich ab $C000 bleibt unbelegt.
- EDI 2 liegt im Bereich ab $C000, so dass der Quellcodebereich nicht eingeschränkt wird.
Sonstiges[Bearbeiten | Quelltext bearbeiten]
- Für die Quelltextkonvertierung gibt es Tools wie
- zum Umwandeln in Quelltext für den Cross-Assembler ACME: toacme oder
- ASCII-Umwandlung hacat+ha2asm.
- Für den C16 bzw. Plus/4 veröffentliche der M&T Verlag 1987 den Hypra-Ass 16.
Weblinks[Bearbeiten | Quelltext bearbeiten]
- 64'er 1985_07 auf archive.org : Hypra-Ass - ein Assembler der Spitzenklasse, S.51, 66-72 - Disk 7/85 bei homecomputerworld
- 64'er 1985_11 auf archive.org
- Ergänzungen zu Hypra-Ass, S.96 (diese Ergänzungen sind in der korrigierten Version von SH85/08 enthalten)
- Reassembler zu Hypra-Ass (Martin Wehner), S.97-100
- 64'er 1986_06 auf archive.org : Hypra-Ass mit Datasette, S.95 - Disk 6/86 bei homecomputerworld
- 64'er 1987_05 auf archive.org : hypra-patch, S.85 (im Artikel "Der Schlüssel zu Geos") - Disk 5/85 bei homecomputerworld
- 64'er 1987_10 auf archive.org : Neues vom Hypra-Ass, S.62-65 - Disk 10/87 bei homecomputerworld
- 64'er 1988_01 auf archive.org : Super-Editor für Hypra-Ass (von Michael Küper), S.48-53 - Disk 1/88 bei homecomputerworld
- 64'er Sonderheft 1985-08 auf archive.org
- 64'er Sonderheft 1985-08 auf archive.org Hypra-Ass - ein Assembler der Spitzenklasse, S.112-118]
- 64'er Sonderheft 1985-08 auf archive.org Reassembler zum Hypra-Ass, S.118-121]
- 64'er Sonderheft 1985-08 auf archive.org Tips und Tricks zu Hypra-Ass, S.154-155]
- 64'er Sonderheft 1985-08 auf archive.org Wichtige Makros zum Assembler Hypra-Ass, S.156-157]
- 64'er Sonderheft 35 auf archive.org - Disk SH35 bei homecomputerworld
- Artikel wie im SH1985/08: S.113-122 und S.152-155
- 64'er Sonderheft 71 auf archive.org - Disk SH71 bei homecomputerworld
- Artikel wie im SH1985/08: S.35-40, S.41
- Hypra-Ass - ein Assembler der Spitzenklasse aus SH71 als HTML
- Hypra-Ass Archiv inkl. "hypra-ass.d64" mit allen obigen Versionen, Quelltexten der Änderungen, verbesserter Erweiterung.
Dieser Artikel wurde Artikel des Monats. |