Curso de Pascal
Gráficos - Includes do Lammassaari


  Neste capítulo veremos como utilizar as rotinas básicas criadas pelo Lammassaari em 1997 para ter acesso os recursos gráficos do MSX 2.

  Para compilar um programa utilizando um arquivo de include, basta incluir esse include no disco do compilador TP e digitar "turbo" mais o nome daquele programa. Exemplo:
A:>dir
TURBO.COM
MSX.INC
PROG.PAS

A:>turbo prog
  Onde "prog.inc":
{$i msx.inc}

begin
  Color(15,4,4);
end.

  Os includes utilizados nesse capítulo podem ser baixados aqui.



  msx.inc

  O SLotman reuniu as principais rotinas gráficas do Lammassaari em um único arquivo para o MSX Pad.

  Rotinas:

Rotina Descrição
Screen Define o modo de tela do MSX.
Color Altera as cores de frente, fundo e borda.
GraphicPrint Imprime um texto em tela gráfica.
SetPage Altera a página de visualização e uso.
cls Apaga a tela.
cls2 Apaga a tela.
HideScreen Suspende a exibição da tela.
ShowScreen Retoma a exibição da tela.
Copy Copia um retângulo de uma determinada página para outro lugar.
LCopy Copia um retângulo de uma determinada página para outro lugar.
Utiliza operação lógica.
Copy_xy Copia um retângulo de uma determinada página para outro lugar.
Copy_y Copia um retângulo de uma determinada página para outro lugar.
CopyL_xy Copia um retângulo de uma determinada página para outro lugar.
Utiliza operação lógica.
MirrorCopy Copia um retângulo de uma determinada página para outro lugar.
Espelha em X.


  Color(cor_de_frente, cor_de_fundo, cor_da_borda)

  Define as cores da tela do MSX.

  Exemplo:
{$i msx.inc}

begin
  Color(15,4,4);
end.


  Screen(modo)

  Define o modo de tela do MSX.

  Exemplo:
{$i msx.inc}

begin
  Screen(5);
end.
  Obs: ao terminar um programa rodando sob o DOS em uma screen diferente do modo texto, fará com que ele fique travado.

  Para resolver esse problema, devemos retornar à screen 0 antes do programa terminar.
{$i msx.inc}

begin
  Screen(5);
  readln;
  Screen(0);
end.


  GraphicPrint(texto, x, y, cor, operacao_logica)

  Imprime um texto no modo gráfico.

  Exemplo:
{$i msx.inc}

begin
  Color(15,4,4);
  Screen(7);
  GraphicPrint('Ola mundo.', 10,10, 0, 0);
  readln;
  Screen(0);
end.
  Obs: os parâmetros de cor e operação lógica dessa rotina não funcionam. Assim como no Basic, utilize o "Color" para definir a cor de texto e fundo.


  SetPage(pagina_visivel, pagina_uso)

  Configura as páginas de vídeo do MSX 2.

  Exemplo:
{$i msx.inc}

begin
  Screen(5);
  SetPage(1,0);
  readln;
  Screen(0);
end.
  Define a página visível para 1 e a página em uso para 0 na screen 5.


  cls e cls2

  Apagam a tela em uso.

  Exemplo:
{$i msx.inc}

begin
  Screen(5);
  SetPage(1,1);
  readln;
  cls2;
  readln;
  Screen(0);
end.
  Obs: as páginas de 1 a 3 do MSX 2 geralmente estão "sujas". Assim, o programa anterior irá setar a página da screen 5 para 1 e uma imagem "aleatória" estará lá. Tecle enter para limpar a tela e novamente enter para terminar o programa.


  HideScreen e ShowScreen

  Suspende e exibe uma tela.

  Exemplo:
{$i msx.inc}

begin
  Color(15,0,0);
  Screen(5);
  HideScreen; { Suspende a exibição da tela }
  GraphicPrint('Voilá !', 10, 50, 0, 0);
  readln;
  ShowScreen; { Volta a exibir a tela }
  readln;
  Screen(0);
end.


  Copy

  Copia áreas de vídeo de uma parte para a outra.

  Sintaxes:
