############################################################################## # # # IAR ARM ANSI C/C++ Compiler V4.42A/W32 EVALUATION 04/Apr/2008 21:12:44 # # Copyright 1999-2005 IAR Systems. All rights reserved. # # # # Cpu mode = interwork # # Endian = little # # Stack alignment = 4 # # Source file = D:\Pasha\elf\_MY_PROJECT_\naticq_mod\status_change.c # # Command line = D:\Pasha\elf\_MY_PROJECT_\naticq_mod\status_change.c # # --preprocess D:\Pasha\elf\_MY_PROJECT_\naticq_mod\R # # elease_SGOLD\List\ -lC D:\Pasha\elf\_MY_PROJECT_\nat # # icq_mod\Release_SGOLD\List\ -o # # D:\Pasha\elf\_MY_PROJECT_\naticq_mod\Release_SGOLD\O # # bj\ -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\_MY_PROJECT_\naticq_mod\Release_SGOLD\L # # ist\status_change.lst # # Object file = D:\Pasha\elf\_MY_PROJECT_\naticq_mod\Release_SGOLD\O # # bj\status_change.r79 # # # # # ############################################################################## D:\Pasha\elf\_MY_PROJECT_\naticq_mod\status_change.c 1 /* 2 Интерфейс и функции смены своего статуса 3 */ 4 #include "../inc/swilib.h" 5 #include "../inc/cfg_items.h" 6 #include "../inc/pnglist.h" 7 #include "NatICQ.h" 8 #include "main.h" 9 #include "status_change.h" 10 #include "strings.h" 11 #include "language.h" 12 13 //=============================================================================================== 14 // ELKA Compatibility 15 #pragma inline 16 static void patch_header(const HEADER_DESC* head) 17 { 18 ((HEADER_DESC *)head)->rc.x=0; 19 ((HEADER_DESC *)head)->rc.y=YDISP; 20 ((HEADER_DESC *)head)->rc.x2=ScreenW()-1; 21 ((HEADER_DESC *)head)->rc.y2=HeaderH()-1+YDISP; 22 } 23 #pragma inline 24 void patch_input(const INPUTDIA_DESC* inp) 25 { 26 ((INPUTDIA_DESC *)inp)->rc.x = 0; 27 ((INPUTDIA_DESC *)inp)->rc.y = HeaderH() + 1 + YDISP; 28 ((INPUTDIA_DESC *)inp)->rc.x2=ScreenW() - 1; 29 ((INPUTDIA_DESC *)inp)->rc.y2=ScreenH() - SoftkeyH() - 1; 30 } 31 //=============================================================================================== 32 33 extern char TEMPLATES_PATH[]; \ In segment DATA_C, align 4, align-sorted 34 static const char XS_FILE_NAME[]="\\XStatuses.txt"; \ XS_FILE_NAME: \ 00000000 5C5853746174 DC8 "\\XStatuses.txt" \ 757365732E74 \ 787400 \ 0000000F 00 DC8 0 35 36 \ In segment DATA_Z, align 4, align-sorted 37 char *XStatusText; \ XStatusText: \ 00000000 DS8 4 38 39 extern int CurrentStatus; 40 extern int CurrentXStatus; 41 extern int S_ICONS[]; 42 #ifdef ELKA 43 extern void SetIconBarHandler(); 44 #endif 45 #pragma inline 46 static void Change_Status(int status) 47 { 48 CurrentStatus=status; 49 set_my_status(); 50 #ifdef ELAK 51 SetIconBarHandler(); 52 #endif 53 SUBPROC((void*)WriteDefSettings); 54 } 55 56 #pragma inline 57 static void Change_XStatus(int xstatus) 58 { 59 CurrentXStatus=xstatus; 60 set_my_xstatus(); 61 #ifdef ELKA 62 SetIconBarHandler(); 63 #endif 64 SUBPROC((void*)WriteDefSettings); 65 } 66 67 /////////////////////////////////////////////////////////////////////////////// 68 #pragma inline 69 static unsigned int GetStatusIndexInMenu(unsigned int status) 70 { 71 switch(status) 72 { 73 case IS_ONLINE: {return 0;} 74 case IS_AWAY: {return 1;} 75 case IS_NA: {return 2;} 76 case IS_DND: {return 3;} 77 case IS_OCCUPIED: {return 4;} 78 case IS_FFC: {return 5;} 79 case IS_INVISIBLE: {return 6;} 80 case IS_DEPRESSION: return 7; 81 case IS_EVIL: return 8; 82 case IS_HOME: return 9; 83 case IS_LUNCH: return 10; 84 case IS_WORK: return 11; 85 } 86 return 0; 87 } 88 89 #pragma inline 90 static unsigned int GetStatusInMenuByPos(int pos) 91 { 92 switch(pos) 93 { 94 case 0: 95 return IS_ONLINE; 96 case 1: 97 return IS_AWAY; 98 case 2: 99 return IS_NA; 100 case 3: 101 return IS_DND; 102 case 4: 103 return IS_OCCUPIED; 104 case 5: 105 return IS_FFC; 106 case 6: 107 return IS_INVISIBLE; 108 case 7: 109 return IS_DEPRESSION; 110 case 8: 111 return IS_EVIL; 112 case 9: 113 return IS_HOME; 114 case 10: 115 return IS_LUNCH; 116 case 11: 117 return IS_WORK; 118 } 119 return IS_UNKNOWN; 120 } 121 \ In segment CODE, align 4, keep-with-next 122 static int st_onkey(void *data, GUI_MSG *msg) 123 { \ st_onkey: \ 00000000 00402DE9 PUSH {LR} 124 int i; 125 if (msg->keys==0x18 || msg->keys==0x3D) \ 00000004 F210D1E1 LDRSH R1,[R1, #+2] \ 00000008 180051E3 CMP R1,#+24 \ 0000000C 3D005113 CMPNE R1,#+61 \ 00000010 2800001A BNE ??st_onkey_1 126 { 127 i=GetCurMenuItem(data); 128 Change_Status(GetStatusInMenuByPos(i)); \ 00000014 8F0100EF SWI +399 \ 00000018 0B0050E3 CMP R0,#+11 \ 0000001C 1D00008A BHI ??st_onkey_2 \ 00000020 011F8FE2 ADR R1,??st_onkey_0 \ 00000024 0010D1E7 LDRB R1,[R1, R0] \ 00000028 01F18FE0 ADD PC,PC,R1, LSL #+2 \ ??st_onkey_0: \ 0000002C 02040608 DC8 +2,+4,+6,+8 \ 00000030 0A0C0E10 DC8 +10,+12,+14,+16 \ 00000034 12141618 DC8 +18,+20,+22,+24 \ ??st_onkey_3: \ 00000038 0B00A0E3 MOV R0,#+11 \ 0000003C 160000EA B ??st_onkey_4 \ ??st_onkey_5: \ 00000040 0200A0E3 MOV R0,#+2 \ 00000044 140000EA B ??st_onkey_4 \ ??st_onkey_6: \ 00000048 0300A0E3 MOV R0,#+3 \ 0000004C 120000EA B ??st_onkey_4 \ ??st_onkey_7: \ 00000050 0500A0E3 MOV R0,#+5 \ 00000054 100000EA B ??st_onkey_4 \ ??st_onkey_8: \ 00000058 0400A0E3 MOV R0,#+4 \ 0000005C 0E0000EA B ??st_onkey_4 \ ??st_onkey_9: \ 00000060 0C00A0E3 MOV R0,#+12 \ 00000064 0C0000EA B ??st_onkey_4 \ ??st_onkey_10: \ 00000068 0100A0E3 MOV R0,#+1 \ 0000006C 0A0000EA B ??st_onkey_4 \ ??st_onkey_11: \ 00000070 0600A0E3 MOV R0,#+6 \ 00000074 080000EA B ??st_onkey_4 \ ??st_onkey_12: \ 00000078 0700A0E3 MOV R0,#+7 \ 0000007C 060000EA B ??st_onkey_4 \ ??st_onkey_13: \ 00000080 0800A0E3 MOV R0,#+8 \ 00000084 040000EA B ??st_onkey_4 \ ??st_onkey_14: \ 00000088 0900A0E3 MOV R0,#+9 \ 0000008C 020000EA B ??st_onkey_4 \ ??st_onkey_15: \ 00000090 0A00A0E3 MOV R0,#+10 \ 00000094 000000EA B ??st_onkey_4 \ ??st_onkey_2: \ 00000098 0E00A0E3 MOV R0,#+14 \ ??st_onkey_4: \ 0000009C ........ LDR R1,??DataTable5 ;; CurrentStatus \ 000000A0 000081E5 STR R0,[R1, #+0] \ 000000A4 ........ _BLF set_my_status,??set_my_status??rA \ 000000A8 ........ LDR R0,??DataTable8 ;; WriteDefSettings \ 000000AC 710100EF SWI +369 129 return (1); \ 000000B0 0100A0E3 MOV R0,#+1 \ 000000B4 0080BDE8 POP {PC} 130 } 131 return (0); \ ??st_onkey_1: \ 000000B8 0000A0E3 MOV R0,#+0 \ 000000BC 0080BDE8 POP {PC} ;; return 132 } 133 134 /////////////////////////////////////////////////////////////////////////////// 135 136 #define STATUSES_NUM 12 137 \ In segment DATA_C, align 4, align-sorted 138 static const char * const menutexts[STATUSES_NUM]= \ menutexts: \ 00000000 ........ DC32 `?` \ 00000004 ........ DC32 `?` \ 00000008 ........ DC32 `?` \ 00000014 ........ DC32 `?` \ 00000024 ........ DC32 `?` \ 00000028 ........ DC32 `?` \ 0000002C ........ DC32 `?` \ 00000008 01000000 DC16 1, 0 \ 0000000C ........ DC32 `?` \ 00000010 3D000000 DC16 61, 0 \ 00000014 FBC0FF7F DC32 2147467515 \ In segment DATA_C, align 4, align-sorted \ st_menu_skt: \ 00000000 ........0000 DC32 st_menu_sk, 0 \ 0000 188 189 static const MENU_DESC st_tmenu= 190 { 191 8,st_onkey,stmenu_ghook,NULL, 192 st_menusoftkeys, 193 &st_menu_skt, 194 0x11,//MENU_FLAG, 195 st_icons_set, 196 NULL,//st_menuitems, 197 NULL, 198 STATUSES_NUM 199 }; 200 201 \ In segment CODE, align 4, keep-with-next 202 void DispStatusChangeMenu() 203 { 204 *((int **)(&st_menuhdr.icon))=S_ICONS+CurrentStatus; \ DispStatusChangeMenu: \ 00000000 ........ LDR R1,??DataTable4 ;; S_ICONS \ 00000004 70402DE9 PUSH {R4-R6,LR} \ 00000008 D8409FE5 LDR R4,??DispStatusChangeMenu_1 ;; st_menuhdr \ 0000000C ........ LDR R6,??DataTable5 ;; CurrentStatus 205 patch_header(&st_menuhdr); \ 00000010 0050A0E3 MOV R5,#+0 \ 00000014 000096E5 LDR R0,[R6, #+0] \ 00000018 005084E5 STR R5,[R4, #+0] \ 0000001C 000181E0 ADD R0,R1,R0, LSL #+2 \ 00000020 080084E5 STR R0,[R4, #+8] \ 00000024 888100EF SWI +33160 \ 00000028 010040E2 SUB R0,R0,#+1 \ 0000002C B400C4E1 STRH R0,[R4, #+4] \ 00000030 8A8100EF SWI +33162 \ 00000034 010040E2 SUB R0,R0,#+1 \ 00000038 B600C4E1 STRH R0,[R4, #+6] 206 CreateMenu(0,0,&st_tmenu,&st_menuhdr,GetStatusIndexInMenu(CurrentStatus),STATUSES_NUM,0,0); \ 0000003C 000096E5 LDR R0,[R6, #+0] \ 00000040 010040E2 SUB R0,R0,#+1 \ 00000044 0B0050E3 CMP R0,#+11 \ 00000048 1A00008A BHI ??DispStatusChangeMenu_2 \ 0000004C 011F8FE2 ADR R1,??DispStatusChangeMenu_0 \ 00000050 0010D1E7 LDRB R1,[R1, R0] \ 00000054 01F18FE0 ADD PC,PC,R1, LSL #+2 \ ??DispStatusChangeMenu_0: \ 00000058 0C020408 DC8 +12,+2,+4,+8 \ 0000005C 060E1012 DC8 +6,+14,+16,+18 \ 00000060 1416170A DC8 +20,+22,+23,+10 \ ??DispStatusChangeMenu_3: \ 00000064 0150A0E3 MOV R5,#+1 \ 00000068 120000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_4: \ 0000006C 0250A0E3 MOV R5,#+2 \ 00000070 100000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_5: \ 00000074 0350A0E3 MOV R5,#+3 \ 00000078 0E0000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_6: \ 0000007C 0450A0E3 MOV R5,#+4 \ 00000080 0C0000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_7: \ 00000084 0550A0E3 MOV R5,#+5 \ 00000088 0A0000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_8: \ 0000008C 0650A0E3 MOV R5,#+6 \ 00000090 080000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_9: \ 00000094 0750A0E3 MOV R5,#+7 \ 00000098 060000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_10: \ 0000009C 0850A0E3 MOV R5,#+8 \ 000000A0 040000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_11: \ 000000A4 0950A0E3 MOV R5,#+9 \ 000000A8 020000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_12: \ 000000AC 0A50A0E3 MOV R5,#+10 \ 000000B0 000000EA B ??DispStatusChangeMenu_2 \ ??DispStatusChangeMenu_13: \ 000000B4 0B50A0E3 MOV R5,#+11 \ ??DispStatusChangeMenu_2: \ 000000B8 0000A0E3 MOV R0,#+0 \ 000000BC 01002DE9 PUSH {R0} \ 000000C0 01002DE9 PUSH {R0} \ 000000C4 0430A0E1 MOV R3,R4 \ 000000C8 142084E2 ADD R2,R4,#+20 \ 000000CC 0010A0E3 MOV R1,#+0 \ 000000D0 0C00A0E3 MOV R0,#+12 \ 000000D4 01002DE9 PUSH {R0} \ 000000D8 20002DE9 PUSH {R5} \ 000000DC 0000A0E3 MOV R0,#+0 \ 000000E0 520100EF SWI +338 207 } \ 000000E4 7F80BDE8 POP {R0-R6,PC} ;; return \ ??DispStatusChangeMenu_1: \ 000000E8 ........ DC32 st_menuhdr 208 209 //-------------------------------- 210 // XStatuses 211 //-------------------------------- 212 extern DYNPNGICONLIST *XStatusesImgList; 213 extern int *XStatusesIconArray; 214 extern volatile int total_xstatuses; 215 \ In segment DATA_I, align 4, align-sorted 216 SOFTKEY_DESC edit_x_sk[]= \ edit_x_sk: \ 00000000 DS8 24 \ 00000018 REQUIRE `?` 217 { 218 {0x0018,0x0000,(int)"Save!"}, 219 {0x0001,0x0000,(int)""}, 220 {0x003D,0x0000,(int)LGP_DOIT_PIC} 221 }; 222 \ In segment DATA_I, align 4, align-sorted 223 SOFTKEYSTAB edit_x_skt= \ edit_x_skt: \ 00000000 DS8 8 \ 00000008 REQUIRE `?` 224 { 225 edit_x_sk,0 226 }; 227 \ In segment CODE, align 4, keep-with-next 228 void edit_xstatus_locret(void){} \ edit_xstatus_locret: \ 00000000 1EFF2FE1 BX LR ;; return 229 \ In segment CODE, align 4, keep-with-next 230 void ReplaceStr(char **str, int start_prev, int prev_len, char *next, int next_len) 231 { \ ReplaceStr: \ 00000000 F04F2DE9 PUSH {R4-R11,LR} \ 00000004 24809DE5 LDR R8,[SP, #+36] \ 00000008 0040A0E1 MOV R4,R0 232 char *d, *buf; 233 char *s=*str; \ 0000000C 009094E5 LDR R9,[R4, #+0] \ 00000010 0150A0E1 MOV R5,R1 \ 00000014 0260A0E1 MOV R6,R2 \ 00000018 0370A0E1 MOV R7,R3 234 if (s) \ 0000001C 000059E3 CMP R9,#+0 \ 00000020 F08FBD08 POPEQ {R4-R11,PC} 235 { 236 d=buf=malloc(strlen(s)+next_len-prev_len+1); \ 00000024 0900A0E1 MOV R0,R9 \ 00000028 1B0000EF SWI +27 \ 0000002C 000088E0 ADD R0,R8,R0 \ 00000030 060040E0 SUB R0,R0,R6 \ 00000034 010080E2 ADD R0,R0,#+1 \ 00000038 140000EF SWI +20 \ 0000003C 00B0A0E1 MOV R11,R0 \ 00000040 0BA0A0E1 MOV R10,R11 237 if (start_prev) \ 00000044 000055E3 CMP R5,#+0 \ 00000048 0300000A BEQ ??ReplaceStr_0 238 { 239 memcpy(buf, s, start_prev); \ 0000004C 0520A0E1 MOV R2,R5 \ 00000050 0910A0E1 MOV R1,R9 \ 00000054 1E0100EF SWI +286 240 buf+=start_prev; \ 00000058 0BB085E0 ADD R11,R5,R11 241 } 242 if (next_len) \ ??ReplaceStr_0: \ 0000005C 000058E3 CMP R8,#+0 \ 00000060 0400000A BEQ ??ReplaceStr_1 243 { 244 memcpy(buf,next,next_len); \ 00000064 0820A0E1 MOV R2,R8 \ 00000068 0710A0E1 MOV R1,R7 \ 0000006C 0B00A0E1 MOV R0,R11 \ 00000070 1E0100EF SWI +286 245 buf+=next_len; \ 00000074 0BB088E0 ADD R11,R8,R11 246 } 247 strcpy(buf, s+start_prev+prev_len); \ ??ReplaceStr_1: \ 00000078 090085E0 ADD R0,R5,R9 \ 0000007C 001086E0 ADD R1,R6,R0 \ 00000080 0B00A0E1 MOV R0,R11 \ 00000084 1A0000EF SWI +26 248 mfree(s); \ 00000088 0900A0E1 MOV R0,R9 \ 0000008C 150000EF SWI +21 249 *str=d; \ 00000090 00A084E5 STR R10,[R4, #+0] 250 } 251 } \ 00000094 F08FBDE8 POP {R4-R11,PC} ;; return 252 \ In segment CODE, align 4, keep-with-next 253 int edit_xstatus_onkey(GUI *data, GUI_MSG *msg) 254 { \ edit_xstatus_onkey: \ 00000000 F04F2DE9 PUSH {R4-R11,LR} \ 00000004 B8D04DE2 SUB SP,SP,#+184 \ 00000008 0040A0E1 MOV R4,R0 255 WSHDR *ws; 256 char *s, *d, tmp[132]; 257 int cur_x_st; 258 int len, l; 259 int is_any_change=0; 260 if (msg->keys==0xFFF) \ 0000000C F200D1E1 LDRSH R0,[R1, #+2] \ 00000010 0060A0E3 MOV R6,#+0 \ 00000014 FF10A0E3 MOV R1,#+255 \ 00000018 F01E81E3 ORR R1,R1,#0xF00 \ 0000001C 010050E1 CMP R0,R1 \ 00000020 9400001A BNE ??edit_xstatus_onkey_0 261 { 262 cur_x_st=(int)EDIT_GetUserPointer(data); \ 00000024 0400A0E1 MOV R0,R4 \ 00000028 DF0100EF SWI +479 \ 0000002C 0050A0E1 MOV R5,R0 263 EDITCONTROL ec; 264 ExtractEditControl(data,2,&ec); // Комментарий \ 00000030 08208DE2 ADD R2,SP,#+8 \ 00000034 0210A0E3 MOV R1,#+2 \ 00000038 0400A0E1 MOV R0,R4 \ 0000003C 690100EF SWI +361 265 ws=ec.pWS; \ 00000040 30809DE5 LDR R8,[SP, #+48] 266 267 s=GetXStatusStr(cur_x_st*3,&len); \ 00000044 851085E0 ADD R1,R5,R5, LSL #+1 268 d=tmp; 269 270 if (s) \ 00000048 ........ LDR R5,??DataTable20 ;; XStatusText \ 0000004C 04108DE5 STR R1,[SP, #+4] \ 00000050 04009DE5 LDR R0,[SP, #+4] \ 00000054 0D10A0E1 MOV R1,SP \ 00000058 ........ BL GetXStatusStr \ 0000005C 0090B0E1 MOVS R9,R0 \ 00000060 34A08DE2 ADD R10,SP,#+52 \ 00000064 2100000A BEQ ??edit_xstatus_onkey_1 271 { 272 l=ws->wsbody[0]; \ 00000068 000098E5 LDR R0,[R8, #+0] 273 for (int i=0; iwsbody[i+1]); \ ??edit_xstatus_onkey_4: \ 00000080 000098E5 LDR R0,[R8, #+0] \ 00000084 8B0080E0 ADD R0,R0,R11, LSL #+1 \ 00000088 B200D0E1 LDRH R0,[R0, #+2] 276 } \ 0000008C 01B08BE2 ADD R11,R11,#+1 \ 00000090 ........ _BLF char16to8,??char16to8??rA \ 00000094 ........ STRB R0,[R10], #+1 \ ??edit_xstatus_onkey_2: \ 00000098 07005BE1 CMP R11,R7 \ 0000009C F7FFFFBA BLT ??edit_xstatus_onkey_4 277 *d=0; \ ??edit_xstatus_onkey_3: \ 000000A0 0000A0E3 MOV R0,#+0 \ 000000A4 0000CAE5 STRB R0,[R10, #+0] 278 if (len!=l || strncmp(s,tmp,len)) \ 000000A8 00009DE5 LDR R0,[SP, #+0] \ 000000AC 070050E1 CMP R0,R7 \ 000000B0 0500001A BNE ??edit_xstatus_onkey_5 \ 000000B4 0020A0E1 MOV R2,R0 \ 000000B8 34108DE2 ADD R1,SP,#+52 \ 000000BC 0900A0E1 MOV R0,R9 \ 000000C0 150100EF SWI +277 \ 000000C4 000050E3 CMP R0,#+0 \ 000000C8 0800000A BEQ ??edit_xstatus_onkey_1 279 { 280 ReplaceStr(&XStatusText,s-XStatusText,len,tmp,l); \ ??edit_xstatus_onkey_5: \ 000000CC 80002DE9 PUSH {R7} \ 000000D0 000095E5 LDR R0,[R5, #+0] \ 000000D4 04209DE5 LDR R2,[SP, #+4] \ 000000D8 38308DE2 ADD R3,SP,#+56 \ 000000DC 001049E0 SUB R1,R9,R0 \ 000000E0 0500A0E1 MOV R0,R5 \ 000000E4 ........ BL ReplaceStr 281 is_any_change=1; \ 000000E8 0160A0E3 MOV R6,#+1 \ 000000EC 04D08DE2 ADD SP,SP,#+4 282 } 283 } 284 285 ExtractEditControl(data,4,&ec); // Короткий икс статус \ ??edit_xstatus_onkey_1: \ 000000F0 08208DE2 ADD R2,SP,#+8 \ 000000F4 0410A0E3 MOV R1,#+4 \ 000000F8 0400A0E1 MOV R0,R4 \ 000000FC 690100EF SWI +361 286 ws=ec.pWS; 287 288 s=GetXStatusStr(cur_x_st*3+1,&len); \ 00000100 04009DE5 LDR R0,[SP, #+4] \ 00000104 30809DE5 LDR R8,[SP, #+48] \ 00000108 0D10A0E1 MOV R1,SP \ 0000010C 010080E2 ADD R0,R0,#+1 \ 00000110 ........ BL GetXStatusStr \ 00000114 0090B0E1 MOVS R9,R0 289 d=tmp; \ 00000118 34A08DE2 ADD R10,SP,#+52 290 291 if (s) \ 0000011C 2100000A BEQ ??edit_xstatus_onkey_6 292 { 293 l=ws->wsbody[0]; \ 00000120 000098E5 LDR R0,[R8, #+0] 294 for (int i=0; iwsbody[i+1]); \ ??edit_xstatus_onkey_9: \ 00000138 000098E5 LDR R0,[R8, #+0] \ 0000013C 8B0080E0 ADD R0,R0,R11, LSL #+1 \ 00000140 B200D0E1 LDRH R0,[R0, #+2] 297 } \ 00000144 01B08BE2 ADD R11,R11,#+1 \ 00000148 ........ _BLF char16to8,??char16to8??rA \ 0000014C ........ STRB R0,[R10], #+1 \ ??edit_xstatus_onkey_7: \ 00000150 07005BE1 CMP R11,R7 \ 00000154 F7FFFFBA BLT ??edit_xstatus_onkey_9 298 *d=0; \ ??edit_xstatus_onkey_8: \ 00000158 0000A0E3 MOV R0,#+0 \ 0000015C 0000CAE5 STRB R0,[R10, #+0] 299 if (len!=l || strncmp(s,tmp,len)) \ 00000160 00009DE5 LDR R0,[SP, #+0] \ 00000164 070050E1 CMP R0,R7 \ 00000168 0500001A BNE ??edit_xstatus_onkey_10 \ 0000016C 0020A0E1 MOV R2,R0 \ 00000170 34108DE2 ADD R1,SP,#+52 \ 00000174 0900A0E1 MOV R0,R9 \ 00000178 150100EF SWI +277 \ 0000017C 000050E3 CMP R0,#+0 \ 00000180 0800000A BEQ ??edit_xstatus_onkey_6 300 { 301 ReplaceStr(&XStatusText,s-XStatusText,len,tmp,l); \ ??edit_xstatus_onkey_10: \ 00000184 80002DE9 PUSH {R7} \ 00000188 000095E5 LDR R0,[R5, #+0] \ 0000018C 04209DE5 LDR R2,[SP, #+4] \ 00000190 38308DE2 ADD R3,SP,#+56 \ 00000194 001049E0 SUB R1,R9,R0 \ 00000198 0500A0E1 MOV R0,R5 \ 0000019C ........ BL ReplaceStr 302 is_any_change=1; \ 000001A0 0160A0E3 MOV R6,#+1 \ 000001A4 04D08DE2 ADD SP,SP,#+4 303 } 304 } 305 306 ExtractEditControl(data,6,&ec); // Длинный икс статус \ ??edit_xstatus_onkey_6: \ 000001A8 08208DE2 ADD R2,SP,#+8 \ 000001AC 0610A0E3 MOV R1,#+6 \ 000001B0 0400A0E1 MOV R0,R4 \ 000001B4 690100EF SWI +361 307 ws=ec.pWS; 308 309 s=GetXStatusStr(cur_x_st*3+2,&len); \ 000001B8 04009DE5 LDR R0,[SP, #+4] \ 000001BC 30409DE5 LDR R4,[SP, #+48] \ 000001C0 0D10A0E1 MOV R1,SP \ 000001C4 020080E2 ADD R0,R0,#+2 \ 000001C8 ........ BL GetXStatusStr \ 000001CC 0080B0E1 MOVS R8,R0 310 d=tmp; \ 000001D0 34908DE2 ADD R9,SP,#+52 311 312 if (s) \ 000001D4 2100000A BEQ ??edit_xstatus_onkey_11 313 { 314 l=ws->wsbody[0]; \ 000001D8 000094E5 LDR R0,[R4, #+0] 315 for (int i=0; iwsbody[i+1]); \ ??edit_xstatus_onkey_14: \ 000001F0 000094E5 LDR R0,[R4, #+0] \ 000001F4 8A0080E0 ADD R0,R0,R10, LSL #+1 \ 000001F8 B200D0E1 LDRH R0,[R0, #+2] 318 } \ 000001FC 01A08AE2 ADD R10,R10,#+1 \ 00000200 ........ _BLF char16to8,??char16to8??rA \ 00000204 ........ STRB R0,[R9], #+1 \ ??edit_xstatus_onkey_12: \ 00000208 07005AE1 CMP R10,R7 \ 0000020C F7FFFFBA BLT ??edit_xstatus_onkey_14 319 *d=0; \ ??edit_xstatus_onkey_13: \ 00000210 0000A0E3 MOV R0,#+0 \ 00000214 0000C9E5 STRB R0,[R9, #+0] 320 if (len!=l || strncmp(s,tmp,len)) \ 00000218 00009DE5 LDR R0,[SP, #+0] \ 0000021C 070050E1 CMP R0,R7 \ 00000220 0500001A BNE ??edit_xstatus_onkey_15 \ 00000224 0020A0E1 MOV R2,R0 \ 00000228 34108DE2 ADD R1,SP,#+52 \ 0000022C 0800A0E1 MOV R0,R8 \ 00000230 150100EF SWI +277 \ 00000234 000050E3 CMP R0,#+0 \ 00000238 0800000A BEQ ??edit_xstatus_onkey_11 321 { 322 ReplaceStr(&XStatusText,s-XStatusText,len,tmp,l); \ ??edit_xstatus_onkey_15: \ 0000023C 80002DE9 PUSH {R7} \ 00000240 000095E5 LDR R0,[R5, #+0] \ 00000244 04209DE5 LDR R2,[SP, #+4] \ 00000248 38308DE2 ADD R3,SP,#+56 \ 0000024C 001048E0 SUB R1,R8,R0 \ 00000250 0500A0E1 MOV R0,R5 \ 00000254 ........ BL ReplaceStr 323 is_any_change=1; \ 00000258 04D08DE2 ADD SP,SP,#+4 \ 0000025C 010000EA B ??edit_xstatus_onkey_16 324 } 325 } 326 327 if (is_any_change) \ ??edit_xstatus_onkey_11: \ 00000260 000056E3 CMP R6,#+0 \ 00000264 0000000A BEQ ??edit_xstatus_onkey_17 328 { 329 SaveXStatusText(); \ ??edit_xstatus_onkey_16: \ 00000268 ........ BL SaveXStatusText 330 } 331 return (1); \ ??edit_xstatus_onkey_17: \ 0000026C 0100A0E3 MOV R0,#+1 \ 00000270 B8D08DE2 ADD SP,SP,#+184 \ 00000274 F08FBDE8 POP {R4-R11,PC} 332 } 333 return (0); \ ??edit_xstatus_onkey_0: \ 00000278 0000A0E3 MOV R0,#+0 \ 0000027C B8D08DE2 ADD SP,SP,#+184 \ 00000280 F08FBDE8 POP {R4-R11,PC} ;; return 334 } 335 \ In segment CODE, align 4, keep-with-next 336 void edit_xstatus_ghook(GUI *data, int cmd) 337 { \ edit_xstatus_ghook: \ 00000000 00402DE9 PUSH {LR} 338 static SOFTKEY_DESC sk={0x0FFF,0x0000,(int)"Save!"}; 339 if (cmd==0x0A) \ 00000004 0A0051E3 CMP R1,#+10 \ 00000008 0100001A BNE ??edit_xstatus_ghook_0 340 { 341 DisableIDLETMR(); \ 0000000C 7F0100EF SWI +383 \ 00000010 0080BDE8 POP {PC} 342 } 343 if (cmd==7) \ ??edit_xstatus_ghook_0: \ 00000014 070051E3 CMP R1,#+7 \ 00000018 0080BD18 POPNE {PC} 344 { 345 SetSoftKey(data,&sk,SET_SOFT_KEY_N); \ 0000001C 08109FE5 LDR R1,??edit_xstatus_ghook_1 ;; ??sk \ 00000020 0120A0E3 MOV R2,#+1 \ 00000024 680100EF SWI +360 346 } 347 } \ 00000028 0080BDE8 POP {PC} ;; return \ ??edit_xstatus_ghook_1: \ 0000002C ........ DC32 ??sk \ In segment DATA_I, align 4, align-sorted \ ??sk: \ 00000000 DS8 8 \ 00000008 REQUIRE `?` 348 \ In segment DATA_I, align 4, align-sorted 349 HEADER_DESC edit_xstatus_hdr={0,0,0,0,NULL,(int)"X-Статус",LGP_NULL}; 350 351 INPUTDIA_DESC edit_xstatus_desc = \ edit_xstatus_desc: \ 00000000 DS8 56 \ 00000038 REQUIRE `?` \ edit_xstatus_hdr: \ 00000038 DS8 20 \ 0000004C REQUIRE `?` 352 { 353 1, 354 edit_xstatus_onkey, 355 edit_xstatus_ghook, 356 (void *)edit_xstatus_locret, 357 0, 358 &edit_x_skt, 359 {0,0,0,0}, 360 FONT_SMALL, 361 100, 362 101, 363 0, 364 // 0x00000001 - Выровнять по правому краю 365 // 0x00000002 - Выровнять по центру 366 // 0x00000004 - Инверсия знакомест 367 // 0x00000008 - UnderLine 368 // 0x00000020 - Не переносить слова 369 // 0x00000200 - bold 370 0, 371 // 0x00000002 - ReadOnly 372 // 0x00000004 - Не двигается курсор 373 // 0x40000000 - Поменять местами софт-кнопки 374 0x40000000 375 }; 376 377 \ In segment CODE, align 4, keep-with-next 378 static void EditXStatus(int xstatus) 379 { \ EditXStatus: \ 00000000 F0472DE9 PUSH {R4-R10,LR} 380 void *ma=malloc_adr(); 381 void *eq; 382 EDITCONTROL ec; 383 char *s; 384 int len; 385 int c; 386 387 eq=AllocEQueue(ma,mfree_adr()); 388 WSHDR *ews=AllocWS(128); 389 ascii2ws(ews,"Комментарий:"); // Коментарий \ 00000004 1C839FE5 LDR R8,??EditXStatus_0 ;; `?wsbody[0]); \ 00000048 000097E5 LDR R0,[R7, #+0] \ 0000004C 0730A0E1 MOV R3,R7 \ 00000050 B000D0E1 LDRH R0,[R0, #+0] \ 00000054 4020A0E3 MOV R2,#+64 \ 00000058 0110A0E3 MOV R1,#+1 \ 0000005C 01002DE9 PUSH {R0} 392 AddEditControlToEditQend(eq,&ec,ma); //1 393 394 CutWSTR(ews,0); 395 s=GetXStatusStr(xstatus*3, &len); \ 00000060 849084E0 ADD R9,R4,R4, LSL #+1 \ 00000064 08008DE2 ADD R0,SP,#+8 \ 00000068 650100EF SWI +357 \ 0000006C 0520A0E1 MOV R2,R5 \ 00000070 08108DE2 ADD R1,SP,#+8 \ 00000074 0600A0E1 MOV R0,R6 \ 00000078 660100EF SWI +358 \ 0000007C 0010A0E3 MOV R1,#+0 \ 00000080 0700A0E1 MOV R0,R7 \ 00000084 260100EF SWI +294 \ 00000088 04108DE2 ADD R1,SP,#+4 \ 0000008C 0900A0E1 MOV R0,R9 \ 00000090 ........ BL GetXStatusStr \ 00000094 00A0B0E1 MOVS R10,R0 396 if (s) \ 00000098 04D08DE2 ADD SP,SP,#+4 \ 0000009C 0C00000A BEQ ??EditXStatus_1 \ 000000A0 060000EA B ??EditXStatus_2 397 { 398 while((c=*s++) && len) 399 { 400 wsAppendChar(ews,char8to16(c)); \ ??EditXStatus_3: \ 000000A4 ........ _BLF char8to16,??char8to16??rA \ 000000A8 0010A0E1 MOV R1,R0 \ 000000AC 0700A0E1 MOV R0,R7 \ 000000B0 1C0000EF SWI +28 401 len--; \ 000000B4 00109DE5 LDR R1,[SP, #+0] \ 000000B8 011041E2 SUB R1,R1,#+1 \ 000000BC 00108DE5 STR R1,[SP, #+0] 402 } \ ??EditXStatus_2: \ 000000C0 ........ LDRB R0,[R10], #+1 \ 000000C4 000050E3 CMP R0,#+0 \ 000000C8 00109D15 LDRNE R1,[SP, #+0] \ 000000CC 00005113 CMPNE R1,#+0 \ 000000D0 F3FFFF1A BNE ??EditXStatus_3 403 } 404 PrepareEditControl(&ec); \ ??EditXStatus_1: \ 000000D4 04008DE2 ADD R0,SP,#+4 \ 000000D8 640100EF SWI +356 405 ConstructEditControl(&ec,ECT_NORMAL_TEXT,0x40,ews,20); \ 000000DC 1400A0E3 MOV R0,#+20 \ 000000E0 01002DE9 PUSH {R0} \ 000000E4 0730A0E1 MOV R3,R7 \ 000000E8 4020A0E3 MOV R2,#+64 \ 000000EC 0310A0E3 MOV R1,#+3 \ 000000F0 08008DE2 ADD R0,SP,#+8 \ 000000F4 650100EF SWI +357 406 AddEditControlToEditQend(eq,&ec,ma); //2 \ 000000F8 0520A0E1 MOV R2,R5 \ 000000FC 08108DE2 ADD R1,SP,#+8 \ 00000100 0600A0E1 MOV R0,R6 \ 00000104 660100EF SWI +358 407 408 ascii2ws(ews,"Short X:"); // Короткий Икс Статус \ 00000108 101088E2 ADD R1,R8,#+16 \ 0000010C 0700A0E1 MOV R0,R7 \ 00000110 ........ _BLF ascii2ws,??ascii2ws??rA 409 PrepareEditControl(&ec); \ 00000114 08008DE2 ADD R0,SP,#+8 \ 00000118 640100EF SWI +356 410 ConstructEditControl(&ec,ECT_HEADER,0x40,ews,ews->wsbody[0]); \ 0000011C 000097E5 LDR R0,[R7, #+0] \ 00000120 0730A0E1 MOV R3,R7 \ 00000124 B000D0E1 LDRH R0,[R0, #+0] \ 00000128 4020A0E3 MOV R2,#+64 \ 0000012C 0110A0E3 MOV R1,#+1 \ 00000130 01002DE9 PUSH {R0} \ 00000134 0C008DE2 ADD R0,SP,#+12 \ 00000138 650100EF SWI +357 411 AddEditControlToEditQend(eq,&ec,ma); //3 \ 0000013C 0520A0E1 MOV R2,R5 \ 00000140 0C108DE2 ADD R1,SP,#+12 \ 00000144 0600A0E1 MOV R0,R6 \ 00000148 660100EF SWI +358 412 413 CutWSTR(ews,0); \ 0000014C 0010A0E3 MOV R1,#+0 \ 00000150 0700A0E1 MOV R0,R7 \ 00000154 260100EF SWI +294 414 s=GetXStatusStr(xstatus*3+1, &len); \ 00000158 08108DE2 ADD R1,SP,#+8 \ 0000015C 010089E2 ADD R0,R9,#+1 \ 00000160 ........ BL GetXStatusStr \ 00000164 00A0B0E1 MOVS R10,R0 415 if (s) \ 00000168 08D08DE2 ADD SP,SP,#+8 \ 0000016C 0C00000A BEQ ??EditXStatus_4 \ 00000170 060000EA B ??EditXStatus_5 416 { 417 while((c=*s++) && len) 418 { 419 wsAppendChar(ews,char8to16(c)); \ ??EditXStatus_6: \ 00000174 ........ _BLF char8to16,??char8to16??rA \ 00000178 0010A0E1 MOV R1,R0 \ 0000017C 0700A0E1 MOV R0,R7 \ 00000180 1C0000EF SWI +28 420 len--; \ 00000184 00109DE5 LDR R1,[SP, #+0] \ 00000188 011041E2 SUB R1,R1,#+1 \ 0000018C 00108DE5 STR R1,[SP, #+0] 421 } \ ??EditXStatus_5: \ 00000190 ........ LDRB R0,[R10], #+1 \ 00000194 000050E3 CMP R0,#+0 \ 00000198 00109D15 LDRNE R1,[SP, #+0] \ 0000019C 00005113 CMPNE R1,#+0 \ 000001A0 F3FFFF1A BNE ??EditXStatus_6 422 } 423 PrepareEditControl(&ec); \ ??EditXStatus_4: \ 000001A4 04008DE2 ADD R0,SP,#+4 \ 000001A8 640100EF SWI +356 424 ConstructEditControl(&ec,ECT_NORMAL_TEXT,0x40,ews,128); \ 000001AC 8000A0E3 MOV R0,#+128 \ 000001B0 01002DE9 PUSH {R0} \ 000001B4 0730A0E1 MOV R3,R7 \ 000001B8 4020A0E3 MOV R2,#+64 \ 000001BC 0310A0E3 MOV R1,#+3 \ 000001C0 08008DE2 ADD R0,SP,#+8 \ 000001C4 650100EF SWI +357 425 AddEditControlToEditQend(eq,&ec,ma); //4 \ 000001C8 0520A0E1 MOV R2,R5 \ 000001CC 08108DE2 ADD R1,SP,#+8 \ 000001D0 0600A0E1 MOV R0,R6 \ 000001D4 660100EF SWI +358 426 427 ascii2ws(ews,"Large X:"); // Длинный Икс Статус \ 000001D8 1C1088E2 ADD R1,R8,#+28 \ 000001DC 0700A0E1 MOV R0,R7 \ 000001E0 ........ _BLF ascii2ws,??ascii2ws??rA 428 PrepareEditControl(&ec); \ 000001E4 08008DE2 ADD R0,SP,#+8 \ 000001E8 640100EF SWI +356 429 ConstructEditControl(&ec,ECT_HEADER,0x40,ews,ews->wsbody[0]); \ 000001EC 000097E5 LDR R0,[R7, #+0] \ 000001F0 0730A0E1 MOV R3,R7 \ 000001F4 B000D0E1 LDRH R0,[R0, #+0] \ 000001F8 4020A0E3 MOV R2,#+64 \ 000001FC 0110A0E3 MOV R1,#+1 \ 00000200 01002DE9 PUSH {R0} \ 00000204 0C008DE2 ADD R0,SP,#+12 \ 00000208 650100EF SWI +357 430 AddEditControlToEditQend(eq,&ec,ma); //5 \ 0000020C 0520A0E1 MOV R2,R5 \ 00000210 0C108DE2 ADD R1,SP,#+12 \ 00000214 0600A0E1 MOV R0,R6 \ 00000218 660100EF SWI +358 431 432 CutWSTR(ews,0); \ 0000021C 0010A0E3 MOV R1,#+0 \ 00000220 0700A0E1 MOV R0,R7 \ 00000224 260100EF SWI +294 433 s=GetXStatusStr(xstatus*3+2, &len); \ 00000228 08108DE2 ADD R1,SP,#+8 \ 0000022C 020089E2 ADD R0,R9,#+2 \ 00000230 ........ BL GetXStatusStr \ 00000234 0080B0E1 MOVS R8,R0 434 if (s) \ 00000238 08D08DE2 ADD SP,SP,#+8 \ 0000023C 0C00000A BEQ ??EditXStatus_7 \ 00000240 060000EA B ??EditXStatus_8 435 { 436 while((c=*s++) && len) 437 { 438 wsAppendChar(ews,char8to16(c)); \ ??EditXStatus_9: \ 00000244 ........ _BLF char8to16,??char8to16??rA \ 00000248 0010A0E1 MOV R1,R0 \ 0000024C 0700A0E1 MOV R0,R7 \ 00000250 1C0000EF SWI +28 439 len--; \ 00000254 00109DE5 LDR R1,[SP, #+0] \ 00000258 011041E2 SUB R1,R1,#+1 \ 0000025C 00108DE5 STR R1,[SP, #+0] 440 } \ ??EditXStatus_8: \ 00000260 ........ LDRB R0,[R8], #+1 \ 00000264 000050E3 CMP R0,#+0 \ 00000268 00109D15 LDRNE R1,[SP, #+0] \ 0000026C 00005113 CMPNE R1,#+0 \ 00000270 F3FFFF1A BNE ??EditXStatus_9 441 } 442 PrepareEditControl(&ec); \ ??EditXStatus_7: \ 00000274 04008DE2 ADD R0,SP,#+4 \ 00000278 640100EF SWI +356 443 ConstructEditControl(&ec,ECT_NORMAL_TEXT,0x40,ews,128); \ 0000027C 8000A0E3 MOV R0,#+128 \ 00000280 01002DE9 PUSH {R0} \ 00000284 0730A0E1 MOV R3,R7 \ 00000288 4020A0E3 MOV R2,#+64 \ 0000028C 0310A0E3 MOV R1,#+3 \ 00000290 08008DE2 ADD R0,SP,#+8 \ 00000294 650100EF SWI +357 444 AddEditControlToEditQend(eq,&ec,ma); //6 \ 00000298 0520A0E1 MOV R2,R5 445 446 FreeWS(ews); 447 patch_header(&edit_xstatus_hdr); \ 0000029C 88509FE5 LDR R5,??EditXStatus_0+0x4 ;; edit_xstatus_desc \ 000002A0 08108DE2 ADD R1,SP,#+8 \ 000002A4 0600A0E1 MOV R0,R6 \ 000002A8 660100EF SWI +358 \ 000002AC 0700A0E1 MOV R0,R7 \ 000002B0 290100EF SWI +297 \ 000002B4 0070A0E3 MOV R7,#+0 \ 000002B8 387085E5 STR R7,[R5, #+56] \ 000002BC 888100EF SWI +33160 \ 000002C0 010040E2 SUB R0,R0,#+1 \ 000002C4 BC03C5E1 STRH R0,[R5, #+60] \ 000002C8 8A8100EF SWI +33162 \ 000002CC 010040E2 SUB R0,R0,#+1 \ 000002D0 BE03C5E1 STRH R0,[R5, #+62] 448 patch_input(&edit_xstatus_desc); \ 000002D4 B871C5E1 STRH R7,[R5, #+24] \ 000002D8 8A8100EF SWI +33162 \ 000002DC 010080E2 ADD R0,R0,#+1 \ 000002E0 BA01C5E1 STRH R0,[R5, #+26] \ 000002E4 888100EF SWI +33160 \ 000002E8 010040E2 SUB R0,R0,#+1 \ 000002EC BC01C5E1 STRH R0,[R5, #+28] \ 000002F0 898100EF SWI +33161 \ 000002F4 0070A0E1 MOV R7,R0 \ 000002F8 8B8100EF SWI +33163 \ 000002FC 000047E0 SUB R0,R7,R0 \ 00000300 010040E2 SUB R0,R0,#+1 \ 00000304 BE01C5E1 STRH R0,[R5, #+30] 449 CreateInputTextDialog(&edit_xstatus_desc,&edit_xstatus_hdr,eq,1,(void *)xstatus); \ 00000308 10002DE9 PUSH {R4} \ 0000030C 0130A0E3 MOV R3,#+1 \ 00000310 0620A0E1 MOV R2,R6 \ 00000314 381085E2 ADD R1,R5,#+56 \ 00000318 0500A0E1 MOV R0,R5 \ 0000031C 670100EF SWI +359 450 } \ 00000320 38D08DE2 ADD SP,SP,#+56 \ 00000324 F087BDE8 POP {R4-R10,PC} ;; return \ ??EditXStatus_0: \ 00000328 ........ DC32 `?keys==0x18) \ 0000000C F210D4E1 LDRSH R1,[R4, #+2] \ 00000010 180051E3 CMP R1,#+24 \ 00000014 0200001A BNE ??xst_onkey_0 457 { 458 EditXStatus(i); \ 00000018 ........ BL EditXStatus 459 return(0); \ 0000001C 0000A0E3 MOV R0,#+0 \ 00000020 1080BDE8 POP {R4,PC} 460 } 461 if (msg->keys==0x3D) \ ??xst_onkey_0: \ 00000024 3D0051E3 CMP R1,#+61 \ 00000028 0600001A BNE ??xst_onkey_1 462 { 463 Change_XStatus(i); \ 0000002C ........ LDR R1,??DataTable12 ;; CurrentXStatus \ 00000030 000081E5 STR R0,[R1, #+0] \ 00000034 ........ _BLF set_my_xstatus,??set_my_xstatus??rA \ 00000038 ........ LDR R0,??DataTable8 ;; WriteDefSettings \ 0000003C 710100EF SWI +369 464 return(1); \ 00000040 0100A0E3 MOV R0,#+1 \ 00000044 1080BDE8 POP {R4,PC} 465 } 466 return (0); \ ??xst_onkey_1: \ 00000048 0000A0E3 MOV R0,#+0 \ 0000004C 1080BDE8 POP {R4,PC} ;; return 467 } 468 \ In segment CODE, align 4, keep-with-next 469 static void xst_ghook(void *data, int cmd) 470 { \ xst_ghook: \ 00000000 10402DE9 PUSH {R4,LR} \ 00000004 0140A0E1 MOV R4,R1 471 PNGTOP_DESC *pltop=PNG_TOP(); \ 00000008 B98100EF SWI +33209 472 if (cmd==9) \ 0000000C 090054E3 CMP R4,#+9 473 { 474 pltop->dyn_pltop=NULL; \ 00000010 0010A003 MOVEQ R1,#+0 \ 00000014 08108005 STREQ R1,[R0, #+8] \ 00000018 1080BD08 POPEQ {R4,PC} 475 } 476 if (cmd==0x0A) \ 0000001C 0A0054E3 CMP R4,#+10 \ 00000020 1080BD18 POPNE {R4,PC} 477 { 478 pltop->dyn_pltop=XStatusesImgList; \ 00000024 10109FE5 LDR R1,??xst_ghook_0 ;; XStatusesImgList \ 00000028 001091E5 LDR R1,[R1, #+0] \ 0000002C 081080E5 STR R1,[R0, #+8] 479 DisableIDLETMR(); \ 00000030 7F0100EF SWI +383 480 //Загрузка текста при фокусе 481 LoadXStatusText(); \ 00000034 ........ BL LoadXStatusText 482 } 483 } \ 00000038 1080BDE8 POP {R4,PC} ;; return \ ??xst_ghook_0: \ 0000003C ........ DC32 XStatusesImgList 484 \ In segment CODE, align 4, keep-with-next 485 static void xst_itemh(void *data, int curitem, void *unk) 486 { \ xst_itemh: \ 00000000 F04F2DE9 PUSH {R4-R11,LR} 487 void *item=AllocMLMenuItem(data); 488 WSHDR ws1loc, *ws1, *ws2; 489 unsigned short num[128]; 490 WSHDR ws3loc, *ws3, *ws4; 491 unsigned short num3[128]; 492 char ss[128]; 493 char *s; 494 int l; 495 extern const char percent_t[]; 496 497 ws1=CreateLocalWS(&ws1loc,num,128); 498 ws3=CreateLocalWS(&ws3loc,num3,128); 499 500 if (s=GetXStatusStr(curitem*3+1,&l)) \ 00000004 ........ LDR R9,??DataTable9 ;; percent_t \ 00000008 70A19FE5 LDR R10,??xst_itemh_0 ;; `?` \ 0000000C ACDF4DE2 SUB SP,SP,#+688 \ 00000010 0040A0E1 MOV R4,R0 \ 00000014 0150A0E1 MOV R5,R1 \ 00000018 190200EF SWI +537 \ 0000001C 0060A0E1 MOV R6,R0 \ 00000020 8020A0E3 MOV R2,#+128 \ 00000024 08108DE2 ADD R1,SP,#+8 \ 00000028 A20F8DE2 ADD R0,SP,#+648 \ 0000002C 270100EF SWI +295 \ 00000030 0070A0E1 MOV R7,R0 \ 00000034 8020A0E3 MOV R2,#+128 \ 00000038 421F8DE2 ADD R1,SP,#+264 \ 0000003C A70F8DE2 ADD R0,SP,#+668 \ 00000040 270100EF SWI +295 \ 00000044 0080A0E1 MOV R8,R0 \ 00000048 85B085E0 ADD R11,R5,R5, LSL #+1 \ 0000004C 0D10A0E1 MOV R1,SP \ 00000050 01008BE2 ADD R0,R11,#+1 \ 00000054 ........ BL GetXStatusStr \ 00000058 04008DE5 STR R0,[SP, #+4] \ 0000005C 000050E3 CMP R0,#+0 \ 00000060 0E00000A BEQ ??xst_itemh_1 501 { 502 memset(ss,0,128); \ 00000064 8020A0E3 MOV R2,#+128 \ 00000068 0010A0E3 MOV R1,#+0 \ 0000006C 820F8DE2 ADD R0,SP,#+520 \ 00000070 BB0000EF SWI +187 503 if (l>127) l=127; \ 00000074 00009DE5 LDR R0,[SP, #+0] \ 00000078 800050E3 CMP R0,#+128 \ 0000007C 7F10A0A3 MOVGE R1,#+127 \ 00000080 00108DA5 STRGE R1,[SP, #+0] 504 strncpy(ss,s,l); \ 00000084 00209DE5 LDR R2,[SP, #+0] \ 00000088 04109DE5 LDR R1,[SP, #+4] \ 0000008C 820F8DE2 ADD R0,SP,#+520 \ 00000090 160100EF SWI +278 505 wsprintf(ws1,percent_t,ss); \ 00000094 822F8DE2 ADD R2,SP,#+520 \ 00000098 0910A0E1 MOV R1,R9 \ 0000009C 010000EA B ??xst_itemh_2 506 } 507 else 508 { 509 wsprintf(ws1,"Short XS %d",curitem); \ ??xst_itemh_1: \ 000000A0 0520A0E1 MOV R2,R5 \ 000000A4 0A10A0E1 MOV R1,R10 \ ??xst_itemh_2: \ 000000A8 0700A0E1 MOV R0,R7 \ 000000AC 240100EF SWI +292 510 } 511 if (s=GetXStatusStr(curitem*3+2,&l)) \ 000000B0 0D10A0E1 MOV R1,SP \ 000000B4 02008BE2 ADD R0,R11,#+2 \ 000000B8 ........ BL GetXStatusStr \ 000000BC 00B0B0E1 MOVS R11,R0 \ 000000C0 0E00000A BEQ ??xst_itemh_3 512 { 513 memset(ss,0,128); \ 000000C4 8020A0E3 MOV R2,#+128 \ 000000C8 0010A0E3 MOV R1,#+0 \ 000000CC 820F8DE2 ADD R0,SP,#+520 \ 000000D0 BB0000EF SWI +187 514 if (l>127) l=127; \ 000000D4 00009DE5 LDR R0,[SP, #+0] \ 000000D8 800050E3 CMP R0,#+128 \ 000000DC 7F10A0A3 MOVGE R1,#+127 \ 000000E0 00108DA5 STRGE R1,[SP, #+0] 515 strncpy(ss,s,l); \ 000000E4 00209DE5 LDR R2,[SP, #+0] \ 000000E8 0B10A0E1 MOV R1,R11 \ 000000EC 820F8DE2 ADD R0,SP,#+520 \ 000000F0 160100EF SWI +278 516 wsprintf(ws3,percent_t,ss); \ 000000F4 822F8DE2 ADD R2,SP,#+520 \ 000000F8 0910A0E1 MOV R1,R9 \ 000000FC 010000EA B ??xst_itemh_4 517 } 518 else 519 { 520 wsprintf(ws3,"Large XS %d",curitem); \ ??xst_itemh_3: \ 00000100 0520A0E1 MOV R2,R5 \ 00000104 0C108AE2 ADD R1,R10,#+12 \ ??xst_itemh_4: \ 00000108 0800A0E1 MOV R0,R8 \ 0000010C 240100EF SWI +292 521 } 522 ws2=AllocMenuWS(data,ws1->wsbody[0]); \ 00000110 000097E5 LDR R0,[R7, #+0] \ 00000114 B010D0E1 LDRH R1,[R0, #+0] \ 00000118 0400A0E1 MOV R0,R4 \ 0000011C 980100EF SWI +408 \ 00000120 0090A0E1 MOV R9,R0 523 524 wstrcpy(ws2,ws1); \ 00000124 0710A0E1 MOV R1,R7 \ 00000128 1F0100EF SWI +287 525 ws4=AllocMenuWS(data,ws3->wsbody[0]); \ 0000012C 000098E5 LDR R0,[R8, #+0] \ 00000130 B010D0E1 LDRH R1,[R0, #+0] \ 00000134 0400A0E1 MOV R0,R4 \ 00000138 980100EF SWI +408 \ 0000013C 0070A0E1 MOV R7,R0 526 wstrcpy(ws4,ws3); \ 00000140 0810A0E1 MOV R1,R8 \ 00000144 1F0100EF SWI +287 527 SetMenuItemIconArray(data, item, XStatusesIconArray+curitem); \ 00000148 ........ LDR R0,??DataTable11 ;; XStatusesIconArray \ 0000014C 0610A0E1 MOV R1,R6 \ 00000150 000090E5 LDR R0,[R0, #+0] \ 00000154 052180E0 ADD R2,R0,R5, LSL #+2 \ 00000158 0400A0E1 MOV R0,R4 \ 0000015C 990100EF SWI +409 528 SetMLMenuItemText(data, item, ws2, ws4, curitem); \ 00000160 20002DE9 PUSH {R5} \ 00000164 0730A0E1 MOV R3,R7 \ 00000168 0920A0E1 MOV R2,R9 \ 0000016C 0610A0E1 MOV R1,R6 \ 00000170 0400A0E1 MOV R0,R4 \ 00000174 180200EF SWI +536 529 } \ 00000178 ADDF8DE2 ADD SP,SP,#+692 \ 0000017C F08FBDE8 POP {R4-R11,PC} ;; return \ ??xst_itemh_0: \ 00000180 ........ DC32 `?` 530 \ In segment DATA_C, align 4, align-sorted 531 static const SOFTKEY_DESC xst_menu_sk[]= \ xst_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 532 { 533 {0x0018,0x0000,(int)LG_TEXT}, 534 {0x0001,0x0000,(int)LG_BACK}, 535 {0x003D,0x0000,(int)LGP_DOIT_PIC} 536 }; 537 \ In segment DATA_C, align 4, align-sorted 538 static const SOFTKEYSTAB xst_menu_skt= \ xst_menu_skt: \ 00000000 ........0000 DC32 xst_menu_sk, 0 \ 0000 539 { 540 xst_menu_sk,0 541 }; 542 \ In segment DATA_C, align 4, align-sorted 543 static const HEADER_DESC xst_menuhdr={0,0,0,0,NULL,(int)LG_CHGXSTATUS,LGP_NULL}; \ xst_menuhdr: \ 00000000 000000000000 DC16 0, 0, 0, 0 \ 0000 \ 00000008 00000000.... DC32 0H, `?=32); \ ??GetXStatusStr_2: \ 00000028 ........ LDRB R12,[R2], #+1 \ 0000002C 20005CE3 CMP R12,#+32 \ 00000030 FCFFFFAA BGE ??GetXStatusStr_2 630 if (!c) return NULL; \ 00000034 00005CE3 CMP R12,#+0 \ 00000038 F8FFFF0A BEQ ??GetXStatusStr_1 631 n--; \ 0000003C 010040E2 SUB R0,R0,#+1 632 } \ ??GetXStatusStr_0: \ 00000040 000050E3 CMP R0,#+0 \ 00000044 F7FFFF1A BNE ??GetXStatusStr_2 633 pp=p; \ 00000048 0200A0E1 MOV R0,R2 \ 0000004C 000000EA B ??GetXStatusStr_3 634 while((*pp++)>=32) l++; \ ??GetXStatusStr_4: \ 00000050 013083E2 ADD R3,R3,#+1 \ ??GetXStatusStr_3: \ 00000054 ........ LDRB R12,[R0], #+1 \ 00000058 20005CE3 CMP R12,#+32 \ 0000005C FBFFFF2A BCS ??GetXStatusStr_4 635 if (len) *len=l; \ 00000060 000051E3 CMP R1,#+0 \ 00000064 00308115 STRNE R3,[R1, #+0] 636 return p; \ 00000068 0200A0E1 MOV R0,R2 \ 0000006C 1EFF2FE1 BX LR ;; return 637 } \ In segment CODE, align 4, keep-with-next \ ??DataTable4: \ 00000000 ........ DC32 S_ICONS \ In segment CODE, align 4, keep-with-next \ ??DataTable5: \ 00000000 ........ DC32 CurrentStatus \ In segment CODE, align 4, keep-with-next \ ??DataTable8: \ 00000000 ........ DC32 WriteDefSettings \ In segment CODE, align 4, keep-with-next \ ??DataTable9: \ 00000000 ........ DC32 percent_t \ In segment CODE, align 4, keep-with-next \ ??DataTable11: \ 00000000 ........ DC32 XStatusesIconArray \ In segment CODE, align 4, keep-with-next \ ??DataTable12: \ 00000000 ........ DC32 CurrentXStatus \ In segment CODE, align 4, keep-with-next \ ??DataTable17: \ 00000000 ........ DC32 TEMPLATES_PATH \ In segment CODE, align 4, keep-with-next \ ??DataTable18: \ 00000000 ........ DC32 XS_FILE_NAME \ In segment CODE, align 4, keep-with-next \ ??DataTable20: \ 00000000 ........ DC32 XStatusText \ In segment DATA_ID, align 4, align-sorted \ `?`: \ 00000000 18000000 DC16 24, 0 \ 00000004 ........ DC32 `?` \ 00000008 01000000 DC16 1, 0 \ 0000000C ........ DC32 `?` \ 00000010 3D000000 DC16 61, 0 \ 00000014 FBC0FF7F DC32 2147467515 \ In segment DATA_ID, align 4, align-sorted \ `?`: \ 00000000 ........0000 DC32 edit_x_sk, 0 \ 0000 \ In segment DATA_ID, align 4, align-sorted \ `?`: \ 00000000 FF0F0000 DC16 4095, 0 \ 00000004 ........ DC32 `?` \ In segment DATA_ID, align 4, align-sorted \ `?`: \ 00000000 01000000.... DC32 1, edit_xstatus_onkey, edit_xstatus_ghook, edit_xstatus_locret, 0 \ ............ \ ........0000 \ 0000 \ 00000014 ........ DC32 edit_x_skt \ 00000018 000000000000 DC16 0, 0, 0, 0 \ 0000 \ 00000020 070000006400 DC32 7, 100, 101, 0, 0, 1073741824 \ 000065000000 \ 000000000000 \ 000000000040 \ `?`: \ 00000038 000000000000 DC16 0, 0, 0, 0 \ 0000 \ 00000040 00000000.... DC32 0H, `?`, 32767 \ ....FF7F0000 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 C4EEECE000 DC8 "\304\356\354\340" \ 00000005 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 C6F0F300 DC8 "\306\360\363" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 C2FBE1EEF000 DC8 "\302\373\341\356\360" \ 00000006 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 CDE0E7E0E400 DC8 "\315\340\347\340\344" \ 00000006 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 536176652100 DC8 "Save!" \ 00000006 0000 DC8 0, 0 \ In segment DATA_C, align 1, align-sorted \ `?`: \ 00000000 00 DC8 "" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 582DD1F2E0F2 DC8 "X-\321\362\340\362\363\361" \ F3F100 \ 00000009 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 D2E5EAF1F200 DC8 "\322\345\352\361\362" \ 00000006 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 53686F727420 DC8 "Short XS %d" \ 585320256400 \ 0000000C 4C6172676520 DC8 "Large XS %d" \ 585320256400 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 C220F1E5F2E8 DC8 "\302 \361\345\362\350" \ 00 \ 00000007 00 DC8 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 CEF2EEF8B8EB DC8 "\316\362\356\370\270\353" \ 00 \ 00000007 00 DC8 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 C7E0EDFFF200 DC8 "\307\340\355\377\362" \ 00000006 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 C7EBEEE900 DC8 "\307\353\356\351" \ 00000005 000000 DC8 0, 0, 0 Maximum stack usage in bytes: Function CSTACK -------- ------ DispStatusChangeMenu 32 DispXStatusChangeMenu 16 EditXStatus 88 FreeXStatusText 8 GetXStatusStr 0 LoadXStatusText 324 ReplaceStr 36 SaveXStatusText 272 edit_xstatus_ghook 4 edit_xstatus_locret 0 edit_xstatus_onkey 224 st_icons_set 24 st_onkey 4 stmenu_ghook 4 xst_ghook 8 xst_itemh 728 xst_onkey 8 Segment part sizes: Function/Label Bytes -------------- ----- XS_FILE_NAME 16 XStatusText 4 st_onkey 192 menutexts 48 st_icons_set 248 stmenu_ghook 20 st_menuhdr 64 st_menusoftkeys 12 st_menu_sk 24 st_menu_skt 8 DispStatusChangeMenu 236 edit_x_sk 24 edit_x_skt 8 edit_xstatus_locret 4 ReplaceStr 152 edit_xstatus_onkey 644 edit_xstatus_ghook 48 sk 8 edit_xstatus_desc 76 EditXStatus 816 xst_onkey 80 xst_ghook 64 xst_itemh 388 xst_menu_sk 24 xst_menu_skt 8 xst_menuhdr 68 DispXStatusChangeMenu 112 LoadXStatusText 244 SaveXStatusText 132 FreeXStatusText 28 GetXStatusStr 112 ??DataTable4 4 ??DataTable5 4 ??DataTable8 4 ??DataTable9 4 ??DataTable11 4 ??DataTable12 4 ??DataTable17 4 ??DataTable18 4 ??DataTable20 4 ? 24 ? 8 ? 8 ? 76 ? 8 ? 4 ? 8 ? 8 ? 8 ? 1 ? 12 ? 8 ? 24 ? 8 ? 8 ? 8 ? 8 Others 152 3 684 bytes in segment CODE 541 bytes in segment DATA_C 116 bytes in segment DATA_I 116 bytes in segment DATA_ID 4 bytes in segment DATA_Z 24 bytes in segment INITTAB 3 556 bytes of CODE memory (+ 152 bytes shared) 657 bytes of CONST memory 120 bytes of DATA memory Errors: none Warnings: none