commit 8cd27d016af5c15375e30fd490a71a5cd6a803e9 from: Onana Onana Xavier Manuel date: Wed Sep 23 04:22:42 2026 UTC Added some lua tools for x86_64 commit - 2144824138456be824e120b8c4daf1a86461a02e commit + 8cd27d016af5c15375e30fd490a71a5cd6a803e9 blob - /dev/null blob + 2e181e40bb6bac090d4115b2baae058e2d7445dc (mode 755) --- /dev/null +++ tools/6c @@ -0,0 +1,291 @@ +#!/usr/local/bin/lua51 + +--[[ +This is the structure a token must follow. The token can be +followed by a series of raw bytes if Length > 0. + +Token { + u32 Column; + u32 Line; + u16 Type; + u16 Length; +} + +Types are eight Opcodes, or C keywords + +]]-- + +progname="6c" + +-- Program error +local function perror(msg) + print(progname .. ": error: " .. msg) + os.exit(1) +end + +if arg[1] == nil then + print("usage: " .. progname .. " input [output]") + os.exit(1) +end + +if arg[2] == nil then + arg[2] = string.gsub(arg[1], "%.%w+$", ".6") +end + +src = io.open(arg[1], "r") +dst = io.open(arg[2], "wb") + +if src == nil then + perror("failed to open src"); +end + +if dst == nil then + perror("failed to open dst"); + src:close() +end + +local function brshift(value, bit) + return math.floor(value / (2 ^ bit)) +end + +local function blshift(value, bit) + return value * (2 ^ bit) +end + +local function band(a, b) + local result = 0 + local bitval = 1 + + while a > 0 and b > 0 do + if (a % 2 == 1) and (b % 2 == 1) then + result = result + bitval + end + a = math.floor(a / 2) + b = math.floor(b / 2) + bitval = bitval * 2 + end + + return result +end + +local function write_u32(value) + local b4 = band(brshift(value, 24), 0xff) + local b3 = band(brshift(value, 16), 0xff) + local b2 = band(brshift(value, 8), 0xff) + local b1 = band(value, 0xff) + + dst:write(string.char(b4, b3, b2, b1)) -- Little Endian x86 +end + +local function write_u16(value) + local b2 = band(brshift(value, 8), 0xff) + local b1 = band(value, 0xff) + + dst:write(string.char(b2, b1)) -- Little Endian x86 +end + +local function write_u8(value) + local b = band(value, 0xff) + dst:write(string.char(b)) +end + +local TOKEN_ASM = 0 +local TOKEN_LEFT_CURLY_BRACKET = 1 +local TOKEN_RIGHT_CURLY_BRACKET = 2 +local TOKEN_MULTIPLY = 3 +local TOKEN_DIVIDE = 4 +local TOKEN_SUBTRACT = 5 +local TOKEN_ADD = 6 +local TOKEN_LEFT_SQUARE_BRACKET = 7 +local TOKEN_RIGHT_SQUARE_BRACKET = 8 +local TOKEN_LEFT_PARANTHESIS = 9 +local TOKEN_RIGHT_PARANTHESIS = 10 +local TOKEN_QUESTION = 11 +local TOKEN_EXCLAMATION = 12 +local TOKEN_TILDA = 13 +local TOKEN_PERIOD = 14 +local TOKEN_COLUMN = 15 +local TOKEN_INTEGER = 16 +local TOKEN_ID = 17 +local TOKEN_STRING = 18 +local TOKEN_SEMICOLON = 19 +local TOKEN_HASH = 20 + +local function issymbol(char) + if char == "{" or + char == "}" or + char == "*" or + char == "/" or + char == "-" or + char == "+" or + char == "[" or + char == "]" or + char == "(" or + char == ")" or + char == "?" or + char == "!" or + char == "~" or + char == "." or + char == ":" or + char == ";" or + char == "#" then + return true + end + return false +end + +local function isnumber(char) + if char == "0" or + char == "1" or + char == "2" or + char == "3" or + char == "4" or + char == "5" or + char == "6" or + char == "7" or + char == "8" or + char == "9" then + return true + end + return false +end + +local function readid(line, s) + local len = #line + local buf = { } + + for i = s, len do + local char = line:sub(i, i) + if char == " " then + break + end + + if issymbol(char) == true then + break + end + + table.insert(buf, char) + end + + return table.concat(buf) +end + +local function readint(line, s) + local len = #line + local buf = { } + + for i = s, len do + local char = line:sub(i, i) + if isnumber(char) == false then + break + end + + table.insert(buf, char) + end + + return table.concat(buf) +end + +local nline = 0; + +while true do + line = src:read("*l"); + if (line == nil) then + break; + end + + local i = 1 + local len = #line + local column = 0 + + while i <= len do + local char = line:sub(i, i) + local buf = { } + + if issymbol(char) == true then + write_u32(nline) + write_u32(column) + if char == "{" then + write_u16(TOKEN_LEFT_CURLY_BRACKET) + elseif char == "}" then + write_u16(TOKEN_RIGHT_CURLY_BRACKET) + elseif char == "*" then + write_u16(TOKEN_MULTIPLY) + elseif char == "/" then + write_u16(TOKEN_DIVIDE) + elseif char == "." then + write_u16(TOKEN_PERIOD) + elseif char == ":" then + write_u16(TOKEN_COLUMN) + elseif char == "[" then + write_u16(TOKEN_LEFT_SQUARE_BRACKET) + elseif char == "]" then + write_u16(TOKEN_RIGHT_SQUARE_BRACKET) + elseif char == "(" then + write_u16(TOKEN_LEFT_PARANTHESIS) + elseif char == ")" then + write_u16(TOKEN_RIGHT_PARANTHESIS) + elseif char == ";" then + write_u16(TOKEN_SEMICOLON) + elseif char == "#" then + write_u16(TOKEN_HASH) + else + print("Unknown symbol : " .. char) + end + + write_u16(0) + i = i + 1 + + elseif char == " " or char == "\t" then + i = i + 1 + + elseif char == "\n" then + i = i + 1 + + elseif isnumber(char) then + local sint = readint(line, i) + local j = 1 + write_u32(nline) + write_u32(column) + write_u16(#sint) + i = i + #sint + + while j <= #sint do + local c = sint:sub(j, j) + write_u8(string.byte(c)) + j = j + 1 + end + + elseif (char:match(".")) then + local id = readid(line, i) + + write_u32(nline) + write_u32(column) + if id == "asm" then + write_u16(TOKEN_ASM) + write_u16(0) + else + local j = 1 + write_u16(TOKEN_ID) + write_u16(#id) + + -- Raw bytes + while j <= #id do + local c = id:sub(j, j) + write_u8(string.byte(c)) + j = j + 1 + end + end + i = i + #id + else + i = i + 1 + end + + column = i + end + + nline = nline + 1 +end + +src:close() +dst:close() blob - /dev/null blob + 11e1d810af892577140dd17861cc1755c5503e5a (mode 755) --- /dev/null +++ tools/6l @@ -0,0 +1,8 @@ +#!/usr/local/bin/lua51 + +progname = "6l" + +if (arg[1] == nil) then + print("usage: " .. progname .. " file") + os.exit(1) +end blob - /dev/null blob + 41132f6b89059a67428a66b152a26ab7cf840a38 (mode 644) --- /dev/null +++ tools/boot.c @@ -0,0 +1,11 @@ +import libc; + +asm { +_start: + hlt +} + +void main() +{ + u64 var = 22; +}