INPUT ASS

Aus C64-Wiki
Wechseln zu: Navigation, Suche
INPUT ASS 64/128
INPUT ASS
Entwickler P. Dornier
Firma INPUT 64
Verleger Heise Verlag
Release 1986
Plattform(en) C64, C128
Genre Assembler
Steuerung Icon tastatur.png
Medien Icon disk525 1.png
Sprache(n) Sprache:deutsch
Information INPUT 64:
  • Ausgabe 06/1986
  • Ausgabe 05/1988 (neue Version)
  • Special 2

INPUT ASS ist ein Zwei-Pass-Makro-Assembler mit integriertem Editor für den Commodore 64, der von P. Dornier geschrieben wurde. Veröffentlicht wurde der INPUT ASS erstmalig im Magazin INPUT 64, Ausgabe 06/1986 und etwas später im INPUT 64 Special 2 mit dem Assemblerkurs aus den INPUT 64 Ausgaben 3 bis 8/1987. In der INPUT 64 Ausgabe 05/1988 wurde eine überarbeitete (fehlerbereinigte) Version, die auch für den C128 angepasst wurde, veröffentlicht.


Versionen[Bearbeiten]

INPUT ASS 64[Bearbeiten]

Nach dem Laden kann INPUT ASS mit RUN gestartet werden. Nach dem Verlassen nach BASIC jederzeit (ohne Datenverlust) mit SYS 2088 neu gestartet werden.[1]

Speicherbereich Belegung
$0801 - $2622 Assembler / Editor
$2623 - $B6FF Textspeicher, aktuelle Endadresse in Statuszeile
$B700 - $BFFF diverse Puffer, Anfang Symboltabelle
$C000 - $CFFF -
$D000 - $DFFF I/O-Bereich
$E000 - $FFFF Fortsetzung Symboltabelle

INPUT ASS 128[Bearbeiten]

Der Startbildschirm von INPUT ASS 128 auf einem C128.

Nach dem Laden mit DLOAD wird INPUT ASS 128 mit RUN gestartet. Nach dem Verlassen nach BASIC jederzeit (ohne Datenverlust) mit
SYS 7208 neu gestartet werden.


Speicherbereich Belegung
Bank 0:
$0801 - $2622 Assembler / Editor
$0A00 - $0AFF System-Variablen C128
$0B00 - $10FF div. Puffer/1
$1100 - $12FF System-Variablen C128
$1300 - $1BFF -
$1C01 - $3EFF Assembler / Editor
$3F00 - $FEFF div. Puffer/2, Symboltabellen
$FF00 - $FFFF MMU/System-Variablen
Bank 1:
$1001 - $FEFF Textspeicher, aktuelles Ende in Statuszeile

Hinweise zu den Tastenkombinationen[Bearbeiten]

Die meisten Steuerbefehle werden als Tastenkombinationen mit der Taste CTRL  eingegeben. Hierbei wird die CTRL -Taste gedrückt gehalten und erst nach Eingabe aller weiteren Buchstaben wieder losgelassen.

  • CTRL  + s  bedeutet: CTRL  drücken und halten, S  tippen und loslassen, CTRL  loslassen.
  • CTRL  + ka  bedeutet: CTRL  drücken und halten, K  tippen und loslassen, A  tippen und loslassen, CTRL  loslassen.

Bei Eingabe der weiteren Buchstaben muss nur CTRL  gehalten werden, die Großbuchstaben hier dienen nur zur besseren Darstellung!

Editor[Bearbeiten]

Nach dem Start erscheint oben nur die Statuszeile von INPUT ASS.

Anzeige[Bearbeiten]

Der Editor stellt 80 Zeichen pro Zeile (79 Zeichen plus das RETURN-Zeichen zum Zeilenabschluss) durch horizontales Scrolling dar. Die oberste Zeile ist eine Statuszeile (siehe Screenshoot).

Statuszeile[Bearbeiten]

Beispiel Statuszeile:

i 261b (weitere Infos)
  • Das erste Zeichen zeigt an, ob der Editor im Einfügemodus (i für insert), oder im Überschreibmodus (o für overwrite) ist.
  • Danach folgt die Endadresse des Textspeichers, maximal $b6ff.
  • Der Rest der Zeile wird für Eingaben (z. B. Diskbefehle) und Ausgaben (z. B. Fehlermeldungen) genutzt.


