mirror of
https://github.com/notwa/lips
synced 2024-11-14 15:09:02 -08:00
implement addressing modes for fpu load/stores
This commit is contained in:
parent
b80fb49a22
commit
272ef0fbde
3 changed files with 20 additions and 2 deletions
9
TODO
9
TODO
|
@ -1,8 +1,16 @@
|
|||
unify/optimize ascii/asciiz/byte/halfword/word into BIN directives
|
||||
also lex strings to binary strings, why not
|
||||
|
||||
more useful string escapes e.g. \x
|
||||
|
||||
lex expressions in Lexer instead of its own separate lexer
|
||||
|
||||
;pseudo-instr for offsets not within 0x8000 range?
|
||||
addiu at, t0, 0x7FFF
|
||||
sb t1, 0x62FE(at)
|
||||
;versus
|
||||
sb t1, r0+0xE2FD(t0)
|
||||
|
||||
directive aliases, are these right?
|
||||
DB = 'BYTE',
|
||||
DH = 'HALFWORD',
|
||||
|
@ -15,6 +23,7 @@ implement push/pop/jpop as macros
|
|||
be able to point to specific args of push/pop using variables
|
||||
add file-reading directives (e.g. for automatic hook injection macros)
|
||||
allow generation of shared object files (zelda overlays specifically)
|
||||
http://wiki.cloudmodding.com/oot/Overlays#Relocation_Entry_Format
|
||||
|
||||
don't require colons for +/- labels (this shouldn't break anything right?)
|
||||
|
||||
|
|
|
@ -31,6 +31,8 @@ function Expander:pop(kind)
|
|||
ret = self.s[self.i]
|
||||
elseif kind == 'CPU' then
|
||||
ret = self:register(data.registers)
|
||||
elseif kind == 'FPU' then
|
||||
ret = self:register(data.fpu_registers)
|
||||
elseif kind == 'DEREF' then
|
||||
ret = self:deref()
|
||||
elseif kind == 'CONST' then
|
||||
|
|
|
@ -4,6 +4,13 @@ local unpack = rawget(_G, 'unpack') or table.unpack
|
|||
local path = string.gsub(..., "[^.]+$", "")
|
||||
local data = require(path.."data")
|
||||
|
||||
local fpu_tob = {
|
||||
LDC1=true,
|
||||
LWC1=true,
|
||||
SDC1=true,
|
||||
SWC1=true,
|
||||
}
|
||||
|
||||
local function name_pop(name, character)
|
||||
if name:sub(#name) == character then
|
||||
return name:sub(1, #name - 1), character
|
||||
|
@ -51,7 +58,7 @@ local overrides = {}
|
|||
|
||||
local function tob_override(self, name)
|
||||
-- handle all the addressing modes for lw/sw-like instructions
|
||||
local dest = self:pop('CPU')
|
||||
local dest = fpu_tob[name] and self:pop('FPU') or self:pop('CPU')
|
||||
local offset, base
|
||||
if self:peek('DEREF') then
|
||||
offset = 0
|
||||
|
@ -94,7 +101,7 @@ local function tob_override(self, name)
|
|||
end
|
||||
|
||||
for k, v in pairs(data.instructions) do
|
||||
if v[2] == 'tob' then
|
||||
if v[2] == 'tob' or v[2] == 'Tob' then
|
||||
overrides[k] = tob_override
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue