#!/usr/bin/env python3
"""Check address ranges of original hex file."""
with open('/Users/admin/workspace/jyq/mcubin/mcu_app.hex') as f:
    lines = f.readlines()

ext_addr = 0
min_addr = 0xFFFFFFFF
max_addr = 0
record_types = {}
total_data = 0
ext_addrs = set()

for line in lines:
    line = line.strip()
    if not line or line[0] != ':': continue
    bc = int(line[1:3], 16)
    addr = int(line[3:7], 16)
    rt = int(line[7:9], 16)
    record_types[rt] = record_types.get(rt, 0) + 1
    if rt == 4:
        ext_addr = int(line[9:13], 16) << 16
        ext_addrs.add(int(line[9:13], 16))
    elif rt == 0:
        start = ext_addr + addr
        end = start + bc
        if start < min_addr: min_addr = start
        if end > max_addr: max_addr = end
        total_data += bc

print(f'Record types: {record_types}')
print(f'Data address range: 0x{min_addr:08X} - 0x{max_addr:08X}')
print(f'Total data bytes: {total_data}')
print(f'Data covers: {max_addr/1024:.1f} KB')
print(f'Extended addr pages: {sorted(ext_addrs)}')
for ea in sorted(ext_addrs):
    print(f'  0x{ea:04X}: flash at 0x{ea:08X}000')

# Check option byte area (typically last 1KB of 256KB flash)
print(f'\nOption byte area (0x3FC00-0x3FFFF):')
option_data = bytearray()
for line in lines:
    line = line.strip()
    if not line or line[0] != ':': continue
    bc = int(line[1:3], 16)
    addr = int(line[3:7], 16)
    rt = int(line[7:9], 16)
    payload = bytes.fromhex(line[9:9+bc*2])
    if rt == 4:
        ext_addr = int(line[9:13], 16) << 16
    elif rt == 0:
        start = ext_addr + addr
        for i in range(bc):
            if 0x3FC00 <= start + i <= 0x3FFFF:
                option_data.append((start+i, payload[i]))

if option_data:
    for addr, val in option_data:
        print(f'  0x{addr:05X}: 0x{val:02X}')
else:
    print(f'  No option byte data in hex file (expected for app-only hex)')
    print(f'  This means option bytes will be set to erased state (0xFF) after flash erase!')
