- Полный 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>
48 строки
1.9 KiB
C
48 строки
1.9 KiB
C
/* RT-4D custom UI layer (Phase 1: custom standby/home screen).
|
|
* Compiled with clang --target=thumbv7em, linked at 0x08029000, injected over
|
|
* the russified stock image. Calls stock SDK functions by absolute address.
|
|
* Reads only RAM caches + calls display/ADC primitives -> codeplug & CPS untouched.
|
|
*/
|
|
typedef unsigned char u8;
|
|
typedef unsigned short u16;
|
|
typedef unsigned int u32;
|
|
|
|
/* --- stock SDK (thumb entry = addr|1) --- */
|
|
#define DRAW_STRING ((void (*)(u8 pg, u8 x, const void *s, u16 n, u8 mode))0x08008A51)
|
|
#define STOCK_DRAW ((void (*)(void))0x0801E1BD) /* ui_draw_dispatch */
|
|
|
|
/* --- RAM state --- */
|
|
#define GSCR (*(volatile u8 *)0x200008B3) /* current screen id */
|
|
#define GDISP ((volatile u8 *)0x200009C3) /* home display struct */
|
|
|
|
/* draw one full-width (18-char) space-padded line from a source field.
|
|
* Full-coverage fixed-width paint => no clear needed, no flicker. */
|
|
static void line_field(u8 pg, const volatile u8 *src, int n)
|
|
{
|
|
char b[18];
|
|
int i;
|
|
for (i = 0; i < 18; i++) {
|
|
u8 c = (i < n) ? src[i] : 0x20;
|
|
if (c == 0 || c == 0xFF) c = 0x20; /* pad -> space */
|
|
b[i] = (char)c;
|
|
}
|
|
DRAW_STRING(pg, 0, b, 18, 0);
|
|
}
|
|
|
|
static void my_home(void)
|
|
{
|
|
line_field(0, GDISP + 0x00, 16); /* line 0: name / mode tag */
|
|
line_field(2, GDISP + 0x20, 16); /* line 1: Area A freq/chan */
|
|
line_field(4, GDISP + 0x32, 16); /* line 2: Area B */
|
|
line_field(6, GDISP + 0x15, 7); /* line 3: CH-/A-/D- prefix */
|
|
}
|
|
|
|
/* hooked in at the ui_tick_normal draw dispatch (bl @0x080207E6). */
|
|
void my_draw_router(void)
|
|
{
|
|
if (GSCR == 0)
|
|
my_home(); /* our custom home screen */
|
|
else
|
|
STOCK_DRAW(); /* stock draws all other screens */
|
|
}
|