Copy_xy (ox, oy, pagina_origem, dx, dy, pagina_destino,
         largura, altura, direcao);

Copy_y (ox, oy, pagina_origem, dx, altura, 
        pagina_destino, direcao);

CopyL_xy (ox, oy, pagina_origem, dx, dy, pagina_destino,
          largura, altura, operacao_logica, direcao);

Copy (xi, yi, xf, yf, pagina_origem, dx, dy, pagina_destino);

CopyL (xi, yi, xf, yf, pagina_origem, dx, dy, pagina_destino,
       operacao_logica);

MirrorCopy (ox, oy, pagina_origem, dx, dy, pagina_destino,
            largura, altura, operacao_logica);

  Onde:
  Códigos de operações lógicas:
  Códigos de direção:
  Os códigos de direção consideram a orientação tanto para ox,oy, como para dx,dy.
3 | 2
--+--
1 | 0

  Exemplos:

  Cópia rápida, sem operação lógica.
{$i msx.inc}

begin
  Color(15,0,0);
  Screen(5);
  GraphicPrint('Teste', 0, 0, 0, 0);
  Copy_xy(0,0,0, 40,8,0, 40, 8, 0);
  readln;
  Screen(0);
end.
  Obs: na função "Copy_xy" passamos a largura e altura em vez de xf,yf.

  Exemplo com as orientações.
{$i msx.inc}

const c : array[1..4,1..2] of byte = ((0,0),(39,0),(0,7),(39,7));

var i : integer;

begin
  Color(15,0,0);
  Screen(5);
  for i:=0 to 3 do
  begin
    cls2;
    GraphicPrint('Teste', 0, 0, 0, 0);
    Copy_xy(c[i+1,1],c[i+1,2],0, 140,100,0, 40, 8, i);
    readln;
  end;
  Screen(0);
end.

  Cópia espelhada em X.
{$i msx.inc}

begin
  Color(15,0,0);
  Screen(5);
  GraphicPrint('Teste', 0, 0, 0, 0);
  MirrorCopy(0,0,0, 40,0,0, 40,8, 0);
  readln;
  Screen(0);
end.

  A rotina "Copy_y" funciona igual à rotina "Copy_xy", mas considera a largura como sendo os pontos restantes de xi até o fim da tela.


  line.inc

  Contém rotinas para desenhar uma linha, caixa ou caixa preenchida.

Rotina Descrição
line Desenha uma linha na tela.
line_b Desenha uma caixa na tela.
line_bf Desenha uma caixa preenchida na tela.

  Sintaxes:
line (xi, yi, xf, yf, pagina, cor, operacao_logica);

line_b (xi, yi, xf, yf, cor, operacao_logica);

line_bf (xi, yi, xf, yf, cor, operacao_logica);

  Exemplo:
{$i msx.inc}
{$i line.inc}

begin
  Color(15,0,0);
  Screen(7);
  line(10,10, 100,100, 0,15,0);
  line_b(10,10, 100,100, 5,0);
  line_bf(200,50, 300,150, 12,0);
  readln;
  Screen(0);
end.

  Nota: ver as operações lógicas nas rotinas de "Copy".


  circle.inc

  Contém rotinas para desenhar um círculo, elipse, arco e uma "fatia de pizza".
  Os arquivos "circle.inc", "ellipse.inc", "arcus.inc" e "pie.inc" foram reunidos em um único arquivo, pois o código em Assembly é o mesmo para todas as rotinas.
  Houve uma correção no código, pois o micro trava quando em DOS 1. Para DOS 2, utilizar os arquivos originais.

Rotina Descrição
Circle Desenha um círculo na tela.
Ellipse Desenha uma elipse na tela.
Arcus Desenha um arco na tela.
Pie Desenha uma "fatia de pizza" na tela.

  Sintaxes:
Circle (x, y, raio, cor);

Ellipse (x, y, raio, cor, proporcao);

Arcus (x, y, raio, angulo_inicial, angulo_final, cor);

Pie (x, y, raio, angulo_inicial, angulo_final, cor);

  Exemplo:
{$i msx.inc}
{$i circle.inc}

