Skip to content

Latest commit

 

History

History
79 lines (63 loc) · 9.27 KB

modos_de_video.md

File metadata and controls

79 lines (63 loc) · 9.27 KB

Modos de vídeo

O chip responsável por converter o conteúdo da RAM em imagens é o Video Display Generator Motorola MC6847, usado também no TRS-80 Color Computer / Prológica CP400 e em outros microcomputadores da época.

O BASIC do MC1000, por ser baseado no BASIC do Apple II, só oferece três opções de modos de vídeo, acessados pelos comandos TEXT, GR e HGR.

Porém, o chip MC6847 oferece outros modos de vídeo, que podem ser acessados por meio da porta de saída COL32 ($80 / 128). Essa porta acessa um latch de 8 bits, um componente eletrônico que retém um valor e cujos bits (exceto o bit 0) alimentam os pinos do MC6847 que definem o modo de vídeo:

Bit de COL32 Pino do MC6847 Função
7 ¬A/G 0 = modo não gráfico; 1 = modo gráfico.
6 ¬A/S Se modo não gráfico: 0 = modo alfanumérico; 1 = modo semigráfico.
5 ¬INT/EXT Se modo alfanumérico: 0 = conjunto interno de caracteres; 1 = caracteres obtidos de ROM externa.
Se modo semigráfico: 0 = modo semigráfico 4; 1 = modo semigráfico 6.
4, 3, 2 GM2, GM1, GM0 Se modo gráfico: Seleciona qual modo gráfico.
1 CSS Seleciona paleta de cores.
0 Comutação de bancos (bank switching): 0 = Z80 acessa VRAM; 1 = Z80 acessa RAM.

O que nos dá os seguintes modos de vídeo (assumindo bit 0 = 1):

Amostra (vide programa) Valor de COL32 Modo Dimensões Descrição
$01 / 1 (TEXT) Alphanumeric Internal (CSS=0) 32×16 caracteres.
32 bytes por linha × 16 linhas = 512 bytes ($8000–$81FF).
Caracteres verdes-escuros. Fundo verde. Borda preta. (*)
$03 / 3 Alphanumeric Internal (CSS=1) 32×16 caracteres.
32 bytes por linha × 16 linhas = 512 bytes ($8000–$81FF).
Caracteres vermelhos-escuros. Fundo laranja. Borda preta. (*)
$41 / 65 Semigraphics 4 32×16 caracteres.
64×32 "pixels".
32 bytes por linha × 16 linhas = 512 bytes ($8000–$81FF).
O espaço de cada caracter é dividido em quatro partes (2×2). Os bits 0–3 indicam quais partes ficam acesas. Os bits 4–6 indicam a cor das partes acesas (verde, amarelo, azul, vermelho, branco, ciano, magenta, laranja). O bit 7 é ignorado. Fundo preto. Borda preta.
$61 / 97 Semigraphics 6 (CSS=0) 32×16 caracteres.
64×48 "pixels".
32 bytes por linha × 16 linhas = 512 bytes ($8000–$81FF).
O espaço de cada caracter é dividido em seis partes (2×3). Os bits 0–5 indicam quais partes ficam acesas. Os bits 6–7 indicam a cor das partes acesas (verde, amarelo, azul, vermelho). Fundo preto. Borda preta.
$63 / 99 Semigraphics 6 (CSS=1) 32×16 caracteres.
64×48 "pixels".
32 bytes por linha × 16 linhas = 512 bytes ($8000–$81FF).
O espaço de cada caracter é dividido em seis partes (2×3). Os bits 0–5 indicam quais partes ficam acesas. Os bits 6–7 indicam a cor das partes acesas (branco, ciano, magenta, laranja). Fundo preto. Borda preta.
$81 / 129 Color Graphics 1 (CSS=0) 64×64 pixels.
16 bytes por linha × 64 linhas = 1024 bytes ($8000–$83FF).
Verde, amarelo, azul, vermelho. Fundo verde. Borda verde.
$83 / 131 Color Graphics 1 (CSS=1) 64×64 pixels.
16 bytes por linha × 64 linhas = 1024 bytes ($8000–$83FF).
Branco, ciano, magenta, laranja. Fundo branco. Borda branca.
$85 / 133 Resolution Graphics 1 (CSS=0) 128×64 pixels.
16 bytes por linha × 64 linhas = 1024 bytes ($8000–$83FF).
Verde-escuro, verde. Fundo verde-escuro. Borda verde.
$87 / 135 Resolution Graphics 1 (CSS=1) 128×64 pixels.
16 bytes por linha × 64 linhas = 1024 bytes ($8000–$83FF).
Preto, branco. Fundo preto. Borda branca.
$89 / 137 (GR)
(No TRS-80 Color Computer: PMODE3: SCREEN0)
Color Graphics 2 (CSS=0) 128×64 pixels.
32 bytes por linha × 64 linhas = 2048 bytes ($8000–$87FF).
Verde, amarelo, azul, vermelho. Fundo verde. Borda verde.
$8B / 139
(No TRS-80 Color Computer: PMODE3: SCREEN1)
Color Graphics 2 (CSS=1) 128×64 pixels.
32 bytes por linha × 64 linhas = 2048 bytes ($8000–$87FF).
Branco, ciano, magenta, laranja. Fundo branco. Borda branca.
$8D / 141 Resolution Graphics 2 (CSS=0) 128×96 pixels.
16 bytes por linha × 96 linhas = 1536 bytes ($8000–$85FF).
Verde-escuro, verde. Fundo verde-escuro. Borda verde.
$8F / 143 Resolution Graphics 2 (CSS=1) 128×96 pixels.
16 bytes por linha × 96 linhas = 1536 bytes ($8000–$85FF).
Preto, branco. Fundo preto. Borda branca.
$91 / 145 Color Graphics 3 (CSS=0) 128×96 pixels.
32 bytes por linha × 96 linhas = 3072 bytes ($8000–$8BFF).
Verde, amarelo, azul, vermelho. Fundo verde. Borda verde.
$93 / 147 Color Graphics 3 (CSS=1) 128×96 pixels.
32 bytes por linha × 96 linhas = 3072 bytes ($8000–$8BFF).
Branco, ciano, magenta, laranja. Fundo branco. Borda branca.
$95 / 149 Resolution Graphics 3 (CSS=0) 128×192 pixels.
16 bytes por linha × 192 linhas = 3072 bytes ($8000–$8BFF).
Verde-escuro, verde. Fundo verde-escuro. Borda verde.
$97 / 151 Resolution Graphics 3 (CSS=1) 128×192 pixels.
16 bytes por linha × 192 linhas = 3072 bytes ($8000–$8BFF).
Preto, branco. Fundo preto. Borda branca.
$99 / 153 Color Graphics 6 CSS=0) 128×192 pixels.
32 bytes por linha × 192 linhas = 6144 bytes ($8000–$97FF).
Verde, amarelo, azul, vermelho. Fundo verde. Borda verde.
$9B / 155 Color Graphics 6 (CSS=1) 128×192 pixels.
32 bytes por linha × 192 linhas = 6144 bytes ($8000–$97FF).
Branco, ciano, magenta, laranja. Fundo branco. Borda branca.
$9D / 157
(No TRS-80 Color Computer: PMODE4: SCREEN0)
Resolution Graphics 6 (CSS=0) 256×192 pixels.
32 bytes por linha × 192 linhas = 6144 bytes ($8000–$97FF).
Verde-escuro, verde. Fundo verde-escuro. Borda verde.
$9F / 159 (HGR)
(No TRS-80 Color Computer: PMODE4: SCREEN1)
Resolution Graphics 6 (CSS=1) 256×192 pixels.
32 bytes por linha × 192 linhas = 6144 bytes ($8000–$97FF).
Preto, branco. Fundo preto. Borda branca.

