Код:2BF KEYBOARD CALL 028E,KEY-SCAN Fetch a key value in the DE RET NZ register pair but return immedi- ately if the zero pair flag is reset. A double system of 'KSTATE system variables' (KSTATE0 - KSTATE 3 and KSTATE4 - KSTATE7) is used from now on. The two sets allow for the detection of a new key being pressed (using one set) whilst still within the 'repeat period' of the previous key to have been pressed (details in the other set). A set will only become free to handle a new key if the key is held down for about 1/10 th. of a second. i.e. Five calls to KEYBOARD. LD HL,KSTATE0 Start with KSTATE0. 02C6 K-ST-LOOP BIT 7,(HL) Jump forward if a 'set is free'; JR NZ,02D1,K-CH-SET i.e. KSTATE0/4 holds +FF. INC HL However if the set is not free DEC (HL) decrease its '5 call counter' DEC HL and when it reaches zero signal JR NZ,02D1,K-CH-SET the set as free. LD (HL),+FF After considering the first set change the pointer and consider the second set. 02D1 K-CH-SET LD A,L Fetch the low byte of the LD HL,KSTATE4 address and jump back if the CP L second set has still to be JR NZ,02C6,K-ST-LOOP considered. Return now if the key value indicates 'no-key' or a shift key only. CALL 031E,K-TEST Make the necessary tests and RET NC return if needed. Also change the key value to a 'main code'. A key stroke that is being repeated (held down) is now separated from a new key stroke. LD HL,KSTATE0 Look first at KSTATE0. CP (HL) Jump forward if the codes JR Z,0310,K-REPEAT match - indicating a repeat. EX DE,HL Save the address of KSTATE0. LD HL,KSTATE4 Now look at KSTATE4. CP (HL) Jump forward if the codes JR Z,0310,K-REPEAT match - indicating a repeat. But a new key will not be accepted unless one of the sets of KSTATE system variables is 'free'. BIT 7,(HL) Consider the second set. JR NZ,02F1,K-NEW Jump forward if 'free'. EX DE,HL Now consider the first set. BIT 7,(HL) Continue if the set is 'free' but RET Z exit from the KEYBOARD subroutine if not. The new key is to be accepted. But before the system variable LAST-K can be filled, the KSTATE system variables, of the set being used, have to be initialised to handle any repeats and the key's code has to be decoded. 02F1 K-NEW LD E,A The code is passed to the LD (HL),A E register and to KSTATE0/4. INC HL The '5 call counter' for this LD (HL),+05 set is reset to '5'. INC HL The third system variable of LD A,(REPDEL) the set holds the REPDEL value LD (HL),A (normally 0.7 secs.). INC HL Point to KSTATE3/7. The decoding of a 'main code' depends upon the present state of MODE, bit 3 of FLAGS and the 'shift byte'. LD C,(MODE) Fetch MODE. LD D,(FLAGS) Fetch FLAGS. PUSH HL Save the pointer whilst the CALL 0333,K-DECODE 'main code' is decoded. POP HL LD (HL),A The final code value is saved in KSTATE3/7; from where it is collected in case of a repeat. The next three instruction lines are common to the handling of both 'new keys' and 'repeat keys'. 0308 K-END LD (LAST-K),A Enter the final code value into SET 5,(FLAGS) LAST-K and signal 'a new key'. RET Finally return.


Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 


