############################################################################## # # # IAR ARM ANSI C/C++ Compiler V4.42A/W32 EVALUATION 14/May/2008 12:49:19 # # Copyright 1999-2005 IAR Systems. All rights reserved. # # # # Cpu mode = interwork # # Endian = little # # Stack alignment = 4 # # Source file = D:\Pasha\elf\googlecode\MyMenu2\MyMenu2_Editor\main. # # c # # Command line = D:\Pasha\elf\googlecode\MyMenu2\MyMenu2_Editor\main. # # c -D NEWSGOLD -D ELKA -lC # # D:\Pasha\elf\googlecode\MyMenu2\MyMenu2_Editor\Relea # # se\List\ -o D:\Pasha\elf\googlecode\MyMenu2\MyMenu2_ # # Editor\Release\Obj\ -s9 --no_unroll --cpu_mode arm # # --endian little --cpu ARM926EJ-S --stack_align 4 # # --interwork -e --fpu None --dlib_config # # "D:\Pasha\Embedded Workbench 4.0 # # Evaluation2\ARM\LIB\dl5tpainl8n.h" -I # # "D:\Pasha\Embedded Workbench 4.0 # # Evaluation2\ARM\INC\" --inline_threshold=2 # # List file = D:\Pasha\elf\googlecode\MyMenu2\MyMenu2_Editor\Relea # # se\List\main.lst # # Object file = D:\Pasha\elf\googlecode\MyMenu2\MyMenu2_Editor\Relea # # se\Obj\main.r79 # # # # # ############################################################################## D:\Pasha\elf\googlecode\MyMenu2\MyMenu2_Editor\main.c 1 #include "swilib.h" 2 #include "type.h" 3 #include "rect_patcher.h" 4 #include "lang.h" 5 6 7 8 #define CFG_PATH "4:\\ZBin\\etc\\MyMenu2.cfg" 9 #define CFG_PATH_DEBUG "4:\\ZBin\\etc\\MyMenu2.cfg" 10 11 #define SP_CHAR 0x1F //0x20 12 #define US_CHAR 0x1F 13 #define _80_CHAR 0x80 14 15 #define BUF_SIZE (8*1024) 16 #define PATH_LEN 128 17 #define ADDR_LEN 8 18 19 #define FUNC_PT_START 0xA085DEA4 20 #define FUNC_PT_END 0xA0865BA3 21 #define FUNC_PT_PSIZE 0x80 22 #define FUNC_PT_OFFSET 0x10 23 #define MAX_FUNC 0xFA 24 25 #define TYPE_FILE 0 26 #define TYPE_SHORTCUT 1 27 #define TYPE_ADDRESS 2 28 #define TYPE_FOLDER 3 29 30 #define CHARSET_GB2312 0 31 #define CHARSET_UTF8 1 32 #define CHARSET_UNICODE 2 33 34 35 36 extern void kill_data(void *p, void (*func_p)(void *)); 37 extern void show_option_menu(void); 38 39 void edit_ml(MENU_LIST *ml); 40 \ In segment DATA_Z, align 4, align-sorted 41 char *buf; \ buf: \ 00000000 DS8 4 42 MENU_LIST *mltop; \ mltop: \ 00000004 DS8 4 43 unsigned int EDGUI_ID=0; \ EDGUI_ID: \ 00000008 DS8 4 44 unsigned int MAIN_GUI_ID=0; \ MAIN_GUI_ID: \ 0000000C DS8 4 45 int menu_item_n=0; \ menu_item_n: \ 00000010 DS8 4 46 WSHDR *ws_edit_nametmp; \ ws_edit_nametmp: \ 00000014 DS8 4 47 WSHDR *ws_edit_functmp; \ ws_edit_functmp: \ 00000018 DS8 4 48 MENU_LIST *ml_edit_tmp; \ ml_edit_tmp: \ 0000001C DS8 4 49 \ In segment DATA_C, align 4, align-sorted 50 const int menusoftkeys[]={0, 1, 2}; \ menusoftkeys: \ 00000000 000000000100 DC32 0, 1, 2 \ 000002000000 51 \ In segment DATA_C, align 4, align-sorted 52 const SOFTKEY_DESC menu_sk[]= \ menu_sk: \ 00000000 18000000 DC16 24, 0 \ 00000004 ........ DC32 `?` \ 00000008 01000000 DC16 1, 0 \ 0000000C ........ DC32 `?` \ 00000010 3D000000 DC16 61, 0 \ 00000014 FBC0FF7F DC32 2147467515 53 { 54 {0x0018,0x0000,(int)LGP_MENU}, 55 {0x0001,0x0000,(int)LGP_EXIT}, 56 {0x003D,0x0000,(int)LGP_DOIT_PIC} 57 }; 58 \ In segment DATA_C, align 4, align-sorted 59 const SOFTKEYSTAB menu_skt= \ menu_skt: \ 00000000 ........0000 DC32 menu_sk, 0 \ 0000 60 { 61 menu_sk,0 62 }; 63 64 const HEADER_DESC menuheader={0, 0, 0, 0, NULL, (int)ELFNAME, LGP_NULL}; 65 66 \ In segment CODE, align 4, keep-with-next 67 void utf8_2str(char *str, char *utf8) 68 { 69 70 char *p=utf8; 71 int i=0; \ utf8_2str: \ 00000000 0020A0E3 MOV R2,#+0 \ 00000004 020000EA B ??utf8_2str_0 72 while(*p) 73 { 74 if(*p>=_80_CHAR) 75 break; 76 str[i]=*p; \ ??utf8_2str_1: \ 00000008 ........ LDRB R12,[R1], #+1 \ 0000000C 00C0C2E7 STRB R12,[R2, +R0] 77 p++; 78 i++; \ 00000010 0320A0E1 MOV R2,R3 \ ??utf8_2str_0: \ 00000014 00C0D1E5 LDRB R12,[R1, #+0] \ 00000018 013082E2 ADD R3,R2,#+1 \ 0000001C 00005CE3 CMP R12,#+0 \ 00000020 0100000A BEQ ??utf8_2str_2 \ 00000024 80005CE3 CMP R12,#+128 \ 00000028 F6FFFF3A BCC ??utf8_2str_1 79 } 80 if(*p) \ ??utf8_2str_2: \ 0000002C 00005CE3 CMP R12,#+0 \ 00000030 0D00000A BEQ ??utf8_2str_3 81 { 82 if(str[i-1]!=US_CHAR) \ 00000034 00C082E0 ADD R12,R2,R0 \ 00000038 01C05CE5 LDRB R12,[R12, #-1] \ 0000003C 1F005CE3 CMP R12,#+31 \ 00000040 0600000A BEQ ??utf8_2str_4 83 { 84 str[i]=US_CHAR; \ 00000044 1FC0A0E3 MOV R12,#+31 \ 00000048 00C0C2E7 STRB R12,[R2, +R0] 85 i++; \ 0000004C 0320A0E1 MOV R2,R3 \ 00000050 020000EA B ??utf8_2str_4 86 } 87 while(*p) 88 { 89 str[i]=*p; \ ??utf8_2str_5: \ 00000054 ........ LDRB R3,[R1], #+1 \ 00000058 0030C2E7 STRB R3,[R2, +R0] 90 p++; 91 i++; \ 0000005C 012082E2 ADD R2,R2,#+1 92 } \ ??utf8_2str_4: \ 00000060 0030D1E5 LDRB R3,[R1, #+0] \ 00000064 000053E3 CMP R3,#+0 \ 00000068 F9FFFF1A BNE ??utf8_2str_5 93 } 94 str[i]=0; \ ??utf8_2str_3: \ 0000006C 0010A0E3 MOV R1,#+0 \ 00000070 0010C2E7 STRB R1,[R2, +R0] 95 } \ 00000074 1EFF2FE1 BX LR ;; return 96 \ In segment CODE, align 4, keep-with-next 97 void AddtoMenuList(char *name, int name_len, char *func, int func_len, int type, int IsEdited) 98 { \ AddtoMenuList: \ 00000000 F0432DE9 PUSH {R4-R9,LR} \ 00000004 0040A0E1 MOV R4,R0 \ 00000008 1C809DE5 LDR R8,[SP, #+28] \ 0000000C 20909DE5 LDR R9,[SP, #+32] \ 00000010 0150A0E1 MOV R5,R1 \ 00000014 0260A0E1 MOV R6,R2 \ 00000018 0370A0E1 MOV R7,R3 99 MENU_LIST *ml=malloc(sizeof(MENU_LIST)); \ 0000001C 2000A0E3 MOV R0,#+32 \ 00000020 140000EF SWI +20 100 ml->next=0; \ 00000024 0010A0E3 MOV R1,#+0 \ 00000028 001080E5 STR R1,[R0, #+0] 101 ml->prev=0; \ 0000002C 041080E5 STR R1,[R0, #+4] 102 ml->name=name; 103 ml->name_len=name_len; 104 ml->func=func; 105 ml->func_len=func_len; 106 ml->type=type; 107 ml->IsEdited=IsEdited; 108 if(!mltop) \ 00000030 ........ LDR R1,??DataTable7 ;; buf \ 00000034 084080E5 STR R4,[R0, #+8] \ 00000038 0C5080E5 STR R5,[R0, #+12] \ 0000003C 106080E5 STR R6,[R0, #+16] \ 00000040 147080E5 STR R7,[R0, #+20] \ 00000044 188080E5 STR R8,[R0, #+24] \ 00000048 1C9080E5 STR R9,[R0, #+28] \ 0000004C 042091E5 LDR R2,[R1, #+4] \ 00000050 000052E3 CMP R2,#+0 109 { 110 mltop=ml; \ 00000054 04008105 STREQ R0,[R1, #+4] \ 00000058 F083BD08 POPEQ {R4-R9,PC} 111 } 112 else 113 { 114 MENU_LIST *ml_t=mltop; \ 0000005C 001092E5 LDR R1,[R2, #+0] \ 00000060 000051E3 CMP R1,#+0 \ 00000064 0300000A BEQ ??AddtoMenuList_0 115 while(ml_t->next) 116 ml_t=ml_t->next; \ ??AddtoMenuList_1: \ 00000068 002092E5 LDR R2,[R2, #+0] \ 0000006C 001092E5 LDR R1,[R2, #+0] \ 00000070 000051E3 CMP R1,#+0 \ 00000074 FBFFFF1A BNE ??AddtoMenuList_1 117 ml_t->next=ml; \ ??AddtoMenuList_0: \ 00000078 000082E5 STR R0,[R2, #+0] 118 ml->prev=ml_t; \ 0000007C 042080E5 STR R2,[R0, #+4] 119 } 120 } \ 00000080 F083BDE8 POP {R4-R9,PC} ;; return 121 \ In segment CODE, align 4, keep-with-next 122 void FreeMenuList(void) 123 { \ FreeMenuList: \ 00000000 ........ LDR R0,??DataTable2 ;; buf + 4 \ 00000004 30402DE9 PUSH {R4,R5,LR} \ 00000008 004090E5 LDR R4,[R0, #+0] \ 0000000C 000054E3 CMP R4,#+0 \ 00000010 3080BD08 POPEQ {R4,R5,PC} 124 if(mltop) 125 { 126 MENU_LIST *ml=mltop; 127 MENU_LIST *ml_t; 128 while(ml) 129 { 130 ml_t=ml->next; 131 if(ml->IsEdited) \ ??FreeMenuList_0: \ 00000014 1C0094E5 LDR R0,[R4, #+28] \ 00000018 005094E5 LDR R5,[R4, #+0] \ 0000001C 000050E3 CMP R0,#+0 \ 00000020 0300000A BEQ ??FreeMenuList_1 132 { 133 mfree(ml->name); \ 00000024 080094E5 LDR R0,[R4, #+8] \ 00000028 150000EF SWI +21 134 mfree(ml->func); \ 0000002C 100094E5 LDR R0,[R4, #+16] \ 00000030 150000EF SWI +21 135 } 136 mfree(ml); \ ??FreeMenuList_1: \ 00000034 0400A0E1 MOV R0,R4 \ 00000038 150000EF SWI +21 137 ml=ml_t; \ 0000003C 0540B0E1 MOVS R4,R5 138 } \ 00000040 F3FFFF1A BNE ??FreeMenuList_0 139 } 140 } \ 00000044 3080BDE8 POP {R4,R5,PC} ;; return 141 \ In segment CODE, align 4, keep-with-next 142 MENU_LIST *get_mlitem(int curitem) 143 { 144 MENU_LIST *ml; 145 ml=mltop; \ get_mlitem: \ 00000000 ........ LDR R1,??DataTable2 ;; buf + 4 146 int i=0; \ 00000004 0020A0E3 MOV R2,#+0 \ 00000008 001091E5 LDR R1,[R1, #+0] \ 0000000C 010000EA B ??get_mlitem_0 147 while(ml) 148 { 149 if(i==curitem) 150 return (ml); 151 //break; 152 i++; 153 ml=ml->next; \ ??get_mlitem_1: \ 00000010 001091E5 LDR R1,[R1, #+0] \ 00000014 012082E2 ADD R2,R2,#+1 \ ??get_mlitem_0: \ 00000018 000051E3 CMP R1,#+0 \ 0000001C 0300000A BEQ ??get_mlitem_2 \ 00000020 000052E1 CMP R2,R0 \ 00000024 F9FFFF1A BNE ??get_mlitem_1 \ 00000028 0100A0E1 MOV R0,R1 \ 0000002C 1EFF2FE1 BX LR 154 } 155 return 0; \ ??get_mlitem_2: \ 00000030 0000A0E3 MOV R0,#+0 \ 00000034 1EFF2FE1 BX LR ;; return 156 } 157 \ In segment CODE, align 4, keep-with-next 158 char *strchrinline(char *s, char chr) 159 { 160 char *p=s; 161 char *t=0; \ strchrinline: \ 00000000 0020A0E3 MOV R2,#+0 \ 00000004 020000EA B ??strchrinline_0 162 while(*p) 163 { 164 //if((*p==0x0D)||(*p==0x0A)) 165 if(*p=SP_CHAR) 182 break; 183 pp++; \ ??gotoRealPos_1: \ 00000004 010080E2 ADD R0,R0,#+1 \ ??gotoRealPos_0: \ 00000008 0010D0E5 LDRB R1,[R0, #+0] \ 0000000C 000051E3 CMP R1,#+0 \ 00000010 1EFF2F01 BXEQ LR \ 00000014 1F0051E3 CMP R1,#+31 \ 00000018 F9FFFF3A BCC ??gotoRealPos_1 184 } 185 return pp; \ 0000001C 1EFF2FE1 BX LR ;; return 186 } 187 \ In segment CODE, align 4, keep-with-next 188 char *gotoLineEnd(char *p) 189 { 190 char *pp=p; \ gotoLineEnd: \ 00000000 000000EA B ??gotoLineEnd_0 191 while(*pp) 192 { 193 if(*pp` \ 00000018 044085E5 STR R4,[R5, #+4] \ 0000001C CC0391E8 LDM R1,{R2,R3,R6-R9} \ 00000020 04008DE2 ADD R0,SP,#+4 \ 00000024 CC0380E8 STM R0,{R2,R3,R6-R9} 222 unsigned int err; 223 if((f=fopen(path, A_ReadOnly, P_READ, &err))==-1) \ 00000028 0D30A0E1 MOV R3,SP \ 0000002C 8020A0E3 MOV R2,#+128 \ 00000030 0010A0E3 MOV R1,#+0 \ 00000034 0A0000EF SWI +10 \ 00000038 0060A0E1 MOV R6,R0 \ 0000003C 0470E0E1 MVN R7,R4 \ 00000040 070056E1 CMP R6,R7 \ 00000044 0C00001A BNE ??read_cfg_1 224 { 225 path[0]='4'; \ 00000048 3410A0E3 MOV R1,#+52 \ 0000004C 0410CDE5 STRB R1,[SP, #+4] 226 if((f=fopen(path, A_ReadOnly, P_READ, &err))==-1) \ 00000050 0D30A0E1 MOV R3,SP \ 00000054 8020A0E3 MOV R2,#+128 \ 00000058 0010A0E3 MOV R1,#+0 \ 0000005C 04008DE2 ADD R0,SP,#+4 \ 00000060 0A0000EF SWI +10 \ 00000064 0060A0E1 MOV R6,R0 \ 00000068 070056E1 CMP R6,R7 \ 0000006C 0200001A BNE ??read_cfg_1 227 return 0; \ ??read_cfg_2: \ 00000070 0000A0E3 MOV R0,#+0 \ 00000074 1CD08DE2 ADD SP,SP,#+28 \ 00000078 F08BBDE8 POP {R4-R9,R11,PC} 228 } 229 int size=0; 230 size=fread(f, buf, BUF_SIZE, &err); \ ??read_cfg_1: \ 0000007C 001095E5 LDR R1,[R5, #+0] \ 00000080 0D30A0E1 MOV R3,SP \ 00000084 802DA0E3 MOV R2,#+8192 \ 00000088 0600A0E1 MOV R0,R6 \ 0000008C 0B0000EF SWI +11 \ 00000090 0070A0E1 MOV R7,R0 231 fclose(f, &err); \ 00000094 0D10A0E1 MOV R1,SP \ 00000098 0600A0E1 MOV R0,R6 \ 0000009C 0D0000EF SWI +13 232 if(size<3) \ 000000A0 030057E3 CMP R7,#+3 \ 000000A4 F1FFFFBA BLT ??read_cfg_2 233 return 0; 234 buf[size]=0; \ 000000A8 000095E5 LDR R0,[R5, #+0] \ 000000AC 0040C7E7 STRB R4,[R7, +R0] 235 char *p=buf; \ 000000B0 000095E5 LDR R0,[R5, #+0] 236 int name_len; 237 int func_len; 238 int item_n=0; \ 000000B4 0050A0E3 MOV R5,#+0 \ 000000B8 0010D0E5 LDRB R1,[R0, #+0] \ 000000BC 000051E3 CMP R1,#+0 \ 000000C0 5100000A BEQ ??read_cfg_3 239 //if(*p==0xEF && *(p+1)==0xBB && *(p+2)==0xBF) 240 //{ 241 // char_set=CHARSET_UTF8; 242 // p+=3; 243 //} 244 //else if(*p==0xFF && *(p+1)==0xFE && *(p+2)==0xED) 245 //{ 246 // char_set=CHARSET_UNICODE; 247 // p+=3; 248 //} 249 //else 250 // char_set=CHARSET_GB2312; 251 while(*p) 252 { 253 p=gotoRealPos(p); \ ??read_cfg_4: \ 000000C4 ........ BL gotoRealPos \ 000000C8 0060A0E1 MOV R6,R0 254 char *pp=strchrinline(p, '|'); \ 000000CC 7C10A0E3 MOV R1,#+124 \ 000000D0 ........ BL strchrinline 255 if(pp) \ 000000D4 000050E3 CMP R0,#+0 \ 000000D8 1000000A BEQ ??read_cfg_5 256 { 257 name_len=pp-p; \ 000000DC 06B040E0 SUB R11,R0,R6 258 pp++; // '|' 259 pp=gotoRealPos(pp); \ 000000E0 010080E2 ADD R0,R0,#+1 \ 000000E4 ........ BL gotoRealPos \ 000000E8 0040A0E1 MOV R4,R0 260 char *p2=pp; 261 p2=gotoLineEnd(p2); \ 000000EC ........ BL gotoLineEnd \ 000000F0 0070A0E1 MOV R7,R0 262 func_len=p2-pp; 263 AddtoMenuList(p, name_len, pp, func_len, CheckType(pp), 0); \ 000000F4 0400A0E1 MOV R0,R4 \ 000000F8 ........ BL CheckType \ 000000FC 0010A0E3 MOV R1,#+0 \ 00000100 02002DE9 PUSH {R1} \ 00000104 01002DE9 PUSH {R0} \ 00000108 043047E0 SUB R3,R7,R4 \ 0000010C 0420A0E1 MOV R2,R4 \ 00000110 0B10A0E1 MOV R1,R11 \ 00000114 0600A0E1 MOV R0,R6 \ 00000118 ........ BL AddtoMenuList 264 p=p2; \ 0000011C 330000EA B ??read_cfg_6 265 } 266 else 267 { 268 pp=p; 269 pp=gotoLineEnd(pp); \ ??read_cfg_5: \ 00000120 0600A0E1 MOV R0,R6 \ 00000124 ........ BL gotoLineEnd \ 00000128 0040A0E1 MOV R4,R0 270 func_len=pp-p; \ 0000012C 068044E0 SUB R8,R4,R6 271 int type=CheckType(p); \ 00000130 0600A0E1 MOV R0,R6 \ 00000134 ........ BL CheckType \ 00000138 0090B0E1 MOVS R9,R0 272 char *p2; 273 switch(type) \ 0000013C 0800000A BEQ ??read_cfg_7 \ 00000140 010040E2 SUB R0,R0,#+1 \ 00000144 010050E3 CMP R0,#+1 \ 00000148 0200009A BLS ??read_cfg_8 \ 0000014C 020050E2 SUBS R0,R0,#+2 \ 00000150 1100000A BEQ ??read_cfg_9 \ 00000154 1C0000EA B ??read_cfg_10 274 { 275 case TYPE_ADDRESS: 276 case TYPE_SHORTCUT: 277 name_len=func_len; \ ??read_cfg_8: \ 00000158 08B0A0E1 MOV R11,R8 278 p2=p; \ 0000015C 0670A0E1 MOV R7,R6 \ 00000160 190000EA B ??read_cfg_10 279 break; 280 case TYPE_FILE: 281 { 282 p2=strchrinline(p, '\\'); \ ??read_cfg_7: \ 00000164 5C10A0E3 MOV R1,#+92 \ 00000168 0600A0E1 MOV R0,R6 \ 0000016C ........ BL strchrinline \ 00000170 0070A0E1 MOV R7,R0 283 char *p3=strchrinline(p, '.'); \ 00000174 2E10A0E3 MOV R1,#+46 \ 00000178 0600A0E1 MOV R0,R6 \ 0000017C ........ BL strchrinline 284 if(p2) \ 00000180 000057E3 CMP R7,#+0 \ 00000184 F3FFFF0A BEQ ??read_cfg_8 285 { 286 p2++; \ 00000188 017087E2 ADD R7,R7,#+1 287 if(p3) \ 0000018C 000050E3 CMP R0,#+0 \ 00000190 0C00001A BNE ??read_cfg_11 288 name_len=p3-p2; 289 else 290 name_len=pp-p2; \ 00000194 07B044E0 SUB R11,R4,R7 \ 00000198 0B0000EA B ??read_cfg_10 291 } 292 else 293 { 294 name_len=func_len; 295 p2=p; 296 } 297 break; 298 } 299 case TYPE_FOLDER: 300 { 301 //p2=strchrinline(p, '\\'); 302 char *p3=strchrinline(p, '\\'); \ ??read_cfg_9: \ 0000019C 5C10A0E3 MOV R1,#+92 \ 000001A0 0600A0E1 MOV R0,R6 \ 000001A4 ........ BL strchrinline 303 p2=p3-1; \ 000001A8 017040E2 SUB R7,R0,#+1 304 do 305 { 306 if(*p2=='\\') \ ??read_cfg_12: \ 000001AC 0010D7E5 LDRB R1,[R7, #+0] \ 000001B0 5C0051E3 CMP R1,#+92 \ 000001B4 0200000A BEQ ??read_cfg_13 307 break; 308 p2--; 309 } 310 while(*p2>=SP_CHAR); \ 000001B8 011077E5 LDRB R1,[R7, #-1]! \ 000001BC 1F0051E3 CMP R1,#+31 \ 000001C0 F9FFFF2A BCS ??read_cfg_12 311 p2++; 312 name_len=p3-p2; \ ??read_cfg_13: \ 000001C4 017087E2 ADD R7,R7,#+1 \ ??read_cfg_11: \ 000001C8 07B040E0 SUB R11,R0,R7 313 break; 314 } 315 } 316 AddtoMenuList(p2, name_len, p, func_len, type, 0); \ ??read_cfg_10: \ 000001CC 0000A0E3 MOV R0,#+0 \ 000001D0 01002DE9 PUSH {R0} \ 000001D4 00022DE9 PUSH {R9} \ 000001D8 0830A0E1 MOV R3,R8 \ 000001DC 0620A0E1 MOV R2,R6 \ 000001E0 0B10A0E1 MOV R1,R11 \ 000001E4 0700A0E1 MOV R0,R7 \ 000001E8 ........ BL AddtoMenuList 317 p=pp; \ 000001EC 0470A0E1 MOV R7,R4 \ ??read_cfg_6: \ 000001F0 08D08DE2 ADD SP,SP,#+8 318 } 319 item_n++; 320 p=gotoRealPos(p); \ 000001F4 0700A0E1 MOV R0,R7 \ 000001F8 ........ BL gotoRealPos 321 } \ 000001FC 0010D0E5 LDRB R1,[R0, #+0] \ 00000200 015085E2 ADD R5,R5,#+1 \ 00000204 000051E3 CMP R1,#+0 \ 00000208 ADFFFF1A BNE ??read_cfg_4 322 return item_n; \ ??read_cfg_3: \ 0000020C 0500A0E1 MOV R0,R5 \ 00000210 1CD08DE2 ADD SP,SP,#+28 \ 00000214 F08BBDE8 POP {R4-R9,R11,PC} \ ??read_cfg_0: \ 00000218 ........ DC32 `?` 323 } 324 \ In segment CODE, align 4, keep-with-next 325 void save_file(void) 326 { \ save_file: \ 00000000 F0402DE9 PUSH {R4-R7,LR} 327 char temp[256]; 328 MENU_LIST *ml=mltop; \ 00000004 ........ LDR R4,??DataTable7 ;; buf \ 00000008 41DF4DE2 SUB SP,SP,#+260 \ 0000000C 045094E5 LDR R5,[R4, #+4] 329 int f; 330 unsigned int err; 331 if(!ml) \ 00000010 000055E3 CMP R5,#+0 \ 00000014 4100000A BEQ ??save_file_0 332 return; 333 if((f=fopen(CFG_PATH_DEBUG, A_ReadWrite+A_Create+A_Truncate+A_BIN, P_READ+P_WRITE, &err))==-1) \ 00000018 08019FE5 LDR R0,??save_file_1 ;; `?_1` \ 0000001C 0D30A0E1 MOV R3,SP \ 00000020 602FA0E3 MOV R2,#+384 \ 00000024 0210A0E3 MOV R1,#+2 \ 00000028 831C81E3 ORR R1,R1,#0x8300 \ 0000002C 0A0000EF SWI +10 \ 00000030 0060A0E1 MOV R6,R0 \ 00000034 010076E3 CMN R6,#+1 \ 00000038 0070A0E3 MOV R7,#+0 \ 0000003C 3700000A BEQ ??save_file_0 334 return; 335 //do 336 while(ml) 337 { 338 if(ml==mltop) \ ??save_file_2: \ 00000040 040094E5 LDR R0,[R4, #+4] \ 00000044 000055E1 CMP R5,R0 \ 00000048 0A00001A BNE ??save_file_3 339 { 340 temp[0]=0xEF; //UTF8 文件头 \ 0000004C EF10A0E3 MOV R1,#+239 \ 00000050 0410CDE5 STRB R1,[SP, #+4] 341 temp[1]=0xBB; \ 00000054 BB10A0E3 MOV R1,#+187 \ 00000058 0510CDE5 STRB R1,[SP, #+5] 342 temp[2]=0xBF; \ 0000005C BF10A0E3 MOV R1,#+191 \ 00000060 0610CDE5 STRB R1,[SP, #+6] 343 fwrite(f, temp, 3, &err); \ 00000064 0D30A0E1 MOV R3,SP \ 00000068 0320A0E3 MOV R2,#+3 \ 0000006C 04108DE2 ADD R1,SP,#+4 \ 00000070 0600A0E1 MOV R0,R6 \ 00000074 0C0000EF SWI +12 344 } 345 strncpy(temp, ml->name, ml->name_len); \ ??save_file_3: \ 00000078 0C2095E5 LDR R2,[R5, #+12] \ 0000007C 081095E5 LDR R1,[R5, #+8] \ 00000080 04008DE2 ADD R0,SP,#+4 \ 00000084 160100EF SWI +278 346 temp[ml->name_len]='|'; \ 00000088 0C0095E5 LDR R0,[R5, #+12] \ 0000008C 04108DE2 ADD R1,SP,#+4 \ 00000090 7C20A0E3 MOV R2,#+124 \ 00000094 0120C0E7 STRB R2,[R0, +R1] 347 temp[ml->name_len+1]=0; \ 00000098 0C0095E5 LDR R0,[R5, #+12] \ 0000009C 010080E0 ADD R0,R0,R1 \ 000000A0 0170C0E5 STRB R7,[R0, #+1] 348 strncat(temp, ml->func, ml->func_len); \ 000000A4 142095E5 LDR R2,[R5, #+20] \ 000000A8 101095E5 LDR R1,[R5, #+16] \ 000000AC 04008DE2 ADD R0,SP,#+4 \ 000000B0 140100EF SWI +276 349 temp[ml->name_len+1+ml->func_len]='\n'; \ 000000B4 0C0095E5 LDR R0,[R5, #+12] \ 000000B8 141095E5 LDR R1,[R5, #+20] 350 temp[ml->name_len+2+ml->func_len]=0; 351 fwrite(f, temp, ml->name_len+2+ml->func_len, &err); \ 000000BC 0D30A0E1 MOV R3,SP \ 000000C0 000081E0 ADD R0,R1,R0 \ 000000C4 04108DE2 ADD R1,SP,#+4 \ 000000C8 010080E0 ADD R0,R0,R1 \ 000000CC 0A10A0E3 MOV R1,#+10 \ 000000D0 0110C0E5 STRB R1,[R0, #+1] \ 000000D4 0C0095E5 LDR R0,[R5, #+12] \ 000000D8 141095E5 LDR R1,[R5, #+20] \ 000000DC 000081E0 ADD R0,R1,R0 \ 000000E0 04108DE2 ADD R1,SP,#+4 \ 000000E4 010080E0 ADD R0,R0,R1 \ 000000E8 0270C0E5 STRB R7,[R0, #+2] \ 000000EC 140095E5 LDR R0,[R5, #+20] \ 000000F0 0C1095E5 LDR R1,[R5, #+12] \ 000000F4 000081E0 ADD R0,R1,R0 \ 000000F8 022080E2 ADD R2,R0,#+2 \ 000000FC 04108DE2 ADD R1,SP,#+4 \ 00000100 0600A0E1 MOV R0,R6 \ 00000104 0C0000EF SWI +12 352 ml=ml->next; \ 00000108 005095E5 LDR R5,[R5, #+0] 353 } \ 0000010C 000055E3 CMP R5,#+0 \ 00000110 CAFFFF1A BNE ??save_file_2 354 //while(ml=ml->next); 355 fclose(f, &err); \ 00000114 0D10A0E1 MOV R1,SP \ 00000118 0600A0E1 MOV R0,R6 \ 0000011C 0D0000EF SWI +13 356 } \ ??save_file_0: \ 00000120 41DF8DE2 ADD SP,SP,#+260 ;; stack cleaning \ 00000124 F080BDE8 POP {R4-R7,PC} ;; return \ ??save_file_1: \ 00000128 ........ DC32 `?_1` 357 \ In segment CODE, align 4, keep-with-next 358 void save_ml(void) 359 { \ save_ml: \ 00000000 70402DE9 PUSH {R4-R6,LR} 360 char *name=malloc(128); 361 char *func=malloc(128); 362 int utf8conv_res_len; 363 ws_2utf8(ws_edit_nametmp, name, &utf8conv_res_len, 128); \ 00000004 ........ LDR R4,??DataTable7 ;; buf \ 00000008 04D04DE2 SUB SP,SP,#+4 \ 0000000C 8000A0E3 MOV R0,#+128 \ 00000010 140000EF SWI +20 \ 00000014 0060A0E1 MOV R6,R0 \ 00000018 8000A0E3 MOV R0,#+128 \ 0000001C 140000EF SWI +20 \ 00000020 0050A0E1 MOV R5,R0 \ 00000024 140094E5 LDR R0,[R4, #+20] \ 00000028 8030A0E3 MOV R3,#+128 \ 0000002C 0D20A0E1 MOV R2,SP \ 00000030 0610A0E1 MOV R1,R6 \ 00000034 E20100EF SWI +482 364 ws_2str(ws_edit_functmp, func, 128); \ 00000038 180094E5 LDR R0,[R4, #+24] \ 0000003C 8020A0E3 MOV R2,#+128 \ 00000040 0510A0E1 MOV R1,R5 \ 00000044 A30000EF SWI +163 365 if (ml_edit_tmp) \ 00000048 1C0094E5 LDR R0,[R4, #+28] \ 0000004C 000050E3 CMP R0,#+0 \ 00000050 1900000A BEQ ??save_ml_0 366 { 367 if(ml_edit_tmp->IsEdited) \ 00000054 1C1090E5 LDR R1,[R0, #+28] \ 00000058 000051E3 CMP R1,#+0 \ 0000005C 0400000A BEQ ??save_ml_1 368 { 369 mfree(ml_edit_tmp->name); \ 00000060 080090E5 LDR R0,[R0, #+8] \ 00000064 150000EF SWI +21 370 mfree(ml_edit_tmp->func); \ 00000068 1C0094E5 LDR R0,[R4, #+28] \ 0000006C 100090E5 LDR R0,[R0, #+16] \ 00000070 150000EF SWI +21 371 } 372 ml_edit_tmp->name=name; \ ??save_ml_1: \ 00000074 1C0094E5 LDR R0,[R4, #+28] \ 00000078 086080E5 STR R6,[R0, #+8] 373 ml_edit_tmp->func=func; \ 0000007C 105080E5 STR R5,[R0, #+16] 374 ml_edit_tmp->name_len=strlen(name); \ 00000080 0600A0E1 MOV R0,R6 \ 00000084 1B0000EF SWI +27 \ 00000088 1C1094E5 LDR R1,[R4, #+28] \ 0000008C 0C0081E5 STR R0,[R1, #+12] 375 ml_edit_tmp->func_len=strlen(func); \ 00000090 0500A0E1 MOV R0,R5 \ 00000094 1B0000EF SWI +27 \ 00000098 1C1094E5 LDR R1,[R4, #+28] \ 0000009C 140081E5 STR R0,[R1, #+20] 376 ml_edit_tmp->type=CheckType(func); \ 000000A0 0500A0E1 MOV R0,R5 \ 000000A4 ........ BL CheckType \ 000000A8 1C1094E5 LDR R1,[R4, #+28] \ 000000AC 180081E5 STR R0,[R1, #+24] 377 ml_edit_tmp->IsEdited=1; \ 000000B0 0100A0E3 MOV R0,#+1 \ 000000B4 1C0081E5 STR R0,[R1, #+28] 378 } 379 ml_edit_tmp=0; \ 000000B8 0000A0E3 MOV R0,#+0 \ ??save_ml_0: \ 000000BC 1C0084E5 STR R0,[R4, #+28] 380 save_file(); \ 000000C0 ........ BL save_file 381 //ShowMSG(1, (int)"Menu Changed"); 382 } \ 000000C4 7180BDE8 POP {R0,R4-R6,PC} ;; return 383 \ In segment CODE, align 4, keep-with-next 384 int menu_onkey(void *data, GUI_MSG *msg) 385 { \ menu_onkey: \ 00000000 10402DE9 PUSH {R4,LR} \ 00000004 0140A0E1 MOV R4,R1 386 MENU_LIST *ml=get_mlitem(GetCurMenuItem(data)); \ 00000008 8F0100EF SWI +399 \ 0000000C ........ BL get_mlitem 387 ml_edit_tmp=ml; \ 00000010 AC109FE5 LDR R1,??menu_onkey_0 ;; buf + 28 388 if(msg->gbsmsg->msg==KEY_DOWN) \ 00000014 9330A0E3 MOV R3,#+147 \ 00000018 000081E5 STR R0,[R1, #+0] \ 0000001C 041094E5 LDR R1,[R4, #+4] \ 00000020 403F83E3 ORR R3,R3,#0x100 \ 00000024 042091E5 LDR R2,[R1, #+4] \ 00000028 030052E1 CMP R2,R3 \ 0000002C 2200001A BNE ??menu_onkey_1 389 { 390 int i=msg->gbsmsg->submess; \ 00000030 081091E5 LDR R1,[R1, #+8] 391 switch(i) \ 00000034 012051E2 SUBS R2,R1,#+1 \ 00000038 0D00000A BEQ ??menu_onkey_2 \ 0000003C 032052E2 SUBS R2,R2,#+3 \ 00000040 0400000A BEQ ??menu_onkey_3 \ 00000044 162052E2 SUBS R2,R2,#+22 \ 00000048 0400000A BEQ ??menu_onkey_4 \ 0000004C 102052E2 SUBS R2,R2,#+16 \ 00000050 0A00000A BEQ ??menu_onkey_5 \ 00000054 0E0000EA B ??menu_onkey_6 392 { 393 case RIGHT_SOFT: 394 return 1; \ ??menu_onkey_3: \ 00000058 0100A0E3 MOV R0,#+1 \ 0000005C 1080BDE8 POP {R4,PC} 395 case ENTER_BUTTON: 396 if(ml) \ ??menu_onkey_4: \ 00000060 000050E3 CMP R0,#+0 \ 00000064 0300000A BEQ ??menu_onkey_7 397 { 398 edit_ml(ml); \ 00000068 ........ _BLF edit_ml,??edit_ml??rA 399 } 400 return -1; \ 0000006C 0000E0E3 MVN R0,#+0 \ 00000070 1080BDE8 POP {R4,PC} 401 case LEFT_SOFT: 402 show_option_menu(); \ ??menu_onkey_2: \ 00000074 ........ _BLF show_option_menu,??show_option_menu??rA 403 return -1; \ ??menu_onkey_7: \ 00000078 0000E0E3 MVN R0,#+0 \ 0000007C 1080BDE8 POP {R4,PC} 404 case '*': 405 ShowMSG(1, (int)COPYRIGHT); \ ??menu_onkey_5: \ 00000080 40109FE5 LDR R1,??menu_onkey_0+0x4 ;; `?` \ 00000084 0100A0E3 MOV R0,#+1 \ 00000088 480100EF SWI +328 406 return 0; \ 0000008C 0000A0E3 MOV R0,#+0 \ 00000090 1080BDE8 POP {R4,PC} 407 } 408 if(i>='0'&&i<='9') \ ??menu_onkey_6: \ 00000094 300051E3 CMP R1,#+48 \ 00000098 070000BA BLT ??menu_onkey_1 \ 0000009C 3A0051E3 CMP R1,#+58 \ 000000A0 050000AA BGE ??menu_onkey_1 409 { 410 if(i=='0') \ 000000A4 300051E3 CMP R1,#+48 411 i=9; \ 000000A8 0910A003 MOVEQ R1,#+9 412 else 413 i-='1'; \ 000000AC 31104112 SUBNE R1,R1,#+49 414 ml=get_mlitem(i); \ 000000B0 0100A0E1 MOV R0,R1 \ 000000B4 ........ BL get_mlitem 415 if(ml) \ 000000B8 E8FFFFEA B ??menu_onkey_4 416 { 417 edit_ml(ml); 418 } 419 return -1; 420 } 421 } 422 return 0; \ ??menu_onkey_1: \ 000000BC 0000A0E3 MOV R0,#+0 \ 000000C0 1080BDE8 POP {R4,PC} ;; return \ ??menu_onkey_0: \ 000000C4 ........ DC32 buf + 28 \ 000000C8 ........ DC32 `?` 423 } 424 \ In segment CODE, align 4, keep-with-next 425 void menu_ghook(void *data, int cmd) 426 { \ menu_ghook: \ 00000000 00402DE9 PUSH {LR} 427 if (cmd==0x0A) \ 00000004 0A0051E3 CMP R1,#+10 \ 00000008 0080BD18 POPNE {PC} 428 DisableIDLETMR(); \ 0000000C 7F0100EF SWI +383 429 //if (cmd==3) 430 } \ 00000010 0080BDE8 POP {PC} ;; return 431 \ In segment CODE, align 4, keep-with-next 432 void menu_iconhndl(void *data, int curitem, void *unk) 433 { \ menu_iconhndl: \ 00000000 F0412DE9 PUSH {R4-R8,LR} \ 00000004 0040A0E1 MOV R4,R0 \ 00000008 0150A0E1 MOV R5,R1 434 MENU_LIST *ml; 435 void *item=AllocMenuItem(data); \ 0000000C 970100EF SWI +407 \ 00000010 0060A0E1 MOV R6,R0 436 ml=get_mlitem(curitem); \ 00000014 0500A0E1 MOV R0,R5 \ 00000018 ........ BL get_mlitem \ 0000001C 0070B0E1 MOVS R7,R0 437 WSHDR *ws; 438 if(ml) \ 00000020 0800000A BEQ ??menu_iconhndl_0 439 { 440 ws=AllocMenuWS(data, ml->name_len+2); \ 00000024 0C0097E5 LDR R0,[R7, #+12] \ 00000028 021080E2 ADD R1,R0,#+2 \ 0000002C 0400A0E1 MOV R0,R4 \ 00000030 980100EF SWI +408 441 utf8_2ws(ws, ml->name, ml->name_len); \ 00000034 0C2097E5 LDR R2,[R7, #+12] \ 00000038 081097E5 LDR R1,[R7, #+8] \ 0000003C 0080A0E1 MOV R8,R0 \ 00000040 E30100EF SWI +483 \ 00000044 060000EA B ??menu_iconhndl_1 442 } 443 else 444 { 445 ws=AllocMenuWS(data,16); \ ??menu_iconhndl_0: \ 00000048 1010A0E3 MOV R1,#+16 \ 0000004C 0400A0E1 MOV R0,R4 \ 00000050 980100EF SWI +408 446 wsprintf(ws, _percent_t, ERR_STR); \ 00000054 24209FE5 LDR R2,??menu_iconhndl_2+0x4 ;; `?` \ 00000058 0080A0E1 MOV R8,R0 \ 0000005C 061F8FE2 ADR R1,??menu_iconhndl_2 ;; "%t" \ 00000060 240100EF SWI +292 447 } 448 //SetMenuItemIconArray(data, item, &MenuItenIcon); 449 SetMenuItemText(data,item,ws,curitem); \ ??menu_iconhndl_1: \ 00000064 0530A0E1 MOV R3,R5 \ 00000068 0820A0E1 MOV R2,R8 \ 0000006C 0610A0E1 MOV R1,R6 \ 00000070 0400A0E1 MOV R0,R4 \ 00000074 9A0100EF SWI +410 450 } \ 00000078 F081BDE8 POP {R4-R8,PC} ;; return \ ??menu_iconhndl_2: \ 0000007C 25740000 DC8 "%t",+0 \ 00000080 ........ DC32 `?` \ In segment DATA_C, align 4, align-sorted \ menuheader: \ 00000000 000000000000 DC16 0, 0, 0, 0 \ 0000 \ 00000008 00000000.... DC32 0H, `?`, 2147483647 \ ....FFFFFF7F 451 452 const MENU_DESC main_menu= \ main_menu: \ 00000014 08000000.... DC32 8, menu_onkey, menu_ghook, 0H, menusoftkeys, menu_skt, 16 \ ............ \ 00000000.... \ ............ \ 10000000 \ 00000030 ........0000 DC32 menu_iconhndl, 0H, 0H, 0 \ 000000000000 \ 00000000 453 { 454 8, 455 menu_onkey, 456 menu_ghook, 457 NULL, 458 menusoftkeys, 459 &menu_skt, 460 0x10, 461 menu_iconhndl, 462 NULL, //Items 463 NULL, //Procs 464 0 //n 465 }; 466 467 \ In segment CODE, align 4, keep-with-next 468 void maincsm_oncreate(CSM_RAM *data) 469 { \ maincsm_oncreate: \ 00000000 70402DE9 PUSH {R4-R6,LR} 470 ws_edit_nametmp=AllocWS(128); \ 00000004 ........ LDR R5,??DataTable8 ;; buf 471 ws_edit_functmp=AllocWS(128); 472 buf=malloc(BUF_SIZE); 473 MAIN_CSM *csm=(MAIN_CSM*)data; 474 menu_item_n=read_cfg(); 475 patch_header(&menuheader); \ 00000008 8C609FE5 LDR R6,??maincsm_oncreate_0 ;; menuheader \ 0000000C 0040A0E1 MOV R4,R0 \ 00000010 8000A0E3 MOV R0,#+128 \ 00000014 250100EF SWI +293 \ 00000018 140085E5 STR R0,[R5, #+20] \ 0000001C 8000A0E3 MOV R0,#+128 \ 00000020 250100EF SWI +293 \ 00000024 180085E5 STR R0,[R5, #+24] \ 00000028 800DA0E3 MOV R0,#+8192 \ 0000002C 140000EF SWI +20 \ 00000030 000085E5 STR R0,[R5, #+0] \ 00000034 ........ BL read_cfg \ 00000038 100085E5 STR R0,[R5, #+16] \ 0000003C 0000A0E3 MOV R0,#+0 \ 00000040 B000C6E1 STRH R0,[R6, #+0] \ 00000044 1800A0E3 MOV R0,#+24 \ 00000048 B200C6E1 STRH R0,[R6, #+2] \ 0000004C 888100EF SWI +33160 \ 00000050 010040E2 SUB R0,R0,#+1 \ 00000054 B400C6E1 STRH R0,[R6, #+4] \ 00000058 8A8100EF SWI +33162 \ 0000005C 170080E2 ADD R0,R0,#+23 \ 00000060 B600C6E1 STRH R0,[R6, #+6] 476 csm->gui_id=MAIN_GUI_ID=CreateMenu(0, 0, &main_menu, &menuheader, 0, menu_item_n, 0, 0); \ 00000064 0000A0E3 MOV R0,#+0 \ 00000068 01002DE9 PUSH {R0} \ 0000006C 01002DE9 PUSH {R0} \ 00000070 100095E5 LDR R0,[R5, #+16] \ 00000074 0630A0E1 MOV R3,R6 \ 00000078 01002DE9 PUSH {R0} \ 0000007C 142086E2 ADD R2,R6,#+20 \ 00000080 0010A0E3 MOV R1,#+0 \ 00000084 0000A0E3 MOV R0,#+0 \ 00000088 01002DE9 PUSH {R0} \ 0000008C 520100EF SWI +338 \ 00000090 0C0085E5 STR R0,[R5, #+12] \ 00000094 280084E5 STR R0,[R4, #+40] 477 } \ 00000098 7F80BDE8 POP {R0-R6,PC} ;; return \ ??maincsm_oncreate_0: \ 0000009C ........ DC32 menuheader 478 \ In segment CODE, align 4, keep-with-next 479 int maincsm_onmessage(CSM_RAM *data, GBS_MSG *msg) 480 { \ maincsm_onmessage: \ 00000000 30402DE9 PUSH {R4,R5,LR} 481 MAIN_CSM *csm=(MAIN_CSM*)data; 482 if (msg->msg==MSG_GUI_DESTROYED) \ 00000004 0E20A0E3 MOV R2,#+14 \ 00000008 0040A0E1 MOV R4,R0 \ 0000000C 040091E5 LDR R0,[R1, #+4] \ 00000010 642C82E3 ORR R2,R2,#0x6400 \ 00000014 020050E1 CMP R0,R2 \ 00000018 1700001A BNE ??maincsm_onmessage_0 483 { 484 if ((int)msg->data0==csm->gui_id) \ 0000001C 0C0091E5 LDR R0,[R1, #+12] \ 00000020 282094E5 LDR R2,[R4, #+40] 485 csm->csm.state=-3; 486 if ((int)msg->data0==EDGUI_ID) \ 00000024 ........ LDR R5,??DataTable7 ;; buf \ 00000028 020050E1 CMP R0,R2 \ 0000002C 0200E003 MVNEQ R0,#+2 \ 00000030 10008405 STREQ R0,[R4, #+16] \ 00000034 0C0091E5 LDR R0,[R1, #+12] \ 00000038 082095E5 LDR R2,[R5, #+8] \ 0000003C 020050E1 CMP R0,R2 \ 00000040 0D00001A BNE ??maincsm_onmessage_0 487 { 488 if ((int)msg->data1==1) \ 00000044 100091E5 LDR R0,[R1, #+16] \ 00000048 010050E3 CMP R0,#+1 \ 0000004C 0800001A BNE ??maincsm_onmessage_1 489 { 490 save_ml(); \ 00000050 ........ BL save_ml 491 void *gui=FindGUIbyId(csm->gui_id, NULL); \ 00000054 280094E5 LDR R0,[R4, #+40] \ 00000058 0010A0E3 MOV R1,#+0 \ 0000005C 090200EF SWI +521 492 if (gui) \ 00000060 000050E3 CMP R0,#+0 \ 00000064 0300000A BEQ ??maincsm_onmessage_2 493 { 494 Menu_SetItemCountDyn(gui, menu_item_n); \ 00000068 101095E5 LDR R1,[R5, #+16] \ 0000006C E60100EF SWI +486 495 RefreshGUI(); \ 00000070 960100EF SWI +406 496 } 497 //csm->gui_id=CreateMenu(0, 0, &main_menu, &menuheader, 0, menu_item_n, 0, 0); 498 } 499 EDGUI_ID=0; \ ??maincsm_onmessage_1: \ 00000074 0000A0E3 MOV R0,#+0 \ ??maincsm_onmessage_2: \ 00000078 080085E5 STR R0,[R5, #+8] 500 } 501 } 502 return(1); \ ??maincsm_onmessage_0: \ 0000007C 0100A0E3 MOV R0,#+1 \ 00000080 3080BDE8 POP {R4,R5,PC} ;; return 503 } 504 505 \ In segment CODE, align 4, keep-with-next 506 void Killer(void) 507 { \ Killer: \ 00000000 10402DE9 PUSH {R4,LR} 508 mfree(buf); \ 00000004 ........ LDR R4,??DataTable8 ;; buf \ 00000008 000094E5 LDR R0,[R4, #+0] \ 0000000C 150000EF SWI +21 509 FreeMenuList(); \ 00000010 ........ BL FreeMenuList 510 FreeWS(ws_edit_functmp); \ 00000014 180094E5 LDR R0,[R4, #+24] \ 00000018 290100EF SWI +297 511 FreeWS(ws_edit_nametmp); \ 0000001C 140094E5 LDR R0,[R4, #+20] \ 00000020 290100EF SWI +297 512 extern void *ELF_BEGIN; 513 extern void kill_data(void *p, void (*func_p)(void *)); 514 kill_data(&ELF_BEGIN,(void (*)(void *))mfree_adr()); \ 00000024 158000EF SWI +32789 \ 00000028 0010A0E1 MOV R1,R0 \ 0000002C 04009FE5 LDR R0,??Killer_0 ;; ELF_BEGIN \ 00000030 1040BDE8 POP {R4,LR} ;; Pop \ 00000034 ........ _BF kill_data,??kill_data??rA ;; tailcall \ ??Killer_0: \ 00000038 ........ DC32 ELF_BEGIN 515 } 516 \ In segment CODE, align 4, keep-with-next 517 void maincsm_onclose(CSM_RAM *csm) 518 { 519 SUBPROC((void *)Killer); \ maincsm_onclose: \ 00000000 08009FE5 LDR R0,??maincsm_onclose_0 ;; Killer \ 00000004 00402DE9 PUSH {LR} \ 00000008 710100EF SWI +369 520 } \ 0000000C 0080BDE8 POP {PC} ;; return \ ??maincsm_onclose_0: \ 00000010 ........ DC32 Killer 521 \ In segment DATA_C, align 4, align-sorted 522 const int minus11=-11; \ minus11: \ 00000000 F5FFFFFF DC32 -11 \ In segment DATA_C, align 4, align-sorted 523 const unsigned short maincsm_name_body[140]; \ maincsm_name_body: \ 00000000 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000010 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000020 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000030 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000040 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000050 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000060 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000070 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000080 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000090 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 000000A0 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 000000B0 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 000000C0 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 000000D0 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 000000E0 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 000000F0 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000100 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ 000000000000 \ 00000000 \ 00000110 000000000000 DC8 0, 0, 0, 0, 0, 0, 0, 0 \ 0000 524 525 const struct 526 { 527 CSM_DESC maincsm; 528 WSHDR maincsm_name; \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 4D794D656E75 DC8 "MyMenu2_Editor" \ 325F45646974 \ 6F7200 \ 0000000F 00 DC8 0 529 }MAINCSM = \ MAINCSM: \ 00000010 ............ DC32 maincsm_onmessage, maincsm_oncreate, 0, 0, 0, 0, maincsm_onclose \ ....00000000 \ 000000000000 \ 000000000000 \ ........ \ 0000002C 2C0000000100 DC32 44, 1, minus11, maincsm_name_body, 55AACCCCH, 3333AA55H, 0 \ 0000........ \ ........CCCC \ AA5555AA3333 \ 00000000 \ 00000048 8B00 DC16 139 \ 0000004A 0000 DC8 0, 0 530 { 531 { 532 maincsm_onmessage, 533 maincsm_oncreate, 534 #ifdef NEWSGOLD 535 0, 536 0, 537 0, 538 0, 539 #endif 540 maincsm_onclose, 541 sizeof(MAIN_CSM), 542 1, 543 &minus11 544 }, 545 { 546 (unsigned short *)maincsm_name_body, 547 NAMECSM_MAGIC1, 548 NAMECSM_MAGIC2, 549 0x0, 550 139 551 } 552 }; 553 \ In segment CODE, align 4, keep-with-next 554 void UpdateCSMname(void) 555 { 556 wsprintf((WSHDR *)(&MAINCSM.maincsm_name), ELFNAME); \ UpdateCSMname: \ 00000000 10009FE5 LDR R0,??UpdateCSMname_0 ;; `?` \ 00000004 00402DE9 PUSH {LR} \ 00000008 0010A0E1 MOV R1,R0 \ 0000000C 380080E2 ADD R0,R0,#+56 \ 00000010 240100EF SWI +292 557 } \ 00000014 0080BDE8 POP {PC} ;; return \ ??UpdateCSMname_0: \ 00000018 ........ DC32 `?` 558 \ In segment CODE, align 4, keep-with-next 559 int main(void) 560 { \ main: \ 00000000 00402DE9 PUSH {LR} \ 00000004 2CD04DE2 SUB SP,SP,#+44 561 char dummy[sizeof(MAIN_CSM)]; 562 UpdateCSMname(); \ 00000008 ........ BL UpdateCSMname 563 LockSched(); \ 0000000C 460100EF SWI +326 564 CreateCSM(&MAINCSM.maincsm,dummy,0); \ 00000010 18009FE5 LDR R0,??main_0 ;; `?` + 16 \ 00000014 0020A0E3 MOV R2,#+0 \ 00000018 0D10A0E1 MOV R1,SP \ 0000001C 070100EF SWI +263 565 UnlockSched(); \ 00000020 470100EF SWI +327 566 return 0; \ 00000024 0000A0E3 MOV R0,#+0 \ 00000028 2CD08DE2 ADD SP,SP,#+44 \ 0000002C 0080BDE8 POP {PC} ;; return \ ??main_0: \ 00000030 ........ DC32 `?` + 16 567 } \ In segment CODE, align 4, keep-with-next \ ??DataTable2: \ 00000000 ........ DC32 buf + 4 \ In segment CODE, align 4, keep-with-next \ ??DataTable7: \ 00000000 ........ DC32 buf \ In segment CODE, align 4, keep-with-next \ ??DataTable8: \ 00000000 ........ DC32 buf \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 4D656E7500 DC8 "Menu" \ 00000005 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 4578697400 DC8 "Exit" \ 00000005 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 343A5C5A4269 DC8 "4:\\ZBin\\etc\\MyMenu2.cfg" \ 6E5C6574635C \ 4D794D656E75 \ 322E63666700 \ In segment DATA_C, align 4, align-sorted \ `?_1`: \ 00000000 343A5C5A4269 DC8 "4:\\ZBin\\etc\\MyMenu2.cfg" \ 6E5C6574635C \ 4D794D656E75 \ 322E63666700 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 4D794D656E75 DC8 "MyMenu2_Editor\012(c)BingK(binghelingxi)" \ 325F45646974 \ 6F720A286329 \ 42696E674B28 \ 62696E676865 \ 6C696E677869 \ 2900 \ 00000026 0000 DC8 0, 0 \ In segment DATA_C, align 1, align-sorted \ 00000000 257400 DC8 "%t" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 4552522100 DC8 "ERR!" \ 00000005 000000 DC8 0, 0, 0 568 569 Maximum stack usage in bytes: Function CSTACK -------- ------ AddtoMenuList 28 CheckType 4 FreeMenuList 12 Killer 8 UpdateCSMname 4 get_mlitem 0 gotoLineEnd 0 gotoRealPos 0 main 48 maincsm_onclose 4 maincsm_oncreate 32 maincsm_onmessage 12 menu_ghook 4 menu_iconhndl 24 menu_onkey 8 read_cfg 72 save_file 280 save_ml 20 strchrinline 0 utf8_2str 0 Segment part sizes: Function/Label Bytes -------------- ----- buf 32 menusoftkeys 12 menu_sk 24 menu_skt 8 utf8_2str 120 AddtoMenuList 132 FreeMenuList 72 get_mlitem 56 strchrinline 48 gotoRealPos 32 gotoLineEnd 32 CheckType 92 read_cfg 540 save_file 300 save_ml 200 menu_onkey 204 menu_ghook 20 menu_iconhndl 132 menuheader 64 maincsm_oncreate 160 maincsm_onmessage 132 Killer 60 maincsm_onclose 20 minus11 4 maincsm_name_body 280 ? 76 UpdateCSMname 28 main 52 ??DataTable2 4 ??DataTable7 4 ??DataTable8 4 ? 8 ? 8 ? 24 ?_1 24 ? 40 ? 3 ? 8 Others 128 2 560 bytes in segment CODE 583 bytes in segment DATA_C 32 bytes in segment DATA_Z 12 bytes in segment INITTAB 2 444 bytes of CODE memory (+ 128 bytes shared) 583 bytes of CONST memory 32 bytes of DATA memory Errors: none Warnings: none