49 lines
1.1 KiB
Python
49 lines
1.1 KiB
Python
#!/usr/bin/env python3
|
|
import struct
|
|
|
|
def calc_bootblock_checksum(data):
|
|
"""Calculate Amiga bootblock checksum"""
|
|
# Clear checksum field first
|
|
data = bytearray(data)
|
|
struct.pack_into('>I', data, 4, 0)
|
|
|
|
# Sum all longwords with carry
|
|
chksum = 0
|
|
for i in range(0, 1024, 4):
|
|
val = struct.unpack_from('>I', data, i)[0]
|
|
chksum += val
|
|
if chksum > 0xFFFFFFFF:
|
|
chksum = (chksum & 0xFFFFFFFF) + 1
|
|
|
|
# Return NOT of sum
|
|
chksum = (~chksum) & 0xFFFFFFFF
|
|
return chksum
|
|
|
|
# Read files
|
|
with open('boot.bin', 'rb') as f:
|
|
boot = bytearray(f.read())
|
|
|
|
with open('game.bin', 'rb') as f:
|
|
game = f.read()
|
|
|
|
# Pad bootblock to 1024 bytes
|
|
if len(boot) < 1024:
|
|
boot += b'\x00' * (1024 - len(boot))
|
|
|
|
# Calculate and set checksum
|
|
chksum = calc_bootblock_checksum(boot)
|
|
struct.pack_into('>I', boot, 4, chksum)
|
|
print(f"Bootblock checksum: 0x{chksum:08X}")
|
|
|
|
# Create ADF
|
|
adf = bytearray(880 * 1024)
|
|
adf[0:1024] = boot
|
|
adf[1024:1024+len(game)] = game
|
|
|
|
# Write ADF
|
|
with open('giochino.adf', 'wb') as f:
|
|
f.write(adf)
|
|
|
|
print(f"Created giochino.adf ({len(adf)} bytes)")
|
|
print(f"Game size: {len(game)} bytes")
|