f256/pgz-thunk.py
2023-12-30 17:05:38 -06:00

50 lines
1.8 KiB
Python

import struct, sys
def unpack_bytes(len, bytes):
if len == 3:
bytes.extend(b'\x00')
return struct.unpack('<I', bytes)[0]
def read_pgz_file(file_path):
with open(file_path, 'rb') as file:
# Read the file type signature (first byte)
signature = file.read(1)
# Determine the address and size format
if signature == b'Z':
address_size_format = 3 # 24 bit
print('Signature: "Z" 24-bit addresses\n')
elif signature == b'z':
address_size_format = 4 # 32 bit
print('Signature: "z" 32-bit addresses \n')
else:
print("Invalid PGZ file. Signature 'Z' not found.")
return
# Read segments
segment_number = 1
while True:
address = unpack_bytes(address_size_format,bytearray(file.read(address_size_format)))
#print(f'Adr: {address:06x}')
size = unpack_bytes(address_size_format,bytearray(file.read(address_size_format)))
if size == 0:
# Final segment with size $000000 indicates the starting address of the executable
print(f"Segment {segment_number}: Starting address of the executable: {hex(address)}")
break
print(f"Segment {segment_number}: Address: ${address:06x}, Size: ${size:06x} ({size})")
# Read data of the segment
data = file.read(size)
# Process or display data as needed
# For example, you can print the data in hex format: print(f"Data: {data.hex()}")
segment_number += 1
print()
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Add pgz argument to command.")
else:
pgz_file_path = sys.argv[1]
read_pgz_file(pgz_file_path)