quarta-feira, 16 de janeiro de 2013

ZX7

Eu tenho usado o Lerm Code Compressor 1 para comprimir os blocos de bytes quando necessário, nas minhas adaptações de programas para Beta 48/128. O algoritmo usado é bem rudimentar, pois só comprime sequências de bytes de valores repetidos. Eu já sabia que este programa estava longe de ter um bom fator de compressão, mas estava usando assim mesmo por ser suficiente para meus propósitos. 

Fonte: Wikipédia

Recentemente Einar Saukas, programador brasileiro bastante ativo no mundo do TK90X, desenvolveu o ZX7 que seria o melhor compressor de dados baseado no algoritmo LZ77. Como eu já conhecia o Einar e os excelentes trabalhos que ele tem feito, resolvi experimentar a sua mais nova produção. 

O ZX7 consiste no programa que é executado no próprio PC, cuja função é comprimir os dados contidos num arquivo, e numa rotina em assembly Z80 para descomprimir dados no TK90X. Os arquivos do ZX7 encontram-se no World of Spectrum.

No fórum de discussão do World of Spectrum encontra-se um longo thread sobre este compressor (em inglês). 

Compressão de dados

Apesar de existir um executável do compressor para o Windows, pelo fato de eu usar somente Linux, tive que baixar o código fonte (arquivo ZX7_SourceCode.zip) e fazer a compilação.

Ao descomprimir o pacote ZIP, os subdiretórios asm e compress são gravados no disco do PC. Para gerar o executável,  basta digitar no shell

$ cd compress
$ gcc -o zx7 zx7.c compress.c optimize.c

A compilação é feita e o arquivo executável zx7 é gravado no diretório corrente, o qual poderá ser movido para outro subdiretório (usualmente /usr/local/bin). Para que a compilação seja bem sucedida, é necessário que os pacotes do compilador C (usualmente o GCC) estejam devidamente instalados no seu PC.

Os dados a serem comprimidos devem estar salvos no disco do PC (no emulador Fuse, pode-se usar a opção do menu File > Save binary data...). Para realizar a compressão de um arquivo, o seguinte comando é digitado no shell:

$ zx7 <nome do arquivo>

Será gerado no disco uma versão comprimida do arquivo, cujo nome virá acrescido do sufixo .zx7. O binário comprimido poderá ser inserido na RAM do ZX Spectrum emulado pelo Fuse, através da opção do menu File > Load binary data... .


Para ter uma ideia da eficiência do ZX7, estão listados os resultados obtidos com o bloco de bytes principal do jogo Hard Drivin' que foi recentemente adaptado para disco Beta:
  • sem compressão: 41400 bytes;
  • Lerm CC1:  37067 bytes;
  • ZX7:  26399 bytes
Como se pode ver, a diferença é bem grande.

Descompressão de dados

Uma vez que o bloco de dados comprimido é carregado de alguma forma na RAM do TK90X (por exemplo, através da fita cassete ou do disco), terá de ser descompactado. Existem 3 versões do descompactador DZX7:
  • standard, ocupa apenas 69 bytes;
  • turbo, ocupa 90 bytes e é 25% mais rápido;
  • mega, ocupa 244 bytes e é 30% mais rápido.
Os códigos fontes assembly dos descompactadores encontram-se no subdiretório asm. Portanto, antes de usar, deve-se montar o código de máquina a partir de programa assembly que deverá ser algo como:

    ORG <início da rotina>
    LD HL,<endereço do bloco comprimido>
    LD DE,<endereço de destino>
    CALL dzx7
    RET
    INCLUDE 'dzx7_standard.asm'
    END

O argumento da pseudo-instrução INCLUDE permite selecionar a versão do descompressor que se deseja usar. Se o arquivo fonte do descompressor não estiver no subdiretório corrente, deve-se especificar seu caminho (path) completo.

Para usar o descompactador, este deve ser introduzido na RAM e chamado através de USR do BASIC ou CALL do Assembly.

Nenhum comentário:

Postar um comentário

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.