Das Schneider CPC Systembuch

Die Firmware des Schneider CPC

KEY MANAGER

Die Tastatur-Routinen

BB00: KM INITIALIZE

Initialisieren der Tastatur-Routinen

Eingaben:      keine
Ausgaben:      keine
Unverändert:   IX,IY

Komplette Initialisierung des KEY MANAGERs: Alle Unterprogramme: VariablenVariablen, Puffer und Überblick: Die Indirections der Firmware-Packs
Die Firmware des Schneider CPC: Die Indirections der Firmware-Packs
Indirections
werden initialisiert.

Betroffen sind:

- Die Indirections der Firmware-Packs: BDEE: IND KM TEST BREAKIND KM TEST BREAK
- Tastenpuffer
- Expansion-Puffer und -Datentypen: StringsStrings
- Tasten-Übersetzungstabellen
- Repeat-Verzögerung und Geschwindigkeit
- SHIFT- und CAPS LOCK
- BREAKs werden ignoriert

BB03: KM RESET

Zurücksetzen der Tastatur-Routinen.

Eingaben:      keine
Ausgaben:      keine
Unverändert:   IX,IY

'kleine' Initialisierung des KEY MANAGERS: Die Puffer und Überblick: Die Indirections der Firmware-Packs
Die Firmware des Schneider CPC: Die Indirections der Firmware-Packs
Indirections
werden initialisiert.

Betroffen sind:

- Die Indirections der Firmware-Packs: BDEE: IND KM TEST BREAKIND KM TEST BREAK
- Tastatur-Puffer
- Expansion-Puffer und -Datentypen: StringsStrings
- BREAKs werden ignoriert

BB06: KM WAIT CHAR

Warte auf ein (expandiertes) Zeichen von der Tastatur.

Eingaben:      keine
Ausgaben:      CY=1 und Operationen: BD5B / 349A / 349A:  FLO SUBA=Zeichen
Unverändert:   BC,DE,HL,IX,IY

Warte so lange, bis ein Zeichen von der Tastatur verfügbar ist. Die Tastatur: ErweiterungszeichenErweiterungszeichen und werden ausgewertet, zurückgegebene Zeichen ebenfalls.

BB09: KM READ CHAR

Hole ein (expandiertes) Zeichen von der Tastatur (falls eins vorhanden ist).

Eingaben:      keine
Ausgaben:      wenn CY=1 dann Operationen: BD5B / 349A / 349A:  FLO SUBA=Zeichen sonst CY=0
Unverändert:   BC,DE,HL,IX,IY

Erklärung der Anschlussbelegung: TestTeste, ob ein Zeichen von der Tastatur verfügbar ist (-> CY). Wenn ja, hole es. Die Routine wartet nicht. Die Tastatur: ErweiterungszeichenErweiterungszeichen werden ausgewertet, ein zurückgegebenes Zeichen ebenfalls.

BB0C: KM CHAR RETURN

Gebe ein Zeichen an den MAIN FIRMWARE JUMPBLOCK: KEY MANAGER
Die Firmware des Schneider CPC: KEY MANAGER
KM
zurück.

Eingaben:      Operationen: BD5B / 349A / 349A:  FLO SUBA=Zeichen
Ausgaben:      keine
Unverändert:   AF,BC,DE,HL,IX,IY

Man kann Die Abteilungen des Betriebssystems: Der Key Managerdem KEY MANAGER ein einziges Zeichen zurückgeben. Beim nächsten Versuch, ein expandiertes Zeichen von der Tastatur abzuholen wird dann dieses Zeichen ausgegeben. Es wird dabei nie expandiert, auch wenn es ein Die Tastatur: ErweiterungszeichenErweiterungszeichen ist. Außerdem werden die Die Tastatur: Steuerzeichen des Key Managers und des ZeileneditorsSteuerzeichen des MAIN FIRMWARE JUMPBLOCK: KEY MANAGER
Die Firmware des Schneider CPC: KEY MANAGER
KM
nicht befolgt (252, 253, 254). 255 kann überhaupt nicht zurückgegeben werden.

BB0F: KM SET EXPAND

Ordne einem Die Tastatur: ErweiterungszeichenErweiterungszeichen ein Datentypen: StringsString zu.

Eingaben:      LOW KERNEL JUMPBLOCK: 000B:  LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
= Die Tastatur: ErweiterungszeichenErweiterungszeichen C = Länge des Datentypen: StringsStrings HL = Adresse des Datentypen: StringsStrings Ausgaben: CY=1 -> alles o.k. Unverändert: IX,IY

Die Die Tastatur: ErweiterungszeichenErweiterungszeichen 128 bis 159 können mit Zeichenketten (Datentypen: StringsStrings) belegt werden. Dafür müssen die Datentypen: StringsStrings in einem Puffer gespeichert werden.

