call _getkey
is that it only gives the value of the
key last pressed and only that key. If you had [2] and [ENTER] pressed
at the same time, if would return 0 in a
. That's not good
sometimes.
We use the chart below
to determine the values returned. The byte sent is a bit mask and is
to the left of the chart in the respective row to the key you want to check
for. If you wanted to check for the [ALPHA] being pressed, you would send
%10111111
through the port, get it back, and check if bit 7 were set
(not being pressed now) or reset (being pressed now).
This is only to detect what keys are being held down currently whereas GetKey checked what the last key pressed was.
Let's make a loop that won't exit unless [ALPHA] is pressed. The program will then branch (jump) if so.
key_port =1 ;number of key's port check_for_alpha: ld a,%11011111 ;load the bit mask so port 1 knows ; which row to check from ; table out (key_port),a ;send out the bit mask nop ;no operation so there's some time nop ; to get a result back* in a,(key_port) ;get back the results bit 7,a ;[alpha]'s position jr z,alpha_held_down_now jr check_for_alpha
* Most people say you need these nop's...but in my experience they don't do jack.
You can download the MultiKey.asm key-test program to see how to use this with many other keys.
Bitmask Chart
Whenever you start using the key port, have this chart handy. It tells you the
request value (bit mask) for the row of keys you want to check. Upon return,
check the certain key's bit to see if it is set (not pressed now) or reset
(pressed now).
Bitmask | Bit 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
%10111111 | More | Exit | 2nd | F1 | F2 | F3 | F4 | F5 |
%11011111 | Alpha | Graph | Log | Ln | x2 | , | Sto | |
%11101111 | x-Var | Table | Sin | EE | 7 | 4 | 1 | 0 |
%11110111 | Del | Prgm | Cos | ( | 8 | 5 | 2 | . |
%11111011 | Custom | Tan | ) | 9 | 6 | 3 | (-) | |
%11111101 | Clear | ^ | / | * | - | + | Enter | |
%11111110 | Up | Right | Left | Down |
One thing to think about in games is to clear the key buffer right before exiting your program. This way, if your program was run from a shell, it won't exit the shell too.