quinta-feira, 28 de maio de 2020

Introdução: loaders em BASIC

Uma  dúvida recorrente parece ser como gravar um programa BASIC / um loader de BASIC para uma rotina código máquina. Para tal o mais simples é escrever algo como:

10 CLEAR 49999 : LOAD "" CODE : RANDOMIZE USR 50000

Ou para ter um ecrã de carregamento:

10 CLEAR 49999 : LOAD "" SCREEN$ : LOAD "" CODE : RANDOMIZE USR 50000

e gravar com com arranque automático na linha 10:

SAVE "prog" LINE 10

Para criar um TAP, convém que seja um emulador que suporte isso, como por exemplo, o  Retro Virtual Machine 2. Ou pode escrever em texto, e usar um utilitário como o bas2tap, que já falamos num artigo anterior:

bastap loader.bas loader.tap

Mas vejamos o programa BASIC:

CLEAR 49999

Coloca todo o espaço temporário e stacks microprocessador e BASIC abaixo desse endereço. Na prática garante que os endereços para a frente não são usados. Não se recomenda um valor abaixo de 24500.

LOAD "" SCREEN$

Carrega um ecrã em formato ZX Spectrum gravado com SAVE "" SCREEN$ ou gerado num PC.

LOAD "" CODE

Carregar o bloco de código máquina.

RANDOMIZE USR 50000

Saltar para o endereço de execução.

Note-se que em alguns assemblers, o loader BASIC pode ser gerado automaticamente.

Por exemplo, no pasmo:

pasmo --tapbas prog.asm prog.tap

ou:

pasmo --tzxbas prog.asm prog.tzx

Estes dois modos criam um loader simples, similar ao primeiro exemplo, sem o RANDOMIZE USR.

Para colocar o RANDOMIZE USR, é necessário colocar no fim do assembly, uma directiva, por exemplo no pasmo:

END 50000

Ver também: ZXBASIC manual - chapter 26 - Using machine code

Sem comentários:

Publicar um comentário