Obrigado a Julio Marchi pelo espaço cedido na MSX All
 



  1. Introdução
  Provavelmente você já viu um tipo de tela no MSX 1 que possuia uma animação no carregamento dela, conforme pode ser visto na animação do logo acima.
  Um bom exemplo disso é o programa Graphos III, que possuia a opção de salvar a imagem com esse tipo de animação de abertura através da opção "display" do menu principal. O Graphos III possuia quatro opções de display de tela: direto, faixas horizontais, da esquerda para a direita e aleatório.
  Na realidade, este tipo de tela é um programa executável que possui tanto a imagem como o programa que gerencia o carregamento da tela. Assim devemos carregá-la atraves da instrução em Basic "bload" mais a opção ",r", em vez de ",s".
  O projeto "Screen 2 Show" tem como por objetivo a criação de displays de abertura para telas do modo "screen 2" do MSX 1. Além disso, compacta a tela agregada ao arquivo executável, através do algorítimo RLE.
  Esse projeto foi agregado ao MSX Viewer 5.0, aproveitando ao máximo essa ferramenta de conversão de imagens.

  Displays disponíveis

Display Descrição
  Carrega a imagem direto.
  Carrega a imagem de cima para baixo.
  Carrega a imagem da esquerda para a direita.
  Carrega a imagem em diagonal.
  Carrega a imagem de fora para dentro em caracol.
  Carrega a imagem de fora para dentro em quadro.


  2. O Projeto Screen 2 Show
  O projeto Screen 2 Show envolve tanto o MSX como o PC. No que diz respeito ao MSX, tem como objetivo o desenvolvimento de algorítimos de display de telas em linguagem de máquina. No PC, desenvolver ferramentas para adicionar o display de telas a imagens convertidas para o MSX.
  No presente momento, o projeto somente trabalha com imagens no formato da screen 2 do MSX 1. Porém, pode ser expansível a outros modos de tela.


  Funcionamento do programa

      Arquivo                     RAM                  RAM                  VRAM

 10 SCREEN 2                9000 | MMMPPP |      4000 | PPPPPP |      0000 | PPPPPP |
 20 BLOAD"TELA.SCR",R  ->   .... | CCDD   |  ->  .... |        |  ->  .... |        |
 30 GOTO 30                 FFFF |        |      5800 | CCCCCC |      2000 | CCCCCC |

  Primeiro o programa contendo a imagem é carregado na memória RAM, a partir da posição &H9000. Ele contém:

  • O programa principal (assinalado com o "M" em verde)
  • A imagem compactada (assinalada com o "P" em azul e o "C" em vermelho)
  • O programa de display (assinalado com o "D" em azul ciano)

  O programa principal descompacta a imagem na região de memória RAM, a partir do endereço &H4000. A descompressão poderia ser feita diretamente na VRAM, porém os algorítimos de display seriam mais complexos.
  Uma vez descompactada a imagem, o programa principal chama o algorítimo de display. Esse algorítimo é responsável por copiar os dados da RAM para a VRAM. A animação é decorrente da maneira com que os dados são copiados para essa memória.


  Layout do arquivo

Parte Endereço MSX
Header 9000
Código principal 900B
Imagem compactada RLE 9061
Código da exibição na tela xxxx

  xxxx → Endereço indefinido.


  Descrição do header do arquivo de tela

Endereço MSX Valor Descrição
- FE  Identificador de programa binário
- 00  Inicio do programa
- 90  Inicio do programa (9000)
- xx  Fim do arquivo
- xx  Fim do arquivo
- 0B  Inicio execução
- 90  Inicio execução (900B)
9000 xx  Tamanho da tela compactada (pad)
9001 xx  Tamanho da tela compactada (pad)
9002 xx  Tamanho da tela compactada (cor)
9003 xx  Tamanho da tela compactada (cor)
9004 xx  Tipo de abertura:
 00 - Direto
 01 - Cima para baixo
 02 - Esquerda para direita
 03 - Diagonal
 04 - Snail in
 05 - Frame
