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
co-authored by Claude Opus 4.8
Коммит ae36c3b729
72 изменённых файлов: 24124 добавлений и 0 удалений
+25
Просмотреть файл
@@ -0,0 +1,25 @@
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()
ZN_BASE=0x01C000
def hx(b): return " ".join(f"{x:02X}" for x in b)
# The occupancy said zones DATA is 0x1C000-0x1F000 (12KB). Dump each 512-byte record 0..23
print("Scanning zone region 0x1C000..0x1F000 as 512-byte records:")
for i in range(24):
off=ZN_BASE+i*512
d=data[off:off+512]
if all(b==0xFF for b in d):
continue
# look for ascii name anywhere
printable = bytes(b if 32<=b<127 else 0 for b in d)
# find longest run of ascii letters
txt=""
for b in d[:0x40]:
if 32<=b<127: txt+=chr(b)
else: txt+="."
print(f"\nrec{i} @0x{off:06X}")
print(" 0x00-0x1F:", hx(d[0:0x20]))
print(" 0x20-0x3F:", hx(d[0x20:0x40]))
print(" ascii0-40:", txt)