BRK

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Mnemonic: BRK
Opcode: $00
Anzahl der Bytes: 1
Befehlsgruppe: Spezialbefehl
Adressierung: implizit
Beeinflusste Flags im Statusregister:
Break-Flag
Interrupt-Flag
Taktzyklen: 7


Der Assembler-Befehl BRK erzeugt einen softwareseitigen Interrupt.
Das sowohl der IRQ-Hardware-Interrupt als der BRK-Interrupt den gleichen Sprungvektor verwenden, setzt der BRK-Befehl das Break-Flag im Statusregister, um diese dann in der Interrupt-Service-Routine (ISR) auseinander halten zu können.

Vereinfachtes Funktionsprinzip

Zuerst wird der um zwei erhöhte Programmzähler am Stapel abgelegt und das Break-Flag gesetzt. Danach wird das Statusregister am Stapel abgelegt und der IRQ/BRK-Vektor ($FFFE/$FFFF) angesprungen.

Üblicher Ablauf

Der IRQ/BRK-Vektor ($FFFE/$FFFF) zeigt beim normalen C64-KERNAL auf $FF48. Dort wird bei $FF53 das Break-Flag geprüft.[1] Ist es gesetzt, wird zum Vektor in $0316/$0317 gesprungen, der normalerweise auf den BASIC-Warmstart ($FE66) zeigt (der Prompt "READY." erscheint links oben auf dem sonst leeren Schirm). Das erklärt auch, wieso bei Fehlern in Maschinenspracheprogrammen häufig ein Warmstart ausgelöst wird: Ist der Programmfluss durcheinander gekommen, trifft die CPU früher oder später auf ein Null-Byte (der Opcode für BRK), was dann einen Warmstart herbeiführt.

Detailliertes Funktionsprinzip

Zyklus Beschreibung
1 Opcode holen (Adresse = aktueller Programmzähler)
Programmzähler + 1
2 nächste Anweisung holen (Adresse = aktueller Programmzähler) und verwerfen
Programmzähler + 1
3 High-Byte des Programmzählers auf Stapel sichern
Break-Flag setzen
Stapelzeiger - 1
4 Low-Byte des Programmzählers auf Stapel sichern
Stapelzeiger - 1
5 Statusregister auf Stapel sichern
Interrupt-Flag setzen (Interrupt sperren)
Stapelzeiger - 1
6 Lade Inhalt von $FFFE in Programmzähler (Low-Byte)
7 Lade Inhalt von $FFFF in Programmzähler (High-Byte)

Verwendung

Der Befehl BRK wird meist verwendet, um in der Testphase eines Programms Breakpoints setzen zu können, an denen das Programm unterbrochen und angehalten wird und der Programmierer sich den Zustand des Programms ansehen kann. Dazu wird typischerweise ein Maschinensprachemonitor benutzt, der die Breakpoints nach Benutzerwunsch setzt, indem er bestehende Opcodes durch BRK ersetzt und sich in die Interrupt-Routine einhängt. Das Programm kann fortgesetzt werden, indem der BRK-Opcode durch den Monitor wieder auf den Originalbefehl zurück gesetzt und dorthin zurückgesprungen wird. Dies übernimmt normalerweise der Monitor automatisch.

Ein weiterer Verwendungszweck ist das Patchen von PROMs. PROMs können zwar nicht vollständig neu programmiert werden, es ist aber nachträglich möglich, einzelne Bits auf Null zu setzen und somit jede beliebige Speicherstelle mit einem BRK-Befehl zu überschreiben oder zusätzlichen Programmcode in nicht verwendete Speicherbereiche (die auf $FF verblieben sind) zu schreiben.

Besonderheit

Es ist zu beachten, dass das Programm erst beim zweiten Byte nach dem BRK-Befehl fortgesetzt wird, da am Stapel der um zwei erhöhte Programmzähler abgelegt wurde. Deshalb sollte vorsichtshalber ein NOP-Befehl nach dem BRK-Befehl eingefügt werden oder per Stapelmanipulation die Rücksprungadresse entsprechend korrigiert werden.

Bedeutung der Buchstaben im Befehl

BRK BReaK
Programmunterbrechung

Beispiel

Einfaches Beispiel eines BRK-Vorkommnisses:

        brk
        nop            ; wird ignoriert
        ...            ; hier geht es nach BRK weiter

Beispielprogramme

Weblinks

Referenzen

  1. $FF48/65352: IRQ Entry im KERNAL-ROM-Listing auf unusedino.de Sprache:englisch