9005 4D  "M"
9006 61  "a"
9007 72  "r"
9008 4D  "M"
9009 53  "S"
900A 58  "X"

  - → Endereço não usado.
  xx → Valor indefinido.



  Compactação da imagem

  A imagem é compactada para diminuir o tamanho do arquivo. O método de compactação utilizado é um dos mais simples: o RLE (Run Length).
  Ele funciona da seguinte forma:

  Seja a cadeia normal: AAABCCCDDD

  Contam-se as repetições sucessivas, formando-se um par de bytes. Um contém o número de repetições, outro o código da cor. Depois, acrescenta-se o valor zero para indicar fim de arquivo. Assim:

  - total (máximo=255)
  - valor do byte repetido 

  A cadeia comprimida fica: 3A 1B 2C 3D 0

  Na imagem do MSX, primeiro compacta-se a área de memória correspondente ao padrão (pattern), de 0000H a 1800H. Depois, a área de cores (color), de 2000H a 3800H.


  Código do programa principal em Assembly Z-80

   10 		ORG  &HC000
   20 		CALL &H72		; INIGRP (Screen 2)
   30 		IN   A,(&HA8)		; *
   40 		CALL PG2		; * Seta slots para RAM RAM RAM xxx
   50 		OUT  (&HA8),A		; *
   60 		LD   A,(&HFFFF)		; %
   70 		CPL 			; % 
   80 		LD   (&H8FFF),A		; % Seta subslot da página 2 para RAM
   90 		CALL PG2		; %
  100 		LD   (&HFFFF),A		; %
  110 		LD   HL,&H4000		; inicio da memória para descompressão (pattern)
  120 		LD   DE,&H9061		; Inicio dos dados comprimidos
  130 		CALL LE1		; Chama rotina de descompressão
  140 		INC  DE			; Sobe ponteiro dos dados comprimidos (color)
  150 		CALL LE1		; Chama rotina de descompressão
  160 		CALL TELA		; Chama rotina de cópia para a tela
  170 		IN   A,(&HA8)		; *
  180 		LD   B,A		; *
  190 		LD   A,&HF0		; * Retorna configurações originais
  200 		AND  A			; *
  210 		OUT  (&HA8),A		; *
  220 		LD   A,(&H8FFF)		; % Retorna configurações originais
  230 		LD   (&HFFFF),A		; %
  240 		RET 			; FIM
  250 PG2:	LD   B,A		; *
  260 		LD   A,&B11110011	; *
  270 		AND  B			; *
  280 		LD   B,A		; *
  290 		LD   A,&B00110000	; * Rotina de cópia: xx AA xx xx -> xx AA AA xx
  300 		AND  B			; *
  310 		SRA  A			; *
  320 		SRA  A			; *
  330 		ADD  A,B		; *
  340 		RET 			; *
  350 LE1:	LD   A,(DE)		; %
  360 		OR   0			; %
  370 		JP   Z,FIM		; %
  380 		LD   B,A		; %
  390 		INC  DE			; % Descompressão de dados. Achou 0 itens, acaba.
  400 		LD   A,(DE)		; %
  410 		INC  DE			; %
  420 LI1:	LD   (HL),A		; %
  430 		INC  HL			; %
  440 		DJNZ LI1		; %
  450 		JP   LE1		; %
  460 FIM:	RET 			; %

  O código do programa principal deverá ser compilado a partir da posição de memória &H900B.


  Código em Assembly dos displays

  470 TELA:	LD   BC,&H1800		; $
  480 		LD   DE,0		; $
  490 		LD   HL,&H4000		; $
  500 		CALL &H5C		; $ Rotina particular de cópia para a tela
  510 		LD   BC,&H1800		; $ Neste caso, copia diretamente
  520 		LD   DE,&H2000		; $
  530 		LD   HL,&H5800		; $
  540 		CALL &H5C		; $
  550 		RET 			; $

  O código do programa de display deverá ser compilado a partir da posição de memória lógo após a tela compactada. Nesse caso, depende do tamanho dessa tela.
  No programa principal, a linha 160, que contém a instrução CALL TELA, deverá ser a palavra "TELA" substituída pelo endereço inicial da rotina do display.

  Códigos fontes dos displays
  Suporte: arquitetura da screen 2



  3. O Programa
  O protótipo a seguir foi desenvolvido para rodar em plataformas Windows. Entretanto, esse projeto já está incorporado ao MSX Viewer, que é multiplataforma e pode rodar em Windows, Linux e MAC.




LOAD - Carrega a imagem no formato "MarMSX SCR".
SAVE - Salva a imagem no formato "MarMSX SCR".
COPY - Copia imagem para o clipboard. Serve para exportar a imagem.
PASTE - Copia imagem do clipboard. Serve para importar a imagem, como por exemplo do MSxViewer.

EXHIBITION - Modo de exibição da tela:
+ Direct - Aparece diretamente.
+ Top-Down - De cima para baixo.
+ Left-Right - Da esquerda para a direita.
+ diagonal - Em diagonal.
+ Snail In - Espiral para dentro.
+ Frame In - Quadro à dentro.

Para carregar uma tela no formato SCR:
Em qualquer screen (0 ou 1) digite:
bload "tela.scr",r
Onde tela é o nome da tela em questão.

Download:

* scr2show11.zip - 175 Kb - Programa conversor para PC.
Obrigado a Adriano Cunha pelo report de Bugs!

* pack.zip - 32 Kb - Pacote com fontes e telas exemplo.


Marcelo Teixeira Silveira
Engenheiro de Sistemas e Computação - UERJ
Mestre em Engenharia de Computação - UERJ

© MarMSX 1999-2017