BRK
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
- ↑ $FF48/65352: IRQ Entry im KERNAL-ROM-Listing auf unusedino.de