- Полный 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>
54 строки
1.8 KiB
Python
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")
|