Das Schneider CPC Systembuch

Die Abteilungen des Betriebssystems

Der Kernel - Software-Interrupts

Andere Interrupt-Quellen, external interrupts

Um einen Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt für die Sound-Programmierung zu definieren, muss man dem Vektor &SOUND MANAGER: BCB0: SOUND ARM EVENTBCB0 SOUND ARM EVENT ein BCEF: KL INIT EVENT: EventblockEventblock übergeben.

Der Break-Mechanismus des Key Managers benutzt einen festen BCEF: KL INIT EVENT: EventblockEventblock, den man nicht ändern kann. Um ein Break-Event zu programmieren, muss man dem Vektor &KEY MANAGER: BB45: KM ARM BREAKBB45 MAIN FIRMWARE JUMPBLOCK: KEY MANAGER
Die Firmware des Schneider CPC: KEY MANAGER
KM
ARM Der Kernel - Software-Interrupts: EventsEVENT nur die FAR ADDRESS der gewünschten Behandlungs-Routine mitteilen. Der Vektor trägt diese Adresse in den BCEF: KL INIT EVENT: EventblockEventblock ein und aktiviert ihn.

Eigene Der Kernel - Software-Interrupts: Interrupt-QuellenInterrupt-Quellen lassen sich mit &KERNEL: BCF2: KL EVENTBCF2 KL EVENT konstruieren. Dieser Vektor kann sowohl aus dem laufenden Programm als auch vom Interrupt-Pfad aus aufgerufen werden. Diese Routine lässt keine Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts wieder zu, wenn er beim Aufruf verboten ist. Da der Vektor zu dieser Routine aber mit einem ROM-Konfiguration: RestartsRestart gebildet ist, der seinerseits Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts zulassen würde, muss man sich die Routinen-Adresse aus dem Vektor herausklauben, wenn man diese Routine bei ausgeschalteten Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts aufrufen will.

Ein sinnvolles Einsatzgebiet für KERNEL: BCF2: KL EVENTKL EVENT ist der external Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - Interruptinterrupt. Wenn hier nicht extrem schnelle Antworten benötigt werden (wofür der Schneider'sche Interrupt-Mechanismus insgesamt nicht geeignet ist), empfiehlt es sich eigentlich immer, den Hardware-Interrupt in ein Der Kernel - Software-Interrupts: EventsEvent umzuwandeln. Hier ist man dann viel flexibler und kann alle Optionen ausnutzen, die vom MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
angeboten werden: normal- oder express-asynchrone und auch Der Kernel - Software-Interrupts: Synchrone Eventssynchrone Events.

Das folgende Programm ist ein Beispiel, wie man einen BCEF: KL INIT EVENT: EventblockEventblock vom external Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt aus kicken kann. Die Routine liegt im RAM. Bei der Initialisierung wird zunächst die Adresse von KERNEL: BCF2: KL EVENTKL EVENT aus dem Vektor herausgeklaubt und in den eigenen Aufruf kopiert. Dadurch erfolgt der Aufruf nachher nicht mehr über einen ROM-Konfiguration: RestartsRestart, sondern direkt. Da bei der Bearbeitung eines external Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts das untere Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM immer eingeblendet ist, muss man für KERNEL: BCF2: KL EVENTKL EVENT das untere Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM auch nicht mehr explizit einblenden.

Dann wird der Die Sprungleisten: External Interrupt Entryexternal interrupt entry vorschriftsmäßig gepatcht und mit einem OUT-Befehl Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts von der eigenen Erweiterung zugelassen.

Die Interrupt-Routine testet zunächst, ob die Unterbrechung auch von der eigenen Hardware kommt und verzweigt gegebenenfalls zur Kopie des alten external interrupt-Eintrages. Andernfalls wird der BCEF: KL INIT EVENT: EventblockEventblock gekickt und die Interrupt-Behandlung beendet. Das Der Kernel - Software-Interrupts: EventsEvent ist synchron. Bei seiner Behandlung werden keine weiteren Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts blockiert und die Behandlungs-Routine selbst kann auf fast alle Firmware-Routinen zugreifen:

 ; Kicken eines Der Kernel - Software-Interrupts: EventsEvents von einem external Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt aus:
 ; -----------------------------------------------------

 INIT:   LD   HL,(#BCF2 + 1)   ; Adresse aus Vektor KERNEL: BCF2: KL EVENTKL EVENT herausklauben
         RES  7,H              ; ROM-Status-Bits für Vektor-Restart löschen
         RES  6,H
         LD   (KICK + 1),HL    ; und in den eigenen Aufruf kopieren
 ;
         LD   HL,#003B  ; Alten Eintrag am Die Sprungleisten: External Interrupt Entryexternal interrupt entry retten
         LD   DE,KOPIE
         LD   BC,5
         LDIR
 ;
         LD   HL,PATCH  ; Sprung zur eigenen Interrupt-Routine installieren
         LD   DE,#003B
         LD   BC,3
         LDIR
 ;
         LD   BC,#wxyz  ; der Harware mitteilen, dass sie jetzt Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts
         LD   Operationen: BD5B / 349A / 349A:  FLO SUBA,#uv     ; erzeugen darf.
         OUT  (C),Operationen: BD5B / 349A / 349A:  FLO SUBA
         RET
 ;
 KOPIE:  DEFS 5         ; Platz für Kopie des alten ext. Interrupt-Eintrages
 PATCH:  JP   XROUT     ; Patch für den ext. Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt
 ;
 ; die Behandlungs-Routine für den external Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - Interruptinterrupt:
 ; ----------------------------------------------------
 ;
 XROUT:  LD   BC,#wxyz  ; Erklärung der Anschlussbelegung: TestTesten, ob Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt von der eigenen Hardware-
         IN   Operationen: BD5B / 349A / 349A:  FLO SUBA,(C)     ; Erweiterung stammt und Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt gegebenenfalls
         CP   #uv       ; abstellen.
         JR   NZ,KOPIE  ; Nicht von der eig. Hardware? -> Kopie anspringen.
 ;
         LD   HL,EVBLOK ; sonst Zeiger auf den BCEF: KL INIT EVENT: EventblockEventblock laden und
 KICK:   JP   #0000     ; KERNEL: BCF2: KL EVENTKL EVENT direkt anspringen -> BCEF: KL INIT EVENT: EventblockEventblock kicken.
 ;
 EVBLOK: DEFW #0000     ; Platz für Hangelpointer in der pending queue
         DEFB 0         ; Count
         DEFB %00001111 ; Typ: synchron, normal, priorität 7, near address
         DEFW EVROUT    ; Adresse der Eventroutine
 ;
 ; Die Behandlungs-Routine für den daraus erzeugten Software-Interrupt:
 ; ---------------------------------------------------------------------
 ;
 EVROUT: ....           ; Event-Behandlungs-Routine
         ....

Valid HTML   Valid CSS