Machine code inerpreter
| .vscode | ||
| dependencies | ||
| examples | ||
| src | ||
| .gitignore | ||
| .gitmodules | ||
| project.config | ||
| README.md | ||
| TODO.md | ||
TCPU
Machine code interpreter written in pure C. Can execute programs up to 1 MEGABYTE (1048576 bytes) in size!!!
Building
- Clone repo
git clone --recurse-submodules --depth 1 https://timerix.ddns.net/git/Timerix/tcpu.git - Install cbuild
- Install SDL3 and SDL3_image from package manager or source.
-
cbuild build_exec_dbg
Assembly language
Registers
| name | code | size (bits) |
|---|---|---|
| rax | 0x01 | 64 |
| eax | 0x02 | 32 |
| ax | 0x04 | 16 |
| al | 0x07 | 8 |
| ah | 0x08 | 8 |
| rbx | 0x11 | 64 |
| ebx | 0x12 | 32 |
| bx | 0x14 | 16 |
| bl | 0x17 | 8 |
| bh | 0x18 | 8 |
| rcx | 0x21 | 64 |
| ecx | 0x22 | 32 |
| cx | 0x24 | 16 |
| cl | 0x27 | 8 |
| ch | 0x28 | 8 |
| rdx | 0x31 | 64 |
| edx | 0x32 | 32 |
| dx | 0x34 | 16 |
| dl | 0x37 | 8 |
| dh | 0x38 | 8 |
Instructions
| name | arguments | details |
|---|---|---|
| NOP | ignored instruction | |
| EXIT | stop the program with exit code in eax |
|
| SYS | call system function | |
| MOVC | dst_register, const_value |
push constant value into dst_register |
| MOVR | dst_register, src_register |
copy value from src_register to dst_register |
| ADD | dst_register, src_register |
dst += src |
| SUB | dst_register, src_register |
dst -= src |
| MUL | dst_register, src_register |
dst *= src |
| DIV | dst_register, src_register |
dst /= src |
| MOD | dst_register, src_register |
dst %= src |
| EQ | dst_register, src_register |
cmp_flag = dst == src |
| NE | dst_register, src_register |
cmp_flag = dst != src |
| LT | dst_register, src_register |
cmp_flag = dst < src |
| LE | dst_register, src_register |
cmp_flag = dst <= src |
| GT | dst_register, src_register |
cmp_flag = dst > src |
| GE | dst_register, src_register |
cmp_flag = dst >= src |
| NOT | dst_register |
dst = !dst |
| INV | dst_register |
dst = ~dst |
| OR | dst_register, src_register |
dst = dst | src |
| XOR | dst_register, src_register |
dst = dst ^ src |
| AND | dst_register, src_register |
dst = dst & src |
| JMP | dst_address_const |
goto dst |
| JNZ | dst_address_const |
if (cmp_flag != 0) goto dst |
| JZ | dst_address_const |
if (cmp_flag == 0) goto dst |
System functions
To call a system function you need to push values to registers and write SYS opcode. The return value of a function will will be avaliable in ax after call.
| name | al |
ah |
rbx |
ecx |
details |
|---|---|---|---|---|---|
| read | 0 | file number | buffer pointer | buffer size | read data from file |
| write | 1 | file number | buffer pointer | buffer size | write data to file |