59 lines
2.2 KiB
Python
Executable File
59 lines
2.2 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import sys
|
|
import io
|
|
|
|
class O65():
|
|
|
|
header: dict[str, int] = {}
|
|
options: list[(int, int, bytes)] = []
|
|
text: bytes
|
|
data: bytes
|
|
|
|
def __init__(self, filename: str) -> None:
|
|
with open(filename, "rb") as _file:
|
|
self.header["no_c64"] = int.from_bytes(_file.read(2))
|
|
self.header["magic"] = int.from_bytes(_file.read(3))
|
|
self.header["version"] = int.from_bytes(_file.read(1))
|
|
self.header["mode"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
self.header["tbase"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
self.header["tlen"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
self.header["dbase"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
self.header["dlen"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
self.header["bbase"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
self.header["blen"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
self.header["zbase"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
self.header["zlen"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
self.header["stack"] = int.from_bytes(_file.read(2), byteorder="little")
|
|
|
|
olen = int.from_bytes(_file.read(1))
|
|
while olen != 0:
|
|
otype = int.from_bytes(_file.read(1))
|
|
obytes = _file.read(olen - 2)
|
|
self.options.append((olen, otype, obytes))
|
|
olen = int.from_bytes(_file.read(1))
|
|
|
|
self.text = _file.read(self.header["tlen"])
|
|
self.data = _file.read(self.header["dlen"])
|
|
|
|
|
|
|
|
|
|
def main() -> None:
|
|
if len(sys.argv) < 2:
|
|
print("Please supply a filename")
|
|
return
|
|
filename = sys.argv[1]
|
|
print(filename)
|
|
o65 = O65(filename)
|
|
for item, value in o65.header.items():
|
|
print(f"{item}:\t{value:x}")
|
|
|
|
for option in o65.options:
|
|
print(f"Type: {option[1]}, Data: {option[2]}")
|
|
|
|
with open("text.bin", "wb") as textfile:
|
|
textfile.write(o65.text)
|
|
|
|
if __name__ == "__main__":
|
|
main() |