############################################################################## # # # IAR ARM ANSI C/C++ Compiler V4.42A/W32 EVALUATION 29/Oct/2008 03:34:20 # # Copyright 1999-2005 IAR Systems. All rights reserved. # # # # Cpu mode = interwork # # Endian = little # # Stack alignment = 4 # # Source file = D:\Pasha\elf\_MY_PROJECT_\NRSS\main.c # # Command line = D:\Pasha\elf\_MY_PROJECT_\NRSS\main.c -D NEWSGOLD # # -D ELKA -lCN D:\Pasha\elf\_MY_PROJECT_\NRSS\Release_ # # ELKA\List\ -la D:\Pasha\elf\_MY_PROJECT_\NRSS\Releas # # e_ELKA\List\ -o D:\Pasha\elf\_MY_PROJECT_\NRSS\Relea # # se_ELKA\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\_MY_PROJECT_\NRSS\Release_ELKA\List\mai # # n.lst # # Object file = D:\Pasha\elf\_MY_PROJECT_\NRSS\Release_ELKA\Obj\main # # .r79 # # # # # ############################################################################## D:\Pasha\elf\_MY_PROJECT_\NRSS\main.c 1 #include "..\inc\swilib.h" 2 #include "rect_patcher.h" 3 #include "decode_xml.h" 4 #include "conf_loader.h" 5 #include "config_data.h" 6 #include "strings.h" 7 #include "main.h" 8 #include "items_menu.h" 9 #include "print.h" 10 int sock; 11 12 int connect_state; 13 int is_gprs_online; 14 int DNR_TRIES; 15 int DNR_ID; 16 17 int ALLTOTALRECEIVED; 18 int ALLTOTALSENDED; 19 20 char logmsg[256]; 21 GBSTMR mytmr; 22 23 24 25 \ In segment DATA_I, align 4, align-sorted 26 SOFTKEY_DESC menu_sk[]= \ menu_sk: \ 00000000 DS8 24 \ 00000018 REQUIRE `?` 27 { 28 {0x0018,0x0000,(int)"Лев"}, 29 {0x0001,0x0000,(int)"Прав"}, 30 {0x003D,0x0000,(int)LGP_DOIT_PIC} 31 }; 32 \ In segment DATA_I, align 4, align-sorted 33 SOFTKEYSTAB menu_skt= \ menu_skt: \ 00000000 DS8 8 \ 00000008 REQUIRE `?` 34 { 35 menu_sk,0 36 }; 37 38 39 40 //===================================================================== 41 42 43 RSS_ITEM *rss_first; 44 RSS_ITEM *rss_last; 45 46 \ In segment CODE, align 4, keep-with-next 47 void FreeRssItems(void) 48 { \ FreeRssItems: \ 00000000 30402DE9 PUSH {R4,R5,LR} 49 RSS_ITEM *p=rss_first; \ 00000004 ........ LDR R4,??DataTable14 ;; sock \ 00000008 1C5094E5 LDR R5,[R4, #+28] 50 LockSched(); \ 0000000C 460100EF SWI +326 51 rss_first=NULL; \ 00000010 0000A0E3 MOV R0,#+0 \ 00000014 1C0084E5 STR R0,[R4, #+28] 52 UnlockSched(); \ 00000018 470100EF SWI +327 \ 0000001C 000055E3 CMP R5,#+0 \ 00000020 3080BD08 POPEQ {R4,R5,PC} 53 while(p) 54 { 55 RSS_ITEM *pr=p->next; \ ??FreeRssItems_0: \ 00000024 004095E5 LDR R4,[R5, #+0] 56 mfree(p->title); \ 00000028 040095E5 LDR R0,[R5, #+4] \ 0000002C 150000EF SWI +21 57 mfree(p->description); \ 00000030 080095E5 LDR R0,[R5, #+8] \ 00000034 150000EF SWI +21 58 p=pr; \ 00000038 0450B0E1 MOVS R5,R4 59 } \ 0000003C F8FFFF1A BNE ??FreeRssItems_0 60 } \ 00000040 3080BDE8 POP {R4,R5,PC} ;; return 61 62 //===================================================================== \ In segment CODE, align 4, keep-with-next 63 void create_connect(void) 64 { \ create_connect: \ 00000000 F0412DE9 PUSH {R4-R8,LR} 65 char *s, *d; 66 int c; 67 char rss_host[64]; 68 unsigned int rss_port=80; 69 int ***p_res=NULL; 70 SOCK_ADDR sa; 71 //Устанавливаем соединение 72 connect_state = 0; \ 00000004 ........ LDR R6,??DataTable10 ;; sock \ 00000008 54D04DE2 SUB SP,SP,#+84 \ 0000000C 5040A0E3 MOV R4,#+80 \ 00000010 0050A0E3 MOV R5,#+0 \ 00000014 00508DE5 STR R5,[SP, #+0] \ 00000018 045086E5 STR R5,[R6, #+4] 73 int err; 74 unsigned int ip; 75 if (!IsGPRSEnabled()) \ 0000001C A70000EF SWI +167 \ 00000020 000050E3 CMP R0,#+0 76 { 77 is_gprs_online=0; \ 00000024 08508605 STREQ R5,[R6, #+8] 78 return; \ 00000028 8900000A BEQ ??create_connect_0 79 } 80 DNR_ID=0; 81 *socklasterr()=0; 82 if ((s=strchr(RSS_URL,':'))) \ 0000002C ........ LDR R7,??DataTable11 ;; RSS_URL \ 00000030 105086E5 STR R5,[R6, #+16] \ 00000034 7C8100EF SWI +33148 \ 00000038 005080E5 STR R5,[R0, #+0] \ 0000003C 3A10A0E3 MOV R1,#+58 \ 00000040 0700A0E1 MOV R0,R7 \ 00000044 180000EF SWI +24 \ 00000048 000050E3 CMP R0,#+0 \ 0000004C 0600000A BEQ ??create_connect_1 83 { 84 if (*(s+1)=='/' && *(s+2)=='/') \ 00000050 011080E2 ADD R1,R0,#+1 \ 00000054 0020D1E5 LDRB R2,[R1, #+0] \ 00000058 2F0052E3 CMP R2,#+47 \ 0000005C 0110D105 LDRBEQ R1,[R1, #+1] \ 00000060 2F005103 CMPEQ R1,#+47 \ 00000064 0200001A BNE ??create_connect_2 85 { 86 s+=3; \ 00000068 030080E2 ADD R0,R0,#+3 87 } 88 else s=0; 89 } 90 if (!s) s=(char *)RSS_URL; \ ??create_connect_1: \ 0000006C 000050E3 CMP R0,#+0 \ 00000070 0000001A BNE ??create_connect_3 \ ??create_connect_2: \ 00000074 0700A0E1 MOV R0,R7 91 92 d=rss_host; \ ??create_connect_3: \ 00000078 14108DE2 ADD R1,SP,#+20 \ 0000007C 000000EA B ??create_connect_4 93 while((c=*s++)) 94 { 95 if (c=='/' || c==':') break; 96 *d++=c; \ ??create_connect_5: \ 00000080 ........ STRB R2,[R1], #+1 \ ??create_connect_4: \ 00000084 ........ LDRB R2,[R0], #+1 \ 00000088 000052E3 CMP R2,#+0 \ 0000008C 2F005213 CMPNE R2,#+47 \ 00000090 3A005213 CMPNE R2,#+58 \ 00000094 F9FFFF1A BNE ??create_connect_5 97 } 98 *d=0; \ 00000098 0050C1E5 STRB R5,[R1, #+0] 99 100 if ((s=strrchr(RSS_URL,':'))) \ 0000009C 3A10A0E3 MOV R1,#+58 \ 000000A0 0700A0E1 MOV R0,R7 \ 000000A4 170100EF SWI +279 \ 000000A8 000050E3 CMP R0,#+0 \ 000000AC 1300000A BEQ ??create_connect_6 101 { 102 if (*(s+1)!='/' || *(s+2)!='/') \ 000000B0 0110D0E5 LDRB R1,[R0, #+1] \ 000000B4 2F0051E3 CMP R1,#+47 \ 000000B8 0210D005 LDRBEQ R1,[R0, #+2] \ 000000BC 2F005103 CMPEQ R1,#+47 \ 000000C0 0E00000A BEQ ??create_connect_6 103 { 104 rss_port=0; \ 000000C4 0040A0E3 MOV R4,#+0 105 s++; \ 000000C8 010080E2 ADD R0,R0,#+1 \ 000000CC 0A10A0E3 MOV R1,#+10 \ 000000D0 010000EA B ??create_connect_7 106 while((c=*s++)) 107 { 108 if (c=='/' || c==':' || !(c>='0' && c<='9')) break; 109 rss_port*=10; 110 rss_port+=c-'0'; \ ??create_connect_8: \ 000000D4 302042E2 SUB R2,R2,#+48 \ 000000D8 912424E0 MLA R4,R1,R4,R2 \ ??create_connect_7: \ 000000DC ........ LDRB R2,[R0], #+1 \ 000000E0 000052E3 CMP R2,#+0 \ 000000E4 2F005213 CMPNE R2,#+47 \ 000000E8 3A005213 CMPNE R2,#+58 \ 000000EC 0300000A BEQ ??create_connect_6 \ 000000F0 300052E3 CMP R2,#+48 \ 000000F4 010000BA BLT ??create_connect_6 \ 000000F8 3A0052E3 CMP R2,#+58 \ 000000FC F4FFFFBA BLT ??create_connect_8 111 } 112 } 113 } 114 sprintf(logmsg, "Connect to: %s Using port: %d", rss_host, rss_port); \ ??create_connect_6: \ 00000100 54719FE5 LDR R7,??create_connect_9 ;; `?` \ 00000104 0430A0E1 MOV R3,R4 \ 00000108 14208DE2 ADD R2,SP,#+20 \ 0000010C 081087E2 ADD R1,R7,#+8 \ 00000110 400086E2 ADD R0,R6,#+64 \ 00000114 160000EF SWI +22 115 REDRAW(); \ 00000118 720100EF SWI +370 116 ip=str2ip(rss_host); \ 0000011C 14008DE2 ADD R0,SP,#+20 \ 00000120 B70100EF SWI +439 117 if (ip!=0xFFFFFFFF) \ 00000124 0580E0E1 MVN R8,R5 \ 00000128 080050E1 CMP R0,R8 118 { 119 sa.ip=ip; \ 0000012C 08008D15 STRNE R0,[SP, #+8] 120 goto L_CONNECT; \ 00000130 2400001A BNE ??create_connect_10 121 } 122 err=async_gethostbyname(rss_host,&p_res,&DNR_ID); //03461351 3<70<19<81 \ 00000134 102086E2 ADD R2,R6,#+16 \ 00000138 0D10A0E1 MOV R1,SP \ 0000013C 14008DE2 ADD R0,SP,#+20 \ 00000140 B60100EF SWI +438 \ 00000144 0030B0E1 MOVS R3,R0 123 if (err) \ 00000148 0E00000A BEQ ??create_connect_11 124 { 125 if ((err==0xC9)||(err==0xD6)) \ 0000014C C90053E3 CMP R3,#+201 \ 00000150 D6005313 CMPNE R3,#+214 \ 00000154 0600001A BNE ??create_connect_12 126 { 127 if (DNR_ID) \ 00000158 100096E5 LDR R0,[R6, #+16] \ 0000015C 000050E3 CMP R0,#+0 \ 00000160 0800000A BEQ ??create_connect_11 128 { 129 strcpy(logmsg, "Wait DNR"); \ 00000164 281087E2 ADD R1,R7,#+40 \ 00000168 400086E2 ADD R0,R6,#+64 \ 0000016C 1A0000EF SWI +26 130 REDRAW(); \ 00000170 310000EA B ??create_connect_13 131 return; //Ждем готовности DNR 132 } 133 } 134 else 135 { 136 snprintf(logmsg,255,"DNR error %d",err); \ ??create_connect_12: \ 00000174 342087E2 ADD R2,R7,#+52 \ 00000178 FF10A0E3 MOV R1,#+255 \ 0000017C 400086E2 ADD R0,R6,#+64 \ 00000180 1B0100EF SWI +283 137 return; \ 00000184 2D0000EA B ??create_connect_14 138 } 139 } 140 if (p_res) \ ??create_connect_11: \ 00000188 00009DE5 LDR R0,[SP, #+0] \ 0000018C 000050E3 CMP R0,#+0 \ 00000190 2C00000A BEQ ??create_connect_15 141 { 142 if (p_res[3]) \ 00000194 0C0090E5 LDR R0,[R0, #+12] \ 00000198 000050E3 CMP R0,#+0 \ 0000019C 2C00000A BEQ ??create_connect_0 143 { 144 strcpy(logmsg,"DNR ok!"); \ 000001A0 0710A0E1 MOV R1,R7 \ 000001A4 400086E2 ADD R0,R6,#+64 \ 000001A8 1A0000EF SWI +26 145 REDRAW(); \ 000001AC 720100EF SWI +370 146 DNR_TRIES=0; \ 000001B0 0C5086E5 STR R5,[R6, #+12] 147 sa.ip=p_res[3][0][0]; \ 000001B4 00109DE5 LDR R1,[SP, #+0] \ 000001B8 0C1091E5 LDR R1,[R1, #+12] \ 000001BC 001091E5 LDR R1,[R1, #+0] \ 000001C0 001091E5 LDR R1,[R1, #+0] \ 000001C4 08108DE5 STR R1,[SP, #+8] 148 L_CONNECT: 149 sock=socket(1,1,0); \ ??create_connect_10: \ 000001C8 0020A0E3 MOV R2,#+0 \ 000001CC 0110A0E3 MOV R1,#+1 \ 000001D0 0100A0E1 MOV R0,R1 \ 000001D4 730100EF SWI +371 \ 000001D8 000086E5 STR R0,[R6, #+0] 150 if (sock!=-1) \ 000001DC 080050E1 CMP R0,R8 \ 000001E0 1100000A BEQ ??create_connect_16 151 { 152 sa.family=1; \ 000001E4 0150A0E3 MOV R5,#+1 \ 000001E8 B450CDE1 STRH R5,[SP, #+4] 153 sa.port=htons(rss_port); \ 000001EC 0408A0E1 MOV R0,R4, LSL #+16 \ 000001F0 2008A0E1 MOV R0,R0, LSR #+16 \ 000001F4 7A0100EF SWI +378 \ 000001F8 B600CDE1 STRH R0,[SP, #+6] 154 if (connect(sock,&sa,sizeof(sa))!=-1) \ 000001FC 000096E5 LDR R0,[R6, #+0] \ 00000200 1020A0E3 MOV R2,#+16 \ 00000204 04108DE2 ADD R1,SP,#+4 \ 00000208 740100EF SWI +372 \ 0000020C 080050E1 CMP R0,R8 155 { 156 connect_state=1; \ 00000210 04508615 STRNE R5,[R6, #+4] \ 00000214 0E00001A BNE ??create_connect_0 157 } 158 else 159 { 160 closesocket(sock); \ 00000218 000096E5 LDR R0,[R6, #+0] \ 0000021C 760100EF SWI +374 161 sock=-1; \ 00000220 008086E5 STR R8,[R6, #+0] 162 snprintf(logmsg,255,"Connect fault"); \ 00000224 442087E2 ADD R2,R7,#+68 \ 00000228 000000EA B ??create_connect_17 163 REDRAW(); 164 } 165 } 166 else 167 { 168 snprintf(logmsg,255,"Error Create Socket"); \ ??create_connect_16: \ 0000022C 542087E2 ADD R2,R7,#+84 \ ??create_connect_17: \ 00000230 FF10A0E3 MOV R1,#+255 \ 00000234 400086E2 ADD R0,R6,#+64 \ 00000238 1B0100EF SWI +283 169 REDRAW(); \ ??create_connect_13: \ 0000023C 720100EF SWI +370 \ ??create_connect_14: \ 00000240 54D08DE2 ADD SP,SP,#+84 \ 00000244 F081BDE8 POP {R4-R8,PC} 170 } 171 } 172 } 173 else 174 { 175 DNR_TRIES--; \ ??create_connect_15: \ 00000248 0C0096E5 LDR R0,[R6, #+12] \ 0000024C 010040E2 SUB R0,R0,#+1 \ 00000250 0C0086E5 STR R0,[R6, #+12] \ ??create_connect_0: \ 00000254 54D08DE2 ADD SP,SP,#+84 ;; stack cleaning \ 00000258 F081BDE8 POP {R4-R8,PC} ;; return \ ??create_connect_9: \ 0000025C ........ DC32 `?` 176 } 177 } 178 179 \ In segment CODE, align 4, keep-with-next 180 void do_start_connection(void) 181 { 182 SUBPROC((void *)create_connect); \ do_start_connection: \ 00000000 ........ LDR R0,??DataTable18 ;; create_connect \ 00000004 00402DE9 PUSH {LR} \ 00000008 710100EF SWI +369 183 } \ 0000000C 0080BDE8 POP {PC} ;; return 184 185 char *recv_buf=NULL; 186 int recv_buf_len=0; 187 188 char *send_buf=NULL; 189 int send_buf_len=0; 190 191 char *xml_buf=NULL; 192 int xml_buf_len=0; 193 194 \ In segment CODE, align 4, keep-with-next 195 void free_xml_buf(void) 196 { 197 char *p=xml_buf; \ free_xml_buf: \ 00000000 ........ LDR R1,??DataTable14 ;; sock \ 00000004 00402DE9 PUSH {LR} \ 00000008 340091E5 LDR R0,[R1, #+52] 198 xml_buf_len=0; \ 0000000C 0020A0E3 MOV R2,#+0 \ 00000010 382081E5 STR R2,[R1, #+56] 199 xml_buf=NULL; \ 00000014 342081E5 STR R2,[R1, #+52] 200 mfree(p); \ 00000018 150000EF SWI +21 201 } \ 0000001C 0080BDE8 POP {PC} ;; return 202 \ In segment CODE, align 4, keep-with-next 203 void free_recv_buf(void) 204 { 205 char *p=recv_buf; \ free_recv_buf: \ 00000000 ........ LDR R1,??DataTable14 ;; sock \ 00000004 00402DE9 PUSH {LR} \ 00000008 240091E5 LDR R0,[R1, #+36] 206 recv_buf_len=0; \ 0000000C 0020A0E3 MOV R2,#+0 \ 00000010 282081E5 STR R2,[R1, #+40] 207 recv_buf=NULL; \ 00000014 242081E5 STR R2,[R1, #+36] 208 mfree(p); \ 00000018 150000EF SWI +21 209 } \ 0000001C 0080BDE8 POP {PC} ;; return \ In segment DATA_Z, align 4, align-sorted \ sock: \ 00000000 DS8 4 \ connect_state: \ 00000004 DS8 4 \ is_gprs_online: \ 00000008 DS8 4 \ DNR_TRIES: \ 0000000C DS8 4 \ DNR_ID: \ 00000010 DS8 4 \ ALLTOTALRECEIVED: \ 00000014 DS8 4 \ ALLTOTALSENDED: \ 00000018 DS8 4 \ rss_first: \ 0000001C DS8 4 \ rss_last: \ 00000020 DS8 4 \ recv_buf: \ 00000024 DS8 4 \ recv_buf_len: \ 00000028 DS8 4 \ send_buf: \ 0000002C DS8 4 \ send_buf_len: \ 00000030 DS8 4 \ xml_buf: \ 00000034 DS8 4 \ xml_buf_len: \ 00000038 DS8 4 210 211 int receive_mode; \ receive_mode: \ 0000003C DS8 4 \ logmsg: \ 00000040 DS8 256 \ In segment DATA_Z, align 4, align-sorted \ mytmr: \ 00000000 DS8 16 \ In segment CODE, align 4, keep-with-next 212 void get_answer(void) 213 { \ get_answer: \ 00000000 F0402DE9 PUSH {R4-R7,LR} 214 char buf[1024]; 215 int j; 216 j=recv(sock,buf,sizeof(buf),0); \ 00000004 ........ LDR R4,??DataTable10 ;; sock \ 00000008 40DE4DE2 SUB SP,SP,#+1024 \ 0000000C 000094E5 LDR R0,[R4, #+0] \ 00000010 0030A0E3 MOV R3,#+0 \ 00000014 402EA0E3 MOV R2,#+1024 \ 00000018 0D10A0E1 MOV R1,SP \ 0000001C 780100EF SWI +376 \ 00000020 0050A0E1 MOV R5,R0 217 if (j>0) \ 00000024 010055E3 CMP R5,#+1 \ 00000028 470000BA BLT ??get_answer_0 218 { 219 ALLTOTALRECEIVED+=j; \ 0000002C 140094E5 LDR R0,[R4, #+20] 220 if (receive_mode) \ 00000030 0060A0E3 MOV R6,#+0 \ 00000034 000085E0 ADD R0,R5,R0 \ 00000038 140084E5 STR R0,[R4, #+20] \ 0000003C 3C0094E5 LDR R0,[R4, #+60] \ 00000040 000050E3 CMP R0,#+0 \ 00000044 1400000A BEQ ??get_answer_1 221 { 222 xml_buf=realloc(xml_buf, xml_buf_len+j+1); \ 00000048 380094E5 LDR R0,[R4, #+56] \ 0000004C 000085E0 ADD R0,R5,R0 \ 00000050 011080E2 ADD R1,R0,#+1 \ 00000054 340094E5 LDR R0,[R4, #+52] \ 00000058 BA0000EF SWI +186 \ 0000005C 340084E5 STR R0,[R4, #+52] 223 xml_buf[xml_buf_len+j]=0; \ 00000060 380094E5 LDR R0,[R4, #+56] \ 00000064 341094E5 LDR R1,[R4, #+52] \ 00000068 000085E0 ADD R0,R5,R0 \ 0000006C 0160C0E7 STRB R6,[R0, +R1] 224 memcpy(xml_buf+xml_buf_len, buf, j); \ 00000070 380094E5 LDR R0,[R4, #+56] \ 00000074 343094E5 LDR R3,[R4, #+52] \ 00000078 0520A0E1 MOV R2,R5 \ 0000007C 0D10A0E1 MOV R1,SP \ 00000080 030080E0 ADD R0,R0,R3 \ 00000084 1E0100EF SWI +286 225 xml_buf_len+=j; \ 00000088 380094E5 LDR R0,[R4, #+56] \ 0000008C 000085E0 ADD R0,R5,R0 \ 00000090 380084E5 STR R0,[R4, #+56] \ 00000094 40DE8DE2 ADD SP,SP,#+1024 \ 00000098 F080BDE8 POP {R4-R7,PC} 226 } 227 else 228 { 229 char *end_answer; 230 recv_buf=realloc(recv_buf, recv_buf_len+j+1); \ ??get_answer_1: \ 0000009C 280094E5 LDR R0,[R4, #+40] \ 000000A0 000085E0 ADD R0,R5,R0 \ 000000A4 011080E2 ADD R1,R0,#+1 \ 000000A8 240094E5 LDR R0,[R4, #+36] \ 000000AC BA0000EF SWI +186 \ 000000B0 240084E5 STR R0,[R4, #+36] 231 recv_buf[recv_buf_len+j]=0; \ 000000B4 280094E5 LDR R0,[R4, #+40] \ 000000B8 241094E5 LDR R1,[R4, #+36] \ 000000BC 000085E0 ADD R0,R5,R0 \ 000000C0 0160C0E7 STRB R6,[R0, +R1] 232 memcpy(recv_buf+recv_buf_len, buf, j); \ 000000C4 280094E5 LDR R0,[R4, #+40] \ 000000C8 243094E5 LDR R3,[R4, #+36] \ 000000CC 0520A0E1 MOV R2,R5 \ 000000D0 0D10A0E1 MOV R1,SP \ 000000D4 030080E0 ADD R0,R0,R3 \ 000000D8 1E0100EF SWI +286 233 recv_buf_len+=j; \ 000000DC 280094E5 LDR R0,[R4, #+40] 234 if (!(end_answer=strstr(recv_buf, "\r\n\r\n"))) return; \ 000000E0 6C109FE5 LDR R1,??get_answer_2 ;; `?` \ 000000E4 000085E0 ADD R0,R5,R0 \ 000000E8 280084E5 STR R0,[R4, #+40] \ 000000EC 240094E5 LDR R0,[R4, #+36] \ 000000F0 180100EF SWI +280 \ 000000F4 0070B0E1 MOVS R7,R0 \ 000000F8 1300000A BEQ ??get_answer_0 235 receive_mode=1; //Остальное транслируем напрямую 236 end_answer+=4; 237 j=recv_buf_len-(end_answer-recv_buf); \ 000000FC 241094E5 LDR R1,[R4, #+36] \ 00000100 0100A0E3 MOV R0,#+1 \ 00000104 3C0084E5 STR R0,[R4, #+60] \ 00000108 280094E5 LDR R0,[R4, #+40] \ 0000010C 047087E2 ADD R7,R7,#+4 \ 00000110 011047E0 SUB R1,R7,R1 \ 00000114 015040E0 SUB R5,R0,R1 238 free_xml_buf(); \ 00000118 ........ BL free_xml_buf 239 if (!j) return; //Нет данных, нечего посылать \ 0000011C 000055E3 CMP R5,#+0 \ 00000120 0900000A BEQ ??get_answer_0 240 xml_buf=malloc(j+1); \ 00000124 010085E2 ADD R0,R5,#+1 \ 00000128 140000EF SWI +20 \ 0000012C 340084E5 STR R0,[R4, #+52] 241 xml_buf[j]=0; \ 00000130 0060C5E7 STRB R6,[R5, +R0] 242 memcpy(xml_buf, end_answer, j); \ 00000134 340094E5 LDR R0,[R4, #+52] \ 00000138 0520A0E1 MOV R2,R5 \ 0000013C 0710A0E1 MOV R1,R7 \ 00000140 1E0100EF SWI +286 243 xml_buf_len=j; \ 00000144 385084E5 STR R5,[R4, #+56] 244 free_recv_buf(); \ 00000148 ........ BL free_recv_buf \ ??get_answer_0: \ 0000014C 40DE8DE2 ADD SP,SP,#+1024 ;; stack cleaning \ 00000150 F080BDE8 POP {R4-R7,PC} ;; return \ ??get_answer_2: \ 00000154 ........ DC32 `?` 245 } 246 } 247 } 248 \ In segment CODE, align 4, keep-with-next 249 void free_send_buf(void) 250 { 251 char *p=send_buf; \ free_send_buf: \ 00000000 ........ LDR R1,??DataTable14 ;; sock \ 00000004 00402DE9 PUSH {LR} \ 00000008 2C0091E5 LDR R0,[R1, #+44] 252 send_buf_len=0; \ 0000000C 0020A0E3 MOV R2,#+0 \ 00000010 302081E5 STR R2,[R1, #+48] 253 send_buf=NULL; \ 00000014 2C2081E5 STR R2,[R1, #+44] 254 mfree(p); \ 00000018 150000EF SWI +21 255 #ifdef SEND_TIMER 256 GBS_DelTimer(&send_tmr); 257 #endif 258 } \ 0000001C 0080BDE8 POP {PC} ;; return 259 260 #ifdef SEND_TIMER 261 static void resend(void) 262 { 263 void send_answer(char *buf, int len); 264 SUBPROC((void*)send_answer,0,0); 265 } 266 #endif 267 \ In segment CODE, align 4, keep-with-next 268 void send_answer(char *buf, int len) 269 { \ send_answer: \ 00000000 70402DE9 PUSH {R4-R6,LR} 270 int i, j; 271 char *p; 272 if (buf) \ 00000004 ........ LDR R4,??DataTable10 ;; sock \ 00000008 0050A0E1 MOV R5,R0 \ 0000000C 0160A0E1 MOV R6,R1 \ 00000010 000055E3 CMP R5,#+0 \ 00000014 1F00000A BEQ ??send_answer_0 273 { 274 if (send_buf) \ 00000018 2C0094E5 LDR R0,[R4, #+44] \ 0000001C 000050E3 CMP R0,#+0 \ 00000020 0E00000A BEQ ??send_answer_1 275 { 276 send_buf=realloc(send_buf,send_buf_len+len); \ 00000024 301094E5 LDR R1,[R4, #+48] \ 00000028 011086E0 ADD R1,R6,R1 \ 0000002C BA0000EF SWI +186 \ 00000030 2C0084E5 STR R0,[R4, #+44] 277 memcpy(send_buf+send_buf_len, buf, len); \ 00000034 300094E5 LDR R0,[R4, #+48] \ 00000038 2C3094E5 LDR R3,[R4, #+44] \ 0000003C 0620A0E1 MOV R2,R6 \ 00000040 0510A0E1 MOV R1,R5 \ 00000044 030080E0 ADD R0,R0,R3 \ 00000048 1E0100EF SWI +286 278 send_buf_len+=len; \ 0000004C 300094E5 LDR R0,[R4, #+48] \ 00000050 000086E0 ADD R0,R6,R0 \ 00000054 300084E5 STR R0,[R4, #+48] 279 mfree(buf); \ 00000058 0500A0E1 MOV R0,R5 \ 0000005C 200000EA B ??send_answer_2 280 return; 281 } 282 send_buf=buf; \ ??send_answer_1: \ 00000060 2C5084E5 STR R5,[R4, #+44] 283 send_buf_len=len; \ 00000064 306084E5 STR R6,[R4, #+48] \ 00000068 0A0000EA B ??send_answer_0 284 } 285 while((i=send_buf_len)!=0) 286 { 287 if (i>0x400) i=0x400; 288 j=send(sock,send_buf,i,0); 289 if (j<0) 290 { 291 j=*socklasterr(); 292 if ((j==0xC9)||(j==0xD6)) 293 { 294 return; //Видимо, надо ждать сообщения ENIP_BUFFER_FREE 295 } 296 else 297 { 298 return; 299 } 300 } 301 ALLTOTALSENDED+=j; \ ??send_answer_3: \ 0000006C 180094E5 LDR R0,[R4, #+24] \ 00000070 000085E0 ADD R0,R5,R0 \ 00000074 180084E5 STR R0,[R4, #+24] 302 send_buf_len-=j; \ 00000078 300094E5 LDR R0,[R4, #+48] \ 0000007C 052040E0 SUB R2,R0,R5 303 memcpy(send_buf,send_buf+j,send_buf_len); //Удалили переданное \ 00000080 2C0094E5 LDR R0,[R4, #+44] \ 00000084 302084E5 STR R2,[R4, #+48] \ 00000088 001085E0 ADD R1,R5,R0 \ 0000008C 1E0100EF SWI +286 304 if (j=0) \ 00000004 ........ LDR R4,??DataTable10 ;; sock \ 00000008 000094E5 LDR R0,[R4, #+0] \ 0000000C 000050E3 CMP R0,#+0 \ 00000010 1080BD48 POPMI {R4,PC} 321 { 322 shutdown(sock,2); \ 00000014 0210A0E3 MOV R1,#+2 \ 00000018 770100EF SWI +375 323 closesocket(sock); \ 0000001C 000094E5 LDR R0,[R4, #+0] \ 00000020 760100EF SWI +374 324 } 325 #ifdef SEND_TIMER 326 GBS_DelTimer(&send_tmr); 327 #endif 328 } \ 00000024 1080BDE8 POP {R4,PC} ;; return 329 330 static void free_buffers(void) 331 { 332 free_recv_buf(); 333 free_send_buf(); 334 } 335 \ In segment CODE, align 4, keep-with-next 336 static void free_socket(void) 337 { 338 sock=-1; \ free_socket: \ 00000000 ........ LDR R0,??DataTable10 ;; sock \ 00000004 00402DE9 PUSH {LR} \ 00000008 0010E0E3 MVN R1,#+0 \ 0000000C 001080E5 STR R1,[R0, #+0] 339 connect_state=0; \ 00000010 0010A0E3 MOV R1,#+0 \ 00000014 041080E5 STR R1,[R0, #+4] 340 free_buffers(); \ 00000018 ........ BL free_recv_buf \ 0000001C ........ BL free_send_buf 341 REDRAW(); \ 00000020 720100EF SWI +370 342 } \ 00000024 0080BDE8 POP {PC} ;; return 343 \ In segment CODE, align 4, keep-with-next 344 void send_req(void) 345 { \ send_req: \ 00000000 30402DE9 PUSH {R4,R5,LR} 346 char *p; 347 char *s, *d; 348 int c, len; 349 char host[64], get_path[64]; 350 char req_buf[256]; 351 if ((s=strchr(RSS_URL, ':'))) \ 00000004 ........ LDR R4,??DataTable11 ;; RSS_URL \ 00000008 60DF4DE2 SUB SP,SP,#+384 \ 0000000C 3A10A0E3 MOV R1,#+58 \ 00000010 0400A0E1 MOV R0,R4 \ 00000014 180000EF SWI +24 \ 00000018 000050E3 CMP R0,#+0 \ 0000001C 0600000A BEQ ??send_req_0 352 { 353 if (*(s+1)=='/' && *(s+2)=='/') { \ 00000020 011080E2 ADD R1,R0,#+1 \ 00000024 0020D1E5 LDRB R2,[R1, #+0] \ 00000028 2F0052E3 CMP R2,#+47 \ 0000002C 0110D105 LDRBEQ R1,[R1, #+1] \ 00000030 2F005103 CMPEQ R1,#+47 \ 00000034 0200001A BNE ??send_req_1 354 s+=3; \ 00000038 030080E2 ADD R0,R0,#+3 355 } else { 356 s=0; 357 } 358 } 359 if (!s) s=(char *)RSS_URL; \ ??send_req_0: \ 0000003C 000050E3 CMP R0,#+0 \ 00000040 0000001A BNE ??send_req_2 \ ??send_req_1: \ 00000044 0400A0E1 MOV R0,R4 360 d=host; \ ??send_req_2: \ 00000048 401F8DE2 ADD R1,SP,#+256 \ 0000004C 010000EA B ??send_req_3 361 while((c=*s)) 362 { 363 if (c=='/') break; 364 *d++=c; \ ??send_req_4: \ 00000050 ........ STRB R2,[R1], #+1 365 s++; \ 00000054 010080E2 ADD R0,R0,#+1 \ ??send_req_3: \ 00000058 0020D0E5 LDRB R2,[R0, #+0] \ 0000005C 000052E3 CMP R2,#+0 \ 00000060 2F005213 CMPNE R2,#+47 \ 00000064 F9FFFF1A BNE ??send_req_4 366 } 367 *d=0; \ 00000068 0030A0E3 MOV R3,#+0 \ 0000006C 0030C1E5 STRB R3,[R1, #+0] 368 369 d=get_path; \ 00000070 501F8DE2 ADD R1,SP,#+320 \ 00000074 000000EA B ??send_req_5 370 while((c=*s)) 371 { 372 if (c==':') break; 373 *d++=c; \ ??send_req_6: \ 00000078 ........ STRB R2,[R1], #+1 374 s++; \ ??send_req_5: \ 0000007C ........ LDRB R2,[R0], #+1 \ 00000080 000052E3 CMP R2,#+0 \ 00000084 3A005213 CMPNE R2,#+58 \ 00000088 FAFFFF1A BNE ??send_req_6 375 } 376 *d=0; \ 0000008C 0030C1E5 STRB R3,[R1, #+0] 377 378 snprintf(req_buf,255,"GET %s" 379 " HTTP/1.0\r\nHost: %s\r\n\r\n", get_path, host); \ 00000090 48209FE5 LDR R2,??send_req_7 ;; `?` \ 00000094 400F8DE2 ADD R0,SP,#+256 \ 00000098 01002DE9 PUSH {R0} \ 0000009C 513F8DE2 ADD R3,SP,#+324 \ 000000A0 FF10A0E3 MOV R1,#+255 \ 000000A4 04008DE2 ADD R0,SP,#+4 \ 000000A8 1B0100EF SWI +283 380 p=malloc((len=strlen(req_buf))+1); \ 000000AC 04008DE2 ADD R0,SP,#+4 \ 000000B0 1B0000EF SWI +27 \ 000000B4 0040A0E1 MOV R4,R0 \ 000000B8 010084E2 ADD R0,R4,#+1 \ 000000BC 140000EF SWI +20 \ 000000C0 0050A0E1 MOV R5,R0 381 strcpy(p, req_buf); \ 000000C4 04108DE2 ADD R1,SP,#+4 \ 000000C8 1A0000EF SWI +26 382 send_answer(p, len); \ 000000CC 0410A0E1 MOV R1,R4 \ 000000D0 0500A0E1 MOV R0,R5 \ 000000D4 ........ BL send_answer 383 } \ 000000D8 61DF8DE2 ADD SP,SP,#+388 \ 000000DC 3080BDE8 POP {R4,R5,PC} ;; return \ ??send_req_7: \ 000000E0 ........ DC32 `?` 384 \ In segment CODE, align 4, keep-with-next 385 char *html_decode(char *s) 386 { \ html_decode: \ 00000000 F0472DE9 PUSH {R4-R10,LR} \ 00000004 0060A0E1 MOV R6,R0 387 int l=strlen(s); 388 int c; 389 char *d, *dest; 390 d=dest=malloc(l+1); \ 00000008 0D70A0E3 MOV R7,#+13 \ 0000000C C0A19FE5 LDR R10,??html_decode_0+0x10 ;; `?">` \ 00000010 1B0000EF SWI +27 \ 00000014 010080E2 ADD R0,R0,#+1 \ 00000018 140000EF SWI +20 \ 0000001C 0040A0E1 MOV R4,R0 \ 00000020 0450A0E1 MOV R5,R4 \ 00000024 2090A0E3 MOV R9,#+32 \ 00000028 010000EA B ??html_decode_1 391 while((c=*s++)) 392 { 393 if (c=='<') 394 { 395 if (!strncmp(s,"br>",3)) 396 { 397 *d++=13; \ ??html_decode_2: \ 0000002C ........ STRB R7,[R5], #+1 398 s+=3; \ ??html_decode_3: \ 00000030 036086E2 ADD R6,R6,#+3 399 continue; 400 } \ ??html_decode_1: \ 00000034 ........ LDRB R8,[R6], #+1 \ 00000038 000058E3 CMP R8,#+0 \ 0000003C 5C00000A BEQ ??html_decode_4 \ 00000040 3C0058E3 CMP R8,#+60 \ 00000044 2000001A BNE ??html_decode_5 \ 00000048 0320A0E3 MOV R2,#+3 \ 0000004C 5C1F8FE2 ADR R1,??html_decode_0 ;; "br>" \ 00000050 0600A0E1 MOV R0,R6 \ 00000054 150100EF SWI +277 \ 00000058 000050E3 CMP R0,#+0 \ 0000005C F2FFFF0A BEQ ??html_decode_2 401 if (!strncmp(s,"br />",5)) \ 00000060 0520A0E3 MOV R2,#+5 \ 00000064 0A10A0E1 MOV R1,R10 \ 00000068 0600A0E1 MOV R0,R6 \ 0000006C 150100EF SWI +277 \ 00000070 000050E3 CMP R0,#+0 \ 00000074 0200001A BNE ??html_decode_6 402 { 403 *d++=13; \ 00000078 ........ STRB R7,[R5], #+1 404 s+=5; \ ??html_decode_7: \ 0000007C 056086E2 ADD R6,R6,#+5 405 continue; \ 00000080 EBFFFFEA B ??html_decode_1 406 } 407 if (!strncmp(s,"/td>",4)) \ ??html_decode_6: \ 00000084 0420A0E3 MOV R2,#+4 \ 00000088 18108AE2 ADD R1,R10,#+24 \ 0000008C 0600A0E1 MOV R0,R6 \ 00000090 150100EF SWI +277 \ 00000094 000050E3 CMP R0,#+0 \ 00000098 0200001A BNE ??html_decode_8 408 { 409 *d++=' '; \ 0000009C ........ STRB R9,[R5], #+1 410 s+=4; \ ??html_decode_9: \ 000000A0 046086E2 ADD R6,R6,#+4 411 continue; \ 000000A4 E2FFFFEA B ??html_decode_1 412 } 413 if (!strncmp(s,"p>",2)) \ ??html_decode_8: \ 000000A8 0220A0E3 MOV R2,#+2 \ 000000AC 451F8FE2 ADR R1,??html_decode_0+0x4 ;; "p>" \ 000000B0 0600A0E1 MOV R0,R6 \ 000000B4 150100EF SWI +277 \ 000000B8 000050E3 CMP R0,#+0 \ 000000BC 3A00001A BNE ??html_decode_10 414 { 415 *d++=13; \ 000000C0 ........ STRB R7,[R5], #+1 416 s+=2; \ 000000C4 026086E2 ADD R6,R6,#+2 417 continue; \ 000000C8 D9FFFFEA B ??html_decode_1 418 } 419 } 420 if (c=='&') \ ??html_decode_5: \ 000000CC 260058E3 CMP R8,#+38 \ 000000D0 3500001A BNE ??html_decode_10 421 { 422 if (!strncmp(s,"quote;",6)) \ 000000D4 0620A0E3 MOV R2,#+6 \ 000000D8 08108AE2 ADD R1,R10,#+8 \ 000000DC 0600A0E1 MOV R0,R6 \ 000000E0 150100EF SWI +277 \ 000000E4 000050E3 CMP R0,#+0 \ 000000E8 0300001A BNE ??html_decode_11 423 { 424 *d++='\"'; \ 000000EC 2200A0E3 MOV R0,#+34 \ 000000F0 ........ STRB R0,[R5], #+1 425 s+=6; \ 000000F4 066086E2 ADD R6,R6,#+6 426 continue; \ 000000F8 CDFFFFEA B ??html_decode_1 427 } 428 if (!strncmp(s,"nbsp;",5)) \ ??html_decode_11: \ 000000FC 0520A0E3 MOV R2,#+5 \ 00000100 10108AE2 ADD R1,R10,#+16 \ 00000104 0600A0E1 MOV R0,R6 \ 00000108 150100EF SWI +277 \ 0000010C 000050E3 CMP R0,#+0 429 { 430 *d++=' '; \ 00000110 ........ STRBEQ R9,[R5], #+1 431 s+=5; \ 00000114 D8FFFF0A BEQ ??html_decode_7 432 continue; 433 } 434 if (!strncmp(s,"lt;",3)) \ 00000118 0320A0E3 MOV R2,#+3 \ 0000011C 2A1F8FE2 ADR R1,??html_decode_0+0x8 ;; "lt;" \ 00000120 0600A0E1 MOV R0,R6 \ 00000124 150100EF SWI +277 \ 00000128 000050E3 CMP R0,#+0 435 { 436 *d++='<'; \ 0000012C 3C00A003 MOVEQ R0,#+60 \ 00000130 ........ STRBEQ R0,[R5], #+1 437 s+=3; \ 00000134 BDFFFF0A BEQ ??html_decode_3 438 continue; 439 } 440 if (!strncmp(s,"gt;",3)) \ 00000138 0320A0E3 MOV R2,#+3 \ 0000013C 231F8FE2 ADR R1,??html_decode_0+0xC ;; "gt;" \ 00000140 0600A0E1 MOV R0,R6 \ 00000144 150100EF SWI +277 \ 00000148 000050E3 CMP R0,#+0 441 { 442 *d++='>'; \ 0000014C 3E00A003 MOVEQ R0,#+62 \ 00000150 ........ STRBEQ R0,[R5], #+1 443 s+=3; \ 00000154 B5FFFF0A BEQ ??html_decode_3 444 continue; 445 } 446 if (!strncmp(s,"amp;",4)) \ 00000158 0420A0E3 MOV R2,#+4 \ 0000015C 20108AE2 ADD R1,R10,#+32 \ 00000160 0600A0E1 MOV R0,R6 \ 00000164 150100EF SWI +277 \ 00000168 000050E3 CMP R0,#+0 447 { 448 *d++='&'; \ 0000016C 2600A003 MOVEQ R0,#+38 \ 00000170 ........ STRBEQ R0,[R5], #+1 449 s+=4; \ 00000174 C9FFFF0A BEQ ??html_decode_9 450 continue; 451 } 452 if (!strncmp(s,"copy;",5)) \ 00000178 0520A0E3 MOV R2,#+5 \ 0000017C 28108AE2 ADD R1,R10,#+40 \ 00000180 0600A0E1 MOV R0,R6 \ 00000184 150100EF SWI +277 \ 00000188 000050E3 CMP R0,#+0 \ 0000018C 0600001A BNE ??html_decode_10 453 { 454 *d++='('; \ 00000190 2800A0E3 MOV R0,#+40 \ 00000194 ........ STRB R0,[R5], #+1 455 *d++='c'; \ 00000198 6300A0E3 MOV R0,#+99 \ 0000019C ........ STRB R0,[R5], #+1 456 *d++=')'; \ 000001A0 2900A0E3 MOV R0,#+41 \ 000001A4 ........ STRB R0,[R5], #+1 457 s+=5; \ 000001A8 B3FFFFEA B ??html_decode_7 458 continue; 459 } 460 } 461 *d++=c; \ ??html_decode_10: \ 000001AC ........ STRB R8,[R5], #+1 \ 000001B0 9FFFFFEA B ??html_decode_1 462 } 463 *d=0; \ ??html_decode_4: \ 000001B4 0000A0E3 MOV R0,#+0 \ 000001B8 0000C5E5 STRB R0,[R5, #+0] 464 return dest; \ 000001BC 0400A0E1 MOV R0,R4 \ 000001C0 F087BDE8 POP {R4-R10,PC} ;; return \ ??html_decode_0: \ 000001C4 62723E00 DC8 "br>" \ 000001C8 703E0000 DC8 "p>",+0 \ 000001CC 6C743B00 DC8 "lt;" \ 000001D0 67743B00 DC8 "gt;" \ 000001D4 ........ DC32 `?">` 465 } 466 467 468 \ In segment CODE, align 4, keep-with-next 469 void DecodeRSS() 470 { \ DecodeRSS: \ 00000000 F04F2DE9 PUSH {R4-R11,LR} 471 XMLNode *root, *rss, *channel, *items, *item; 472 FreeRssItems(); 473 root=XMLDecode(xml_buf, xml_buf_len); \ 00000004 ........ LDR R4,??DataTable14 ;; sock \ 00000008 ........ BL FreeRssItems \ 0000000C 340094E5 LDR R0,[R4, #+52] \ 00000010 381094E5 LDR R1,[R4, #+56] \ 00000014 ........ _BLF XMLDecode,??XMLDecode??rA \ 00000018 0050B0E1 MOVS R5,R0 474 if (root) \ 0000001C F08FBD08 POPEQ {R4-R11,PC} 475 { 476 rss=root; \ 00000020 0560A0E1 MOV R6,R5 \ 00000024 020000EA B ??DecodeRSS_0 477 while(rss) 478 { 479 if (!strcmp(rss->name, "rss")) break; 480 rss=rss->next; \ ??DecodeRSS_1: \ 00000028 006096E5 LDR R6,[R6, #+0] \ 0000002C 000056E3 CMP R6,#+0 \ 00000030 4900000A BEQ ??DecodeRSS_2 \ ??DecodeRSS_0: \ 00000034 080096E5 LDR R0,[R6, #+8] \ 00000038 4A1F8FE2 ADR R1,??DecodeRSS_3 ;; "rss" \ 0000003C 190000EF SWI +25 \ 00000040 000050E3 CMP R0,#+0 \ 00000044 F7FFFF1A BNE ??DecodeRSS_1 481 } 482 if (rss) 483 { 484 channel=rss->subnode; \ 00000048 047096E5 LDR R7,[R6, #+4] \ 0000004C 18619FE5 LDR R6,??DecodeRSS_3+0x4 ;; `?` \ 00000050 000000EA B ??DecodeRSS_4 485 while(channel) 486 { 487 if (!strcmp(channel->name, "channel")) break; 488 channel=channel->next; \ ??DecodeRSS_5: \ 00000054 007097E5 LDR R7,[R7, #+0] \ ??DecodeRSS_4: \ 00000058 000057E3 CMP R7,#+0 \ 0000005C 3E00000A BEQ ??DecodeRSS_2 \ 00000060 080097E5 LDR R0,[R7, #+8] \ 00000064 0610A0E1 MOV R1,R6 \ 00000068 190000EF SWI +25 \ 0000006C 000050E3 CMP R0,#+0 \ 00000070 F7FFFF1A BNE ??DecodeRSS_5 489 } 490 if (channel) 491 { 492 items=channel->subnode; \ 00000074 047097E5 LDR R7,[R7, #+4] \ 00000078 000057E3 CMP R7,#+0 \ 0000007C 3600000A BEQ ??DecodeRSS_2 493 while(items) 494 { 495 if (!strcmp(items->name, "item")) \ ??DecodeRSS_6: \ 00000080 080097E5 LDR R0,[R7, #+8] \ 00000084 1C1086E2 ADD R1,R6,#+28 \ 00000088 190000EF SWI +25 \ 0000008C 000050E3 CMP R0,#+0 \ 00000090 2E00001A BNE ??DecodeRSS_7 496 { 497 char *desc=0, *title=0; 498 item=items->subnode; \ 00000094 04B097E5 LDR R11,[R7, #+4] \ 00000098 0090A0E3 MOV R9,#+0 \ 0000009C 00A0A0E3 MOV R10,#+0 499 RSS_ITEM *p=malloc(sizeof(RSS_ITEM)); \ 000000A0 0C00A0E3 MOV R0,#+12 \ 000000A4 140000EF SWI +20 \ 000000A8 0080A0E1 MOV R8,R0 500 zeromem(p, sizeof(RSS_ITEM)); \ 000000AC 0C10A0E3 MOV R1,#+12 \ 000000B0 1D0100EF SWI +285 \ 000000B4 00005BE3 CMP R11,#+0 \ 000000B8 1A00000A BEQ ??DecodeRSS_8 501 while(item) 502 { 503 if (!strcmp(item->name, "title")) title=item->value; \ ??DecodeRSS_9: \ 000000BC 08009BE5 LDR R0,[R11, #+8] \ 000000C0 081086E2 ADD R1,R6,#+8 \ 000000C4 190000EF SWI +25 \ 000000C8 000050E3 CMP R0,#+0 504 if (!strcmp(item->name, "description")) desc=item->value; \ 000000CC 08009BE5 LDR R0,[R11, #+8] \ 000000D0 10909B05 LDREQ R9,[R11, #+16] \ 000000D4 101086E2 ADD R1,R6,#+16 \ 000000D8 190000EF SWI +25 \ 000000DC 000050E3 CMP R0,#+0 \ 000000E0 10A09B05 LDREQ R10,[R11, #+16] 505 item=item->next; \ 000000E4 00B09BE5 LDR R11,[R11, #+0] 506 } \ 000000E8 00005BE3 CMP R11,#+0 \ 000000EC F2FFFF1A BNE ??DecodeRSS_9 507 if (title) \ 000000F0 000059E3 CMP R9,#+0 \ 000000F4 0600000A BEQ ??DecodeRSS_10 508 { 509 p->title=malloc(strlen(title)+1); \ 000000F8 0900A0E1 MOV R0,R9 \ 000000FC 1B0000EF SWI +27 \ 00000100 010080E2 ADD R0,R0,#+1 \ 00000104 140000EF SWI +20 \ 00000108 040088E5 STR R0,[R8, #+4] 510 strcpy(p->title, title); \ 0000010C 0910A0E1 MOV R1,R9 \ 00000110 1A0000EF SWI +26 511 } 512 if (desc) \ ??DecodeRSS_10: \ 00000114 00005AE3 CMP R10,#+0 \ 00000118 0200000A BEQ ??DecodeRSS_8 513 { 514 p->description=html_decode(desc); \ 0000011C 0A00A0E1 MOV R0,R10 \ 00000120 ........ BL html_decode \ 00000124 080088E5 STR R0,[R8, #+8] 515 } 516 if (!rss_first) \ ??DecodeRSS_8: \ 00000128 1C0094E5 LDR R0,[R4, #+28] \ 0000012C 000050E3 CMP R0,#+0 \ 00000130 0300001A BNE ??DecodeRSS_11 517 { 518 rss_last=rss_first=p; \ 00000134 1C8084E5 STR R8,[R4, #+28] \ 00000138 0800A0E1 MOV R0,R8 \ 0000013C 200084E5 STR R0,[R4, #+32] \ 00000140 020000EA B ??DecodeRSS_7 519 } 520 else 521 { 522 rss_last->next=p; \ ??DecodeRSS_11: \ 00000144 200094E5 LDR R0,[R4, #+32] \ 00000148 008080E5 STR R8,[R0, #+0] 523 rss_last=p; \ 0000014C 208084E5 STR R8,[R4, #+32] 524 } 525 } 526 items=items->next; \ ??DecodeRSS_7: \ 00000150 007097E5 LDR R7,[R7, #+0] 527 } \ 00000154 000057E3 CMP R7,#+0 \ 00000158 C8FFFF1A BNE ??DecodeRSS_6 528 } 529 } 530 DestroyTree(root); \ ??DecodeRSS_2: \ 0000015C 0500A0E1 MOV R0,R5 \ 00000160 ........ _BLF DestroyTree,??DestroyTree??rA 531 } 532 } \ 00000164 F08FBDE8 POP {R4-R11,PC} ;; return \ ??DecodeRSS_3: \ 00000168 72737300 DC8 "rss" \ 0000016C ........ DC32 `?` 533 534 \ In segment CODE, align 4, keep-with-next 535 static void OnRedraw(MAIN_GUI *data) 536 { \ OnRedraw: \ 00000000 F04F2DE9 PUSH {R4-R11,LR} 537 int scr_w=ScreenW(); 538 int scr_h=ScreenH(); 539 unsigned long RX=ALLTOTALRECEIVED; unsigned long TX=ALLTOTALSENDED; //by BoBa 10.07 \ 00000004 ........ LDR R6,??DataTable14 ;; sock \ 00000008 08D04DE2 SUB SP,SP,#+8 \ 0000000C 0040A0E1 MOV R4,R0 \ 00000010 888100EF SWI +33160 \ 00000014 0050A0E1 MOV R5,R0 \ 00000018 898100EF SWI +33161 \ 0000001C 141096E5 LDR R1,[R6, #+20] \ 00000020 00B0A0E1 MOV R11,R0 \ 00000024 00108DE5 STR R1,[SP, #+0] \ 00000028 181096E5 LDR R1,[R6, #+24] 540 int n=0; \ 0000002C 0080A0E3 MOV R8,#+0 \ 00000030 04108DE5 STR R1,[SP, #+4] 541 RSS_ITEM *p=(RSS_ITEM *)&rss_first; \ 00000034 1C0086E2 ADD R0,R6,#+28 \ 00000038 000000EA B ??OnRedraw_0 542 while((p=p->next)) n++; \ ??OnRedraw_1: \ 0000003C 018088E2 ADD R8,R8,#+1 \ ??OnRedraw_0: \ 00000040 000090E5 LDR R0,[R0, #+0] \ 00000044 000050E3 CMP R0,#+0 \ 00000048 FBFFFF1A BNE ??OnRedraw_1 543 DrawRoundedFrame(0,YDISP,ScreenW()-1,ScreenH()-1,0,0,0,GetPaletteAdrByColorIndex(4),GetPaletteAdrByColorIndex(1)); \ 0000004C 0100A0E3 MOV R0,#+1 \ 00000050 2E0100EF SWI +302 \ 00000054 0090A0E1 MOV R9,R0 \ 00000058 0400A0E3 MOV R0,#+4 \ 0000005C 2E0100EF SWI +302 \ 00000060 00A0A0E1 MOV R10,R0 \ 00000064 898100EF SWI +33161 \ 00000068 0070A0E1 MOV R7,R0 \ 0000006C 888100EF SWI +33160 \ 00000070 00022DE9 PUSH {R9} \ 00000074 00042DE9 PUSH {R10} \ 00000078 0010A0E3 MOV R1,#+0 \ 0000007C 02002DE9 PUSH {R1} \ 00000080 02002DE9 PUSH {R1} \ 00000084 02002DE9 PUSH {R1} \ 00000088 013047E2 SUB R3,R7,#+1 544 wsprintf(data->ws1, 545 "State: %d\n" 546 "Rx: %db, Tx: %db\n" 547 "Queue: %db\n" 548 "%t\n" 549 "Total items: %d",connect_state,RX,TX,send_buf_len,logmsg,n); \ 0000008C 7C719FE5 LDR R7,??OnRedraw_2+0x4 ;; `?` \ 00000090 012040E2 SUB R2,R0,#+1 \ 00000094 1810A0E3 MOV R1,#+24 \ 00000098 0000A0E3 MOV R0,#+0 \ 0000009C 500100EF SWI +336 \ 000000A0 00012DE9 PUSH {R8} \ 000000A4 400086E2 ADD R0,R6,#+64 \ 000000A8 01002DE9 PUSH {R0} \ 000000AC 300096E5 LDR R0,[R6, #+48] \ 000000B0 0710A0E1 MOV R1,R7 \ 000000B4 01002DE9 PUSH {R0} \ 000000B8 24009DE5 LDR R0,[SP, #+36] 550 DrawString(data->ws1,3,3+YDISP,scr_w-4,scr_h-4-GetFontYSIZE(FONT_MEDIUM_BOLD), 551 FONT_SMALL,0,GetPaletteAdrByColorIndex(0),GetPaletteAdrByColorIndex(23)); \ 000000BC 04A045E2 SUB R10,R5,#+4 \ 000000C0 01002DE9 PUSH {R0} \ 000000C4 24309DE5 LDR R3,[SP, #+36] \ 000000C8 042096E5 LDR R2,[R6, #+4] \ 000000CC 340094E5 LDR R0,[R4, #+52] \ 000000D0 04B04BE2 SUB R11,R11,#+4 \ 000000D4 240100EF SWI +292 \ 000000D8 24D08DE2 ADD SP,SP,#+36 \ 000000DC 1700A0E3 MOV R0,#+23 \ 000000E0 2E0100EF SWI +302 \ 000000E4 0080A0E1 MOV R8,R0 \ 000000E8 0000A0E3 MOV R0,#+0 \ 000000EC 2E0100EF SWI +302 \ 000000F0 0090A0E1 MOV R9,R0 \ 000000F4 0500A0E3 MOV R0,#+5 \ 000000F8 C50100EF SWI +453 \ 000000FC 00012DE9 PUSH {R8} \ 00000100 00022DE9 PUSH {R9} \ 00000104 0010A0E3 MOV R1,#+0 \ 00000108 02002DE9 PUSH {R1} \ 0000010C 00004BE0 SUB R0,R11,R0 \ 00000110 0A30A0E1 MOV R3,R10 \ 00000114 1B20A0E3 MOV R2,#+27 \ 00000118 0810A0E3 MOV R1,#+8 \ 0000011C 02002DE9 PUSH {R1} \ 00000120 01002DE9 PUSH {R0} \ 00000124 340094E5 LDR R0,[R4, #+52] \ 00000128 0310A0E3 MOV R1,#+3 552 553 wsprintf(data->ws1,rss_first? "List" :""); 554 DrawString(data->ws1,(scr_w >> 1),scr_h-4-GetFontYSIZE(FONT_MEDIUM_BOLD), 555 scr_w-4,scr_h-4,FONT_MEDIUM_BOLD,TEXT_ALIGNRIGHT,GetPaletteAdrByColorIndex(0),GetPaletteAdrByColorIndex(23)); \ 0000012C C550A0E1 ASR R5,R5,#+1 \ 00000130 4C0100EF SWI +332 \ 00000134 1C0096E5 LDR R0,[R6, #+28] \ 00000138 14D08DE2 ADD SP,SP,#+20 \ 0000013C 000050E3 CMP R0,#+0 \ 00000140 340094E5 LDR R0,[R4, #+52] \ 00000144 44108712 ADDNE R1,R7,#+68 \ 00000148 2F1F8F02 ADREQ R1,??OnRedraw_2 ;; "" \ 0000014C 240100EF SWI +292 \ 00000150 1700A0E3 MOV R0,#+23 \ 00000154 2E0100EF SWI +302 \ 00000158 0060A0E1 MOV R6,R0 \ 0000015C 0000A0E3 MOV R0,#+0 \ 00000160 2E0100EF SWI +302 \ 00000164 0080A0E1 MOV R8,R0 \ 00000168 0500A0E3 MOV R0,#+5 \ 0000016C C50100EF SWI +453 \ 00000170 40002DE9 PUSH {R6} \ 00000174 00012DE9 PUSH {R8} \ 00000178 0410A0E3 MOV R1,#+4 \ 0000017C 02002DE9 PUSH {R1} \ 00000180 0A30A0E1 MOV R3,R10 \ 00000184 00204BE0 SUB R2,R11,R0 \ 00000188 0510A0E3 MOV R1,#+5 \ 0000018C 02002DE9 PUSH {R1} \ 00000190 0B10A0E1 MOV R1,R11 \ 00000194 02002DE9 PUSH {R1} \ 00000198 340094E5 LDR R0,[R4, #+52] \ 0000019C 0510A0E1 MOV R1,R5 \ 000001A0 4C0100EF SWI +332 556 wsprintf(data->ws1,"Exit" ); \ 000001A4 340094E5 LDR R0,[R4, #+52] \ 000001A8 3C1087E2 ADD R1,R7,#+60 \ 000001AC 240100EF SWI +292 557 DrawString(data->ws1,3,scr_h-4-GetFontYSIZE(FONT_MEDIUM_BOLD), 558 scr_w>>1,scr_h-4,FONT_MEDIUM_BOLD,TEXT_ALIGNLEFT,GetPaletteAdrByColorIndex(0),GetPaletteAdrByColorIndex(23)); \ 000001B0 1700A0E3 MOV R0,#+23 \ 000001B4 2E0100EF SWI +302 \ 000001B8 0060A0E1 MOV R6,R0 \ 000001BC 0000A0E3 MOV R0,#+0 \ 000001C0 2E0100EF SWI +302 \ 000001C4 0070A0E1 MOV R7,R0 \ 000001C8 0500A0E3 MOV R0,#+5 \ 000001CC C50100EF SWI +453 \ 000001D0 40002DE9 PUSH {R6} \ 000001D4 80002DE9 PUSH {R7} \ 000001D8 0110A0E3 MOV R1,#+1 \ 000001DC 02002DE9 PUSH {R1} \ 000001E0 0530A0E1 MOV R3,R5 \ 000001E4 00204BE0 SUB R2,R11,R0 \ 000001E8 0510A0E3 MOV R1,#+5 \ 000001EC 02002DE9 PUSH {R1} \ 000001F0 0B10A0E1 MOV R1,R11 \ 000001F4 02002DE9 PUSH {R1} \ 000001F8 340094E5 LDR R0,[R4, #+52] \ 000001FC 0310A0E3 MOV R1,#+3 \ 00000200 4C0100EF SWI +332 \ 00000204 28D08DE2 ADD SP,SP,#+40 559 560 } \ 00000208 F38FBDE8 POP {R0,R1,R4-R11,PC} ;; return \ ??OnRedraw_2: \ 0000020C 00000000 DC8 "",+0,+0,+0 \ 00000210 ........ DC32 `?` 561 \ In segment CODE, align 4, keep-with-next 562 static void onCreate(MAIN_GUI *data, void *(*malloc_adr)(int)) 563 { \ onCreate: \ 00000000 10402DE9 PUSH {R4,LR} \ 00000004 0040A0E1 MOV R4,R0 564 data->ws1=AllocWS(256); \ 00000008 400FA0E3 MOV R0,#+256 \ 0000000C 250100EF SWI +293 \ 00000010 340084E5 STR R0,[R4, #+52] 565 data->gui.state=1; \ 00000014 0100A0E3 MOV R0,#+1 \ 00000018 0C00C4E5 STRB R0,[R4, #+12] 566 } \ 0000001C 1080BDE8 POP {R4,PC} ;; return 567 \ In segment CODE, align 4, keep-with-next 568 static void onClose(MAIN_GUI *data, void (*mfree_adr)(void *)) 569 { \ onClose: \ 00000000 00402DE9 PUSH {LR} 570 data->gui.state=0; \ 00000004 0010A0E3 MOV R1,#+0 \ 00000008 0C10C0E5 STRB R1,[R0, #+12] 571 FreeWS(data->ws1); \ 0000000C 340090E5 LDR R0,[R0, #+52] \ 00000010 290100EF SWI +297 572 } \ 00000014 0080BDE8 POP {PC} ;; return 573 \ In segment CODE, align 4, keep-with-next 574 static void onFocus(MAIN_GUI *data, void *(*malloc_adr)(int), void (*mfree_adr)(void *)) 575 { \ onFocus: \ 00000000 00402DE9 PUSH {LR} 576 data->gui.state=2; \ 00000004 0210A0E3 MOV R1,#+2 \ 00000008 0C10C0E5 STRB R1,[R0, #+12] 577 DisableIDLETMR(); \ 0000000C 7F0100EF SWI +383 578 } \ 00000010 0080BDE8 POP {PC} ;; return 579 \ In segment CODE, align 4, keep-with-next 580 static void onUnfocus(MAIN_GUI *data, void (*mfree_adr)(void *)) 581 { 582 if (data->gui.state!=2) return; \ onUnfocus: \ 00000000 0C10D0E5 LDRB R1,[R0, #+12] \ 00000004 020051E3 CMP R1,#+2 583 data->gui.state=1; \ 00000008 0110A003 MOVEQ R1,#+1 \ 0000000C 0C10C005 STRBEQ R1,[R0, #+12] 584 } \ 00000010 1EFF2FE1 BX LR ;; return 585 \ In segment CODE, align 4, keep-with-next 586 static int OnKey(MAIN_GUI *data, GUI_MSG *msg) 587 { \ OnKey: \ 00000000 00402DE9 PUSH {LR} 588 if (msg->gbsmsg->msg==KEY_DOWN) \ 00000004 040091E5 LDR R0,[R1, #+4] \ 00000008 9320A0E3 MOV R2,#+147 \ 0000000C 041090E5 LDR R1,[R0, #+4] \ 00000010 402F82E3 ORR R2,R2,#0x100 \ 00000014 020051E1 CMP R1,R2 \ 00000018 0C00001A BNE ??OnKey_0 589 { 590 switch(msg->gbsmsg->submess) \ 0000001C 080090E5 LDR R0,[R0, #+8] \ 00000020 ........ LDR R1,??DataTable14 ;; sock \ 00000024 010050E2 SUBS R0,R0,#+1 \ 00000028 0A00000A BEQ ??OnKey_1 \ 0000002C 030050E2 SUBS R0,R0,#+3 \ 00000030 0E00000A BEQ ??OnKey_2 \ 00000034 070050E2 SUBS R0,R0,#+7 \ 00000038 0400001A BNE ??OnKey_0 591 { 592 case '1': 593 break; 594 595 case GREEN_BUTTON: 596 DNR_TRIES=3; \ 0000003C 0300A0E3 MOV R0,#+3 \ 00000040 0C0081E5 STR R0,[R1, #+12] 597 do_start_connection(); \ 00000044 ........ LDR R0,??DataTable18 ;; create_connect \ 00000048 710100EF SWI +369 598 REDRAW(); \ 0000004C 720100EF SWI +370 599 break; 600 601 case LEFT_SOFT: 602 if (rss_first) create_rssitems_menu(); 603 break; 604 605 case RIGHT_SOFT: 606 return (1); 607 } 608 609 } 610 return(0); \ ??OnKey_0: \ 00000050 0000A0E3 MOV R0,#+0 \ 00000054 0080BDE8 POP {PC} ;; return \ ??OnKey_1: \ 00000058 1C0091E5 LDR R0,[R1, #+28] \ 0000005C 000050E3 CMP R0,#+0 \ 00000060 0080BD08 POPEQ {PC} \ 00000064 ........ _BLF create_rssitems_menu,??create_rssitems_menu??rA \ 00000068 0000A0E3 MOV R0,#+0 \ 0000006C 0080BDE8 POP {PC} \ ??OnKey_2: \ 00000070 0100A0E3 MOV R0,#+1 \ 00000074 0080BDE8 POP {PC} 611 } 612 613 extern void kill_data(void *p, void (*func_p)(void *)); 614 \ In segment CODE, align 4, keep-with-next 615 int method8(void){return(0);} \ method8: \ 00000000 0000A0E3 MOV R0,#+0 \ 00000004 1EFF2FE1 BX LR ;; return \ In segment CODE, align 4, keep-with-next 616 int method9(void){return(0);} \ method9: \ 00000000 0000A0E3 MOV R0,#+0 \ 00000004 1EFF2FE1 BX LR ;; return 617 const void * const gui_methods[11]={ 618 (void *)OnRedraw, 619 (void *)onCreate, 620 (void *)onClose, 621 (void *)onFocus, 622 (void *)onUnfocus, 623 (void *)OnKey, 624 0, 625 (void *)kill_data, 626 (void *)method8, 627 (void *)method9, 628 0 629 }; 630 \ In segment CODE, align 4, keep-with-next 631 static void maincsm_oncreate(CSM_RAM *data) 632 { \ maincsm_oncreate: \ 00000000 70402DE9 PUSH {R4-R6,LR} \ 00000004 0040A0E1 MOV R4,R0 633 static const RECT Canvas={0,0,0,0}; 634 MAIN_GUI *main_gui=malloc(sizeof(MAIN_GUI)); \ 00000008 3800A0E3 MOV R0,#+56 \ 0000000C 140000EF SWI +20 \ 00000010 0050A0E1 MOV R5,R0 635 MAIN_CSM*csm=(MAIN_CSM*)data; 636 zeromem(main_gui,sizeof(MAIN_GUI)); \ 00000014 3810A0E3 MOV R1,#+56 \ 00000018 1D0100EF SWI +285 637 patch_rect((RECT*)&Canvas,0,YDISP,ScreenW()-1,ScreenH()-1); \ 0000001C 898100EF SWI +33161 \ 00000020 0060A0E1 MOV R6,R0 \ 00000024 888100EF SWI +33160 \ 00000028 50209FE5 LDR R2,??maincsm_oncreate_0 ;; ??Canvas \ 0000002C 011046E2 SUB R1,R6,#+1 \ 00000030 010040E2 SUB R0,R0,#+1 \ 00000034 0060A0E3 MOV R6,#+0 \ 00000038 B060C2E1 STRH R6,[R2, #+0] \ 0000003C 1830A0E3 MOV R3,#+24 \ 00000040 B230C2E1 STRH R3,[R2, #+2] \ 00000044 B400C2E1 STRH R0,[R2, #+4] \ 00000048 B610C2E1 STRH R1,[R2, #+6] 638 main_gui->gui.canvas=(void *)(&Canvas); \ 0000004C 002085E5 STR R2,[R5, #+0] 639 main_gui->gui.flag30=2; \ 00000050 0200A0E3 MOV R0,#+2 \ 00000054 300085E5 STR R0,[R5, #+48] 640 main_gui->gui.methods=(void *)gui_methods; \ 00000058 080082E2 ADD R0,R2,#+8 \ 0000005C 040085E5 STR R0,[R5, #+4] 641 main_gui->gui.item_ll.data_mfree=(void (*)(void *))mfree_adr(); \ 00000060 158000EF SWI +32789 \ 00000064 200085E5 STR R0,[R5, #+32] 642 csm->csm.state=0; \ 00000068 106084E5 STR R6,[R4, #+16] 643 csm->csm.unk1=0; \ 0000006C 146084E5 STR R6,[R4, #+20] 644 csm->gui_id=CreateGUI(main_gui); \ 00000070 0500A0E1 MOV R0,R5 \ 00000074 370100EF SWI +311 \ 00000078 280084E5 STR R0,[R4, #+40] 645 } \ 0000007C 7080BDE8 POP {R4-R6,PC} ;; return \ ??maincsm_oncreate_0: \ 00000080 ........ DC32 ??Canvas \ In segment DATA_C, align 4, align-sorted \ ??Canvas: \ 00000000 000000000000 DC16 0, 0, 0, 0 \ 0000 \ gui_methods: \ 00000008 ............ DC32 OnRedraw, onCreate, onClose, onFocus, onUnfocus, OnKey, 0H \ ............ \ ............ \ ............ \ 00000000 \ 00000024 ............ DC32 kill_data, method8, method9, 0H \ ............ \ 00000000 646 647 #pragma segment="ELFBEGIN" \ In segment CODE, align 4, keep-with-next 648 void ElfKiller(void) 649 { \ ElfKiller: \ 00000000 00402DE9 PUSH {LR} 650 kill_data(__segment_begin("ELFBEGIN"),(void (*)(void *))mfree_adr()); \ 00000004 158000EF SWI +32789 \ 00000008 0010A0E1 MOV R1,R0 \ 0000000C 04009FE5 LDR R0,??ElfKiller_0 ;; SFB(ELFBEGIN) \ 00000010 0040BDE8 POP {LR} ;; Pop \ 00000014 ........ _BF kill_data,??kill_data??rA ;; tailcall \ ??ElfKiller_0: \ 00000018 ........ DC32 SFB(ELFBEGIN) 651 } 652 \ In segment CODE, align 4, keep-with-next 653 static void maincsm_onclose(CSM_RAM *csm) 654 { \ maincsm_onclose: \ 00000000 00402DE9 PUSH {LR} 655 PrintLibFree(); \ 00000004 ........ _BLF PrintLibFree,??PrintLibFree??rA 656 SUBPROC((void *)free_socket); \ 00000008 ........ LDR R0,??DataTable19 ;; free_socket \ 0000000C 710100EF SWI +369 657 SUBPROC((void *)free_xml_buf); \ 00000010 18009FE5 LDR R0,??maincsm_onclose_0 ;; free_xml_buf \ 00000014 710100EF SWI +369 658 FreeRssItems(); \ 00000018 ........ BL FreeRssItems 659 GBS_DelTimer(&mytmr); \ 0000001C 10009FE5 LDR R0,??maincsm_onclose_0+0x4 ;; mytmr \ 00000020 8C0100EF SWI +396 660 SUBPROC((void *)ElfKiller); \ 00000024 0C009FE5 LDR R0,??maincsm_onclose_0+0x8 ;; ElfKiller \ 00000028 710100EF SWI +369 661 } \ 0000002C 0080BDE8 POP {PC} ;; return \ ??maincsm_onclose_0: \ 00000030 ........ DC32 free_xml_buf \ 00000034 ........ DC32 mytmr \ 00000038 ........ DC32 ElfKiller 662 \ In segment CODE, align 4, keep-with-next 663 static int maincsm_onmessage(CSM_RAM *data, GBS_MSG *msg) 664 { \ maincsm_onmessage: \ 00000000 70402DE9 PUSH {R4-R6,LR} \ 00000004 08D04DE2 SUB SP,SP,#+8 \ 00000008 0140A0E1 MOV R4,R1 665 MAIN_CSM *csm=(MAIN_CSM*)data; 666 if ((msg->msg==MSG_GUI_DESTROYED)&&((int)msg->data0==csm->gui_id)) \ 0000000C 041094E5 LDR R1,[R4, #+4] \ 00000010 0E20A0E3 MOV R2,#+14 \ 00000014 642C82E3 ORR R2,R2,#0x6400 \ 00000018 020051E1 CMP R1,R2 \ 0000001C 0500001A BNE ??maincsm_onmessage_1 \ 00000020 0C1094E5 LDR R1,[R4, #+12] \ 00000024 282090E5 LDR R2,[R0, #+40] \ 00000028 020051E1 CMP R1,R2 \ 0000002C 2E00001A BNE ??maincsm_onmessage_2 667 { 668 csm->csm.state=-3; \ 00000030 0210E0E3 MVN R1,#+2 \ 00000034 101080E5 STR R1,[R0, #+16] 669 } 670 if (msg->msg==MSG_RECONFIGURE_REQ) \ ??maincsm_onmessage_1: \ 00000038 040094E5 LDR R0,[R4, #+4] \ 0000003C 78519FE5 LDR R5,??maincsm_onmessage_3 ;; `?` \ 00000040 AF10A0E3 MOV R1,#+175 \ 00000044 DE1C81E3 ORR R1,R1,#0xDE00 \ 00000048 010050E1 CMP R0,R1 \ 0000004C 0900001A BNE ??maincsm_onmessage_4 671 { 672 if (strcmp_nocase(successed_config_filename,(char *)msg->data0)==0) \ 00000050 68019FE5 LDR R0,??maincsm_onmessage_3+0x4 ;; successed_config_filename \ 00000054 0C1094E5 LDR R1,[R4, #+12] \ 00000058 000090E5 LDR R0,[R0, #+0] \ 0000005C ........ _BLF strcmp_nocase,??strcmp_nocase??rA \ 00000060 000050E3 CMP R0,#+0 \ 00000064 0300001A BNE ??maincsm_onmessage_4 673 { 674 ShowMSG(1,(int)"NRSS config updated!"); \ 00000068 0510A0E1 MOV R1,R5 \ 0000006C 0100A0E3 MOV R0,#+1 \ 00000070 480100EF SWI +328 675 InitConfig(); \ 00000074 ........ _BLF InitConfig,??InitConfig??rA 676 } 677 } 678 if (msg->msg==MSG_HELPER_TRANSLATOR) \ ??maincsm_onmessage_4: \ 00000078 040094E5 LDR R0,[R4, #+4] \ 0000007C AE10A0E3 MOV R1,#+174 \ 00000080 DE1C81E3 ORR R1,R1,#0xDE00 \ 00000084 010050E1 CMP R0,R1 \ 00000088 1700001A BNE ??maincsm_onmessage_2 679 { 680 switch((int)msg->data0) \ 0000008C 0C1094E5 LDR R1,[R4, #+12] \ 00000090 100094E5 LDR R0,[R4, #+16] \ 00000094 ........ LDR R4,??DataTable17 ;; sock \ 00000098 0060A0E3 MOV R6,#+0 \ 0000009C 802051E2 SUBS R2,R1,#+128 \ 000000A0 0600000A BEQ ??maincsm_onmessage_5 \ 000000A4 022052E2 SUBS R2,R2,#+2 \ 000000A8 0200000A BEQ ??maincsm_onmessage_6 \ 000000AC 122052E2 SUBS R2,R2,#+18 \ 000000B0 0500000A BEQ ??maincsm_onmessage_7 \ 000000B4 0E0000EA B ??maincsm_onmessage_8 681 { 682 case LMAN_DISCONNECT_IND: 683 is_gprs_online=0; \ ??maincsm_onmessage_6: \ 000000B8 086084E5 STR R6,[R4, #+8] 684 return(1); \ 000000BC 2A0000EA B ??maincsm_onmessage_9 685 686 case LMAN_CONNECT_CNF: 687 is_gprs_online=1; \ ??maincsm_onmessage_5: \ 000000C0 0100A0E3 MOV R0,#+1 \ 000000C4 080084E5 STR R0,[R4, #+8] 688 return(1); \ 000000C8 7680BDE8 POP {R1,R2,R4-R6,PC} 689 690 case ENIP_DNR_HOST_BY_NAME: 691 if ((int)msg->data1==DNR_ID) \ ??maincsm_onmessage_7: \ 000000CC 101094E5 LDR R1,[R4, #+16] \ 000000D0 010050E1 CMP R0,R1 \ 000000D4 0400001A BNE ??maincsm_onmessage_2 692 { 693 if (DNR_TRIES) SUBPROC((void *)create_connect); \ 000000D8 0C0094E5 LDR R0,[R4, #+12] \ 000000DC 000050E3 CMP R0,#+0 \ 000000E0 0100000A BEQ ??maincsm_onmessage_2 \ 000000E4 ........ LDR R0,??DataTable18 ;; create_connect \ ??maincsm_onmessage_10: \ 000000E8 710100EF SWI +369 694 } 695 return(1); \ ??maincsm_onmessage_2: \ 000000EC 0100A0E3 MOV R0,#+1 \ 000000F0 7680BDE8 POP {R1,R2,R4-R6,PC} 696 } 697 if ((int)msg->data1==sock) \ ??maincsm_onmessage_8: \ 000000F4 002094E5 LDR R2,[R4, #+0] \ 000000F8 020050E1 CMP R0,R2 \ 000000FC FAFFFF1A BNE ??maincsm_onmessage_2 698 { 699 switch((int)msg->data0) \ 00000100 8A1041E2 SUB R1,R1,#+138 \ 00000104 050051E3 CMP R1,#+5 \ 00000108 F7FFFF8A BHI ??maincsm_onmessage_2 \ 0000010C 010F8FE2 ADR R0,??maincsm_onmessage_0 \ 00000110 D10090E1 LDRSB R0,[R0, R1] \ 00000114 00F18FE0 ADD PC,PC,R0, LSL #+2 \ ??maincsm_onmessage_0: \ 00000118 10100B01 DC8 +16,+16,+11,+1 \ 0000011C 18160000 DC8 +24,+22,+0,+0 700 { 701 //Если наш сокет 702 case ENIP_SOCK_CONNECTED: 703 //Если посылали запрос 704 free_buffers(); \ ??maincsm_onmessage_11: \ 00000120 ........ BL free_recv_buf \ 00000124 ........ BL free_send_buf 705 if (connect_state==1) \ 00000128 040094E5 LDR R0,[R4, #+4] \ 0000012C 010050E3 CMP R0,#+1 \ 00000130 EDFFFF1A BNE ??maincsm_onmessage_2 706 { 707 receive_mode=0; \ 00000134 3C6084E5 STR R6,[R4, #+60] 708 connect_state=2; \ 00000138 0200A0E3 MOV R0,#+2 \ 0000013C 040084E5 STR R0,[R4, #+4] 709 SUBPROC((void *)send_req); \ 00000140 7C009FE5 LDR R0,??maincsm_onmessage_3+0x8 ;; send_req \ 00000144 E7FFFFEA B ??maincsm_onmessage_10 710 } 711 break; 712 713 case ENIP_SOCK_DATA_READ: 714 //Если посылали send 715 if (connect_state>=2) \ ??maincsm_onmessage_12: \ 00000148 040094E5 LDR R0,[R4, #+4] \ 0000014C 020050E3 CMP R0,#+2 \ 00000150 E5FFFFBA BLT ??maincsm_onmessage_2 716 { 717 SUBPROC((void *)get_answer); \ 00000154 6C009FE5 LDR R0,??maincsm_onmessage_3+0xC ;; get_answer \ 00000158 E2FFFFEA B ??maincsm_onmessage_10 718 } 719 break; 720 721 case ENIP_BUFFER_FREE: 722 case ENIP_BUFFER_FREE1: 723 //Досылаем очередь 724 SUBPROC((void *)send_answer,0,0); \ ??maincsm_onmessage_13: \ 0000015C 68009FE5 LDR R0,??maincsm_onmessage_3+0x10 ;; send_answer \ 00000160 0020A0E3 MOV R2,#+0 \ 00000164 0210A0E1 MOV R1,R2 \ 00000168 710100EF SWI +369 \ ??maincsm_onmessage_9: \ 0000016C 0100A0E3 MOV R0,#+1 \ 00000170 7680BDE8 POP {R1,R2,R4-R6,PC} 725 break; 726 727 case ENIP_SOCK_REMOTE_CLOSED: 728 //Закрыт со стороны сервера 729 sprintf(logmsg,"Remote closed!"); \ ??maincsm_onmessage_14: \ 00000174 181085E2 ADD R1,R5,#+24 \ 00000178 000000EA B ??maincsm_onmessage_15 730 goto ENIP_SOCK_CLOSED_ALL; 731 732 case ENIP_SOCK_CLOSED: 733 //Закрыт вызовом closesocket 734 sprintf(logmsg,"Local closed!"); \ ??maincsm_onmessage_16: \ 0000017C 281085E2 ADD R1,R5,#+40 \ ??maincsm_onmessage_15: \ 00000180 400084E2 ADD R0,R4,#+64 \ 00000184 160000EF SWI +22 735 ENIP_SOCK_CLOSED_ALL: 736 switch(connect_state) \ 00000188 040094E5 LDR R0,[R4, #+4] \ 0000018C 000050E3 CMP R0,#+0 \ 00000190 D5FFFF0A BEQ ??maincsm_onmessage_2 \ 00000194 010070E3 CMN R0,#+1 \ 00000198 0300001A BNE ??maincsm_onmessage_17 737 { 738 case -1: 739 connect_state=0; \ 0000019C 046084E5 STR R6,[R4, #+4] 740 DecodeRSS(); \ 000001A0 ........ BL DecodeRSS 741 SUBPROC((void*)free_socket); \ 000001A4 ........ LDR R0,??DataTable19 ;; free_socket \ 000001A8 CEFFFFEA B ??maincsm_onmessage_10 742 break; 743 case 0: 744 break; 745 default: 746 connect_state=-1; \ ??maincsm_onmessage_17: \ 000001AC 0600E0E1 MVN R0,R6 \ 000001B0 040084E5 STR R0,[R4, #+4] 747 SUBPROC((void*)end_socket); \ 000001B4 14009FE5 LDR R0,??maincsm_onmessage_3+0x14 ;; end_socket \ 000001B8 CAFFFFEA B ??maincsm_onmessage_10 \ ??maincsm_onmessage_3: \ 000001BC ........ DC32 `?` \ 000001C0 ........ DC32 successed_config_filename \ 000001C4 ........ DC32 send_req \ 000001C8 ........ DC32 get_answer \ 000001CC ........ DC32 send_answer \ 000001D0 ........ DC32 end_socket 748 break; 749 } 750 break; 751 } 752 } 753 754 } 755 return(1); 756 } 757 \ In segment DATA_Z, align 4, align-sorted 758 static unsigned short maincsm_name_body[140]; \ maincsm_name_body: \ 00000000 DS8 280 \ In segment DATA_C, align 4, align-sorted 759 static const int minus11=-11; \ minus11: \ 00000000 F5FFFFFF DC32 -11 760 761 static const struct 762 { 763 CSM_DESC maincsm; 764 WSHDR maincsm_name; \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 4E52535300 DC8 "NRSS" \ 00000005 000000 DC8 0, 0, 0 \ 00000008 ............ DC32 maincsm_onmessage, maincsm_oncreate, 0, 0, 0, 0, maincsm_onclose \ ....00000000 \ 000000000000 \ 000000000000 \ ........ \ 00000024 2C0000000100 DC32 44, 1, minus11, maincsm_name_body, 55AACCCCH, 3333AA55H, 0 \ 0000........ \ ........CCCC \ AA5555AA3333 \ 00000000 \ 00000040 8B00 DC16 139 \ 00000042 0000 DC8 0, 0 765 }MAINCSM = 766 { 767 { 768 maincsm_onmessage, 769 maincsm_oncreate, 770 #ifdef NEWSGOLD 771 0, 772 0, 773 0, 774 0, 775 #endif 776 maincsm_onclose, 777 sizeof(MAIN_CSM), 778 1, 779 &minus11 780 }, 781 { 782 maincsm_name_body, 783 NAMECSM_MAGIC1, 784 NAMECSM_MAGIC2, 785 0x0, 786 139 787 } 788 }; 789 \ In segment CODE, align 4, keep-with-next 790 void UpdateCSMname(void) 791 { 792 wsprintf((WSHDR *)(&MAINCSM.maincsm_name),"NRSS"); \ UpdateCSMname: \ 00000000 10009FE5 LDR R0,??UpdateCSMname_0 ;; `?` \ 00000004 00402DE9 PUSH {LR} \ 00000008 0010A0E1 MOV R1,R0 \ 0000000C 300080E2 ADD R0,R0,#+48 \ 00000010 240100EF SWI +292 793 } \ 00000014 0080BDE8 POP {PC} ;; return \ ??UpdateCSMname_0: \ 00000018 ........ DC32 `?` 794 795 \ In segment CODE, align 4, keep-with-next 796 int main(char *exename, char *fname) 797 { \ main: \ 00000000 00402DE9 PUSH {LR} \ 00000004 2CD04DE2 SUB SP,SP,#+44 798 MAIN_CSM main_csm; 799 InitConfig(); \ 00000008 ........ _BLF InitConfig,??InitConfig??rA 800 LockSched(); \ 0000000C 460100EF SWI +326 801 UpdateCSMname(); \ 00000010 ........ BL UpdateCSMname 802 CreateCSM(&MAINCSM.maincsm,&main_csm,0); \ 00000014 28009FE5 LDR R0,??main_0 ;; `?` + 8 \ 00000018 0020A0E3 MOV R2,#+0 \ 0000001C 0D10A0E1 MOV R1,SP \ 00000020 070100EF SWI +263 803 UnlockSched(); \ 00000024 470100EF SWI +327 804 805 PrintLibInit(1); \ 00000028 0100A0E3 MOV R0,#+1 \ 0000002C ........ _BLF PrintLibInit,??PrintLibInit??rA 806 SetCanvasFlag(1); \ 00000030 0100A0E3 MOV R0,#+1 \ 00000034 ........ _BLF SetCanvasFlag,??SetCanvasFlag??rA 807 return 0; \ 00000038 0000A0E3 MOV R0,#+0 \ 0000003C 2CD08DE2 ADD SP,SP,#+44 \ 00000040 0080BDE8 POP {PC} ;; return \ ??main_0: \ 00000044 ........ DC32 `?` + 8 808 } \ In segment CODE, align 4, keep-with-next \ ??DataTable10: \ 00000000 ........ DC32 sock \ In segment CODE, align 4, keep-with-next \ ??DataTable11: \ 00000000 ........ DC32 RSS_URL \ In segment CODE, align 4, keep-with-next \ ??DataTable14: \ 00000000 ........ DC32 sock \ In segment CODE, align 4, keep-with-next \ ??DataTable17: \ 00000000 ........ DC32 sock \ In segment CODE, align 4, keep-with-next \ ??DataTable18: \ 00000000 ........ DC32 create_connect \ In segment CODE, align 4, keep-with-next \ ??DataTable19: \ 00000000 ........ DC32 free_socket \ 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 menu_sk, 0 \ 0000 \ In segment ELFBEGIN, align 1 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 474554202573 DC8 "GET %s HTTP/1.0\015\012Host: %s\015\012\015\012" \ 20485454502F \ 312E300D0A48 \ 6F73743A2025 \ 730D0A0D0A00 \ 0000001E 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ 00000000 62723E00 DC8 "br>" \ In segment DATA_C, align 4, align-sorted \ `?">`: \ 00000000 6272202F3E00 DC8 "br />" \ 00000006 0000 DC8 0, 0 \ 00000008 71756F74653B DC8 "quote;" \ 00 \ 0000000F 00 DC8 0 \ 00000010 6E6273703B00 DC8 "nbsp;" \ 00000016 0000 DC8 0, 0 \ 00000018 2F74643E00 DC8 "/td>" \ 0000001D 000000 DC8 0, 0, 0 \ 00000020 616D703B00 DC8 "amp;" \ 00000025 000000 DC8 0, 0, 0 \ 00000028 636F70793B00 DC8 "copy;" \ 0000002E 0000 DC8 0, 0 \ In segment DATA_C, align 1, align-sorted \ 00000000 703E00 DC8 "p>" \ In segment DATA_C, align 4, align-sorted \ 00000000 6C743B00 DC8 "lt;" \ In segment DATA_C, align 4, align-sorted \ 00000000 67743B00 DC8 "gt;" \ In segment DATA_C, align 4, align-sorted \ 00000000 72737300 DC8 "rss" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 6368616E6E65 DC8 "channel" \ 6C00 \ 00000008 7469746C6500 DC8 "title" \ 0000000E 0000 DC8 0, 0 \ 00000010 646573637269 DC8 "description" \ 7074696F6E00 \ 0000001C 6974656D00 DC8 "item" \ 00000021 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 53746174653A DC8 53H, 74H, 61H, 74H, 65H, 3AH, 20H, 25H \ 2025 \ 00000008 640A52783A20 DC8 64H, 0AH, 52H, 78H, 3AH, 20H, 25H, 64H \ 2564 \ 00000010 622C2054783A DC8 62H, 2CH, 20H, 54H, 78H, 3AH, 20H, 25H \ 2025 \ 00000018 64620A517565 DC8 64H, 62H, 0AH, 51H, 75H, 65H, 75H, 65H \ 7565 \ 00000020 3A202564620A DC8 3AH, 20H, 25H, 64H, 62H, 0AH, 25H, 74H \ 2574 \ 00000028 0A546F74616C DC8 0AH, 54H, 6FH, 74H, 61H, 6CH, 20H, 69H \ 2069 \ 00000030 74656D733A20 DC8 74H, 65H, 6DH, 73H, 3AH, 20H, 25H, 64H \ 2564 \ 00000038 00 DC8 0 \ 00000039 000000 DC8 0, 0, 0 \ 0000003C 4578697400 DC8 "Exit" \ 00000041 000000 DC8 0, 0, 0 \ 00000044 4C69737400 DC8 "List" \ 00000049 000000 DC8 0, 0, 0 \ In segment DATA_C, align 1, align-sorted \ 00000000 00 DC8 "" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 4E5253532063 DC8 "NRSS config updated!" \ 6F6E66696720 \ 757064617465 \ 642100 \ 00000015 000000 DC8 0, 0, 0 \ 00000018 52656D6F7465 DC8 "Remote closed!" \ 20636C6F7365 \ 642100 \ 00000027 00 DC8 0 \ 00000028 4C6F63616C20 DC8 "Local closed!" \ 636C6F736564 \ 2100 \ 00000036 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 444E52206F6B DC8 "DNR ok!" \ 2100 \ 00000008 436F6E6E6563 DC8 "Connect to: %s Using port: %d" \ 7420746F3A20 \ 257320557369 \ 6E6720706F72 \ 743A20256400 \ 00000026 0000 DC8 0, 0 \ 00000028 576169742044 DC8 "Wait DNR" \ 4E5200 \ 00000031 000000 DC8 0, 0, 0 \ 00000034 444E52206572 DC8 "DNR error %d" \ 726F72202564 \ 00 \ 00000041 000000 DC8 0, 0, 0 \ 00000044 436F6E6E6563 DC8 "Connect fault" \ 74206661756C \ 7400 \ 00000052 0000 DC8 0, 0 \ 00000054 4572726F7220 DC8 "Error Create Socket" \ 437265617465 \ 20536F636B65 \ 7400 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 CBE5E200 DC8 "\313\345\342" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 CFF0E0E200 DC8 "\317\360\340\342" \ 00000005 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 0D0A0D0A00 DC8 "\015\012\015\012" \ 00000005 000000 DC8 0, 0, 0 Maximum stack usage in bytes: Function CSTACK -------- ------ DecodeRSS 36 ElfKiller 4 FreeRssItems 12 OnKey 4 OnRedraw 84 UpdateCSMname 4 create_connect 108 do_start_connection 4 end_socket 8 free_recv_buf 4 free_send_buf 4 free_socket 4 free_xml_buf 4 get_answer 1044 html_decode 32 main 48 maincsm_onclose 4 maincsm_oncreate 16 maincsm_onmessage 24 method8 0 method9 0 onClose 4 onCreate 8 onFocus 4 onUnfocus 0 send_answer 16 send_req 400 Segment part sizes: Function/Label Bytes -------------- ----- menu_sk 24 menu_skt 8 FreeRssItems 68 create_connect 608 do_start_connection 16 free_xml_buf 32 free_recv_buf 32 sock 320 mytmr 16 get_answer 344 free_send_buf 32 send_answer 236 end_socket 40 free_socket 40 send_req 228 html_decode 472 DecodeRSS 368 OnRedraw 532 onCreate 32 onClose 24 onFocus 20 onUnfocus 20 OnKey 120 method8 8 method9 8 maincsm_oncreate 132 Canvas 52 ElfKiller 28 maincsm_onclose 60 maincsm_onmessage 468 maincsm_name_body 280 minus11 4 ? 68 UpdateCSMname 28 main 72 ??DataTable10 4 ??DataTable11 4 ??DataTable14 4 ??DataTable17 4 ??DataTable18 4 ??DataTable19 4 ? 24 ? 8 ? 32 ?"> 4 ?"> 48 ?"> 3 ? 4 ? 4 ? 4 ? 36 ? 76 ? 1 ? 56 ? 104 ? 4 ? 8 ? 8 Others 240 4 308 bytes in segment CODE 516 bytes in segment DATA_C 32 bytes in segment DATA_I 32 bytes in segment DATA_ID 616 bytes in segment DATA_Z 24 bytes in segment INITTAB 4 092 bytes of CODE memory (+ 240 bytes shared) 548 bytes of CONST memory 648 bytes of DATA memory Errors: none Warnings: none