############################################################################## # # # IAR ARM ANSI C/C++ Compiler V4.40A/W32 EVALUATION 28/Mar/2008 19:11:01 # # Copyright 1999-2005 IAR Systems. All rights reserved. # # # # Cpu mode = interwork # # Endian = little # # Stack alignment = 4 # # Source file = E:\Ivo\arm\IVOPLAY\mediafiles_base.c # # Command line = E:\Ivo\arm\IVOPLAY\mediafiles_base.c -D X75 -lC # # E:\Ivo\arm\IVOPLAY\ReleaseX75\List\ -lA # # E:\Ivo\arm\IVOPLAY\ReleaseX75\List\ -o # # E:\Ivo\arm\IVOPLAY\ReleaseX75\Obj\ -s9 --no_cse # # --no_unroll --no_inline --no_code_motion --no_tbaa # # --no_clustering --no_scheduling --cpu_mode arm # # --endian little --cpu ARM926EJ-S --stack_align 4 # # --interwork -e --fpu None --dlib_config # # D:\arm\ARM\LIB\dl5tpainl8n.h -I D:\arm\ARM\INC\ # # List file = E:\Ivo\arm\IVOPLAY\ReleaseX75\List\mediafiles_base.l # # st # # Object file = E:\Ivo\arm\IVOPLAY\ReleaseX75\Obj\mediafiles_base.r7 # # 9 # # # # # ############################################################################## E:\Ivo\arm\IVOPLAY\mediafiles_base.c 1 #include "../inc/swilib.h" 2 #include "language.h" 3 #include "main.h" \ In segment DATA_C, align 1, align-sorted \ static char const __data pt[3] \ pt: \ 00000000 257400 DC8 "%t" \ In segment DATA_C, align 1, align-sorted \ static char const __data pp[1] \ pp: \ 00000000 00 DC8 "" 4 #include "mediafiles.h" 5 #include "conf_loader.h" 6 7 extern const char playerfolder[128]; \ In segment DATA_I, align 4, align-sorted 8 extern const char *chotyry="4:"; \ chotyry: \ 00000000 DS8 4 \ 00000004 REQUIRE `?` 9 10 typedef struct 11 { 12 char shliah[210]; 13 char artist[30]; 14 char album[30]; 15 char track[30]; 16 }mediafile; \ In segment DATA_Z, align 1, align-sorted 17 mediafile media[]; \ media: \ 00000000 DS8 300 \ In segment DATA_Z, align 4, align-sorted 18 char curent_state[30]; \ curent_state: \ 00000000 DS8 32 \ In segment DATA_C, align 4, align-sorted 19 const RECT Canvas2={0,0,131,175}; \ Canvas2: \ 00000000 000000008300 DC16 0, 0, 131, 175 \ AF00 \ In segment DATA_Z, align 4, align-sorted 20 int GUI_GUI; \ GUI_GUI: \ 00000000 DS8 4 \ In segment DATA_Z, align 4, align-sorted 21 int curentposition=0; \ curentposition: \ 00000000 DS8 4 \ In segment DATA_Z, align 4, align-sorted 22 char tosearch[256]; \ tosearch: \ 00000000 DS8 256 \ In segment DATA_Z, align 4, align-sorted 23 char search_state[256]; \ search_state: \ 00000000 DS8 256 \ In segment CODE, align 4, keep-with-next 24 void OnRedraw3(MAIN_GUI *data) // OnRedraw 25 { \ OnRedraw3: \ 00000000 30402DE9 PUSH {R4,R5,LR} 26 WSHDR* a=AllocWS(128); \ 00000004 8000A0E3 MOV R0,#+128 \ 00000008 250100EF SWI +293 \ 0000000C 0040A0E1 MOV R4,R0 27 DrawImg(0,0,(int)GetFon()); \ 00000010 ........ _BLF GetFon,??GetFon??rA \ 00000014 0020A0E1 MOV R2,R0 \ 00000018 0010A0E3 MOV R1,#+0 \ 0000001C 0000A0E3 MOV R0,#+0 \ 00000020 230000EF SWI +35 28 wsprintf(a,pt,curent_state); \ 00000024 ........ LDR R2,??DataTable70 ;; curent_state \ 00000028 10119FE5 LDR R1,??OnRedraw3_0 ;; pt \ 0000002C 0400A0E1 MOV R0,R4 \ 00000030 240100EF SWI +292 29 DrawString(a,1,3,130,15,FONT_SMALL_BOLD,TEXT_ALIGNLEFT,GetPaletteAdrByColorIndex(GetKatalogfontcolour()),GetPaletteAdrByColorIndex(23)); \ 00000034 1700A0E3 MOV R0,#+23 \ 00000038 2E0100EF SWI +302 \ 0000003C 0050A0E1 MOV R5,R0 \ 00000040 ........ _BLF GetKatalogfontcolour,??GetKatalogfontcolour??rA \ 00000044 2E0100EF SWI +302 \ 00000048 20002DE9 PUSH {R5} \ 0000004C 01002DE9 PUSH {R0} \ 00000050 0100A0E3 MOV R0,#+1 \ 00000054 01002DE9 PUSH {R0} \ 00000058 0800A0E3 MOV R0,#+8 \ 0000005C 01002DE9 PUSH {R0} \ 00000060 0F00A0E3 MOV R0,#+15 \ 00000064 01002DE9 PUSH {R0} \ 00000068 8230A0E3 MOV R3,#+130 \ 0000006C 0320A0E3 MOV R2,#+3 \ 00000070 0110A0E3 MOV R1,#+1 \ 00000074 0400A0E1 MOV R0,R4 \ 00000078 4C0100EF SWI +332 30 31 utf8_2ws(a,tosearch,320); \ 0000007C 502FA0E3 MOV R2,#+320 \ 00000080 ........ LDR R1,??DataTable69 ;; tosearch \ 00000084 0400A0E1 MOV R0,R4 \ 00000088 E30100EF SWI +483 32 DrawString(a,2,20,130,100,FONT_SMALL,TEXT_ALIGNMIDDLE,GetPaletteAdrByColorIndex(GetKatalogfontcolour()),GetPaletteAdrByColorIndex(23)); \ 0000008C 1700A0E3 MOV R0,#+23 \ 00000090 2E0100EF SWI +302 \ 00000094 0050A0E1 MOV R5,R0 \ 00000098 ........ _BLF GetKatalogfontcolour,??GetKatalogfontcolour??rA \ 0000009C 2E0100EF SWI +302 \ 000000A0 20002DE9 PUSH {R5} \ 000000A4 01002DE9 PUSH {R0} \ 000000A8 0200A0E3 MOV R0,#+2 \ 000000AC 01002DE9 PUSH {R0} \ 000000B0 0700A0E3 MOV R0,#+7 \ 000000B4 01002DE9 PUSH {R0} \ 000000B8 6400A0E3 MOV R0,#+100 \ 000000BC 01002DE9 PUSH {R0} \ 000000C0 8230A0E3 MOV R3,#+130 \ 000000C4 1420A0E3 MOV R2,#+20 \ 000000C8 0210A0E3 MOV R1,#+2 \ 000000CC 0400A0E1 MOV R0,R4 \ 000000D0 4C0100EF SWI +332 \ 000000D4 28D08DE2 ADD SP,SP,#+40 ;; stack cleaning 33 34 wsprintf(a,pt,search_state); \ 000000D8 ........ LDR R2,??DataTable62 ;; search_state \ 000000DC 5C109FE5 LDR R1,??OnRedraw3_0 ;; pt \ 000000E0 0400A0E1 MOV R0,R4 \ 000000E4 240100EF SWI +292 35 DrawString(a,1,100,130,130,FONT_SMALL,TEXT_ALIGNLEFT,GetPaletteAdrByColorIndex(GetKatalogfontcolour()),GetPaletteAdrByColorIndex(23)); \ 000000E8 1700A0E3 MOV R0,#+23 \ 000000EC 2E0100EF SWI +302 \ 000000F0 0050A0E1 MOV R5,R0 \ 000000F4 ........ _BLF GetKatalogfontcolour,??GetKatalogfontcolour??rA \ 000000F8 2E0100EF SWI +302 \ 000000FC 20002DE9 PUSH {R5} \ 00000100 01002DE9 PUSH {R0} \ 00000104 0100A0E3 MOV R0,#+1 \ 00000108 01002DE9 PUSH {R0} \ 0000010C 0700A0E3 MOV R0,#+7 \ 00000110 01002DE9 PUSH {R0} \ 00000114 8200A0E3 MOV R0,#+130 \ 00000118 01002DE9 PUSH {R0} \ 0000011C 0030A0E1 MOV R3,R0 \ 00000120 6420A0E3 MOV R2,#+100 \ 00000124 0110A0E3 MOV R1,#+1 \ 00000128 0400A0E1 MOV R0,R4 \ 0000012C 4C0100EF SWI +332 36 37 FreeWS(a); \ 00000130 0400A0E1 MOV R0,R4 \ 00000134 290100EF SWI +297 38 } \ 00000138 14D08DE2 ADD SP,SP,#+20 ;; stack cleaning \ 0000013C 3080BDE8 POP {R4,R5,PC} ;; return \ ??OnRedraw3_0: \ 00000140 ........ DC32 pt \ In segment CODE, align 4, keep-with-next 39 int MenuKeys2(MAIN_GUI *data, GUI_MSG *msg) //OnKey 40 { 41 if ((msg->gbsmsg->msg==KEY_DOWN)) \ MenuKeys2: \ 00000000 040091E5 LDR R0,[R1, #+4] \ 00000004 F200D0E1 LDRSH R0,[R0, #+2] \ 00000008 9320A0E3 MOV R2,#+147 \ 0000000C 402F82E3 ORR R2,R2,#0x100 \ 00000010 020050E1 CMP R0,R2 \ 00000014 0400001A BNE ??MenuKeys2_0 42 { 43 switch(msg->gbsmsg->submess) \ 00000018 040091E5 LDR R0,[R1, #+4] \ 0000001C 040090E5 LDR R0,[R0, #+4] \ 00000020 0C0050E3 CMP R0,#+12 44 { 45 case RED_BUTTON:return(1); \ 00000024 0100A003 MOVEQ R0,#+1 \ 00000028 1EFF2F01 BXEQ LR 46 } 47 } 48 return(0); \ ??MenuKeys2_0: \ 0000002C 0000A0E3 MOV R0,#+0 \ 00000030 1EFF2FE1 BX LR ;; return 49 } \ In segment DATA_C, align 4, align-sorted 50 const void * const gui_methods3[11]={ \ gui_methods3: \ 00000000 ............ DC32 OnRedraw3, onCreate2, onClose2, onFocus2, onUnfocus2, MenuKeys2 \ ............ \ ............ \ ............ \ 00000018 00000000.... DC32 0H, kill_data, method, method, 0H \ ............ \ ........0000 \ 0000 51 (void *)OnRedraw3, //Redraw 52 (void *)onCreate2, //Create 53 (void *)onClose2, //Close 54 (void *)onFocus2, //Focus 55 (void *)onUnfocus2, //Unfocus 56 (void *)MenuKeys2, //OnKey 57 0, 58 #ifdef NEWSGOLD 59 (void *)onDestroy, //Destroy 60 #else 61 (void *)kill_data, //Destroy 62 #endif 63 (void *)method, 64 (void *)method, 65 0 66 }; 67 \ In segment CODE, align 4, keep-with-next 68 void find_tegs() 69 { \ find_tegs: \ 00000000 70402DE9 PUSH {R4-R6,LR} \ 00000004 ACD04DE2 SUB SP,SP,#+172 70 int f; 71 char file[128]; 72 unsigned int err; 73 FSTATS stat; 74 f=fopen(media[curentposition].shliah, A_ReadOnly+A_BIN, P_READ, &err); \ 00000008 0D30A0E1 MOV R3,SP \ 0000000C 8020A0E3 MOV R2,#+128 \ 00000010 801CA0E3 MOV R1,#+32768 \ 00000014 ........ LDR R0,??DataTable63 ;; curentposition \ 00000018 000090E5 LDR R0,[R0, #+0] \ 0000001C 4B4FA0E3 MOV R4,#+300 \ 00000020 ........ LDR R5,??DataTable60 ;; media \ 00000024 945020E0 MLA R0,R4,R0,R5 \ 00000028 0A0000EF SWI +10 \ 0000002C 0040A0E1 MOV R4,R0 75 GetFileStats(media[curentposition].shliah, &stat, &err); \ 00000030 0D20A0E1 MOV R2,SP \ 00000034 84108DE2 ADD R1,SP,#+132 \ 00000038 ........ LDR R0,??DataTable63 ;; curentposition \ 0000003C 000090E5 LDR R0,[R0, #+0] \ 00000040 4B3FA0E3 MOV R3,#+300 \ 00000044 935020E0 MLA R0,R3,R0,R5 \ 00000048 840000EF SWI +132 76 lseek(f,(stat.size-128), 0, &err, &err); \ 0000004C 0D00A0E1 MOV R0,SP \ 00000050 01002DE9 PUSH {R0} \ 00000054 04308DE2 ADD R3,SP,#+4 \ 00000058 0020A0E3 MOV R2,#+0 \ 0000005C 8C009DE5 LDR R0,[SP, #+140] \ 00000060 7F10E0E3 MVN R1,#+127 \ 00000064 001081E0 ADD R1,R1,R0 \ 00000068 0400A0E1 MOV R0,R4 \ 0000006C 0F0000EF SWI +15 77 fread(f, file, 128, &err); \ 00000070 04308DE2 ADD R3,SP,#+4 \ 00000074 8020A0E3 MOV R2,#+128 \ 00000078 08108DE2 ADD R1,SP,#+8 \ 0000007C 0400A0E1 MOV R0,R4 \ 00000080 0B0000EF SWI +11 78 fclose(f, &err); \ 00000084 04108DE2 ADD R1,SP,#+4 \ 00000088 0400A0E1 MOV R0,R4 \ 0000008C 0D0000EF SWI +13 79 sprintf(media[curentposition].album,""); \ 00000090 A01F8FE2 ADR R1,??find_tegs_0 ;; "" \ 00000094 ........ LDR R0,??DataTable63 ;; curentposition \ 00000098 000090E5 LDR R0,[R0, #+0] \ 0000009C 4B2FA0E3 MOV R2,#+300 \ 000000A0 ........ LDR R3,??DataTable60 ;; media \ 000000A4 923020E0 MLA R0,R2,R0,R3 \ 000000A8 F00080E2 ADD R0,R0,#+240 \ 000000AC 160000EF SWI +22 80 sprintf(media[curentposition].track,""); \ 000000B0 981F8FE2 ADR R1,??find_tegs_0 ;; "" \ 000000B4 0E00A0E3 MOV R0,#+14 \ 000000B8 400F80E3 ORR R0,R0,#0x100 \ 000000BC ........ LDR R2,??DataTable63 ;; curentposition \ 000000C0 002092E5 LDR R2,[R2, #+0] \ 000000C4 4B3FA0E3 MOV R3,#+300 \ 000000C8 ........ LDR R4,??DataTable60 ;; media \ 000000CC 934222E0 MLA R2,R3,R2,R4 \ 000000D0 020080E0 ADD R0,R0,R2 \ 000000D4 160000EF SWI +22 81 sprintf(media[curentposition].artist,""); \ 000000D8 8E1F8FE2 ADR R1,??find_tegs_0 ;; "" \ 000000DC ........ LDR R0,??DataTable63 ;; curentposition \ 000000E0 000090E5 LDR R0,[R0, #+0] \ 000000E4 4B2FA0E3 MOV R2,#+300 \ 000000E8 ........ LDR R3,??DataTable60 ;; media \ 000000EC 923020E0 MLA R0,R2,R0,R3 \ 000000F0 D20080E2 ADD R0,R0,#+210 \ 000000F4 160000EF SWI +22 82 if ((file[0]=='T')&&(file[1]=='A')&&(file[2]=='G')) \ 000000F8 0800DDE5 LDRB R0,[SP, #+8] \ 000000FC 540050E3 CMP R0,#+84 \ 00000100 04D08DE2 ADD SP,SP,#+4 ;; stack cleaning \ 00000104 0500DD05 LDRBEQ R0,[SP, #+5] \ 00000108 41005003 CMPEQ R0,#+65 \ 0000010C 0600DD05 LDRBEQ R0,[SP, #+6] \ 00000110 47005003 CMPEQ R0,#+71 \ 00000114 4600001A BNE ??find_tegs_1 83 { 84 int i; 85 for (i=3;(file[i]!=0)&&(i<33);i++) \ 00000118 0340A0E3 MOV R4,#+3 \ 0000011C 07508DE2 ADD R5,SP,#+7 \ 00000120 110000EA B ??find_tegs_2 86 { 87 sprintf(media[curentposition].track,"%s%c",media[curentposition].track,file[i]); \ ??find_tegs_3: \ 00000124 ........ LDRB R3,[R5], #+1 \ 00000128 0E00A0E3 MOV R0,#+14 \ 0000012C 400F80E3 ORR R0,R0,#0x100 \ 00000130 ........ LDR R1,??DataTable63 ;; curentposition \ 00000134 001091E5 LDR R1,[R1, #+0] \ 00000138 4B2FA0E3 MOV R2,#+300 \ 0000013C ........ LDR R12,??DataTable60 ;; media \ 00000140 92C121E0 MLA R1,R2,R1,R12 \ 00000144 012080E0 ADD R2,R0,R1 \ 00000148 CC119FE5 LDR R1,??find_tegs_0+0x4 ;; `?` \ 0000014C ........ LDR R12,??DataTable63 ;; curentposition \ 00000150 00C09CE5 LDR R12,[R12, #+0] \ 00000154 4BEFA0E3 MOV LR,#+300 \ 00000158 ........ LDR R6,??DataTable60 ;; media \ 0000015C 9E6C26E0 MLA R6,LR,R12,R6 \ 00000160 060080E0 ADD R0,R0,R6 \ 00000164 160000EF SWI +22 88 } \ 00000168 014084E2 ADD R4,R4,#+1 \ ??find_tegs_2: \ 0000016C 0000D5E5 LDRB R0,[R5, #+0] \ 00000170 000050E3 CMP R0,#+0 \ 00000174 0100000A BEQ ??find_tegs_4 \ 00000178 210054E3 CMP R4,#+33 \ 0000017C E8FFFFBA BLT ??find_tegs_3 89 for (i=33;(file[i]!=0)&&(i<63);i++) \ ??find_tegs_4: \ 00000180 2140A0E3 MOV R4,#+33 \ 00000184 25508DE2 ADD R5,SP,#+37 \ 00000188 4B6FA0E3 MOV R6,#+300 \ 0000018C 0D0000EA B ??find_tegs_5 90 { 91 sprintf(media[curentposition].artist,"%s%c",media[curentposition].artist,file[i]); \ ??find_tegs_6: \ 00000190 ........ LDRB R3,[R5], #+1 \ 00000194 ........ LDR R0,??DataTable63 ;; curentposition \ 00000198 000090E5 LDR R0,[R0, #+0] \ 0000019C ........ LDR R2,??DataTable60 ;; media \ 000001A0 962020E0 MLA R0,R6,R0,R2 \ 000001A4 D22080E2 ADD R2,R0,#+210 \ 000001A8 6C119FE5 LDR R1,??find_tegs_0+0x4 ;; `?` \ 000001AC ........ LDR R0,??DataTable63 ;; curentposition \ 000001B0 000090E5 LDR R0,[R0, #+0] \ 000001B4 ........ LDR R12,??DataTable60 ;; media \ 000001B8 96C020E0 MLA R0,R6,R0,R12 \ 000001BC D20080E2 ADD R0,R0,#+210 \ 000001C0 160000EF SWI +22 92 } \ 000001C4 014084E2 ADD R4,R4,#+1 \ ??find_tegs_5: \ 000001C8 0000D5E5 LDRB R0,[R5, #+0] \ 000001CC 000050E3 CMP R0,#+0 \ 000001D0 0100000A BEQ ??find_tegs_7 \ 000001D4 3F0054E3 CMP R4,#+63 \ 000001D8 ECFFFFBA BLT ??find_tegs_6 93 for (i=63;(file[i]!=0)&&(i<93);i++) \ ??find_tegs_7: \ 000001DC 3F40A0E3 MOV R4,#+63 \ 000001E0 43508DE2 ADD R5,SP,#+67 \ 000001E4 0D0000EA B ??find_tegs_8 94 { 95 sprintf(media[curentposition].album,"%s%c",media[curentposition].album,file[i]); \ ??find_tegs_9: \ 000001E8 ........ LDRB R3,[R5], #+1 \ 000001EC ........ LDR R0,??DataTable63 ;; curentposition \ 000001F0 000090E5 LDR R0,[R0, #+0] \ 000001F4 ........ LDR R2,??DataTable60 ;; media \ 000001F8 962020E0 MLA R0,R6,R0,R2 \ 000001FC F02080E2 ADD R2,R0,#+240 \ 00000200 14119FE5 LDR R1,??find_tegs_0+0x4 ;; `?` \ 00000204 ........ LDR R0,??DataTable63 ;; curentposition \ 00000208 000090E5 LDR R0,[R0, #+0] \ 0000020C ........ LDR R12,??DataTable60 ;; media \ 00000210 96C020E0 MLA R0,R6,R0,R12 \ 00000214 F00080E2 ADD R0,R0,#+240 \ 00000218 160000EF SWI +22 96 } \ 0000021C 014084E2 ADD R4,R4,#+1 \ ??find_tegs_8: \ 00000220 0000D5E5 LDRB R0,[R5, #+0] \ 00000224 000050E3 CMP R0,#+0 \ 00000228 0100000A BEQ ??find_tegs_1 \ 0000022C 5D0054E3 CMP R4,#+93 \ 00000230 ECFFFFBA BLT ??find_tegs_9 97 } 98 if (strlen(media[curentposition].album)==0){sprintf(media[curentposition].album,"Unknown album");} \ ??find_tegs_1: \ 00000234 ........ LDR R0,??DataTable63 ;; curentposition \ 00000238 000090E5 LDR R0,[R0, #+0] \ 0000023C 4B1FA0E3 MOV R1,#+300 \ 00000240 ........ LDR R2,??DataTable60 ;; media \ 00000244 912020E0 MLA R0,R1,R0,R2 \ 00000248 F00080E2 ADD R0,R0,#+240 \ 0000024C 1B0000EF SWI +27 \ 00000250 000050E3 CMP R0,#+0 \ 00000254 0700001A BNE ??find_tegs_10 \ 00000258 C0109FE5 LDR R1,??find_tegs_0+0x8 ;; `?` \ 0000025C ........ LDR R0,??DataTable63 ;; curentposition \ 00000260 000090E5 LDR R0,[R0, #+0] \ 00000264 4B2FA0E3 MOV R2,#+300 \ 00000268 ........ LDR R3,??DataTable60 ;; media \ 0000026C 923020E0 MLA R0,R2,R0,R3 \ 00000270 F00080E2 ADD R0,R0,#+240 \ 00000274 160000EF SWI +22 99 if (strlen(media[curentposition].track)==0){sprintf(media[curentposition].track,"Unknown track");} \ ??find_tegs_10: \ 00000278 0E00A0E3 MOV R0,#+14 \ 0000027C 400F80E3 ORR R0,R0,#0x100 \ 00000280 ........ LDR R1,??DataTable63 ;; curentposition \ 00000284 001091E5 LDR R1,[R1, #+0] \ 00000288 4B2FA0E3 MOV R2,#+300 \ 0000028C ........ LDR R3,??DataTable60 ;; media \ 00000290 923121E0 MLA R1,R2,R1,R3 \ 00000294 010080E0 ADD R0,R0,R1 \ 00000298 1B0000EF SWI +27 \ 0000029C 000050E3 CMP R0,#+0 \ 000002A0 0900001A BNE ??find_tegs_11 \ 000002A4 78109FE5 LDR R1,??find_tegs_0+0xC ;; `?` \ 000002A8 0E00A0E3 MOV R0,#+14 \ 000002AC 400F80E3 ORR R0,R0,#0x100 \ 000002B0 ........ LDR R2,??DataTable63 ;; curentposition \ 000002B4 002092E5 LDR R2,[R2, #+0] \ 000002B8 4B3FA0E3 MOV R3,#+300 \ 000002BC ........ LDR R4,??DataTable60 ;; media \ 000002C0 934222E0 MLA R2,R3,R2,R4 \ 000002C4 020080E0 ADD R0,R0,R2 \ 000002C8 160000EF SWI +22 100 if (strlen(media[curentposition].artist)==0){sprintf(media[curentposition].artist,"Unknown artist");} \ ??find_tegs_11: \ 000002CC ........ LDR R0,??DataTable63 ;; curentposition \ 000002D0 000090E5 LDR R0,[R0, #+0] \ 000002D4 4B1FA0E3 MOV R1,#+300 \ 000002D8 ........ LDR R2,??DataTable60 ;; media \ 000002DC 912020E0 MLA R0,R1,R0,R2 \ 000002E0 D20080E2 ADD R0,R0,#+210 \ 000002E4 1B0000EF SWI +27 \ 000002E8 000050E3 CMP R0,#+0 \ 000002EC 0700001A BNE ??find_tegs_12 \ 000002F0 30109FE5 LDR R1,??find_tegs_0+0x10 ;; `?` \ 000002F4 ........ LDR R0,??DataTable63 ;; curentposition \ 000002F8 000090E5 LDR R0,[R0, #+0] \ 000002FC 4B2FA0E3 MOV R2,#+300 \ 00000300 ........ LDR R3,??DataTable60 ;; media \ 00000304 923020E0 MLA R0,R2,R0,R3 \ 00000308 D20080E2 ADD R0,R0,#+210 \ 0000030C 160000EF SWI +22 101 } \ ??find_tegs_12: \ 00000310 ACD08DE2 ADD SP,SP,#+172 ;; stack cleaning \ 00000314 7080BDE8 POP {R4-R6,PC} ;; return \ ??find_tegs_0: \ 00000318 00000000 DC8 "",+0,+0,+0 \ 0000031C ........ DC32 `?` \ 00000320 ........ DC32 `?` \ 00000324 ........ DC32 `?` \ 00000328 ........ DC32 `?` 102 \ In segment DATA_Z, align 1, align-sorted 103 char extension[3]; \ extension: \ 00000000 DS8 3 104 \ In segment CODE, align 4, keep-with-next 105 void Create() 106 { \ Create: \ 00000000 F0402DE9 PUSH {R4-R7,LR} \ 00000004 50DE4DE2 SUB SP,SP,#+1280 107 char folder[256]; 108 sprintf(folder,tosearch); \ 00000008 ........ LDR R1,??DataTable69 ;; tosearch \ 0000000C C00F8DE2 ADD R0,SP,#+768 \ 00000010 160000EF SWI +22 109 sprintf(curent_state,LG_SEARCHING_FILES); \ 00000014 B8149FE5 LDR R1,??Create_0 ;; `?` \ 0000002C 480E8DE2 ADD R0,SP,#+1152 \ 00000030 160000EF SWI +22 115 if (FindFirstFile(&de,path,&err)) \ 00000034 0D20A0E1 MOV R2,SP \ 00000038 481E8DE2 ADD R1,SP,#+1152 \ 0000003C 08008DE2 ADD R0,SP,#+8 \ 00000040 6B0000EF SWI +107 \ 00000044 000050E3 CMP R0,#+0 \ 00000048 4400000A BEQ ??Create_1 116 { 117 do 118 { 119 sprintf(extension,"%c%c%c",de.file_name[strlen(de.file_name)-3],de.file_name[strlen(de.file_name)-2],de.file_name[strlen(de.file_name)-1]); \ ??Create_2: \ 0000004C B1008DE2 ADD R0,SP,#+177 \ 00000050 1B0000EF SWI +27 \ 00000054 0040A0E1 MOV R4,R0 \ 00000058 B1008DE2 ADD R0,SP,#+177 \ 0000005C 1B0000EF SWI +27 \ 00000060 0050A0E1 MOV R5,R0 \ 00000064 B1008DE2 ADD R0,SP,#+177 \ 00000068 1B0000EF SWI +27 \ 0000006C 08108DE2 ADD R1,SP,#+8 \ 00000070 011084E0 ADD R1,R4,R1 \ 00000074 A810D1E5 LDRB R1,[R1, #+168] \ 00000078 02002DE9 PUSH {R1} \ 0000007C 0C108DE2 ADD R1,SP,#+12 \ 00000080 011085E0 ADD R1,R5,R1 \ 00000084 A730D1E5 LDRB R3,[R1, #+167] \ 00000088 0C108DE2 ADD R1,SP,#+12 \ 0000008C 010080E0 ADD R0,R0,R1 \ 00000090 A620D0E5 LDRB R2,[R0, #+166] \ 00000094 40149FE5 LDR R1,??Create_0+0x8 ;; `?` \ 00000098 40049FE5 LDR R0,??Create_0+0xC ;; extension \ 0000009C 160000EF SWI +22 120 char temp[128]; 121 sprintf(temp,"%s\\%s",folder,de.file_name); \ 000000A0 B5308DE2 ADD R3,SP,#+181 \ 000000A4 C12F8DE2 ADD R2,SP,#+772 \ 000000A8 34149FE5 LDR R1,??Create_0+0x10 ;; `?` \ 000000AC 04008DE2 ADD R0,SP,#+4 \ 000000B0 400E80E2 ADD R0,R0,#+1024 \ 000000B4 160000EF SWI +22 122 if (!IsFile(de.file_name)) \ 000000B8 B5008DE2 ADD R0,SP,#+181 \ 000000BC ........ _BLF IsFile,??IsFile??rA \ 000000C0 000050E3 CMP R0,#+0 \ 000000C4 04D08DE2 ADD SP,SP,#+4 ;; stack cleaning \ 000000C8 0400001A BNE ??Create_3 123 { 124 sprintf(tosearch,temp); \ 000000CC 401E8DE2 ADD R1,SP,#+1024 \ 000000D0 ........ LDR R0,??DataTable69 ;; tosearch \ 000000D4 160000EF SWI +22 125 Create(); \ 000000D8 C8FFFFEB BL Create \ 000000DC 1A0000EA B ??Create_4 126 } 127 else 128 if (!strcmp_nocase(extension,"mp3")) \ ??Create_3: \ 000000E0 CE1F8FE2 ADR R1,??Create_5 ;; "mp3" \ 000000E4 F4039FE5 LDR R0,??Create_0+0xC ;; extension \ 000000E8 ........ _BLF strcmp_nocase,??strcmp_nocase??rA \ 000000EC 000050E3 CMP R0,#+0 \ 000000F0 1500001A BNE ??Create_4 129 { 130 sprintf(media[curentposition].shliah,temp); \ 000000F4 401E8DE2 ADD R1,SP,#+1024 \ 000000F8 ........ LDR R0,??DataTable63 ;; curentposition \ 000000FC 000090E5 LDR R0,[R0, #+0] \ 00000100 4B2FA0E3 MOV R2,#+300 \ 00000104 ........ LDR R3,??DataTable60 ;; media \ 00000108 923020E0 MLA R0,R2,R0,R3 \ 0000010C 160000EF SWI +22 131 find_tegs(); \ 00000110 ........ BL find_tegs 132 sprintf(curent_state,LG_READING_TAGS); \ 00000114 CC139FE5 LDR R1,??Create_0+0x14 ;; `?0) \ ??Create_8: \ 000001AC D21087E2 ADD R1,R7,#+210 \ 000001B0 D20085E2 ADD R0,R5,#+210 \ 000001B4 190000EF SWI +25 \ 000001B8 010050E3 CMP R0,#+1 \ 000001BC 290000BA BLT ??Create_9 154 { 155 sprintf(name,media[i].artist); \ 000001C0 D21085E2 ADD R1,R5,#+210 \ 000001C4 700F8DE2 ADD R0,SP,#+448 \ 000001C8 160000EF SWI +22 156 sprintf(media[i].artist,media[j].artist); \ 000001CC D21087E2 ADD R1,R7,#+210 \ 000001D0 D20085E2 ADD R0,R5,#+210 \ 000001D4 160000EF SWI +22 157 sprintf(media[j].artist,name); \ 000001D8 701F8DE2 ADD R1,SP,#+448 \ 000001DC D20087E2 ADD R0,R7,#+210 \ 000001E0 160000EF SWI +22 158 159 sprintf(name,media[i].track); \ 000001E4 0E00A0E3 MOV R0,#+14 \ 000001E8 400F80E3 ORR R0,R0,#0x100 \ 000001EC 051080E0 ADD R1,R0,R5 \ 000001F0 700F8DE2 ADD R0,SP,#+448 \ 000001F4 160000EF SWI +22 160 sprintf(media[i].track,media[j].track); \ 000001F8 0E00A0E3 MOV R0,#+14 \ 000001FC 400F80E3 ORR R0,R0,#0x100 \ 00000200 071080E0 ADD R1,R0,R7 \ 00000204 050080E0 ADD R0,R0,R5 \ 00000208 160000EF SWI +22 161 sprintf(media[j].track,name); \ 0000020C 701F8DE2 ADD R1,SP,#+448 \ 00000210 0E00A0E3 MOV R0,#+14 \ 00000214 400F80E3 ORR R0,R0,#0x100 \ 00000218 070080E0 ADD R0,R0,R7 \ 0000021C 160000EF SWI +22 162 163 sprintf(name,media[i].album); \ 00000220 F01085E2 ADD R1,R5,#+240 \ 00000224 700F8DE2 ADD R0,SP,#+448 \ 00000228 160000EF SWI +22 164 sprintf(media[i].album,media[j].album); \ 0000022C F01087E2 ADD R1,R7,#+240 \ 00000230 F00085E2 ADD R0,R5,#+240 \ 00000234 160000EF SWI +22 165 sprintf(media[j].album,name); \ 00000238 701F8DE2 ADD R1,SP,#+448 \ 0000023C F00087E2 ADD R0,R7,#+240 \ 00000240 160000EF SWI +22 166 167 sprintf(name,media[i].shliah); \ 00000244 0510A0E1 MOV R1,R5 \ 00000248 700F8DE2 ADD R0,SP,#+448 \ 0000024C 160000EF SWI +22 168 sprintf(media[i].shliah,media[j].shliah); \ 00000250 0710A0E1 MOV R1,R7 \ 00000254 0500A0E1 MOV R0,R5 \ 00000258 160000EF SWI +22 169 sprintf(media[j].shliah,name); \ 0000025C 701F8DE2 ADD R1,SP,#+448 \ 00000260 0700A0E1 MOV R0,R7 \ 00000264 160000EF SWI +22 170 } 171 } \ ??Create_9: \ 00000268 016086E2 ADD R6,R6,#+1 \ 0000026C 4B7F87E2 ADD R7,R7,#+300 \ ??Create_10: \ 00000270 ........ LDR R0,??DataTable63 ;; curentposition \ 00000274 000090E5 LDR R0,[R0, #+0] \ 00000278 000056E1 CMP R6,R0 \ 0000027C CAFFFFBA BLT ??Create_8 \ 00000280 014084E2 ADD R4,R4,#+1 \ 00000284 4B5F85E2 ADD R5,R5,#+300 \ ??Create_7: \ 00000288 ........ LDR R0,??DataTable63 ;; curentposition \ 0000028C 000090E5 LDR R0,[R0, #+0] \ 00000290 010080E2 ADD R0,R0,#+1 \ 00000294 000054E1 CMP R4,R0 \ 00000298 040000AA BGE ??Create_11 \ 0000029C 016084E2 ADD R6,R4,#+1 \ 000002A0 4B0FA0E3 MOV R0,#+300 \ 000002A4 ........ LDR R1,??DataTable60 ;; media \ 000002A8 901627E0 MLA R7,R0,R6,R1 \ 000002AC EFFFFFEA B ??Create_10 172 } 173 174 for (int i=0;i0)) \ ??Create_13: \ 000002BC D21087E2 ADD R1,R7,#+210 \ 000002C0 D20085E2 ADD R0,R5,#+210 \ 000002C4 190000EF SWI +25 \ 000002C8 000050E3 CMP R0,#+0 \ 000002CC 2E00001A BNE ??Create_14 \ 000002D0 F01087E2 ADD R1,R7,#+240 \ 000002D4 F00085E2 ADD R0,R5,#+240 \ 000002D8 190000EF SWI +25 \ 000002DC 010050E3 CMP R0,#+1 \ 000002E0 290000BA BLT ??Create_14 179 { 180 sprintf(name,media[i].artist); \ 000002E4 D21085E2 ADD R1,R5,#+210 \ 000002E8 700F8DE2 ADD R0,SP,#+448 \ 000002EC 160000EF SWI +22 181 sprintf(media[i].artist,media[j].artist); \ 000002F0 D21087E2 ADD R1,R7,#+210 \ 000002F4 D20085E2 ADD R0,R5,#+210 \ 000002F8 160000EF SWI +22 182 sprintf(media[j].artist,name); \ 000002FC 701F8DE2 ADD R1,SP,#+448 \ 00000300 D20087E2 ADD R0,R7,#+210 \ 00000304 160000EF SWI +22 183 184 sprintf(name,media[i].track); \ 00000308 0E00A0E3 MOV R0,#+14 \ 0000030C 400F80E3 ORR R0,R0,#0x100 \ 00000310 051080E0 ADD R1,R0,R5 \ 00000314 700F8DE2 ADD R0,SP,#+448 \ 00000318 160000EF SWI +22 185 sprintf(media[i].track,media[j].track); \ 0000031C 0E00A0E3 MOV R0,#+14 \ 00000320 400F80E3 ORR R0,R0,#0x100 \ 00000324 071080E0 ADD R1,R0,R7 \ 00000328 050080E0 ADD R0,R0,R5 \ 0000032C 160000EF SWI +22 186 sprintf(media[j].track,name); \ 00000330 701F8DE2 ADD R1,SP,#+448 \ 00000334 0E00A0E3 MOV R0,#+14 \ 00000338 400F80E3 ORR R0,R0,#0x100 \ 0000033C 070080E0 ADD R0,R0,R7 \ 00000340 160000EF SWI +22 187 188 sprintf(name,media[i].album); \ 00000344 F01085E2 ADD R1,R5,#+240 \ 00000348 700F8DE2 ADD R0,SP,#+448 \ 0000034C 160000EF SWI +22 189 sprintf(media[i].album,media[j].album); \ 00000350 F01087E2 ADD R1,R7,#+240 \ 00000354 F00085E2 ADD R0,R5,#+240 \ 00000358 160000EF SWI +22 190 sprintf(media[j].album,name); \ 0000035C 701F8DE2 ADD R1,SP,#+448 \ 00000360 F00087E2 ADD R0,R7,#+240 \ 00000364 160000EF SWI +22 191 192 sprintf(name,media[i].shliah); \ 00000368 0510A0E1 MOV R1,R5 \ 0000036C 700F8DE2 ADD R0,SP,#+448 \ 00000370 160000EF SWI +22 193 sprintf(media[i].shliah,media[j].shliah); \ 00000374 0710A0E1 MOV R1,R7 \ 00000378 0500A0E1 MOV R0,R5 \ 0000037C 160000EF SWI +22 194 sprintf(media[j].shliah,name); \ 00000380 701F8DE2 ADD R1,SP,#+448 \ 00000384 0700A0E1 MOV R0,R7 \ 00000388 160000EF SWI +22 195 } 196 } \ ??Create_14: \ 0000038C 016086E2 ADD R6,R6,#+1 \ 00000390 4B7F87E2 ADD R7,R7,#+300 \ ??Create_15: \ 00000394 ........ LDR R0,??DataTable63 ;; curentposition \ 00000398 000090E5 LDR R0,[R0, #+0] \ 0000039C 000056E1 CMP R6,R0 \ 000003A0 C5FFFFBA BLT ??Create_13 \ 000003A4 014084E2 ADD R4,R4,#+1 \ 000003A8 4B5F85E2 ADD R5,R5,#+300 \ ??Create_12: \ 000003AC ........ LDR R0,??DataTable63 ;; curentposition \ 000003B0 000090E5 LDR R0,[R0, #+0] \ 000003B4 010080E2 ADD R0,R0,#+1 \ 000003B8 000054E1 CMP R4,R0 \ 000003BC 040000AA BGE ??Create_16 \ 000003C0 016084E2 ADD R6,R4,#+1 \ 000003C4 4B0FA0E3 MOV R0,#+300 \ 000003C8 ........ LDR R1,??DataTable60 ;; media \ 000003CC 901627E0 MLA R7,R0,R6,R1 \ 000003D0 EFFFFFEA B ??Create_15 197 } 198 int f; 199 unsigned int err; 200 sprintf(curent_state,LG_SAVING); \ ??Create_16: \ 000003D4 1C119FE5 LDR R1,??Create_0+0x24 ;; `?` \ 000003E8 700F8DE2 ADD R0,SP,#+448 \ 000003EC 160000EF SWI +22 202 f=fopen(name, A_WriteOnly+A_Create, P_WRITE, & err ); \ 000003F0 04308DE2 ADD R3,SP,#+4 \ 000003F4 402FA0E3 MOV R2,#+256 \ 000003F8 011082E3 ORR R1,R2,#0x1 \ 000003FC 700F8DE2 ADD R0,SP,#+448 \ 00000400 0A0000EF SWI +10 \ 00000404 0040A0E1 MOV R4,R0 203 WSHDR* a=AllocWS(256); \ 00000408 400FA0E3 MOV R0,#+256 \ 0000040C 250100EF SWI +293 \ 00000410 0050A0E1 MOV R5,R0 204 for (int i=0;i` \ 00000464 720F8DE2 ADD R0,SP,#+456 \ 00000468 160000EF SWI +22 209 //utf8_2ws(a,name,256); 210 //ws_2str(a,name,256); 211 fwrite(f,name,strlen(name),&err); \ 0000046C 720F8DE2 ADD R0,SP,#+456 \ 00000470 1B0000EF SWI +27 \ 00000474 0C308DE2 ADD R3,SP,#+12 \ 00000478 0020A0E1 MOV R2,R0 \ 0000047C 721F8DE2 ADD R1,SP,#+456 \ 00000480 0400A0E1 MOV R0,R4 \ 00000484 0C0000EF SWI +12 212 } \ 00000488 016086E2 ADD R6,R6,#+1 \ 0000048C 4B7F87E2 ADD R7,R7,#+300 \ 00000490 08D08DE2 ADD SP,SP,#+8 ;; stack cleaning \ ??Create_17: \ 00000494 ........ LDR R0,??DataTable63 ;; curentposition \ 00000498 000090E5 LDR R0,[R0, #+0] \ 0000049C 000056E1 CMP R6,R0 \ 000004A0 DFFFFFBA BLT ??Create_18 213 FreeWS(a); \ 000004A4 0500A0E1 MOV R0,R5 \ 000004A8 290100EF SWI +297 214 fclose(f,&err); \ 000004AC 04108DE2 ADD R1,SP,#+4 \ 000004B0 0400A0E1 MOV R0,R4 \ 000004B4 0D0000EF SWI +13 215 } 216 GeneralFunc_flag1(GUI_GUI,1); \ 000004B8 0110A0E3 MOV R1,#+1 \ 000004BC ........ LDR R0,??DataTable67 ;; GUI_GUI \ 000004C0 000090E5 LDR R0,[R0, #+0] \ 000004C4 3D0100EF SWI +317 217 ViewFiles(); \ 000004C8 ........ _BLF ViewFiles,??ViewFiles??rA 218 } 219 } \ ??Create_6: \ 000004CC 50DE8DE2 ADD SP,SP,#+1280 ;; stack cleaning \ 000004D0 F080BDE8 POP {R4-R7,PC} ;; return \ ??Create_0: \ 000004D4 ........ DC32 `?` \ 000004DC ........ DC32 `?` \ 000004E0 ........ DC32 extension \ 000004E4 ........ DC32 `?` \ 000004E8 ........ DC32 `?` 220 \ In segment CODE, align 4, keep-with-next 221 int CreateBaseOfMediafiles() 222 { \ CreateBaseOfMediafiles: \ 00000000 10402DE9 PUSH {R4,LR} \ 00000004 BFDF4DE2 SUB SP,SP,#+764 223 DIR_ENTRY de; 224 unsigned int err; 225 char name[320]; 226 sprintf(name,"%smediafiiles.txt",playerfolder); \ 00000008 ........ LDR R2,??DataTable65 ;; playerfolder \ 0000000C ........ LDR R1,??DataTable66 ;; `?` \ 00000010 6F0F8DE2 ADD R0,SP,#+444 \ 00000014 160000EF SWI +22 227 if(!FindFirstFile(&de,name,&err)) \ 00000018 0D20A0E1 MOV R2,SP \ 0000001C 6F1F8DE2 ADD R1,SP,#+444 \ 00000020 04008DE2 ADD R0,SP,#+4 \ 00000024 6B0000EF SWI +107 \ 00000028 000050E3 CMP R0,#+0 \ 0000002C 1A00001A BNE ??CreateBaseOfMediafiles_0 228 { 229 MAIN_GUI *main_gui=malloc(sizeof(MAIN_GUI)); \ 00000030 3C00A0E3 MOV R0,#+60 \ 00000034 140000EF SWI +20 \ 00000038 0040A0E1 MOV R4,R0 230 zeromem(main_gui,sizeof(MAIN_GUI)); \ 0000003C 3C10A0E3 MOV R1,#+60 \ 00000040 1D0100EF SWI +285 231 main_gui->gui.canvas=(void *)(&Canvas2); \ 00000044 6C009FE5 LDR R0,??CreateBaseOfMediafiles_1 ;; Canvas2 \ 00000048 000084E5 STR R0,[R4, #+0] 232 main_gui->gui.flag30=2; \ 0000004C 0200A0E3 MOV R0,#+2 \ 00000050 2C0084E5 STR R0,[R4, #+44] 233 main_gui->gui.methods=(void *)gui_methods3; \ 00000054 60009FE5 LDR R0,??CreateBaseOfMediafiles_1+0x4 ;; gui_methods3 \ 00000058 040084E5 STR R0,[R4, #+4] 234 main_gui->gui.item_ll.data_mfree=(void (*)(void *))mfree_adr(); \ 0000005C 158000EF SWI +32789 \ 00000060 1C0084E5 STR R0,[R4, #+28] 235 GUI_GUI=CreateGUI(main_gui); \ 00000064 0400A0E1 MOV R0,R4 \ 00000068 370100EF SWI +311 \ 0000006C ........ LDR R1,??DataTable67 ;; GUI_GUI \ 00000070 000081E5 STR R0,[R1, #+0] 236 sprintf(tosearch,chotyry); \ 00000074 ........ LDR R0,??DataTable68 ;; chotyry \ 00000078 001090E5 LDR R1,[R0, #+0] \ 0000007C ........ LDR R0,??DataTable69 ;; tosearch \ 00000080 160000EF SWI +22 237 sprintf(curent_state,LG_SEARCHING); \ 00000084 34109FE5 LDR R1,??CreateBaseOfMediafiles_1+0x8 ;; `?` \ In segment CODE, align 4, keep-with-next \ ??DataTable67: \ 00000000 ........ DC32 GUI_GUI \ In segment CODE, align 4, keep-with-next \ ??DataTable68: \ 00000000 ........ DC32 chotyry \ In segment CODE, align 4, keep-with-next \ ??DataTable69: \ 00000000 ........ DC32 tosearch \ In segment CODE, align 4, keep-with-next \ ??DataTable70: \ 00000000 ........ DC32 curent_state \ In segment DATA_ID, align 4, align-sorted \ `?`: \ 00000000 ........ DC32 `?` \ In segment DATA_C, align 1, align-sorted \ `?`: \ 00000000 343A00 DC8 "4:" \ In segment DATA_C, align 1, align-sorted \ 00000000 00 DC8 "" \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 2573256300 DC8 "%s%c" \ 00000005 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 556E6B6E6F77 DC8 "Unknown album" \ 6E20616C6275 \ 6D00 \ 0000000E 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 556E6B6E6F77 DC8 "Unknown track" \ 6E2074726163 \ 6B00 \ 0000000E 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 556E6B6E6F77 DC8 "Unknown artist" \ 6E2061727469 \ 737400 \ 0000000F 00 DC8 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 25735C2A00 DC8 "%s\\*" \ 00000005 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 256325632563 DC8 "%c%c%c" \ 00 \ 00000007 00 DC8 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 25735C257300 DC8 "%s\\%s" \ 00000006 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 25736D656469 DC8 "%smediafiiles.txt" \ 616669696C65 \ 732E74787400 \ 00000012 0000 DC8 0, 0 \ In segment DATA_C, align 4, align-sorted \ `?`: \ 00000000 25730D0A2573 DC8 "%s\015\012%s\015\012%s\015\012%s\015\012" \ 0D0A25730D0A \ 25730D0A00 \ 00000011 000000 DC8 0, 0, 0 \ In segment DATA_C, align 4, align-sorted \ `? 4 ? 3 ? 1 ? 8 ? 16 ? 16 ? 16 ? 8 ? 8 ? 8 ? 4 ? 20 ? 20 ?