commit - 26477129cfe7ccef1bfb485f8ee107b557c9f9fa
commit + d606d8179b1a8bf8fef0cadea6422d32dcba6e74
blob - 382df3706cb70a0adeab9a245c2fadc3bfe38831
blob + b6a9421f8eeb2eb8f2dfe3c277f80eb68fd460fa
--- tools/6c
+++ tools/6c
-----------------------------------------------------------------------
-- TOKEN MATCHING
-----------------------------------------------------------------------
-local mnemonics = { "mov", "cli", "hlt", "ret", "sti", "int", "call" }
+local mnemonics = { "mov", "cli", "hlt", "ret", "sti", "int", "call",
+ "jmp" }
-- This is kinda a double definition but fix later :^)
local arithmetics = { "+", "-", "*", "/", "^", "~", "|", "&" }
-----------------------------------------------------------------------
-- CONSTANTS
-----------------------------------------------------------------------
-local MAX_S16 = 2^16-1
-local MIN_S16 = -2^16
+local MAX_S16 = 2^15-1
+local MIN_S16 = -2^15
+local MAX_U16 = 2^16
-----------------------------------------------------------------------
-- DEBUGING
dst:write(string.char(b1, b2)) -- Little Endian x86
end
+local function writes16(dst, value)
+ if value < 0 then
+ value = MAX_U16 + value
+ end
+
+ writeu16(dst, value)
+end
+
local function writeu32(dst, value)
local b4 = band(brshift(value, 24), 0xff)
local b3 = band(brshift(value, 16), 0xff)
blob - 04a04989c870c5a0d8575f4f57bcc28f19e0bf48
blob + c9d1a7e6c036459bc69a9f9e4f5e04ff0279acdc
--- tools/6l
+++ tools/6l
-----------------------------------------------------------------------
-- TOKEN MATCHING
-----------------------------------------------------------------------
-local mnemonics = { "mov", "cli", "hlt", "ret", "sti", "int", "call" }
+local mnemonics = { "mov", "cli", "hlt", "ret", "sti", "int", "call",
+ "jmp" }
-- This is kinda a double definition but fix later :^)
local arithmetics = { "+", "-", "*", "/", "^", "~", "|", "&" }
-----------------------------------------------------------------------
-- CONSTANTS
-----------------------------------------------------------------------
-local MAX_S16 = 2^16-1
-local MIN_S16 = -2^16
+local MAX_S16 = 2^15-1
+local MIN_S16 = -2^15
+local MAX_U16 = 2^16
-----------------------------------------------------------------------
-- DEBUGING
dst:write(string.char(b1, b2)) -- Little Endian x86
end
+local function writes16(dst, value)
+ if value < 0 then
+ value = MAX_U16 + value
+ end
+
+ writeu16(dst, value)
+end
+
local function writeu32(dst, value)
local b4 = band(brshift(value, 24), 0xff)
local b3 = band(brshift(value, 16), 0xff)
if val < 256 then
table.insert(ret.details, ASM_IMM8)
- table.insert(ret.operands, op)
else
perror("operand 1 of instruction on line " .. op.line .. " is too big!")
end
if inst.details[1] == ASM_LABEL then
local addr = symbol_table[inst.operands[1].raw]
writeu8(dst, hexval("0hE8"))
- writeu16(dst, addr - curr)
+
+ writes16(dst, addr - curr)
end
end
local function get_instruction_size(hdr, inst)
if hdr.type == tk_type["mov"] then
- local size = 2
- local eval = instvaluate(inst)
- if eval.modrm ~= nil then size = size + 1 end
-
- -- Check expression for memory constants
- if inst.memblock and inst.memblock.expression then
- for _, v in ipairs(inst.memblock.expression) do
- local num = tonumber(v)
- if num ~= nil then
- if num <= MAX_S16 and num >= MIN_S16 then
- size = size + 2
- else
- size = size + 4
- end
- end
- end
- end
- return size + 1 -- Plus your trailing byte modifier
+ local opcount = #inst.details
+ if opcount ~= 2 then perror("mov requires 2 operands") end
+
+ if (inst.details[1] == ASM_R8 or inst.details[1] == ASM_IMM8) and (inst.details[2] == ASM_R8 or inst.details[2] == ASM_IMM8) then
+ return 3
+ elseif inst.details[1] == ASM_MEM8 and inst.details[2] == ASM_R8 then
+ local size = 2
+ if inst.memblock and inst.memblock.expression then
+ for _, v in ipairs(inst.memblock.expression) do
+ local num = tonumber(v)
+ if num ~= nil then
+ if num <= MAX_S16 and num >= MIN_S16 then
+ size = size + 2
+ else
+ size = size + 4
+ end
+ end
+ end
+ end
+
+ return size
+ end
+
elseif hdr.type == tk_type["hlt"] or hdr.type == tk_type["ret"] or hdr.type == tk_type["cli"] then
return 1
elseif hdr.type == tk_type["int"] then
end
end
+print(offset)
+
-----------------------------------------------------------------------
-- 2nd pass binary generation
-----------------------------------------------------------------------
blob - b5e6dcbb21ab9e6ad6c2c3d81931e9250b2dd73d
blob + 61f5a27365fe483db3abdbe669340a81ceff5a26
--- tools/boot.sc
+++ tools/boot.sc
mov ah, 0h0e
mov al, 0h61
int 0h10
+ call me
ret
}
blob - 0fdab57d6e3d4e1ff757a04a8e37754252a4ff66
blob + 2d754aaa964d81a62e0d9e71a668132a4d7c59fe
--- tools/linker.lua
+++ tools/linker.lua
if val < 256 then
table.insert(ret.details, ASM_IMM8)
- table.insert(ret.operands, op)
else
perror("operand 1 of instruction on line " .. op.line .. " is too big!")
end
if inst.details[1] == ASM_LABEL then
local addr = symbol_table[inst.operands[1].raw]
writeu8(dst, hexval("0hE8"))
- writeu16(dst, addr - curr)
+
+ writes16(dst, addr - curr)
end
end
local function get_instruction_size(hdr, inst)
if hdr.type == tk_type["mov"] then
- local size = 2
- local eval = instvaluate(inst)
- if eval.modrm ~= nil then size = size + 1 end
-
- -- Check expression for memory constants
- if inst.memblock and inst.memblock.expression then
- for _, v in ipairs(inst.memblock.expression) do
- local num = tonumber(v)
- if num ~= nil then
- if num <= MAX_S16 and num >= MIN_S16 then
- size = size + 2
- else
- size = size + 4
- end
- end
- end
- end
- return size + 1 -- Plus your trailing byte modifier
+ local opcount = #inst.details
+ if opcount ~= 2 then perror("mov requires 2 operands") end
+
+ if (inst.details[1] == ASM_R8 or inst.details[1] == ASM_IMM8) and (inst.details[2] == ASM_R8 or inst.details[2] == ASM_IMM8) then
+ return 3
+ elseif inst.details[1] == ASM_MEM8 and inst.details[2] == ASM_R8 then
+ local size = 2
+ if inst.memblock and inst.memblock.expression then
+ for _, v in ipairs(inst.memblock.expression) do
+ local num = tonumber(v)
+ if num ~= nil then
+ if num <= MAX_S16 and num >= MIN_S16 then
+ size = size + 2
+ else
+ size = size + 4
+ end
+ end
+ end
+ end
+
+ return size
+ end
+
elseif hdr.type == tk_type["hlt"] or hdr.type == tk_type["ret"] or hdr.type == tk_type["cli"] then
return 1
elseif hdr.type == tk_type["int"] then
end
end
+print(offset)
+
-----------------------------------------------------------------------
-- 2nd pass binary generation
-----------------------------------------------------------------------
blob - 8c0a97bff15a71cc55d2ef7d551a6fd5d1aa633a
blob + 73f2e4afc8a778a98f22a8aa3b4715360afdcf66
--- tools/util.lua
+++ tools/util.lua
-----------------------------------------------------------------------
-- TOKEN MATCHING
-----------------------------------------------------------------------
-local mnemonics = { "mov", "cli", "hlt", "ret", "sti", "int", "call" }
+local mnemonics = { "mov", "cli", "hlt", "ret", "sti", "int", "call",
+ "jmp" }
-- This is kinda a double definition but fix later :^)
local arithmetics = { "+", "-", "*", "/", "^", "~", "|", "&" }
-----------------------------------------------------------------------
-- CONSTANTS
-----------------------------------------------------------------------
-local MAX_S16 = 2^16-1
-local MIN_S16 = -2^16
+local MAX_S16 = 2^15-1
+local MIN_S16 = -2^15
+local MAX_U16 = 2^16
-----------------------------------------------------------------------
-- DEBUGING
dst:write(string.char(b1, b2)) -- Little Endian x86
end
+local function writes16(dst, value)
+ if value < 0 then
+ value = MAX_U16 + value
+ end
+
+ writeu16(dst, value)
+end
+
local function writeu32(dst, value)
local b4 = band(brshift(value, 24), 0xff)
local b3 = band(brshift(value, 16), 0xff)