Der Datentypen: StringsString darf überall im RAM liegen, aber nicht in einem Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM.

Ein Der Linien-Algorithmus: Fehler 3Fehler (CY=0) tritt dann auf, wenn im Puffer kein Platz mehr ist, oder LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
keinen gültigen Code enthält.

BB12: KM GET EXPAND

Hole ein Zeichen aus einem Erweiterungs-String.

Eingaben:      Operationen: BD5B / 349A / 349A:  FLO SUBA = Die Tastatur: ErweiterungszeichenErweiterungszeichen
               L = Zeichennummer im Erweiterungs-String
Ausgaben:      wenn CY=1 dann Operationen: BD5B / 349A / 349A:  FLO SUBA=Zeichen
Unverändert:   BC,HL,IX,IY

Die Zeichen sind beginnend mit 0 durchnummeriert.

Ein Der Linien-Algorithmus: Fehler 3Fehler (CY=0) tritt auf, wenn Operationen: BD5B / 349A / 349A: FLO SUBA keinen gültigen Code enthält oder der Datentypen: StringsString kürzer als durch L verlangt ist.

BB15: KM EXP BUFFER

Lege den Speicherbereich fest, in dem der MAIN FIRMWARE JUMPBLOCK: KEY MANAGER
Die Firmware des Schneider CPC: KEY MANAGER
KM
die Erweiterungs-Strings speichern kann.

Eingaben:      DE = Adresse für den Puffer
               HL = Länge
Ausgaben:      CY=1 -> alles o.k.
Unverändert:   IX,IY

Der Puffer wird entsprechend DE und HL übernommen und mit den Standard-Expansionstrings initialisiert. Ein Der Linien-Algorithmus: Fehler 3Fehler (CY=0) tritt auf, wenn der Puffer dafür zu kurz ist. Dann wird der alte Puffer nicht freigegeben! Der neue Puffer muss deshalb mindestens 44 Zeichen lang sein. Der Puffer darf nur im zentralen RAM liegen.

BB18: KM WAIT KEY

Warte auf ein (nicht expandiertes) Zeichen von der Tastatur.

Eingaben:      keine
Ausgaben:      CY=1 und Operationen: BD5B / 349A / 349A:  FLO SUBA=Zeichen
Unverändert:   BC,DE,HL,IX,IY

Die Routine wartet so lange, bis ein Zeichen von der Tastatur verfügbar ist. Die Tastatur: ErweiterungszeichenErweiterungszeichen werden dabei nicht expandiert, zurückgegebene Zeichen werden nicht berücksichtigt.

BB1B: KM READ KEY

Hole ein (nicht expandiertes) Zeichen von der Tastatur.

Eingaben:      keine
Ausgaben:      wenn CY=1 dann Operationen: BD5B / 349A / 349A:  FLO SUBA=Zeichen
Unverändert:   BC,DE,HL,IX,IY

Hole nur dann ein Zeichen von der Tastatur, wenn eins verfügbar ist (CY=1). Diese Routine wartet nicht. Die Tastatur: ErweiterungszeichenErweiterungszeichen werden nicht expandiert, zurückgegebene Zeichen werden nicht berücksichtigt.

BB1E: KM TEST KEY

Erklärung der Anschlussbelegung: TestTeste, ob eine bestimmte Taste gedrückt ist.

Eingaben:      Operationen: BD5B / 349A / 349A:  FLO SUBA = Tastennummer
Ausgaben:      Z=0 -> Taste ist gedrückt sonst Z=1
               CY=0 und C = Zustand von [SHIFT] und [CTRL]
Unverändert:   LOW KERNEL JUMPBLOCK: 000B:  LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
,DE,IX,IY
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,C = 1 -> [CTRL] ist gedrückt 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,C = 1 -> [SHIFT] ist gedrückt

BB21: KM GET STATE

Erfrage den Status der Shift- und Caps-Locks.

Eingaben:      keine
Ausgaben:      L = Shift-Lock-Status
               H = Caps-Lock-Status
Unverändert:   BC,DE,IX,IY
&00 bedeutet, dass das entsprechende Lock nicht eingeschaltet ist.
&FF bedeutet, dass es eingeschaltet ist.

BB24: KM GET JOYSTICK

Teste den Schalt-Zustand der Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joysticks.

Eingaben:      keine
Ausgaben:      Operationen: BD5B / 349A / 349A:  FLO SUBA und H enthalten den Status vom Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joystick 0
               L enthält den Status von Schaubilder der Tastatur: Erster Joystick 0 und zweiter Joystick 1Joystick 1
Unverändert:   BC,DE,IX,IY

