Reading Keypresses from Port
The problem withcall _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.
Checking Keys
Another way of getting the keypresses is to read them directly from the keyport. You can read later about All the Ports and how the z80 uses them. They are numbered with the keyport being number 1.) We kinda need to send a byte out through the port and then wait a second before reading what was returned.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.
More from z80 » Advanced
All The Ports // APD // Assembler Directives // Entry Stack // User Fonts // IM 1 // IM 2 // Index, Shadow, and Other Registers // User Interrupt // Morphic Code // On-Off // Reading Keypresses from Port // Shift and Rotate // Simulating Key Presses // Sound // Square-Root Programs // System Flags of TI-OS