Curso de Basic
Desenhando nas screens 0 e 1


Você está em: MarMSX >> Cursos >> BASIC   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 Graphos III 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:
5 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, &HFC: 'texto=15, fundo=12
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".


  O efeito "paleta" com caracteres

  Quando utilizamos o recurso de paleta de cores no MSX (e também no PC), cada cor é representada por um índice de uma tabela que contém os valores RGB daquela cor. Assim, quando modificamos o valor de uma determinada cor nessa tabela, todos os pontos na tela que contiverem o código dessa cor modificada são imediatamente afetados pela mudança.

  Veja o exemplo a seguir (MSX 2).
10 SCREEN 0:COLOR 15,0,0:KEY ON
20 PRINT"Tecle algo ..."
30 A$=INPUT$(1)
40 COLOR=(15,7,0,0)
50 PRINT"Tecle algo de novo ..."
60 A$=INPUT$(1)
70 COLOR=NEW
  Ao pressionar uma tecla pela primeira vez, todos os pontos brancos da tela são modificados para vermelho. Na segunda, são restaurados.

  A mudança de cor é instantânea! Dessa forma, utilizaremos um recurso semelhante para modificar todos os caracteres de uma só vez no MSX 1.

  Vimos que para cada bloco de 8x8 pixels (ou 8x6) na tela do MSX, há um código de caractere armazenado na tabela de nomes. Assim, se modificarmos o desenho de um determinado caractere na tabela de caracteres, o efeito é transmitido imediatamente para todos os caracteres na tela que contiverem aquele código ASCII na tabela de nomes.

  No exemplo a seguir, iremos modificar o padrão da letra "a".
10 SCREEN 1:COLOR 15,0,0:KEY ON
20 FOR I=0 TO 15
30 PRINT STRING$(32,"a");
40 NEXT I
50 LOCATE 0,20:PRINT"Tecle algo ..."
60 A$=INPUT$(1):EI=97*8
70  VPOKE EI  ,&B01111000
80  VPOKE EI+1,&B10110100
90  VPOKE EI+2,&B11111100
100 VPOKE EI+3,&B11111100
110 VPOKE EI+4,&B11001100
120 VPOKE EI+5,&B11111100
130 VPOKE EI+6,&B10101000
140 VPOKE EI+7,&B00000000
  A troca do desenho de todos os "a"s é imediata!

  O mesmo efeito pode ser obtido se alterarmos a tabela de cores das screens 1 e 2. Veja o exemplo a seguir.
10 SCREEN 1:COLOR 15,0,0
20 PRINT"ABCDEF"
30 PRINT"Tecle algo ..."
40 A$=INPUT$(1)
50 VPOKE 8200,&H5C
60 PRINT"Tecle algo ..."
70 A$=INPUT$(1)
80 VPOKE 8200,&HF0


  Ferramenta para geração de mosaicos

  O projeto MSX Font Editor além de permitir a edição de fontes para o MSX, possui uma ferramenta para a criação de mosaicos nas tabelas de caracteres do MSX. Ela é capaz de gerar mosaicos tanto para a screen 0, como para a screen 1.

 

  O programa foi desenvolvido em Java e roda em todos os sistemas operacionais compatíveis com o Java.
  O que o usuário deve fazer é fornecer ao programa uma imagem monocromática (somente com as cores preto e branco), além de indicar o endereço inicial da tabela ASCII onde o mosaico deverá ser criado.

  A seguir, dois exemplos de mosaicos criados na tabela ASCII do MSX.

 


 

  Dependendo do tamanho do desenho, boa parte da tabela de caracteres é ocupada, apagando principalmente o padrão das letras. No primeiro exemplo 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.

  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.


<< Anterior Basic Próxima >>