Bedienung[Bearbeiten]

Siehe Abschnitt "Hinweise zu den Tastenkombinationen" bei Doppelbuchstaben!

Texteingabe[Bearbeiten]

Full-Screen-Editor wie in einer Textverarbeitung. Zeilennummern sind nicht notwendig.

  • CTRL  + v : Umschalten zwischen Overwrite- (Überschreibmodus; o) und Insert-Modus (Einfügemodus; i).
  • CTRL  + p : Eingabe von einzelnen Drucker- bzw. Steuerzeichen in den Quelltext, die sonst vom Editor abgefangen würden.


Cursorbewegung[Bearbeiten]

  • CTRL  + s  oder + e  oder + d  oder + x : Zeichenweise mit den Cursortasten oder mit dem "imaginären Steuerkreuz".
  • CTRL  + a  / + f : Wortweise (links/rechts)
  • CTRL  + r  / + c : Seitenweise (rauf/runter)
  • CTRL  + w  / + z : Vertikal Scrollen (hoch/runter) bei stehendem Cursor.
  • CTRL  + q  + s  : An den Zeilenanfang springen.
  • CTRL  + q  + d  : An das Zeilenende springen.
  • CTRL  + q  + r  : An den Textanfang springen.
  • CTRL  + qc  oder + qL : An das Textende springen.
  • CTRL  + q  + b  : An den Blockanfang springen.
  • CTRL  + q  + k  : An das Blockende springen.
  • CTRL  + i : In die gleiche Spalte wie nächster Wortanfang der vorherigen Zeile (eine Art Tabulator).

Löschen[Bearbeiten]

  • CTRL  + g : Zeichen unter dem Cursor löschen
  • CTRL  + gy : Vom Zeichen unter dem Cursor (inklusive) bis zum Zeilenende löschen.
  • CTRL  + y : komplette Cursorzeile löschen. Achtung: CTRL-y kann nicht rückgängig gemacht werden!
  • CTRL  + ql : Alle Änderungen in der Cursorzeile rückgängig machen, solange die Zeile noch nicht verlassen wurde.


Blockbefehle[Bearbeiten]

Der Editor arbeitet blockorientiert. Der Block ist der invers angezeigte Teil des Texts. Es kann nur einen geben!

  • CTRL  + ka : Ganzen Text als Block markieren.
  • CTRL  + kb : Cursorzeile wird Blockanfang.
  • CTRL  + kk : Cursorzeile wird Blockende.
  • CTRL  + kc : Block wird an die Cursorposition kopiert.
  • CTRL  + kv : Block wird an die Cursorposition verschoben.
  • CTRL  + ky : Block wird gelöscht. Kein "Undo" möglich!


Suchen/Ersetzen[Bearbeiten]

Die Begriffe werden in der Statuszeile eingegeben.

  • CTRL  + qf : find: Beliebige Zeichenfolge ab Cursorposition abwärts suchen.
  • CTRL  + j : jump label: Wie find, nur ist der Eingabe ein (löschbares!) label prefix : vorangestellt und die Suche beginnt am Textanfang.
  • CTRL  + qa : Suchen und Ersetzen. Nachfrage bei jeder Fundstelle, mit y  (ersetzen und weiter) oder n  (nicht ersetzen, weiter) oder *  (alle ersetzen) oder RUN/STOP  (abbrechen) beantworten.
  • CTRL  + 1 : Letzte Operation wiederholen.


Dateibefehle[Bearbeiten]

Die Eingabe von Diskettenbefehlen in INPUT ASS 64.
Die Anzeige eines Directorys in INPUT ASS 64.
  • Der Editor speichert die Texte als reine Textdateien mit der Endung SEQ. Zeilenschaltung in der Datei ist CHR$(13).
  • Dateinamen und Befehle werden ohne Anführungszeichen und mit führender Geräteadresse und Sekundäradresse in hexadezimal (0-9; a = 10 ... f = 15) angegeben!
  • Die Eingabe kann mit RUN/STOP  abgebrochen werden.
  • Mit CTRL  + d  während der Eingabe wird diese als default (Vorbelegung) für die Zukunft gespeichert!
