Debugger do Fuse (Parte 3)
Eletrônica

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 menu do Fuse. Porém existem ocasiões em que o automatismo seria bem vindo, ao estabelecer que se certas condições foram satisfeitas, a emulação seja parada e a janela do debugger seja aberta.

Janela do debugger
Nesta postagem mostrarei os comandos destinados a colocar e alterar os breakpoints.

Comando brekpoint ou br

Este comando cria um breakpoint, isto é, uma condição em que a emulação é interrompida para passar o controle ao debugger. Na sua forma mais simples:
  br [endereço] 

cria um breakpoint no endereço especificado ou, se o parâmetro for omitido, no endereço apontado pelo contador de programa (PC). Assim que o Z80  for executar uma instrução contida neste endereço, a emulação é interrompida. Com isto abre-se a janela que permite examinar os registradores do Z80 e o disassembly das instruções que se seguem ao endereço. Trata-se de uma ferramente poderosa para analisar o funcionamento do código de máquina.

Existe na janela do debugger uma lista dos breakpoints criados. Cada breakpoint possui os seguintes atributos: ID (número que identifica o breakpoint), Valor, Ignore (vide comando Ignore), Life (vide comando t) e Condition (vide comando condition).

Pode-se também criar um breakpoint que é acionado quando um endereço de memória é lida ou escrita:
  br read [endereço]
  br write [endereço]

quando uma porta de entrada/saída é lida ou escrita:
  br port read [endereço de porta]
  br port write [endereço de porta]


quando se passa um determinado período de tempo (em número de estados T), contado após início da geração de um quadro de vídeo:
  br time [tempo]

ou quando um evento é ativado:
  br event area:detalhe

Neste último caso, há vários eventos relacionados com periféricos; citaremos apenas os que são ativados com a fita cassete, mas há outros que podem ser vistos no manual do Fuse.
  br event tape:play
  br event tape:stop

O primeiro é acionado quando o gravador é ligado e o segundo, quando ele é parado.

Comando t

Há ocasiões em que se deseja que um determinado breakpoint seja acionado somente uma vez. Neste caso, seria melhor que ele seja apagado logo depois de ser acionado, para não poluir a lista de breakpoints. O comando t serve exatamente para esta finalidade e possui todas as mesmas variedades de formas do comando br.
Os breakpoints criados com br aparecem na listagem com valor de Life Permanent, enquanto os que foram criados com t aparecem One Shot.

Comando delete ou del

Usado para remover um breakpoint com o ID especificado ou todos, se for omitido o parâmetro:
  del ID
  del

Comando ignore ou i

Por vezes não é desejado que o brekpoint seja acionado em todas as ocasiões, mas que seja ignorado por algumas vezes. Isto é bastante útil em laços (loops) ou instruções repetitivas (CPIR, CPDR, LDIR, LDDR, OTIR, OTDR). Ao se digitar: 
  i ID contador

o breakpoint com o valor de ID especificado será ignorado até que o número do contador seja zerado. O comando i altera o campo Ignore do breakpoint.

Comando condition ou cond

Além das condições já mencionadas para que um breakpoint seja acionada, pode-se adicionar mais uma com este comando:
  cond ID condição

Por exemplo, se fora criado um breakpoint com ID 5, com o comando:
  br 55623

e se for digitado na sequência:
  cond 5 BC==10000

O breakpoint será acionado só se o Z80 estiver executando a instrução armazenada no endereço 55623 e o conteúdo do registrador BC for igual a 10000.

Note que o operador de igualdade é == (dois símbolos de igual) e de desigualdade é !=.

Comando clear

Este comando apaga todos os breakpoints associados ao endereço especificado:
  clear [endereço]



loading...

- Silkworm 128... ?
Emmerson Maurilio fizera uma wishlist de jogos para TKMEM-128 a serem adaptados e, entre estes, figurava Silkworm que teria comportamento diferente entre 48 e 128K. Resolvi tirar a prova. Carreguei o jogo no emulador Fuse, definindo no debugger um breakpoint...

- 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....

- Debugger Do Fuse (parte 2)
Dando sequência à série de postagens sobre o debugger do Fuse, desta vez trago informações sobre o comando set. O comando set, semelhante ao LET da linguagem BASIC do TK90X, serve para atribuir valor para uma posição da memória, um registrador...

- 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...



Eletrônica








.