Curso de Basic
Blink
Você está em: MarMSX >> Cursos >> BASIC
Blink é um recurso do MSX 2 na screen 0 com 80 colunas que faz determinados caracteres da VRAM piscarem, alternando a cor de frente e fundo padrão com outras cores de frente e fundo.
O blink de cada caractere é controlado individualmente, onde cada bit da tabela de blink corresponde a um caractere na tela. O valor 1 ativa o blink, enquanto que o valor 0 desativa o blink.
A tabela de blink se localiza a partir da posição 2048 da VRAM.
Ajustes:
- VDP(7) - cor de frente + cor de fundo no modo texto.
- VDP(13) - cor de frente + cor de fundo do blink.
- VDP(14) - período do blink.
Para os VDPs 7 e 13, os 4 bits de mais ordem definem a cor de frente, enquanto que os bits restantes definem a cor de fundo. Exemplo:
VDP(7) = &HF1
Cor de frente é 15 (&HF) e cor de fundo é 1.
Para o VDP 14, os 4 bits de mais ordem definem o tempo de exibição da cor do blink, enquanto que os 4 bits de menor ordem definem o tempo de exibição da cor original. O período de tempo é definido em unidades de 1/6 segundos. Exemplo:
VDP(14) = &H24
Define um tempo de 1/3 segundos para a cor do blink e 2/3 segundos para a cor original.
Visto que a tabela de blink começa na posição 2048 e que cada bit controla um caractere da tela, temos:
Tela
+---------------------------------
|00 01 02 03 04 05 06 07 08 09 ...
|80 81 82 ...
VRAM
| 7 6 5 4 3 2 1 0 - bits
------------------------------
2048 | 00 01 02 03 04 05 06 07
2049 | 08 09 10 11 12 13 14 15
...
Assim, para ativarmos o blink no caractere 00 da tela, fazemos:
VPOKE 2048,&B10000000
Para ativarmos o blink no caractere 01 da tela, fazemos:
VPOKE 2048,&B01000000
Para ativarmos o blink nos caracteres 01 e 02 da tela, fazemos:
VPOKE 2048,&B01100000
A tabela de blink inicialmente está "suja". Dessa forma, é necessário limpá-la antes de começar uma aplicação. Caso isso não seja feito, poderemos ter diversos caracteres piscando na tela aleatoriamente.
Rotina para limpar a tabela de blink.
10 FOR E=2048 TO 2287
20 VPOKE E,0
30 NEXT E
Exemplo de como criar o efeito de blink.
10 SCREEN 0 : WIDTH 80
20 PRINT "Esse texto vai piscar"
30 VDP(7)=&HF1
40 VDP(13)=&H4F
50 VDP(14)=&H22
60 VPOKE 2048,&HFF
70 VPOKE 2049,&HFF
80 VPOKE 2050,&HF8
Saída na tela:
O comando "VDP(14)=0" pára o efeito de blink para toda a tela.
Para calcular o endereço da tabela de blink a partir de uma coordenada X,Y da tela, variando X de 0 a 79 e Y de 0 a 23, fazemos:
E = 2048 + (Y*80 + X) / 8
Deve-se lembrar que cada endereço da tabela de blink controla 8 caracteres. Para alterar o caractere desejado, devemos fazer:
B = 2^(7 - X MOD 8)
VPOKE E, VPEEK(E) OR B
Programa completo para calcular o endereço do VDP a partir de uma coordenada X,Y:
10 SCREEN 0:WIDTH 80
20 VDP(7)=&HF1
30 VDP(13)=&H1F
40 VDP(14)=&H22
50 X=1 : Y=2
60 E = 2048 + (Y*80+X)/8
70 B = 2 ^ (7 - X MOD 8)
80 VPOKE E, VPEEK(E) OR B
Podemos criar um menu de barras na screen 0 e width 80 utilizando o blink. Para isso, definimos o tempo de exibição da cor original como 0 e da cor do blink um valor diferente de zero. Experimente trocar a linha 50 do programa do efeito de blink em um texto por:
50 VDP(14)=&H10
O programa a seguir cria um menu de barras, de forma a ilustrar a criação desse tipo de menu utilizando o blink.
Observe que ao teclar ENTER, a barra sobre a opção passa a piscar, confirmando a escolha.
10 SCREEN 0:WIDTH 80
15 FOR E=2048 TO 2287: VPOKE E,0: NEXT
20 PRINT"Menu"
30 PRINT"----"
40 PRINT"Novo"
50 PRINT"Carregar"
60 PRINT"Salvar"
70 PRINT"Exportar"
80 VDP(7)=&HF1
90 VDP(13)=&H1F
100 VDP(14)=&H10
110 OP=1:E=2048+((OP+1)*80)/8
120 VPOKE E,0
130 E=2048+((OP+1)*80)/8
140 VPOKE E,255
150 A$=INKEY$: IF A$="" THEN 150
160 A=ASC(A$)
170 IF A=31 THEN OP=OP+1 : IF OP>4 THEN OP=1
180 IF A=30 THEN OP=OP-1 : IF OP<1 THEN OP=4
190 IF A=13 THEN VDP(14)=&H11 : GOTO 210
200 GOTO 120
210 FOR T=1 TO 1000 : NEXT
220 CLS : WIDTH 40
Referências:
[1]- MSX2 Technical Handbook, ASCII corporation, 1987.