mirror of
https://git.planet-casio.com/Lephenixnoir/fxsdk.git
synced 2024-12-28 20:43:37 +01:00
fxconv: allow adding symbols and ObjectData to ObjectData
This commit is contained in:
parent
fcc6f33f9b
commit
a17eaabbd8
1 changed files with 22 additions and 1 deletions
|
@ -14,7 +14,7 @@ __all__ = [
|
||||||
# Color names
|
# Color names
|
||||||
"FX_BLACK", "FX_DARK", "FX_LIGHT", "FX_WHITE", "FX_ALPHA",
|
"FX_BLACK", "FX_DARK", "FX_LIGHT", "FX_WHITE", "FX_ALPHA",
|
||||||
# Conversion mechanisms
|
# Conversion mechanisms
|
||||||
"ObjectData", "u8", "u16", "u32", "ref",
|
"ObjectData", "u8", "u16", "u32", "ref", "sym",
|
||||||
# Functions
|
# Functions
|
||||||
"quantize", "convert", "elf",
|
"quantize", "convert", "elf",
|
||||||
# Reusable classes
|
# Reusable classes
|
||||||
|
@ -153,6 +153,7 @@ def u16(x):
|
||||||
return bytes([ (x >> 8) & 255, x & 255 ])
|
return bytes([ (x >> 8) & 255, x & 255 ])
|
||||||
def u32(x):
|
def u32(x):
|
||||||
return bytes([ (x >> 24) & 255, (x >> 16) & 255, (x >> 8) & 255, x & 255 ])
|
return bytes([ (x >> 24) & 255, (x >> 16) & 255, (x >> 8) & 255, x & 255 ])
|
||||||
|
|
||||||
def ref(base, offset=None, padding=None):
|
def ref(base, offset=None, padding=None):
|
||||||
if isinstance(base, bytearray):
|
if isinstance(base, bytearray):
|
||||||
base = bytes(base)
|
base = bytes(base)
|
||||||
|
@ -168,7 +169,11 @@ def ref(base, offset=None, padding=None):
|
||||||
|
|
||||||
raise FxconvError(f"invalid type {type(base)} for ref()")
|
raise FxconvError(f"invalid type {type(base)} for ref()")
|
||||||
|
|
||||||
|
def sym(name):
|
||||||
|
return Sym("_" + name)
|
||||||
|
|
||||||
Ref = collections.namedtuple("Ref", ["data", "name", "offset"])
|
Ref = collections.namedtuple("Ref", ["data", "name", "offset"])
|
||||||
|
Sym = collections.namedtuple("Sym", ["name"])
|
||||||
|
|
||||||
class ObjectData:
|
class ObjectData:
|
||||||
"""
|
"""
|
||||||
|
@ -191,6 +196,19 @@ class ObjectData:
|
||||||
elif isinstance(other, Ref) and other.data:
|
elif isinstance(other, Ref) and other.data:
|
||||||
self.elements.append(("", len(self.static_data)))
|
self.elements.append(("", len(self.static_data)))
|
||||||
self.static_data += other.data
|
self.static_data += other.data
|
||||||
|
elif isinstance(other, ObjectData):
|
||||||
|
# Shift all offsets into other.static_data by len(self.static_data)
|
||||||
|
el = other.elements
|
||||||
|
for i in range(len(el)):
|
||||||
|
if not isinstance(el[i], bytes):
|
||||||
|
name, offset = el
|
||||||
|
if not name:
|
||||||
|
el[i] = (name, offset + len(self.static_data))
|
||||||
|
# Extend elements and data
|
||||||
|
self.elements += el
|
||||||
|
self.static_data += static_data
|
||||||
|
elif isinstance(other, Sym):
|
||||||
|
self.elements.append(other)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def data(self):
|
def data(self):
|
||||||
|
@ -201,6 +219,9 @@ class ObjectData:
|
||||||
for el in self.elements:
|
for el in self.elements:
|
||||||
if isinstance(el, bytes):
|
if isinstance(el, bytes):
|
||||||
assembly += ".byte " + ",".join(hex(x) for x in el) + "\n"
|
assembly += ".byte " + ",".join(hex(x) for x in el) + "\n"
|
||||||
|
elif isinstance(el, Sym):
|
||||||
|
assembly += f".global {el.name}\n"
|
||||||
|
assembly += f"{el.name}:\n"
|
||||||
else:
|
else:
|
||||||
name, offset = el
|
name, offset = el
|
||||||
name = "_" + name if name != "" else data_symbol
|
name = "_" + name if name != "" else data_symbol
|
||||||
|
|
Loading…
Reference in a new issue