★ CODING ★ Interrupt-Kursus für den CPC|CPC Amstrad International) ★![]() |
| Interrupt-Kursus für den CPC (CPC Amstrad International) |
Einen Moment mal! In der heutigen Folge, die auch den Abschluß unseres Kursus bildet, besprechen wir die weitergehende Programmierung der Event-Befehle und deren Anwendung. Dabei gehen wir auf wichtige Systemadressen des CPC ein. Bevor wir auf die Programmierung des Eventblocks eingehen, wollen wir einige Einsprungadressen auflisten, ohne die eine Interrupt-Programmierung nicht möglich wäre. CALL &BCD7 Mit diesem Call wird ein Interruptblock eines Frame Flybacks ab der Adresse im Register HL eingerichtet und der Interrupt gestartet. Die Adresse des Unterprogramms stchl dabei im Register DE, in B wird das Multifunktionsregister übergeben und in C die ROM-/RAM-Auswahl. CALL &BCDA Dieser Call startet einen Frame-Fly-back-Interrupt, dessen Blockanfangsadresse im Register HL steht. Dabei ist zu beachten, daß dieser Block vorher schon auf andere Weise eingerichtet worden sein muß. Es genügt aber auch schon, wenn nur der allgemeine Teil des Eventblocks vorhanden ist. CALL &BCDD Mit diesem Call wird ein Frame-Fly-Interrupt gelöscht, wobei die Anfangsadresse seines Blocks in HL angegeben wird. Der Block selbst bleibt durch diese Operation zwar erhalten, wird aber nicht mehr angesprungen. Er kann jederzeit wieder durch den Call &BCDA aktiven werden. CALL &BCE0 Dieser Call hängt einen Fast-Ticker-Interrupt ein und startet ihn. Er ist die Entsprechung des Frame-Fly-Calls &BCD7. CALL &BCE3 Mit diesem Interrupt startet ein schon eingerichteter Fast-Ticker-Interrupt, entsprechend Call &BCDA beim Frame Flybaek. CALL &BCE6 Durch diesen Interrupt wird ein Fast-Ticker-Interrupt ausgeschaltet. Die Einzelheiten entsprechen dem Frame Flyback; einzige Ausnahme ist der Call zur Reaktivierung, der beim Fast Ticker Call &BCE3 ist. CALL &BCE9 Dieser Einsprung ist nun im Vergleich zu den oberen grundverschieden. Während die Einrichteeinsprünge bei Frame Flyback und Fast Ticker jeweils den gesamten Interruptblock einrichten, wird bei diesem Call nur der spezielle Teil des Eventblocks initialisiert. Für die Praxis bedeutet das, daß der allgemeine Teil schon vorher eingerichtet werden muß (siehe dazu die übernächste Einsprungsadresse). HL enthält bei dieser Routine den Anfang des speziellen Teils. DE gibt an, nach welcher Zeit (in 1/50 Sekunden) derln-terrupt zum ersten Mal aufgerufen wird. BC schließlich gibt das Intervall an, in dem der Interrupt danach aufgerufen wird. CALL &BCEC Mit diesem Call wird ein Ticker-Interrupt ausgehängt. CALL &BCEF Dieser Call richtet nun den allgemeinen Teil des Eventblocks ein. Dazu wird in HL die Anfangsadresse des allgemeinen Teils angegeben, das heißt, es muß die Anzahl der speziellen Bytes zu der Anfangsadresse des gesamten Blocks addiert werden. DE gibt wieder die Adresse der Unterprogrammroutine an, B das Multifunktionsregister und C den ROM-Select. Dieser Einsprung startet natürlich keinen Interrupt. CALL &BCF2 Dieser Call kickt einen in HL durch die Anfangsadresse gegebenen Interruptblock einmal. CALL &BCF5 Dieser Call löscht die synchrone Pen-ding Queue. CALL &BCF8 Mit diesem Call wird ein bestimmter Block aus der Pending Queue gelöscht (Adresse in HL). CALL &BCFB Der Call gibt die Adressen der synchronen Events in Reihenfolge der Priorität an. CALL &BCFE Mit diesem Call wird ein Interruptunterprogramm einmal aufgerulen, dazu steht in HL die Adresse des gemeinsamen Teils des entsprechenden Blocks. CALL &BD01 Dieser Call schließt die Ausführung des Calls &BCFE ab, HL ist dabei gleich. Das Zählregister im Eventblock wird um eins erniedrigt. CALL &BD04/CALL &BD07 Diese beiden Calls entsprechen den BASIC-Befehlen DI und EI. CALL &BD0A Durch disen Call wird die Interrupt-Ausführung unterbrochen. Der Eventblock wird zwar noch angesprungen, jedoch nicht mehr gekickt. Wenn der Zähler wieder auf null gesetzt wird, wird der Block wieder bedingungslos gekickt. Keine Einsprungadresse im eigentlichen Sinne, aber eine dennoch nützliche Adresse ist &B939 (beim CPC-464) oder &B941 (beim CPC-664/6128). Sie wird von allen Hardware-Interrupts angesprungen und ermöglicht es somit, alle Interrupts zu sperren. Dazu muß man nur nach &B939 beziehungsweise &B941 ein &c9 (RET) zu poken. So kann man eine geringe, unter Umständen aber recht hilfreiche Geschwindigkeitserhöhung erreichen. Um die Interrupts wieder anlaufen zu lassen, muß man nur die Adresse mit ihrem ursprünglichen Wert wieder laden. An dieser Stelle noch ein Hinweis: Auch von OUT-Befehlen kann ein Interrupt beeinflußt werden. Die OUTs &BC00,5 und &BD00,20 beeinflussen beispielsweise nach ihrer Eingabe im BASIC den Bildrücklauf und auch die Ausführungsgeschwindigkeit von Interrupts. Event block-Programmierung Nun kommen wir endlich zur praktischen Programmierung des Eventblocks. Dazu zeigen wir anhand eines Assemblerlistings die einfachste Methode, einen Ticker-Interrupt einzurichten: ORG &4000:Bei diesem Einrichten des Eventblocks muß jetzt vor allem noch die Interrupt-Routine ab der angegebenen Adresse (hier hexadezimal &4500) in den Speicher gebracht werden, die vom Computer ausgeführt werden soll. Zur Eventblock-Programmierung sind noch folgende Dinge zu erwähnen: Zum einen ist es wichtig zu beachten, daß, um den gemeinsamen Teil einzurichten (CALL &bcef), die anzugebende Adresse sich aus Anfangsadresse des gesamten Blocks und der Anzahl der vom speziellen Teil benötigten Bytes zusammensetzt, also entweder zwei oder sechs Bytes noch hinzugezählt werden. Zum anderen ist es ratsam. ein und denselben Block nicht mehrmals nacheinander aufzurufen, ohne ihn vorher auszuschalten, da es sonst zu Fehlverkettungen kommen kann. |
| ![]() |
| Page précédente : Interrupt-Kursus für den CPC v2 |
|