Die einzelnen 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
der Status-Bytes bedeuten, wenn sie gesetzt (=1) sind, dass folgende Taste gedrückt ist:

0 - hoch        4 - Feuer 1
1 - runter      5 - Feuer 2
2 - links       6 - Pin 5 des Joystick-Anschlusses (n.c.)
3 - rechts      7 - immer 0

BB27: KM SET TRANSLATE

Lege das Zeichen fest, das eine Taste erzeugen soll, wenn sie ohne 'CTRL' oder 'SHIFT' gedrückt wird.

Eingaben:      Operationen: BD5B / 349A / 349A:  FLO SUBA = Tastennummer
               LOW KERNEL JUMPBLOCK: 000B:  LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
= neues Zeichen Ausgaben: keine Unverändert: BC,DE,IX,IY

Wenn die Tastennummer größer oder gleich 80 ist, wird nichts unternommen.

Folgende Zeichen werden vom MAIN FIRMWARE JUMPBLOCK: KEY MANAGER
Die Firmware des Schneider CPC: KEY MANAGER
KM
nicht weitergegeben, wenn Einleitung: Die Tastatur
Anhang: Die Tastatur
die Tastatur
abgefragt wird:

    &FD = 253  ->  CAPS LOCK Schalter
    &FE = 254  ->  SHIFT LOCK Schalter
    &FF = 255  ->  Ignorier-Zeichen

BB2A: KM GET TRANSLATE

Erfrage die Belegung einer Taste ohne 'CTRL' und 'SHIFT'.

Eingaben:      Operationen: BD5B / 349A / 349A:  FLO SUBA = Tastennummer
Ausgaben:      Operationen: BD5B / 349A / 349A:  FLO SUBA = Zeichen, das durch diese Taste erzeugt wird
Unverändert:   BC,DE,IX,IY

Siehe KEY MANAGER: BB27: KM SET TRANSLATEBB27 - KM SET TRANSLATE wegen Zeichencodes, die der MAIN FIRMWARE JUMPBLOCK: KEY MANAGER
Die Firmware des Schneider CPC: KEY MANAGER
KM
nicht weitergibt.

BB2D: KM SET SHIFT

Bestimme das Zeichen einer Taste für 'SHIFT'.

Wie &KEY MANAGER: BB27: KM SET TRANSLATEBB27 KM SET TRANSLATE, nur für 'mit SHIFT'.

BB30: KM GET SHIFT

Erfrage die Die Tastatur: Die Standard-Tasten-ÜbersetzungTasten-Übersetzung mit 'SHIFT'.

Wie &KEY MANAGER: BB2A: KM GET TRANSLATEBB2A KM GET TRANSLATE, nur für 'mit SHIFT'.

BB33: KM SET CONTROL

Bestimme das Zeichen einer Taste für 'CTRL'.

Wie &KEY MANAGER: BB27: KM SET TRANSLATEBB27 KM SET TRANSLATE, nur für 'mit CTRL'.

BB36: KM GET CONTROL

Erfrage die Die Tastatur: Die Standard-Tasten-ÜbersetzungTasten-Übersetzung mit 'CTRL'.

Wie &KEY MANAGER: BB2A: KM GET TRANSLATEBB2A KM GET TRANSLATE, nur für 'mit CTRL'.

BB39: KM SET REPEAT

Lege fest, ob eine Taste 'Der Key Manager: Repeatrepeaten', sich also automatisch wiederholen darf, wenn man sie lange genug drückt.

Eingaben:      Operationen: BD5B / 349A / 349A:  FLO SUBA = Tastennummer
               LOW KERNEL JUMPBLOCK: 000B:  LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
=255=&FF -> erlaube der Taste das Der Key Manager: RepeatRepeaten, sonst LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
=0 Ausgaben: keine Unverändert: DE,IX,IY

Wenn die Tastennummer in Operationen: BD5B / 349A / 349A: FLO SUBA größer oder gleich 80 ist, wird nichts eingetragen.

BB3C: KM GET REPEAT

Erfrage, ob eine Taste 'Der Key Manager: Repeatrepeaten' darf.

Eingaben:      Operationen: BD5B / 349A / 349A:  FLO SUBA = Tastennummer
Ausgaben:      Z=0 -> die Taste darf Der Key Manager: Repeatrepeaten, Z=1 -> sie darf nicht
Unverändert:   BC,DE,IX,IY

BB3F: KM SET DELAY

Lege die Verzögerungszeiten beim 'Der Key Manager: RepeatRepeaten' fest.

Eingaben:      H = Wartezeit bis zum ersten Der Key Manager: RepeatRepeat.
               L = Wartezeit zwischen weiteren Der Key Manager: RepeatRepeats.
Ausgaben:      keine
Unverändert:   BC,DE,HL,IX,IY

