
	CKBD Tastatur Interrupt
	-----------------------

StateMachine: Bei jedem Tastaturinterrupt wird die State Machine 
aufgerufen. Wenn nichts angegeben wird, wird das aktuelle Zeichen 
unverndert gelassen. Es gibt 3 Grundoperationen, die auf den 
Tastaturpuffer wirken:

	remove_from_buffer
			Das zuletzt eingegebene Zeichen wird aus dem 
			Tastaturpuffer gelscht.

	replace_in_buffer char
			Das zuletzt eingegebene Zeichen wird mit 'char' 
			berschrieben.

	insert_in_buffer char
			'char' wird hinter dem letzten Zeichen in den 
			Tastaturpuffer eingefgt.

Der Befehl 'GOTO' bestimmt, welcher Zustand als nchster angenommen 
wird.
Das State Diagramm ist so auch als Assemblercode in CKBD 
implementiert worden.



1. DEC-MODE COMPOSE CHARACTERS:
-------------------------------
* Die Funktion arbeitet exakt wie das Vorbild auf den VT2xx Terminals 
der Firma Digital Equipment Corporation (DEC).

* Wenn die 'Composed Chars' nicht 'order sensitive' sind, ist es 
egal, ob  e^ oder ^e eingegeben wird. Raus kommt immer .

* Wenn 'order sensitive'eingeschaltet ist mu die Reihenfolge 
beachtet werden: nur noch e^ ergibt 

* Whrend einer 'Compose'-Sequenz sind die Zeichen nicht sichtbar. 
Somit mssen vor dem Senden des definitiven Zeichens keine 'falschen' 
Zeichen mittels Backspace korrigiert werden.

* Laufende Sequenzen knnen zu jedem Zeitpunkt mit ESC oder BackSpace
abgebrochen werden.


2. MULTICHAR-MODE COMPOSED CHARACTERS:
--------------------------------------

* Die Funktion arbeitet hnlich EXTKEY: Nach Einleiten einer Compose 
Sequenz werden die zwischendurch eingegebenen Zeichen geechoed. Die 
laufende Applikation mu also mit schnellen Backspace-Folgen klarkommen.

* Wenn die 'Composed Chars' nicht 'order sensitive' sind, ist es 
egal, ob  e^ oder ^e eingegeben wird. Raus kommt immer .

* Wenn 'order sensitive'eingeschaltet ist mu die Reihenfolge 
beachtet werden: nur noch e^ ergibt 

* Laufende Sequenzen knnen zu jedem Zeitpunkt mit ESC oder BackSpace 
abgebrochen werden.


3. Deadkeys:
------------

* Der Code einer als Deadkey definierten Taste wird abgefangen und 
mit dem nchsten eingegebenen Zeichen kombiniert. Ist die Kombination 
gltig, wird das zusammengesetzte Zeichen ausgegeben. Andernfalls 
werden die beiden Zeichen unverndert ausgegeben.

* Laufende Sequenzen knnen zu jedem Zeitpunkt mit ESC oder BackSpace 
abgebrochen werden.

* Tasten mit ASCII code Null werden durchgereich (Cursortasten, 
F-Tasten)...


4. Extkey:
----------

* Wenn ein Zeichen mit gedrckter Control-Taste eingegeben wird, 
versucht CKBD, dieses Zeichen mit dem vorigen zu kombinieren. Wenn 
das klappt wird das vorige Zeichen auf dem Bildschirm mit 'BackSpace' 
gelscht und das zusammengesetzte Zeichen ausgegeben.


5. ALT_nnn:
-----------

* Bei gedrckter Alternate-Taste werden auf dem Ziffernblock 
eingegebene Zifferntasten zu ASCII-Codes zusammengezogen.


6. Das komplette Statusdiagramm von CKBD:
-----------------------------------------

STATE_DIAGRAM CKBD_statemachine:

    STATE Normal_operation:
        IF (Alt_pressed)        	GOTO Prepare_CC
        ELSE IF (Alt_released)  	GOTO Normal_operation
        ELSE IF (Control_pressed)	GOTO Extkey
        ELSE IF (Is_a_deadkey)
        	remove_char_from_buffer
        	Store_this_char
        	GOTO Deadkeys
        ENDIF

    STATE Prepare_CC:
    	IF (Alt_released) THEN
    		IF (time_out OR other_key_pressed) THEN
    			GOTO Normal_operation
    		ELSE
	            IF (DEC_mode) 		GOTO Compose_1
    	        ELSE 				GOTO Compose_3
    		ENDIF
    	ELSE
    		IF (Numeric_keypad_digit) THEN
    			compchar=0
    			GOTO Alt_nnn
    		ENDIF
    	ENDIF

    STATE Compose_1:
        remove_char_from_buffer
        Store_this_char
        IF (char==ESC OR char==BS) THEN
            GOTO Normal_operation
        ELSE
            GOTO Compose_2
        ENDIF

    STATE Compose_2:
        IF (char==ESC OR char==BS) THEN
            GOTO Normal_operation
        ELSE IF (sequence_is_valid) THEN
            replace_in_buffer Composed_char
        ELSE
            remove_char_from_buffer
            Bell_sound
            GOTO Normal_operation
        ENDIF

    STATE Compose_3:
        IF (char==ESC OR char==BS) THEN
            GOTO Normal_operation
        ELSE IF (sequence_is_valid) THEN
            Store_this_char
            GOTO Compose_multi
        ELSE
            GOTO Normal_operation
        ENDIF

    STATE Compose_multi:
        IF (char==ESC OR char==BS) THEN
            GOTO Normal_operation
        ELSE IF (sequence_is_valid) THEN
            replace_in_buffer BackSpace
            insert_in_buffer Composed_char
            Store_this_char
            GOTO Compose_multi
        ELSE
            GOTO Normal_operation
        ENDIF
       
	STATE Extkey:
		IF (Control_released) GOTO Normal_operation
		IF (sequence_is_valid) THEN
			replace_in_buffer BackSpace
			insert_in_buffer Composed_char
		ENDIF

	STATE Deadkeys:
		IF (char==SPACE OR char==previous_char) THEN
			replace_in_buffer char
			GOTO Normal_operation
		ELSE IF (sequence_is_valid)
			replace_in_buffer Composed_char
		ELSE
			replace_in_buffer previous_char
			insert_in_buffer char
		ENDIF
	
	STATE Alt_nnn:
		IF (Alt_released) THEN
			insert_in_buffer compchar
			GOTO Normal_operation
		ENDIF
		compchar = 10*compchar + VALUE_OF(char)
		IF (compchar>255 OR more_than_3_chars_entered THEN
			insert_in_buffer compchar
		ENDIF

END_DIAGRAM CKBD_statemachine.



-----------------------------------------------------------------------
(c) 1992, 1994 by P. Fellerich
-----------------------------------------------------------------------

