This source file includes following definitions.
- spytask
- CreateTask_spytask
- xblinker
- blinker
- CreateTask_blinker
- boot
- CreateTask_my
- sub_fc05e00c_my
- sub_fc05e19d_my
- sub_fc05e5a2_my
- sub_fc070e98_my
- task_Startup_my
- sub_fc070d8a_my
- init_file_modules_task
- kbd_p2_f_my
- sub_fc07147a_my
1 #include "lolevel.h"
2 #include "platform.h"
3 #include "core.h"
4 #include "dryos31.h"
5 #include "gui_draw.h"
6 #include "asmsafe.h"
7
8 #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
9
10 const char * const new_sa = &_end;
11 extern volatile int jogdial_stopped;
12
13
14
15 extern void task_CaptSeq();
16 extern void task_InitFileModules();
17 extern void task_RotaryEncoder();
18 extern void task_MovieRecord();
19 extern void task_ExpDrv();
20
21 void JogDial_task_my(void);
22
23
24
25
26
27 void spytask(long ua, long ub, long uc, long ud, long ue, long uf)
28 {
29 (void)ua; (void)ub; (void)uc; (void)ud; (void)ue; (void)uf;
30 core_spytask();
31 }
32
33 void CreateTask_spytask()
34 {
35 _CreateTask("SpyTask", 0x19, 0x2000, spytask, 0);
36 }
37
38
39 #ifdef DEBUG_BLINKING
40
41
42 #define LED_PR 0xd20b0994
43 #define LED_PWR 0xd20b0884
44 #define LED_ORANGE 0xd20b0888
45 #define XDELAY 4000000
46
47 void xblinker()
48 {
49 int j = 2;
50 while(j-- > 0) {
51 int i;
52 *(volatile int*)LED_ORANGE = 0x4d0002;
53 for(i=0;i<XDELAY/10;i++) {
54 asm volatile(
55 "nop\n"
56 );
57 }
58 *(volatile int*)LED_ORANGE = 0x4c0003;
59 for(i=0;i<XDELAY;i++) {
60 asm volatile(
61 "nop\n"
62 );
63 }
64 }
65 }
66
67
68
69
70
71 void draw_pixel_std(unsigned int , unsigned short );
72
73 void __attribute__((naked,noinline)) blinker() {
74
75 int led_count = 50 ;
76 unsigned int pxl;
77
78 _SleepTask(2000);
79
80 while(1)
81 {
82 switch led_count
83 {
84 case 3 :
85 *(volatile int*)0xd20b0994 = 0x4d0002;
86 break ;
87 case 2 :
88 *(volatile int*)0xd20b0994 = 0x4c0003;
89 break ;
90 case 1 :
91 *(volatile int*)0xd20b0994 = 0x4d0002;
92 break ;
93 case 0 :
94 led_count = 21 ;
95 *(volatile int*)0xd20b0994 = 0x4c0003;
96
97 for (pxl=0 ; pxl<0x3FFF ; pxl++)
98 {
99 draw_pixel_std(pxl, MAKE_COLOR(COLOR_GREEN,COLOR_GREEN)) ;
100 }
101 break ;
102 default :
103 break ;
104 }
105 led_count-- ;
106 _SleepTask(100);
107 }
108 };
109
110 void CreateTask_blinker() {
111 _CreateTask("Blinker", 0x1, 0x200, blinker, 0);
112 };
113 #endif
114
115
116
117
118
119
120
121
122 void __attribute__((naked,noinline)) boot() {
123 asm volatile (
124 " ldr.w sp, =0x80010000\n"
125
126 #ifdef DEBUG_BLINKING
127 ASM_SAFE("BL xblinker\n")
128 #endif
129
130 " bl sub_fc020064\n"
131 " ldr r2, =0xc0242010\n"
132 " ldr r1, [r2]\n"
133 " orr r1, r1, #1\n"
134 " str r1, [r2]\n"
135 " ldr r0, =0xfcbebb80\n"
136 " ldr r1, =0x010c1000\n"
137 " ldr r3, =0x010df4e8\n"
138 "loc_fc020024:\n"
139 " cmp r1, r3\n"
140 " itt lo\n"
141 " ldrlo r2, [r0], #4\n"
142 " strlo r2, [r1], #4\n"
143 " blo loc_fc020024\n"
144
145
146
147 "adr r0, patch_CreateTask\n"
148 "ldr r1, =hook_CreateTask\n"
149 "add r2, r0, #8\n"
150 "task_hook_loop:\n"
151 "ldrh r3, [r0],#2\n"
152 "strh r3, [r1],#2\n"
153 "cmp r0,r2\n"
154 "blo task_hook_loop\n"
155
156 " ldr r0, =0x010c1000\n"
157 " ldr r1, =0x0001e4e8\n"
158 " bl sub_fc13c50e\n"
159 " ldr r0, =0xfcbc22e0\n"
160 " ldr r1, =0x00008000\n"
161 " ldr r3, =0x000318a0\n"
162 "loc_fc020040:\n"
163 " cmp r1, r3\n"
164 " itt lo\n"
165 " ldrlo r2, [r0], #4\n"
166 " strlo r2, [r1], #4\n"
167 " blo loc_fc020040\n"
168 " ldr r3, =0x000318a0\n"
169 " ldr r1, =0x003077e0\n"
170 " mov.w r2, #0\n"
171 "loc_fc020056:\n"
172 " cmp r3, r1\n"
173 " it lo\n"
174 " strlo r2, [r3], #4\n"
175 " blo loc_fc020056\n"
176 " b.w sub_fc05e00c_my\n"
177
178 "patch_CreateTask:\n"
179 " ldr.w pc, [pc,#0]\n"
180 " .long CreateTask_my + 1\n"
181 );
182 }
183
184 void __attribute__((naked,noinline)) CreateTask_my() {
185 asm volatile (
186 " push {r0}\n"
187
188 " ldr r0, =task_CaptSeq\n"
189 " cmp r0, r3\n"
190 " itt eq\n"
191 " ldreq r3, =capt_seq_task\n"
192 " orreq r3, #1\n"
193 " beq exitHook\n"
194
195 " LDR R0, =task_ExpDrv\n"
196 " CMP R0, R3\n"
197 " itt eq\n"
198 " LDREQ R3, =exp_drv_task\n"
199 " orreq r3, #1\n"
200 " BEQ exitHook\n"
201
202 " ldr r0, =task_InitFileModules\n"
203 " cmp r0, r3\n"
204 " itt eq\n"
205 " ldreq r3, =init_file_modules_task\n"
206 " orreq r3, #1\n"
207 " BEQ exitHook\n"
208
209 " LDR R0, =task_FileWrite\n"
210 " CMP R0, R3\n"
211 " itt eq\n"
212 " LDREQ R3, =filewritetask\n"
213 " orreq r3, #1\n"
214 " BEQ exitHook\n"
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233 "exitHook:\n"
234 " pop {r0}\n"
235 " stmdb sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, lr}\n"
236 " mov r4, r0\n"
237 " ldr r0, =0x8158\n"
238 " ldr.w pc, =(hook_CreateTask + 8 + 1) \n"
239 ".ltorg\n"
240 );
241 }
242
243
244 void __attribute__((naked,noinline)) sub_fc05e00c_my() {
245
246
247 if (*(int*)(0xd20b0000 + 0x97 * 4) & 0x10000) {
248
249 *(int*)(0x9494+0x4) = 0x200000;
250 }
251 else {
252
253 *(int*)(0x9494+0x4) = 0x100000;
254 }
255
256 asm volatile (
257 " push {r4, lr}\n"
258 #if defined(CHDK_NOT_IN_CANON_HEAP)
259 " ldr r4, =0x003077e0\n"
260 #else
261 "ldr r4, =new_sa\n"
262 "ldr r4, [r4]\n"
263 #endif
264 " sub sp, #0x78\n"
265 " ldr r0, =0x006ce000\n"
266 " ldr r1, =0x0008eb94\n"
267 " subs r0, r0, r4\n"
268 " cmp r0, r1\n"
269 " bhs loc_fc05e01e\n"
270 "loc_fc05e01c:\n"
271 " b loc_fc05e01c\n"
272 "loc_fc05e01e:\n"
273 " ldr r1, =0x00008074\n"
274 " mov.w r0, #0x80000\n"
275 " str r0, [r1]\n"
276 " ldr r1, =0x00008078\n"
277 " ldr r0, =0x42b21000\n"
278 " str r0, [r1]\n"
279 " ldr r1, =0x0000807c\n"
280 " ldr r0, =0x42b23000\n"
281 " str r0, [r1]\n"
282 " movs r1, #0x74\n"
283 " add r0, sp, #4\n"
284 " blx sub_fc2a16d8\n"
285 " add r2, sp, #4\n"
286 " ldr r0, =0x0062e000\n"
287 " mov.w r1, #0xa0000\n"
288 " stm r2!, {r0, r1, r4}\n"
289 " ldr r1, =0x0062346c\n"
290 " str r0, [sp, #0x18]\n"
291 " movs r0, #0x22\n"
292 " subs r2, r1, r4\n"
293 " str r0, [sp, #0x1c]\n"
294 " movs r0, #0x98\n"
295 " str r0, [sp, #0x20]\n"
296 " strd r2, r1, [sp, #0x10]\n"
297 " movw r0, #0x1e8\n"
298 " str r0, [sp, #0x24]\n"
299 " movs r0, #0xfa\n"
300 " str r0, [sp, #0x28]\n"
301 " movs r0, #0xb6\n"
302 " str r0, [sp, #0x2c]\n"
303 " movs r0, #0x85\n"
304 " str r0, [sp, #0x30]\n"
305 " movs r0, #0x40\n"
306 " str r0, [sp, #0x34]\n"
307 " movs r0, #4\n"
308 " str r0, [sp, #0x38]\n"
309 " movs r0, #0\n"
310 " str r0, [sp, #0x3c]\n"
311 " movs r0, #0x10\n"
312 " str r0, [sp, #0x60]\n"
313
314 " ldr r1, =sub_fc05e19d_my\n"
315 " movs r2, #0\n"
316 " lsls r0, r0, #8\n"
317 " str r0, [sp, #0x64]\n"
318 " asrs r0, r0, #4\n"
319 " str r0, [sp, #0x68]\n"
320 " lsls r0, r0, #5\n"
321 " str r0, [sp, #0x6c]\n"
322 " add r0, sp, #4\n"
323 " blx sub_fc2a0d38\n"
324 " add sp, #0x78\n"
325 " pop {r4, pc}\n"
326
327 ".ltorg\n"
328 );
329 }
330
331
332 void __attribute__((naked,noinline)) sub_fc05e19d_my() {
333 asm volatile (
334 " push {r4, lr}\n"
335 " ldr r4, =0xfc05e248\n"
336 " bl sub_fc05f3c8\n"
337 " ldr r0, =0x000080ec\n"
338 " ldr r1, [r0]\n"
339 " ldr r0, =0x00008074\n"
340 " ldr r0, [r0]\n"
341 " adds r0, #0x10\n"
342 " cmp r1, r0\n"
343 " bhs loc_fc05e1b8\n"
344 " ldr r0, =0xfc05e258\n"
345 " bl sub_fc05e230\n"
346 "loc_fc05e1b8:\n"
347 " bl sub_fc13c5e8\n"
348 " ldr r3, =0x80000800\n"
349 " mov.w r1, #-0x80000000\n"
350 " mov.w r2, #-0x11111112\n"
351 "loc_fc05e1c6:\n"
352 " stm r1!, {r2}\n"
353 " cmp r1, r3\n"
354 " blo loc_fc05e1c6\n"
355 " bl sub_fc13c5fa\n"
356 " bl sub_fc13cba4\n"
357 " cmp r0, #0\n"
358 " bge loc_fc05e1de\n"
359 " ldr r0, =0xfc05e274\n"
360 " bl sub_fc05e230\n"
361 "loc_fc05e1de:\n"
362 " bl sub_fc05ea08\n"
363 " cmp r0, #0\n"
364 " bge loc_fc05e1ec\n"
365 " ldr r0, =0xfc05e27c\n"
366 " bl sub_fc05e230\n"
367 "loc_fc05e1ec:\n"
368 " mov r0, r4\n"
369 " bl sub_fc05ea9c\n"
370 " cmp r0, #0\n"
371 " bge loc_fc05e1fc\n"
372 " ldr r0, =0xfc05e28c\n"
373 " bl sub_fc05e230\n"
374 "loc_fc05e1fc:\n"
375 " mov r0, r4\n"
376 " bl sub_fc05e3d4\n"
377 " cmp r0, #0\n"
378 " bge loc_fc05e20c\n"
379 " ldr r0, =0xfc05e2a0\n"
380 " bl sub_fc05e230\n"
381 "loc_fc05e20c:\n"
382 " bl sub_fc05e518\n"
383 " cmp r0, #0\n"
384 " bge loc_fc05e21a\n"
385 " ldr r0, =0xfc05e2ac\n"
386 " bl sub_fc05e230\n"
387 "loc_fc05e21a:\n"
388 " bl sub_fc0617d0\n"
389 " cmp r0, #0\n"
390 " bge loc_fc05e228\n"
391 " ldr r0, =0xfc05e2b8\n"
392 " bl sub_fc05e230\n"
393 "loc_fc05e228:\n"
394 " pop.w {r4, lr}\n"
395 " b.w sub_fc05e5a2_my\n"
396
397 ".ltorg\n"
398 );
399 }
400
401
402 void __attribute__((naked,noinline)) sub_fc05e5a2_my() {
403 asm volatile (
404 " push {r3, lr}\n"
405 " bl sub_fc05e6a4\n"
406 " bl sub_fc0b5a00\n"
407 " cbnz r0, loc_fc05e5b8\n"
408 " bl sub_fc07e9a8\n"
409 " cbz r0, loc_fc05e5b8\n"
410 " movs r0, #1\n"
411 " b loc_fc05e5ba\n"
412 "loc_fc05e5b8:\n"
413 " movs r0, #0\n"
414 "loc_fc05e5ba:\n"
415 " bl sub_fc070e98_my\n"
416 " cbnz r0, loc_fc05e5c6\n"
417 " bl sub_fc05e692\n"
418 "loc_fc05e5c4:\n"
419 " b loc_fc05e5c4\n"
420 "loc_fc05e5c6:\n"
421 " blx sub_fc2a0d90\n"
422 " ldr r1, =0x006ce000\n"
423 " movs r0, #0\n"
424 " bl sub_fc30d864\n"
425 " blx sub_fc2a12c8\n"
426 " movs r3, #0\n"
427 " str r3, [sp]\n"
428
429 " ldr r3, =task_Startup_my\n"
430 " movs r2, #0\n"
431 " movs r1, #0x19\n"
432 " ldr r0, =0xfc05e5f4\n"
433 " blx sub_fc2a12e8\n"
434 " movs r0, #0\n"
435 " pop {r3, pc}\n"
436
437 ".ltorg\n"
438 );
439 }
440
441
442 void __attribute__((naked,noinline)) sub_fc070e98_my() {
443 asm volatile (
444 " push.w {r2, r3, r4, r5, r6, r7, r8, lr}\n"
445 " mov.w r8, #0\n"
446 " mov r7, r0\n"
447 " mov r6, r8\n"
448 " bl sub_fc07138e\n"
449 " movs r0, #0x97\n"
450 " bl sub_fc06ecba\n"
451 " movs r4, #1\n"
452 " bic.w r5, r4, r0\n"
453 " movs r0, #0x98\n"
454 " bl sub_fc06ecba\n"
455 " bics r4, r0\n"
456 " cbz r7, loc_fc070ec4\n"
457 " orrs.w r0, r5, r4\n"
458
459 "loc_fc070ec4:\n"
460 " bl sub_fc0b5a00\n"
461 " movs r3, #0\n"
462 " mov r2, r0\n"
463 " strd r8, r6, [sp]\n"
464 " mov r1, r4\n"
465 " mov r0, r5\n"
466
467
468 " movs r0, #1\n"
469 "loc_fc070ede:\n"
470 " pop.w {r2, r3, r4, r5, r6, r7, r8, pc}\n"
471
472 ".ltorg\n"
473 );
474 }
475
476
477
478 void __attribute__((naked,noinline)) task_Startup_my() {
479 asm volatile (
480 " push {r4, lr}\n"
481 " bl sub_fc0e4714\n"
482 " bl sub_fc05e670\n"
483 " bl sub_fc05e7e4\n"
484 " bl sub_fc0e47ac\n"
485
486
487
488 " bl sub_fc08f5b8\n"
489
490 " bl sub_fc0895ae\n"
491 " bl sub_fc0e48f0\n"
492 " bl sub_fc05e948\n"
493 " bl sub_fc05e780\n"
494 " bl sub_fc0e47ea\n"
495 " bl sub_fc0999fc\n"
496 " bl sub_fc0e48f6\n"
497
498 " bl sub_fc070d8a_my\n"
499
500 #if defined(OPT_RUN_WITH_BATT_COVER_OPEN)
501 " LDR R0, =0x1C0000\n"
502 "batt_delay:\n"
503 " NOP\n"
504 " SUBS R0,R0,#1\n"
505 " BNE batt_delay\n"
506 #endif
507 " bl CreateTask_spytask\n"
508
509 #ifdef DEBUG_BLINKING
510 " bl CreateTask_blinker\n"
511 #endif
512
513 " bl sub_fc254046\n"
514 " bl sub_fc0e490c\n"
515 " bl sub_fc0b57a4\n"
516 " bl sub_fc0e44fc\n"
517 " bl sub_fc0b58d0\n"
518 " bl sub_fc0999ae\n"
519 " bl sub_fc0e44bc\n"
520 " bl sub_fc05e94c\n"
521 " bl sub_fc307d98\n"
522 " bl sub_fc0e4496\n"
523 " pop.w {r4, lr}\n"
524 " b.w sub_fc0e46ea\n"
525
526 ".ltorg\n"
527 );
528 }
529
530
531 void __attribute__((naked,noinline)) sub_fc070d8a_my() {
532 asm volatile (
533 " push {r3, r4, r5, lr}\n"
534 " bl sub_fc0701d8\n"
535 " bl sub_fc07e932\n"
536 " cbnz r0, loc_fc070d9a\n"
537 " bl sub_fc07017c\n"
538 "loc_fc070d9a:\n"
539 " ldr r4, =0x00008324\n"
540 " ldr r0, [r4, #4]\n"
541 " cmp r0, #0\n"
542 " bne loc_fc070db6\n"
543 " movs r3, #0\n"
544 " str r3, [sp]\n"
545
546 " ldr r3, =mykbd_task\n"
547 " movs r1, #0x17\n"
548 " ldr r0, =0xfc070de4\n"
549 " movw r2, #0x2000\n"
550 " blx sub_fc2a1620\n"
551 " str r0, [r4, #4]\n"
552 "loc_fc070db6:\n"
553 " pop {r3, r4, r5, pc}\n"
554
555 ".ltorg\n"
556 );
557 }
558
559
560
561 void __attribute__((naked,noinline)) init_file_modules_task() {
562 asm volatile (
563 " push {r4, r5, r6, lr}\n"
564 " bl sub_fc0bba04\n"
565 " movs r4, r0\n"
566 " movw r5, #0x5006\n"
567 " beq loc_fc0b926e\n"
568 " movs r1, #0\n"
569 " mov r0, r5\n"
570 " bl _PostLogicalEventToUI\n"
571 "loc_fc0b926e:\n"
572 " bl sub_fc0bba32\n"
573 " bl core_spytask_can_start\n"
574 " cmp r4, #0\n"
575 " bne loc_fc0b9282\n"
576 " mov r0, r5\n"
577 " pop.w {r4, r5, r6, lr}\n"
578 " movs r1, #0\n"
579 " b.w _PostLogicalEventToUI\n"
580 "loc_fc0b9282:\n"
581 " pop {r4, r5, r6, pc}\n"
582
583 ".ltorg\n"
584 );
585 }
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610 void __attribute__((naked,noinline)) kbd_p2_f_my() {
611 asm volatile(
612 " push.w {r4, r5, r6, r7, r8, lr}\n"
613 " ldr r6, =0x0003313c\n"
614 " sub sp, #0x18\n"
615 " add r7, sp, #8\n"
616 " subs r6, #0xc\n"
617 " b loc_fc070b72\n"
618 "loc_fc070b3e:\n"
619 " ldr r1, =0x0003313c\n"
620 " add r3, sp, #8\n"
621 " ldrb.w r0, [sp, #4]\n"
622 " add r2, sp, #0x14\n"
623 " subs r1, #0x18\n"
624 " bl sub_fc071856\n"
625 " cbnz r0, loc_fc070b58\n"
626 " ldr r1, [sp, #0x14]\n"
627 " movs r0, #0\n"
628 " bl sub_fc070aa2\n"
629 "loc_fc070b58:\n"
630 " movs r0, #2\n"
631 "loc_fc070b5a:\n"
632 " ldr.w r1, [r7, r0, lsl #2]\n"
633 " cbz r1, loc_fc070b6a\n"
634 " ldr.w r2, [r6, r0, lsl #2]\n"
635 " bics r2, r1\n"
636 " str.w r2, [r6, r0, lsl #2]\n"
637 "loc_fc070b6a:\n"
638 " subs r0, r0, #1\n"
639 " sxtb r0, r0\n"
640 " cmp r0, #0\n"
641 " bge loc_fc070b5a\n"
642 "loc_fc070b72:\n"
643 " ldr r0, =0x0003313c\n"
644 " add r1, sp, #4\n"
645 " subs r0, #0xc\n"
646 " bl sub_fc071584\n"
647 " cmp r0, #0\n"
648 " bne loc_fc070b3e\n"
649 " ldr.w r8, =0x0003313c\n"
650 " movs r4, #0\n"
651 "loc_fc070b86:\n"
652 " movs r5, #0\n"
653 " ldr.w r0, [r6, r4, lsl #2]\n"
654 " ldr.w r1, [r8, r4, lsl #2]\n"
655 " ands r0, r1\n"
656 " str.w r0, [r6, r4, lsl #2]\n"
657 " b loc_fc070bde\n"
658 "loc_fc070b98:\n"
659 " lsrs r0, r5\n"
660 " lsls r0, r0, #0x1f\n"
661 " beq loc_fc070bd6\n"
662 " ldr r1, =0x0003313c\n"
663 " add.w r0, r5, r4, lsl #5\n"
664 " add r3, sp, #8\n"
665 " subs r1, #0x18\n"
666 " add r2, sp, #0x14\n"
667 " uxtb r0, r0\n"
668 " bl sub_fc071856\n"
669 " cbnz r0, loc_fc070bba\n"
670 " ldr r1, [sp, #0x14]\n"
671 " movs r0, #1\n"
672 " bl sub_fc070aa2\n"
673 "loc_fc070bba:\n"
674 " mov r0, r4\n"
675 " b loc_fc070bd2\n"
676 "loc_fc070bbe:\n"
677 " ldr.w r1, [r7, r0, lsl #2]\n"
678 " cbz r1, loc_fc070bce\n"
679 " ldr.w r2, [r6, r0, lsl #2]\n"
680 " bics r2, r1\n"
681 " str.w r2, [r6, r0, lsl #2]\n"
682 "loc_fc070bce:\n"
683 " adds r0, r0, #1\n"
684 " sxtb r0, r0\n"
685 "loc_fc070bd2:\n"
686 " cmp r0, #3\n"
687 " blt loc_fc070bbe\n"
688 "loc_fc070bd6:\n"
689 " ldr.w r0, [r6, r4, lsl #2]\n"
690 " adds r5, r5, #1\n"
691 " uxtb r5, r5\n"
692 "loc_fc070bde:\n"
693 " cmp r0, #0\n"
694 " bne loc_fc070b98\n"
695 " adds r4, r4, #1\n"
696 " sxtb r4, r4\n"
697 " cmp r4, #3\n"
698 " blt loc_fc070b86\n"
699 " bl sub_fc07147a_my\n"
700 " add sp, #0x18\n"
701 " pop.w {r4, r5, r6, r7, r8, pc}\n"
702
703 ".ltorg\n"
704 );
705 }
706
707
708 void __attribute__((naked,noinline)) sub_fc07147a_my() {
709 asm volatile(
710 " push {r4, lr}\n"
711 " ldr r4, =0x00009494\n"
712 " ldr r0, [r4, #8]\n"
713 " bl sub_fc0721b4\n"
714 " bl sub_fc0c784c\n"
715 " ldr r0, [r4, #0xc]\n"
716 " bl sub_fc0720d0\n"
717 " ldr r0, [r4, #0x10]\n"
718 " bl sub_fc0720d0\n"
719
720
721 " bl handle_jogdial\n"
722 " cmp r0, #0\n"
723 " beq no_scroll\n"
724 " bl sub_fc06befe\n"
725 "no_scroll:\n"
726 " pop {r4, pc}\n"
727 ".ltorg\n"
728 );
729 }
730
731