commit - 2144824138456be824e120b8c4daf1a86461a02e
commit + 8cd27d016af5c15375e30fd490a71a5cd6a803e9
blob - /dev/null
blob + 2e181e40bb6bac090d4115b2baae058e2d7445dc (mode 755)
--- /dev/null
+++ tools/6c
+#!/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
+#!/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
+import libc;
+
+asm {
+_start:
+ hlt
+}
+
+void main()
+{
+ u64 var = 22;
+}