Difference between revisions of "Programming:Keyboard scanning"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
m
(Hardware scancode table)
Line 15: Line 15:
 
|'''&45''' || SPACE || N || J || H || Y || U || 7 || 8
 
|'''&45''' || SPACE || N || J || H || Y || U || 7 || 8
 
|-
 
|-
|'''&46''' || V || B || F || G || T || R || 5 || 6
+
|'''&46''' || V || B || F || G (Joy2 fire) || T (Joy2 right) || R (Joy2 right) || 5 (Joy2 down)|| 6 (Joy 2 up)
 
|-
 
|-
 
|'''&47''' || X || C || D || S || W || E || 3 || 4
 
|'''&47''' || X || C || D || S || W || E || 3 || 4
Line 21: Line 21:
 
|'''&48''' || Z || CAPSLOCK || A || TAB || Q || ESC || 2 || 1
 
|'''&48''' || Z || CAPSLOCK || A || TAB || Q || ESC || 2 || 1
 
|-
 
|-
|'''&49''' || DEL || - || - || - || - || - || - || -
+
|'''&49''' || DEL || - || - ||Joy1 Fire||Joy1 right||Joy1 left||Joy1 down||Joy1 up
 
|}
 
|}
  

Revision as of 07:43, 17 July 2009

Hardware scancode table

Bit:
Line
7 6 5 4 3 2 1 0
&40 F Dot ENTER F3 F6 F9 CURDOWN CURRIGHT CURUP
&41 F0 F2 F1 F5 F8 F7 COPY CURLEFT
&42 CONTROL \ SHIFT F4 ] RETURN [ CLR
&43 . /  :  ; P @ - ^
&44 , M K L I O 9 0
&45 SPACE N J H Y U 7 8
&46 V B F G (Joy2 fire) T (Joy2 right) R (Joy2 right) 5 (Joy2 down) 6 (Joy 2 up)
&47 X C D S W E 3 4
&48 Z CAPSLOCK A TAB Q ESC 2 1
&49 DEL - - Joy1 Fire Joy1 right Joy1 left Joy1 down Joy1 up

One line scanning routine

This is a routine which scans one line of the keyboard directly. It is approximately 8% faster then the firmware routine and doesn't enable interrupts.

Input: A = line (&40 - &49)

Output: A = hardware keyboard value

Destroyed: BC

LD A,kbdline ; from 0 to 9 with bdir/bc1=01
LD BC,#F782 ; PPI port A out /C out 
OUT (C),C 
LD BC,#F40E ; Select Ay reg 14 on ppi port A 
OUT (C),C 
LD BC,#F6CO ; This value is an AY index (R14) 
OUT (C),C 
OUT (C),0 ; Validate!!
LD BC,#F792 ; PPI port A in/C out 
OUT (C),C 
DEC B 
OUT (C),A ; Send KbdLine on reg 14 AY through ppi port A
LD B,#F4 ; Read ppi port A 
IN A,(C) ; e.g. AY R14 (AY port A) 
LD BC,#F782 ; PPI port A out / C out 
OUT (C),C 
DEC B ; Reset PPI Write 
OUT (C),0


Now check for the value from the table e.g. with''''bit x,A''''and a condition e.g.''''jp z,xxxx''''or''''call z,xxxx''''

Please note:

  • Bit = 0: Key is pressed
  • Bit = 1: Key is not pressed

Complete keyboard scanning routine

This routine scans the complete keyboard and writes all key status bits in a map.

keymap  ds 10  ;map with 10*8 = 80 key status bits (bit=0 key is pressed)

keyscan di              ;1 ##%%## C P C   VERSION ##%%##
        ld hl,keymap    ;3
        ld bc,#f782     ;3
        out (c),c       ;4
        ld bc,#f40e     ;3
        ld e,b          ;1
        out (c),c       ;4
        ld bc,#f6c0     ;3
        ld d,b          ;1
        out (c),c       ;4
        ld c,0          ;2
        out (c),c       ;4
        ld bc,#f792     ;3
        out (c),c       ;4
        ld a,#40        ;2
        ld c,#4a        ;2 44
loop    ld b,d          ;1
        out (c),a       ;4 select line
        ld b,e          ;1
        ini             ;5 read bits and write into KEYMAP
        inc a           ;1
        cp c            ;1
        jr c,loop       ;2/3 9*16+1*15=159
        ld bc,#f782     ;3
        out (c),c       ;4
        ei              ;1 8 =211 microseconds
        ret