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