A small, broken, ISA
I am pretty sure that this isn't turing complete.
It also has no way to access memory!
It has an emulator and very basic assembler, written in {python}.
One instruction is composed of 32 bits, making up 3 catagories; Opcode, Register and data. The opcode is two hexadecimal digits, the register is another two, and the data is a 4-digit hexadecimal number split into two two-digit numbers. Here is an example instruction loading ``0xf988
` into
`r5
``:
Opcode | Register | Data 1 | Data 2 |
0x20 | 0x05 | 0xf9 | 0x88 |
The full list of opcodes, as well as an example, the instruction & explaination are as follows:
Opcode | Instruction | |
0x10 | store | store reg reg2 |
Copy value from one reg to another | ||
0x20 | load | load reg val |
Load a value into a reg | ||
0x30 | add | add reg val |
Add value to reg | ||
0x31 | addr | addr reg reg2 |
Adds reg2 to reg | ||
0x40 | sub | sub reg val |
Subtracts val from reg | ||
0x41 | subr | subr reg reg2 |
Subtracts reg2 from reg | ||
0x50 | mul | mul reg val |
Multipy register by value | ||
0x51 | mulr | mul reg reg2 |
Multiply reg by reg 2 | ||
0x60 | div | div reg val |
Intiger divides the register by the value | ||
0x61 | divr | div reg reg2 |
Initger devides reg by rg2 | ||
0xff | prt | prt 0x0000 0x0000 |
Print ascii value in p0 reg | ||
0x0f | scrn | scrn 0x0000 val |
Set pixel in x8 and y9 regs to the value (0: black) (1: white) | ||
0xdd | drw | drw 0x0000 0x0000 |
Draw screen buffer | ||
0xf0 | cmp | cmp reg reg2 |
Set cm reg to 0x0001 if bigger, 0x0000 if smaller, and 0xffff if they're equal | ||
0xb0 | branch | branch val label |
Branch to loop if cm is val | ||
0xb1 | nbranch | nbranch val label |
Branch to loop if cm is not val | ||
0xbb | jump | jump 0x0000 label |
Jump to label | ||
0x00 | noop | noop 0x000 0x000 |
Literally does nothing | ||
0xfe | halt | halt 0x0000 0x0000 |
Halts the cpu |
I plan on making a much better version of this soon.