Scroll: todos os recursos da linguagem
Dos pares de letras em SCREEN 1 ao scroll por hardware do MSX 2 e 2+: qual comando usar, como cada um funciona por dentro e quanto custa.
1. Mapa dos recursos de scroll
| Recurso | Máquina / tela | Como move | Capítulo |
|---|---|---|---|
SCROLLCONFIG / SCROLLMAP / SCROLL | MSX 1, SCREEN 1 | Giro dos desenhos das letras (1 px) + troca de letras (8 px) | este |
SCROLLTILES n, desenhos, cores | MSX 1, SCREEN 1 | Blocos próprios com cor, pares de vizinhos reais | este |
SCROLLTILE dx, dy | MSX 1, SCREEN 1 | Só de 8 em 8 pontos (uma casa por vez) | este |
SMOOTHROLL / SCROLLFINE | MSX 1, telas de caracteres | Desloca os desenhos de uma faixa de linhas, 1 px por vez (esquerda, direita, cima, baixo) | este |
SMOOTHROLLMIX | MSX 1, telas de caracteres | Igual ao anterior, com velocidade fracionada (1 a 8 px a cada 8 quadros) para paralaxe | este |
SCROLL2 | MSX 2, SCREEN 5 | Faixas copiadas pelo chip de vídeo + R#23 (vertical) + R#18 (ajuste fino) | 24 (SCROLL2) |
SCROLL4 | MSX 2, SCREEN 4 | Duas tabelas de nomes + R#18 (0–7 px) + R#23 (vertical), com HUD e cortina de sprites | 25 |
VSCROLL y | MSX 2 em diante, qualquer SCREEN | Vertical por hardware (R#23), 1 ponto por vez | este |
VSCROLL ROW n | MSX 1, SCREEN 1 e 2 | Vertical de 8 em 8 pontos, movendo as linhas de blocos | este |
VSCROLL FINE n | MSX 1, SCREEN 1 | Vertical ponto a ponto, com pares de blocos de cima e de baixo | este |
| R#26/R#27 | MSX 2+ (V9958) e V9968 | Scroll horizontal contínuo por hardware | 24 e 26 |
Regra prática: no MSX 1 o scroll fino é sempre trabalho do processador; no MSX 2 ele passa a ser parcialmente do chip de vídeo; no MSX 2+ é totalmente de hardware.
2. Scroll em SCREEN 1: pares de letras vizinhas
Em SCREEN 1 a tela é uma grade de 32×24 casas. Cada casa mostra um caractere, e cada caractere é um desenho de 8×8 pontos guardado em 8 bytes, um byte por linha. Cada bit é um ponto: 1 aceso, 0 apagado.
Mover a tela de 8 em 8 pontos é fácil: basta escrever na grade a letra da coluna seguinte do mapa. O difícil é mover 1 ponto, porque a grade não anda pela metade de uma casa.
A linguagem resolve com pares de letras:
-
Quais letras o mapa usa. O
SCROLLMAPanota a faixa de caracteres do mapa (até 9 letras diferentes, de códigos próximos). -
Um caractere para cada par. Para cada par (letra da casa, letra da vizinha da direita), a linguagem monta nos caracteres 160–255 um desenho novo: o fim da letra empurrado
npontos para a esquerda, mais o começo da vizinha entrando pela direita:linha nova = (esquerda << n) OR (direita >> (8 - n))Com 2 letras são 4 pares (32 bytes por passo); com 9, 81 pares.
-
Redesenhar a janela. Com deslocamento zero, cada casa mostra a letra normal. Com deslocamento, mostra o caractere do par (casa, vizinha).
-
A cada 8 pontos o deslocamento volta a zero e o mapa avança uma coluna: a vizinha que já tinha entrado inteira passa a ser a letra da casa. Não há salto: o movimento é contínuo, mesmo com letras diferentes lado a lado.
A janela só é redesenhada a cada 8 pontos (quando a coluna muda); nos outros passos só os desenhos dos pares mudam. O mapa maior que a tela quase não custa nada: só as casas visíveis são lidas.
Limites
- No máximo 9 letras diferentes no mapa, com códigos próximos (por exemplo 65 a 73). Uma letra fora dessa faixa aparece sem deslocamento.
- Só os caracteres 32–127 entram na faixa.
3. Programa: Scroll Demo MSX 1
USES SCREEN 1, SCROLL
SCREEN 1
COLOR 15, 4, 4
CLS
DIM mapa(511) AS BYTE ' 64 colunas x 8 linhas
DIM x AS BYTE
DIM y AS BYTE
DIM idx AS WORD
FOR y = 0 TO 7
FOR x = 0 TO 63
idx = y * 64 + x
IF x MOD 4 = 0 THEN
mapa(idx) = 65 ' "A" = marcador
ELSE
mapa(idx) = 66 ' "B" = fundo
ENDIF
NEXT x
NEXT y
SCROLLCONFIG 0, 8, 32, 8 ' janela: coluna 0, linha 8, 32 x 8 casas
SCROLLMAP 64, 8, mapa ' mapa maior que a janela: o scroll da a volta
LOCATE 0, 0
PRINT "SCROLL DEMO - MSX 1"
Main:
SCROLL 1, 0 ' 1 ponto para o lado
WAIT ' um passo por quadro da TV
GOTO Main
Passo a passo:
- O mapa tem 64 colunas, o dobro da janela. A linha não entra na conta, então as 8 linhas são iguais e formam faixas em pé.
- O fundo é de letras "B": fundo simples para ver o marcador andar.
- O marcador "A" a cada 4 colunas serve de régua: dá para ver o movimento e conferir se há pulos.
SCROLLCONFIGdiz qual parte da tela é a janela; o resto (o título na linha 0) não se mexe.SCROLLMAPliga o mapa à janela e desenha a primeira tela.SCROLL 1, 0gira a fonte de 1 ponto e redesenha a janela; a cada 8 chamadas, a janela avança uma coluna do mapa.WAITespera o fim do quadro: um passo por quadro, 60 pontos por segundo, sem tremido.
Experimente usar até 9 letras diferentes no mapa (65 a 73): o deslize continua liso.
Para a esquerda ou para a direita
O sinal do primeiro número de SCROLL escolhe o sentido:
SCROLL 1, 0— o cenário anda para a esquerda (a "câmera" vai para a direita, como num jogo de nave avançando).SCROLL -1, 0— o cenário anda para a direita.SCROLL 2, 0,SCROLL -3, 0... — mais pontos por quadro, mais rápido.
Com SCROLL 1, 0 o deslocamento sobe de 0 a 7 e, ao voltar a 0, o mapa
avança uma coluna. Com SCROLL -1, 0 o mapa recua uma coluna e o
deslocamento desce de 7 a 0: o mesmo encaixe, ao contrário.
4. Cenário com blocos próprios: SCROLLTILES
Letras servem para testar; um jogo precisa de chão, montanha, nuvem. O
SCROLLTILES troca as letras por blocos desenhados pelo programa, cada
um com a sua cor:
DIM blocos(63) AS BYTE ' 8 blocos x 8 linhas (1 byte por linha)
DIM cores(7) AS BYTE ' cor de cada bloco: frente*16 + fundo
DIM mapa(767) AS BYTE ' o mapa guarda numeros de bloco (0 a 7)
SCROLLTILES 8, blocos, cores ' sempre antes do SCROLLMAP
SCROLLCONFIG 0, 6, 32, 12
SCROLLMAP 64, 12, mapa
SCROLL 1, 0
O exemplo completo está no menu Samples: "Scroll MSX 1: cenario com blocos".
Como funciona por dentro
- Só os pares que existem. O
SCROLLMAPpercorre o mapa e anota cada par (bloco, vizinho da direita) que aparece de verdade, incluindo a volta do fim da linha para o começo. Com 8 blocos seriam 64 pares possíveis; o cenário do exemplo usa menos de 20. - Um caractere por par, nos caracteres 128–255. As letras 0–127
continuam livres para o texto (
PRINT, placar). - Cor por bloco. Em SCREEN 1 a cor vale para grupos de 8 caracteres. Os pares são agrupados por (cor da esquerda, cor da direita). Num par de cores diferentes, o grupo usa a cor do bloco da esquerda nos primeiros 4 pontos do deslize e a do bloco da direita nos 4 últimos.
- A cada passo o
SCROLLredesenha os pares (8 bytes cada) e os 16 bytes de cor. A janela só é redesenhada a cada 8 pontos.
Limites
- Até 32 blocos diferentes.
- Até 128 pares (16 grupos de 8). Cada combinação de cores diferente abre um grupo novo; um par que não couber aparece como casa vazia. Use poucas cores de fundo.
- Numa casa com dois blocos de cores diferentes, a casa inteira tem uma cor só em cada momento: é o limite do SCREEN 1. Blocos com o mesmo fundo ficam perfeitos.
- Muitos pares custam tempo: com mais de uns 40 pares o passo pode passar de um quadro da TV, e o scroll anda a 30 quadros por segundo.
5. Os outros comandos de MSX 1
-
SCROLLTILE dx, dy— anda de casa em casa (8 pontos), sem giro. É o mais barato e não tem costura nenhuma. -
SMOOTHROLL dir, pontos, linhaIni, linhaFim, modo(sinônimoSCROLLFINE) — desloca os desenhos de uma faixa de linhas da tela.dir: 0 esquerda, 1 direita, 2 cima, 3 baixo.modo: 0 preenche com vazio, 1 dá a volta. -
SMOOTHROLLMIX dir, vel, linhaIni, linhaFim, modo—velde 1 a 8 pontos a cada 8 quadros; cada chamada move no máximo 1 ponto, o que permite várias faixas em velocidades diferentes (paralaxe). -
SCROLL dx, dy— rola a janela de scroll em 1 ponto:dx1 vai para a esquerda, -1 para a direita;dyfaz o mesmo na vertical. -
SCROLLCONFIG x, y, largura, altura— escolhe a janela da tela que rola (em casas de 8 pontos). O resto da tela, como o placar, fica parado. -
SCROLLMAP largura, altura, mapa— diz qual array de bytes guarda o mapa do cenário (largura × altura casas) que vai passando pela janela. -
BLOCKROLL bloco, dir, pontos— gira o desenho de um objeto de 2×2 casas (array com os 4 números de bloco).dir: 0 esquerda, 1 direita, 2 cima, 3 baixo.
6. MSX 2 e MSX 2+
SCROLL2(SCREEN 5): veja o capítulo do SCROLL2. Vertical grátis pelo R#23; horizontal por cópias do chip de vídeo, em faixas.SCROLL4(SCREEN 4): veja o capítulo 24. O deslocamento de 0 a 7 pontos é feito pelo ajuste de tela R#18, e o passo de 8 pontos pela troca entre duas tabelas de nomes.- MSX 2+ / V9968: R#26/R#27 fazem scroll horizontal contínuo de verdade.
7. Resumo
- SCREEN 1 move 1 ponto montando pares de letras vizinhas; até 9 letras diferentes.
- Caracteres acima de 127 não entram no deslocamento.
SCROLLTILESdá cenários com blocos próprios e cor por bloco.- Para cenários ainda mais ricos, use
SCROLL4(MSX 2) ou os registradores do MSX 2+.
Troca de casa sem salto (buffer duplo)
Com SCROLLTILES, a cada 8 pontos a janela troca os nomes das casas. Se os desenhos novos aparecessem antes dos nomes novos (ou o contrário), a tela mostraria por um instante o cenário 7 pontos fora do lugar — um salto. Para evitar isso, o SCROLL prepara o próximo quadro num segundo banco de desenhos escondido ($0800) e numa cópia dos nomes na memória. No SCROLL seguinte, logo depois do WAIT, troca o banco (registrador R#4), grava as cores e os nomes de uma só vez, durante o retraço da tela. A imagem fica um quadro atrás da posição pedida, o que não se percebe. Por isso, chame WAIT antes do SCROLL. As letras 0–127 são copiadas para os dois bancos no SCROLLMAP; letras redefinidas depois dele só aparecem num dos bancos.
Rolagem vertical: VSCROLL
O mesmo comando, VSCROLL, rola a tela para cima e para baixo. Ele tem duas formas: uma usa o chip de vídeo do MSX 2 e a outra funciona no MSX 1.
MSX 2 em diante: VSCROLL y
O chip de vídeo do MSX 2 tem um registrador (R#23) que diz em qual linha a imagem começa. VSCROLL y escreve nele: a tela inteira sobe y pontos, e o que sai por cima volta por baixo. Não copia nada na memória de vídeo, então custa o mesmo tempo em qualquer tela.
USES SCREEN 5, MACHINE MSX2, PAINT
DIM y AS BYTE
SCREEN 5
CLS
LINE (0, 0)-(255, 211), 15
WHILE 1
VSCROLL y
y = y + 1
WAIT
WEND
yvai de 0 a 255;VSCROLL 0volta a tela ao normal.- Para descer, diminua o valor (
y = y - 1). - Funciona em qualquer SCREEN do MSX 2, inclusive SCREEN 1 e 2.
- A memória de vídeo tem 256 linhas e a tela mostra 212 (ou 192). Ao rolar, as linhas escondidas entre elas aparecem: desenhe ali o que deve entrar na tela ou deixe essa área limpa.
- Exige
USES MACHINE MSX2(ou MSX2+/V9968, ou uma SCREEN do MSX 2). No MSX 1 o compilador recusa, porque o chip antigo não tem esse registrador.
MSX 1: VSCROLL ROW n
O chip do MSX 1 não rola sozinho. VSCROLL ROW n move o conteúdo da tela n linhas de blocos (8 pontos cada) em SCREEN 1 e 2, com volta: n positivo sobe, negativo desce.
USES SCREEN 1, KEYBOARD
DIM i AS BYTE
SCREEN 1
FOR i = 0 TO 23
LOCATE 0, i
PRINT "LINHA ", i
NEXT i
WHILE 1
IF KEY("UP") THEN VSCROLL ROW 1
IF KEY("DOWN") THEN VSCROLL ROW -1
WAIT
WEND
- O movimento é de 8 em 8 pontos, como nos jogos de MSX 1 que rolam por blocos.
- Copia as 24 linhas da tela a cada passo: cabe folgado em um quadro para
n = 1. - Para movimento ponto a ponto no MSX 1, use
VSCROLL FINE(SCREEN 1, abaixo) ouSMOOTHROLL 2, ...(cima) ouSMOOTHROLL 3, ...(baixo) em SCREEN 2: ele desloca os desenhos de uma faixa de linhas, 1 ponto por vez.
MSX 1: VSCROLL FINE — ponto a ponto em SCREEN 1
É a mesma ideia dos pares de letras do scroll horizontal, agora na vertical. Cada casa da tela passa a mostrar um par: o bloco dela e o bloco logo abaixo. Com deslocamento f, o desenho do par é:
linhas f..7 do bloco de cima, seguidas das linhas 0..f-1 do bloco de baixo
Quando f chega a 8, a tabela de nomes desce uma linha inteira e f volta a 0. Como a tela é um anel de 24 linhas, os pares nunca mudam: eles são descobertos uma única vez.
USES SCREEN 1, KEYBOARD
DIM i AS BYTE
SCREEN 1
FOR i = 0 TO 23
LOCATE 0, i
PRINT "LINHA ", i
NEXT i
VSCROLL FINE INIT
WHILE 1
IF KEY("UP") THEN VSCROLL FINE 1
IF KEY("DOWN") THEN VSCROLL FINE -1
WAIT
WEND
VSCROLL FINE INITlê a tela que você desenhou, a fonte e as cores, e monta os pares. Leva uma fração de segundo; chame depois de desenhar tudo.VSCROLL FINE nmovenpontos (−7 a +7): positivo sobe, negativo desce, com volta.- Sem trancos (buffer duplo): cada passo monta o quadro seguinte num segundo banco escondido (desenhos em
$0800, nomes em$1C00). Na chamada seguinte, logo depois doWAIT, a linguagem troca de banco de uma vez pelos registradores R#2 e R#4. A imagem fica um quadro atrás, o que não se percebe. Chame sempreWAITantes doVSCROLL FINE. - Limites: use apenas os caracteres 0–127 no desenho. Os caracteres 128–255 passam a ser os pares, então desenhos próprios ali se perdem. Cabem até 128 pares diferentes; uma casa que não ganhar par fica parada até virar a linha. Use poucos blocos diferentes um sobre o outro.
- Cores: em SCREEN 1 a cor vale para cada grupo de 8 caracteres. Cada grupo de 8 pares recebe a cor do bloco de cima do primeiro par. Telas de uma cor só ficam perfeitas; com várias cores podem aparecer faixas de cor errada.
- Depois do
INIT, escrever na tela comPRINTouLOCATEnão entra na rolagem. Para mudar o conteúdo, desenhe de novo e chameVSCROLL FINE INIToutra vez. - Usa cerca de 2 KB de memória, reservados só quando o comando aparece no programa.
Rolagem em 8 direções: SCROLLTILE + estrela ponto a ponto
SCROLLTILE dx, dy [, linhas] rola a tela inteira em casas (8 pontos), com volta: o que sai de um lado entra pelo outro. dx = 1 leva o conteúdo para a esquerda e -1 para a direita. dy = 1 sobe e -1 desce. O terceiro número diz quantas linhas de cima formam o anel, e as linhas de baixo (o placar) ficam paradas. Funciona em SCREEN 1 e 2.
O exemplo Comboio Espacial (MSX 1) usa o SCROLLTILE como no jogo original do ZX81: o comboio fica parado no espaço e faz parte do cenário. Cada nave é um bloco criado com TILECREATE (o mesmo formato que o Tile Editor copia) e posto no mapa com TILE. Como a tela rola em casas inteiras, naves e estrelas andam juntas e nada precisa ser redesenhado. O que se move por conta própria — o asterisco, os quatro cantos do tiro e os estilhaços da explosão — é sprite, por isso o tiro não interrompe a rolagem. O raptor entra e sai por um vórtex colorido (outro sprite, com dois quadros de giro). A tela de abertura é uma imagem em SCREEN 2 convertida para as cores do MSX e guardada em DATA: para cada terço da tela, a quantidade de blocos, os desenhos, as cores e depois os 768 nomes.
' camera andou 1 ponto para a direita
cpx = cpx + 1
IF (cpx AND 7) = 0 THEN SCROLLTILE 1, 0, 22 ' cruzou uma casa
fx = cpx AND 7 : fy = cpy AND 7
VPOKE $170 + linhaAntiga, 0 ' apaga o ponto antigo
VPOKE $170 + 7 - fy, 1 SHL fx ' acende o novo (char 46)
O truque vale para fundos de casas iguais (estrelas, chuva, neve). Um cenário com desenhos diferentes precisaria das combinações de quatro vizinhos, e isso passa de 256 caracteres. O que se move sozinho (naves, inimigos) vai em sprites, porque não rola junto com a tela.