Das Schneider CPC Systembuch

Die Abteilungen des Betriebssystems

Der Kernel - Software-Interrupts

Synchrone Events

Nun 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
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 im Typen-Byte des BCEF: KL INIT EVENT: EventblockEventblocks = 0) werden vom MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
mit jedem Kick in die 'synchronous pending queue' eingetragen (Außer, wenn sie bereits eingetragen sind) und nicht aufgerufen! In jedem Fall wird das Zähl-Byte erhöht (aber auch nur bis maximal +127).

Es ist Aufgabe des Hauptprogrammes, in regelmäßigen Abständen beim MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
nachzufragen, ob mittlerweile ein Der Kernel - Software-Interrupts: Synchrone Eventssynchrones Event eingetrudelt ist, und auf seine Abarbeitung wartet. Dazu sollte man die Routine &HIGH KERNEL JUMPBLOCK: B921: HI KL POLL SYNCHRONOUSB921 HI KL POLL SYNCHRONOUS aufrufen, die ganz im RAM liegt und deshalb besonders schnell ist (weil sie keine Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs ein- und auszublenden hat).

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
Anhang: Basic
Basic
benutzt für seine Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts ausschließlich Der Kernel - Software-Interrupts: Synchrone Eventssynchrone Events. Dabei wird immer zwischen zwei Basic-Statements gepollt und eventuell die Interrupt-Behandlung gestartet. Das Basicprogramm muss also nicht selbst pollen. Für es erscheinen die Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts wieder unvorhersehbar, asynchron.

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
Die Firmware des Schneider CPC: KERNEL
Kernel
auf drei verschiedene Vektoren 'gestreckt' wurde. Wer aber nicht gerade vorhat, eine eigene Interpreter-Sprache zu entwickeln, wird mit diesen Problemen kaum konfrontiert werden. Interpreter, die nur einen Stapel kennen (die also die Return-Adressen für das Programm auf dem Maschinenstapel ablegen) können aber ebenfalls wie im folgenden Beispiel vorgehen:

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
Anhang: Basic
Basic
sind diese beiden Vektoren über die Befehle 'DI' und 'EI' zugänglich. Alle Unterbrechungen in Einleitung: BASIC
Anhang: Basic
Basic
sind 'normal', nur ON_BREAK_GOSUB ist 'express'.

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
Die Firmware des Schneider CPC: KERNEL
Kernel
nur solche Der Kernel - Software-Interrupts: EventsEvents weiter, die eine höhere als die gerade aktuelle Priorität haben.

Das heißt: Der MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
sortiert die gekickten Der Kernel - Software-Interrupts: EventsEvents nicht nur entsprechend ihrer Priorität in der 'synchronous pending queue' und zieht Ereignisse höherer Priorität vor bereits wartende, unwichtigere Der Kernel - Software-Interrupts: EventsEvents vor. Auch bei der Nachfrage, ob in der 'sync. pending queue' ein Eintrag wartet, werden nur noch Der Kernel - Software-Interrupts: EventsEvents höherer Priorität weitergemeldet. Dadurch können Interrupt-Routinen ihrerseits ebenfalls die Der Key Manager: WarteschlangeWarteschlange pollen, um sich von später eingetroffenen, wichtigeren Ereignissen unterbrechen zu lassen.

Valid HTML   Valid CSS