VolksForth 6502 Assembler#

(work in progress, translation pending)

Source: 6502 Assembler

See also: 6502 Assembler in Forth

tab content 1

Der 6502-Assembler#

Im folgenden werden die Konzepte des 6502-Assemblers für VolksForth dargestellt. Es wird kein vollständiges Glossar angegeben, da die Mnemonics des Assemblers allen Maschinensprache-Programmierern vertraut sein dürften. Eine genaue Darstellung der Funktionsweise findet sich in den FORTH DIMENSIONS, Vol III,5 p. 143ff . Im folgenden wird eine kurze Zusammenfassung angegeben sowie Änderungen gegenüber dem Original dargestellt.

Die Funktionsweise des Adressinterpreters sowie der Routine NEXT wird in Kapitel 2 des VolksForth Handbuch dargestellt. Der 6502-Assembler gestattet strukturierte Programmierung. Die Strukturelemente sind analog zu den Kontrollstrukturen des Forth aufgebaut, tragen jedoch andere Namen, um die Verwechselungsgefahr zu verringern und die Übersichtlichkeit zu erhöhen.

Ein Beispiel:

cc ?[ <ausdruck1> ][ <ausdruck2> ]? 
cc steht fur "condition code" . <ausdruck1> wird ausgeführt, wenn cc zutrifft, andernfalls <ausdruck2>. Der Teil
][ <ausdruck2>
kann auch weggelassen werden. Das Analogon in Forth ist IF ELSE ... THEN

Beachten Sie bitte, das vor ?[ immer(!) ein conditioncode stehen muß. Außerdem findet keine Prüfung auf korrekte Verschachtelung der Kontrollstrukturen statt.

Weitere Kontrollstrukturen sind:

[[ <ausdruck1> cc ?[[ <ausdruck2> ]]? 
[[ <ausdruck1> cc ?] 
[[ <ausdruck1> ]]

Die analogen Ausdrucke in Forth sind:

BEGIN <ausdruck1> WHILE <ausdruck2> REPEAT
BEGIN <ausdruckl> UNTIL 
BEGIN <ausdruck1> REPEAT
Auch hier darf bei den Assemblerworten cc nicht weggelassen werden. Außerdem ist nur genau ein ?[[ zwischen [[ und ]]? zulässig. Beachten Sie bitte auch den Unterschied zwischen ]] und ]]? !

Als condition code sind zulässig:

0= 0<> 0< 0>= CS CC VS VC

Sie konnen den Prozessor-Flags Z N C und V zugeordnet werden. Im ersten Beispiel wird also <ausdruck1> ausgeführt , wenn cc durch 0= ersetzt wird und das Z-Flag gesetzt ist. Jeden der condition codes kann man durch ein folgendes NOT erweitern, also z.B.:

0= NOT ?[ 0 # lda ]?

Neben allen anderen Opcodes mit ihren Adressierungsarten gibt es auch die Sprünge BCC, BCS usw. Sie sind nur in der Adressierungsart "Absolut" zulässig, d.h. auf dem Stack befindet sich die Adresse des Sprungzieles. Liegt diese Adresse außerhalb des moglichen Bereiches, so wird die Fehlermeldung "out of range" ausgegeben.

Für die anderen Opcodes sind, je nach Befehl, die folgenden Adressierungsarten zulassig:

.A 
#
.X
,Y
X)
)Y
)
Die Adressierungsart "Absolut" wird verwendet, wenn keine andere angegeben wurde. Wird mit einem Mnemonic eine nicht erlaubte Adressierungsart verwendet, so wird die Fehlermeldung "invalid" ausgegeben.

Beispiele für die Verwendung des 6502-Assemblers (zur Erläuterung wird die herkömmliche Notation hinzugefügt):

.a rol         -> rol a 
1 # ldy        -> ldy #1
data ,X  sta   -> sta data,x
$6 x) adc      -> adc ($6,x)
vector )y lda  -> lda (vector),y
vector ) jmp   -> jmp (vector)

Zusatzlich enthalt das System noch mehrere Macros, die alle nur "Absolut" adressieren konnen:

winc #

Inkrementiert einen 16-Bit-Zeiger um 1. wdec dekrementiert analog.

2inc#

Inkrementiert einen 16-Bit-Zeiger um 2. 2dec dekrementiert analog.

;c: #

Schaltet den Assembler ab und den Forth-Compiler an Damit ist es möglich, von Maschinencode in Forth überzuwechseln. Ein Gegenstuck ist nicht vorhanden.

Ein Beispiel für die Verwendung von ;C: ist:

... 0< ?[ ;c: ." Fehler" ; Assembler ]? ...