Nachdem nun die Der Kernel - Software-Interrupts: Interrupt-QuellenInterrupt-Quellen dees MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKernel beschrieben Datenbreite: Wordsworden sind, geht es zum Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt selbst. Dafür muss man den BCEF: KL INIT EVENT: EventblockEventblock betrachten. Dieser Standard-Datenblock ist für die 'Reaktions-Seite' zuständig. Ist ein BCEF: KL INIT EVENT: EventblockEventblock erst einmal angestoßen ('gekickt'), so sieht man ihm nicht mehr an, woher der Tritt kam. Jeder BCEF: KL INIT EVENT: EventblockEventblock ist wie folgt aufgebaut (Achtung: Die Angaben im Die Firmware des Schneider CPCFirmware Manual hierzu stimmen nicht!):
Der BCEF: KL INIT EVENT: EventblockEventblock:
---------------
Datentypen: Bytes Datenbreite: BytesByte 0,1 --> Platz für den Hangelpointer in einer 'pending queue'
Datentypen: Bytes Datenbreite: BytesByte 2 --> COUNT = Kick-Zähler und Steuerbyte
Datentypen: Bytes Datenbreite: BytesByte 3 --> CLASS = Interrupt-Typ
Datentypen: Bytes Datenbreite: BytesByte 4,5 --> ADDRESS = Adresse der Behandlungs-Routine
Datentypen: Bytes Datenbreite: BytesByte 6 --> Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM = nur bei Bedarf: Benötigte Die Speicherkonfiguration im Schneider CPC: ROM-KonfigurationROM-Konfiguration.
Datentypen: Bytes Datenbreite: BytesByte 7ff --> nur bei Bedarf: Variablen: lokale VariablenLokale Variablen für die
Behandlungs-Routine.
Wird ein solcher BCEF: KL INIT EVENT: EventblockEventblock gekickt, so reiht ihn der MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKernel entsprechend seines Typs in eine von zwei möglichen 'abhängigen' Ketten, den sogenannten 'pending queues' ein (wenn er nicht bereits drin ist). Dafür müssen die beiden ersten Datentypen: Bytes Datenbreite: BytesBytes bereitgestellt werden. (Davon gibt es zwei Ausnahmen, die weiter unten beschrieben sind.)
Gleichzeitig wird der Kick-Zähler erhöht. Dadurch können kurzzeitig mehr Interrupt-Anforderungen eingehen, als die Die ICs im Überblick: Die CPU Z80 Das Innenleben der CPC-Rechner: Die CPU Z80 Die Anschlussbelegungen der wichtigsten ICs im CPC: Die CPU Z80CPU abarbeiten kann. Die Anzahl der noch ausstehenden Kicks wird in diesem Datentypen: Bytes Datenbreite: BytesByte gespeichert. Dieser Zahler geht aber nur bis +127. Negative Werte (der MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKernel selbst benutzt immer -64 = &Der Zeichensatz des Schneider CPC: &C0 = 192C0) bedeuten, dass dieser BCEF: KL INIT EVENT: EventblockEventblock ruhiggestellt ist, und nicht mehr angestoßen werden soll. Dieses Datentypen: Bytes Datenbreite: BytesByte ist also nicht nur ein Zähler, es hat auch Steuerfunktionen.
In die Datentypen: Bytes Datenbreite: BytesBytes 4 bis 6 muss die Adresse der Behandlungs-Routine für den Software-Interrupt eingetragen werden. befindet sich diese Routine im zentralen RAM, so kann man auf die Angabe der Die Speicherkonfiguration im Schneider CPC: ROM-KonfigurationROM-Konfiguration verzichten. Liegt sie aber in einem Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM, wie das beim Basic-Interpreter der Fall ist, so muss man auch noch das letzte Datentypen: Bytes Datenbreite: BytesByte angeben. Diese drei Datentypen: Bytes Datenbreite: BytesBytes bilden dann zusammen die FAR ADDRESS für einen ROM-Konfiguration: RestartsRestart 3 (LOW MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKL FAR Maschinencode über HIMEM: CALLCALL).
Datentypen: Bytes Datenbreite: BytesByte 3 ist der Interrupt-Typ. Hiermit werden drei verschiedene Daten des BCEF: KL INIT EVENT: EventblockEventblocks beeinflusst: Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 0 gibt an, ob die Adresse der Behandlungs-Routine mit oder ohne Angabe der Die Speicherkonfiguration im Schneider CPC: ROM-KonfigurationROM-Konfiguration erfolgt, Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 7 unterscheidet 'synchrone' und 'asynchrone' Der Kernel - Software-Interrupts: EventsEvents, Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 6 unterscheidet extrem dringende ('express') und 'normale' Unterbrechungen und die restlichen Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bits bestimmen bei einem Der Kernel - Software-Interrupts: Synchrone Eventssynchronen Event dessen Dringlichkeit, die Priorität:
Das Typ-Byte im Event-Block:
--------------------------------
Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 0 = 1 --> 'near address' (keine Die Speicherkonfiguration im Schneider CPC: ROM-KonfigurationROM-Konfiguration angegeben.)
= 0 --> 'far address' (Die Speicherkonfiguration im Schneider CPC: ROM-KonfigurationROM-Konfiguration wie für Speicheraufteilung durch ein Vordergrund-Programm: RST 3 LOW KERNEL JUMPBLOCK: 0000 - RST 0: LOW RESET ENTRY LOW KERNEL JUMPBLOCK: 0008 - RST 1: LOW LOW JUMP LOW KERNEL JUMPBLOCK: 0010 - RST 2: LOW SIDE CALL LOW KERNEL JUMPBLOCK: 0018 - RST 3: LOW FAR CALL LOW KERNEL JUMPBLOCK: 0020 - RST 4: LOW RAM LAM LOW KERNEL JUMPBLOCK: 0028 - RST 5: LOW FIRM JUMP LOW KERNEL JUMPBLOCK: 0030 - RST 6: LOW USER RESTART LOW KERNEL JUMPBLOCK: 0038 - RST 7: LOW INTERRUPT ENTRYRST 3 angegeben.)
Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 1-4 = --> Priorität (bei Der Kernel - Software-Interrupts: Synchrone Eventssynchronen Events)
Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 5 = --> Muss auf 0 gesetzt werden
Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 6 = 0 --> normales Der Kernel - Software-Interrupts: EventsEvent
= 1 --> express Der Kernel - Software-Interrupts: EventsEvent
Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 7 = 0 --> Der Kernel - Software-Interrupts: Synchrone Eventssynchrones Event
= 1 --> asynchrones Der Kernel - Software-Interrupts: EventsEvent.
Das sieht alles ganz schön verwirrend aus; und das ist es wohl auch. Man muss also nicht gleich an seiner geistigen Leistungsfähigkeit zweifeln, wenn man den Event-Mechanismus nicht beim ersten Durchlesen versteht.
|