quinta-feira, 30 de abril de 2020

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

Outro dos locais que podemos usar para programas em código máquina curtos, é no meio de programas BASIC ou em variáveis BASIC. Embora existam alguns inconvenientes, como a área do BASIC mover-se (tendo uma interface 1) e ainda mais a área de variáveis moverem-se, tem a vantagem que para curtos programas, ao gravar o programa BASIC, basta gravar um bloco. Como desvantagem, é preciso ter cuidados para não usar CALLs e saltos absolutos (ou no caso de os usar, fazer patching para se ajustar à localização do programa).

Já vimos como adicionar BASIC em expressões REM no artigo Dicas: Rotina C/M para anti-Break.

Para o explicar, por exemplo, para assemblar um programa de 4 bytes:

    LD     BC,0               ; $01 $00 $00
    RET                          ; $C9

(este programa simples, devolve o valor 0 ao BASIC)

Inserimos uma linha REM com 4 espaços, e escolhemos o ORG a começar no primeiro espaço.

1 REM <4 espaços>

Na posição da memória do Spectrum apontada pela variável de sistema PROG:

5CCB 00 01         ; line 1 
5CCD 06 00         ; length 6 bytes
5CCE EA 
5CCF 20 20 20 20   ; 4 spaces $20 ASCII for space
5CD3 0D            ; end of line

Portanto, para assemblar os 4 bytes, a seguir ao REM, na zona do BASIC:

    ORG   $5CCF
    LD       BC,0
    RET

Para executar, uma vez que o BASIC pode variar no começo, obter a zona do começo do BASIC fazendo PEEK da variável PROG, e somar mais 5 bytes, para apontar para os espaços a seguir ao REM:

10 PRINT USR (PEEK 23635+PEEK 23636*256+5)

Também como mencionado, pode-se usar uma variável BASIC.  Supondo que a primeira variável a ser criada é A$, e sendo A$ inicializado como

LET A$="    " (4 espaços)

Então na posição apontada por VARS:

5CCB 41           ; A$
5CCC 04 00        ; len
5CCD 20 20 20 20  ; 4 espaços

Portanto para assemblar nos 4 espaços:

    ORG    $5CCD
    LD        BC,0
    RET

Para o invocar, fazer USR para (VARS)+3:

10 PRINT USR (PEEK 23627+PEEK 23628*256+3)

Em ambos os casos, para gravar o programa BASIC (+VARS), já com o assembly incluído, e fazer auto-arranque:

SAVE "prog" LINE 10

Note-se que em ZX-BASIC  RUN ou CLEAR inicializam as variáveis do BASIC, em contrapartida armazenar C/M em variáveis do BASIC não estraga a formatação da listagem.

Sem comentários:

Enviar um comentário