undar-lang/SPECIFICATION.org

1.5 KiB

#+TITLE Project Specification

Binary interface

The VM does not use floating point numbers, it instead uses fixed point numbers.

This is for portability reasons as some devices might not have a FPU in them

especially microcontrollers and some retro game systems like the PS1.

Numbers

type size (bytes) description
u8 1 unsigned 8bit, alias char and byte
bool 1 unsigned 8bit, false or true
i8 1 signed 8bit for interop
u16 2 unsigned 16bit for interop
i16 2 signed 16bit for interop
u32 4 unsigned 32bit, alias nat
i32 4 signed 32bit, alias int
f32 4 signed 32bit fixed number, alias real

Memory

Uses a harvard style archecture, meaning the code and ram memory are split up into two seperate blocks.

In the C version you can see these are two seperate arrays 'code' and 'mem'.

During compilation constants and local variables are put onto 'mem'

Opcodes

Most opcodes are 4 bytes

[opcode][dest][src1][src2]

A small number are multibyte like load-long-immidiate

[multibyte-opcode][0u8][0u8][opcode] . [u32]

These are decoded during runtime and selected.

In theory, bitshift decoding is faster than accessing an unknown n bytes of memory in the 'code' array.