Como tenho feito costumeiramente nos últimos tempos, estava investigando o esquema de carregamento do jogo do TK90X Phantom Club para adaptá-lo ao disco Beta.
O esquema de carregamento é o Speedlock 5, que possui um número grande de decodificadores. Como desvendar os decodificadores é muito tedioso, o uso do recurso de breakpoint ativado por evento "tape:stop" poupa muito esforço. Examinando a listagem de disassembly, chega-se ao trecho:
ORG 64600
DI
LD SP,65152
LD HL,16384 ; Copiar bloco 16384-17793
LD DE,23552 ;para 23552-24961.
LD BC,1410
LDIR
LD A,R ; R=126. Semente de gerador de
LD (42452),A ;
num. aleatório.
Um fato que me chamou a atenção é a presença da instrução
LD A,R
, que transfere o conteúdo do registrador R para A. Na sequência, o valor é transferido para a memória em 42452. O registrador R é bastante estranho: os 7 bits menos significativos (bits 0 a 6) são incrementados em cada instrução do Z80, porém o bit 7 não muda, a não ser que tenha sido atribuído pela instrução LD R,A
. Alguns programas protegidos usam esse bit para detectar alguma tentativa de hacking. Pensei ser este o caso e resolvi investigar mais e cheguei à seguinte sub-rotina:
ORG 42451
;
Random LD C,Seed
INC C ; Seed=(Seed+1)%256
LD A,C
ADD A,A ; Seed=(21*Seed)%256
ADD A,A
ADD A,C
ADD A,A
ADD A,A
ADD A,C
LD (Random+1),A ; Save new seed value
RLCA ; Take 4 most significant
RLCA ;bits of random number
RLCA ;(range is 0-15).
RLCA
AND 15
RET
Este é um gerador de número pseudo-aleatório no faixa de 0 a 15. A semente de 8 bits que fica em 42452 é incrementado em 1 e, depois, multiplicado por 21. O resultado é a nova semente, que é guardada na RAM, para uma futura execução da sub-rotina. Este valor então é convertido para de 4 bits, que pode variar de 0 a 15.
O interessante é que a semente deste gerador é inicializada pelo registrador R. Porém é um esforço em vão, pois o seu valor inicial sempre é o mesmo, decorrente provavelmente do uso de R nos descodificadores do Speedlock.
O interessante é que a semente deste gerador é inicializada pelo registrador R. Porém é um esforço em vão, pois o seu valor inicial sempre é o mesmo, decorrente provavelmente do uso de R nos descodificadores do Speedlock.
Nenhum comentário:
Postar um comentário
Seu comentário é bem vindo, mas peço que use este espaço adequadamente.