Difference between revisions of "Programming:Keyboard scanning"
From CPCWiki - THE Amstrad CPC encyclopedia!
								
												
				|  (→Hardware scancode table) |  (→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 (Joy2 fire) || T (Joy2 right) || R (Joy2  | + | |'''&46''' || V || B || F || G (Joy2 fire) || T (Joy2 right) || R (Joy2 left) || 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 | ||
Revision as of 14:48, 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 left) | 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
