Curso de Basic
Desenhando nas screens 0 e 1


  O capítulo 15 do curso de Basic apresentou as tabelas de nomes, caracteres e cores do MSX 1. A partir da modificação dessas tabelas nas screens 0 e 1, é possível gerar novos símbolos ou até mesmo figuras mais complexas, formadas a partir da união de caracteres.


  A tabela de caracteres

  As screens 0 e 1 utilizam a tabela de caracteres para desenhar os caracteres na tela. Normalmente, esta tabela é fixa e é utilizada para dar forma a letras, números e símbolos utilizados no modo texto.
  Podemos alterar a tabela de caracteres, de modo a criar uma nova fonte de texto para as screens 0 e 1. O programa Aquarela possui um pacote com diversas fontes, no qual podem ser carregadas das seguintes formas:
10 SCREEN 0
20 BLOAD"FONTE.ALF",S,&H7600
10 SCREEN 1
20 BLOAD"FONTE.ALF",S,&H6E00
  Obs: em cada modo de tela, é necessário aplicar um deslocamento à posição &H9200 definida no header do arquivo, de modo que a fonte caia no inicio da tabela de caracteres de cada modo de tela.

  O resultado para a screen 1 pode ser visto a seguir.

 

  Podemos utilizar a tabela de caracteres para formar desenhos mais complexos, a partir da união de caracteres, exatamente como fazem os sprites. É possível utilizar até 256 blocos de caracteres para compor um desenho.
  Na screen 0, é necessário levar em conta que as duas últimas colunas de cada caractere é descartada.
  Para exemplificar, vamos criar o desenho de um círculo na screen 0, com dimensões de 12x16 pixels. Esse desenho irá consumir 4 caracteres da tabela de caracteres.
000111110000
001000001000
010000000100
100000000010
100000000010
100000000010
100000000010
100000000010
100000000010
100000000010
100000000010
100000000010
100000000010
010000000100
001000001000
000111110000

  Separando em blocos, exatamente como nos sprites, temos:
000111
001000
010000
100000
100000
100000
100000
100000

100000
100000
100000
100000
100000
010000
001000
000111

110000
001000
000100
000010
000010
000010
000010
000010

000010
000010
000010
000010
000010
000100
001000
110000

  Visto que cada linha do caractere tem 8 bits, e que os dois mais à direita são descartados pela screen 0, acrescentaremos dois zeros ao final de cada linha.
  Convertendo os números para hexadecimal, fica:
1C, 10, 20, 40, 40, 40, 40, 40
40, 40, 40, 40, 40, 20, 10, 1C
60, 08, 04, 02, 02, 02, 02, 02
02, 02, 02, 02, 02, 04, 08, 60

  Obs: não é necessário acrescentar os dois zeros a cada linha da screen 1, visto que cada linha já tem 8 colunas.

  Agora, vamos colocar os padrões na tabela de caracteres, nas posições 250, 251, 252 e 253.
10 SCREEN 0
20 E = 2048 + 250*8
30 FOR I=1 TO 32
40 READ A$
50 D = VAL("&H"+A$)
60 VPOKE E, D
70 E=E+1
80 NEXT
90 DATA 1C, 20, 40, 80, 80, 80, 80, 80
100 DATA 80, 80, 80, 80, 80, 40, 20, 1C
110 DATA C0, 20, 10, 08, 08, 08, 08, 08
120 DATA 08, 08, 08, 08, 08, 10, 20, C0

  Por fim, vamos desenhar o círculo:
05 CLS
10 LOCATE 0,0 : ? CHR$(250)
20 LOCATE 0,1 : ? CHR$(251)
30 LOCATE 1,0 : ? CHR$(252)
40 LOCATE 1,1 : ? CHR$(253)

  O resultado pode ser visto a seguir.

 

  A imagem a seguir mostra a tabela de caracteres modificada, onde os caracteres do círculo são marcados em verde.

 



  Animação - o logo da Riosoft

  Os programas de autoexec mais modernos da Riosoft possuiam uma animação do logo da empresa em screen 0, que subia até o topo da tela.
  Este logo é feito utilizando-se 11 colunas por 4 linhas de caracteres, a partir da posição 182 da tabela de caracteres.
  O trecho de programa que desenha o logo e faz a animação é o seguinte:
