sábado, 14 de julho de 2012

Adaptação de jogos de fita para Beta 48 (parte 4)

Na parte 3, o jogo Motos teria sido adaptado para funcionar em disquete Beta 48. Só que ficou faltando um detalhe: como ter acesso à listagem do programa carregador em BASIC? A resposta mais simplista seria pressionar BREAK antes que ocorra o carregamento do bloco seguinte. Assim, o programa seria interrompido e o seu conteúdo seria disponível para listagem e edição. 


Entretanto é possível fazer com que um programa não possa ser interrompido, modificando certas variáveis de sistema; um BREAK nestas condições produz travamento do computador. Para contornar esta proteção, pode-se carregar o programa com MERGE "", ao invés do LOAD. Entretanto é possível criar um programa BASIC protegido contra o MERGE, alterando via POKE o número de uma linha ou  o valor de seu comprimento.

Um método eficaz quando se está usando um emulador foi explicado anteriormente neste blog. Outro método igualmente eficaz, mas que funciona também no TK90X real, é usar o programa STK que também foi comentado anteriormente. Uma vez instalado o utilitário na RAM, use o comando Z BLOAD para carregar um programa BASIC sem que seja automaticamente executado.

Agora que foi encontrada uma forma de parar o programa BASIC logo após seu carregamento, o problema estaria resolvido, certo? Não, pois existem formas de proteção que é precisamente tornar a sua listagem ilegível.

Protegendo programas contra listagem

Para entender como desproteger um programa, é instrutivo aprender como fazer sua proteção. Digite o seguinte programa no TK90X:

10 REM xxxxxxx
20 LET b=PEEK 23635+256*PEEK 23636+6
30 FOR e=b TO b+6: READ a: POKE e,a: NEXT e
40 DATA 22,0,0,16,7,17,7

Logo após digitá-lo, use o comando LIST para ver a listagem que deve ser igual ao que está acima. Em seguida rode-o com RUN e liste novamente. Não será mais possível ver nada da listagem anterior. O truque situa-se na linha REM, em que cada caractere x (xis) foi substituído, via POKE, em códigos de controle de impressão do TK90X. Os códigos 22, 0 e 0 correspondem a AT 0,0; que posiciona o cursor no início da tela, os códigos 16 e 7 correspondem a INK 7 (branco) e os código 17 e 7 a PAPER 7 (branco).

Experimenta agora apagar a linha 10, digitando 10 seguido de ENTER. Novamente a listagem reaparecerá, porém sem (obviamente) a linha 10, pois os códigos de controle foram removidos. Entretanto num cenário mais real, esses códigos de controles estarão espalhados em várias linhas, o que torna sua remoção mais trabalhosa. Portanto o ideal seria poder obter uma listagem "limpa", em que não haja a interferência desses códigos.

Novamente é o utilitário STK é que vem a nos salvar, com o comando L LIST. Como no comando homônimo do BASIC, LIST admite especificar o número de linha a partir da qual será feita a listagem, sem que os códigos de controle obscureçam o conteúdo.


Por exemplo, o relançamento do Fairlight pela Micro Selection não é protegido com o esquema Alkatraz do original da The Edge, mas seu carregador BASIC está protegido contra a listagem. Carregue inicialmente a primeira parte da fita com o comando Z BLOAD do STK. Uma vez no BASIC, fica evidente que não se pode ver nada com o LIST. Entre outra vez no STK e acione o comando L LIST que terá fácil acesso à listagem:

1 PAPER 0: INK 0: BORDER 0: POKE 23624,0: CLEAR 25499: POKE 23659,0:
PRINT AT 11,8; PAPER 6;"LOADING FAIRLIGHT": LOAD "raven"SCREEN$ :
PAPER 8: INK 8: BRIGHT 8: OVER 1: PRINT AT 0,0: LOAD ""CODE: RAND USR
50300

A partir deste ponto, a adaptação será facilmente feita com as técnicas já citadas anteriormente. O jogo já adaptado pode ser encontrado no Google Drive e no 4 Shared, experimente examinar sua listagem para aprender mais.

5 comentários:

  1. Nada a comentar sobre as suas excelentes explicações!
    Apenas uma sugestão. Para quem usa Windows como eu, o emulador SpecEmu, que é compatível com a beta 48, é uma ótima ferramenta para testar as adaptações :-)

    ResponderExcluir
    Respostas
    1. Tem algumas vezes que eu uso o SpecEmu com o Wine. Pelo menos na versão 1.5.0 do Wine tum funcionado bem, mas em versões anteriores dava muito pau. O debugger do SpecEmu é excelente, a propósito, tem várias funcionalidades valiosas para um hacker de jogos clássicos.

      Excluir
  2. Realmente o debugger do SpecEmu é muito bom!
    Mas olha, na minha opinião. o único que é melhor ainda, é o do ZXSpin. Usei e uso, muitas e muitas vezes!
    Segundo o Woody, faltou pouco para esse mesmo debugger ser usado no SpecEmu...Infelizmente o autor, Marko, abandonou o projeto.

    ResponderExcluir
  3. Apenas retificando o que eu disse, o SpecEmu esteve próximo de ter o ASSEMBLER do ZXSPIN, não o debugger :-)

    ResponderExcluir
    Respostas
    1. Não conheço o ZXSpin, uma hora vou ver se roda no Linux com o Wine. Valeu pela dica!

      Excluir

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