Files
rt-4d/research/contacts3.py
T
viktorиClaude Opus 4.8 ae36c3b729 RT-4D: реверс прошивки, русификация, кастомный UI, флешеры
- Полный RE стока V3.25 (Cortex-M4F) + FM100B: карта памяти, протокол, codeplug, UI-архитектура
- Русификация: свой CP1251-шрифт + патч рендера, перевод меню и надписей, ребренд Ru-4D V3.25
- Блюпринт переделки UI + C-тулчейн (clang thumbv7em), доказан инъекцией
- Готовые флешеры: WebSerial .html и Windows .exe со вшитой прошивкой
- Дамп SPI рации, стоковая прошивка, инструменты сборки

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 15:47:22 +09:00

28 строки
1.0 KiB
Python

import struct, sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
DUMP = r"C:/Users/vikto/Documents/Claude/rt-4d/radio-spi-dump.bin"
data = open(DUMP, "rb").read()
def hx(b): return " ".join(f"{x:02X}" for x in b)
def bcd(bb):
if all(b==0xFF for b in bb): return 0
r=0
for bv in reversed(bb):
hi=(bv>>4)&0xF; lo=bv&0xF
if hi==0xF:hi=0
if lo==0xF:lo=0
r=r*100+hi*10+lo
return r
CT=0x05E000
STRIDE=21
print("21-byte contact records @0x5E000:")
for i in range(4):
off=CT+i*STRIDE
d=data[off:off+STRIDE]
typ=d[0]
idraw=d[1:5]
name=bytes(b for b in d[5:21] if b!=0xFF and b!=0).decode('gbk','ignore')
print(f"rec{i} @0x{off:06X} type={typ:02X} idbytes={hx(idraw)} bcd={bcd(idraw)} le={struct.unpack('<I',idraw)[0]} name={name!r}")
print(" raw:", hx(d))
# Confirm All Call id: AA AA AA AA. In DMR all-call id=0xFFFFFF(16777215). AA is not FF...
# maybe type: 0=private,1=group,2=allcall. All Call rec type=02 ✓, TG6/TG666 type=01=group ✓