!!!6502 Programmieren - Teil 2

!von R. Wilde

Hallo Leute !
Diesmal also der zweite Teil des Maschinensprache – Lehrganges.

Zuerst einmal eine Klarstellung: Dieser Lehrgang an sich ist kein Maschinensprache -Lehrgang, sondern vielmehr ein Assembler - Lehrgang. Denn die Maschinensprache besteht nur aus Zahlen, die der Prozessor als Befehle versteht.

Da der Programmierer mit diesen Zahlen nicht viel anfangen kann, werden diese durch einen Assembler mit jeweils drei Buchstaben dargestellt, die wiederum die Abkürzungen für die englischen Beschreibungen sind.

Ich beginne mit der Zusammenfassung aller Maschinenbefehle. Am Anfang eines Absatzes steht die Prozessor-Anweisung, dahinter die englische Bezeichnung. In dem Absatz darunter steht die Beschreibung der Funktion. In Klammern darunter sind die Flags des Prozessor-Status Registers und die Register angegeben, die durch den jeweiligen Befehl verändert werden. Dabei stehen die Buchstaben für folgende Flag's
bzw. Register :

N = Negativ-Flag\\
V = Overflow-(Überlauf) Flag\\
B = Break-Flag\\
D = Dezimal-Flag\\
I = Interrupt-Flag\\
Z = Zero- (Null) Flag\\
C = Carry-Flag\\
 \\
P = Prozessor-Status Register\\
PC = Programmzähler\\
S = Status-Register\\

!ADC - Add Memory to ACCU with Carry
Zu dem Wert im ACCU soll ein fester Wert oder der Wert in einer Speicherstelle
addiert werden. War das Carry-Flag gesetzt, wird noch eine 1 hinzugezählt. Ist das
Gesamtergebnis größer als 255 wird das Carry-Flag gesetzt, sonst ist es = 0. Das
Ergebnis steht im ACCU.\\
(NVZC)

!AND - AND Memory with ACCU
Der Wert im ACCU wird mit einem festen Wert oder mit dem Wert in einer Speicherstelle logisch UND verknüpft. Das Ergebnis steht im ACCU.\\
(NZ)

!ASL – Arithmentic Shift Left 1 Bit ACCU or Memory
ACCU oder Speicherstelle bitweise eine Stelle nach links schieben. Bit 7 wird dabei ins Carry-Flag übernommen. Bit 0 wird = 0 gesetzt.\\
(NZC)

!BCC - Branch on Carry Clear
Verzweige, wenn das Carry-Flag nicht gesetzt ist.

!BCS - Branch on Carry Set
Verzweige, wenn das Carry-Flag gesetzt ist.

!BEQ - Branch on Equal
Verzweige, wenn das Zero-Flag gesetzt ist.

!BIT - Test Bits in Memory with ACCU
Bit 6 und 7 eines angegebenen Wertes oder des Wertes in einer Speicherstelle werden in das Status-Register der CPU übernommen. Gleichzeitig wird eine UND-Verknüpfung vorgenommen. Ist das Ergebnis = 0 wird das Zero-Flag der CPU gesetzt, ansonsten gelöscht. Es wird nur der Wert im Status-Register der CPU verändert.\\
(NVZ)

!BMI - Branch on Minus
Verzweige, wenn das Negativ-Flag im Status-Register der CPU gesetzt ist.

!BNE - Branch if not Equal
Verzweige, wenn das Zero-Flag nicht gesetzt ist.

!BPL - Branch on Plus
Verzweige, wenn das Negativ-Flag nicht gesetzt ist.

!BRK - Break, Force Interrupt
Stößt der Prozessor auf eine Break-Anweisung wird das Interrupt-Flag der CPU gesetzt und der Prozessor führt eine Interrupt-Routine aus, deren Anfangsadresse in den Speicherstellen $FFFE/$FFFF steht.\\
(BI)

!BVC - Branch on Overflow Clear
Verzweige, wenn das Overflow (Überlauf) Flag nicht gesetzt ist.

!BVS - Branch on Overflow Set
Verzweige, wenn das Overflow (Überlauf) Flag gesetzt ist.

!CLC - Clear Carry-Flag
Setze das Carry-Flag = 0.\\
(C)

!CLD - Clear Dezimal-Flag
Setze das Dezimal-Flag = 0.\\
(D)

!CLI - Clear Interrupt-Flag
Setze das Interrupt-Flag = 0.\\
(I)

!CLV - Clear Overflow-Flag
Setze das Overflow (Überlauf) Flag = 0.\\
(V)

