quarta-feira, 21 de novembro de 2012

GoToBasic48.asm

Existem certos programas que não são compatíveis com o modo 128 BASIC do ZX Spectrum 128, ou TK90X e a TKMEM-128 com a ROM 128 ativada. Um exemplo é o Lerm Code Compressor 1 que utilizo muito nas minhas adaptações para a interface de drive Beta.

Menu do ZX Spectrum 128

Para sair do modo 128 BASIC, pode-se empregar a opção '48 BASIC' do menu ou usar comando SPECTRUM. O ponto negativo desta abordagem é que o chaveamento da RAM é desabilitado, impedindo o acesso aos 128KB de bancos de RAM.

Digitando o comando USR0 no editor BASIC, é possível ir para o 48 BASIC sem perder o chaveamento, porém todo o conteúdo da RAM é apagado. Eu desejava uma abordagem em que o conteúdo da RAM fosse preservado, por isso criei o programa assembly GoToBasic48:

ORG 23872
;
INCLUDE "Header_Basic.asm"
;
DI                      ; Disable interrupts before touching system
                        ;variables.
LD BC,32765             ; Select ROM 1 and RAM 0. 
LD A,16
OUT (C),A
RES 4,(IY+1)            ; Change FLAGS to 48K mode. 
LD HL,(RAMTOP)          ; Stack will be cleared. 
LD (HL),62              ; Put end marker of GOSUB stack.
DEC HL                  ; Leave space of one byte.
LD SP,HL                ; Define new value of stack pointer.
LD HL,MAIN_4            ; Put error treatment routine address onto stack
PUSH HL
LD (ERR_SP),SP          ;and redefine value of ERR_SP.
EI                      ; Enable interrupts before returning to BASIC. 
JP STMT_RET             ; Jump to interpret the next BASIC statement.
END

Basicamente o programa seleciona RAM 0 e ROM do 48 BASIC, define a variável de sistema FLAGS para modo 48K, reconstrói as pilhas de máquina e de GOSUB e passa o controle para a ROM, para que esta passe a interpretar o próximo comando BASIC.

Para montar o programa acima (assembling), é necessário o arquivo Header_BASIC.asm, mas não é necessário fazer esta operação, pois o binário já está pronto e pode ser baixado neste link. O código fonte está disponível neste link.

O programa em código de máquina pode ser armazenado em qualquer parte da RAM sem a necessidade de fazer uma nova montagem. Um local interessante é dentro da uma linha BASIC. 

Nenhum comentário:

Postar um comentário

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