segunda-feira, 4 de junho de 2012

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]

Nenhum comentário:

Postar um comentário

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