Curso de Pascal
Gráficos - Includes do Lammassaari
Você está em: MarMSX >> Cursos >> Pascal
Biblioteca do Lammassaari exclusiva do MSX.
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:
- ox, oy - coordenadas de origem.
- dx, dy - coordenadas de destino.
- xi, yi - coordenadas inciais de um retângulo.
- xf, yf - coordenadas finais de um retângulo.
Códigos de operações lógicas:
- 0 - PSET
- 1 - AND
- 2 - OR
- 3 - XOR
- 4 - NOT
- 8 - TPSET
- 9 - TAND
- 10 - TOR
- 11 - TXOR
- 12 - TNOT
Códigos de direção:
- 0 - sudeste
- 1 - sudoeste
- 2 - nordeste
- 3 - noroeste
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.