MSXInício
Capítulo 22Disponível

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

RecursoMáquina / telaComo moveCapítulo
SCROLLCONFIG / SCROLLMAP / SCROLLMSX 1, SCREEN 1Giro dos desenhos das letras (1 px) + troca de letras (8 px)este
SCROLLTILES n, desenhos, coresMSX 1, SCREEN 1Blocos próprios com cor, pares de vizinhos reaiseste
SCROLLTILE dx, dyMSX 1, SCREEN 1Só de 8 em 8 pontos (uma casa por vez)este
SMOOTHROLL / SCROLLFINEMSX 1, telas de caracteresDesloca os desenhos de uma faixa de linhas, 1 px por vez (esquerda, direita, cima, baixo)este
SMOOTHROLLMIXMSX 1, telas de caracteresIgual ao anterior, com velocidade fracionada (1 a 8 px a cada 8 quadros) para paralaxeeste
SCROLL2MSX 2, SCREEN 5Faixas copiadas pelo chip de vídeo + R#23 (vertical) + R#18 (ajuste fino)24 (SCROLL2)
SCROLL4MSX 2, SCREEN 4Duas tabelas de nomes + R#18 (0–7 px) + R#23 (vertical), com HUD e cortina de sprites25
VSCROLL yMSX 2 em diante, qualquer SCREENVertical por hardware (R#23), 1 ponto por vezeste
VSCROLL ROW nMSX 1, SCREEN 1 e 2Vertical de 8 em 8 pontos, movendo as linhas de blocoseste
VSCROLL FINE nMSX 1, SCREEN 1Vertical ponto a ponto, com pares de blocos de cima e de baixoeste
R#26/R#27MSX 2+ (V9958) e V9968Scroll horizontal contínuo por hardware24 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:

  1. Quais letras o mapa usa. O SCROLLMAP anota a faixa de caracteres do mapa (até 9 letras diferentes, de códigos próximos).

  2. 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 n pontos 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.

  3. Redesenhar a janela. Com deslocamento zero, cada casa mostra a letra normal. Com deslocamento, mostra o caractere do par (casa, vizinha).

  4. 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.
  • SCROLLCONFIG diz qual parte da tela é a janela; o resto (o título na linha 0) não se mexe.
  • SCROLLMAP liga o mapa à janela e desenha a primeira tela.
  • SCROLL 1, 0 gira a fonte de 1 ponto e redesenha a janela; a cada 8 chamadas, a janela avança uma coluna do mapa.
  • WAIT espera 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

  1. Só os pares que existem. O SCROLLMAP percorre 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.
  2. Um caractere por par, nos caracteres 128–255. As letras 0–127 continuam livres para o texto (PRINT, placar).
  3. 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.
  4. A cada passo o SCROLL redesenha 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ônimo SCROLLFINE) — 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 — vel de 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: dx 1 vai para a esquerda, -1 para a direita; dy faz 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.
  • SCROLLTILES dá 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
  • y vai de 0 a 255; VSCROLL 0 volta 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) ou SMOOTHROLL 2, ... (cima) ou SMOOTHROLL 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 INIT lê 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 n move n pontos (−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 do WAIT, 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 sempre WAIT antes do VSCROLL 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 com PRINT ou LOCATE não entra na rolagem. Para mudar o conteúdo, desenhe de novo e chame VSCROLL FINE INIT outra 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.

Comunidade

Discussão · Scroll: todos os recursos da linguagem

Curta, marque como lido e comente o que achou deste capítulo.

0 comentários
Entre para participar
Crie uma conta ou faça login para curtir, marcar como lido e comentar.

Carregando comentários…