segunda-feira, 6 de abril de 2020

Onde carregar programas de código máquina (I)

Antes de correr/criar um programa código máquina, é necessário definir onde o colocar em RAM. Enquanto no BASIC, tal é feito de uma forma transparente para o programador, em C/M é necessário escolher uma área de memória que não interfira com outros dados.

Por exemplo, não colocar o programa em cima de variáveis do sistema, do BASIC ou do stack. De outra forma, o computador pode crashar. Para tal, é conveniente conhecer o mapeamento da RAM no Spectrum.



















A variável do sistema PROG aponta para o início da área de memória que o BASIC é armazenado, o que num Spectrum sem uma interface 1, é normalmente PROG = $5CCB (23755).

Apenas como guias de referência, num Spectrum normal, aquando do arranque:

CHANS   $5CB6 Address of channel data
PROG    $5CCB Address of BASIC program
VARS    $5CCB Address of variables
E-LINE  $5CCC Address of command being typed in
WORKSP  $5CCE Address of temporary work space
STKBOT  $5CCE Address of bottom of calculator stack
STKEND  $5CCE Address of start of spare space
RAMTOP  $FF57 Address of last byte of BASIC system area
UDG     $FF58 Address of first user defined graphic
P-RAMT  $FFFF Address of last byte of physical RAM

Saliente-se que o espaço do BASIC + áreas de trabalho, por definição da ROM do Spectrum só cresce até à variável RAMTOP. Descendo a variável RAMTOP  em RAM, fica-se com menos espaço para o BASIC, mas a seguir é seguro colocar código máquina.

Para modificar o RAMTOP, e as variáveis associadas,  incluindo o SP, existe a instrução CLEAR do BASIC. Um valor seguro mínimo, fica entre 23900 a 24500, para um loader mínimo de BASIC.
Havendo um programa maior de BASIC, terá de ser tomado em conta o BASIC + variáveis.

Supondo que fazemos um CLEAR 25000, podemos então carregar / assemblar / fazer LOAD""CODE / invocar um programa em código máquina a partir de 25001. Note-se como o CLEAR 25000 afecta as variáveis de sistema acima mencionadas:

RAMTOP  $61A8 Address of last byte of BASIC system area ($61A8 = 25000)


Caso se usem UDGs, e não se modifique a sua localização, é melhor não mudar o stack para colocar C/M a partir de $FF58 até $FFFF (65368 até 65535).

Outro espaço onde se pode colocar código máquina, é no buffer de impressora. Este espaço de 256 bytes pode ser usado para loader de C/M de tape, ou para variáveis do programa C/M.

Note-se que outra estratégia, é usar partes do ecrã para rotinas temporárias, escondendo o código com atributos de COLOR e PAPER idênticos (desde que evidentemente não se faça scroll ou se limpe o ecrã).

De salientar, que como falado em artigos anteriores, aconselha-se a colocar a partir de 32786 ($8000), rotinas que necessitam de timings precisos, como loaders de tape, música ou rotinas de interrupts.

Ver:
Your Spectrum: system variables (I)
Your Spectrum: system variable (II)

Sem comentários:

Publicar um comentário