This source file includes following definitions.
- spytask
- CreateTask_spytask
- boot
- CreateTask_low_my
- sub_fc05c938_my
- sub_fc05cacc_my
- sub_fc05cd70_my
- sub_fc5898e8_my
- task_Startup_my
- sub_fc5897fe_my
- init_file_modules_task
- init_required_fw_features
- kbd_p1_f_cont_my
- sub_fc5895f8_my
- TricInitTask_my
- kbd_p2_f_my
- sub_fc505f5a_my
1 #include "lolevel.h"
2 #include "platform.h"
3 #include "core.h"
4
5 const char * const new_sa = &_end;
6
7
8
9 extern void task_CaptSeq();
10 extern void task_InitFileModules();
11 extern void task_RotaryEncoder();
12 extern void task_MovieRecord();
13 extern void task_ExpDrv();
14 extern void task_TricInitTask();
15
16 extern void handle_jogdial();
17
18
19
20
21 void spytask(long ua, long ub, long uc, long ud, long ue, long uf)
22 {
23 (void)ua; (void)ub; (void)uc; (void)ud; (void)ue; (void)uf;
24 core_spytask();
25 }
26
27
28
29
30 void CreateTask_spytask()
31 {
32 _CreateTask("SpyTask", 0x19, 0x2000, spytask, 0);
33 }
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 void __attribute__((naked,noinline)) boot() {
107 asm volatile (
108 " movw r0, #0x4000\n"
109 " movt r0, #0\n"
110 " mov sp, r0\n"
111 " bl sub_fc02007e\n"
112 " ldr r2, =0xc0242010\n"
113 " ldr r1, [r2]\n"
114 " orr r1, r1, #1\n"
115 " str r1, [r2]\n"
116 " ldr r0, =0xfcdcd810\n"
117 " ldr r1, =0x010e1000\n"
118 " ldr r3, =0x010fc278\n"
119 "loc_fc02002a:\n"
120 " cmp r1, r3\n"
121 " itt lo\n"
122 " ldrlo r2, [r0], #4\n"
123 " strlo r2, [r1], #4\n"
124 " blo loc_fc02002a\n"
125 " ldr r0, =0x010e1000\n"
126 " ldr r1, =0x0001b278\n"
127 " bl sub_fc0db216\n"
128 " ldr r0, =0xfcde8a88\n"
129 " ldr r1, =0xbfe10800\n"
130 " ldr r3, =0xbfe1633d\n"
131 "loc_fc020046:\n"
132 " cmp r1, r3\n"
133 " itt lo\n"
134 " ldrlo r2, [r0], #4\n"
135 " strlo r2, [r1], #4\n"
136 " blo loc_fc020046\n"
137
138
139
140 "adr r0, patch_CreateTask\n"
141 "ldr r1, =hook_CreateTask_low\n"
142 "add r2, r0, #8\n"
143 "task_hook_loop:\n"
144 "ldrh r3, [r0],#2\n"
145 "strh r3, [r1],#2\n"
146 "cmp r0,r2\n"
147 "blo task_hook_loop\n"
148 " ldr r0, =0xfcda103c\n"
149 " ldr r1, =0x00008000\n"
150 " ldr r3, =0x000347d4\n"
151 "loc_fc02005a:\n"
152 " cmp r1, r3\n"
153 " itt lo\n"
154 " ldrlo r2, [r0], #4\n"
155 " strlo r2, [r1], #4\n"
156 " blo loc_fc02005a\n"
157 " ldr r3, =0x000347d4\n"
158 " ldr r1, =0x003976c0\n"
159 " mov.w r2, #0\n"
160 "loc_fc020070:\n"
161 " cmp r3, r1\n"
162 " it lo\n"
163 " strlo r2, [r3], #4\n"
164 " blo loc_fc020070\n"
165 " b.w sub_fc05c938_my\n"
166 "patch_CreateTask:\n"
167 "ldr.w pc, [pc,#0]\n"
168 ".long CreateTask_low_my + 1\n"
169
170 );
171 }
172
173
174 void __attribute__((naked,noinline)) CreateTask_low_my() {
175 asm volatile (
176
177 " push {r1}\n"
178
179 " ldr r1, =task_CaptSeq\n"
180 " cmp r1, r0\n"
181 " itt eq\n"
182 " ldreq r0, =capt_seq_task\n"
183 " orreq r0, #1\n"
184 " beq exitHook\n"
185
186 " LDR R1, =task_TricInitTask\n"
187 " CMP R1, R0\n"
188 " itt eq\n"
189 " LDREQ R0, =TricInitTask_my\n"
190 " orreq r0, #1\n"
191 " BEQ exitHook\n"
192
193
194 " LDR R1, =task_ExpDrv\n"
195 " CMP R1, R0\n"
196 " itt eq\n"
197 " LDREQ R0, =exp_drv_task\n"
198 " orreq r0, #1\n"
199 " BEQ exitHook\n"
200
201
202
203
204
205
206
207
208
209
210
211 " ldr r1, =task_InitFileModules\n"
212 " cmp r1, r0\n"
213 " itt eq\n"
214 " ldreq r0, =init_file_modules_task\n"
215 " orreq r0, #1\n"
216 "exitHook:\n"
217
218 " pop {r1}\n"
219
220
221
222
223 " push.w {r4, r5, r6, r7, r8, lr}\n"
224 " sub sp, #0x20\n"
225 " ldrd r7, r8, [sp, #0x3c]\n"
226 " ldr.w pc, =(hook_CreateTask_low + 10 + 1) \n"
227 ".ltorg\n"
228 );
229 }
230
231
232 void __attribute__((naked,noinline)) sub_fc05c938_my() {
233
234 asm volatile (
235 " push {r4, lr}\n"
236 #if defined(CHDK_NOT_IN_CANON_HEAP)
237 " ldr r4, =0x003976c0\n"
238 #else
239 "ldr r4, =new_sa\n"
240 "ldr r4, [r4]\n"
241 #endif
242 " sub sp, #0x78\n"
243 " ldr r0, =0x006ce000\n"
244 " ldr r1, =0x000adf44\n"
245 " subs r0, r0, r4\n"
246 " cmp r0, r1\n"
247 " bhs loc_fc05c94a\n"
248 "loc_fc05c948:\n"
249 " b loc_fc05c948\n"
250 "loc_fc05c94a:\n"
251 " ldr r1, =0x00008078\n"
252 " mov.w r0, #0x80000\n"
253 " str r0, [r1]\n"
254 " ldr r1, =0x0000807c\n"
255 " ldr r0, =0x42281000\n"
256 " str r0, [r1]\n"
257 " ldr r1, =0x00008080\n"
258 " ldr r0, =0x42283000\n"
259 " str r0, [r1]\n"
260 " movs r1, #0x78\n"
261 " mov r0, sp\n"
262 " blx sub_fc301dd4\n"
263 " ldr r0, =0x0060ff00\n"
264 " ldr r1, =0x000be100\n"
265 " stm.w sp, {r0, r1, r4}\n"
266 " ldr r1, =0x00601fbc\n"
267 " subs r2, r1, r4\n"
268 " strd r2, r1, [sp, #0xc]\n"
269 " str r0, [sp, #0x14]\n"
270 " movs r0, #0x22\n"
271 " str r0, [sp, #0x18]\n"
272 " movs r0, #0xc8\n"
273 " str r0, [sp, #0x1c]\n"
274 " movw r0, #0x2b0\n"
275 " str r0, [sp, #0x20]\n"
276 " movs r0, #0xfa\n"
277 " str r0, [sp, #0x24]\n"
278 " movw r0, #0x11a\n"
279 " str r0, [sp, #0x28]\n"
280 " movs r0, #0x85\n"
281 " str r0, [sp, #0x2c]\n"
282 " movs r0, #0x40\n"
283 " str r0, [sp, #0x30]\n"
284 " movs r0, #4\n"
285 " str r0, [sp, #0x34]\n"
286 " movs r0, #0\n"
287 " str r0, [sp, #0x38]\n"
288 " movs r0, #0x10\n"
289 " str r0, [sp, #0x5c]\n"
290 " movs r2, #0\n"
291 " lsls r0, r0, #8\n"
292 " str r0, [sp, #0x60]\n"
293
294 " ldr r1, =sub_fc05cacc_my\n"
295 " asrs r0, r0, #4\n"
296 " str r0, [sp, #0x64]\n"
297 " lsls r0, r0, #5\n"
298 " str r0, [sp, #0x68]\n"
299 " mov r0, sp\n"
300 " blx sub_fc3017b4\n"
301 " add sp, #0x78\n"
302 " pop {r4, pc}\n"
303 ".ltorg\n"
304 );
305 }
306
307
308 void __attribute__((naked,noinline)) sub_fc05cacc_my() {
309 asm volatile (
310 " push {r4, lr}\n"
311 " ldr r4, =0xfc05cb74\n"
312 " bl sub_fc05d9c0\n"
313 " ldr r0, =0x00008310\n"
314 " ldr r1, [r0]\n"
315 " ldr r0, =0x00008078\n"
316 " ldr r0, [r0]\n"
317 " adds r0, #8\n"
318 " cmp r1, r0\n"
319 " bhs loc_fc05cae8\n"
320 " ldr r0, =0xfc05cb84\n"
321 " bl sub_fc05cb5e\n"
322 "loc_fc05cae8:\n"
323 " bl sub_fc074640\n"
324 " ldr r1, =0xbfe10000\n"
325
326
327 " mov.w r2, #0xeeeeeeee\n"
328 " ldr r3, =0xbfe10800\n"
329 "loc_fc05caf4:\n"
330 " stm r1!, {r2}\n"
331 " cmp r1, r3\n"
332 " blo loc_fc05caf4\n"
333 " bl sub_fc074652\n"
334 " bl sub_fc3a8c40\n"
335 " cmp r0, #0\n"
336 " bge loc_fc05cb0c\n"
337 " ldr r0, =0xfc05cba4\n"
338 " bl sub_fc05cb5e\n"
339 "loc_fc05cb0c:\n"
340 " bl sub_fc05e23c\n"
341 " cmp r0, #0\n"
342 " bge loc_fc05cb1a\n"
343 " ldr r0, =0xfc05cbac\n"
344 " bl sub_fc05cb5e\n"
345 "loc_fc05cb1a:\n"
346 " mov r0, r4\n"
347 " bl sub_fc05e2ca\n"
348 " cmp r0, #0\n"
349 " bge loc_fc05cb2a\n"
350 " ldr r0, =0xfc05cbbc\n"
351 " bl sub_fc05cb5e\n"
352 "loc_fc05cb2a:\n"
353 " mov r0, r4\n"
354 " bl sub_fc05cdcc\n"
355 " cmp r0, #0\n"
356 " bge loc_fc05cb3a\n"
357 " ldr r0, =0xfc05cbd0\n"
358 " bl sub_fc05cb5e\n"
359 "loc_fc05cb3a:\n"
360 " bl sub_fc05cf10\n"
361 " cmp r0, #0\n"
362 " bge loc_fc05cb48\n"
363 " ldr r0, =0xfc05cbdc\n"
364 " bl sub_fc05cb5e\n"
365 "loc_fc05cb48:\n"
366 " bl sub_fc061684\n"
367 " cmp r0, #0\n"
368 " bge loc_fc05cb56\n"
369 " ldr r0, =0xfc05cbe8\n"
370 " bl sub_fc05cb5e\n"
371 "loc_fc05cb56:\n"
372 " pop.w {r4, lr}\n"
373
374 " b.w sub_fc05cd70_my\n"
375 ".ltorg\n"
376 );
377 }
378
379
380 void __attribute__((naked,noinline)) sub_fc05cd70_my() {
381 asm volatile (
382 " push {r3, lr}\n"
383 " bl sub_fc05d018\n"
384 " bl sub_fc05cf34\n"
385 " bl sub_fc0648f0\n"
386 " bl sub_fc5898e8_my\n"
387 " cbnz r0, loc_fc05cd8a\n"
388 " bl sub_fc05d006\n"
389 "loc_fc05cd88:\n"
390 " b loc_fc05cd88\n"
391 "loc_fc05cd8a:\n"
392 " bl sub_fc3690fe\n"
393 " ldr r1, =0x006ce000\n"
394 " movs r0, #0\n"
395 " bl sub_fc3519c0\n"
396 " movs r3, #0\n"
397 " str r3, [sp]\n"
398
399 " ldr r3, =task_Startup_my\n"
400 " movs r2, #0\n"
401 " movs r1, #0x19\n"
402 " ldr r0, =0xfc05cdc4\n"
403 " bl _CreateTask\n"
404 " movs r0, #0\n"
405 " pop {r3, pc}\n"
406 ".ltorg\n"
407 );
408 }
409
410
411 void __attribute__((naked,noinline)) sub_fc5898e8_my() {
412 asm volatile (
413 " push.w {r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, lr}\n"
414 " movs r4, #0\n"
415 " mov fp, r0\n"
416 " mov r5, r4\n"
417
418 " movs r0, #0x97\n"
419 " bl sub_fc50664a\n"
420 " movs r6, #1\n"
421 " bic.w sb, r6, r0\n"
422 " movs r0, #0x8a\n"
423 " bl sub_fc50664a\n"
424 " bic.w r8, r6, r0\n"
425 " movs r0, #0\n"
426 " bl sub_fc505e54\n"
427 " cbz r0, loc_fc58991e\n"
428 " movs r0, #0x98\n"
429 " bl sub_fc50664a\n"
430 " bic.w r4, r6, r0\n"
431 "loc_fc58991e:\n"
432 " movw r0, #0x10e\n"
433 " bl sub_fc50664a\n"
434 " bic.w r7, r6, r0\n"
435 " movs r0, #1\n"
436 " bl sub_fc505e54\n"
437 " cbz r0, loc_fc58993c\n"
438 " movs r0, #2\n"
439 " bl sub_fc50664a\n"
440 " bic.w r5, r6, r0\n"
441 "loc_fc58993c:\n"
442 " movw r0, #0x186\n"
443 " bl sub_fc50664a\n"
444 " mov sl, r6\n"
445 " bics r6, r0\n"
446 " cmp.w fp, #0\n"
447 " beq loc_fc589972\n"
448 " cbz r4, loc_fc589962\n"
449 " movw r0, #0x12c\n"
450 " bl _SleepTask\n"
451 " movs r0, #0x98\n"
452 " bl sub_fc50664a\n"
453 " bic.w r4, sl, r0\n"
454 "loc_fc589962:\n"
455 " orr.w r0, sb, r8\n"
456 " orr.w r1, r4, r7\n"
457 " orrs r0, r1\n"
458 " orrs r0, r5\n"
459 " orrs r0, r6\n"
460
461 " bne loc_fc589972\n"
462 "mov r8, #1\n"
463 "loc_fc589972:\n"
464 " strd r5, r6, [sp]\n"
465 " mov r3, r7\n"
466 " mov r2, r4\n"
467 " mov r1, r8\n"
468 " mov r0, sb\n"
469 " bl sub_fc505e5c\n"
470
471 " movs r0, #1\n"
472 "loc_fc589988:\n"
473 " pop.w {r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, pc}\n"
474 ".ltorg\n"
475 );
476 }
477
478
479 void __attribute__((naked,noinline)) task_Startup_my() {
480 asm volatile (
481
482 " push {r4, lr}\n"
483 " bl sub_fc0dc340\n"
484 " ldr r0, =0x41121000\n"
485 " mov.w r1, #0x20000\n"
486 " bl sub_fc3a8768\n"
487 " cbz r0, loc_fc05cd10\n"
488 " movs r2, #0x95\n"
489 " movs r0, #0\n"
490 " ldr r1, =0xfc05cdb0\n"
491 " bl _DebugAssert\n"
492 "loc_fc05cd10:\n"
493 " bl sub_fc05cfe0\n"
494
495 " bl sub_fc081478\n"
496
497 " bl sub_010e19de\n"
498
499 " bl sub_fc3a8896\n"
500 " bl sub_fc074688\n"
501 " bl sub_fc05d134\n"
502 " bl sub_fc05d0c8\n"
503 " bl sub_fc0814ae\n"
504 " bl sub_fc3a87f0\n"
505 " bl sub_fc07468e\n"
506
507 " bl sub_fc5897fe_my\n"
508 " bl CreateTask_spytask\n"
509 " bl init_required_fw_features\n"
510 " bl sub_fc27ec1c\n"
511 " bl sub_fc0746a4\n"
512 " bl sub_fc093948\n"
513 " bl sub_fc0dbeb2\n"
514 " bl sub_fc093a78\n"
515 " bl sub_fc0dc260\n"
516 " bl sub_fc0dbe6e\n"
517
518 " bl sub_fc32d31e\n"
519 " bl sub_fc0dbe40\n"
520 " pop.w {r4, lr}\n"
521
522 " ldr pc,=0xfc0dc317\n"
523 ".ltorg\n"
524 );
525 }
526
527
528 void __attribute__((naked,noinline)) sub_fc5897fe_my() {
529 asm volatile (
530 " push {r2, r3, r4, lr}\n"
531 " bl sub_fc0fd784\n"
532 " bl sub_fc06486e\n"
533 " cbnz r0, loc_fc58980e\n"
534 " bl sub_fc0fd728\n"
535 "loc_fc58980e:\n"
536 " ldr r4, =0x00008190\n"
537 " ldr r0, [r4, #4]\n"
538 " cmp r0, #0\n"
539 " bne loc_fc58982e\n"
540 " movs r3, #1\n"
541 " movs r2, #0\n"
542 " movs r1, #0x13\n"
543 " strd r2, r3, [sp]\n"
544
545 " ldr r3, =mykbd_task\n"
546 " ldr r0, =0xfc589b9c\n"
547
548 " movw r2, #0x2000\n"
549 " bl sub_fc34b99a\n"
550 " str r0, [r4, #4]\n"
551 "loc_fc58982e:\n"
552
553 " pop {r2, r3, r4, pc}\n"
554 ".ltorg\n"
555 );
556 }
557
558
559 void __attribute__((naked,noinline)) init_file_modules_task() {
560 asm volatile (
561
562 " push {r4, r5, r6, lr}\n"
563 " movs r0, #6\n"
564
565 " bl sub_fc099270\n"
566 " movs r4, r0\n"
567 " movw r5, #0x5006\n"
568 " beq loc_fc0972c0\n"
569 " movs r1, #0\n"
570 " mov r0, r5\n"
571 " bl _PostLogicalEventToUI\n"
572 "loc_fc0972c0:\n"
573 " bl sub_fc09929a\n"
574 " BL core_spytask_can_start\n"
575 " cmp r4, #0\n"
576 " bne loc_fc0972d4\n"
577 " mov r0, r5\n"
578 " pop.w {r4, r5, r6, lr}\n"
579 " movs r1, #1\n"
580 " b.w _PostLogicalEventToUI\n"
581 "loc_fc0972d4:\n"
582 " pop {r4, r5, r6, pc}\n"
583 ".ltorg\n"
584 );
585 }
586
587
588
589
590
591
592
593 void init_required_fw_features(void) {
594 extern void _init_focus_eventflag();
595
596 _init_focus_eventflag();
597 extern int av_override_semaphore;
598 extern int _CreateBinarySemaphoreStrictly(int x, int y);
599 av_override_semaphore = _CreateBinarySemaphoreStrictly(0,0);
600 }
601
602 void __attribute__((naked,noinline)) kbd_p1_f_cont_my ()
603 {
604
605 asm volatile(
606
607 " ldr r3, =0x0003578c\n"
608 " movs r0, #2\n"
609 " mov r5, sp\n"
610 " add.w r6, r3, #0x24\n"
611 "loc_fc589b30:\n"
612 " add.w r1, r6, r0, lsl #2\n"
613 " ldr.w r2, [r3, r0, lsl #2]\n"
614 " ldr r7, [r1, #0xc]\n"
615 " ldr r1, [r1, #0x18]\n"
616 " and.w r2, r2, r7\n"
617 " eor.w r2, r2, r1\n"
618 " str.w r2, [r5, r0, lsl #2]\n"
619 " subs r0, r0, #1\n"
620 " bpl loc_fc589b30\n"
621 " ldr r2, =0x0003578c\n"
622 " mov r0, sp\n"
623 " adds r2, #0x18\n"
624 " sub.w r1, r2, #0xc\n"
625
626 " bl sub_fc5895f8_my\n"
627 " ldr pc, =0xfc589b5b\n"
628 ".ltorg\n"
629 );
630 }
631
632 extern int physw_override;
633
634 void __attribute__((naked,noinline)) sub_fc5895f8_my()
635 {
636 asm volatile(
637 " push.w {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, lr}\n"
638 " ldr r4, =0x000357b0\n"
639 " mov r5, r0\n"
640 " ldr r0, =physw_override\n"
641 " ldr.w r0, [r0]\n"
642
643 " ldr pc, =0xfc589605\n"
644 );
645 }
646
647
648
649 void __attribute__((naked,noinline)) TricInitTask_my()
650 {
651 asm volatile(
652
653 " push.w {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, lr}\n"
654 " movs r0, #8\n"
655 " ldr r1, =0xfc521b2c\n"
656 " bl sub_fc350dca\n"
657 " ldr.w sl, =0x0001c440\n"
658 " movw fp, #0x1000\n"
659 " ldr r4, =0x0001c43c\n"
660 " movs r2, #0\n"
661 " ldr r1, =0x0703870f\n"
662 " ldr r0, [r4]\n"
663 " bl sub_fc369998\n"
664 " lsls r0, r0, #0x1f\n"
665 " beq loc_fc521936\n"
666 " movs r0, #8\n"
667 " ldr r1, =0xfc521b44\n"
668 " bl sub_fc350e2a\n"
669 " ldr r1, =0x0001c428\n"
670 " movs r0, #0\n"
671 " str r0, [r1]\n"
672 " pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, pc}\n"
673 "loc_fc521936:\n"
674 " ldr r4, =0x0001c43c\n"
675 " add r1, sp, #0xc\n"
676 " ldr r0, [r4]\n"
677 " bl sub_fc369bf2\n"
678 " ldr r1, [sp, #0xc]\n"
679 " ldr r0, [r4]\n"
680 " bl sub_fc369bc2\n"
681 " ldr r0, =0x02000003\n"
682 " ldr r7, [sp, #0xc]\n"
683 " tst r7, r0\n"
684 " beq sub_fc521a3a\n"
685 " lsls r0, r7, #0x1f\n"
686 " beq sub_fc52195a\n"
687
688 " ldr r0, =0xd2020074\n"
689 " ldr r0, [r0]\n"
690 " subs r0, #0\n"
691 " beq tric1\n"
692 " ldr r0, [r4]\n"
693 " mov r1, #0x80\n"
694 " bl _SetEventFlag\n"
695 "tric1:\n"
696
697 " bl sub_fc521dde\n"
698
699 " ldr pc,=0xfc5219c7\n"
700 ".ltorg\n"
701 );
702 }
703 #ifdef CAM_HAS_JOGDIAL
704
705 void __attribute__((naked,noinline)) kbd_p2_f_my() {
706 asm volatile(
707
708 "loc_fc589534:\n"
709 " push.w {r4, r5, r6, r7, r8, lr}\n"
710 " ldr r6, =0x000357b0\n"
711 " sub sp, #0x18\n"
712 " add r7, sp, #8\n"
713 " subs r6, #0xc\n"
714 " b loc_fc589576\n"
715 "loc_fc589542:\n"
716 " ldr r1, =0x000357b0\n"
717 " add r3, sp, #8\n"
718 " ldrb.w r0, [sp, #4]\n"
719 " add r2, sp, #0x14\n"
720 " subs r1, #0x18\n"
721 " bl sub_fc50647c\n"
722 " cbnz r0, loc_fc58955c\n"
723 " ldr r1, [sp, #0x14]\n"
724 " movs r0, #0\n"
725 " bl sub_fc5894a6\n"
726 "loc_fc58955c:\n"
727 " movs r0, #2\n"
728 "loc_fc58955e:\n"
729 " ldr.w r1, [r7, r0, lsl #2]\n"
730 " cbz r1, loc_fc58956e\n"
731 " ldr.w r2, [r6, r0, lsl #2]\n"
732 " bics r2, r1\n"
733 " str.w r2, [r6, r0, lsl #2]\n"
734 "loc_fc58956e:\n"
735 " subs r0, r0, #1\n"
736 " sxtb r0, r0\n"
737 " cmp r0, #0\n"
738 " bge loc_fc58955e\n"
739 "loc_fc589576:\n"
740 " ldr r0, =0x000357b0\n"
741 " add r1, sp, #4\n"
742 " subs r0, #0xc\n"
743 " bl sub_fc5061aa\n"
744 " cmp r0, #0\n"
745 " bne loc_fc589542\n"
746 " ldr.w r8, =0x000357b0\n"
747 " movs r4, #0\n"
748 "loc_fc58958a:\n"
749 " movs r5, #0\n"
750 " ldr.w r0, [r6, r4, lsl #2]\n"
751 " ldr.w r1, [r8, r4, lsl #2]\n"
752 " ands r0, r1\n"
753 " str.w r0, [r6, r4, lsl #2]\n"
754 " b loc_fc5895e2\n"
755 "loc_fc58959c:\n"
756 " lsrs r0, r5\n"
757 " lsls r0, r0, #0x1f\n"
758 " beq loc_fc5895da\n"
759 " ldr r1, =0x000357b0\n"
760 " add.w r0, r5, r4, lsl #5\n"
761 " add r3, sp, #8\n"
762 " subs r1, #0x18\n"
763 " add r2, sp, #0x14\n"
764 " uxtb r0, r0\n"
765 " bl sub_fc50647c\n"
766 " cbnz r0, loc_fc5895be\n"
767 " ldr r1, [sp, #0x14]\n"
768 " movs r0, #1\n"
769 " bl sub_fc5894a6\n"
770 "loc_fc5895be:\n"
771 " mov r0, r4\n"
772 " b loc_fc5895d6\n"
773 "loc_fc5895c2:\n"
774 " ldr.w r1, [r7, r0, lsl #2]\n"
775 " cbz r1, loc_fc5895d2\n"
776 " ldr.w r2, [r6, r0, lsl #2]\n"
777 " bics r2, r1\n"
778 " str.w r2, [r6, r0, lsl #2]\n"
779 "loc_fc5895d2:\n"
780 " adds r0, r0, #1\n"
781 " sxtb r0, r0\n"
782 "loc_fc5895d6:\n"
783 " cmp r0, #3\n"
784 " blt loc_fc5895c2\n"
785 "loc_fc5895da:\n"
786 " ldr.w r0, [r6, r4, lsl #2]\n"
787 " adds r5, r5, #1\n"
788 " uxtb r5, r5\n"
789 "loc_fc5895e2:\n"
790 " cmp r0, #0\n"
791 " bne loc_fc58959c\n"
792 " adds r4, r4, #1\n"
793 " sxtb r4, r4\n"
794 " cmp r4, #3\n"
795 " blt loc_fc58958a\n"
796
797 " bl sub_fc505f5a_my\n"
798 " add sp, #0x18\n"
799 " pop.w {r4, r5, r6, r7, r8, pc}\n"
800 ".ltorg\n"
801 );
802 }
803
804 void __attribute__((naked,noinline)) sub_fc505f5a_my() {
805 asm volatile(
806 " push {r4, lr}\n"
807 " ldr r4, =0x00009ad8\n"
808 " ldr r0, [r4, #8]\n"
809 " bl sub_fc50a8dc\n"
810 " bl sub_fc3d4578\n"
811 " ldr r0, [r4, #0xc]\n"
812 " bl sub_fc50a80c\n"
813 " bl handle_jogdial\n"
814 " cmp r0, #0\n"
815 " beq no_scroll\n"
816 " bl sub_fc50adb4\n"
817
818 "no_scroll:\n"
819 " pop {r4, pc}\n"
820
821 ".ltorg\n"
822 );
823 }
824 #endif