Die Verzögerungszeiten beziehen sich auf die Der Key Manager: Tastatur-AbfrageTastatur-Abfragen und Einleitung: Die Tastatur
Anhang: Die Tastatur
die Tastatur
wird normalerweise 50 mal pro Sekunde abgefragt.

Die Standardwerte sind 30 (0.6 sek.) für die erste, und 2 (0.04 sek.) für die folgenden Wartezeiten.

Wenn der Tastaturpuffer nicht leer ist, werden Der Key Manager: RepeatRepeats so lange hinausgezögert, bis das laufende Programm den Puffer geleert hat. Dadurch wird verhindert, dass der Tastaturpuffer sich unbemerkt durch Der Key Manager: RepeatRepeats füllt, wenn das Programm mit der Abarbeitung nicht nachkommt.

BB42: KM GET DELEAY

Erfrage die Verzögerungszeiten beim 'Der Key Manager: RepeatRepeaten'.

Eingaben:      keine
Ausgaben:      H = Wartezeit bis zum ersten Der Key Manager: RepeatRepeat
               L = Wartezeit zwischen folgenden Der Key Manager: RepeatRepeats.
Unverändert:   BC,DE,IX,IY

Siehe auch Queues als verkettete Liste: Anmerkung:Anmerkungen bei &KEY MANAGER: BB3F: KM SET DELAYBB3F KM SET DELAY.

BB45: KM ARM BREAK

Aktiviere den Break-Mechanismus.

Eingaben:      DE = Adresse der Break-Behandlungsroutine
               C  = Benötigte ROM-Select-Adresse
Ausgaben:      keine
Unverändert:   IX,IY

Das BREAK Der Kernel - Software-Interrupts: EventsEVENT ist immer SYNCHRON, EXPRESS mit der Priorität 0 und mit FAR ADDRESS.

BB48: KM DISARM BREAK

Schalte den Break-Mechanismus aus.

Eingaben:      keine
Ausgaben:      keine
Unverändert:   BD,DE,IX,IY

BB4B: KM BREAK EVENT

Löse ein Break-Event aus, wenn der Mechanismus aktiv ist.

Eingaben:      keine
Ausgaben:      keine
Unverändert:   BC,DE,IX,IY

Wenn der Break-Mechanismus ausgeschaltet ist, geschieht nichts.

Sonst wird der Break-Eventblock in die 'synchronous pending queue' eingehängt und das BREAK Der Kernel - Software-Interrupts: EventsEVENT Basic: Die Token des Locomotive-BasicTOKEN (&EF=139) in den Tastenpuffer eingefügt (außer, wenn dieser voll ist) und der Break-Mechanismus wieder ausgeschaltet.

Diese Routine ist dafür vorgesehen, vom Interruptpfad aus aufgerufen zu werden. Sie lässt also keine Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts zu. Wohl aber der Vektor KEY MANAGER: BB4B: KM BREAK EVENTBB4B, da dieser ja mit einem LOW MAIN FIRMWARE JUMPBLOCK: JUMPER
Die Firmware des Schneider CPC: JUMPER
JUMP
gebildet ist. Man muss sich die eigentliche Routinen-Adresse aus dem Vektor herausklauben und die Routine direkt aufrufen.

BD3A: KM SET LOCKS

Nur CPC 664 und 6128.

Lege den Shift- und den Caps-Lock-Status neu fest.

Eingaben:    H = neuer Caps Lock Status
             L = neuer Shift Lock Status
Ausgaben:    keine
Unverändert: BC,DE,HL,IX,IY

Der Zustand von Caps Lock (Grossbuchstaben-Arretierung) und Shift Lock (Arretierung der SHIFT-Taste für alle Zeichen) wird entsprechend H und L neu gesetzt. Dabei gilt folgende Vereinbarung:

&00  ->  ausschalten
&FF  ->  einschalten

BD3D: KM FLUSH

nur CPC 664 und 6128.

Lösche alle bisher aufgelaufenen Zeichen im Tastaturpuffer.

Eingaben:    keine
Ausgaben:    keine
Unverändert: BC,DE,HL,IX,IY

Der Tastatur-Puffer wird komplett gelöscht, ein eventuell angefangenes Die Tastatur: ErweiterungszeichenErweiterungszeichen oder ein Put Back Character werden vergessen.

Besitzer des CPC 464 können als Ersatz folgende Routinen benutzen:

Einleitung: BASIC
Anhang: Basic
BASIC
:

WHILE INKEY$<>"":WEND

Assembler:

LOOP12: Maschinencode über HIMEM: CALLCALL #BB09          ; KEY MANAGER: BB09: KM READ CHARKM READ CHAR
        JR   NC,LOOP12
        RET

Valid HTML   Valid CSS