Congrats on starting your own language!
You've got a few inconsistencies:
Code:
0xb8000 = "ERR: ";
Code:
if (eax != 0x36d76289)
In the first line, you're assigning to the memory in '0xb8000'. In the second line, you're treating 0x36d76289 as a number literal.
Code:
stdout = MESSAGE;
Are you assigning a variable? If this is a function call, how do you assign a variable?
Code:
func error(val: b8) -> hlt
Code:
const OPTIONAL:b16 = 0;
I like putting the the type after the declaration. It actually makes implementing the parser a little easier.
Code:
if (eax != 0x36d76289)
How do you now 'eax' doesn't get clobbered during the function call to check_multiboot?
Are you trying to invent a high level language (e.g. C?) or trying to invent a
high level assembler?
You might be able to start by writing a assembly processor, where you replace mov with =, e.g.:
Code:
[eax] = ebx
and replace local stack locations with typed variables?