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

Screen 2 Show

  Crie displays animados de tela para a screen 2 do MSX como no Graphos III.


Detalhes do projeto
  O projeto Screen 2 Show envolve tanto o MSX como o PC. No que diz respeito ao MSX, tem como objetivo o desenvolvimento de algoritmos 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 algoritmos de display seriam mais complexos.
  Uma vez descompactada a imagem, o programa principal chama o algoritmo de display. Esse algoritmo é 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

Marcelo Silveira
Engenheiro de Sistemas e Computação
Especialista em Processamento de Imagens e Inteligência Artificial
© MarMSX 1999-2020