sexta-feira, 22 de junho de 2012

LSD Megademo (Pentagram)

Mais um demo para TK90X com Explorer foi adaptado para a interface de drive padrão Beta 48, o LSD Megademo do grupo Pentagram.


Uma dificuldade adicional  na adaptação foi a presença de código de máquina dentro de linha BASIC, prática que era comum no ZX-81. Para este procedimento funcionar, o programa BASIC não deve mudar de posição na memória, porém o TRDOS (sistema operacional da interface Beta) acaba deslocando 112 bytes a partir do endereço 23734 para criar suas variáveis. A solução foi empregar a rotina RECLAIM_2 da ROM do TK90X, que toma de volta um espaço de memória. Porém, antes de 'reclamar' a memória ocupada pelas variáveis do TRDOS, estas devem ser salvas n um local temporário, para serem novamente recuperadas antes de fazer operação de leitura de disco.

A restauração da área de variáveis TRDOS é feita com a rotina MAKE_ROOM da ROM do TK90X, que faz o oposto de RECLAIM, isto é, cria um espaço na memória de BC bytes a partir do endereço HL+1.

Os endereços das rotinas RECLAIM_2 e MAKE_ROOM estão contidas no arquivo Header_Basic.asm. Seu funcionamento está detalhado no livro "O sistema operativo do Spectrum: ROM disassembly" de Ian Logan e Frank O'Hara.

O resultado final foram as duas rotinas listadas abaixo, uma para remover as variáveis TRDOS, e outra para as restaurar.

         ORG 32000
;
        INCLUDE "Headers_Basic.asm"
;
EraseVar:
        LD HL,23734+111     ; HL aponta para final da área das variáveis TRDOS.
        LD BC,112           ; Número de bytes a reclamar.
        PUSH BC             ; Guarda o valor de BC.
        LD DE,SaveVar+111   ; Local para salvar variáveis TRDOS.
        LDDR                ; Salva temporariamente as variáveis TRDOS.
        INC HL              ; HL aponta para endereço 23734.
        POP BC              ; BC especifica 112 bytes a 'reclamar'.
        JP RECLAIM_2        ; Executa rotina da ROM.
;
RestoreVar:
        LD HL,23733         ; HL aponta para endereço anterior a 23734.
        LD BC,112           ; Número de bytes de espaço a criar.
        PUSH BC             ; Guarda valor de BC.
        CALL MAKE_ROOM      ; Rotina da ROM para abrir espaço.
        POP BC              ; Número de bytes para recuperar.
        INC DE              ; DE aponta para 23734.
        LD HL,SaveVar+111   ; HL aponta para onde foi salvo as variáveis TRDOS.
        LDDR                ; Copia as variáveis no espaço criado.
        RET                 ; Fim
;
SaveVar:
        DEFS 112

Este demo é relativamente antigo (1992) e na maior parte não me impressionou muito. Mesmo assim vale a pena dar uma olhada. Os gráficos vetoriais (que me lembraram alguns demos para Amiga) e o scroller ao redor de um planeta são as melhores partes do programa. Além de tudo, tem umas músicas para exercitar o PSG de sua interface Explorer.

Os arquivos em formato Hobeta estão disponíveis no Google Drive e no 4 Shared.

Atualização: versão 2 no Google Drive e no 4 Shared, que funciona na Beta 48 e 128. 

Nenhum comentário:

Postar um comentário

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