TCPU/README.md
2025-04-18 02:46:46 +05:00

3.0 KiB

TCPU

Machine code interpreter written in pure C. Can execute programs up to 1 MEGABYTE (1048576 bytes) in size!!!

Building

  1. Install cbuild
  2. Install SDL3 and SDL3_image from package manager or source.
  3. 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