Simulador da viking CPU utilizando React.js & Monaco-Editor.
Link site: https://vanflux.github.io/viking-sim-web/
A implementação original foi feita por sjohann81 utiliza python2 e pode ser encontrada AQUI.
Esta implementação tem o objetivo de fazer algumas melhorias como por exemplo: o editor de código, na implementação original é um editor de texto simples, já nesta, foi utilizado o monaco-editor que possui syntax highlight e outras ferramentas como busca(ctrl+f), desfazer(ctrl+z), refazer(ctrl+y).
Caí aqui de paraquedas:
- Nesse caso, recomenda-se olhar a documentação do repositório oficial, lá é explicado como que a arquitetura funciona e são oferecidos vários exemplos: https://github.com/sjohann81/viking/
Operações básicas ✔️:
Operação | Descrição | Operação | Descrição |
---|---|---|---|
AND | Logical product | LDC | Load constant |
OR | Logical sum | LSR | Logical shift right |
XOR | Logical difference | ASR | Arithmetic shift right |
SLT | Set if less than | ROR | Rotate right through carry |
SLTU | Set if less than (unsigned) | LDB | Load byte |
ADD | Add | STB | Store byte |
ADC | Add with carry | LDW | Load word |
SUB | Subtract | STW | Store word |
SBC | Subtract with carry | BEZ | Branch if equal zero |
LDR | Load register | BNZ | Branch if not equal zero |
Pseudo operações 🟡 (em desenvolvimento):
Operação | Descrição | Operação | Descrição |
---|---|---|---|
✔️ HCF | Halt and catch fire | ✔️ POP | Pop to register from stack |
✔️ LDI | Load immediate | ✔️ PUSH | Push register to stack |
✔️ LSL | Logical shift left | ⭕ ret | Return |
✔️ nop | No operation | ✔️ not | One’s complement |
✔️ neg | Two’s complement | ✔️ mov | Move register |
⭕ rol | Rotate left through carry | ⭕ lsrm | Logical shift right multiple |
⭕ asrm | Arithmetic shift right multiple | ⭕ lslm | Logical shift left multiple |
⭕ seq | Set if equal | ⭕ sne | Set if not equal |
⭕ sge | Set if greater equal | ⭕ sgeu | Set if greater equal (unsigned) |
⭕ beq | Branch if equal | ⭕ bne | Branch if not equal |
⭕ blt | Branch if less than | ⭕ bge | Branch if greater equal |
⭕ bltu | Branch if less than (unsigned) | ⭕ bgeu | Branch if greater equal(unsined) |
⭕ sgt | Set if greater equal | ⭕ sle | Set if less equal |
⭕ sgtu | Set if greater than (unsigned) | ⭕ sleu | Set if less equal (unsigned) |
⭕ bgt | Branch if greater than | ⭕ ble | Branch if less equal |
⭕ bgtu | Branch if greater than(unsigned) | ⭕ bleu | Branch if less equal(unsigned) |
⭕ jmp | Jump | ⭕ jal | Jump and link |
⭕ jmpr | Jump register | ⭕ jalr | Jump and link register |
-
Para fazer operações I/O como ler/escrever no console ou interagir com o canvas é Recomendado usar os simbolos pré definidos ao invés dos endereços de forma fixa (0xf000, 0xf002). O motivo disso é que futuramente pretende-se suportar a arquitetura 32 bits e nela os endereços para fazer essas operações mudam, por exemplo: 0xf000 -> 0xf0000000 (writec).
-
Símbolos pré definidos I/O
- Console:
console_writec
: Printa um caractere no output do consoleconsole_writei
: Printa um inteiro no output do consoleconsole_readc
: Lê um caractere do input do usuárioconsole_readi
: Lê um inteiro do input do usuário
- Canvas (experimental, veja os Exemplos para enteder melhor):
canvas_clear
: Apaga/limpa o canvascanvas_clearLine
: Apaga os pixels de uma linha (apaga uma linha)canvas_clearPixel
: Apaga um pixelcanvas_drawLine
: Desenha uma linhacanvas_drawPixel
: Desenha um pixelcanvas_setP1
: Seta a primeira posiçãocanvas_setP2
: Seta a segunda posiçãocanvas_setX
: Seta o eixo Xcanvas_setY
: Seta o eixo Y
- Console: