Debugger do Fuse (Parte 1)
Eletrônica

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.



loading...

- Registradores I E R No Fuse
O debugger do Fuse não permitia atribuir valores diretamente aos registradores I e R do Z80. Comentei sobre isto no fórum do World of Spectrum e logo fui atendido. Na última versão disponível no repositório Subversion já é possível atribuir...

- Dica: Voltar Ao Basic Sem Perder Código De Máquina
Há ocasiões em que, como hacker do TK90X, desejamos poder voltar ao BASIC a partir de um programa em código de máquina. Por exemplo, quando queremos salvar um bloco de bytes em fita cassete ou em disco Beta 48. Entretanto grande parte dos programas...

- Adaptação De Jogos De Fita Para Beta 48 (parte 9)
O método mais seguro para quebrar as proteções de jogos salvos em fitas é analisar o carregamento desde o início, incluindo um exaustivo disassembly do código de máquina. Entretanto por vezes é vantajoso economizar esforços com alguns truques....

- Adaptação De Jogos De Fita Para Beta 48 (parte 6)
Até a parte anterior apresentamos procedimentos como se fosse efetuados em um TK90X real, os quais valem também para qualquer emulador. Na sequência, estaremos cada vez mais explorando os programas que têm algum esquema de proteção de gravação...

- Debugger Do Fuse (parte 3)
Nesta 3ª parte desta série de postagens sobre o debugger do emulador Fuse, falarei sobre uma importantíssima ferramenta chamada breakpoint. Normalmente, para entrar no debugger e pausar a emulação, o usuário deve intervir manualmente acionando o...



Eletrônica








.