segunda-feira, 4 de maio de 2020

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

Como mencionado em artigos anteriores desta thread, pode-se gravar a memória toda RAM de 48KB num único bloco CODE e/ou ter este a fazer auto-arranque.

Uma outra estratégia de arranque de um LOAD "" CODE, é fazer SAVE do CODE em intruções BASIC, quer em linhas, quer no modo de edição, sendo que ao gravar e carregar a zona de memória das variáveis do sistema com o resto,  basicamente está-se a repor completamente o estado da máquina ao terminar o LOAD "" CODE (este método por exemplo, foi usado no PHEENIX).

A limitação deste método, é que tem-se de deixar em paz o stack na memória superior. Por exemplo, criar um block BASIC load prévio:

10 CLEAR 65535: LOAD ""

e gravá-lo:

SAVE "loader" LINE 10.

No entanto, por defeito, quando se liga o Spectrum, o stack do processador está numa posição alta, pelo que se pode fazer directamente o LOAD "" CODE. No entanto, dado existir a preocupação de não colidir com o stack do processador, pode ser necessário carregar mais que um bloco de LOAD "" CODE.

Sendo assim, por exemplo, tendo já feito um CLEAR , e assemblando o código em posições de memória, pode-se escrever em BASIC:

10 CLEAR 29000 : RANDOMIZE USR 30000

e portanto na linha de comando em seguida:

SAVE "prog" CODE 16384,49000 : GO TO 10

(ou gravar a partir de 23552 para gravar sem imagem)

Como mencionado, o facto de estarmos a gravar as variáveis de sistema, o BASIC e buffer de edição, implica que no fim do LOAD "" CODE, vamos cair no GO TO 10, que seria (é), a instrução a ser executada no fim do SAVE "" CODE.

Saliente-se que como esquema de "protecção" para baralhar curiosos, podemos fazer o RANDOMIZE USR em lugar do GO TO.

Exemplo:

No caso do PHEENIX, o loader BASIC é carregado com LOAD "" CODE 23552,550, o que cobre carregar o estado da máquina desde o início da zona de variáveis até STKEND.



O primeiro LOAD "" CODE carrega o seguinte programa (protecções BASIC desfeitas):

1 CLEAR 24500
2 INK 0 :PAPER 0 :BORDER 0 :CLS 
3 PRINT AT 8,7;"....PHEENIX is loading";AT 10,9;"........Please Wait ......"
4 POKE 23659,0
5 LOAD ""CODE 24532
6 LOAD ""CODE :RANDOMIZE USR 30105

 5CCB 00 01 0D 00 FD 32 34 35 30 30 0E 00 00 B4 5F 00 ....?24500...?_. 
 5CDB 0D 00 02 1D 00 D9 30 0E 00 00 00 00 00 3A DA 30 .....?0......:?0 
 5CEB 0E 00 00 00 00 00 3A E7 30 0E 00 00 00 00 00 3A ......:?0......: 
 5CFB FB 0D 00 03 5B 00 F5 AC 38 0E 00 00 08 00 00 2C ?...[.??8......, 
 5D0B 37 0E 00 00 07 00 00 3B 22 10 05 13 01 50 48 45 7......;"....PHE 
 5D1B 45 4E 49 58 20 69 73 20 6C 6F 61 64 69 6E 67 22 ENIX is loading" 
 5D2B 3B AC 31 30 0E 00 00 0A 00 00 2C 39 0E 00 00 09 ;?10......,9.... 
 5D3B 00 00 3B 22 13 00 10 06 11 02 12 01 20 50 6C 65 ..;"........ Ple 
 5D4B 61 73 65 20 57 61 69 74 20 12 00 11 07 10 00 22 ase Wait ......" 
 5D5B 0D 00 04 15 00 F4 32 33 36 35 39 0E 00 00 6B 5C .....?23659...k\ 
 5D6B 00 2C 30 0E 00 00 00 00 00 0D 00 05 10 00 EF 22 .,0...........?" 
 5D7B 22 AF 32 34 35 37 36 0E 00 00 D4 5F 00 0D 00 06 "?24576...?_.... 
 5D8B 13 00 EF 22 22 AF 3A F9 C0 33 30 31 32 31 0E 00 ..?""?:??30121.. 
 5D9B 00 99 75 00 0D 80

Este bloco CODE foi gravado com a linha de comando, que se encontra na posição de memória apontada por E_LINE: 

CLEAR 24500 : SAVE "PHEENIX" CODE 23552,550 : RUN

 5DA1 FD 32 34 35 30 30 0E 00 00 B4 5F 00 3A F8 22 50 ?24500...?_.:?"P 
 5DB1 48 45 45 4E 49 58 22 AF 32 33 35 35 32 0E 00 00 HEENIX"?23552... 

 5DC1 00 5C 00 2C 35 35 30 0E 00 00 26 02 00 3A F7 0D .\.,550...&..:?. 

O que implica que ao carregar o  bloco de CODE,  o RUN é executado por ser a instrução a seguir ao SAVE "" CODE.

Sem comentários:

Publicar um comentário