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