Número aleatório no Phantom Club
Eletrônica

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.



loading...

- Dica Tv Electronia 20nt Chassis 11ak30
Defeito--Não liga. Led vermelho aceso. Ao tentar ligar, o led passa a verde mas, no               mesmo instante, o led volta para vermelho e a fonte da tv não arma.Valores         ...

- Dica Tvs Panasonic Tx-25xd3e Chassis Euro 2m
Defeito--Este  tv estava em protecção, trazia o transístor de saída de linhas (2SD1577-               LB) em curto. Depois de o substituir, o tv arrancou apresentando o seguinte       ...

- Número Aleatório Por Xor-shift
Apresento a sub-rotina de geração de número pseudoaleatório que foi usada na minha parte do demo Mission Highly Improbable.  Anteriormente mostrei a sub-rotina de Phantom Club para a mesma finalidade, porém a qualidade da sequência gerada...

- Outra Rotina De Detecção De Ram 48/128k
Eu publiquei nesta postagem, uma rotina que faz a detecção no TK90X da configuração com ou sem a TKMEM-128 (128 ou 48K de RAM). Modifiquei-a e consegui fazer com que ficasse menor ainda (25 bytes).  Esta rotina testa se ocorre chaveamento entre...

- Thundercats V. 2 Para Basic 128
Mal acabei de lançar uma adaptação do Thundercats para Beta e TKMEM-128 e estou com a versão 2. A versão anterior tinha um problema: não consegue carregar a partir do BASIC 128, portanto tinha que dar um 'USR 0' antes. Na versão 2 não...



Eletrônica








.