A organização da tela do TK90X na RAM é complexa, como se pode observar no vídeo abaixo:
Um pequeno programa BASIC faz poke na memória de vídeo linearmente, de 16384 (#4000 hex) a 22527 (#57FF hex). O que se observa é que a tela vai sendo preenchida de forma não linear. Embora haja várias publicações que explicam essa organização, resolvi escrever sobre o tema também, com abordagem um pouco diferente.
O ponto de partida é o caractere, que pode representar letras, algarismos, símbolos, blocos gráficos ou, no caso do UDG, virtualmente qualquer coisa. Um caractere é um conjunto de 64 pixels, organizados numa matriz 8×8. O estado de cada pixel é representado por um bit, portanto são necessários 8 bytes para representar um caractere. Segue o exemplo do caractere “A”.
Byte 0: 00000000
Byte 1: 00111100
Byte 2: 01000010
Byte 3: 01000010
Byte 4: 01111110
Byte 5: 01000010
Byte 6: 01000010
Byte 7: 00000000
A tela do TK90X é formada por 256 pixels horizontais por 192 pixels verticais, portanto comporta no total 768 caracteres, em 24 linhas e 32 colunas. As linhas são numeradas de 0 a 23, em direção de cima para baixo. As colunas são numeradas de 0 a 31, em direção da esquerda para a direita.
Para construir um endereço dentro da RAM da tela, basta saber a linha (bits L0 a L4) e a coluna (bits C0 a C4) do caractere e a posição do byte desejado (bits B0 a B2):
Linha |
Coluna |
Byte |
||||||||||
L4 |
L3 |
L2 |
L1 |
L0 |
C4 |
C3 |
C2 |
C1 |
C0 |
B2 |
B1 |
B0 |
Agora, basta rearranjar esses 13 bits como mostrado abaixo, para formar o endereço de 16 bits:
Endereço (byte mais significativo) |
Endereço (byte menos significativo) |
||||||||||||||
b15 |
b14 |
b13 |
b12 |
b11 |
b10 |
b9 |
b8 |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
0 |
1 |
0 |
L4 |
L3 |
B2 |
B1 |
B0 |
L2 |
L1 |
L0 |
C4 |
C3 |
C2 |
C1 |
C0 |
Em Assembly Z80 há instruções para manipular bits, portanto não é difícil de se fazer o rearranjo acima. Entretanto no BASIC Sinclair, não há comando ou função equivalente, então a equação torna-se mais complicada. Considerando as variáveis L (linha), C (coluna) e B (byte), ficaria:
LET Endereco = 16384+2048*INT(L/8)+256*B+32*(L-8*INT(L/8))+C
O comando BASIC acima pode ser simplificado como:
LET Endereco = 16384+1792*INT(L/8)+256*B+32*L+C
Da posse dessas informações, agora fica possível de se fazer um poke linear na tela do TK90X. Segue a listagem do programa BASIC:
10 FOR L=0 TO 23
20 FOR B=0 TO 7
30 FOR C=0 TO 31
40 POKE 16384+1792*INT (L/8)+256*B+32*L+C,255
50 NEXT C: NEXT B: NEXT L
60 PAUSE 0
O vídeo mostrando a exibição do programa acima rodando é:
Para maiores informações sobre o assunto, veja:
- Mike James, Guia avançado para o Spectrum. Lisboa/São Paulo: Editorial Verbo, 1984, p. 94.
- Álvaro F. F. Borja, A tela do TK90X, Micro Sistemas, Nº 56, Maio/1986, p. 22.
Olá Flávio! Muito útil sua publicação! Valeu!
ResponderExcluirIs the ula+ and spectra tk90 compatible?
ResponderExcluir