(*) O circuito do MC1000 liga o bit 7 do byte lido da VRAM ao pino INV do MC6847. Por isso, nos modos alfanuméricos, os caracteres de código ASCII de 0 a 127 aparecem claros sobre fundo escuro, e os de 128 a 255 aparecem escuros sobre fundo claro.

No BASIC, definimos o valor de COL32 por meio da instrução OUT 128,x. E se você subtrair 1 dos valores da tabela acima, poderá ler e escrever na VRAM a partir do endereço de memória 32768 ($8000).

10  GR
20  OUT 128,130
30  FOR A = 0 TO 255
40  POKE 32768 + A,A
50  NEXT

No entanto, alguns eventos do MC1000 (intermitência do cursor, escrita de texto na tela, etc.) leem o valor da variável do sistema MODBUF ($00F5 / 245) e redefinem COL32 com esse valor, e assim podem anular algum comando OUT que você tiver emitido. É o que acontece no programa acima: ao imprimir "OK" quando o programa acaba, o MC1000 joga para a porta COL32 o conteúdo do endereço MODBUF (que é 137, que foi colocado pelo comando GR na linha 10), e a tela volta a ter a cara do modo GR.

Em tais situações, em vez de (ou além de) emitir o comando OUT 128,x, pode ser útil emitir o comando POKE 245,x.

10  TEXT : HOME
20  PRINT "VISUALIZANDO TELA DE FUNDO VERDE"
30  INPUT "PRESSIONE ENTER";X$
40  POKE 245,3
50  PRINT "VISUALIZANDO TELA DE FUNDO VERMELHO"

Aqui nem foi preciso emitir o comando OUT, porque o PRINT da linha 50 se encarrega de fazê-lo.

Um exemplo prático útil: Quando um erro ocorre em modo gráfico você não consegue ler a mensagem de erro correspondente (porque o MC1000 continua em modo gráfico e os caracteres aparecem como pontos na tela; e se você emitir um comando TEXT ou HOME para voltar ao modo texto a tela é apagada). Nesse caso, digite POKE 245,1 para passar ao modo texto sem limpar a tela e poder ler a mensagem de erro.

10  GR
20  GOTO : REM PRODUZ "LI ERRO EM 20"
RUN
POKE 245,1

Outra forma de fazer o MC1000 a passar para o modo texto sem apagar a tela é dar o comando DEBUG. (Dica de Kleber Desan na revista Micro Sistemas nº 55, de abril de 1986.)