| 1 | // G10 1.03b |
|---|
| 2 | #include "lolevel.h" |
|---|
| 3 | #include "platform.h" |
|---|
| 4 | #include "core.h" |
|---|
| 5 | #include "stdlib.h" |
|---|
| 6 | #include "gui.h" |
|---|
| 7 | #include "../../../../core/gui_draw.h" |
|---|
| 8 | |
|---|
| 9 | const char * const new_sa = &_end; |
|---|
| 10 | |
|---|
| 11 | #define LED_ISO (void*) 0xC02200D0 // G10 ISO select dial LED |
|---|
| 12 | #define LED_DP (void*) 0xC02200D4 // G10 direct print button LED |
|---|
| 13 | #define LED_ECL (void*) 0xC02200D8 // G10 exposure compensation dial LED |
|---|
| 14 | #define LED_PWR (void*) 0xC02200DC // G10 power LED |
|---|
| 15 | |
|---|
| 16 | // Forward declarations |
|---|
| 17 | void CreateTask_PhySw(); |
|---|
| 18 | void CreateTask_spytask(); |
|---|
| 19 | extern volatile int jogdial_stopped; |
|---|
| 20 | void JogDial_task_my(void); |
|---|
| 21 | |
|---|
| 22 | enum Gui_Mode gui_get_mode() ; |
|---|
| 23 | |
|---|
| 24 | void __attribute__((naked,noinline)) task_blinker() { |
|---|
| 25 | |
|---|
| 26 | int pwr_led_count = 0 ; |
|---|
| 27 | int blue_led_count = 0 ; |
|---|
| 28 | int gui_mode, gui_mode_flag = GUI_MODE_NONE ; |
|---|
| 29 | |
|---|
| 30 | volatile long *pwr_LED = (void*)LED_PWR; |
|---|
| 31 | volatile long *blue_LED = (void*)LED_DP; |
|---|
| 32 | |
|---|
| 33 | _SleepTask(2000); |
|---|
| 34 | |
|---|
| 35 | while(1){ |
|---|
| 36 | |
|---|
| 37 | gui_mode = gui_get_mode() ; |
|---|
| 38 | |
|---|
| 39 | if(( (gui_mode == GUI_MODE_ALT) && (gui_mode_flag != GUI_MODE_ALT) ) || ( (gui_mode == GUI_MODE_NONE) && (gui_mode_flag != GUI_MODE_NONE) ) ) |
|---|
| 40 | { |
|---|
| 41 | gui_mode_flag = gui_mode ; |
|---|
| 42 | blue_led_count = 10 ; |
|---|
| 43 | *blue_LED = 0x46; |
|---|
| 44 | } |
|---|
| 45 | if ( blue_led_count > 0 ) |
|---|
| 46 | { |
|---|
| 47 | if ( --blue_led_count == 0 ) |
|---|
| 48 | { |
|---|
| 49 | *blue_LED = 0x44; |
|---|
| 50 | } |
|---|
| 51 | } |
|---|
| 52 | |
|---|
| 53 | if ( pwr_led_count == 2 ) |
|---|
| 54 | { |
|---|
| 55 | *pwr_LED = 0x44; |
|---|
| 56 | } |
|---|
| 57 | if ( --pwr_led_count <= 0 ) |
|---|
| 58 | { |
|---|
| 59 | pwr_led_count = 20 ; |
|---|
| 60 | *pwr_LED = 0x46; |
|---|
| 61 | } |
|---|
| 62 | |
|---|
| 63 | _SleepTask(100); |
|---|
| 64 | } |
|---|
| 65 | }; |
|---|
| 66 | |
|---|
| 67 | void CreateTask_Blinker() { |
|---|
| 68 | _CreateTask("Blinker", 0x1, 0x200, task_blinker, 0); |
|---|
| 69 | }; |
|---|
| 70 | |
|---|
| 71 | |
|---|
| 72 | void taskCreateHook(int *p) { |
|---|
| 73 | p-=17; |
|---|
| 74 | |
|---|
| 75 | if (p[0]==0xff882ea8) p[0]=(int)init_file_modules_task; |
|---|
| 76 | if (p[0]==0xff862c0c) p[0]=(int)movie_record_task; |
|---|
| 77 | if (p[0]==0xff866bfc) p[0]=(int)capt_seq_task; |
|---|
| 78 | if (p[0]==0xff8ab0e0) p[0]=(int)exp_drv_task; |
|---|
| 79 | if (p[0]==0xff84b23c) p[0]=(int)JogDial_task_my; |
|---|
| 80 | } |
|---|
| 81 | |
|---|
| 82 | void taskCreateHook2(int *p) { |
|---|
| 83 | p-=17; |
|---|
| 84 | if (p[0]==0xff882ea8) p[0]=(int)init_file_modules_task; |
|---|
| 85 | if (p[0]==0xff8ab0e0) p[0]=(int)exp_drv_task; |
|---|
| 86 | } |
|---|
| 87 | |
|---|
| 88 | void __attribute__((naked,noinline)) boot( ) { |
|---|
| 89 | asm volatile ( |
|---|
| 90 | " LDR R1, =0xC0410000 \n" |
|---|
| 91 | " MOV R0, #0 \n" |
|---|
| 92 | " STR R0, [R1] \n" |
|---|
| 93 | " MOV R1, #0x78 \n" |
|---|
| 94 | " MCR p15, 0, R1, c1, c0 \n" |
|---|
| 95 | " MOV R1, #0 \n" |
|---|
| 96 | " MCR p15, 0, R1, c7, c10, 4 \n" |
|---|
| 97 | " MCR p15, 0, R1, c7, c5 \n" |
|---|
| 98 | " MCR p15, 0, R1, c7, c6 \n" |
|---|
| 99 | " MOV R0, #0x3D \n" |
|---|
| 100 | " MCR p15, 0, R0, c6, c0 \n" |
|---|
| 101 | " MOV R0, #0xC000002F \n" |
|---|
| 102 | " MCR p15, 0, R0, c6, c1 \n" |
|---|
| 103 | " MOV R0, #0x35 \n" |
|---|
| 104 | " MCR p15, 0, R0, c6, c2 \n" |
|---|
| 105 | " MOV R0, #0x40000035 \n" |
|---|
| 106 | " MCR p15, 0, R0, c6, c3 \n" |
|---|
| 107 | " MOV R0, #0x80000017 \n" |
|---|
| 108 | " MCR p15, 0, R0, c6, c4 \n" |
|---|
| 109 | " LDR R0, =0xFF80002D \n" |
|---|
| 110 | " MCR p15, 0, R0, c6, c5 \n" |
|---|
| 111 | " MOV R0, #0x34 \n" |
|---|
| 112 | " MCR p15, 0, R0, c2, c0 \n" |
|---|
| 113 | " MOV R0, #0x34 \n" |
|---|
| 114 | " MCR p15, 0, R0, c2, c0, 1 \n" |
|---|
| 115 | " MOV R0, #0x34 \n" |
|---|
| 116 | " MCR p15, 0, R0, c3, c0 \n" |
|---|
| 117 | " LDR R0, =0x3333330 \n" |
|---|
| 118 | " MCR p15, 0, R0, c5, c0, 2 \n" |
|---|
| 119 | " LDR R0, =0x3333330 \n" |
|---|
| 120 | " MCR p15, 0, R0, c5, c0, 3 \n" |
|---|
| 121 | " MRC p15, 0, R0, c1, c0 \n" |
|---|
| 122 | " ORR R0, R0, #0x1000 \n" |
|---|
| 123 | " ORR R0, R0, #4 \n" |
|---|
| 124 | " ORR R0, R0, #1 \n" |
|---|
| 125 | " MCR p15, 0, R0, c1, c0 \n" |
|---|
| 126 | " MOV R1, #0x80000006 \n" |
|---|
| 127 | " MCR p15, 0, R1, c9, c1 \n" |
|---|
| 128 | " MOV R1, #6 \n" |
|---|
| 129 | " MCR p15, 0, R1, c9, c1, 1 \n" |
|---|
| 130 | " MRC p15, 0, R1, c1, c0 \n" |
|---|
| 131 | " ORR R1, R1, #0x50000 \n" |
|---|
| 132 | " MCR p15, 0, R1, c1, c0 \n" |
|---|
| 133 | " LDR R2, =0xC0200000 \n" |
|---|
| 134 | " MOV R1, #1 \n" |
|---|
| 135 | " STR R1, [R2, #0x10C] \n" |
|---|
| 136 | " MOV R1, #0xFF \n" |
|---|
| 137 | " STR R1, [R2, #0xC] \n" |
|---|
| 138 | " STR R1, [R2, #0x1C] \n" |
|---|
| 139 | " STR R1, [R2, #0x2C] \n" |
|---|
| 140 | " STR R1, [R2, #0x3C] \n" |
|---|
| 141 | " STR R1, [R2, #0x4C] \n" |
|---|
| 142 | " STR R1, [R2, #0x5C] \n" |
|---|
| 143 | " STR R1, [R2, #0x6C] \n" |
|---|
| 144 | " STR R1, [R2, #0x7C] \n" |
|---|
| 145 | " STR R1, [R2, #0x8C] \n" |
|---|
| 146 | " STR R1, [R2, #0x9C] \n" |
|---|
| 147 | " STR R1, [R2, #0xAC] \n" |
|---|
| 148 | " STR R1, [R2, #0xBC] \n" |
|---|
| 149 | " STR R1, [R2, #0xCC] \n" |
|---|
| 150 | " STR R1, [R2, #0xDC] \n" |
|---|
| 151 | " STR R1, [R2, #0xEC] \n" |
|---|
| 152 | " STR R1, [R2, #0xFC] \n" |
|---|
| 153 | " LDR R1, =0xC0400008 \n" |
|---|
| 154 | " LDR R2, =0x430005 \n" |
|---|
| 155 | " STR R2, [R1] \n" |
|---|
| 156 | " MOV R1, #1 \n" |
|---|
| 157 | " LDR R2, =0xC0243100 \n" |
|---|
| 158 | " STR R2, [R1] \n" |
|---|
| 159 | " LDR R2, =0xC0242010 \n" |
|---|
| 160 | " LDR R1, [R2] \n" |
|---|
| 161 | " ORR R1, R1, #1 \n" |
|---|
| 162 | " STR R1, [R2] \n" |
|---|
| 163 | " LDR R0, =0xFFBA0A04 \n" //* firmware difference |
|---|
| 164 | |
|---|
| 165 | " LDR R1, =0x1900 \n" // MEMBASEADDR=0x1900 |
|---|
| 166 | " LDR R3, =0x10834 \n" |
|---|
| 167 | "loc_FF81013C:\n" |
|---|
| 168 | " CMP R1, R3 \n" |
|---|
| 169 | " LDRCC R2, [R0], #4 \n" |
|---|
| 170 | " STRCC R2, [R1], #4 \n" |
|---|
| 171 | " BCC loc_FF81013C \n" |
|---|
| 172 | " LDR R1, =0xEEECC \n" // MEMISOSTART=0xEEECC |
|---|
| 173 | " MOV R2, #0 \n" |
|---|
| 174 | "loc_FF810154:\n" |
|---|
| 175 | " CMP R3, R1 \n" |
|---|
| 176 | " STRCC R2, [R3], #4 \n" |
|---|
| 177 | " BCC loc_FF810154 \n" |
|---|
| 178 | " B sub_FF8101A0_my\n" |
|---|
| 179 | ); |
|---|
| 180 | } |
|---|
| 181 | |
|---|
| 182 | void __attribute__((naked,noinline)) sub_FF8101A0_my( ) { |
|---|
| 183 | |
|---|
| 184 | *(int*)0x1930=(int)taskCreateHook; |
|---|
| 185 | *(int*)0x1934=(int)taskCreateHook2; |
|---|
| 186 | *(int*)0x1938=(int)taskCreateHook; |
|---|
| 187 | |
|---|
| 188 | // Power ON/OFF detection G10 @FF84A8D0 replacement for correct power-on. |
|---|
| 189 | *(int*)(0x25CC+0x04)= (*(int*)0xC02200F8)&1 ? 0x100000 : 0x200000; // replacement for correct power-on. |
|---|
| 190 | |
|---|
| 191 | asm volatile ( |
|---|
| 192 | " LDR R0, =0xFF810218 \n" |
|---|
| 193 | " MOV R1, #0 \n" |
|---|
| 194 | " LDR R3, =0xFF810250 \n" |
|---|
| 195 | "loc_FF8101AC:\n" |
|---|
| 196 | " CMP R0, R3 \n" |
|---|
| 197 | " LDRCC R2, [R0], #4 \n" |
|---|
| 198 | " STRCC R2, [R1], #4 \n" |
|---|
| 199 | " BCC loc_FF8101AC \n" |
|---|
| 200 | " LDR R0, =0xFF810250 \n" |
|---|
| 201 | " MOV R1, #0x4B0 \n" |
|---|
| 202 | " LDR R3, =0xFF810464 \n" |
|---|
| 203 | "loc_FF8101C8:\n" |
|---|
| 204 | " CMP R0, R3 \n" |
|---|
| 205 | " LDRCC R2, [R0], #4 \n" |
|---|
| 206 | " STRCC R2, [R1], #4 \n" |
|---|
| 207 | " BCC loc_FF8101C8 \n" |
|---|
| 208 | " MOV R0, #0xD2 \n" |
|---|
| 209 | " MSR CPSR_cxsf, R0 \n" |
|---|
| 210 | " MOV SP, #0x1000 \n" |
|---|
| 211 | " MOV R0, #0xD3 \n" |
|---|
| 212 | " MSR CPSR_cxsf, R0 \n" |
|---|
| 213 | " MOV SP, #0x1000 \n" |
|---|
| 214 | " LDR R0, =0x6C4 \n" |
|---|
| 215 | " LDR R2, =0xEEEEEEEE \n" |
|---|
| 216 | " MOV R3, #0x1000 \n" |
|---|
| 217 | "loc_FF8101FC:\n" |
|---|
| 218 | " CMP R0, R3 \n" |
|---|
| 219 | " STRCC R2, [R0], #4 \n" |
|---|
| 220 | " BCC loc_FF8101FC \n" |
|---|
| 221 | " BL sub_FF810F94_my \n" //-----------> |
|---|
| 222 | ); |
|---|
| 223 | } |
|---|
| 224 | |
|---|
| 225 | |
|---|
| 226 | //** sub_FF810F94_my @ 0xFF810F94 |
|---|
| 227 | |
|---|
| 228 | void __attribute__((naked,noinline)) sub_FF810F94_my( ) { |
|---|
| 229 | asm volatile ( |
|---|
| 230 | " STR LR, [SP, #-4]! \n" |
|---|
| 231 | " SUB SP, SP, #0x74 \n" |
|---|
| 232 | " MOV R0, SP \n" |
|---|
| 233 | " MOV R1, #0x74 \n" |
|---|
| 234 | " BL sub_FFB05270 \n" //* firmware difference |
|---|
| 235 | |
|---|
| 236 | " MOV R0, #0x53000 \n" |
|---|
| 237 | " STR R0, [SP, #4] \n" |
|---|
| 238 | //" LDR R0, =0xEEECC \n" // - |
|---|
| 239 | " LDR R0, =new_sa\n" // + |
|---|
| 240 | " LDR R0, [R0]\n" // + |
|---|
| 241 | " LDR R2, =0x379C00 \n" |
|---|
| 242 | " LDR R1, =0x3724A8 \n" |
|---|
| 243 | " STR R0, [SP, #8] \n" |
|---|
| 244 | " SUB R0, R1, R0 \n" |
|---|
| 245 | " ADD R3, SP, #0xC \n" |
|---|
| 246 | " STR R2, [SP] \n" |
|---|
| 247 | " STMIA R3, {R0-R2} \n" |
|---|
| 248 | " MOV R0, #0x22 \n" |
|---|
| 249 | " STR R0, [SP, #0x18] \n" |
|---|
| 250 | " MOV R0, #0x68 \n" |
|---|
| 251 | " STR R0, [SP, #0x1C] \n" |
|---|
| 252 | " LDR R0, =0x19B \n" |
|---|
| 253 | " LDR R1, =sub_FF814D8C_my \n" //+ ----------> |
|---|
| 254 | " STR R0, [SP, #0x20] \n" |
|---|
| 255 | " MOV R0, #0x96 \n" |
|---|
| 256 | " STR R0, [SP, #0x24] \n" |
|---|
| 257 | " MOV R0, #0x78 \n" |
|---|
| 258 | " STR R0, [SP, #0x28] \n" |
|---|
| 259 | " MOV R0, #0x64 \n" |
|---|
| 260 | " STR R0, [SP, #0x2C] \n" |
|---|
| 261 | " MOV R0, #0 \n" |
|---|
| 262 | " STR R0, [SP, #0x30] \n" |
|---|
| 263 | " STR R0, [SP, #0x34] \n" |
|---|
| 264 | " MOV R0, #0x10 \n" |
|---|
| 265 | " STR R0, [SP, #0x5C] \n" |
|---|
| 266 | " MOV R0, #0x800 \n" |
|---|
| 267 | " STR R0, [SP, #0x60] \n" |
|---|
| 268 | " MOV R0, #0xA0 \n" |
|---|
| 269 | " STR R0, [SP, #0x64] \n" |
|---|
| 270 | " MOV R0, #0x280 \n" |
|---|
| 271 | " STR R0, [SP, #0x68] \n" |
|---|
| 272 | " MOV R0, SP \n" |
|---|
| 273 | " MOV R2, #0 \n" |
|---|
| 274 | " BL sub_FF812D38 \n" |
|---|
| 275 | " ADD SP, SP, #0x74 \n" |
|---|
| 276 | " LDR PC, [SP], #4 \n" |
|---|
| 277 | ); |
|---|
| 278 | } |
|---|
| 279 | |
|---|
| 280 | //** sub_FF814D8C_my @ 0xFF814D8C |
|---|
| 281 | |
|---|
| 282 | void __attribute__((naked,noinline)) sub_FF814D8C_my( ) { |
|---|
| 283 | asm volatile ( |
|---|
| 284 | " STMFD SP!, {R4,LR} \n" |
|---|
| 285 | " BL sub_FF810940 \n" |
|---|
| 286 | " BL sub_FF81901C \n" |
|---|
| 287 | " CMP R0, #0 \n" |
|---|
| 288 | " LDRLT R0, =0xFF814EA0 \n" |
|---|
| 289 | " BLLT sub_FF814E80 \n" |
|---|
| 290 | " BL sub_FF8149B4 \n" |
|---|
| 291 | " CMP R0, #0 \n" |
|---|
| 292 | " LDRLT R0, =0xFF814EA8 \n" |
|---|
| 293 | " BLLT sub_FF814E80 \n" |
|---|
| 294 | " LDR R0, =0xFF814EB8 \n" |
|---|
| 295 | " BL sub_FF814A9C \n" |
|---|
| 296 | " CMP R0, #0 \n" |
|---|
| 297 | " LDRLT R0, =0xFF814EC0 \n" |
|---|
| 298 | " BLLT sub_FF814E80 \n" |
|---|
| 299 | " LDR R0, =0xFF814EB8 \n" |
|---|
| 300 | " BL sub_FF813548 \n" |
|---|
| 301 | " CMP R0, #0 \n" |
|---|
| 302 | " LDRLT R0, =0xFF814ED4 \n" |
|---|
| 303 | " BLLT sub_FF814E80 \n" |
|---|
| 304 | " BL sub_FF818BA4 \n" |
|---|
| 305 | " CMP R0, #0 \n" |
|---|
| 306 | " LDRLT R0, =0xFF814EE0 \n" |
|---|
| 307 | " BLLT sub_FF814E80 \n" |
|---|
| 308 | " BL sub_FF811478 \n" |
|---|
| 309 | " CMP R0, #0 \n" |
|---|
| 310 | " LDRLT R0, =0xFF814EEC \n" |
|---|
| 311 | " BLLT sub_FF814E80 \n" |
|---|
| 312 | " LDMFD SP!, {R4,LR} \n" |
|---|
| 313 | " B taskcreate_Startup_my\n" //----------> |
|---|
| 314 | ); |
|---|
| 315 | } |
|---|
| 316 | |
|---|
| 317 | //** taskcreate_Startup_my @ 0xFF81C1A8 |
|---|
| 318 | |
|---|
| 319 | void __attribute__((naked,noinline)) taskcreate_Startup_my( ) { |
|---|
| 320 | asm volatile ( |
|---|
| 321 | " STMFD SP!, {R3,LR} \n" |
|---|
| 322 | " BL sub_FF8219D4 \n" |
|---|
| 323 | " BL sub_FF82A16C \n" |
|---|
| 324 | " CMP R0, #0 \n" |
|---|
| 325 | " BNE loc_FF81C1EC \n" |
|---|
| 326 | " BL sub_FF823100 \n" |
|---|
| 327 | " CMP R0, #0 \n" |
|---|
| 328 | " BNE loc_FF81C1EC \n" |
|---|
| 329 | " BL sub_FF8219D0 \n" |
|---|
| 330 | " CMP R0, #0 \n" |
|---|
| 331 | " BNE loc_FF81C1EC \n" |
|---|
| 332 | " BL sub_FF821168 \n" |
|---|
| 333 | " LDR R1, =0xC0220000 \n" |
|---|
| 334 | " MOV R0, #0x44 \n" |
|---|
| 335 | " STR R0, [R1, #0x1C] \n" |
|---|
| 336 | " BL sub_FF821354 \n" |
|---|
| 337 | "loc_FF81C1E8:\n" |
|---|
| 338 | " B loc_FF81C1E8 \n" |
|---|
| 339 | "loc_FF81C1EC:\n" |
|---|
| 340 | //" BL sub_FF8219DC \n" // removed for corrected power-on/off button operation see boot() function |
|---|
| 341 | " BL sub_FF8219D8 \n" |
|---|
| 342 | " BL sub_FF8282FC \n" |
|---|
| 343 | " LDR R1, =0x3CE000 \n" |
|---|
| 344 | " MOV R0, #0 \n" |
|---|
| 345 | " BL sub_FF828744 \n" |
|---|
| 346 | " BL sub_FF8284F0 \n" |
|---|
| 347 | " MOV R3, #0 \n" |
|---|
| 348 | " STR R3, [SP] \n" |
|---|
| 349 | //" LDR R3, =0xFF81C144 \n" |
|---|
| 350 | " LDR R3, =task_Startup_my\n" //+ -----------> |
|---|
| 351 | " MOV R2, #0 \n" |
|---|
| 352 | " MOV R1, #0x19 \n" |
|---|
| 353 | " LDR R0, =0xFF81C234 \n" |
|---|
| 354 | " BL sub_FF81AEF4 \n" |
|---|
| 355 | " MOV R0, #0 \n" |
|---|
| 356 | " LDMFD SP!, {R12,PC} \n" |
|---|
| 357 | ); |
|---|
| 358 | } |
|---|
| 359 | |
|---|
| 360 | |
|---|
| 361 | //** task_Startup_my @ 0xFF81C144 |
|---|
| 362 | |
|---|
| 363 | void __attribute__((naked,noinline)) task_Startup_my( ) { |
|---|
| 364 | *((volatile int *) LED_PWR) = 0x46; |
|---|
| 365 | asm volatile ( |
|---|
| 366 | " STMFD SP!, {R4,LR} \n" |
|---|
| 367 | " BL sub_FF8153CC \n" |
|---|
| 368 | " BL sub_FF822B38 \n" |
|---|
| 369 | " BL sub_FF820E28 \n" |
|---|
| 370 | " BL sub_FF82A1AC \n" |
|---|
| 371 | " BL sub_FF82A374 \n" |
|---|
| 372 | //" BL sub_FF82A234 \n" // Skip starting diskboot.bin again |
|---|
| 373 | " BL sub_FF82A52C \n" |
|---|
| 374 | " BL sub_FF81FAA0 \n" |
|---|
| 375 | " BL sub_FF82A3C4 \n" |
|---|
| 376 | " BL sub_FF8278FC \n" |
|---|
| 377 | " BL sub_FF82A530 \n" |
|---|
| 378 | //" BL sub_FF8218CC \n" // taskcreate_PhySw |
|---|
| 379 | ); |
|---|
| 380 | CreateTask_spytask(); // + |
|---|
| 381 | CreateTask_PhySw(); // + |
|---|
| 382 | CreateTask_Blinker(); |
|---|
| 383 | asm volatile ( |
|---|
| 384 | " BL sub_FF82503C \n" |
|---|
| 385 | " BL sub_FF82A548 \n" |
|---|
| 386 | " BL sub_FF81EF04 \n" |
|---|
| 387 | " BL busy_loop \n" |
|---|
| 388 | " BL sub_FF820738 \n" |
|---|
| 389 | " BL sub_FF829F48 \n" |
|---|
| 390 | " BL sub_FF820DD8 \n" |
|---|
| 391 | " BL sub_FF820644 \n" |
|---|
| 392 | " BL sub_FF81FAD4 \n" |
|---|
| 393 | " BL sub_FF82B068 \n" |
|---|
| 394 | " BL sub_FF82061C \n" |
|---|
| 395 | " LDMFD SP!, {R4,LR} \n" |
|---|
| 396 | " B sub_FF815490 \n" |
|---|
| 397 | ); |
|---|
| 398 | } |
|---|
| 399 | |
|---|
| 400 | void __attribute__((naked,noinline)) busy_loop() { // loop hack that allows startup with battery door open |
|---|
| 401 | asm volatile ( |
|---|
| 402 | " STMFD SP!, {R4-R6,LR} \n" |
|---|
| 403 | " LDR R0, =0x400000 \n" |
|---|
| 404 | "loop1: \n" |
|---|
| 405 | " nop\n" |
|---|
| 406 | " SUBS R0,R0,#1 \n" |
|---|
| 407 | " BNE loop1 \n" |
|---|
| 408 | " LDMFD SP!, {R4-R6,PC} \n" |
|---|
| 409 | ); |
|---|
| 410 | } |
|---|
| 411 | |
|---|
| 412 | void CreateTask_spytask() { |
|---|
| 413 | _CreateTask("SpyTask", 0x19, 0x2000, core_spytask, 0); |
|---|
| 414 | }; |
|---|
| 415 | |
|---|
| 416 | |
|---|
| 417 | //** CreateTask_PhySw @ 0xFF8218CC |
|---|
| 418 | |
|---|
| 419 | void __attribute__((naked,noinline)) CreateTask_PhySw( ) { |
|---|
| 420 | asm volatile ( |
|---|
| 421 | " STMFD SP!, {R3-R5,LR} \n" |
|---|
| 422 | " LDR R4, =0x1C20 \n" |
|---|
| 423 | " LDR R0, [R4, #0x10] \n" |
|---|
| 424 | " CMP R0, #0 \n" |
|---|
| 425 | " BNE loc_FF821900 \n" |
|---|
| 426 | " MOV R3, #0 \n" |
|---|
| 427 | " STR R3, [SP] \n" |
|---|
| 428 | //" LDR R3, =0xFF821898 \n" |
|---|
| 429 | //" MOV R2, #0x800 \n" |
|---|
| 430 | " LDR R3, =mykbd_task\n" // task_phySw |
|---|
| 431 | " MOV R2, #0x2000\n" // greater Stacksize |
|---|
| 432 | " MOV R1, #0x17 \n" |
|---|
| 433 | " LDR R0, =0xFF821AD4 \n" |
|---|
| 434 | " BL sub_FF828544 \n" |
|---|
| 435 | " STR R0, [R4, #0x10] \n" |
|---|
| 436 | "loc_FF821900:\n" |
|---|
| 437 | " BL sub_FF84B338 \n" |
|---|
| 438 | " BL sub_FF875CBC \n" |
|---|
| 439 | " BL sub_FF8230A4 \n" |
|---|
| 440 | " CMP R0, #0 \n" |
|---|
| 441 | " LDREQ R1, =0x11CC4 \n" |
|---|
| 442 | " LDMEQFD SP!, {R3-R5,LR} \n" |
|---|
| 443 | " BEQ sub_FF875BFC \n" |
|---|
| 444 | " LDMFD SP!, {R3-R5,PC} \n" |
|---|
| 445 | ); |
|---|
| 446 | } |
|---|
| 447 | |
|---|
| 448 | |
|---|
| 449 | //** init_file_modules_task @ 0xFF882EA8 |
|---|
| 450 | |
|---|
| 451 | void __attribute__((naked,noinline)) init_file_modules_task( ) { |
|---|
| 452 | asm volatile ( |
|---|
| 453 | " STMFD SP!, {R4-R6,LR} \n" |
|---|
| 454 | " BL sub_FF87806C \n" |
|---|
| 455 | " LDR R5, =0x5006 \n" |
|---|
| 456 | " MOVS R4, R0 \n" |
|---|
| 457 | " MOVNE R1, #0 \n" |
|---|
| 458 | " MOVNE R0, R5 \n" |
|---|
| 459 | " BLNE sub_FF87CD38 \n" |
|---|
| 460 | //" BL sub_FF878098 \n" |
|---|
| 461 | " BL sub_FF878098_my\n" //-----------> |
|---|
| 462 | " BL core_spytask_can_start\n" // + |
|---|
| 463 | " CMP R4, #0 \n" |
|---|
| 464 | " MOVEQ R0, R5 \n" |
|---|
| 465 | " LDMEQFD SP!, {R4-R6,LR} \n" |
|---|
| 466 | " MOVEQ R1, #0 \n" |
|---|
| 467 | " BEQ sub_FF87CD38 \n" |
|---|
| 468 | " LDMFD SP!, {R4-R6,PC} \n" |
|---|
| 469 | ); |
|---|
| 470 | } |
|---|
| 471 | |
|---|
| 472 | |
|---|
| 473 | //** sub_FF878098_my @ 0xFF878098 |
|---|
| 474 | |
|---|
| 475 | void __attribute__((naked,noinline)) sub_FF878098_my( ) { |
|---|
| 476 | asm volatile ( |
|---|
| 477 | " STMFD SP!, {R4,LR} \n" |
|---|
| 478 | //" BL sub_FF859C00 \n" |
|---|
| 479 | " BL sub_FF859C00_my\n" // ----------> |
|---|
| 480 | " BL sub_FF91F284 \n" // nullsub |
|---|
| 481 | " LDR R4, =0x585C \n" |
|---|
| 482 | " LDR R0, [R4, #4] \n" |
|---|
| 483 | " CMP R0, #0 \n" |
|---|
| 484 | " BNE loc_FF8780CC \n" |
|---|
| 485 | " BL sub_FF8590C8 \n" |
|---|
| 486 | " BL sub_FF912FC0 \n" |
|---|
| 487 | " BL sub_FF8590C8 \n" |
|---|
| 488 | " BL sub_FF854F9C \n" |
|---|
| 489 | " BL sub_FF858FC8 \n" |
|---|
| 490 | " BL sub_FF91308C \n" |
|---|
| 491 | "loc_FF8780CC:\n" |
|---|
| 492 | " MOV R0, #1 \n" |
|---|
| 493 | " STR R0, [R4] \n" |
|---|
| 494 | " LDMFD SP!, {R4,PC} \n" |
|---|
| 495 | ); |
|---|
| 496 | } |
|---|
| 497 | |
|---|
| 498 | |
|---|
| 499 | //** sub_FF859C00_my @ 0xFF859C00 |
|---|
| 500 | |
|---|
| 501 | void __attribute__((naked,noinline)) sub_FF859C00_my( ) { |
|---|
| 502 | asm volatile ( |
|---|
| 503 | " STMFD SP!, {R4-R6,LR} \n" |
|---|
| 504 | " MOV R6, #0 \n" |
|---|
| 505 | " MOV R0, R6 \n" |
|---|
| 506 | " BL sub_FF8596C0 \n" |
|---|
| 507 | " LDR R4, =0x1A578 \n" |
|---|
| 508 | " MOV R5, #0 \n" |
|---|
| 509 | " LDR R0, [R4, #0x38] \n" |
|---|
| 510 | " BL sub_FF85A120 \n" |
|---|
| 511 | " CMP R0, #0 \n" |
|---|
| 512 | " LDREQ R0, =0x2A5C \n" |
|---|
| 513 | " STREQ R5, [R0, #0x10] \n" |
|---|
| 514 | " STREQ R5, [R0, #0x14] \n" |
|---|
| 515 | " STREQ R5, [R0, #0x18] \n" |
|---|
| 516 | " MOV R0, R6 \n" |
|---|
| 517 | " BL sub_FF859700 \n" |
|---|
| 518 | " MOV R0, R6 \n" |
|---|
| 519 | //" BL sub_FF859A3C \n" |
|---|
| 520 | " BL sub_FF859A3C_my \n" // ----------> |
|---|
| 521 | " MOV R5, R0 \n" |
|---|
| 522 | " MOV R0, R6 \n" |
|---|
| 523 | " BL sub_FF859AA8 \n" |
|---|
| 524 | " LDR R1, [R4, #0x3C] \n" |
|---|
| 525 | " AND R2, R5, R0 \n" |
|---|
| 526 | " CMP R1, #0 \n" |
|---|
| 527 | " MOV R0, #0 \n" |
|---|
| 528 | " MOVEQ R0, #0x80000001 \n" |
|---|
| 529 | " BEQ loc_FF859C94 \n" |
|---|
| 530 | " LDR R3, [R4, #0x2C] \n" |
|---|
| 531 | " CMP R3, #2 \n" |
|---|
| 532 | " MOVEQ R0, #4 \n" |
|---|
| 533 | " CMP R1, #5 \n" |
|---|
| 534 | " ORRNE R0, R0, #1 \n" |
|---|
| 535 | " BICEQ R0, R0, #1 \n" |
|---|
| 536 | " CMP R2, #0 \n" |
|---|
| 537 | " BICEQ R0, R0, #2 \n" |
|---|
| 538 | " ORREQ R0, R0, #0x80000000 \n" |
|---|
| 539 | " BICNE R0, R0, #0x80000000 \n" |
|---|
| 540 | " ORRNE R0, R0, #2 \n" |
|---|
| 541 | "loc_FF859C94:\n" |
|---|
| 542 | " STR R0, [R4, #0x40] \n" |
|---|
| 543 | " LDMFD SP!, {R4-R6,PC} \n" |
|---|
| 544 | ); |
|---|
| 545 | } |
|---|
| 546 | |
|---|
| 547 | //** sub_FF859A3C_my @ 0xFF859A3C |
|---|
| 548 | |
|---|
| 549 | void __attribute__((naked,noinline)) sub_FF859A3C_my( ) { |
|---|
| 550 | asm volatile ( |
|---|
| 551 | " STMFD SP!, {R4-R6,LR} \n" |
|---|
| 552 | " LDR R5, =0x2A5C \n" |
|---|
| 553 | " MOV R6, R0 \n" |
|---|
| 554 | " LDR R0, [R5, #0x14] \n" |
|---|
| 555 | " CMP R0, #0 \n" |
|---|
| 556 | " MOVNE R0, #1 \n" |
|---|
| 557 | " LDMNEFD SP!, {R4-R6,PC} \n" |
|---|
| 558 | " MOV R0, #0x17 \n" |
|---|
| 559 | " MUL R1, R0, R6 \n" |
|---|
| 560 | " LDR R0, =0x1A578 \n" |
|---|
| 561 | " ADD R4, R0, R1, LSL #2 \n" |
|---|
| 562 | " LDR R0, [R4, #0x38] \n" |
|---|
| 563 | " MOV R1, R6 \n" |
|---|
| 564 | //" BL sub_FF8597CC \n" |
|---|
| 565 | " BL sub_FF8597CC_my \n" // ----------> |
|---|
| 566 | " CMP R0, #0 \n" |
|---|
| 567 | " LDMEQFD SP!, {R4-R6,PC} \n" |
|---|
| 568 | " LDR R0, [R4, #0x38] \n" |
|---|
| 569 | " MOV R1, R6 \n" |
|---|
| 570 | " BL sub_FF859934 \n" |
|---|
| 571 | " CMP R0, #0 \n" |
|---|
| 572 | " LDMEQFD SP!, {R4-R6,PC} \n" |
|---|
| 573 | " MOV R0, R6 \n" |
|---|
| 574 | " BL sub_FF8592C8 \n" |
|---|
| 575 | " CMP R0, #0 \n" |
|---|
| 576 | " MOVNE R1, #1 \n" |
|---|
| 577 | " STRNE R1, [R5, #0x14] \n" |
|---|
| 578 | " LDMFD SP!, {R4-R6,PC} \n" |
|---|
| 579 | ); |
|---|
| 580 | } |
|---|
| 581 | |
|---|
| 582 | |
|---|
| 583 | //** sub_FF86F1DC_my @ 0xFF8597CC |
|---|
| 584 | |
|---|
| 585 | void __attribute__((naked,noinline)) sub_FF8597CC_my( ) { |
|---|
| 586 | asm volatile ( |
|---|
| 587 | " STMFD SP!, {R4-R8,LR} \n" |
|---|
| 588 | " MOV R8, R0 \n" |
|---|
| 589 | " MOV R0, #0x17 \n" |
|---|
| 590 | " MUL R1, R0, R1 \n" |
|---|
| 591 | " LDR R0, =0x1A578 \n" |
|---|
| 592 | " MOV R6, #0 \n" |
|---|
| 593 | " ADD R7, R0, R1, LSL #2 \n" |
|---|
| 594 | " LDR R0, [R7, #0x3C] \n" |
|---|
| 595 | " MOV R5, #0 \n" |
|---|
| 596 | " CMP R0, #6 \n" |
|---|
| 597 | " ADDLS PC, PC, R0, LSL #2 \n" |
|---|
| 598 | " B loc_FF859918 \n" |
|---|
| 599 | " B loc_FF859830 \n" |
|---|
| 600 | " B loc_FF859818 \n" |
|---|
| 601 | " B loc_FF859818 \n" |
|---|
| 602 | " B loc_FF859818 \n" |
|---|
| 603 | " B loc_FF859818 \n" |
|---|
| 604 | " B loc_FF859910 \n" |
|---|
| 605 | " B loc_FF859818 \n" |
|---|
| 606 | "loc_FF859818:\n" |
|---|
| 607 | " MOV R2, #0 \n" |
|---|
| 608 | " MOV R1, #0x200 \n" |
|---|
| 609 | " MOV R0, #2 \n" |
|---|
| 610 | " BL sub_FF872014 \n" |
|---|
| 611 | " MOVS R4, R0 \n" |
|---|
| 612 | " BNE loc_FF859838 \n" |
|---|
| 613 | "loc_FF859830:\n" |
|---|
| 614 | " MOV R0, #0 \n" |
|---|
| 615 | " LDMFD SP!, {R4-R8,PC} \n" |
|---|
| 616 | "loc_FF859838:\n" |
|---|
| 617 | " LDR R12, [R7, #0x4C] \n" |
|---|
| 618 | " MOV R3, R4 \n" |
|---|
| 619 | " MOV R2, #1 \n" |
|---|
| 620 | " MOV R1, #0 \n" |
|---|
| 621 | " MOV R0, R8 \n" |
|---|
| 622 | |
|---|
| 623 | " BLX R12 \n" |
|---|
| 624 | " CMP R0, #1 \n" |
|---|
| 625 | " BNE loc_FF859864 \n" |
|---|
| 626 | " MOV R0, #2 \n" |
|---|
| 627 | " BL sub_FF872160 \n" |
|---|
| 628 | " B loc_FF859830 \n" |
|---|
| 629 | "loc_FF859864:\n" |
|---|
| 630 | " MOV R0, R8 \n" |
|---|
| 631 | " BL sub_FF92AC04 \n" |
|---|
| 632 | |
|---|
| 633 | "MOV R1, R4\n" // pointer to MBR in R1 |
|---|
| 634 | "BL mbr_read_dryos\n" // total sectors count in R0 before and after call |
|---|
| 635 | |
|---|
| 636 | // Start of DataGhost's FAT32 autodetection code |
|---|
| 637 | // Policy: If there is a partition which has type W95 FAT32, use the first one of those for image storage |
|---|
| 638 | // According to the code below, we can use R1, R2, R3 and R12. |
|---|
| 639 | // LR wasn't really used anywhere but for storing a part of the partition signature. This is the only thing |
|---|
| 640 | // that won't work with an offset, but since we can load from LR+offset into LR, we can use this to do that :) |
|---|
| 641 | "MOV R12, R4\n" // Copy the MBR start address so we have something to work with |
|---|
| 642 | "MOV LR, R4\n" // Save old offset for MBR signature |
|---|
| 643 | "MOV R1, #1\n" // Note the current partition number |
|---|
| 644 | "B dg_sd_fat32_enter\n" // We actually need to check the first partition as well, no increments yet! |
|---|
| 645 | "dg_sd_fat32:\n" |
|---|
| 646 | "CMP R1, #4\n" // Did we already see the 4th partition? |
|---|
| 647 | "BEQ dg_sd_fat32_end\n" // Yes, break. We didn't find anything, so don't change anything. |
|---|
| 648 | "ADD R12, R12, #0x10\n" // Second partition |
|---|
| 649 | "ADD R1, R1, #1\n" // Second partition for the loop |
|---|
| 650 | "dg_sd_fat32_enter:\n" |
|---|
| 651 | "LDRB R2, [R12, #0x1BE]\n" // Partition status |
|---|
| 652 | "LDRB R3, [R12, #0x1C2]\n" // Partition type (FAT32 = 0xB) |
|---|
| 653 | "CMP R3, #0xB\n" // Is this a FAT32 partition? |
|---|
| 654 | "CMPNE R3, #0xC\n" // Not 0xB, is it 0xC (FAT32 LBA) then? |
|---|
| 655 | "BNE dg_sd_fat32\n" // No, it isn't. |
|---|
| 656 | "CMP R2, #0x00\n" // It is, check the validity of the partition type |
|---|
| 657 | "CMPNE R2, #0x80\n" |
|---|
| 658 | "BNE dg_sd_fat32\n" // Invalid, go to next partition |
|---|
| 659 | // This partition is valid, it's the first one, bingo! |
|---|
| 660 | "MOV R4, R12\n" // Move the new MBR offset for the partition detection. |
|---|
| 661 | |
|---|
| 662 | "dg_sd_fat32_end:\n" |
|---|
| 663 | // End of DataGhost's FAT32 autodetection code |
|---|
| 664 | |
|---|
| 665 | " LDRB R1, [R4, #0x1C9] \n" |
|---|
| 666 | " LDRB R3, [R4, #0x1C8] \n" |
|---|
| 667 | " LDRB R12, [R4, #0x1CC] \n" |
|---|
| 668 | " MOV R1, R1, LSL #0x18 \n" |
|---|
| 669 | " ORR R1, R1, R3, LSL #0x10 \n" |
|---|
| 670 | " LDRB R3, [R4, #0x1C7] \n" |
|---|
| 671 | " LDRB R2, [R4, #0x1BE] \n" |
|---|
| 672 | //" LDRB LR, [R4, #0x1FF] \n" // replaced, see below |
|---|
| 673 | " ORR R1, R1, R3, LSL #8 \n" |
|---|
| 674 | " LDRB R3, [R4, #0x1C6] \n" |
|---|
| 675 | " CMP R2, #0 \n" |
|---|
| 676 | " CMPNE R2, #0x80 \n" |
|---|
| 677 | " ORR R1, R1, R3 \n" |
|---|
| 678 | " LDRB R3, [R4, #0x1CD] \n" |
|---|
| 679 | " MOV R3, R3, LSL #0x18 \n" |
|---|
| 680 | " ORR R3, R3, R12, LSL #0x10 \n" |
|---|
| 681 | " LDRB R12, [R4, #0x1CB] \n" |
|---|
| 682 | " ORR R3, R3, R12, LSL #8 \n" |
|---|
| 683 | " LDRB R12, [R4, #0x1CA] \n" |
|---|
| 684 | " ORR R3, R3, R12 \n" |
|---|
| 685 | //" LDRB R12, [R4, #0x1FE] \n" // replaced, see below |
|---|
| 686 | |
|---|
| 687 | " LDRB R12, [LR,#0x1FE]\n" // New! First MBR signature byte (0x55) |
|---|
| 688 | " LDRB LR, [LR,#0x1FF]\n" // Last MBR signature byte (0xAA) |
|---|
| 689 | |
|---|
| 690 | " MOV R4, #0 \n" |
|---|
| 691 | " BNE loc_FF8598EC \n" |
|---|
| 692 | " CMP R0, R1 \n" |
|---|
| 693 | " BCC loc_FF8598EC \n" |
|---|
| 694 | " ADD R2, R1, R3 \n" |
|---|
| 695 | " CMP R2, R0 \n" |
|---|
| 696 | " CMPLS R12, #0x55 \n" |
|---|
| 697 | " CMPEQ LR, #0xAA \n" |
|---|
| 698 | " MOVEQ R6, R1 \n" |
|---|
| 699 | " MOVEQ R5, R3 \n" |
|---|
| 700 | " MOVEQ R4, #1 \n" |
|---|
| 701 | "loc_FF8598EC:\n" |
|---|
| 702 | " MOV R0, #2 \n" |
|---|
| 703 | " BL sub_FF872160 \n" |
|---|
| 704 | " CMP R4, #0 \n" |
|---|
| 705 | " BNE loc_FF859924 \n" |
|---|
| 706 | " MOV R6, #0 \n" |
|---|
| 707 | " MOV R0, R8 \n" |
|---|
| 708 | " BL sub_FF92AC04 \n" |
|---|
| 709 | " MOV R5, R0 \n" |
|---|
| 710 | " B loc_FF859924 \n" |
|---|
| 711 | "loc_FF859910:\n" |
|---|
| 712 | " MOV R5, #0x40 \n" |
|---|
| 713 | " B loc_FF859924 \n" |
|---|
| 714 | "loc_FF859918:\n" |
|---|
| 715 | " LDR R1, =0x37A \n" |
|---|
| 716 | " LDR R0, =0xFF8597C0 \n" |
|---|
| 717 | " BL sub_FF81B1CC \n" |
|---|
| 718 | "loc_FF859924:\n" |
|---|
| 719 | " STR R6, [R7, #0x44]! \n" |
|---|
| 720 | " MOV R0, #1 \n" |
|---|
| 721 | " STR R5, [R7, #4] \n" |
|---|
| 722 | " LDMFD SP!,{R4-R8,PC} \n" |
|---|
| 723 | ); |
|---|
| 724 | } |
|---|
| 725 | |
|---|
| 726 | // JogDial_task_my 0xFF84B23C |
|---|
| 727 | |
|---|
| 728 | void __attribute__((naked,noinline)) JogDial_task_my( ) { |
|---|
| 729 | asm volatile ( |
|---|
| 730 | " STMFD SP!, {R3-R11,LR} \n" |
|---|
| 731 | " BL sub_FF84B3EC \n" |
|---|
| 732 | " LDR R11, =0x80000B01 \n" |
|---|
| 733 | " LDR R8, =0xFFB0FA9C \n" //* firmware difference |
|---|
| 734 | " LDR R7, =0xC0240000 \n" |
|---|
| 735 | " LDR R6, =0x25F0 \n" |
|---|
| 736 | " MOV R9, #1 \n" |
|---|
| 737 | " MOV R10, #0 \n" |
|---|
| 738 | "loc_FF84B25C:\n" |
|---|
| 739 | " LDR R3, =0x1AE \n" |
|---|
| 740 | " LDR R0, [R6, #0xC] \n" |
|---|
| 741 | " LDR R2, =0xFF84B494 \n" |
|---|
| 742 | " MOV R1, #0 \n" |
|---|
| 743 | " BL sub_FF82862C \n" |
|---|
| 744 | " MOV R0, #0x28 \n" |
|---|
| 745 | " BL sub_FF828484 \n" |
|---|
| 746 | //------------------ added code --------------------- |
|---|
| 747 | "sleep_loop:\n" |
|---|
| 748 | "LDR R0, =jogdial_stopped\n" |
|---|
| 749 | "LDR R0, [R0]\n" |
|---|
| 750 | "CMP R0, #1\n" |
|---|
| 751 | "BNE sleep_done\n" |
|---|
| 752 | "MOV R0, #40\n" |
|---|
| 753 | "BL _SleepTask\n" |
|---|
| 754 | "B sleep_loop\n" |
|---|
| 755 | "sleep_done:\n" |
|---|
| 756 | //------------------ original code ------------------ |
|---|
| 757 | |
|---|
| 758 | " LDR R0, [R7, #0x104] \n" |
|---|
| 759 | " MOV R0, R0, ASR #0x10 \n" |
|---|
| 760 | " STRH R0, [R6] \n" |
|---|
| 761 | " LDRSH R2, [R6, #2] \n" |
|---|
| 762 | " SUB R1, R0, R2 \n" |
|---|
| 763 | " CMP R1, #0 \n" |
|---|
| 764 | " BEQ loc_FF84B320 \n" |
|---|
| 765 | " MOV R5, R1 \n" |
|---|
| 766 | " RSBLT R5, R5, #0 \n" |
|---|
| 767 | " MOVLE R4, #0 \n" |
|---|
| 768 | " MOVGT R4, #1 \n" |
|---|
| 769 | " CMP R5, #0xFF \n" |
|---|
| 770 | " BLS loc_FF84B2D4 \n" |
|---|
| 771 | " CMP R1, #0 \n" |
|---|
| 772 | " RSBLE R1, R2, #0xFF \n" |
|---|
| 773 | " ADDLE R1, R1, #0x7F00 \n" |
|---|
| 774 | " ADDLE R0, R1, R0 \n" |
|---|
| 775 | " RSBGT R0, R0, #0xFF \n" |
|---|
| 776 | " ADDGT R0, R0, #0x7F00 \n" |
|---|
| 777 | " ADDGT R0, R0, R2 \n" |
|---|
| 778 | " ADD R5, R0, #0x8000 \n" |
|---|
| 779 | " ADD R5, R5, #1 \n" |
|---|
| 780 | " EOR R4, R4, #1 \n" |
|---|
| 781 | "loc_FF84B2D4:\n" |
|---|
| 782 | " LDR R0, [R6, #0x14] \n" |
|---|
| 783 | " CMP R0, #0 \n" |
|---|
| 784 | " BEQ loc_FF84B318 \n" |
|---|
| 785 | " LDR R0, [R6, #0x1C] \n" |
|---|
| 786 | " CMP R0, #0 \n" |
|---|
| 787 | " BEQ loc_FF84B300 \n" |
|---|
| 788 | " LDR R1, [R8, R4, LSL #2] \n" |
|---|
| 789 | " CMP R1, R0 \n" |
|---|
| 790 | " BEQ loc_FF84B308 \n" |
|---|
| 791 | " LDR R0, =0xB01 \n" |
|---|
| 792 | " BL sub_FF87EC00 \n" |
|---|
| 793 | "loc_FF84B300:\n" |
|---|
| 794 | " MOV R0, R11 \n" |
|---|
| 795 | " BL sub_FF87EC00 \n" |
|---|
| 796 | "loc_FF84B308:\n" |
|---|
| 797 | " LDR R0, [R8, R4, LSL #2] \n" |
|---|
| 798 | " MOV R1, R5 \n" |
|---|
| 799 | " STR R0, [R6, #0x1C] \n" |
|---|
| 800 | " BL sub_FF87EB30 \n" |
|---|
| 801 | "loc_FF84B318:\n" |
|---|
| 802 | " LDRH R0, [R6] \n" |
|---|
| 803 | " STRH R0, [R6, #2] \n" |
|---|
| 804 | "loc_FF84B320:\n" |
|---|
| 805 | " STR R10, [R7, #0x100] \n" |
|---|
| 806 | " STR R9, [R7, #0x108] \n" |
|---|
| 807 | " LDR R0, [R6, #0x10] \n" |
|---|
| 808 | " CMP R0, #0 \n" |
|---|
| 809 | " BLNE sub_FF828484 \n" |
|---|
| 810 | " B loc_FF84B25C \n" |
|---|
| 811 | ); |
|---|
| 812 | } |
|---|
| 813 | |
|---|
| 814 | |
|---|