mirror of
https://github.com/notwa/mm
synced 2024-11-05 01:19:02 -08:00
set up as a proper module
This commit is contained in:
parent
cd8ea7b3d7
commit
3b92aad4a0
2 changed files with 71 additions and 29 deletions
22
Lua/inject/LICENSE
Normal file
22
Lua/inject/LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
|||
Copyright (C) 2015 Connor Olding
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -4,7 +4,20 @@
|
|||
-- CajeASM style assembly; refer to the manual included with CajeASM.
|
||||
-- lexer and parser are somewhat based on http://chunkbake.luaforge.net/
|
||||
|
||||
local Class = Class or function(inherit)
|
||||
local assembler = {
|
||||
_VERSION = 'assembler v1',
|
||||
_DESCRIPTION = 'Assembles MIPS assembly files for the R4300i CPU.',
|
||||
_URL = 'https://github.com/notwa/mm/blob/master/Lua/inject/assembler.lua',
|
||||
_LICENSE = [[
|
||||
Copyright (C) 2015 Connor Olding
|
||||
|
||||
This program is licensed under the terms of the MIT License, and
|
||||
is distributed without any warranty. You should have received a
|
||||
copy of the license along with this program; see the file LICENSE.
|
||||
]],
|
||||
}
|
||||
|
||||
local Class = function(inherit)
|
||||
local class = {}
|
||||
local mt_obj = {__index = class}
|
||||
local mt_class = {
|
||||
|
@ -173,21 +186,6 @@ local all_directives = {
|
|||
'ORG',
|
||||
}
|
||||
|
||||
local all_tokens = {
|
||||
'DEF',
|
||||
'DEFSYM',
|
||||
'DEREF',
|
||||
'DIR',
|
||||
'EOF',
|
||||
'EOL',
|
||||
'INSTR',
|
||||
'LABEL',
|
||||
'LABELSYM',
|
||||
'NUM',
|
||||
'REG',
|
||||
'SEP',
|
||||
}
|
||||
|
||||
local all_registers = {}
|
||||
for k, v in pairs(registers) do
|
||||
all_registers[k] = v
|
||||
|
@ -207,7 +205,6 @@ revtable(registers)
|
|||
revtable(fpu_registers)
|
||||
revtable(all_registers)
|
||||
revtable(all_instructions)
|
||||
revtable(all_tokens)
|
||||
|
||||
local argtypes = {
|
||||
bto = 'base rt offset',
|
||||
|
@ -1031,7 +1028,7 @@ function Dumper:validate(n, bits)
|
|||
self:error('value is nil')
|
||||
end
|
||||
if n > max or n < 0 then
|
||||
--print(("n %08X"):format(math.abs(n)))
|
||||
--print(('n %08X'):format(math.abs(n)))
|
||||
self:error('value out of range')
|
||||
end
|
||||
end
|
||||
|
@ -1107,24 +1104,47 @@ function Dumper:dump()
|
|||
end
|
||||
end
|
||||
|
||||
function assemble(fn, writer)
|
||||
local function assemble(fn_or_asm, writer)
|
||||
-- assemble a MIPS R4300i assembly file
|
||||
-- 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 asm = ''
|
||||
local f = io.open(fn, 'r')
|
||||
if not f then
|
||||
error('could not read assembly file', 1)
|
||||
end
|
||||
asm = f:read('*a')
|
||||
f:close()
|
||||
|
||||
function main()
|
||||
local p = Parser(writer)
|
||||
return p:parse(asm)
|
||||
local asm = ''
|
||||
if fn_or_asm:find('[\r\n]') then
|
||||
asm = fn_or_asm
|
||||
else
|
||||
local f = io.open(fn_or_asm, 'r')
|
||||
if not f then
|
||||
error('could not read assembly file', 1)
|
||||
end
|
||||
asm = f:read('*a')
|
||||
f:close()
|
||||
end
|
||||
|
||||
local parser = Parser(writer)
|
||||
return parser:parse(asm)
|
||||
end
|
||||
|
||||
local ok, err = pcall(main)
|
||||
return err
|
||||
end
|
||||
|
||||
return setmetatable(assembler, {
|
||||
__call = function(_, ...)
|
||||
return assemble(...)
|
||||
end,
|
||||
|
||||
Lexer = Lexer,
|
||||
Parser = Parser,
|
||||
Dumper = Dumper,
|
||||
|
||||
registers = registers,
|
||||
fpu_registers = fpu_registers,
|
||||
all_registers = all_registers,
|
||||
all_instructions = all_instructions,
|
||||
all_directives = all_directives,
|
||||
argtypes = argtypes,
|
||||
})
|
||||
|
|
Loading…
Reference in a new issue