parte 1
Agora iremos desenvolver um programa em java que será capaz de ler nossos programas .nasm e converter eles para .hack (binário). Nosso arquivo .hack é um arquivo de texto que possui apenas 1s e 0s. Cada linha desse arquivo .hack é uma instrução a ser armazenada na memória ROM e executado pela CPU.
Exemplo de um arquivo .hack:
000000000000000101
100101100000010000
000000000000000001
100000000000100000
000000000000001011
Você pode abrir seus arquivos .hack, basta ir em
F-Assembly/bin/hack/que vai encontrar seus binários (executáveis).
O arquivo .hack é um formato que não conseguimos fazer o download para a FPGA, então é necessário convertemos esse formato em um que o Quartus entenda. Esse formato do Quartus é chamado de .mif e é gerado automaticamente pelos scripts de teste, esse arquivo .mif é similar ao .hack salvo um cabeçalho e a indicação do endereço na qual a linha deve ser salva:
WIDTH=18;
DEPTH=5;
ADDRESS_RADIX=UNS;
DATA_RADIX=BIN;
CONTENT BEGIN
0 : 000000000000000101;
1 : 100101100000010000;
2 : 000000000000000001;
3 : 100000000000100000;
4 : 000000000000001011;
END;
Info
O Assembler de vocês deve gerar um arquivo .hack. A conversão para o .mif é feita pelos scripts em python já fornecidos (./testeAssembly.py)
assembler script python
.nasm ---------> .hack --------> .mif
v
|---------> FPGA
|---------> SIMULADOR
Assembler
O assembler será um programa escrito em java e que foi estruturado em quatro classes:
- Assemble
- Arquivo:
Assemble.java - Descrição: Classe responsável por criar o código de máquina, ela que efetivamente faz a varredura do arquivo
.nasmde entrada e escreve o arquivo.hackde saída, gerando o código de máquina. - Dependências:
Code.java,Parser.java,SymbolTable.java
- Arquivo:
- Code
- Arquivo :
Code.java - Descrição : Traduz mnemônicos da linguagem assembly para códigos binários da arquitetura Z0.
- Dependências : none
- Arquivo :
- Parser
- Arquivo :
Parser.java - Descrição : Encapsula o código de leitura. Carrega as instruções na linguagem assembly, analisa, e oferece acesso as partes da instrução (campos e símbolos). Além disso, remove todos os espaços em branco e comentários.
- Dependências : none
- Arquivo :
- SymbolTable
- Arquivo :
SymbolTable.java - Descrição : Mantém uma tabela com a correspondência entre os rótulos simbólicos e endereços numéricos de memória.
- Dependências : none
- Arquivo :
Note que o 'orquestrador' da montagem (esse é o termo em português utilizado) é a classe 'Assemble', nela que estará toda a lógica de montagem acessoada pelas demais classes.
Próximos passos
Agora vamos configurar a ide para podermos trabalhar no código java, siga para a próxima parte.