/ / POKE no ZX Spectrum - zxspectrum

POKE no ZX Spectrum - zxspectrum

Eu estou jogando com um velho ZX Spectrum 48k e estou imaginando como exatamente é possível entrar Códigos POKE.

Você carrega um jogo com uma fita - em seguida, de alguma forma sair do tipo de programa nas instruções POKE e começar a executar o programa novamente?

Eu fiz muita pesquisa sobre isso, mas não consegui encontrar exatamente como isso é feito, então qualquer pista sobre isso seria muito apreciada.

Respostas:

2 para resposta № 1

A maioria dos programas do Spectrum usa um processo de duas etapas para iniciar um jogo:

  1. Carregar e executar um pequeno programa BASIC
  2. Esse pequeno programa BASIC carrega então código de máquina muito mais longo e depois salta para o ponto de entrada do código de máquina (por ex. RANDOMIZE USR 28455).

Se você conseguir parar entre essas etapas, você pode POKE (para aumentar o número de vidas, ...) e depois iniciar o código da máquina com RANDOMIZE USR 28455, supondo que você de alguma forma descobriu o endereço correto.

Uma vez que um programa de máquina está rodando, geralmente não há como pará-lo e voltar ao interpretador BASIC. A menos que o programa da máquina forneça alguma maneira explícita (ou inadvertida) de fazê-lo.


2 para resposta № 2

Primeiro de tudo, o significado de PEEK e POKE:

10 let x = PEEK 40000: REM returns (reads) the value (0-255) in position 40000
20 POKE 40000, 201: REM writes the 201 value in position 40000

A maioria dos programas carregou um pequeno programa BASIC chamado loader. Foi algo como:

10 cls
20 print "Loading AWESOME GAME!!!"
20 load "" screen$
30 load "" code 40000
40 randomize usr 40000

O significado deve ser direto: carregue uma apresentação de tela (linha 20) para manter o usuário entretido enquanto o programa assembler (o jogo em si) carrega (linha 30), e finalmente iniciar o jogo (linha 40).

Sobre a linha 40, usr 40000 é a expressão que faz o truque, chamando assembly na posição 40000. A instrução Randomize apenas inicializa a semente aleatória usada por rnd, pensei que nunca retornaria.

Então, as primeiras tentativas seriam:

  1. Pressione "break" (mais ou menos equivalente a Ctrl + C), digite list, e colocar os pokes na linha 35, ou seja, uma vez que o programa tenha sido carregado mas ainda não tenha sido executado.

  2. Em vez de digitar load "" Para iniciar o jogo, digite merge "" (isto foi usado para combinar o programa básico na memória com o da fita). O processo irá parar antes de executar o carregador. Isso é útil quando o carregador inclui um poke instrução que desativou BREAK.

O problema com esses métodos era que no primeiroas tentativas de esconder o loader inners eram ingênuas (como incluir uma instrução PAPER 0: INK 0 ou algo assim na linha 10, tornando tudo temporariamente invisível), mas logo eles se tornariam muito mais complexos, até o ponto de na verdade, ser um programa de montador incluído no REM instruções.

O próximo passo foi analisar os cabeçalhos docódigo de montagem carregado após o carregador básico, conclua o endereço de despejo e o comprimento do código e crie seu próprio carregador, no qual você pode incluir o poke instruções que você queria. Muitas revistas distribuíam este tipo de carregadores, que deveriam ser carregados antes do original (o carregador procurava por blocos específicos, ignorando o carregador básico original).

Então, os desenvolvedores decidiram incluir oblocos de montagem em fita sem os cabeçalhos, bem como proteger o carregador. Ou incluindo um carregador que apenas carrega um programa de montagem que substitui o carregador na ROM, usando velocidades diferentes, sem informações de cabeçalho, etc. Ou incluindo um carregador que carrega um bloco sem cabeça, incluindo a tela de apresentação e o código do jogo.

