INPUT ASS
INPUT ASS 64/128 | |
---|---|
Entwickler | P. Dornier |
Firma | INPUT 64 |
Verleger | Heise Verlag |
Release | 1986 |
Plattform(en) | C64, C128 |
Genre | Assembler |
Steuerung | |
Medien | |
Sprache(n) | |
Information | INPUT 64:
|
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 | Quelltext bearbeiten]
INPUT ASS 64[Bearbeiten | Quelltext 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 | Quelltext bearbeiten]
Nach dem Laden mit DLOAD wird INPUT ASS 128 mit RUN gestartet. Nach dem Verlassen nach BASIC jederzeit (ohne Datenverlust) mitSYS 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 | Quelltext 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 | Quelltext bearbeiten]
Anzeige[Bearbeiten | Quelltext 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 Screenshot).
Statuszeile[Bearbeiten | Quelltext 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 | Quelltext bearbeiten]
Siehe Abschnitt "Hinweise zu den Tastenkombinationen" bei Doppelbuchstaben!
Texteingabe[Bearbeiten | Quelltext 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 | Quelltext 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 | Quelltext 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 | Quelltext 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 | Quelltext 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 | Quelltext bearbeiten]
- 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 | Quelltext 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 | Quelltext bearbeiten]
Pseudo-Opcodes[Bearbeiten | Quelltext 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 | Quelltext 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 | Quelltext 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 | Quelltext 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 | Quelltext bearbeiten]
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 | Quelltext 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 | Quelltext bearbeiten]
Quellen / Anmerkungen[Bearbeiten | Quelltext bearbeiten]
Weblinks[Bearbeiten | Quelltext bearbeiten]
- "INPUT ASS" im Downloadarchiv "INPUT 64" bei www.c64-online.com
- INPUT 64-Assemblerschule Assemblerkurs aus INPUT 64 3/87-8/87
- CSDb
- INPUT 64 Ausgabe 05/1988 inkl. C128-Version (PDF)