10 COLOR15,1,1:SCREEN0:KEYOFF
20 TT=2048+8*182
30 READI:IFI=999THEN40ELSEVPOKETT,I:TT=TT+1:GOTO30
40 LOCATE1,21:PRINTSTRING$(13,32);:FORT=182TO192:PRINTCHR$(T);:NEXT:PRINT:
PRINT" "STRING$(13,32);:FORT=193TO203:PRINTCHR$(T);:NEXT:PRINT:PRINT" "
STRING$(13,32);:FORT=204TO214:PRINTCHR$(T);:NEXT:PRINT
50 SOUND1,0:SOUND3,0:SOUND5,0:SOUND7,&B111000:SOUND8,15:SOUND9,15:SOUND10,15
60 PRINT" "STRING$(13,32);:FORT=215TO225:PRINTCHR$(T);:NEXT:PRINT:FORI=1TO18:
SOUND0,255-I*10:SOUND2,I*10:SOUND4,I*10:PRINT:NEXT:BEEP
70 DATA ,,,,,,,,,,,,,,,,,,,,,,,4,,,,28,60,,252,252,28,252,,252,252,,252,252,
240,252,,252,252,,252,252,,128,,240,248,,252,252,,,,,,,128,192,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,60,52,48,,,,
80 DATA ,4,128,128,,12,12,,,240,192,192,,252,252,,,28,52,96,,252,252,,,4,140,
132,,252,252,,,224,144,224,,252,252,,,28,52,96,,224,224,,,4
90 DATA 132,132,,,,,,240,128,128,,,,,,12,124,12,,,,,,192,,,116,124,100,,,,,,
132,4,140,,,,,,128,128,224,,12,12,,4
100 DATA 96,116,60,,252,252,,252,136,140,4,,252,252,,252,48,176,224,,252,252,
,252,96,116,60,,252,252,,252,140,140,12,,224,224,,192,192,,,,,,,,12,24
110 DATA 24,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,252,,60,28,,,,,252,,252,252
120 DATA ,252,28,,252,,252,252,,252,240,,252,,248,240,,128,,,128,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,999
  Obs: quando o valor em DATA é omitido, equivale a zero. Ex: DATA ,,1 equivale a DATA 0,0,1.

  O logo pode ser visto a seguir.

 

  A figura a seguir mostra como foi modificada a tabela de caracteres, com os caracteres do logo assinalados em verde.

 

  Os caracteres formam um mosaico de 11 colunas por 4 linhas, conforme mostra a figura a seguir.

 

  As linhas do desenho estão em seqüência na tabela de caracteres, da posição &HB6 até &HE1. Basta apenas escrevê-las na tela. Veja como.
10 C=&HB6
20 FOR Y=1 TO 4
30 FOR X=1 TO 11
40 PRINT CHR$(C);
50 C=C+1
60 NEXT X
70 PRINT
80 NEXT Y
  Obs: ao dar o comando SCREEN, a tabela de caracteres é apagada e o desenho é perdido.

  Como a animação é feita?
  O programa imprime o desenho na parte de baixo da tela. Em seguida, aplica o comando PRINT na última linha 18 vezes, fazendo com que a tela se desloque para cima.


  A tabela de cores

  A screen 1 possui também a tabela de cores. Entretanto, esta tabela é um pouco diferente da screen 2. Ela possui 32 bytes, começando da posição 8192.
  Em vez de controlar uma linha de cada caractere, ela controla a cor de frente e fundo de um grupo de 8 caracteres.
  Exemplo:
10 SCREEN 1 : WIDTH 32
20 E = 8192 + INT(97/8)
30 VPOKE E, &B11111100
40 PRINT"Alguns aaaaaaaaaas para o teste"
  O resultado pode ser visto a seguir.

 

  Observe que a mudança de cor de frente branca e fundo verde varia da letra "a" até a "g".


  Ferramenta para geração de mosaicos

  Na seção de ferramentas da página MarMSX, há um programa em GNU-Octave / Matlab para converter imagens GIF monocromáticas em mosaicos na tabela de caracteres das screens 0 e 1.
  Ao executar o programa, o usuário deverá informar o nome do arquivo GIF, o nome do arquivo de saída e a posição inicial do mosaico na tabela de caracteres.
  São fornecidos junto ao programa dois exemplos contendo a mesma imagem em screen 0 e screen 1. A figura a seguir mostra o desenho na screen 0.

 

  Dependendo do tamanho do desenho, boa parte da tabela de caracteres é ocupada, apagando principalmente o padrão das letras. No exemplo fornecido isto acontece. Dessa forma, ao digitar na tela aparecerão outros padrões em vez das letras. Entretanto, pode-se comandar screen 0, mesmo não aparecendo escrito, que a tela volta ao normal.


MARMSX/CURSOS/Basic