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

Dynamic Publisher Screen (.PCT)

  Arquivo principal do Dynamic Publisher, que armazena uma tela em preto e branco no formato da screen 6, com o tamanho de 512x704 pixels.
  O arquivo possui um header com 384 bytes contendo a string "DYNAMIC PUBLISHER SCREEN", além da área de dados de tamanho variável, contendo os dados da tela compactados.

  Arquivo .PCT
 ┌────────┬────────┐
 │ Header │ Dados  │
 └────────┴────────┘


  O ponteiro de arquivo deverá ser posicionado em &H180 (índices de 0 a N-1), para começar a ler os dados compactados.

  Os dados compactados possuem dois campos para cada conjunto de dados:

  • Um contador
  • Os padrões de pontos na tela


  Há dois tipos de padrões de pontos possíveis:

  • O "padrão repetido", onde o mesmo padrão é desenhado N vezes na tela
  • Os "padrões distintos", onde N padrões diferentes são desenhados na tela.


Offset Campo Tamanho Obs
0 Contador 1 byte  
1 Padrão
Padrões
1 byte
N bytes
se "padrão repetido"
se "padrões distintos"

  Onde "N" é igual ao valor do contador mais um.

  O contador indicará para o conjunto atual o tipo:

  • "Padrão repetido", se o bit mais significativo do "contador" for 1.
  • "Padrões distintos", se o bit mais significativo do "contador" for 0.


  Passo a passo para o "padrão repetido":

  1. R = Contador;
  2. Elimine o bit mais significativo de R:
    • R = R AND &H7F;
  3. Avance o ponteiro de arquivo 1 unidade.
  4. Leia o dado do arquivo, que contém o padrão a ser repetido na tela:
    • D = Padrão;
  5. Para i=1 até R+1 faça:
    • Plote "D" na tela;
  6. Avance o ponteiro de arquivo 1 unidade.


  Passo a passo para os "padrões distintos":

  1. R = Contador;
  2. Para i=1 até R+1 faça:
    • Avance o ponteiro de arquivo 1 unidade.
    • Leia o dado do arquivo, que contém o padrão atual a ser plotado na tela:
      • D = Padrão;
    • Plote "D" na tela;
  3. Avance o ponteiro de arquivo 1 unidade.


  O dado a ser plotado na tela é um valor de 8 bits, onde cada bit representa um pixel de um grupo de 8x1 pixels. Entretanto, há que realizar uma inversão nos nibbles do byte.

  Exemplo: &HC8

 

  Resultado plotado na tela do MSX, onde o bit 1 é a cor preta (ink) e o bit 0 a cor branca (paper):

  ■□□□■■□□


  Uma observação importante é que o compactador armazena dados linha a linha, ou seja, se houver dados repetidos que comecem em um linha e terminem em outra, eles serão divididos ao chegar ao final da primeira linha.


  Exemplo

  O exemplo a seguir é uma imagem de duas linhas que utiliza a compactação do Dynamic Publisher:

 01 08 04 BD 00 BF 00


  Para o primeiro conjunto, temos:

 Contador:
 R = 01  

 Tipo:
 Bit_7(R) = 0
 "padrões distintos"


Assim há 2 "padrões distintos" (total = R+1):

 01 08 04 BD 00 BF 00


  Devemos realizar a inversão dos nibbles em cada padrão:

 08 04

 fica:

 80 40


  Temos que:

   80        40
10000000  01000000


  Os grupos de 8x1 pixels são dispostos lado a lado, formando uma linha, diferente do padrão do MSX 1. Assim, os padrões irão formar o seguinte desenho na tela:

  ■□□□□□□□□■□□□□□□


  Para o segundo conjunto, temos:

 Contador:
 R = BD 

 Tipo:
 Bit_7(R) = 1
 "padrão repetido"

 Remove bit 7:
 R = RB AND &H7F
 R = &H3D = 61


Assim há 62 repetições do mesmo padrão (R+1). Note que 62 é o valor de grupos de 8x1 pixels restantes da primeira linha, que possui no total 64 grupos.

 01 08 04 BD 00 BF 00


  O padrão repetido é o "00", que invertidos os nibbles, dá a mesma coisa. Assim, o segundo conjunto fecha a primeira linha com pontos vazios (brancos).

  O terceiro conjunto é formado por "BF 00", que preenche 64 vezes a segunda linha com pontos vazios.


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