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;