Programming:Keyboard scanning
From CPCWiki - THE Amstrad CPC encyclopedia!
Revision as of 04:46, 5 February 2010 by Arnoldemu (Talk | contribs) (→Complete keyboard scanning routine)
Contents
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 than 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
Developing programs that use joystick
In the CPC world it is more common that a game supports both keyboard and digital joystick for those users who don't own joysticks. In addition, it is also nice if the keys could be redefined but that is not necessary.
There are some common keyboard configurations used:
- Cursor keys & SPACE - This configuration is often used and is great for the CPC6128 and Plus and playing using emulators. This is not good for CPC 464 and 664 (which have uncomfortably arranged cursor keys)
- Q,A,O,P,SPACE - (Q up, A down, O left, P right, SPACE fire) This is a good solution, and it's a sort of standard (used by many games). It is best for english QWERTY keyboards, on french AZERTY it'd be A-Q-O-P (but because the decoding of the keys is done in software, normally by the OS, the bits in the keyboard matrix are actually the same).