sábado, 3 de maio de 2014

Número aleatório no Phantom Club

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.

Nenhum comentário:

Postar um comentário

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.