segunda-feira, 11 de novembro de 2019

O teclado do ZX Spectrum

O teclado do ZX Spectrum do ponto de vista electrónico, é uma matriz com uns diodos entre linhas de endereços e de dados, ligada à ULA.


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.

1 comentário:

  1. 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