Fazendo o processador - Parte 1
Ó, um negócio que eu esqueci de falar no post anterior foi que uma das coisas que eu queria fazer no código era compilar uma linguagem tipo assembly mas não assembly pra poder colocar na ROM do Logisim. Eu consegui, tá ai na fonte :).
Primeiro, eu tive que definir os opcodes, ou pelo menos algo parecido. Aí eu coloquei:
01 - SET - Define um valor na RAM - 2 Argumentos [nome,valor];
02 - OUT - Escreve um valor na tela - 1 Argumento [nome];
03 - JMP - Pula para uma linha no código - 1 Argumento [linha,boolean].
De alguma forma, só isso já é muito "funcional", mas ainda vou adicionar o add
e sub
pra matemática e alguma forma de input.
Pra compilar, eu fiz o código ser +/- assim:
set,01,Hello World
out,01
jmp,01,1
E peguei o "template" do Logisim pra poder salvar o código, o template é +/- assim:
v3.0 hex words addressed
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Pra substituir um 00 por outro valor, eu usei o .replace()
e defini para ele fazer UMA VEZ, assim ele sempre substituia o primeiro, e pra não quebrar o 00:
, eu dou replace só aonde tem espaço depois dos 00.
Fazendo esse processo, e colocando o ponto e vírgula para ser o ff
, o código compilado daria nisso:
v3.0 hex words addressed
00: 01 01 48 65 6c 6c 6f 20 57 6f 72 6c 64 ff 02 00
10: 001 ff 03 01 01 ff 00 00 00 00 00 00 00 00 00 00
...
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Ainda não tá perfeito, na linha 10 tem um 001
, mas o Logisim consegue consertar então ainda funciona.
Agora, a parte interessante:
Compilando o código e copiando ele, você vai poder colocar ele numa ROM ou RAM no Logisim, é só colocar uma, apertar pra editar os conteúdos, e colar, assim, selecione a opção "address" e pronto!
Alguns detalhes extras
- O comando
SET
define as variáveis em hexadecimal. O comando foi programado assim para suportar texto, assim, cada letra é um hex de 2 dígitos. - O comando
OUT
só consegue escrever o conteúdo de uma Varíavel. JMP
tem um segundo argumento booleano que pode ser uma varíavel ou só o número, assim, se você definir a variável para ser 0, ele não funciona.- Em vez de True ou False, é 1 ou 0. Economiza bits e diminui o código do compilador.
- O Suporte pra uma tela VGA é planejado.
.lc
é praLuna Code
, e.lcc
é praLuna Compiled Code