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 |
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:
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.
Pode-se também criar um breakpoint que é acionado quando um endereço de memória é lida ou escrita:
quando uma porta de entrada/saída é lida ou escrita:
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:
ou quando um evento é ativado:
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.
O primeiro é acionado quando o gravador é ligado e o segundo, quando ele é parado.
Usado para remover um breakpoint com o ID especificado ou todos, se for omitido o parâmetro:
Comando ignore ou i
Além das condições já mencionadas para que um breakpoint seja acionada, pode-se adicionar mais uma com este comando:
Por exemplo, se fora criado um breakpoint com ID 5, com o comando:
e se for digitado na sequência:
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 é
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:
o breakpoint com o valor de ID especificado será ignorado até que o número do contador seja zerado. O comando
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:
Este comando apaga todos os breakpoints associados ao endereço especificado:
clear [endereço]
Nenhum comentário:
Postar um comentário
Seu comentário é bem vindo, mas peço que use este espaço adequadamente.