1
0
Fork 0
mirror of https://github.com/notwa/mm synced 2024-05-18 05:23:22 -07:00

update lips

This commit is contained in:
Connor Olding 2015-12-25 01:13:10 -08:00
parent ea40b7fde7
commit 1f88d9423a

View File

@ -385,9 +385,8 @@ local instructions = {
-- pseudo-instructions
B = {4, 'r', '00o'}, -- BEQ R0, R0, offset
BAL = {1, 'r', '0Co', 17}, -- BGEZAL R0, offset
CL = {0, 'd', '00d0C', 32}, -- ADD RD, R0, R0
MOV = {0, 'ds', 's0d0C', 32}, -- ADD RD, RT, R0
MOVU = {0, 'ds', 's0d0C', 37}, -- OR RD, RS, R0
CL = {0, 'd', '00d0C', 37}, -- OR RD, R0, R0
MOV = {0, 'ds', 's0d0C', 37}, -- OR RD, RS, R0
NEG = {0, 'dt', '0td0C', 34}, -- SUB RD, R0, RT
NOP = {0, '', '0'}, -- SLL R0, R0, 0
NOT = {0, 'ds', 's0d0C', 39}, -- NOR RD, RS, R0
@ -558,7 +557,7 @@ end
function Lexer:read_octal()
local buff = self:read_chars('[0-7]')
local num = tonumber(buff)
local num = tonumber(buff, 8)
if not num then self:error('invalid octal number') end
return num
end
@ -1028,6 +1027,8 @@ function Parser:instruction()
self:optional_comma()
local im = self:const()
-- for us, this is just semantics. for a "real" assembler,
-- LA could add appropriate RELO LUI/ADDIU directives.
if im[1] == 'LABELSYM' then
self:error('use LA for labels')
end
@ -1058,13 +1059,6 @@ function Parser:instruction()
self:optional_comma()
local im = self:const()
-- for us, this is just semantics. for a "real" assembler,
-- LA could add appropriate RELO LUI/ADDIU directives.
-- for that reason, we should always use LA for addresses.
--if im[1] ~= 'LABELSYM' then
-- self:error('use LI for immediates')
--end
args.rs = args.rt
args.immediate = {'UPPEROFF', im}
self:format_out(lui[3], lui[1], args, lui[4], lui[5])
@ -1600,12 +1594,35 @@ function Dumper:dump()
end
end
function assembler.word_writer()
local buff = {}
local max = -1
return function(pos, b)
if pos then
buff[pos] = b
if pos > max then
max = pos
end
else
if max == -1 then return end
for i=0, max, 4 do
local a = buff[i+0] or '00'
local b = buff[i+1] or '00'
local c = buff[i+2] or '00'
local d = buff[i+3] or '00'
print(a..b..c..d)
end
end
end
end
function assembler.assemble(fn_or_asm, writer, options)
-- assemble MIPS R4300i assembly code.
-- if fn_or_asm contains a newline; treat as assembly, otherwise load file.
-- returns error message on error, or nil on success.
fn_or_asm = tostring(fn_or_asm)
writer = writer or io.write
local default_writer = not writer
writer = writer or assembler.word_writer()
options = options or {}
function main()
@ -1620,7 +1637,11 @@ function assembler.assemble(fn_or_asm, writer, options)
end
local parser = Parser(writer, fn, options)
return parser:parse(asm)
parser:parse(asm)
if default_writer then
writer()
end
end
if options.unsafe then