Commit Diff


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;
+}