Die Befehle des 6510
Diese Seite dient zum Nachschlagen der MnemonicsErklärungSo werden die Assemblerbefehle genannt..
Hier gibt es häufiger TooltippsZusätzliche Hinweise findet ihr in den Tooltipps., die euch zusätzliche Informationen geben, sobald ihr mit der Maus drüberfahrt.
Für den schnellen Blick zwischendurch gibt es auch eine Quickview.
Hier direkte Links zu den Tabellen auf dieser Seite:
- Übersicht der Adressierungsarten
- Ladebefehle
- Speicherbefehle
- Transferbefehle
- Rechenbefehle
- Rotations- & Verschiebebefehle
- Boolschebefehle
- Vergleichsbefehle
- Sprungbefehle
- Stackbefehle
- Flag-Befehle
- Restliche Befehle
- Illigale OpCodes
Liste der Mnemonics
- Mnemonic: Das lesbare Befehlskürzel für die OpCodes.
- Beschreibung: Kurze Infos, was der Befehl genau macht.
- OpCode: Byte das den Befehl eindeutig identifiziert. Der Link führt zur Stelle mit einer ausführlichen Erklärung.
- Adressierung / Info: Hinweis wie der Befehl verwendet wird.
- Taktzyklen: Die Befehle benötigen unterschiedlich viel Zeit, um von der CPU ausgeführt zu werden. Diese Zeit wird in Taktzyklen angegeben. Da unser 6510 mit ca. 1MHz läuft, beträgt die Zeit für einen Taktzyklus auf einem PAL-Rechner 1Sek. / 985248 = 1,015µs (bei NTSC 0,978µs). Wir können uns also einfach merken, dass ein Takt ca. eine millionstel Sekunde (1µs) lang ist.
- Bytes: Speicherbedarf des Befehls. Je nach Befehl und Adressierung wird unterschiedlich viel Speicher benötigt.
- NV-BDIZC: Welche Flags werden vom Befehl beeinflusst.
Negativ, oVerflow, – (immer 1), Break, Decimal, Interrupt, Zero und Carry
Mit den Angaben der benötigten Bytes und der Takzyklen (Spalte TZ), könnt ihr also schon „auf dem Papier“ ermitteln, wie groß euer Programm ist und wie viel Zeit einzelne Teile (oder auch das ganze Programm) brauchen, um verarbeitet zu werden.
Ladebefehle
Speicherbefehle
Transferbefehle
Mnemonic | Beschreibung | OpCode | Adressierung | Bytes | TZ | NV-BDIZC |
---|---|---|---|---|---|---|
TAXTransfer Akku to X-Register | Akku ins X-Register kopieren | implizitDen Inhalt des Akkumulator in das X-Register kopieren. | 1 | 2 | N Z |
|
TXATransfer X-Register to Akku | X-Register in den Akku kopieren | implizitDen Inhalt des X-Registers in den Akkumulator kopieren. | 1 | 2 | N Z |
|
TAYTransfer Akku to Y-Register | Akku ins Y-Register kopieren | implizitDen Inhalt des Akkumulator in das Y-Register kopieren. | 1 | 2 | N Z |
|
TYATransfer Y-Register to Akku | Y-Register in den Akku kopieren | implizitDen Inhalt des Y-Registers in den Akkumulator kopieren. | 1 | 2 | N Z |
|
TSXTransfer SP to X-Register | Stackpointer ins X-Register kopieren | implizitDen Inhalt des Stackpointers (SP) in das X-Register kopieren. | 1 | 2 | N Z |
|
TXSTransfer X-Register to SP | X-Register in den Stackpointer kopieren | implizitDen Inhalt des X-Registers in den Stackpointer (SP) kopieren. | 1 | 2 |
Rechenbefehle
Rotations- / Verschiebebefehle
Boolschebefehle
Vergleichsbefehle
Sprungbefehle
Stackbefehle
Mnemonic | Beschreibung | OpCode | Adressierung | Bytes | TZ | NV-BDIZC |
---|---|---|---|---|---|---|
PHAPusH Akku on stack | Akku-Inhalt auf den Stack legen | implizitKopiert den Akku auf den Stack | 1 | 3 | ||
PHPPusH Processor statusregister on stack | Statusregister auf den Stack legen | implizitKopiert das Statusregister (SR) auf den Stack | 1 | 3 | ||
PLAPuLl Akku from stack | Akku-Inhalt vom Stack holen | implizitKopiert das Byte von der aktuellen Stackposition in den Akku | 1 | 4 | N Z |
|
PLPPuLl Processor status from stack | Statusregister vom Stack holen | implizitSetzt die Flags im Statusregister (SR) mit den Bits aus dem Byte von der aktuellen Stackposition | 1 | 4 | ALLE! |
Flag-Befehle
Mnemonic | Beschreibung | OpCode | Adressierung | Bytes | TZ | NV-BDIZC |
---|---|---|---|---|---|---|
CLCCLear Carry | Carry-Flag auf 0 setzen | $18 | implizitDas Carry-Flag auf 0 setzen. | 1 | 2 | C |
CLDCLear Decimal | Decimal-Flag auf 0 setzen | $D8 | implizitDas Decimal-Flag auf 0 setzen. | 1 | 2 | D |
CLICLear Interrupt-Flag | Interrupt-Flag auf 0 setzen | $58 | implizitUm Interrupts wieder zu erlauben, I-Flag auf 0 setzen. | 1 | 2 | I |
CLVCLear oVerflow-Flag | Overflow-Flag auf 0 setzen | $B8 | implizitDas V-Flag wieder auf 0 setzen. | 1 | 2 | V |
SECSEt Carry | Carry-Flag auf 1 setzen | $38 | implizitDas Carry-Flag auf 1 setzen. | 1 | 2 | C |
SEDSEt Decimal | Decimal-Flag auf 1 setzen | $F8 | implizitDas Decimal-Flag auf 1 setzen. | 1 | 2 | D |
SEISEt Interrupt-Flag | Interrupt-Flag auf 1 setzen | $78 | implizitUm Interrupts zu verhindern, I-Flag auf 1 setzen. | 1 | 2 | I |
Restliche Befehle
Mnemonic | Beschreibung | OpCode | Adressierung | Bytes | TZ | NV-BDIZC |
---|---|---|---|---|---|---|
BRKBReaK | Software-Interrupt auslösen | implizit | 1 | 7 | B I |
|
NOPNo OPeration | Nichts machen | implizit | 1 | 2 |
Illigale-OpCodes (undokumentierte Befehle)
Übersicht der Adressierungsarten
Wie die Befehle ihre benötigten Werte finden, wo sie etwas ablegen sollen oder wohin sie springen, wird durch die sog. Adressierung angegeben. In der nachfolgenden Liste sind alle möglichen Adressierungsarten aufgeführt. Die Befehle dienen nur als Beispiel, es gibt natürlich verschiedene Befehle mit der jeweiligen Adressierungsart, aber es sind längst nicht alle Adressierungsarten mit jedem Befehl, in jeder Kombination möglich. Was machbar ist findet ihr oben in der Tabelle mit den Mnemonics. Da ein Befehl immer ein Byte benötigt, könnt ihr schon an der Adressierungsart den Speicherbedarf des jeweiligen Befehls erkennen (s. Spalte Bytes).
Der Link beim Befehl führt zur ersten Stelle im Blog, an der diese Adressierungsart verwendet und erklärt wurde.
Adressierungsarten
Adressierung | Beispiel | Beschreibung | Bytes |
---|---|---|---|
unmittelbar (direkt) | LDA #$3A | Bei der unmittelbaren Adressierung, wird direkt ein fester Wert (hier #$3A) als Parameter übergeben. Dieser Wert wird dann vom Befehl entsprechend verarbeitet. | 2 |
absolut | LDA $082D | Bei der absoluten Adressierung, wird eine 16-Bit Speicheradresse (hier $082D) als Parameter übergeben. Der Befehl bezieht sich einfach auf die angegebenen Speicherstelle. | 3 |
absolut X-indiziert | LDA $082D,X | Bei der mit X-indizierten absoluten Adressierung, wird neben der 16-Bit Speicheradresse (hier $082D) noch das X-Register als Parameter angeben. Die Speicherstelle, auf die sich der Befehl bezieht, wird errechnet, indem man zur angegeben Adresse noch den Inhalt des X-Registers addiert. | 3 |
absolut Y-indiziert | LDA $082D,Y | Bei der mit Y-indizierten absoluten Adressierung, wird neben der 16-Bit Speicheradresse (hier $082D) noch das Y-Register als Parameter angeben. Die Speicherstelle, auf die sich der Befehl bezieht, wird errechnent, indem man zur angegeben Adresse noch den Inhalt des Y-Registers addiert. | 3 |
Zero-Page | LDA $FB | Bei der Zero-Page-Adressierung, wird eine 8-Bit Speicheradresse (hier $FB) als Parameter angeben. Der Befehl bezieht sich einfach auf die angegebene Zero-Page-Adresse. | 2 |
Zero-Page X-indiziert | LDA $FB,X | Bei der mit X-indizierten Zero-Page-Adressierung, wird neben der 8-Bit Speicheradresse (hier $FB) noch das X-Register als Parameter übergeben. Der Befehl bezieht sich auf die Speicherstelle, die sich durch Addition der übergebenen Zero-Page-Adresse mit dem X-Register ergibt. | 2 |
Zero-Page Y-indiziert | LDX $FB,Y | Bei der mit Y-indizierten Zero-Page-Adressierung, wird neben der 8-Bit Speicheradresse (hier $FB) noch das Y-Register als Parameter übergeben. Diese Adressierung gibt es nur beim LDX- und STX-Befehl. Der Befehl bezieht sich auf die Speicherstelle, die sich durch Addition der übergebenen Zero-Page-Adresse mit dem Y-Register ergibt. | 2 |
indirekt | JMP ($0821) | Bei der indirekten Adressierung, wird eine 16-Bit Speicheradresse als Parameter übergeben. Die dort zu findene Adresse wird als Sprungziel verwendet. Diese Adressierung gibt es nur beim JMP-Befehl! | 3 |
indirekt X-indiziert | LDA ($FB,X) | Bei der X-indizierten indirekten Adressierung, werden eine 8-Bit Speicheradresse (Zero-Page) und das X-Register als Parameter übergeben. Die Adresse berechnet sich wie folgt: Zur übergebenen Zero-Page-Adresse wird zunächst der Inhalt des X-Registers addiert, der Befehl bezieht sich dann auf die dort zufindene Adresse. | 2 |
indirekt Y-nach-indiziert | LDA ($FB),Y | Bei der indirekten Y-nach-indizierten Adressierung, werden eine 8-Bit Speicheradresse (Zero-Page) und das Y-Register als Parameter übergeben. Die Berechnung der Adresse, auf die sich der Befehl bezieht, geschieht so: Es wird die Adresse, die an der angegebenen Zero-Page-Adresse zu finden ist, mit dem Inhalt des Y-Registers addiert und schon weiß der Befehl worauf er sich beziehen soll. | 2 |
relativ | BNE $0821 | Bei der relativen Adressierung (gibt es nur bei den acht bedingten Sprüngen), wird eine 16-Bit Speicheradresse als Parameter übergeben. Der Assembler rechnet daraus die Entfernung als vorzeichenbehaftetes Byte aus und speichert intern nur die Sprungweite. Daher darf das Ziel nicht weiter als -128 bzw. +127 Bytes entfernt liegen. | 2 |
implizit | DEX | Bei der impliziten Adressierung beinhaltet der Befehl bereits die Adresse, auf die er sich auswirkt. Daher wird hier kein Parameter angegeben. | 1 |
Akkumulator | LSR | Diese Adressierung ist eigentlich genau wie die implizite, allerdings ist das Ziel immer der Akku. Es gibt sie nur bei vier Befehlen (ASL, LSR, ROL und ROR). Die Besonderheit gegenüber der impliziten Adressierung ist, das alle Befehle mit impliziter Adressierung nur diese Adressierungsart kennen, die oben erwähnten vier Befehle besitzen auch noch andere Adressierungsarten. | 1 |
Ich denke, die Adressierung von JSR $080 ist nicht implizit, den die Adresse steht ja direkt nach dem Befehl, sondern absolut (wie bei JMP).
Oder?
Richtig, habe es eben korrigiert.
Danke für den Hinweis.
kannst du die Farbe der gelben infoboxen auf von weiß auf schwarz machen?
Danke für den Hinweis.
Das war nicht immer so, leider gibt es beim Plug-In keine Einstellungen für die Farben.
Da bleibt mir nur das manuelle Anpassen des CSS, kann aber nichts versprechen.
DANKE noch mal für deine Arbeit durch dich bin ich zum Assemblerprofi geworden und ich habe eine menge spaß damit PS.
https://www.retro-programming.de/wp-content/plugins/easy-tooltip/css/easy-tooltip.css?ver=1.0.0
kannst du die zeile
color:black;
bei
.easy-tooltip span (css) hinzufügen
dann geht es auch wieder mit der Farbe
ich mach mich dann wieder ans programmieren für den C64
schau Jörn
Danke für den Hinweis, habe es eben geändert, jetzt sollten die Tooltips wieder besser lesbar sein.