ExAss: Unterschied zwischen den Versionen
Tw (Diskussion | Beiträge) (→Quelltext) |
Tw (Diskussion | Beiträge) (→Quelltext) |
||
| Zeile 227: | Zeile 227: | ||
130 L1 | 130 L1 | ||
140 ::LDA TAB,X | 140 ::LDA TAB,X | ||
| − | 145 ::BEQ L2 | + | 145 ::BEQ L2 ;TEXTENDE? --> |
| − | 150 ::JSR BSOUT | + | 150 ::JSR BSOUT: ;--KERNAL BSOUT -- |
160 ::INX | 160 ::INX | ||
170 ::BNE L1 | 170 ::BNE L1 | ||
| Zeile 240: | Zeile 240: | ||
105 BSOUT=$FFD2 | 105 BSOUT=$FFD2 | ||
110 PRINTHW LDX#0 | 110 PRINTHW LDX#0 | ||
| − | 130 L1 LDA TAB,X:BEQ L2:JSR BSOUT | + | 130 L1 LDA TAB,X:BEQ L2:JSR BSOUT:INX:BNE L1 |
| − | + | 140 L1 LDA TAB,X:BEQ L2 | |
| + | 145 JSR BSOUT:INX:BNE L1 | ||
190 L2 RTS | 190 L2 RTS | ||
Version vom 20. Juni 2023, 09:34 Uhr
Inhaltsverzeichnis
ExAss (extended Assembler)
Das Modul ExAss ist ein Werkzeug für den C64. Das Tool unterstützt die Software Entwicklung am C64 in 6502 Assembler Code. Man kann ExAss an die Adresse $8000 laden oder auch als Modul auf ein EPROM schreiben, als 8KB Modul oder als CRT (Vice Cartridge).
ExAss besteht aus zwei Teilen:
- einem 2 Pass Assembler
- einer Befehlserweiterung
- ExAss-02.png
- ExAss-03.png
- ExAss-06.png
Zwei Pass Assembler
Ein Assembler unterstützt den Benutzer bei der Entwicklung und Eingabe von Maschinen Code (6502 Memnonik). Im einfachsten Fall übersetzt ein Assembler die eingegebene Code Zeile direkt um und speichert den Code. Wie es bei allen gängigen Monitor Programmen der Fall ist.
Fortgeschrittene Assembler übersetzen ein ganzes Programm auf einmal. Dabei wird der Assembler Quelltext gelesen und in Maschinen Code übersetzt. Man verwendet Sprungmarken und Symbole (Variable) statt direkter Adressen. Dadurch wird der Quelltext besser lesbar und der Maschinencode kann für jeden Adressraum übersetzt werden.
Zwei Pass Assembler lesen den Quelltext zweimal (Pass 1 und Pass 2). Beim ersten Lauf (Pass 1) werden alle Sprungmarken und Symbole aufgelöst. Dabei baut sich der Assembler intern eine Tabelle aller verwendeten Adressen auf. Im zweiten Lauf sind dann alle Adressen bekannt und der Maschinen Code wird erzeugt.
Bei 2 Pass Assembler gibt es mehrere Ansätze:
- der Quellcode wird beim übersetzen von Floppy Disk geladen
- der Quellcode befindet sich im RAM des Computer
- das übersetzte Maschinen Programm wird auf Floppy Disk gespeichert
- das übersetzte Maschinen Programm wird direkt im Speicher abgelegt
Angesichts der relativ langsamen Floppy Laufwerke beim C64, aber auch wegen des umständlicheren Testverfahren bei Floppy Betrieb habe ich mich damals entschieden, den Assembler Quellcode aus dem RAM zu lesen und auch das assemblierte Programm direkt im RAM zu speichern.
Assembler Quelltext
Der Assembler liest eine Textdatei (Quelltext) und wandelt den Text um in Code. Normalerweise benötigt man für die Erstellung der Textdatei ein Editor Programm (Texteditor). Beim C64 ist bereits ein Texteditor im Standardumfang. Es ist der Editor der normalerweise zur Eingabe eines BASIC Programm dient.
Dem Editor ist es vollkommen egal, was man da eingibt. Es muss nicht zwingend ein BASIC Programm sein, man kann genauso einen Assembler Quelltext eingeben und editieren. Der C64 Benutzer ist zudem den BASIC Editor gewöhnt und kann meist auf Anhieb damit arbeiten. Der Assembler Quelltext kann ganz normal mit SAVE gespeichert, mit LOAD wieder geladen und mit LIST angezeigt werden. Zudem unterstützt ExAss über neue Befehle das arbeiten mit dem Text Editor.
Natürlich kann der Assembler Quelltext nicht mit RUN ausgeführt werden. Der Befehl RUN startet den BASIC Interpreter und der kann mit dem Assembler Quelltext nichts anfangen.
Man startet den zwei Pass Assembler mit dem Kommando ';a'. Dieser liest den Quelltext im Speicher und erzeugt den Maschinencode. Wenn der Quelltext einen Fehler beinhaltet, dann wird der Fehler angezeigt und die Übersetzung abgebrochen. Der Benutzer editiert den Quelltext solange, bis sich das Programm übersetzen lässt und fehlerfrei läuft (Entwicklungszyklus).
Wenn ExAss nicht aktiv ist, dann funktionieren auch keine Kurzbefehle wie ';a'. Man kann aber trotzdem den Quelltext bearbeiten, speichern und laden. Das ist die normale Funktion des C64 BASIC Editor.
Kommentare
Kommentare sind Zeichenfolgen im Quelltext, die vom Assembler einfach ignoriert werden. Das entspricht dem REM Befehl im BASIC Text. Es macht durchaus Sinn im Assembler Quelltext viele Kommentare rein zu schreiben. Kommentare verbessern die Lesbarkeit und ermöglichen es, dass man auch nach längerer Zeit den Sinn des Quelltext versteht. Wenn der Quelltext von fremden Personen gelesen wird, werden diese auch dankbar sein um sinnvolle Kommentare.
Kommentare beginnen mit einem ';' (Semikolon). Alle Zeichen nach dem ';' bis zum Zeilenende werden vom Assembler überlesen.
- Beispiel
10 ;-- KOMMENTAR ZEILE --- 80 ;-- BEGINN DER DATEN TABELLE 90 ;CODE FÜR TASTATUR EINGABE
Labels
Im Assembler Sourcecode sind Labels wie Variable im BASIC Text. Die Label Namen beginnen immer mit einem Buchstaben, danach folgen Buchstaben oder Ziffern. Der Label Name kann bis zu 16 Zeichen lang sein und alle 16 Zeichen sind signifikant. Ein Label symbolisiert immer eine 16 Bit Zahl (ein Integer ohne Vorzeichen).
Wenn ein Label alleine steht im Assembler Quelltext, dann hat es den Wert der 'aktuellen Adresse'. Beim übersetzen des Quelltext wird die aktuelle Adresse hoch gezahlt. Dieses Label ist also die Adresse des Code (oder Daten) die folgen. Man kann den Code nach dem Label mit einem Sprungbefehl (JSR, JMP, BEQ ...) erreichen.
Ein Label gefolgt von einem '=' Zeichen symbolisiert die Zahl (oder Formel) die nach dem '=' Zeichen folgt. Das ist eine Zuweisung, ganz ähnlich wie bei Variable im BASIC Text.
- Beispiel
10 SCREEN = $0400 20 LDX #39 30 LDA #'A' 40 LOOP 50 STA SCREEN,X 60 DEX 70 BPL LOOP 80 RTS
Dieses Code Beispiel füllt die erste Zeile am Schirm mit dem Zeichen 'A'. In der Zeile 40 wird das Label 'LOOP' definiert. Da es alleine steht, ist der Wert hinter dem Label die 'aktuelle Adresse'. Der Befehl BPL verzweigt zu der Adresse die LOOP symbolisiert. In der Zeile 10 wird das Label 'SCREEN' definiert und die Adresse des C64 Text Bildschirm zugewiesen.
Start Adresse
Bei der Übersetzung des Assembler Sourcecode muss immer die 'aktuelle Adresse' bekannt sein. Wenn Code oder Daten erzeugt wird, dann erhöht sich automatisch die aktuelle Adresse um die Byte Anzahl die der Assembler emittiert. Aber bevor der Assembler das erste Byte emittiert, muss die aktuelle Adresse gesetzt werden.
Die aktuelle Adresse ist ein spezielle Label mit dem Namen '*'. Ganz am Beginn des Quelltext ist die aktuelle Adresse unbekannt. Daher sollte man ganz am Anfang die aktuelle Adresse setzen:
- Beispiel
10 * = $C000
Die aktuelle Adresse kann auch danach jederzeit verändert werden.
Vor dem ersten setzen der aktuellen Adresse dürfen nur folgende Dinge sein:
- Kommentare
- Labels mit Zuweisung ('=' Zeichen plus Zahl oder Formel)
Sobald die Startadresse gesetzt ist, kann der Assembler Code und Daten emittieren. ExAss liest den Quelltext aus dem RAM des C64 Und er emittiert den Code (und Daten) ebenfalls in den RAM des C64 (Ablage). Dabei muss man gut aufpassen, dass der emittierte Code nicht in verbotene Bereiche geschrieben wird. Verbotene Bereiche sind Adressbereiche die entweder die Stabilität des Computers beeinträchtigen oder wichtige Daten zerstören.
- Verbotene Bereiche
- der unterste 1K Bereich (System Bereich: $0000 bis $0400)
- der Bildschirm Bereich ($0400 bis $0800)
- der BASIC Text Bereich ($0800 bis $nnnn)
- der LABEL Daten Bereich ($nnnn bis $mmmm)
Der Assembler Quelltext startet normalerweise ab $0800 und reicht je nach Größe des Quelltext bis $nnnn. Während des Übersetzungsvorgang erzeugt der Assembler die Tabelle für die Labels. Je nach Anzahl an Label reicht der Bereich bis $mmmm.
Im Grunde müsste die Startadresse oberhalb von $mmmm liegen, sonst zerstört der Assembler etwas im RAM durch den emittierten Code (und die Daten). Um sicher zu gehen kann man die HIMEM Adresse setzen, denn der Assembler beachtet die HIMEM Adresse als Limit für die Erzeugung der Label Tabelle. Normalerweise liegt die HIMEM Adresse bei $8000 (30KB free).
Wenn man HIMEM zB. auf $7000 setzt, dann hat man für Quelltext plus Labels noch ca. 26KB. Dafür kann man ab $7000 den emittierten Code + Daten ablegen, indem man die Startadresse auf $7000 legt.
Beim C64 hat man aber einen praktischen Adressbereich mit einer Größe von 4KB, der sich ideal dazu eignet, ein Maschinen Programm aufzunehmen: $C000 bis $CFFF
Ablage Adresse
ExAss liest den Quelltext aus dem RAM des C64, und emittiert den Code (und Daten) ebenfalls in den RAM des C64 (Ablage). Normalerweise ist die aktuelle Adresse gleich der Ablage Adresse. Dh. wenn zB. die aktuelle Adresse $C104 ist, dann emittiert der Assembler das nächste Byte an der Adresse $C104.
Nun kann das Problem auftreten, dass die aktuelle Adresse in einem verbotenen Adressbereich liegt. Das Programm soll zum Beispiel später an der Adresse laufen, wo der Assembler Quelltext liegt.
Zum Beispiel möchte ich ein Spiel programmieren, das nur eine BASIC Zeile mit einem SYS Befehl hat und danach kommt direkt das Maschinen Programm. Der Assembler soll also Code produzieren, der später an der Adresse $0840 läuft. Die Adresse $0840 ist normal eine verbotene Zone, da hier der Assembler Quelltext liegt. Man würde sich also den Quelltext zerstören durch den Übersetzungsvorgang.
- Die Lösung ist die Definition einer Startadresse und zusätzlich die Definition einer Ablage Adresse
10 *=$0840:&=$C040
Dies definiert die Startadresse des Code ab $0840 (da wo später der Code laufen soll) und die Ablage Adresse von $C040 (die Adresse wohin der Assembler den Code emittieren soll). Nach dem Übersetzungsvorgang steht der Code An der Adresse $C040. Alle Sprungbefehle und Speicherzugriffe beziehen sich aber auf den Adressbereich ab $0840. Den emittierten Code kann man nun speichern und später an der gewünschten Adresse laden. Alternativ kann man den Code auch verschieben per Monitor Befehl (;T). Aber Vorsicht, vor dem Speicher Transfer sollte man den Assembler Quelltext gesichert haben!!!
Der Assembler kann den Code auch unter das ROM des Betriebssystem emittieren. Der Mini Monitor kann den Code auch unter dem ROM speichern oder transferieren.
Die Ablage Adresse ist auch praktisch, wenn man Code für das Floppy Laufwerk 1541 entwickelt. Der emittierte Code kann direkt mit Hilfe des Mini Monitor in die Floppy transferiert werden (Quelle C64 RAM, Ziel Device 8).
Mnemonics
Mnemonics sind die symbolische Darstellung der Befehle, die eine CPU versteht. In unserem Falle ist die CPU eine 6502 bzw. eine 6510. Der Assembler versteht alle Befehle und Adressierungsarten, die offiziell von der CPU unterstützt werden. Als Argument für die Assembler Befehle sind Konstanten, Labels und ganze Formeln erlaubt.
- Beispiel
100 PTR = 17
110 PORT = $DE00
200 *=$C000
210 LDA PORT
220 ORA #%01000010
230 STA PORT
:
480 LDA (PTR),Y
490 TAX
Daten
In einem Assembler Programm befinden sich neben dem Code meistens auch Daten. Die Daten werden genau so wie der Code vom Assembler interpretiert und dann emittiert. Daten beginnen immer mit einem '.' (Punkt). Danach kann man Zahlen, Labels, Formeln und Texte verwenden. Alle Formen können frei gemischt verwendet werden. Mehrere Daten werden durch ein ',' (Beistrich) getrennt. Optional kann man auch einfach eine neue Zeile beginnen.
- Beispiel
100 .20,$33,%11100000,$2233,54238 110 ."Das ist ein Text ...",0 120 .LABEL1,LABEL2,TAB1,TAB2 130 .>TAB2,<TAB2,>TAB1,<TAB1 140 .LABEL1-1,LABEL2+1
Quelltext
Der Assembler Quelltext beinhaltet Startadresse, optional Ablageadresse, Label mit Zuweisung, freistehende Label, Memnonics (Code) und Daten. Das haben wohl alle Assembler gemeinsam.
Der ExAss hat nun einige Besonderheiten aufgrund des Aufbau und des BASIC Texteditor:
- jede Zeile im Sourcecode beginnt mit einer Zeilennummer
- eine Zeile beginnt mit einem ':', einem ';', einem '.', einem Label oder einem Memnonic
- der '*' und das '&' sind besondere Label
- der ':' wird vom Assembler wie ein Zeilenende gesehen
Die Zeilennummer wird nur vom BASIC Editor benötigt. Für den Assembler spielt die Zeilennummer keine Rolle. Man kann auch nicht über die Zeilennummer Code oder Daten adressieren. Dazu bitte LABELS verwenden.
Der Doppelpunkt (':') wird vom Assembler wie ein Zeilenende behandelt. Das ist genau so wie es auch der BASIC Interpreter des C64 handhabt. Auf die Art und Weise kann man den Code sehr kompakt schreiben, indem man mehrere Assembler Befehle in einer Zeile schreibt. Für die Lesbarkeit ist das aber nicht ratsam.
Man kann den Doppelpunkt aber auch dazu verwenden, den Code einzurücken. Das kann die Lesbarkeit des Quelltext deutlich erhöhen. Für den Assembler ist so eine Einrückung völlig irrelevant. Es wirkt sich auch nicht auf den generierten Code aus.
- Beispiel 1
100 TAB ."Hello World!",0 105 BSOUT=$FFD2 109 : 110 PRINTHW 120 :LDX #0 130 L1 140 ::LDA TAB,X 145 ::BEQ L2 ;TEXTENDE? --> 150 ::JSR BSOUT: ;--KERNAL BSOUT -- 160 ::INX 170 ::BNE L1 180 : 190 L2 195 :RTS
- Beispiel 2
100 TAB ."Hello World!",0 105 BSOUT=$FFD2 110 PRINTHW LDX#0 130 L1 LDA TAB,X:BEQ L2:JSR BSOUT:INX:BNE L1 140 L1 LDA TAB,X:BEQ L2 145 JSR BSOUT:INX:BNE L1 190 L2 RTS
Befehlserweiterung
ExAss bietet eine Erweiterung des Befehlssatz für den Direktmodus. Die neuen Befehle unterteilen sich in neue Befehle für den BASIC Editor und Kurz Befehle zur Steuerung der Floppy Laufwerke.
Floppy Kurzbefehle
Diese Befehle betreffen die Bedienung der angeschlossenen Floppy Laufwerke.
Die Befehle LOAD, BLOAD, SAVE und VERIFY funktionieren auch direkt aus dem Directory Listing am Bildschirm. Also einfach Directory mit $ anzeigen und dann <Cursor up> bis zum gewünschten Eintrag. Dann das erste Zeichen ersetzen mit /, % oder < und dann <RETURN> drücken.
$
Dieser Befehl dient dazu, das Directory einer Diskette anzeigen. Im Gegensatz zu LOAD"$",8 geht hierbei der Inhalt des BASIC Programmspeicher nicht verloren.
@
Dieser Befehl dient dazu, ein Kommando an das Floppy Laufwerk zu senden. Die möglichen Kommandos an die Floppy entnehmen Sie bitte dem Handbuch zum Floppy Laufwerk.
- Beispiele
- @I
- Initialisiert die Diskette im Laufwerk
- @N
- TEST
- Die Diskette wird gelöscht, der neue Name der Diskette ist 'TEST'
- @N
- TEST,UI
- Die Diskette wird formattiert, der neue Name der Diskette ist 'TEST' und die Disk ID ist 'UI'
- @S
- TEST*
- Löscht alle Dateien die mit 'TEST' beginnen
<Pfeil links>
Abkürzung für den Befehl SAVE.
/
Abkürzung für den Befehl LOAD.
%
Das ist der Befehl BLOAD, eine Abkürzung für den Befehl LOAD mit SA=1 (binary LOAD).
<
Abkürzung für den Befehl VERIFY.
#
Dies setzt die Gerätenummer (Floppy Laufwerk Adresse) für die Floppy Kurzbefehle. Der Standard hier ist 8, möglich sind die Werte 8 bis 11.
&
Das ist der Befehl APPEND, eine spezielle Art des Befehl LOAD. Damit kann man an den BASIC Code im Speicher ein weiteres BASIC Programm anhängen.
Zusatz Befehle
Die meisten Zusatzbefehle verbessern die Bedienung des Standard BASIC Texteditor. Diese Befehle funktionieren gleichermaßen für die Erstellung von BASIC Programmen als auch für die Entwicklung von Assembler Sourcecode für den zwei Pass Assembler.
DEL
Dieser Befehl löscht eine oder mehrere Zeilen im BASIC Programmspeicher.
- Beispiele
- DEL 60
- löscht die Zeile 60 im BASIC Code
- DEL 600-
- löscht alle Zeilen im BASIC Code ab der Zeile 600 bis zum Ende
- DEL -500
- löscht alle Zeilen im BASIC Code vom Anfang bis zur Zeile 500
- DEL 200-500
- löscht alle Zeilen im BASIC Code ab der Zeile 200 bis zur Zeile 500
RENUM
Der Befehl RENUM nummeriert Zeilen aus dem BASIC Programm Code. Man muss einen Bereich von Zeilennummern angeben der neu nummeriert werden soll. Optional kann eine Schrittweite angegeben werden. Dabei kann man auch das Ende oder den Anfang des Zeilenbereich offen lassen. Der Befehl kann auch abgekürzt werden.
Das neu nummerieren ist hilfreich, wenn man mitten im Sourcecode Zeilen einfügen möchte und kein Platz mehr dafür vorhanden ist. Also wenn es zu eng geworden ist, weil man bereits zu viele Zeilen eingefügt hat.
Der Befehl ist für den Assembler gedacht. Bei Basic Code funktioniert das schon auch, aber es werden keine Sprungziele (GOTO, GOSUB) angepasst. Beim Assembler Code ist das egal, weil man da ausschließlich mit Sprungmarken adressiert.
- Beispiele
- RENUM 2000-
- nummeriert alle Zeilen von Zeile 2000 bis zum Ende neu (Schrittweite 5)
- RENUM 200-299
- nummeriert alle Zeilen von Zeile 200 bis 299 neu mit der Schrittweite 5
- RENUM -800,10
- nummeriert alle Zeilen bis zur Zeile 800 neu (Schrittweite 10)
FIND
Der Befehl "find" sucht nach dem angegebenen Suchstring in den BASIC Textzeilen und listet alle betroffenen Zeilen. Soll ein Text in Anführungszeichen (") gesucht werden, dann muss auch der Suchstring mit " beginnen. Der Befehl kann auch abgekürzt werden.
Bei großen Quelltexten ist diese Suchfunktion unumgänglich. Der Befehl funktioniert auch einwandfrei in BASIC Programmen. Dabei ist aber zu beachten, dass der C64 alle BASIC Befehle wie PRINT, GOTO etc. umwandelt in Token. Ein Token ist ein einzelnes Sonderzeichen und kann auch nur komplett gefunden werden.
Nach dem Befehl sollte kein Blank eingegeben werden, denn sonst wird es als Bestandteil des Suchstring angesehen.
- Beispiele
- FINDGOSUB
- findet alle GOSUB Befehle (Token) im Code
- FINDGOSU
- findet alle Textstellen wo 'GOSU' enthalten ist, jedoch nicht GOSUB (Token)
- FIND200
- findet alle Textstellen wo '200' vorkommt wie zb. "GOTO 200" oder "LDA #200"
- FIND 200
- findet alle Textstellen wo ' 200' vorkommt wie zb. "GOTO 200" aber nicht "GOTO200"
HELP
Der Befehl HELP listet alle neuen Befehle auf. Der Befehl kann auch mit abgekürzt werden.
MEM
UNNEW
Dieser Befehl stellt ein mit NEW gelöschtes Programm im BASIC Programmspeicher wieder her.
Besonders praktisch ist dieser Befehl nach einem RESET des Computer. Wenn das Programm im Speicher noch in Ordnung ist, kann man es mit UNNEW nach einem Reset wieder herstellen.
Vorsicht: Der Befehl UNNEW setzt den BASIC Ende Pointer (Variablen Beginn) ans Ende des BASIC Code. Wenn sich hinter dem BASIC Code noch Maschinen Code befindet, dann ist dieser nach Ausführung von UNNEW ungeschützt. Sobald Variable angelegt werden, zerstört sich der Speicherinhalt nach dem BASIC Programm Code.
KILL
Dieser Befehl schaltet ExAss ab und deaktiviert das Modul, sofern das die Modul Hardware unterstützt.
Es werden alle Vektoren auf Standard Belegung zurückgesetzt. Der BASIC Programmcode bleibt erhalten. Die Variablen werden alle gelöscht. Der 8K Speicher wo sich ExAss befindet wird freigegeben, wodurch man wieder 38K freien Speicher hat.
Verbesserte Formelauswertung
Der BASIC Interpreter des C64 hat eine Funktion 'Formelauswertung'. Diese Funktion wird immer aufgerufen, wenn der Interpreter eine Zahl erwartet. Die Formelauswertung im BASIC v2 des C64 umfasst dezimale Zahlen, Variable und die Grundrechnungsarten.
ExAss erweitert die Formelauswertung um
- hexadezimale Zahlen
- binäre Zahlen
- low Byte (niederwertiges Byte)
- high Byte (höherwertiges Byte)
- Labels mit bis zu 16 Zeichen Länge (nur im Assembler)
Hexadezimal Zahlen
Das Basic des C64 rechnet normal nur mit dezimalen Zahlen und Variable. Wenn ExAss gestartet ist, dann kann der C64 alle Rechenoperationen auch mit Zahlen zur Basis 16 (hexadezimal) und 2 (binär) ausführen. Dabei können alle Systeme nach belieben gemischt werden. Dh. man kann überall wo man bisher dezimal Zahlen verwendet hat alternativ auch Hex- oder Binärzahlen verwenden. Das funktioniert im Direktmodus und auch in einem BASIC Programm.
Hexadezimale Zahlen beginnen mit einem '$' Zeichen. Es sind die Ziffern '0' bis '9' sowie die Zeichen 'A' bis 'F' zulässig in hexadezimalen Zahlen. Hexadezimale Zahlen müssen die Länge 2 oder 4 haben. Dieses Zahlensystem ist sehr gebräuchlich bei Assembler Programmierung. Der Vorteil ist, dass jedes Zeichen exakt 4 Bit entspricht. Dadurch kann man es auch sehr einfach in binäre Zahlen umrechnen. Ein 8 Bit Wert hat exakt zwei Stellen und eine 16 Bit Zahl exakt 4 Stellen.
- Zum Beispiel
A = $C144 PRINT $80 PRINT A + $40
Binär Zahlen
Das Basic des C64 rechnet normal nur mit dezimalen Zahlen und Variable. Wenn ExAss gestartet ist, dann kann der C64 alle Rechenoperationen auch mit Zahlen zur Basis 16 (hexadezimal) und 2 (binär) ausführen. Dabei können alle Systeme nach belieben gemischt werden. Dh. man kann überall wo man bisher dezimal Zahlen verwendet hat alternativ auch Hex- oder Binärzahlen verwenden. Das funktioniert im Direktmodus und auch in einem BASIC Programm.
Binären Zahlen wird ein '%' Zeichen vorangestellt. Im binären Zahlensystem gibt es nur die Ziffern 0 und 1. Dieses Zahlensystem ist sinnvoll, wenn man Hardware nahe Dinge programmiert, weil man auf den ersten Blick gut sehen kann, welche Bits auf 0 oder 1 sind.
- Zum Beispiel
PRINT $80 + 44 * %0111
In diesem Beispiel enthält die PRINT Anweisung alle drei Zahlensysteme. Hie wird eine Hexzahl zum Produkt eimer dezimalen Zahl und einer Binärezahl addiert. Man kann die Zahlensysteme beliebig mischen.
Niederwertiges Byte
Diese Funktion berechnet das niederwertige Byte (die unteren 8 Bit) einer 16 Bit Zahl (Integer). Die Funktion startet durch das Zeichen '<' (Kleiner Zeichen) gefolgt vom Zahlen Argument. Das Zeichen muss ganz am Anfang der Formel stehen, sonst funktioniert es als Vergleich (kleiner als ...).
- Zum Beispiel
PRINT <$8322 A = $5222 PRINT <A PRINT <(A + 4)
Höherwertiges Byte
Diese Funktion berechnet das höherwertige Byte (die oberen 8 Bit) einer 16 Bit Zahl (Integer). Die Funktion startet durch das Zeichen '>' (Größer Zeichen) gefolgt vom Zahlen Argument. Das Zeichen muss ganz am Anfang der Formel stehen, sonst funktioniert es als Vergleich (größer als ...).
- Zum Beispiel
PRINT >$8322 A = $5222 PRINT >A PRINT >(A + 4)
Labels
Labels funktionieren wie Zahlen Variable im BASIC. Labels können wie Variable aus Buchstaben und Ziffern bestehen und müssen mit einem Buchstaben beginnen. Allerdings können Labels bis zu 16 Zeichen lang sein und es sind alle Zeichen signifikant (Variable können nur zwei Zeichen lang sein, 'A1' ist dieselbe Variable wie 'A12').
Labels symbolisieren immer 16 Bit Zahlen. Im Gegensatz dazu können Variable in BASIC auch Fließkomma Werte (FLOAT) und Zeichenfolgen (STRING) enthalten.
Labels entstehen nur durch den zwei Pass Assembler beim übersetzen des Assembler Quelltext. Nach dem Übersetzungsvorgang kann man Labels im Direkt Modus verwenden wie Variable. Zum Beispiel kann man den Wert anzeigen lassen mit einem PRINT Befehl.
- Beispiel
PRINT LOOP PRINT BSOUT PRINT CBUFFER SYS START
Auf diese Art und Weise kann man herausfinden, an welcher Adresse der Assembler den Code und die Daten gespeichert hat.
Mini Monitor
Sonstige Dinge
Funktionstasten
Die Funktionstasten F1 bis F8 unterstützen die Arbeit im Direktmodus (Eingabe Editor). Mit den Funktionstasten kann man zeilenweise durch den BASIC Text auf und ab scrollen (funktioniert auch für dumps und code listings im Minimonitor), automatische Zeilennummerierung durchführen, Löschfunktionen (Zeilenende/Bildschirmende) auslösen, angezeigte Seite erneuern und mehrere Zeilen blättern.
- F1
- Listing eine Zeile nach unten scrollen
- ExAss sucht von unten nach oben nach einer Zeilennummer oder Adresse.
- F2
- Listing eine Zeile nach oben scrollen
- ExAss sucht von oben nach unten nach einer Zeilennummer oder Adresse.
- F3
- Listing erneuern über die ganze Seite, Startzeile ist erste Zeile am Schirm
- ExAss sucht von unten nach oben nach einer Zeilennummer oder Adresse.
- Tip: Wenn man zB. eine Zeile dupliziert im BASIC Text, ist dieser Befehl besonders nützlich
- F4
- Listing erneuern über die ganze Seite, Startzeile ist aktuelle Zeile (Cursor Zeile)
- ExAss sucht von oben nach unten nach einer Zeilennummer oder Adresse.
- ZB. wenn man immer nur 5 Zeilen weiter gehen möchte
- ZB. wenn eine bestimmte Zeile ganz oben sein soll, damit man einen bestimmten Bereich des Listings sieht
- F5
- Auto Zeilen Nummerierung
- Die aktuelle Zeile wird gespeichert (wie bei Return), und die aktuelle Zeilennummer plus 5 wird vorgeschlagen
- F6
- Bewegt den Cursor an das Ende der Zeile
- F7
- löscht alle Zeichen von der Cursor Position bis zum Ende der Zeile
- F8
- löscht alle Zeilen von der Cursor Position bis zum Ende des Bildschirm
Die List Funktionen (F1,F2,F3,F4) funktionieren mit BASIC Textzeilen aber auch mit Listings des Mini Monitor (Disassembler, Memory Dump).
Beginnt eine Zeile mit einer Zahl, dann handelt es sich um BASIC Textzeile (Zeilennummer). Beginnt eine Zeile mit ';' gefolgt von einer Zahl, dann handelt es sich um einen Speicherdump oder Assembler Listing.
Tastatur Klick
Jeder Tastendruck wird akustisch mit einem Klickgeräusch quittiert.