!CMP - Compare ACCU with Memory
Vergleiche den Wert im ACCU mit einem festen Wert oder dem Wert in einer Speicherstelle. Das Status-Register der CPU wird entsprechend gesetzt.\\
(NZC)

!CPX - Compare X-Register with Memory
Vergleiche den Wert im X-Register mit einem angegebenen Wert oder dem Wert in einer Speicherstelle. Das Status-Register der CPU wird entsprechend gesetzt.\\
(NZC)

!CPY - Compare Y-Register with Memory
Vergleiche den Wert im Y-Register mit einem festen Wert oder dem Wert in einer Speicherstelle. Das Status-Register der CPU wird entsprechend gesetzt.\\
(NZC)

!DEC - Decrement Memory by One
Zähle den Wert einer Speicher- stelle um 1 herab.\\
(NZ)

!DEX - Decrement X-Register by One
Zähle den Wert im X-Register um 1 herab.\\
(NZ)

!DEY - Decrement Y-Register by One
Zähle den Wert im Y-Register um 1 herab.\\
(NZ)

!EOR - Exclusive OR ACCU with Memory
Führe ein exklusives OR mit dem Wert im ACCU und einem angegebenen Wert oder dem Wert in einer Speicherstelle aus. Das Ergebnis steht im ACCU.\\
(NZ)

!INC - Increment Memory by One
Zähle den Wert einer Speicherstelle um 1 herauf.\\
(NZ)

!INX - Increment X-Register by One
Zähle den Wert im X-Register um 1 herauf.\\
(NZ)

!INY - Increment Y-Register by One
Zähle den Wert im Y-Register um 1 herauf.\\
(NZ)

!JMP - Jump to new Location
Führe das Programm bei der angegebenen Adresse fort. Das Status-Register der CPU wird nicht verändert.\\
(PC)

!JSR - Jump to Subroutine
Die Adresse dieser Anweisung (Wert im Programmzähler -PC-) wird auf den Stack geschoben und ein Unterprogramm, dessen Adresse angegeben ist, ausgeführt. Das Status-Register der CPU wird nicht verändert.\\
(PC S)

!LDA - Load ACCU with Memory
Lade den Accu mit einem angegebenen Wert oder dem Wert in einer Speicherstelle.\\
(NZ)

!LDX - Load X-Register with Memory
Lade das X-Register mit einem angegebenen Wert oder dem Wert in einer Speicherstelle.\\
(NZ)

!LDY - Load Y-Register with Memory
Lade das Y-Register mit einem angegebenen Wert oder dem Wert in einer Speicherstelle.\\
(NZ)

!LSR – Logical Shift Right 1 Bit ACCU or Memory
ACCU oder Speicherstelle bitweise eine Stelle nach rechts schieben. Bit 0 wird dabei ins Carry-Flag übernommen. Bit 7 wird = 0 gesetzt.\\
(NZC)

!NOP - No Operation
Anweisung ohne Funktion. Dieser Befehl dient z.B. dem Freihalten von
Speicherstellen oder einer kurzen Verzögerung (2 Zyklen) der nachfolgenden Anweisungen.

!ORA - OR ACCU with Memory
Logische ODER-Verknüpfung des ACCU mit einem angegebenen Wert oder dem Wert in einer Speicherstelle. Das Ergebnis steht im ACCU.\\
(NZ)

!PHA - Push ACCU on Stack
Der Wert des ACCU's wird in der Speicherstelle des Stack abgelegt, auf die der Stapelzeiger zeigt. Anschließend wird der Stapelzeiger um 1 abgezählt.\\
(S)

!PHP - Push Processor-Status on Stack
Der Wert im Status-Register der CPU wird in der Speicherstelle des Stack abgelegt, auf die der Stapelzeiger zeigt. Danach wird der Stapelzeiger um 1 abgezählt.\\
(S)

!PLA - Pull ACCU from Stack
Der Stapelzeiger wird um 1 erhöht und der Wert der Speicherstelle des Stack's, auf die der Stapelzeiger zeigt, wird in den ACCU übernommen.\\
(NZ S)

!PLP - Pull Processor-Status from Stack
Der Stapelzeiger wird um 1 erhöht und der Wert der Speicherstelle des Stack's, auf die der Stapelzeiger zeigt, wird in das Prozessor-Status Register übernommen.\\
(NVBDIZC S)

!ROL - Rotate Left 1 Bit ACCU or Memory
ACCU oder Speicherstelle bitweise eine Stelle nach links schieben. Das Carry-Flag wird dabei in Bit 0 und Bit 7 in das Carry-Flag geschoben.\\
(NZC)

