O módulo PROM implementa uma memória de acesso aleatório só de leitura. O módulo possui uma entrada de enable que quando desabilitada (0) coloca o barramento de dados em alta impedância (Figura 1).
Figura 1. Símbolo da PROM.
A interface gráfica das PROMs é comum a todas as memórias (presentemente RAMs e PROMs).
O objectivo da interface gráfica das memória é permitir a visualização e alteração do conteúdo da memória. Esta visualização pode ser feita de duas formas distintas:
Dump hexadecimal de todas as posições de memória (Figura 2).
Interpretação do código assembly em memória (Figura 4).
As memórias cuja barramento de dados esteja ligado ao barramento de dados de um processador apresentam ambas as interfaces, as restantes apresentam apenas a primeira.
A janela de dump hexadecimal da memória (Figura 2) possui duas zonas:
Numa mostra-se o valor hexadecimal de cada posição de memória;
Noutra mostra-se o caracter ASCII correspondente caso exista, caso contrário mostra-se um ponto.
Figura 2. Dump hexadecimal de uma memória.
Para carregar informações na memória deve-se usar o comando File->Load. Este comando carrega ficheiros com a extensão ".dat" que contenham texto ASCII em que cada linha tem o seguinte formato:
endereço conteúdo
em que o endereço e o conteúdo são números hexadecimais (sem prefixos ou sufixos, i.e. sem '0x' no início ou 'h' no fim).
Para alterar uma posição de memória basta posicionar o cursor no local respectivo e escrever o novo valor.
Para além de permitir a leitura e alteração do conteúdo da memória esta janela permite ainda colocar breakpoints quando uma posição de memória atingir determinado valor. Para tal é necessário clicar com o botão da direita do rato na posição respectiva de modo a aparecer a janela da Figura 3.
Figura 3. Colocação de um breakpoint na posição 51h da memória.
A janela que permite a visualização do código assembly
na memória (Figura 4) é a janela fundamental para o carregamento e
depuração dos programas assembly a executar nos vários
microprocessadores suportados pelo simulador. O assembly utilizado
depende do processador a que a memória está ligado. Esta detecção é
feita automaticamente pelo que o utilizador não tem que escolher qual o
assembly e assembler a utilizar. Esta
janela só é utilizada caso o processador não possua ele próprio uma
janela semelhante.
Figura 4. Duas visões da janela de deassembly.
Numa apenas a metade do código está preenchida,
noutra apenas as variáveis estão preenchidas.
Esta janela está dividida em duas partes. Na metade de baixo está o código assembly. Na metade de cima estão as variáveis definidas nesse código assembly. Nos casos dos sistemas embarcados o código estará em PROM pelo que as variáveis não podem ser declaradas na mesma memória. É o caso da Figura 4 em que o código está numa memória e as variáveis estão noutra.
Ambas as metades possuem três colunas. A primeira coluna indica o endereço onde está a instrução/variável, a segunda coluna indica a etiqueta que está associada à instrução/variável e a terceira contém a mnemónica da instrução assembly/o valor da variável, respectivamente.
A janela contém ainda dois conjuntos de quatro botões e uma janela de texto.
O primeiro conjunto de botões serve para:
iniciar/ parar a simulação;
reiniciar o processador;
executar uma instrução assembly (step)
O segundo conjunto de botões serve para:
Assemblar um programa assembly e gerar um ficheiro com o código máquina respectivo (compile);
Carregar um ficheiro com um código de máquina na memória (load);
Executar as duas operações anteriores sem gerar o ficheiro intermédio (compile & load);
Rexecutar a última operação de carregamento (load ou compile & load) sobre o mesmo ficheiro.
A janela de texto indica ao carregador de código onde é que a referida memória está mapeada no espaço de endereçamento do processador. Deste modo o programa carregador só carrega em memória a parte do código que deve ficar naquela memória. Com esta solução é possível ter um único ficheiro com código carregado por várias memórias e todas elas ficarem com uma parte diferente do código.
Para colocar/remover breakpoints para clicar com o rato na linha de código respectiva. As linhas que contenham breakpoints ficam assinaladas a Vermelho. A próxima instrução a executar fica assinalada a Azul.