begin
  Color(15,0,0);
  Screen(2); { Pode ser 5, 7 etc }
  Pie(40,40,20, 0,1.5, 5);
  Arcus(200,130,20, 3,4.5, 12);
  Circle(128,95,50,15);
  Ellipse(128,95,50,15,128);
  readln;
  Screen(0);
end.

  Obs: o achatamento da elipse quando for 256, equivale à proproção de 1, ou seja, um círculo. Valores maior que 256 irão achatar o eixo X, enquanto que valores menores que 256 irão achatar o eixo Y.


  fill.inc

  Preenche um trecho da tela com uma determinada cor. No MSX 2, permite usar uma cor diferente da cor de pintura como delimitador de área.
  Assim como o "circle.inc", teve que ser corrigido para ser utilizado no MSX-DOS 1. Para o DOS 2, usar a original.

Rotina Descrição
Fill Pinta uma região da tela.

  Sintaxes:
Fill(x, y, cor, cor_da_borda);

  Exemplo:
{$i msx.inc}
{$i circle.inc}
{$i fill.inc}

begin
  Color(15,0,0);
  Screen(5); { Pode ser scr 2 }
  Circle(128,95,50,15);
  Fill(128,95,8,15); { Se scr 2, cores: 15 e 15 }
  readln;
  Screen(0);
end.


  point.inc

  Rotinas para escrever e ler um ponto na tela. Somente MSX 2.

Rotina Descrição
pset Desenha um ponto na tela.
point Obtém a cor de um ponto na tela.

  Sintaxes:
pset(x, y, pagina, cor, operacao_logica);
point(x, y, pagina); { Função que retorna um byte }

  Exemplo:
{$i msx.inc}
{$i point.inc}

var c : byte;

begin
  Color(15,0,0);
  Screen(5);
  Pset(128,95,0,10,0);
  c := Point(128,95,0);
  Screen(0);
  writeln('Cor lida: ', c);
end.


  pal.inc

  Contém rotinas para alterar a paleta de cores do MSX 2.

Rotina Descrição
IniPalette Reseta a paleta para as cores default.
SetPalette Configura a paleta do MSX 2.

  Sintaxes:
inipalette;

setpalette(indice, vermelho, verde, azul);

  Exemplo:
{$i pal.inc}

var r, g, b : byte;

begin
  Color(15,0,0);

  randomize;
  r := random(7);
  g := random(7);
  b := random(7);

  setpalette(15,r,g,b);

  readln;
  inipalette;
end.


  Msxdiskio.inc

  Contém rotinas de entrada e saída para o MSX. Inclui uma rotina para carregar telas gráficas.

  Necessita do "msx.inc".

Rotina Descrição
LoadGraphic Carrega uma tela em uma determinada página.

  Sintaxe:
LoadGraphic (nome_arq, largura, altura, x, y, pagina,
             operacao_logica, direcao, modo_de_tela);

  Exemplo:
{$ msx.inc}
{$ Msxdskio.inc}

begin
  Screen(5);
  LoadGraphic('imagem.img', 256, 212, 0,0, 0,0,0, 5);
  readln;
  Screen(0);
end.

  O formato de arquivo é o DUMP da tela do MSX, onde o arquivo deverá estar sem o header criado pelo MSX.

  Possibilidade 1: DUMP da tela toda com o BSAVE ou arquivo do MSX Viewer 5.
  Remover os 7 bytes iniciais. A largura é de 256 para as screens 5 e 8, e 512 para as screens 6 e 7. A altura é sempre 212.

  Possibilidade 2: DUMP de parte da tela com o COPY.
  Remover os 4 bytes iniciais. A largura e altura depende do recorte. São calculados assim:
largura = xf-xi+1
altura = yf-yi+1

  Por exemplo:
10 SCREEN 5
20 COPY(0,0)-(39,15),0 TO "RECORTE.IMG"
  Fica:
largura = 39-0+1 = 40
altura = 15-0+1 = 16

  Nota importante: o valor da largura da imagem DEVERÁ ser sempre par, pois existe um bug nessa rotina que não comporta larguras ímpares.


<< Anterior Pascal Próxima >>


/MARMSX/CURSOS/PASCAL