Esta matriz de teclado do ponto de vista de portas I/O está dividida em oito "half rows".
Cada "half-row" tem cinco bits / teclas. Um zero no bit correspondente à tecla, na porta dessa "half-row", significa que a tecla está pressionada.
Para ler o teclado, e testar por S:
LD BC,$FDFE
IN A,(C)
AND % 00000010
JR Z,TECLA_PRESSIONADA
Note-se que pressionar (ou largar) uma tecla do teclado, não causa nenhum interrupt. O varrimento / polling das portas da matriz de teclado é feito no meio da rotina de interrupts invocada 50 vezes por segundo, ou directamente na aplicação.
Uma das particularidades de ser um desenho tão simples de electrónica, é que permite pressionar várias teclas ao mesmo tempo, e múltiplas teclas desde que não se esgote as cinco teclas de uma das "half row" (i.e. máximo de quatro teclas premidas por "half-row").
Note-se que num emulador nunca vamos conseguir ter tantas teclas premidas como na máquina original, devido a limitação do controlador de teclado da máquina hospedeira. A seguir, exemplo de rotina ASM que demonstra a pressão de teclas tal como a tabela acima.
código fonte ASM binário em formato .TAP
Existe no entanto, o efeito de "ghost keys" - que são essencialmente teclas fantasma geradas pelo curto-circuito de outras teclas premidas. Por exemplo, Caps shift + B + V criam como fantasma o output da tecla Space estar activada. Também o jogo Zynaps pausa quando as teclas 5,6,7,8 e 0 estão pressionadas.
Em cada interrupt, a rotina da ROM que é chamada está em $02FB, KEYBOARD.
MASK_INT
|
0038
|
PUSH AF
|
Save the current values held in these registers.
|
0039
|
PUSH HL
|
||
003A
|
LD HL,($5C78)
|
The lower two bytes of the frame counter (FRAMES) are incremented every 20 ms. (U.K.) The highest byte of the frame counter is only incremented when the value of the lower two bytes is zero.
|
|
003D
|
INC HL
|
||
003E
|
LD ($5C78),HL
|
||
0041
|
LD A,H
|
||
0042
|
OR L
|
||
0043
|
JR NZ,KEY_INT
|
||
0045
|
INC (IY+$40)
|
||
KEY_INT
|
0048
|
PUSH BC
|
Save the current values held in these registers.
|
0049
|
PUSH DE
|
||
004A
|
CALL KEYBOARD
|
Now scan the keyboard.
|
|
004D
|
POP DE
|
Restore the values.
|
|
004E
|
POP BC
|
||
004F
|
POP HL
|
||
0050
|
POP AF
|
||
0051
|
EI
|
The maskable interrupt is enabled before returning.
|
|
0052
|
RET
|
Outra rotina útil da ROM para invocar com CALL nos nossos programas, é WAIT-KEY1, em $15DE, para esperar por uma tecla.
LD A,1 ; lower screen | |
CALL 5633 ; open channel | |
CALL $15DE ; WAIT-KEY1 | |
RET |
Para ler mais detalhes sobre o teclado, e rotinas em ASM, veja, em espanhol, este link: Lectura del teclado en el Spectrum.
Além de se pressionar várias teclas ao mesmo tempo, tb se podem activar várias half-rows ao mesmo tempo, com excepção dos Timex 2048/2068.
ResponderEliminar