!ROR - Rotate Right 1 Bit ACCU or Memory
ACCU oder Speicherstelle bitweise eine Stelle nach rechts schieben. Das Carry-Flag wird dabei in Bit 7 und Bit 0 ins Carry-Flag geschoben.\\
(NZC)

!RTI - Return from Interrupt
Kehre aus einer Interrupt-Routine zu der Stelle zurück, an der ein Programm durch den Interrupt unterbrochen wurde. Zu diesem Zweck wird zuerst der Wert des Prozessor-Status Registers, dann die Werte für den Programmzähler vom Stack zurückgeholt.\\
(NVBDIZC PC S)

!RTS - Return from Subroutine
Kehre aus einem Unterprogramm zu der Stelle zurück, an der das Unterprogramm aufgerufen wurde. Dazu werden die Werte für den Programmzähler vom Stack geholt und um 1 erhöht.\\
(PC S)

!SBC - Subtract Memory from ACCU with Carry
Zähle einen festen Wert oder den Wert einer Speicherstelle vom Inhalt des ACCU's unter Berücksichtigung des Carry-Flag ab. Das Ergebnis befindet sich im ACCU.\\
(NVZC)

!SEC - Set Carry-Flag
Setze das Carry-Flag innerhalb des Prozessor-Status Registers auf 1.\\
(C)

!SED - Set Decimal-Flag
Setze das Dezimal-Flag innerhalb des Prozessor-Status Registers auf 1.\\
(D)

!SEI - Set Interrupt-Flag
Setze das Interrupt-Flag im Prozessor-Status Register auf 1. Eine mögliche Interrupt Anforderung (IRQ) wird gesperrt.\\
(I)

!STA - Store ACCU in Memory
Lege den Inhalt des ACCU's in der angegebenen Speicherstelle ab.

!STX - Store X-Register in Memory
Lege den Inhalt des X-Registers in der angegebenen Speicherstelle ab.

!STY - Store Y-Register in Memory
Lege den Inhalt des Y-Registers in der angegebenen Speicherstelle ab.

!TAX – Transfer ACCU to X-Register
Kopiere den Inhalt des ACCU´s in das X-Register. Der Wert vom ACCU bleibt unverändert.\\
(NZ)

!TAY – Transfer ACCU to X-Register
Kopiere den Inhalt des ACCU´s in das Y-Register. Der Wert vom ACCU bleibt unverändert.\\
(NZ)

!TSX – Transfer S-Register in X-Register
Kopiere den Inhalt des Stapelzeigers in das X-Register. Der Wert im Stapelzeiger bleibt unverändert.\\
(NZ)

!TXA - Transfer X-Register to ACCU
Kopiere den Inhalt des X-Registers in den ACCU. Der Wert des X-Registers bleibt unverändert.\\
(NZ)

!TXS - Transfer X-Register to Stack-Pointer
Kopiere den Inhalt des X-Registers in den Stapelzeiger. Der Wert des X-Registers bleibt unverändert.\\
(S)
!TYA - Transfer Y-Register to ACCU
Kopiere den Inhalt des Y-Registers in den ACCU. Der Wert des Y-Registers bleibt unverändert.\\
(NZ)

Ein ziemlich trockenes Thema, das muss ich zugeben. Aber das ist NUR die Zusammenfassung der Maschinenbefehle (Assemblerbefehle) an sich. Dazu kommen noch die Adressierungsarten, die ich Euch aber erst (Danke, danke, danke !?) in der nächsten Ausgabe des Magazins zumuten möchte.

Unter dem Titel "Opcode-Printer" findet Ihr noch ein Basic-Programm, das auf EPSON-Kompatiblen Druckern eine übersichtliche Liste der Maschinenbefehle und den Adressierungsarten ausdruckt, die wohl jeder ernsthafte Maschinensprache-Programmierer gut gebrauchen kann.
[{Image src='MLBefehle.jpg' }]


Bis zum nächsten Mal, Euer R. Wilde.\\
CSM / 7.1988
----
Der Artikel entstammt der Kursreihe „6502 Programmieren“ des Compy Shop Diskettenmagazins. Die Kursreihe besteht aus 14 Kursen, die im Laufe des Jahres 2011 in unregelmäßigen Abständen einzeln veröffentlicht werden, bzw. anschließend als Zusammenzug als ABBUC-Buch „6502 Programmieren“ erscheinen.\\ 
Koordination: Volkert Barr (volkert@nivoba.de)\\
Version 1.1 / 2011-01-15