Hypra-Ass

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Hypra-Ass
Hypra-Ass
Entwickler Gerd Möllmann
Verleger Markt & Technik Verlag
Release 1985
Plattform(en) C64, C128
Genre Assembler
Steuerung Icon tastatur.png
Medien Icon disk525 1.png
Sprache(n) Sprache:deutsch
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
T1 = Tabulator für den Kommentar bei der formatierten Ausgabe
T2 = Tabulator für die Anzahl der Leerzeichen, die am Anfang einer Ausgabezeile ausgegeben werden
T3 = Tabulator für die Symboltabelle

/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,
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 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.
Beide Dumps können mit der CTRL  verlangsamt und mit RUN/STOP  angehalten werden.
Mit einer Abfolge aus einem OPEN- und CMD-Befehl kann der Dump an andere Geräte gesendet werden.

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]

Weblinks[Bearbeiten | Quelltext bearbeiten]

Artikel des Monats.gif Dieser Artikel wurde Artikel des Monats.