Befehle bzw. Tastenkombinationen
  • CTRL  + kf : Directory anzeigen; größerer Inhaltsverzeichnisse können mit Leertaste  angehalten und mit C=  fortgesetzt werden.
  • CTRL  + kr : Datei laden. Der Text wird an der Cursorposition eingefügt und als Block markiert. Beispiel: load:82hello-world
  • CTRL  + ks : (Nur C64-Version) Speicherbereich als Datei speichern mit Anfangsadresse (FROM:) bis Endadresse (TO:) in hexadezimaler Zahlenangabe. Abschließend den Dateinamen eingeben.
  • CTRL  + kw : Den Block als Datei speichern. Beispiel: save:82hello-world.s
  • CTRL  + ke : Diskettenbefehl senden. Eine Leereingabe mit RETURN  abgeschlossen, liest den Fehlerkanal aus.
    • Beispiele:
    • Initalize: 8fi
    • Validate: 8fv
    • Copy: 8fs:<Neue_Datei>=<Alte_Datei>
    • Rename (Datei umbenennen): 8fs:<Neuer_Dateiname>=<Alter_Dateiname>
    • Scratch (Datei löschen): 8fs:<Dateiname>
    • New (Formatieren): 8fn:Diskname,ID
  • CTRL  + k*  - Den Editor samt Quelltext und als default auf Diskette sichern. Eine offizielle Arbeitskopie! (Beim C128 ohne eingegebenen des Quellcodes.)



Assemblerbefehle[Bearbeiten]

  • CTRL  + kx : Text assemblieren. Darauf folgen drei Abfragen: code, list und symb.
    • code: Wohin mit dem Objektcode? Auf Diskette (code:82hello.bin), in den Speicher an die erste ORG-Adresse (code:*) oder keinen Code erzeugen (code:↵)
    • list: Wohin mit dem Listing? Auf den Drucker (list:44), auf den Bildschirm (list:00) oder kein Listing ausgeben (list:↵)
    • symb: Wohin mit der Symboltabelle? Auf Diskette (symb:83hello.sym), auf den Bildschirm (symb:03) oder keine Symboltabelle ausgeben (symb:↵)
  • CTRL  + kd : Probe-Assemblierung zur Syntaxprüfung.
  • CTRL  + kq : Assembler/Editor verlassen. Mit RUN oder SYS-Befehl (siehe oben) wieder startbar, der Text bleibt dabei erhalten.

Programmierung[Bearbeiten]

Pseudo-Opcodes[Bearbeiten]

Beispiel Anmerkung
org $c000 (origin) Startpunkt der Assemblierung setzen. In Ausdrücken kann die aktuelle Assemblierungsadresse als Pseudo-Variable "*" gelesen werden!
b 'a, 'b, 'c, "def", 7, 8, 9 (define bytes) Bytes als Zeichen, Zahlenwerte oder Zeichenkette angeben.
w $ffd2 (define word) Die 16-Bit-Zahl wird im Lo-/Hi-Format gespeichert
s 256 (define space) Assembliert 0-Bytes in den Code, beispielsweise für Pufferbereiche.
in 84modul-7 (include) Lädt die Datei modul-7 als Sourcecode an die Cursorposition.
:loop Label als Sprungmarke
:screen=1024 Zuweisung
:pass:=1 Neudefinition eines Labels
lda #<screen Low-Operator (Low-Byte eines 16-Bit-Wertes) für einen Ausdruck (hier das Label screen)
ldy #>screen High-Operator (High-Byte eines 16-Bit-Wertes) für einen Ausdruck (hier das Label screen)

