quinta-feira, 8 de março de 2012

Gyroscope e Lerm Code Compressor 1

Adaptei o jogo Gyroscope do TK90X para a interface Beta 48, que está disponível aqui neste link.

Aproveitando esta ocasião, apresento o ótimo Lerm Code Compressor 1 que tanto tem me ajudado nas adaptações dos programas para a Beta 48. O programa e seu manual podem ser encontrados no World of Spectrum.

A maior parte dos programas comerciais para o TK90X consiste em uma parte curta de BASIC que carrega as demais partes (em geral uma tela e um ou mais blocos de códigos de máquina). Como tais programas são quase que totalmente feitos em linguagem de máquina, o espaço destinado ao BASIC costuma ser pequeno. Por exemplo, a listagem BASIC do Gyroscope é:

10 BORDER 0: INK 0: PAPER 0: CLS: INK 6: PAPER 8: BRIGHT 1: CLEAR 24063: LOAD ""SCREEN$ : PRINT AT 20,0;: LOAD ""CODE : RAND USR 52930

A adaptação para Beta 48 consiste em alterar o BASIC para que carregue as partes do disco ao invés da fita. No entanto o próprio sistema operacional do Beta (TRDOS) ocupa 112 bytes extras de RAM que, em alguns casos, inviabilizam a adaptação de forma direta. Na listagem acima, Gyroscope reserva grande parte da RAM para o código de máquina (a partir de 24064). Como o BASIC começa em 23755, restariam apenas 309 bytes. O TRDOS piora as coisas ao empurrar o início do BASIC para 23867, deixando ainda menos espaço.

Para resolver este problema foi criado o Code Compressor 1 (ou CC1), cuja tela após carregamento é a seguinte:


O bloco principal de código de máquina do Gyroscope, com nome "code", inicia-se no endereço 24064 e tem comprimento de 41472 bytes; em outras palavras, ocupa a RAM entre os endereços 24064 a 65535. O objetivo aqui é comprimir este bloco para que seja liberado um espaço de RAM. Para isto, posiciona-se a fita para o início do bloco e carrega-se no CC1 com o comando load.

Uma vez feito o carregamento, passa-se à compressão com o comando Compress. Será pedido o endereço do início do bloco que, neste caso, será 24064:


Na sequência, será pedido o endereço do final do bloco, que será 65535:


A seguir o programa pede o endereço destino do bloco depois de ser descomprimido. Como não se deseja mover o bloco, o valor será igual ao inicial, isto é, 24064:


Deve-se instruir então o que deve acontecer após a descompressão: 1- voltar ao BASIC ou 2- executar um salto para o código de máquina. Neste caso optamos por voltar ao BASIC.


A última pergunta é o nome com qual o arquivo comprimido deverá ser salvo na fita:



Um tempo será usado para o processamento e, no final, será instruído para pressionar uma tecla para salvar o bloco na fita:


Na tela acima há uma importante informação que deve ser anotada: o endereço base. Este endereço é o inicial para o bloco que agora está comprimido. Portanto se antes o bloco ocupava a RAM nas posições 24064-65535, agora está ocupando 26625-65535. Com isto a RAMTOP pode ser ajustada mais para cima, abrindo espaço para a área do BASIC.

Entretanto antes de fazer a descompressão, é necessário liberar os 112 bytes extras do TRDOS. Para isso, basta fazer USR no endereço base, isto é, RAND USR 26625. Na sequência, ajusta-se a RAMTOP para o valor do programa original (23063) e passa-se para a descompressão que é feita com USR após 15 bytes do endereço base, isto é, RAND USR 26640. Em resumo, RAND USR <endereço_base> libera espaço na RAM e RAND USR <endereço_base+15> descomprime o bloco.

O programa BASIC para carregar do disco, liberar RAM, descomprimir e executar o código de máquina fica (compare com a listagem anterior):

10 BORDER NOT PI: PAPER NOT PI: INK NOT PI: CLEAR VAL "26e3"
20 RAND USR VAL "15363": REM : LOAD "GYRO1"CODE
30 RAND USR VAL "15363": REM : LOAD "GYRO2"CODE
40 RAND USR VAL "26625": CLEAR VAL "24063": RANDOMIZE VAL"USR 26640 OR USR 52930"

Observe que foram usadas técnicas para poupar RAM no programa BASIC. Este programa, juntamente com a tela e o bloco comprimido, devem ser salvo no disco Beta para terminar a adaptação.

Nenhum comentário:

Postar um comentário

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