Der Kernel - Software-InterruptsAndere Interrupt-Quellen, external interruptsUm 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 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 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 .... |