Ausdrücke und Rechenoperationen[Bearbeiten]

  • Der Assembler akzeptiert Ausdrücke in dezimal (kein Vorzeichen), hexadezimal (Vorzeichen $), binär (Vorzeichen %) und ASCII (Vorzeichen ').
  • Erlaubte Rechenoperationen sind neben den Grundrechenarten (+ - * /) das logische AND (&), das logische OR (!) und das logische EOR (£).

Achtung: Ausdrücke werden von links nach rechts ausgewertet, Klammern sind nicht erlaubt!


Bedingte Assemblierung[Bearbeiten]

Die bedingte Assemblierung wird mit den Pseudo-Opcodes if, el und ei (für if, else und endif) gesteuert.

:demo = 1
if demo
  jsr one_live
el
  jsr three_lives
ei

Wenn die if-Bedingung erfüllt ist (true), wird der if-Teil assembliert, ansonsten der el-Teil. Der jeweils nichtzutreffende Teil erzeugt keinen Code!


Makros[Bearbeiten]

Makros werden definiert durch den Makronamen mit führendem ":" (wie für Label), ein folgendes "m" oder "mf" (für Makrodefinition bzw. Makrodefinition mit Vorwärtsreferenzen[2]) und der Anzahl Parameter.
In der Makrodefinition kann mit @0, @1 etc. auf die Parameter zugegriffen werden.
Die Makrodefinition muss mit einem "/" (alleinstehend) beendet werden. Innerhalb von Makros führen doppelte Label-Definitionen zu fehlerhaftem Verhalten, aber nicht zu einer Fehlermeldung! In Include-Dateien (Pseudo-Opcode "in") können keine Makros definiert werden. Probleme mit Labeldefinition und Vorwärtsreferenzen können durch Einsatz des Programmzählers (Pseudo-Variable *) umgangen werden.

Beispiel einer Makrodefinition mit einem Parameter:

:print m 1
lda #<@0
ldy #>@0
jsr $ab1e
/

Aufruf des Makros aus dem Beispiel:

print $a376

Der Beispielaufruf gibt den null-terminierten Text ab Adresse $a376 aus. An Adresse $a376 steht die allseits bekannte Zeichenkette "READY."

Fehlermeldungen[Bearbeiten]

Fehlermeldungen in der Statuszeile von INPUT ASS 64.

Fehlermeldungen des Assemblers werden als Kürzel in der Statuszeile angezeigt. Der Cursor steht dann im Quellcode hinter dem Fehler.

  • am: address mode error - Falsche Adressierungsart.
  • br: branch error - Sprungziel zu weit entfernt bei eine, bedingten Sprung.
  • dd: double definition error - Label ist doppelt definiert.
  • md: macro definition error - Fehler bei der Makrodefinition.
  • op: opcode error - Unbekannter Opcode.
  • ov: overflow error - Zahl zu groß.
  • ph: phase error - Unterschiedliche Adressen in Pass 1 und 2.
  • sn: syntax error - Fehlerhafte oder unbekannte Syntax.
  • sv: symbol table overflow - Symboltabelle passt nicht mehr in den Speicher.
  • ud: undefined label - Angesprochenes Label ist noch nicht definiert.


Tipps und Hinweise[Bearbeiten]

Bei der unveränderten, aus dem Magazin gespeicherten Version können die Farben angepasst werden. Die veränderte Version kann dann mit SAVE gespeichert werden.

  • Rahmenfarbe: POKE 9496,x
  • Hintergrund: POKE 9491,x
  • Zeichenfarbe: POKE 7908,x
  • Farbe der Statuszeile: POKE 7932,x

Wenn der Sourcecode immer mit org $... beginnt, kann nach einem versehentlichen kompletten Löschen (CTRL-ka, CTRL-ky) der Sourcecode mit POKE 9755,79 wiederhergestellt werden.

Quelltext sollte nie mit einer Leerzeile beginnen. Das verursacht schwer zu ergründende Fehler beim Assemblieren. Außerdem scheint die Block-Kopier-Routine in seltenen Fällen nicht ganz einwandfrei zu arbeiten und andere Teile des Quelltexts zu beeinflussen. Glücklicherweise kommt das sehr selten vor, daher kann ich kein Beispiel nennen.


Covers[Bearbeiten]


Titelbild der INPUT 64 Ausgabe 06/1986.
Titelbild der INPUT 64 Ausgabe 05/1988.



Quellen / Anmerkungen[Bearbeiten]

  1. Die weiteren Absätzen dieses Artikels basieren auf Auszügen aus den offiziellen Artikeln aus INPUT 64 Ausgabe 6/1986 und 05/1988.
  2. Anmerkung zu Makrokommand "mf" des Autors: "Ich habe mf nie benutzt, konnte aber trotzdem Makrodefinitionen mit Vorwärtsreferenzen fehlerfei definieren und nutzen."

Weblinks[Bearbeiten]