sábado, 27 de outubro de 2012

Gyroscope v. 2 e carregador assembly para Lerm CC1

Em postagem anterior sobre adaptação do Gyroscope para Beta 48, mostrei como é possível comprimir bloco de bytes para ter espaço de memória.


Mesmo assim, se a interface de drive for uma Beta 128, pode não haver espaço de RAM suficiente para rodar um carregador BASIC com comandos TR-DOS. Agora que fiz uma 2ª versão do Gyroscope adaptado que funciona nas versões 48 e 128 da Beta, aproveito para fazer um tutorial.

Quando o bloco comprimido for expandido, haverá menos espaço para o monitor BASIC. O Lerm Code Compressor 1 inteligentemente possui uma rotina que elimina os 112 bytes de variáveis de sistema do TR-DOS. Mesmo assim, pode haver ocasiões em que falta espaço. Portanto a solução é utilizar uma rotina em assembly. A listagem completa é:

ORG 23872
DI              ; Desabilita interrupções.
LD SP,24060     ; Coloca pilha em local seguro.
LD BC,26640     ; Descomprime bloco.
CALL 26640
LD HL,52930     ; Endereço de início do jogo.
EX (SP),HL
RET             ; Inicia jogo (desativar para POKE).
XOR A
LD (53922),A    ; Vidas infinitas.
LD (59149),A    ; Tempo infinito.
RET
END

O melhor lugar para colocar esta rotina é na primeira linha BASIC, que deve ter um comando REM seguido de 25 espaços. O início desta área fica em PEEK 23635+256*PEEK 23636+5 que, no TK90X com variáveis de sistema do TR-DOS, fica em 23872.  Por isso o ORG 23872. Este é um bom local, pois não será sobreposto durante a descompressão.

No início as interrupções são desabilitadas, o que é aconselhável, pois a pilha da máquina será mudada na instrução seguinte. A pilha deve ficar fora da área a ser ocupada pelo bloco expandido; na prática, é bom deixar pelos menos uns 3 bytes de margem de segurança. Como o bloco expandido ocupará os endereços de 24064 a 65535, atribui-se o valor 24060 para o apontador de pilha (SP):
DI              ; Desabilita interrupções.
LD SP,24060     ; Coloca pilha em local seguro.


Em seguida é feita a decompressão propriamente dita:
LD BC,26640     ; Descomprime bloco.
CALL 26640

A rotina de descompressão fica 15 bytes após o endereço base, isto é, em 26640. Antes de chamar esta rotina, o par de registrador BC deve conter o valor de seu endereço, por uma peculiaridade do Lerm CC1.

Por fim, coloca-se no topo da pilha o endereço do início do jogo (52930), que é rodado pela instrução RET:
LD HL,52930     ; Endereço de início do jogo.
EX (SP),HL
RET             ; Inicia jogo (desativar para POKE).

A instrução RET acima deve ser removida (trocada por NOP) se for desejado rodar o restante do programa assembly:
XOR A
LD (53922),A    ; Vidas infinitas.
LD (59149),A    ; Tempo infinito.
RET

cuja finalidade é fazer POKEs de vidas e tempo infinitos. Com isto fica fácil configurar o jogo para rodar com ou sem o cheat.

A listagem do carregador BASIC é simples:
   1 REM NEXT 1 DRAW ]?
  10 BORDER NOT PI: PAPER NOT PI: INK NOT PI: CLEAR VAL "26e3": LET d=VAL "15363": IF PEEK d<>CODE "NOT " THEN LET d=VAL "15619"
  20 RANDOMIZE USR d: REM : LOAD "GYRO1"CODE
  30 RANDOMIZE USR d: REM : LOAD "GYRO2"CODE
  40 RANDOMIZE USR VAL "PEEK 23635+256*PEEK 23636+6"

A linha 1 contém o comando REM com o código de máquina, a linha 10 entre outras coisas detecta o tipo da Beta e atribui endereço apropriada para entrada do DOS, as linhas 20 e 30 carregam a tela e o bloco de bytes do jogo e a linha 40, executa o código de máquina para descomprimir e executar o jogo.

Para baixar os arquivos Hobeta do Gyroscope v. 2, acesse Google Drive ou 4 Shared.

Por fim, aqui está o vídeo completo do jogo:


Nenhum comentário:

Postar um comentário

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