Para brincar em Jaú: O buffer de teclado do MSX

Povo que se encontra hoje (e todo o resto): interessado em saber como funciona o buffer de teclado dos MSX e todos os outros buffers circulares implementados até hoje?

O buffer do MSX tem tamanho de 40 caracteres e fica em 0xFBF0 (KEYBUF); nos endereços 0xF3F8 (PUTPNT) e 0xF3FA (GETPNT) ficam armazenados os endereços onde as teclas digitadas são armazenadas (colocadas no buffer) e lidas (retiradas do buffer). Este pequeno programa em MSX-BASIC vai te ajudar a visualizar o processo — há a necessidade de um joystick conectado na porta A do MSX:

10 COLOR 15,0,0:SCREEN 0,,1:WIDTH 40
15 I%=&HC000:DEFUSR0=I%:OP%=0:OG%=0
20 READ K$:IF K$<>"*" THEN POKE I%,VAL("&h"+K$):I%=I%+1:GOTO 20
25 DATA 01,28,00,11,00,00,21,F0,FB,CD,5C,00,C9,*
30 P%=CVI(CHR$(PEEK(&HF3F8))+CHR$(PEEK(&HF3F9)))
35 G%=CVI(CHR$(PEEK(&HF3FA))+CHR$(PEEK(&HF3FB)))
40 XG%=G%+1040:XP%=P%+1040:I%=USR0(0)
45 IF OG%<>XG% THEN LOCATE OG%,2:PRINT " "
50 IF OP%<>XP% THEN LOCATE OP%,3:PRINT " "
55 LOCATE XG%,2:PRINT "*":LOCATE XP%,3:PRINT "^"
60 OG%=XG%:OP%=XP%:IF STICK(1)=0 THEN 30
65 K$=INKEY$:IF K$<>"" THEN VPOKE 160,ASC(K$)
70 GOTO 30

Na primeira linha da tela está o conteúdo do buffer do teclado, o ” ^ ” indica o endereço onde a próxima tecla será armazenado e o ” * ” a próxima a ser lida. Ao mexer para qualquer direção no joystick A você retirará uma tecla do buffer (e o ” * * seguirá para a próxima posição).

Atenção:
I. A função CVI() converte strings de dois bytes em números inteiros e me poupa de duas sofridas multiplicações, faz parte da extensão da DISK-BASIC e para rodar em um MSX sem ela, altere as linhas 30 e 35 para:

30 P%=PEEK(&HF3F8)+PEEK(&HF3F9)*256
35 G%=PEEK(&HF3FA)+PEEK(&HF3FB)*256

II. O programa tem um bug que eu não consegui compreender quando ocorre. Mas em algumas situações a posição calculada para PUTPNT simplesmente vai parar fora da área do buffer, produzindo um valor maluco (271) que causa erro na linha 55;

Sobre Giovanni Nunes

Giovanni Nunes (anteriormente conhecido como “O Quinto Elemento”) é uma das mentes em baixa resolução que compõem o Governo de Retrópolis, responsável pela identidade visual de todas as facetas do nosso Império Midiático.