Files
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

54 строки
1.8 KiB
Python

import io
data = open(r"C:/Users/vikto/Documents/Claude/rt-4d/radio-spi-dump.bin","rb").read()
out=io.open(r"C:/Users/vikto/Documents/Claude/rt-4d/analyze/out12.txt","w",encoding="utf-8")
def render(off):
lines=[]
for r in range(16):
line=""
for cb in range(2):
b=data[off+r*2+cb]
for bit in range(8):
line += "#" if (b>>bit)&1 else "."
lines.append(line)
return lines
# find best global alignment offset (0..31) that maximizes clean glyphs across 0x198000..0x242000
# metric: fraction of glyphs whose first & last rows are blank-ish and have connected mass
import statistics
def glyph_score(off):
g=data[off:off+32]
if all(b==0 for b in g) or all(b==0xff for b in g): return None
rows=[(g[2*r]|(g[2*r+1]<<8)) for r in range(16)]
setbits=sum(bin(x).count('1') for x in rows)
if setbits<8 or setbits>200: return 0
# top & bottom rows mostly empty is typical
edge = (bin(rows[0]).count('1')<=3) + (bin(rows[15]).count('1')<=3)
return edge
best=None
for align in range(0,32,2):
base=0x198000+0x4000+align # start well past pinyin table
scores=[]
for g in range(2000):
off=base+g*32
s=glyph_score(off)
if s is not None: scores.append(s)
if scores:
avg=sum(scores)/len(scores)
if best is None or avg>best[1]:
best=(align,avg)
out.write("best align offset within 32: %r\n"%(best,))
# count non-empty 32-byte glyph cells in whole region for a glyph-count estimate
region=data[0x19c000:0x242000]
ng=len(region)//32
nonempty=0
for g in range(ng):
cell=region[g*32:g*32+32]
if any(b not in (0,0xff) for b in cell): nonempty+=1
out.write("region 0x19c000-0x242000: %d 32-byte cells, %d non-empty (~glyphs)\n"%(ng,nonempty))
out.write("A GB2312 full font would be ~7000-8000 glyphs.\n")
out.close()
print("done")