Statusregister

Aus C64-Wiki
(Weitergeleitet von Zero-Flag)
Zur Navigation springenZur Suche springen

Das Statusregister, auch Flaggenregister genannt, ist ein 8-Bit-Register innerhalb der CPU.
Die einzelnen Bits dieses Registers werden auch Flags (Flaggen) genannt.
Der Befehl PHP sichert das Register am Stapel und mit PLP kann das Register von dort wieder hergestellt werden.

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
N V 1 B D I Z C

Carry-Flag[Bearbeiten | Quelltext bearbeiten]

Das Carry-Flag (C-Flag), auch Übertrags-Bit genannt, wird zum Großteil bei arithmetischen Operationen verwendet.
Ist das Ergebnis z.B. bei einer Addition größer als 255 ($FF), wird das Carry-Flag als Übertrags-Bit mit der Wertigkeit von 256 verwendet, im Falle der Subtraktion als negierte Form des (bei anderen Prozessoren bekannten) Borrow-Bits.[1]
(siehe z.B. ADC $hhll oder SBC $hhll)
Mit dem Befehl SEC wird das Carry-Flag gesetzt, mit CLC wieder gelöscht.
Die Befehle BCS $hhll und BCC $hhll können das Carry-Flag gezielt abfragen.
Liste der Assembler-Befehle, die das Carry-Flag beeinflussen können.

Zero-Flag[Bearbeiten | Quelltext bearbeiten]

Die CPU prüft nach fast jeder Operation, ob das Ergebnis den Wert $00 hat.
Das Zero-Flag (Z-Flag) wird in diesem Fall gesetzt (1).
Bei einer Abweichung von Null bleibt die Flagge gestrichen (0).
Die Befehle BEQ $hhll und BNE $hhll können das Zero-Flag gezielt abfragen.
Liste der Assembler-Befehle, die das Zero-Flag beeinflussen können.

Interrupt-Flag[Bearbeiten | Quelltext bearbeiten]

Das Interrupt-Flag (I-Flag) ist ein Sperr-Bit, um Unterbrechungen (Interrupts) zu unterbinden bzw. zuzulassen.
Der Befehl SEI setzt das Interrupt-Flag und unterbindet alle Interrupts bis auf den NMI.
Mit dem Befehl CLI wird diese Sperre wieder aufgehoben.
Liste der Assembler-Befehle, die das Interrupt-Flag beeinflussen können.

Decimal-Flag[Bearbeiten | Quelltext bearbeiten]

Normalerweise ist das Decimal-Bit (D-Flag) gelöscht und Additionen und Subtraktionen werden binär auf dem Akkumulator durchgeführt. ($05+$05=$0a)
Ist das Decimal-Bit jedoch gesetzt, wird ein Byte im Akku als Binary Coded Decimal-Wert (BCD) betrachtet. In diesem Modus steht das High- und das Low-Nibble eines Bytes für jeweils eine Dezimalziffer ($05+$05=$10). Der darstellbare Wertebereich im Akkumulator erstreckt sich somit von 00 bis 99.
Mit dem Befehl SED wird das Decimal-Flag gesetzt, mit CLD wieder gelöscht.
Nach dem Einschalten der CPU, ist das D-Flag in einem undefinierten Zustand und sollte entsprechend gesetzt bzw. gelöscht werden, damit folgende Additionen und Subtraktionen auch tatsächlich wie gewünscht rechnen.
Liste der Assembler-Befehle, die das Decimal-Flag beeinflussen können.

Break-Flag[Bearbeiten | Quelltext bearbeiten]

Mit dem Befehl BRK wird ein Softwareinterrupt ausgelöst, der das Statusregister mit gesetztem Break-Flag (B-Flag) auf dem Prozessorstapel ablegt, im Gegensatz zu Hardwareinterrupts, die das Statusregister mit gelöschtem Break-Flag dort ablegen.
Im Statusregister selbst ist dieses Bit dagegen ohne Funktion und immer gesetzt. Um herauszufinden, ob ein Interrupt per Hardware oder Software ausgelöst wurde, muss das Bit daher nach einer Unterbrechungsanforderung in der auf dem Stapel abgelegten Kopie des Statusregisters untersucht werden.
Das Break-Flag wird auch Abbruchflagge genannt.
Liste der Assembler-Befehle, die das Break-Flag beeinflussen können.

Expansion-Bit[Bearbeiten | Quelltext bearbeiten]

Dieses Bit ist unbenutzt und ist immer gesetzt (1).

Overflow-Flag[Bearbeiten | Quelltext bearbeiten]

Das Overflow-Flag (V-Flag) hat mehrere Funktionen:

  1. Bei den Befehlen ADC und SBC dient es zur Feststellung eines Wertebereichüberlaufs bei vorzeichenbehafteten Zahlen. Ist das V-Flag nach einer Operation mit vorzeichenbehafteten Zahlen gesetzt, so zeigt es an, dass das Ergebnis außerhalb der dafür verwendeten Zweierkomplementdarstellung liegt (z.B. außerhalb des Bereichs -128 bis 127 bei 8-Bit).
    Beispiel: LDA #$7F und ein nachfolgendes ADC #$02 überschreitet den positiven Bereich bzw. wechselt vom positiven in den negativen Bereich. Das V-Flag wird somit gesetzt.
  2. Nach Ausführung des BIT-Befehls (BIT $hhll, BIT $ll) enthält das V-Flag Bit 6 des getesteten Bytes.
  3. In manchen Versionen des 6502-Prozessors kann das V-Flag durch externe Hardware über den SO-Pin (Set Overflow) gesetzt werden. Dies wird beispielsweise in der 1541-Floppy genutzt. Die CPU MOS 6510 des C64 besitzt diesen Pin nicht.

Während nur obige Befehle das Flag setzen können, gibt es für das direkte Löschen den Befehl CLV.
Liste der Assembler-Befehle, die das Overflow-Flag beeinflussen können.

Negative-Flag[Bearbeiten | Quelltext bearbeiten]

Das Negative-Flag (N-Flag) ist eine Kopie vom höchstwertigen Bit eines Operationsergebnisses.
Dieses Bit gibt bei der Zweierkomplementnotation darüber Aufschluss, ob ein Byte negativ (N-Flag = 1) oder positiv (N-Flag = 0) ist.
Die Befehle BPL $hhll und BMI $hhll können das N-Flag gezielt abfragen.
Liste der Assembler-Befehle, die das Negative-Flag beeinflussen können.

Weblinks[Bearbeiten | Quelltext bearbeiten]

WP-W11.png Wikipedia: Zweierkomplement


Quellen

  1. Thema: Binare Subtraktion: Funktionsweise SBC - Oder wie wird das Carry-Flag durch Subtraktion prozessorintern beeinfluss? auf Forum64.de mit Erklärungen zum Zweier-/Einerkomplement und (invertiertem) Carry