78 lines
3.0 KiB
Markdown
78 lines
3.0 KiB
Markdown
# TCPU
|
|
Machine code interpreter written in pure C. Can execute programs up to 1 MEGABYTE (1048576 bytes) in size!!!
|
|
|
|
## Building
|
|
1. Install [cbuild](https://timerix.ddns.net:3322/Timerix/cbuild.git)
|
|
2. Install [SDL3](https://github.com/libsdl-org/SDL) and [SDL3_image](https://github.com/libsdl-org/SDL_image) from package manager or source.
|
|
3. ```sh
|
|
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`, `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_register` | goto `dst` |
|
|
| JNZ | `dst_register` | if (`cmp_flag` != 0) goto `dst` |
|
|
| JZ | `dst_register` | 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 |
|