E então hardware especial como o Multiface-1 apareceu. Lendo o Manual Multiface-1 você pode ver como invocar o software multiface(incluído na ROM do hardware periférico) pressionando um botão vermelho (que provocou uma NMI (não mascarada interrupção), um menu foi mostrado permitindo que você salve a memória naquele ponto (e o código salvo ficaria livre de qualquer proteção) , abrindo assim o caminho para criar seu próprio carregador com pokes), ou até mesmo examinar (PEEK) valores atuais em endereços específicos na memória e digite POKE"s diretamente (com o qual você pode encontrar o começo dessas rotinas, por exemplo, que diminuem suas vidas em uma).

As instruções do POKE eram geralmente do tipo (isto é uma simplificação): POKE addr, 0 ou POKE addr, 201. O número addr foi o começo de uma rotina diminuindo o número de vidas disponíveis, ou detectando o confronto com um inimigo.

O código 0 é a instrução de montagem NOP (sem operação). Durante um NOP, o processador não faz nada.

O código 201 ou C9 é o conjunto RET (retorno) instrução, o que significa retornar para uma sub-rotina. Em BASIC, você chamaria uma sub-rotina com GOSUB e voltar do seu final com RETURN. Na montagem, o mesmo par é CALL / RET.

Se você tivesse 201, então isso significaria efetivamente que uma sub-rotina (digamos, subtrair uma para suas vidas) como:

9950 let lives = lives - 1
9960 return

foi transformado para:

9950 return
9960 return

Se você tivesse um valor 0, a mesma rotina foi transformada para:

9950
9960 return

1 para resposta № 3

Como eu me lembro de muito tempo atrás .... Quando um jogo Spectrum é carregado, ele inicialmente é carregado em um programa carregador pequeno e executa isso, a fita continua e a maior parte do programa é carregada. O último comando no programa carregador então emite um comando de puxão que chama tudo carregado e inicia o jogo. Então, como eu me lembro, você tem que pausar a fita uma vez que o programa carregador carregou, e parar a linha de código de automaticamente emitir o puxão final, então continua. Em seguida, uma vez que o volume tenha sido carregado, você emite o seu puxão na linha de comando e, em seguida, o puxão original para iniciar o jogo. O programa carregador será carregado após o primeiro conjunto de linhas vermelhas e azuis, seguido das linhas amarelas e azuis muito curtas no ecrã (se bem me lembro, imprime o nome do programa encontrado neste momento). Pare a fita, pressione Break e depois List para ver o código. Boa sorte e ótima pergunta!


1 para resposta № 4

Os códigos POKE impressos em revistas ZX Spectrumnormalmente espera-se que você tenha um dispositivo de hardware de plug-in (por exemplo, Multiface). Quando o jogo estiver carregado, você pode pressionar o botão Multiface para interromper o jogo, entrar nos POKEs e retornar ao jogo.

Sem um dispositivo especial, você precisa brincaros programas do carregador, conforme descrito pelas outras respostas. Você precisa carregar o programa inicial de carregador pequeno e, em seguida, BREAK no código. Se você tiver sorte, o código fará algo simples com o carregamento no restante do jogo e, em seguida, executará o jogo de código de máquina real usando a chamada RANDOMIZE USR. Nesse caso, você pode modificar o programa BASIC do carregador para fazer os POKES após o jogo foi carregado, mas antes do jogo ser iniciado.

No entanto, muitos jogos tornam isso difícil porque elesinclua o código do carregador personalizado. Isto é freqüentemente escrito em código de máquina embutido no pequeno programa BASIC em instruções REM. O código da máquina irá carregar o jogo e executá-lo, e como eles nunca retornam o controle para o código BASIC, não há oportunidade de entrar nos POKEs. Se você é dedicado o suficiente, você poderia tentar modificar o código da máquina para retornar o controle de volta para o BASIC para que você possa POKE away, ou então executar os POKEs via chamadas de código de máquina. Isso é bem difícil, porque, se bem me lembro, o editor costumava misturar linhas contendo caracteres não imprimíveis nas instruções REM. Havia ferramentas de software como o RoyBot que poderiam ajudá-lo a modificar o código na memória.

Alguns desenvolvedores de jogos fizeram coisas realmente malucas para evitar o hackear de jogos, como implementar código de carregador que realmente substituiu seu próprio código enquanto ele estava sendo executado.


Perguntas relacionadas


Comentários (0)

Adicione um comentário