Der Kernel - Software-InterruptsSynchrone EventsNun ist es aber Jammerschade, all die vielen, schönen Grundlagen: UnterprogrammeUnterprogramme der verschiedenen Firmware-Packs nicht aufrufen zu dürfen. Wie soll man da eine mitlaufende Uhr (Textausgabe. Nicht re-entrant) oder Aehnliches realisieren können? Aus diesem Grund hat man bei Amstrad einen Event-Typ vorgesehen, dessen Ausführung mit dem Hauptprogramm synchronisiert werden kann. Der Kernel - Software-Interrupts: Synchrone EventsSynchrone Events (Datenbreite: Bits Es ist Aufgabe des Hauptprogrammes, in regelmäßigen Abständen beim MAIN FIRMWARE JUMPBLOCK: KERNEL Dieses 'Pollen' darf aber nur geschehen, wenn die Event-Routine alle Routinen des Betriebssystems benutzen darf. Denn das ist ja der Sinn für den ganzen Umstand. Einleitung: BASIC Das Pollen gestaltet sich leider etwas umständlich. Hier hat man bei Amstrad drei Vektoren vorgesehen, die normalerweise immer nur direkt hintereinander aufgerufen werden können. Zumindest ist das der Fall, wenn ein compiliertes oder reinrassiges Assembler-Programm im Speicher abläuft. Beim Basic-Interpreter, der einen privaten Return-Stapel für das Basic-Programm unterhält, gestaltet es sich etwas anders, weshalb die Bearbeitung eines Der Kernel - Software-Interrupts: Synchrone Eventssynchronen Events im MAIN FIRMWARE JUMPBLOCK: KERNEL Pollen und Aufruf einer synchronen Event-Routine in Maschinencode-Programmen:; Hauptprogramm: ; ... ; ; Nun Pollen: Maschinencode über HIMEM: CALLCALL #B921 ; HIGH KERNEL JUMPBLOCK: B921: HI KL POLL SYNCHRONOUSHI KL POLL SYNCHRONOUS Maschinencode über HIMEM: CALLCALL C,RUFE ; CY=1 --> Es liegt etwas vor. --> Behandeln. ... ; und weiter im Hauptprogramm ; ... ; ; Behandlungs-Routine für ein Der Kernel - Software-Interrupts: Synchrone Eventssynchrones Event aufrufen: ; RUFE: Maschinencode über HIMEM: CALLCALL #BCFB ; KERNEL: BCFB: KL NEXT SYNCKL NEXT SYNC (Hole nächstes Der Kernel - Software-Interrupts: EventsEvent aus der Trees: ListenListe) RET NC ; CY=0 --> Es liegt nichts mehr vor. Fertig. PUSH AF ; alte Priorität retten PUSH HL ; Zeiger auf den BCEF: KL INIT EVENT: EventblockEventblock retten Maschinencode über HIMEM: CALLCALL #BCFE ; KERNEL: BCFE: KL DO SYNCKL DO SYNC (Rufe Behandlungsroutine auf) POP HL ; Zeiger auf BCEF: KL INIT EVENT: EventblockEventblock zurück POP AF ; alte Priorität zurück Maschinencode über HIMEM: CALLCALL #BD01 ; KERNEL: BD01: KL DONE SYNCKL DONE SYNC (Zählerbyte zurückstellen & Priorität ; restaurieren) JR RUFE ; und noch 'mal, falls da noch 'was wartet. Der Kernel - Software-Interrupts: Synchrone EventsSynchronen Events wird im Typen-Byte des Event-Blocks jeweils eine Priorität zugeordnet: Diese ist in den Port C - Output: &F6xx: Bits 0 bis 3:Bits 1 bis 4 gespeichert und sollte nicht Real: NullNull sein (das ist nämlich die Priorität des Hauptprogramms). Außerdem sind alle express Der Kernel - Software-Interrupts: Synchrone Eventssynchronen Events dringender als alle normalen. Mit den Vektoren &KERNEL: BD04: KL EVENT DISABLEBD04 KL EVENT DISABLE und &KERNEL: BD07: KL EVENT ENABLEBD07 KL EVENT ENABLE kann die Behandlung von normalen Der Kernel - Software-Interrupts: Synchrone Eventssynchronen Events kurzzeitig ausgesetzt werden. In Einleitung: BASIC Beim Aufruf von &HIGH KERNEL JUMPBLOCK: B921: HI KL POLL SYNCHRONOUSB921 HI KL POLL SYNCHRONOUS und &KERNEL: BCFB: KL NEXT SYNCBCFB KL NEXT SYNC meldet der MAIN FIRMWARE JUMPBLOCK: KERNEL Das heißt: Der MAIN FIRMWARE JUMPBLOCK: KERNEL |