This source file includes following definitions.
- spytask
- CreateTask_spytask
- boot
- CreateTask_my
- sub_fc055894_my
- sub_fc055a24_my
- sub_fc055e2e_my
- sub_fc0cf0ee_my
- task_Startup_my
- sub_fc0cf014_my
- init_file_modules_task
- init_required_fw_features
- TricInitTask_my
- kbd_p2_f_my
- sub_fc086af2_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, =0xfcd4742c\n"
117 " ldr r1, =0x010e1000\n"
118 " ldr r3, =0x01107bd0\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, =0x00026bd0\n"
127 " bl sub_fc11f606\n"
128 " ldr r0, =0xfcd6dffc\n"
129 " ldr r1, =0xbfe10800\n"
130 " ldr r3, =0xbfe17419\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 "adr r0, patch_CreateTask\n"
140 "ldr r1, =hook_CreateTask\n"
141 "add r2, r0, #8\n"
142 "task_hook_loop:\n"
143 "ldrh r3, [r0],#2\n"
144 "strh r3, [r1],#2\n"
145 "cmp r0,r2\n"
146 "blo task_hook_loop\n"
147 " ldr r0, =0xfcd1e5d4\n"
148 " ldr r1, =0x00008000\n"
149 " ldr r3, =0x00030e58\n"
150 "loc_fc02005a:\n"
151 " cmp r1, r3\n"
152 " itt lo\n"
153 " ldrlo r2, [r0], #4\n"
154 " strlo r2, [r1], #4\n"
155 " blo loc_fc02005a\n"
156 " ldr r3, =0x00030e58\n"
157 " ldr r1, =0x003c3998\n"
158 " mov.w r2, #0\n"
159 "loc_fc020070:\n"
160 " cmp r3, r1\n"
161 " it lo\n"
162 " strlo r2, [r3], #4\n"
163 " blo loc_fc020070\n"
164 " b.w sub_fc055894_my\n"
165
166 "patch_CreateTask:\n"
167 "ldr.w pc, [pc,#0]\n"
168 ".long CreateTask_my + 1\n"
169 );
170 }
171
172
173 void __attribute__((naked,noinline)) CreateTask_my() {
174 asm volatile (
175 " push {r0}\n"
176
177 " ldr r0, =task_CaptSeq\n"
178 " cmp r0, r3\n"
179 " itt eq\n"
180 " ldreq r3, =capt_seq_task\n"
181 " orreq r3, #1\n"
182 " beq exitHook\n"
183
184
185 " LDR R0, =task_ExpDrv\n"
186 " CMP R0, R3\n"
187 " itt eq\n"
188 " LDREQ R3, =exp_drv_task\n"
189 " orreq r3, #1\n"
190 " BEQ exitHook\n"
191
192
193
194
195
196
197
198
199
200
201
202 " ldr r0, =task_FileWrite\n"
203 " cmp r0, r3\n"
204 " itt eq\n"
205 " ldreq r3, =filewritetask\n"
206 " orreq r3, #1\n"
207 " beq exitHook\n"
208
209
210
211
212
213
214
215
216
217 " ldr r0, =task_TricInitTask\n"
218 " cmp r0, r3\n"
219 " itt eq\n"
220 " ldreq r3, =TricInitTask_my\n"
221 " orreq r3, #1\n"
222 " beq exitHook\n"
223
224 " ldr r0, =task_InitFileModules\n"
225 " cmp r0, r3\n"
226 " itt eq\n"
227 " ldreq r3, =init_file_modules_task\n"
228 " orreq r3, #1\n"
229 "exitHook:\n"
230
231 " pop {r0}\n"
232
233
234
235 " stmdb sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, lr}\n"
236 " mov r4, r0\n"
237 " ldr r0, =0x8160\n"
238 " ldr.w pc, =(hook_CreateTask + 8 + 1) \n"
239 ".ltorg\n"
240 );
241 }
242
243
244 void __attribute__((naked,noinline)) sub_fc055894_my() {
245
246 asm volatile (
247 " push {r4, lr}\n"
248 #if defined(CHDK_NOT_IN_CANON_HEAP)
249 " ldr r4, =0x003c3998\n"
250 #else
251 "ldr r4, =new_sa\n"
252 "ldr r4, [r4]\n"
253 #endif
254 " sub sp, #0x78\n"
255 " ldr r0, =0x006ce000\n"
256 " ldr r1, =0x000b1fec\n"
257 " subs r0, r0, r4\n"
258 " cmp r0, r1\n"
259 " bhs loc_fc0558a6\n"
260 "loc_fc0558a4:\n"
261 " b loc_fc0558a4\n"
262 "loc_fc0558a6:\n"
263 " ldr r1, =0x00008074\n"
264 " mov.w r0, #0x80000\n"
265 " str r0, [r1]\n"
266 " ldr r1, =0x00008078\n"
267 " ldr r0, =0x421bcb00\n"
268 " str r0, [r1]\n"
269 " ldr r1, =0x0000807c\n"
270 " ldr r0, =0x421beb00\n"
271 " str r0, [r1]\n"
272 " movs r1, #0x78\n"
273 " mov r0, sp\n"
274 " blx sub_fc2c7da0\n"
275 " ldr r0, =0x0060e000\n"
276 " mov.w r1, #0xc0000\n"
277 " stm.w sp, {r0, r1, r4}\n"
278 " ldr r1, =0x00600014\n"
279 " subs r2, r1, r4\n"
280 " strd r2, r1, [sp, #0xc]\n"
281 " str r0, [sp, #0x14]\n"
282 " movs r0, #0x22\n"
283 " str r0, [sp, #0x18]\n"
284 " movs r0, #0xca\n"
285 " str r0, [sp, #0x1c]\n"
286 " movw r0, #0x2b0\n"
287 " str r0, [sp, #0x20]\n"
288 " movs r0, #0xfa\n"
289 " str r0, [sp, #0x24]\n"
290 " movw r0, #0x11a\n"
291 " str r0, [sp, #0x28]\n"
292 " movs r0, #0x85\n"
293 " str r0, [sp, #0x2c]\n"
294 " movs r0, #0x40\n"
295 " str r0, [sp, #0x30]\n"
296 " movs r0, #4\n"
297 " str r0, [sp, #0x34]\n"
298 " movs r0, #0\n"
299 " str r0, [sp, #0x38]\n"
300 " movs r0, #0x10\n"
301 " str r0, [sp, #0x5c]\n"
302 " movs r2, #0\n"
303 " lsls r0, r0, #8\n"
304 " str r0, [sp, #0x60]\n"
305
306 " ldr r1, =sub_fc055a24_my\n"
307 " asrs r0, r0, #4\n"
308 " str r0, [sp, #0x64]\n"
309 " lsls r0, r0, #5\n"
310 " str r0, [sp, #0x68]\n"
311 " mov r0, sp\n"
312 " blx sub_fc2c7564\n"
313 " add sp, #0x78\n"
314 " pop {r4, pc}\n"
315 ".ltorg\n"
316 );
317 }
318
319
320 void __attribute__((naked,noinline)) sub_fc055a24_my() {
321 asm volatile (
322 " push {r4, lr}\n"
323 " ldr r4, =0xfc055acc\n"
324 " bl sub_fc056cc8\n"
325 " ldr r0, =0x000080ec\n"
326 " ldr r1, [r0]\n"
327 " ldr r0, =0x00008074\n"
328 " ldr r0, [r0]\n"
329 " adds r0, #0x10\n"
330 " cmp r1, r0\n"
331 " bhs loc_fc055a40\n"
332 " ldr r0, =0xfc055adc\n"
333 " bl sub_fc055ab6\n"
334 "loc_fc055a40:\n"
335 " bl sub_fc11f6e0\n"
336 " ldr r1, =0xbfe10000\n"
337
338
339 " mov.w r2, #0xeeeeeeee\n"
340 " ldr r3, =0xbfe10800\n"
341 "loc_fc055a4c:\n"
342 " stm r1!, {r2}\n"
343 " cmp r1, r3\n"
344 " blo loc_fc055a4c\n"
345 " bl sub_fc11f6f2\n"
346 " bl sub_fc38d1c4\n"
347 " cmp r0, #0\n"
348 " bge loc_fc055a64\n"
349 " ldr r0, =0xfc055afc\n"
350 " bl sub_fc055ab6\n"
351 "loc_fc055a64:\n"
352 " bl sub_fc056268\n"
353 " cmp r0, #0\n"
354 " bge loc_fc055a72\n"
355 " ldr r0, =0xfc055b04\n"
356 " bl sub_fc055ab6\n"
357 "loc_fc055a72:\n"
358 " mov r0, r4\n"
359 " bl sub_fc0562f6\n"
360 " cmp r0, #0\n"
361 " bge loc_fc055a82\n"
362 " ldr r0, =0xfc055b14\n"
363 " bl sub_fc055ab6\n"
364 "loc_fc055a82:\n"
365 " mov r0, r4\n"
366 " bl sub_fc055c60\n"
367 " cmp r0, #0\n"
368 " bge loc_fc055a92\n"
369 " ldr r0, =0xfc055b28\n"
370 " bl sub_fc055ab6\n"
371 "loc_fc055a92:\n"
372 " bl sub_fc055da4\n"
373 " cmp r0, #0\n"
374 " bge loc_fc055aa0\n"
375 " ldr r0, =0xfc055b34\n"
376 " bl sub_fc055ab6\n"
377 "loc_fc055aa0:\n"
378 " bl sub_fc058e3c\n"
379 " cmp r0, #0\n"
380 " bge loc_fc055aae\n"
381 " ldr r0, =0xfc055b40\n"
382 " bl sub_fc055ab6\n"
383 "loc_fc055aae:\n"
384 " pop.w {r4, lr}\n"
385
386 " b.w sub_fc055e2e_my\n"
387 ".ltorg\n"
388 );
389 }
390
391
392 void __attribute__((naked,noinline)) sub_fc055e2e_my() {
393 asm volatile (
394 " push {r3, lr}\n"
395 " bl sub_fc055f34\n"
396 " bl sub_fc078bfc\n"
397 " bl sub_fc0cf0ee_my\n"
398 " cbnz r0, loc_fc055e44\n"
399 " bl sub_fc055f22\n"
400 "loc_fc055e42:\n"
401 " b loc_fc055e42\n"
402 "loc_fc055e44:\n"
403 " blx sub_fc2c75bc\n"
404 " ldr r1, =0x006ce000\n"
405 " movs r0, #0\n"
406 " bl sub_fc329108\n"
407 " movs r3, #0\n"
408 " str r3, [sp]\n"
409
410 " ldr r3, =task_Startup_my\n"
411 " movs r2, #0\n"
412 " movs r1, #0x19\n"
413 " ldr r0, =0xfc055e6c\n"
414 " bl _CreateTask\n"
415
416 " movs r0, #0\n"
417 " pop {r3, pc}\n"
418 ".ltorg\n"
419 );
420 }
421
422 void __attribute__((naked,noinline)) sub_fc0cf0ee_my() {
423 asm volatile (
424 " push.w {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}\n"
425 " movs r4, #0\n"
426 " mov sl, r0\n"
427 " mov r5, r4\n"
428 " mov sb, r4\n"
429
430 " movs r0, #0x10\n"
431 " bl sub_fc0847ea\n"
432 " movs r6, #1\n"
433 " bic.w r8, r6, r0\n"
434 " movs r0, #0xf\n"
435 " bl sub_fc0847ea\n"
436 " bic.w r7, r6, r0\n"
437 " movs r0, #0\n"
438 " bl sub_fc0869fc\n"
439 " cbz r0, loc_fc0cf126\n"
440 " movs r0, #0x17\n"
441 " bl sub_fc0847ea\n"
442 " bic.w r5, r6, r0\n"
443 "loc_fc0cf126:\n"
444 " movs r0, #1\n"
445 " bl sub_fc0869fc\n"
446 " cbz r0, loc_fc0cf13a\n"
447 " movw r0, #0x1d8\n"
448 " bl sub_fc0847ea\n"
449 " bic.w r4, r6, r0\n"
450 "loc_fc0cf13a:\n"
451 " cmp.w sl, #0\n"
452 " beq loc_fc0cf14a\n"
453 " orr.w r0, r8, r7\n"
454 " orrs r0, r5\n"
455 " orrs r0, r4\n"
456
457 " bne loc_fc0cf14a\n"
458
459 "mov r7, #1\n"
460 "loc_fc0cf14a:\n"
461 " mov r3, sb\n"
462 " mov r2, r5\n"
463 " mov r1, r7\n"
464 " mov r0, r8\n"
465 " str r4, [sp]\n"
466 " bl sub_fc086a04\n"
467
468 " movs r0, #1\n"
469
470 " pop.w {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}\n"
471 ".ltorg\n"
472 );
473 }
474
475
476 void __attribute__((naked,noinline)) task_Startup_my() {
477 asm volatile (
478 " push {r4, lr}\n"
479 " bl sub_fc0cf4d8\n"
480 " bl sub_fc055f00\n"
481
482 " bl sub_fc38d978\n"
483
484 "bl sub_010e173f\n"
485
486
487 " bl sub_fc0b337a\n"
488 " bl sub_fc0cf7dc\n"
489 " bl sub_fc0561a8\n"
490 " bl sub_fc055ff0\n"
491 " bl sub_fc38d9b6\n"
492 " bl sub_fc0917c4\n"
493 " bl sub_fc0cf7e2\n"
494 " bl sub_fc0cf014_my\n"
495 " bl CreateTask_spytask\n"
496 " bl init_required_fw_features\n"
497 " bl sub_fc26731c\n"
498 " bl sub_fc0cf7f8\n"
499 " bl sub_fc11fac8\n"
500 " bl sub_fc0b2fb0\n"
501 " bl sub_fc0cf636\n"
502 " bl sub_fc0b332a\n"
503 " bl sub_fc0b2f6c\n"
504 " bl sub_fc0561ac\n"
505 " bl sub_fc2d3378\n"
506 " bl sub_fc0b2f40\n"
507 " pop.w {r4, lr}\n"
508
509 " ldr pc,=0xfc0cf4af\n"
510 ".ltorg\n"
511 );
512 }
513
514
515
516 void __attribute__((naked,noinline)) sub_fc0cf014_my() {
517 asm volatile (
518 " push {r3, r4, r5, lr}\n"
519 " bl sub_fc087d58\n"
520 " bl sub_fc078b7a\n"
521 " cbnz r0, loc_fc0cf024\n"
522 " bl sub_fc087cfc\n"
523 "loc_fc0cf024:\n"
524 " ldr r4, =0x000082c8\n"
525 " ldr r0, [r4, #4]\n"
526 " cmp r0, #0\n"
527 " bne loc_fc0cf040\n"
528 " movs r3, #0\n"
529 " str r3, [sp]\n"
530
531 " ldr r3, =mykbd_task\n"
532 " movs r1, #0x17\n"
533 " ldr r0, =0xfc0cf36c\n"
534
535 " movw r2, #0x2000\n"
536 " blx sub_fc2c7cc8\n"
537 " str r0, [r4, #4]\n"
538 "loc_fc0cf040:\n"
539 " pop {r3, r4, r5, pc}\n"
540 ".ltorg\n"
541 );
542 }
543
544
545 void __attribute__((naked,noinline)) init_file_modules_task() {
546 asm volatile (
547
548 " push {r4, r5, r6, lr}\n"
549 " bl sub_fc0d985c\n"
550 " movs r4, r0\n"
551 " movw r5, #0x5006\n"
552 " beq loc_fc0d431e\n"
553 " movs r1, #0\n"
554 " mov r0, r5\n"
555 " bl _PostLogicalEventToUI\n"
556 "loc_fc0d431e:\n"
557 " bl sub_fc0d9886\n"
558 " BL core_spytask_can_start\n"
559 " cmp r4, #0\n"
560 " bne loc_fc0d4332\n"
561 " mov r0, r5\n"
562 " pop.w {r4, r5, r6, lr}\n"
563 " movs r1, #0\n"
564 " b.w _PostLogicalEventToUI\n"
565 "loc_fc0d4332:\n"
566 " pop {r4, r5, r6, pc}\n"
567 ".ltorg\n"
568 );
569 }
570
571
572
573
574
575
576 void init_required_fw_features(void) {
577 extern void _init_focus_eventflag();
578
579 _init_focus_eventflag();
580
581 extern int av_override_semaphore;
582 extern int _CreateBinarySemaphoreStrictly(int x, int y);
583 av_override_semaphore = _CreateBinarySemaphoreStrictly(0,0);
584 }
585
586
587
588 void __attribute__((naked,noinline)) TricInitTask_my()
589 {
590 asm volatile(
591
592 " push.w {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, lr}\n"
593 " blx sub_fc2c7d38\n"
594 " movs r0, #8\n"
595 " ldr r1, =0xfc4419d8\n"
596 " bl sub_fc315ece\n"
597 " ldr.w sl, =0x00020bb0\n"
598 " movw fp, #0x1000\n"
599 " ldr r4, =0x00020bac\n"
600 " movs r2, #0\n"
601 " ldr r1, =0x0703870f\n"
602 " ldr r0, [r4]\n"
603 " blx sub_fc2c7dd8\n"
604 " lsls r0, r0, #0x1f\n"
605 " beq loc_fc4417e2\n"
606 " movs r0, #8\n"
607 " ldr r1, =0xfc4419f0\n"
608 " bl sub_fc315f2e\n"
609 " ldr r1, =0x00020b98\n"
610 " movs r0, #0\n"
611 " str r0, [r1]\n"
612 " pop.w {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, pc}\n"
613 "loc_fc4417e2:\n"
614 " ldr r4, =0x00020bac\n"
615 " add r1, sp, #0xc\n"
616 " ldr r0, [r4]\n"
617 " blx sub_fc2c7ba8\n"
618 " ldr r1, [sp, #0xc]\n"
619 " ldr r0, [r4]\n"
620 " blx sub_fc2c7dd0\n"
621 " ldr r0, =0x02000003\n"
622 " ldr r7, [sp, #0xc]\n"
623 " tst r7, r0\n"
624 " beq sub_fc4418e6\n"
625 " lsls r0, r7, #0x1f\n"
626 " beq sub_fc441806\n"
627
628 " ldr r0, =0xd2020074\n"
629 " ldr r0, [r0]\n"
630 " subs r0, #0\n"
631 " beq tric1\n"
632 " ldr r0, [r4]\n"
633 " mov r1, #0x80\n"
634 " bl _SetEventFlag\n"
635 "tric1:\n"
636
637 " bl sub_fc441c8a\n"
638
639 " ldr pc, =0xfc441873\n"
640 ".ltorg\n"
641 );
642 }
643
644 #ifdef CAM_HAS_JOGDIAL
645
646
647
648 void __attribute__((naked,noinline)) kbd_p2_f_my() {
649 asm volatile(
650 " push.w {r4, r5, r6, r7, r8, lr}\n"
651 " ldr r6, =0x00032734\n"
652 " sub sp, #0x18\n"
653 " add r7, sp, #8\n"
654 " subs r6, #0xc\n"
655 " b loc_fc0ceda6\n"
656 "loc_fc0ced72:\n"
657 " ldr r1, =0x00032734\n"
658 " add r3, sp, #8\n"
659 " ldrb.w r0, [sp, #4]\n"
660 " add r2, sp, #0x14\n"
661 " subs r1, #0x18\n"
662 " bl sub_fc086f30\n"
663 " cbnz r0, loc_fc0ced8c\n"
664 " ldr r1, [sp, #0x14]\n"
665 " movs r0, #0\n"
666 " bl sub_fc0cecd6\n"
667 "loc_fc0ced8c:\n"
668 " movs r0, #2\n"
669 "loc_fc0ced8e:\n"
670 " ldr.w r1, [r7, r0, lsl #2]\n"
671 " cbz r1, loc_fc0ced9e\n"
672 " ldr.w r2, [r6, r0, lsl #2]\n"
673 " bics r2, r1\n"
674 " str.w r2, [r6, r0, lsl #2]\n"
675 "loc_fc0ced9e:\n"
676 " subs r0, r0, #1\n"
677 " sxtb r0, r0\n"
678 " cmp r0, #0\n"
679 " bge loc_fc0ced8e\n"
680 "loc_fc0ceda6:\n"
681 " ldr r0, =0x00032734\n"
682 " add r1, sp, #4\n"
683 " subs r0, #0xc\n"
684 " bl sub_fc086c7c\n"
685 " cmp r0, #0\n"
686 " bne loc_fc0ced72\n"
687 " ldr.w r8, =0x00032734\n"
688 " movs r4, #0\n"
689 "loc_fc0cedba:\n"
690 " movs r5, #0\n"
691 " ldr.w r0, [r6, r4, lsl #2]\n"
692 " ldr.w r1, [r8, r4, lsl #2]\n"
693 " ands r0, r1\n"
694 " str.w r0, [r6, r4, lsl #2]\n"
695 " b loc_fc0cee12\n"
696 "loc_fc0cedcc:\n"
697 " lsrs r0, r5\n"
698 " lsls r0, r0, #0x1f\n"
699 " beq loc_fc0cee0a\n"
700 " ldr r1, =0x00032734\n"
701 " add.w r0, r5, r4, lsl #5\n"
702 " add r3, sp, #8\n"
703 " subs r1, #0x18\n"
704 " add r2, sp, #0x14\n"
705 " uxtb r0, r0\n"
706 " bl sub_fc086f30\n"
707 " cbnz r0, loc_fc0cedee\n"
708 " ldr r1, [sp, #0x14]\n"
709 " movs r0, #1\n"
710 " bl sub_fc0cecd6\n"
711 "loc_fc0cedee:\n"
712 " mov r0, r4\n"
713 " b loc_fc0cee06\n"
714 "loc_fc0cedf2:\n"
715 " ldr.w r1, [r7, r0, lsl #2]\n"
716 " cbz r1, loc_fc0cee02\n"
717 " ldr.w r2, [r6, r0, lsl #2]\n"
718 " bics r2, r1\n"
719 " str.w r2, [r6, r0, lsl #2]\n"
720 "loc_fc0cee02:\n"
721 " adds r0, r0, #1\n"
722 " sxtb r0, r0\n"
723 "loc_fc0cee06:\n"
724 " cmp r0, #3\n"
725 " blt loc_fc0cedf2\n"
726 "loc_fc0cee0a:\n"
727 " ldr.w r0, [r6, r4, lsl #2]\n"
728 " adds r5, r5, #1\n"
729 " uxtb r5, r5\n"
730 "loc_fc0cee12:\n"
731 " cmp r0, #0\n"
732 " bne loc_fc0cedcc\n"
733 " adds r4, r4, #1\n"
734 " sxtb r4, r4\n"
735 " cmp r4, #3\n"
736 " blt loc_fc0cedba\n"
737
738 " bl sub_fc086af2_my\n"
739 " add sp, #0x18\n"
740 " pop.w {r4, r5, r6, r7, r8, pc}\n"
741 ".ltorg\n"
742 );
743 }
744
745
746 void __attribute__((naked,noinline)) sub_fc086af2_my() {
747 asm volatile(
748 " push {r4, lr}\n"
749 " ldr r4, =0x0000960c\n"
750 " subs r4, #0x10\n"
751 " ldr r0, [r4, #8]\n"
752 " bl sub_fc08b410\n"
753 " bl sub_fc0f232c\n"
754 " ldr r0, [r4, #0xc]\n"
755 " bl sub_fc08b340\n"
756
757
758
759 " bl handle_jogdial\n"
760 " cmp r0, #0\n"
761 " beq no_scroll\n"
762 " bl sub_fc08b6f6\n"
763 "no_scroll:\n"
764 " pop {r4, pc}\n"
765 ".ltorg\n"
766 );
767 }
768 #endif