2025-06-27 00:32:57 +08:00
|
|
|
|
#include "global.h"
|
|
|
|
|
#include "main_inc.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ȡ<EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>r9<72>Ĵ<EFBFBD><C4B4><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void *get_r9(void);
|
|
|
|
|
void set_r9(void *r9);
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
static void * const g_r9;
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ָ<><D6B8>app<70><70><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
static app_struct *g_me;
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>const<73><74><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>ֵ
|
2025-10-15 19:34:08 +08:00
|
|
|
|
static void save_const(void *const_addr, u32 value)
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-10-15 19:34:08 +08:00
|
|
|
|
__asm__ volatile (
|
|
|
|
|
"str %1, [%0]"
|
|
|
|
|
:
|
|
|
|
|
: "r" (const_addr), "r" (value)
|
|
|
|
|
: "memory"
|
|
|
|
|
);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-10-15 19:34:08 +08:00
|
|
|
|
void *get_r9(void)
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-10-15 19:34:08 +08:00
|
|
|
|
void *result;
|
|
|
|
|
__asm__ volatile (
|
|
|
|
|
"mov %0, r9"
|
|
|
|
|
: "=r" (result)
|
|
|
|
|
:
|
|
|
|
|
:
|
|
|
|
|
);
|
|
|
|
|
return result;
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-10-15 19:34:08 +08:00
|
|
|
|
void set_r9(void *r9_val)
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-10-15 19:34:08 +08:00
|
|
|
|
__asm__ volatile (
|
|
|
|
|
"mov r9, %0"
|
|
|
|
|
:
|
|
|
|
|
: "r" (r9_val)
|
|
|
|
|
: "r9"
|
|
|
|
|
);
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void *global_in(void)
|
|
|
|
|
{
|
2025-10-15 19:34:08 +08:00
|
|
|
|
void *t=get_r9();
|
2025-06-27 00:32:57 +08:00
|
|
|
|
set_r9(g_r9);
|
|
|
|
|
return t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void global_out(void *r9)
|
|
|
|
|
{
|
|
|
|
|
set_r9(r9);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void global_init(app_struct *me)
|
|
|
|
|
{
|
|
|
|
|
void *t=get_r9();
|
2025-10-15 19:34:08 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ʹ<>ú<EFBFBD><C3BA><EFBFBD>ǿ<EFBFBD>и<EFBFBD>ֵ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
save_const((void *)&g_r9,(u32)t);
|
|
|
|
|
g_me=me;
|
2025-10-15 19:34:08 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṩ<EFBFBD><E1B9A9>ϵͳ<CFB5><CDB3><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>app
|
2025-06-27 00:32:57 +08:00
|
|
|
|
extern int __app_exit(void *);
|
|
|
|
|
g_me->exit=__app_exit;
|
2025-10-15 19:34:08 +08:00
|
|
|
|
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//app<70><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void global_run_start(void)
|
|
|
|
|
{
|
|
|
|
|
if(g_me) g_me->run_state++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//app<70><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void global_run_exit(void)
|
|
|
|
|
{
|
2025-10-15 19:34:08 +08:00
|
|
|
|
if(g_me)
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
if(g_me->run_state) g_me->run_state--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|