modemwars/extracted/simKernalLoad.py
2026-08-23 02:09:40 -05:00

37 lines
1.4 KiB
Python

#!/usr/bin/env python3
# simKernalLoad.py - simulate the C64 KERNAL serial LOAD store loop ($F4F3..$F524) for a PRG whose
# load address overlaps zero page, so the stored bytes redirect the load pointer ($AE/$AF) itself.
import sys
data = open(sys.argv[1], "rb").read()
lo, hi = data[0], data[1]
mem = bytearray(65536)
mem[0xAE] = lo
mem[0xAF] = hi
mem[0x93] = 0 # LOAD (not VERIFY)
mem[0x01] = 0x37
regions = [] # list of (startAddr, fileOffset, length)
curStart = None
verifyMode = False
for i, b in enumerate(data[2:]):
ptr = mem[0xAE] | (mem[0xAF] << 8)
if mem[0x93] != 0:
if not verifyMode:
print(f" ** VERIFY mode entered at file offset {i+2:#06x}, ptr={ptr:04x}")
verifyMode = True
else:
if curStart is None or ptr != curStart[0] + curStart[2]:
if curStart: regions.append(curStart)
curStart = [ptr, i+2, 0]
mem[ptr] = b
curStart[2] += 1
if ptr == 0x01:
print(f" ** wrote {b:#04x} to $01 at file offset {i+2:#06x}")
# INC $AE ; BNE ; INC $AF
mem[0xAE] = (mem[0xAE] + 1) & 0xFF
if mem[0xAE] == 0:
mem[0xAF] = (mem[0xAF] + 1) & 0xFF
if curStart: regions.append(curStart)
for s, off, n in regions:
print(f"file offset {off:#06x} -> ${s:04x}-${s+n-1:04x} ({n} bytes)")
print(f"final pointer ${mem[0xAE] | (mem[0xAF]<<8):04x}, $01={mem[0x01]:#04x}, $90={mem[0x90]:#04x}")
open(sys.argv[2], "wb").write(mem)