sexta-feira, 1 de junho de 2012

Debugger do Fuse (Parte 1)

Lá nos idos dos anos 1980-90 hackear um jogo do TK90X significava carregar (da fita cassete!) programas tipo monitor/debugger e ficar copiando listagens disassembly a mão, num caderno. Depois criar os hacks e digitar num assembler para salvar... novamente em fita cassete! 

A coisa ficava um pouquinho melhor com uma Multiface 1, pois era possível interromper qualquer jogo no meio da execução e examinar seu código de máquina. Com o programa Genie a coisa ficava mais fácil (menos difĩcil?) pois era possível ter uma listagem disassembly. Outras aquisições interessantes seriam uma interface de drive e uma impressora. Foi mais ou menos assim a minha trajetória de hacker do TK90X. Quando digo hack, não se trata de piratear, pois nunca comercializei jogos. Eu refiro-me a entender o funcionamento dos programas e modificá-los (exemplos: vidas infinitas, adaptação para rodar em disquete, ...). 

Agora temos computadores baratos, ordens de grandezas mais velozes, com mais memória e com periféricos que tornam tudo mais cômodo. Assim é muito mais fácil programas e hackear num emulador rodando num PC moderno. O que eu tenho usado hoje é um PC com Linux e o emulador de ZX Spectrum Fuse. Pretendo apresentar o debugger do Fuse que é uma excelente ferramenta, pois faz tudo que a M1 fazia e muito mais. 



Apresentando o debugger

A funcionalidade do debugger é plena apenas com a interface GTK, pois com a interface SDL parece-se mais com uma M1. Assim, falarei apenas sobre a interface GTK, cuja janela é apresentada na figura acima. Ela se abre quando se escolhe o item do menu: Machine > Debugger... . Neste momento a emulação é interrompida e o Spectrum virtual mantém-se congelado.

Esta janela contém informações sobre o estado atual: os valores contidos nos registradores do Z80 e nas flags,  o estado das interrupções (IM e IFF) e o valor do último byte escrito nos periféricos presentes (na figura: ULA, AY e 128Mem). Na coluna à direita, há o mapeamento da memória em porções de 8KB, com dado adicional se é gravável (W?) e se sofre contenção pelo ULA (C?). Nas colunas seguintes há: a listagem disassembly do código de máquina em execução, o conteúdo da pilha de máquina (apontada por SP) e os tempos em que ocorrerão certos eventos que afetam a execução.

Do lado esquerdo, abaixo das colunas dos registradores Z80 e do mapa de memória, há uma área com lista dos breakpoints, assunto que abordarei em postagem futura. Logo abaixo há uma linha em que o usuário pode digitar um comando do debugger e pressionar a tecla Enter ou o botão Evaluate para executar (vide adiante)

Por fim, na parte mais baixa da janela há 4 botões:
  • Single step: executa uma única instrução do Z80;
  • Continue: reinicia a emulação sem fechar a janela do debugger, a qual não é atualizada;
  • Break: interrompe a emulação depois de um Continue;
  • Close: fecha a janela do debugger e retoma a emulação.
Linha de comandos

Os comandos providenciam possibilidades que tornam o debugger bem mais útil. Nesta postagem irei apresentar somente 2 tipos de comandos.

base: define a base numérica em que os valores são mostrados na janela, pode ser base 10 (decimal) ou base 16 (hexadecimal).

disassemble or di: o comando di [endereço] define o endereço a partir do qual será feito o disassembly exibido na janela.

Na linha de comandos qualquer valor numérico pode ser expresso como número decimal, (sem prefixo) ou hexadecimal  (com prefixo 0x ou $). Além disto, podem ser construídas expressões com as operações aritméticas (+, -, *, /), operadores de igualdade (==) e de desigualdade (!=) e operadores bit a bit AND (&), OR (|) e XOR (^) e operadores lógicos AND (&&) e OR (||). Os seguintes exemplos são válidos:
  • base 10 ou base 0xa
  • base 16 ou base $10
  • di 128*256+31
  • di 0x7fff ou di 32767
Atualização: continua na parte 2.

3 comentários:

  1. Eu tinha feito um programinha minusculo em basic pra ler e inserir codigos na memoria...Eu carregava o binario do jogo, alterava o que eu queria, salvava e pronto :) Traduzi alguns jogos pra Logic Software (da Regina Taquetti, la no edficio massom, na sete de setembro) incluindo o Jack the Nipper II :o)

    ResponderExcluir
  2. A proposito, isso foi a mais ou menos 25 anos atras :)

    ResponderExcluir
    Respostas
    1. Realmente era uma época heroica para quem se aventurava a hackear programas. Perto disso, mexer num programa do TK90X hoje é mamão com açúcar.

      Excluir

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