source: trunk/platform/ixus1000_sd4500/sub/100d/boot.c @ 1382

Revision 1382, 33.1 KB checked in by philmoz, 3 years ago (diff)

Add IXUS 1000 firmware 1.00d & 1.00f - thx Brend R and waterwingz.
http://chdk.setepontos.com/index.php?topic=650.msg74790#msg74790
BETA version, currently disabled from the autobuild server.

Line 
1#include "lolevel.h"
2#include "platform.h"
3#include "core.h"
4#include "dryos31.h"
5//#include "stdlib.h"
6
7//IXUS 1000 100D
8
9int fsionotify_compfail = 0;    // count of number of times the file handle was already in the array
10int fsionotify_success  = 0;    // count of number of times the code succeeded
11
12int __attribute__((naked,noinline)) _Open(const char *name, int flags, int mode) {
13
14   asm volatile (
15                                "STMFD   SP!, {R4-R8,LR} \n"
16                                "MOV     R6, R0 \n"
17                                "LDRB    R0, [R0] \n"
18                                "MOV     R7, R2 \n"
19                                "MOV     R4, R1 \n"
20                                "BL      sub_FF874504 \n"
21                                "MOV     R8, R0 \n"
22                                "MOV     R0, #1 \n"
23                                "BIC     R5, R0, R4,LSR#12 \n"
24                                "BIC     R4, R4, #0x9000 \n"
25                                "MOV     R0, R8 \n"
26                                "MOV     R1, #1 \n"
27                                "BL      sub_FF875894 \n"
28                                "MOV     R2, R7 \n"
29                                "MOV     R1, R4 \n"
30                                "MOV     R0, R6 \n"
31                                "BL      _open \n"
32                                "CMP     R5, #0 \n"
33                                "MOV     R7, R0 \n"
34                                "MOVNE   R0, R7 \n"
35                                "MOVNE   R2, R4 \n"
36                                "MOVNE   R1, R6 \n"
37                                "BLNE    sub_FF872470_my \n"
38                                "MOV     R0, R8 \n"
39                                "BL      sub_FF87590C \n"
40                                "MOV     R0, R7 \n"
41                                "LDMFD   SP!, {R4-R8,PC} \n"
42   );
43
44        return 0; // stop compiler warning
45}
46
47void __attribute__((naked,noinline)) sub_FF872470_my() {
48
49   asm volatile (
50                                "STMFD   SP!, {R4-R8,LR} \n"
51                                "MOV     R5, R0 \n"
52                                "LDR     R0, =0x31B8 \n"
53                                "MOV     R7, R1 \n"
54                                "LDR     R0, [R0,#4] \n"
55                                "MOV     R6, R2 \n"
56                                "CMP     R0, #0 \n"
57                                "LDMEQFD SP!, {R4-R8,PC} \n"
58                                "CMP     R5, #0 \n"
59                                "LDMLTFD SP!, {R4-R8,PC} \n"
60                                "MOV     R4, #0 \n"
61                                "LDR     R2, =0x38EA8 \n"
62                                "MOV     R0, #0 \n"
63"loc_FF8724A4: \n"
64                                "ADD     R1, R0, R0,LSL#1 \n"
65                                "LDR     R1, [R2,R1,LSL#5] \n"
66                                "CMN     R1, #1 \n"
67                                "ADDEQ   R0, R0, R0,LSL#1 \n"
68                                "ADDEQ   R4, R2, R0,LSL#5 \n"
69                                "BEQ     loc_FF8724CC\n"
70                                "CMP     R1, R5 \n"
71
72                                "BEQ     loc_2 \n"                                              // +    // branch if found entry matching new file handle
73
74                                "ADDNE   R0, R0, #1 \n"
75                                "CMPNE   R0, #0xA \n"
76                                "BLT     loc_FF8724A4 \n"
77
78"loc_FF8724CC: \n"
79                                "CMP     R4, #0 \n"
80                                "LDREQ   R1, =0x1C9 \n"
81                                "LDREQ   R0, =0xFF8723B8 \n"                    //aFsionotify_c
82                                "BLEQ    sub_FF81EB78 \n"                               //_DebugAssert
83
84                                "LDR     R1, =fsionotify_success \n"    // +    // increment counter
85                                "LDR     R0, [R1] \n"                                   // +    // of successful calls
86                                "ADD     R0, R0, #1 \n"                                 // +
87                                "STR     R0, [R1] \n"                                   // +
88
89                                "MOV     R0, #0 \n"                                             // original code - save handle in array
90                                "STR     R0, [R4,#0x58] \n"
91                                "STR     R5, [R4] \n"
92                                "MOV     R0, R4 \n"
93                                "MOV     R1, R7 \n"
94                                "STR     R6, [R4,#0x24] \n"
95                                "BL      sub_FF872238 \n"
96                                "ADD     R1, R4, #0x28 \n"
97                                "MOV     R0, R7 \n"
98                                "LDMFD   SP!, {R4-R8,LR} \n"
99                                "B       sub_FF8381C4 \n"
100
101"loc_2: \n"                                                                                             // +    // Handle case when new file handle returned from _open is already in array
102                                "LDR     R1, =fsionotify_compfail \n"   // +    // increment counter then return rather than throw exception
103                                "LDR     R0, [R1] \n"                                   // +    // equivalent to calling _open rather than _Open
104                                "ADD     R0, R0, #1 \n"                                 // +
105                                "STR     R0, [R1] \n"                                   // +
106                                "LDMFD   SP!, {R4-R8,PC} \n"                    // +
107   );
108}
109
110#define LED_PR 0xC0220138   // -> ASM1989 08.24.2010 found at  FF91E080  in sx200 was FF8E73D0
111    void __attribute__((naked,noinline)) blink()
112{
113        volatile long *p=(void*)LED_PR;
114        int i;
115    int cnt =10;
116        for(;cnt>0;cnt--){
117                p[0]=0x46;
118
119                for(i=0;i<0x200000;i++){
120                        asm ("nop\n");
121                        asm ("nop\n");
122                }
123                p[0]=0x44;
124                for(i=0;i<0x200000;i++){
125                        asm ("nop\n");
126                        asm ("nop\n");
127                }
128        }
129        shutdown();
130}
131
132
133#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
134
135void JogDial_task_my(void);
136
137const char * const new_sa = &_end;
138
139void taskHook(context_t **context) {
140
141task_t *tcb=(task_t*)((char*)context-offsetof(task_t, context));
142
143if(!_strcmp(tcb->name, "PhySw"))           tcb->entry = (void*)mykbd_task;  //JHARP - Verified name - Sept 5, 2010
144if(!_strcmp(tcb->name, "CaptSeqTask"))     tcb->entry = (void*)capt_seq_task; //JHARP - Verified name - Sept 5, 2010
145if(!_strcmp(tcb->name, "InitFileModules")) tcb->entry = (void*)init_file_modules_task; //JHARP - Verified name - Sept 5, 2010
146//if(!_strcmp(tcb->name, "MovieRecord"))     tcb->entry = (void*)movie_record_task; //JHARP - Verified name - Sept 5, 2010
147if(!_strcmp(tcb->name, "ExpDrvTask"))      tcb->entry = (void*)exp_drv_task; //JHARP - Verified name - Sept 5, 2010
148if(!_strcmp(tcb->name, "RotarySw"))        tcb->entry = (void*)JogDial_task_my; //JHARP - Must verify the code in use - Sept 5, 2010
149
150}
151
152void CreateTask_spytask() {
153        _CreateTask("SpyTask", 0x19, 0x2000, core_spytask, 0);
154};
155
156
157void __attribute__((naked,noinline)) boot() {
158               
159    asm volatile (
160                                 //"B             sub_FF81000C\n" // work
161                 "LDR R1, =0xC0410000\n"
162                                  "MOV R0, #0\n"
163                                  "STR R0, [R1]\n"
164                                  "MOV R1, #0x78\n"
165                                  "MCR p15, 0, R1,c1,c0\n"                      // control reg
166                                  "MOV R1, #0\n"
167                                  "MCR p15, 0, R1,c7,c10, 4\n"          // drain write buffer
168                                  "MCR p15, 0, R1,c7,c5\n"                      // flush instruction cache
169                                  "MCR p15, 0, R1,c7,c6\n"                      // flush data cache
170                                  "MOV R0, #0x3D\n"                                     // size 2GB base 0x00000000
171                                  "MCR p15, 0, R0,c6,c0\n"
172                                  "MOV R0, #0xC000002F\n"                       // size 16M base 0xc0000000
173                                  "MCR p15, 0, R0,c6,c1\n"
174                                  "MOV R0, #0x35\n"                                  // size 128M base 0x00000000 (s90 is 64M)
175                                  "MCR p15, 0, R0,c6,c2\n"
176                                  "MOV R0, #0x40000035\n"                       // size 128M base 0x40000000 (s90 is 64M)
177                                  "MCR p15, 0, R0,c6,c3\n"
178                                  "MOV R0, #0x80000017\n"                       // size  4k base 0x80000000
179                                  "MCR p15, 0, R0,c6,c4\n"
180                                  "LDR R0, =0xFF80002D\n"                       // size  8M base 0xff800000
181                                  "MCR p15, 0, R0,c6,c5\n"
182                                  "MOV R0, #0x34\n"
183                                  "MCR p15, 0, R0,c2,c0\n"
184                                  "MOV R0, #0x34\n"
185                                  "MCR p15, 0, R0,c2,c0, 1\n"
186                                  "MOV R0, #0x34\n"
187                                  "MCR p15, 0, R0,c3,c0\n"
188                                  "LDR R0, =0x3333330\n"
189                                  "MCR p15, 0, R0,c5,c0, 2\n"
190                                  "LDR R0, =0x3333330\n"
191                                  "MCR p15, 0, R0,c5,c0, 3\n"
192                                  "MRC p15, 0, R0,c1,c0\n"
193                                  "ORR R0, R0, #0x1000\n"
194                                  "ORR R0, R0, #4\n"
195                                  "ORR R0, R0, #1\n"
196                                  "MCR p15, 0, R0,c1,c0\n"
197                                  "MOV R1, #0x80000006\n"
198                                  "MCR p15, 0, R1,c9,c1\n"
199                                  "MOV R1, #6\n"
200                                  "MCR p15, 0, R1,c9,c1, 1\n"
201                                  "MRC p15, 0, R1,c1,c0\n"
202                                  "ORR R1, R1, #0x50000\n"
203                                  "MCR p15, 0, R1,c1,c0\n"
204                                  "LDR R2, =0xC0200000\n"
205                                  "MOV R1, #1\n"
206                                  "STR R1, [R2,#0x10C]\n"
207                                  "MOV R1, #0xFF\n"
208                                  "STR R1, [R2,#0xC]\n"
209                                  "STR R1, [R2,#0x1C]\n"
210                                  "STR R1, [R2,#0x2C]\n"
211                                  "STR R1, [R2,#0x3C]\n"
212                                  "STR R1, [R2,#0x4C]\n"
213                                  "STR R1, [R2,#0x5C]\n"
214                                  "STR R1, [R2,#0x6C]\n"
215                                  "STR R1, [R2,#0x7C]\n"
216                                  "STR R1, [R2,#0x8C]\n"
217                                  "STR R1, [R2,#0x9C]\n"
218                                  "STR R1, [R2,#0xAC]\n"
219                                  "STR R1, [R2,#0xBC]\n"
220                                  "STR R1, [R2,#0xCC]\n"
221                                  "STR R1, [R2,#0xDC]\n"
222                                  "STR R1, [R2,#0xEC]\n"
223                                  "STR R1, [R2,#0xFC]\n"
224                                  "LDR R1, =0xC0400008\n"
225                                  "LDR R2, =0x430005\n"
226                                  "STR R2, [R1]\n"
227                                  "MOV R1, #1\n"
228                                  "LDR R2, =0xC0243100\n"
229                                  "STR R2, [R1]\n"
230                                  "LDR R2, =0xC0242010\n"
231                                  "LDR R1, [R2]\n"
232                                  "ORR R1, R1, #1\n"
233                                  "STR R1, [R2]\n"
234                                  "LDR R0, =0xFFC56CC8\n"
235                                  "LDR R1, =0x1900\n"
236                                  "LDR R3, =0x10720\n"
237"loc_FF81013C:\n"
238
239                                  "CMP R1, R3\n"
240                                  "LDRCC R2, [R0],#4\n"
241                                  "STRCC R2, [R1],#4\n"
242                                  "BCC loc_FF81013C\n"
243                                  "LDR R1, =0x172BF8\n"
244                                  "MOV R2, #0\n"
245"loc_FF810154:\n"
246                                  "CMP R3, R1\n"
247                                  "STRCC R2, [R3],#4\n"
248                                  "BCC loc_FF810154\n"
249                                  "B sub_FF810354_my\n"
250                            //---------->
251      );
252}
253
254
255void __attribute__((naked,noinline)) sub_FF810354_my() { // ASM1989 -> In sx200 was:  sub_FF8101A0_my
256
257   *(int*)0x1938=(int)taskHook;   //was 1934 in sx200 if 1938 hangs
258   *(int*)0x193C=(int)taskHook;
259
260
261        if ((*(int*) 0xC022010C) & 1)                                   // look at play switch
262                *(int*)(0x254C) = 0x400000;                                     // start in play mode
263        else
264                *(int*)(0x254C) = 0x200000;                                     // start in rec mode
265
266   asm volatile (
267             "LDR R0, =0xFF8103CC\n"
268                 "MOV R1, #0\n"
269                 "LDR R3, =0xFF810404\n"
270"loc_FF810360:\n"
271                 "CMP R0, R3\n"
272                 "LDRCC R2, [R0],#4\n"
273                 "STRCC R2, [R1],#4\n"
274                 "BCC loc_FF810360\n"
275                 "LDR R0, =0xFF810404\n"
276                 "MOV R1, #0x4B0\n"
277                 "LDR R3, =0xFF810618\n"
278"loc_FF81037C:\n"
279                 "CMP R0, R3\n"
280                 "LDRCC R2, [R0],#4\n"
281                 "STRCC R2, [R1],#4\n"
282                 "BCC loc_FF81037C\n"
283                 "MOV R0, #0xD2\n"
284                 "MSR CPSR_cxsf, R0\n"
285                 "MOV SP, #0x1000\n"
286                 "MOV R0, #0xD3\n"
287                 "MSR CPSR_cxsf, R0\n"
288                 "MOV SP, #0x1000\n"
289                 "LDR R0, =0xFF8103C0\n"  // diferent
290                 "LDR R2, =0xEEEEEEEE\n"
291                 "MOV R3, #0x1000\n"
292"loc_FF8103B0:\n"
293                 "CMP R0, R3\n"
294                 "STRCC R2, [R0],#4\n"
295                 "BCC loc_FF8103B0\n"
296                 "BL sub_FF811198_my\n"
297                                                        //------------>
298
299
300
301"loc_FF8103C0:\n"
302                 "ANDEQ R0, R0, R4,ASR#13\n"
303"loc_FF8103C4:\n"
304                "ANDEQ R0, R0, R0,ROR R6\n"
305"loc_FF8103C8:\n"
306                "ANDEQ R0, R0, R4,ROR R6\n"
307"loc_FF8103CC:\n"
308         "NOP\n"
309         "LDR PC, =0xFF810618\n"
310     );
311}
312
313void __attribute__((naked,noinline)) sub_FF811198_my() {
314     asm volatile (
315                 "STR     LR, [SP,#-4]!\n"
316                 "SUB     SP, SP, #0x74\n"
317                 "MOV     R0, SP\n"
318                 "MOV     R1, #0x74\n"
319                 "BL      sub_FFB8754C\n"
320                 //v4 stuff all copied from s95 its the same in principle
321/*
322                 "              MOV     R0, #0x53000 \n"
323                                 "              STR     R0, [SP,#4] \n"
324
325                                 //"            LDR     R0, =0x172BF8 \n"           // old code
326                                 "              LDR     R0, =new_sa \n"                                 // chdk patched
327                                 "              LDR R0, [R0] \n"                    // chdk patched
328
329                                 "              LDR     R1, =0x379C00 \n"
330                                 "              STR     R0, [SP,#8] \n"
331                                 "              RSB     R0, R0, #0x1F80 \n"
332                                 "              ADD     R0, R0, #0x370000 \n"
333                                 "              STR     R0, [SP,#0x0c] \n"
334                                 "              LDR     R0, =0x371F80 \n"
335                                 "              STR     R1, [SP,#0] \n"
336                                 "              STRD    R0, [SP,#0x10] \n"
337                                 "              MOV     R0, #0x22 \n"
338                                 "              STR     R0, [SP,#0x18] \n"
339                                 "              MOV     R0, #0x68 \n"
340                                 "              STR     R0, [SP,#0x1c] \n"
341                                 "              LDR     R0, =0x19B \n"
342
343*/
344
345
346
347                 //v3 stuff
348
349                 "MOV     R0, #0x53000\n"
350                 "STR     R0, [SP,#4]\n"
351                 "LDR     R0, =new_sa\n"        // +
352                 "LDR     R0, [R0]\n"           // +
353                 //"LDR     R2, =0x172BF8\n"
354                 "LDR     R1, =0x379C00\n"
355                 "STR     R0, [SP,#8]\n"
356                 //"SUB     R0, R1, R0\n"
357                 "RSB     R0, R0, #0x1F80\n"   // new in this cam
358                 "ADD     R0, R0, #0x370000\n" // new in this cam
359                 "STR     R0, [SP,#0x0c]\n"  //changed
360                 "LDR     R0, =0x371F80\n"// new in this cam
361                                //copied from s95
362                                "STR    R1, [SP,#0] \n"
363                                "STRD   R0, [SP,#0x10] \n"
364                                "MOV    R0, #0x22 \n"
365                                "STR    R0, [SP,#0x18] \n"
366                                "MOV    R0, #0x68 \n"
367                                "STR    R0, [SP,#0x1c] \n"
368                                "LDR    R0, =0x19B \n"
369
370
371
372
373                "LDR     R1, =sub_FF815EE0_my\n"  // chdk patched
374
375                          //"LDR     R1, =0xFF815EE0\n"    // old code
376
377
378                                                                                        //------------>
379
380
381
382                 "STR     R0, [SP,#0x20]\n"
383                 "MOV     R0, #0x96\n"
384                 "STR     R0, [SP,#0x24]\n"
385                 "MOV     R0, #0x78\n"
386                 "STR     R0, [SP,#0x28]\n"
387                 "MOV     R0, #0x64\n"
388                 "STR     R0, [SP,#0x2C]\n"
389                 "MOV     R0, #0\n"
390                 "STR     R0, [SP,#0x30]\n"
391                 "STR     R0, [SP,#0x34]\n"
392                 "MOV     R0, #0x10\n"
393                 "STR     R0, [SP,#0x5C]\n"
394                 "MOV     R0, #0x800\n"
395                 "STR     R0, [SP,#0x60]\n"
396                 "MOV     R0, #0xA0\n"
397                 "STR     R0, [SP,#0x64]\n"
398                 "MOV     R0, #0x280\n"
399                 "STR     R0, [SP,#0x68]\n"
400                 "MOV     R0, SP\n"
401                 "MOV     R2, #0\n"
402/*
403//copied from s95 // not work
404"               MOV     R0, #0x96 \n"
405"               STR     R0, [SP,#0x24] \n"
406"               STR     R0, [SP,#0x28] \n"
407"               MOV     R0, #0x64 \n"
408"               STR     R0, [SP,#0x2c] \n"
409"               MOV     R0, #0 \n"
410"               STR     R0, [SP,#0x30] \n"
411"               STR     R0, [SP,#0x34] \n"
412"               MOV     R0, #0x10 \n"
413"               STR     R0, [SP,#0x5c] \n"
414"               MOV     R0, #0x800 \n"
415"               STR     R0, [SP,#0x60] \n"
416"               MOV     R0, #0xA0 \n"
417"               STR     R0, [SP,#0x64] \n"
418"               MOV     R0, #0x280 \n"
419"               STR     R0, [SP,#0x68] \n"
420"               MOV     R0, SP \n"
421"               MOV     R2, #0 \n"
422*/
423                 "BL      sub_FF8134B8\n"
424                 "ADD     SP, SP, #0x74\n"
425                 "LDR     PC, [SP],#4\n"
426     );
427}
428
429//Almost till here maybe checked
430
431void __attribute__((naked,noinline)) sub_FF815EE0_my() {
432
433     //v4 testing full s95 code
434/*
435        asm volatile (
436         "              STMFD   SP!, {R4,LR} \n"
437         "              BL      sub_FF810B20 \n"
438         "              BL      sub_FF81A33C \n"                                // dmSetup
439         "              CMP     R0, #0 \n"
440
441         //"            ADRLT   R0, aDmsetup \n"                        // "dmSetup"
442         "              LDRLT   r0, =0xFF815FF4 \n"
443
444         "              BLLT    sub_FF815FD4 \n"                        // err_init_task
445
446         "              BL      sub_FF815B1C \n"
447         "              CMP     R0, #0 \n"
448
449         //"            ADRLT   R0, aTermdriverinit \n"         // "termDriverInit"
450         "              LDRLT   R0, =0xFF815FFC \n"
451
452         "              BLLT    sub_FF815FD4 \n"                        // err_init_task
453
454         //"            ADR     R0, a_term \n"                                  // "/_term"
455         "              LDR     R0, =0xFF81600C \n"
456
457         "              BL      sub_FF815C04 \n"                                // termDeviceCreate
458         "              CMP     R0, #0 \n"
459
460         //"            ADRLT   R0, aTermdevicecrea \n"         // "termDeviceCreate"
461         "              LDRLT   R0, =0xFF816014 \n"
462
463         "              BLLT    sub_FF815FD4 \n"                        // err_init_task
464
465         //"            ADR     R0, a_term \n"                                  // "/_term"
466         "              LDR     R0, =0xFF81600C \n"
467
468         "              BL      sub_FF813CA4 \n"
469         "              CMP     R0, #0 \n"
470
471         //"            ADRLT   R0, aStdiosetup \n"                     // "stdioSetup"
472         "              LDRLT   R0, =0xFF816028 \n"
473
474         "              BLLT    sub_FF815FD4 \n"                        // err_init_task
475         "              BL      sub_FF819CC4 \n"
476         "              CMP     R0, #0 \n"
477
478         //"            ADRLT   R0, aStdlibsetup \n"            // "stdlibSetup"
479         "              LDRLT   R0, =0xFF816034 \n"
480
481         "              BLLT    sub_FF815FD4 \n"                        // err_init_task
482         "              BL      sub_FF81167C \n"
483         "              CMP     R0, #0 \n"
484
485         //"            ADRLT   R0, aArmlib_setup \n"           // "armlib_setup"
486         "              LDRLT   R0, =0xFF816040 \n"
487
488         "              BLLT    sub_FF815FD4 \n"                        // err_init_task
489
490         "              LDMFD   SP!, {R4,LR} \n"
491
492         //"            B       sub_FF81FB54 \n"                                // taskcreate_Startup
493         "              B       taskcreate_Startup_my \n"               // patched
494
495         "              MOV     R0, #0 \n"
496         "              LDMFD   SP!, {R3-R5,PC} \n"
497        );
498*/
499
500     //v3
501
502     asm volatile (
503                 "STMFD   SP!, {R4,LR}\n"
504                 "BL      sub_FF810B20\n"
505                 "BL      sub_FF81A33C\n"       // BL      dmSetup
506                 "CMP     R0, #0\n"
507                 "LDRLT   R0, =0xFF815FF4\n"    //Mising ; "dmSetup"
508                 "BLLT    sub_FF815FD4\n"                //Mising err_init_task
509                 "BL      sub_FF815B1C\n"
510                 "CMP     R0, #0\n"
511                 "LDRLT   R0, =0xFF815FFC\n"    // "termDriverInit"
512                 "BLLT    sub_FF815FD4\n"          // err_init_task
513                 "LDR     R0, =0xFF81600C\n"   //  "/_term"
514                 "BL      sub_FF815C04\n"          // termDeviceCreate
515                 "CMP     R0, #0\n"
516                 "LDRLT   R0, =0xFF816014\n"   //  "termDeviceCreate"
517                 "BLLT    sub_FF815FD4\n"       // err_init_task
518                 "LDR     R0, =0xFF81600C\n"   //  "/_term"
519                 "BL      sub_FF813CA4\n"
520                 "CMP     R0, #0\n"
521                 "LDRLT   R0, =0xFF816028\n"    // "stdioSetup"
522                 "BLLT    sub_FF815FD4\n"       // err_init_task
523                 "BL      sub_FF819CC4\n"
524                 "CMP     R0, #0\n"
525                 "LDRLT   R0, =0xFF816034\n"    //"stdlibSetup"
526                 "BLLT    sub_FF815FD4\n"       // err_init_task
527                 "BL      sub_FF81167C\n"
528                 "CMP     R0, #0\n"
529                 "LDRLT   R0, =0xFF816040\n"    // "armlib_setup"
530                 "BLLT    sub_FF815FD4\n"       // err_init_task
531                 "LDMFD   SP!, {R4,LR}\n"
532                 "B       taskcreate_Startup_my\n" // ASM1989 -> at FF81FBA8
533                                                                        //---------->
534//copied from s95
535"               MOV     R0, #0 \n"
536"               LDMFD   SP!, {R3-R5,PC} \n"
537
538        );
539};
540
541
542// ASM1989 -> Here starts the diferences with SX200
543
544void __attribute__((naked,noinline)) taskcreate_Startup_my() {
545     asm volatile (
546
547                 "STMFD   SP!, {R3-R5,LR}\n"
548                 "BL      sub_FF8348CC\n"   //j_nullsub_267
549                 "BL      sub_FF83D1D4\n"
550                 "CMP     R0, #0\n"
551
552                "BNE     loc_FF81FBFC\n"
553
554
555                 "BL      sub_FF8370E8\n"
556                 "CMP     R0, #0\n"
557                "BEQ     loc_FF81FBFC\n"
558
559
560                 "LDR     R4, =0xC0220000\n"
561
562
563
564                 "LDR     R0, [R4,#0x120]\n"
565                 "TST     R0, #1\n"
566                                 "MOVEQ   R0, #0x12C\n"
567
568
569
570
571                                "BLEQ    sub_FF83B574\n"   //ASM1989 ->  eventproc_export_SleepTask
572
573
574
575                                "BL      sub_FF8348C8\n"
576                                "CMP     R0, #0\n"
577                                "BNE     loc_FF81FBFC\n"
578                                "BL      sub_FF833F34\n"
579                                "MOV     R0, #0x44\n"
580                                "STR     R0, [R4,#0x1C]\n"
581                                "BL      sub_FF834120\n"
582"loc_FF81FBF8:\n"
583                                "B       loc_FF81FBF8\n"
584
585
586"loc_FF81FBFC:\n"
587                                //"BL      sub_FF8348D4\n" // ASM1989 -> -- replaced for power button startup
588
589                                "BL      sub_FF8348D0\n"//ASM1989 ->  j_nullsub_268
590                                "BL      sub_FF83B3EC\n"
591
592                                "LDR     R1, =0x3CE000\n"
593                                "MOV     R0, #0\n"
594
595                                "BL      sub_FF83B834\n"
596                                "BL      sub_FF83B5E0\n"
597                                "MOV     R3, #0\n"
598
599                                "STR     R3, [SP]\n"
600                                "LDR     R3, =task_Startup_my\n" //  ASM1989 -> original is FF81FAF0  task_Startup   // LDR instead of ADR
601                //---------------->
602
603                                "MOV     R2, #0\n"
604                                "MOV     R1, #0x19\n"
605                                "LDR     R0, =0xFF81FC60\n"  //aStartup  // LDR instead of ADR
606
607
608                                "BL      sub_FF81E8A0\n"  //eventproc_export_CreateTask
609                                "MOV     R0, #0\n"
610                                "LDMFD   SP!, {R3-R5,PC}\n"
611
612
613
614
615     );
616}
617
618// TESTING S95 Code style
619
620
621void __attribute__((naked,noinline)) task_Startup_my() {
622     asm volatile (
623
624                 "STMFD SP!, {R4,LR}\n"
625                                 "BL sub_FF816594\n"  // taskcreate_ClockSave
626                                 "BL sub_FF835A30\n"
627                                 "BL sub_FF833B3C\n"
628                                 "BL sub_FF83D218\n"    //j_nullsub_271
629                                 "BL sub_FF83D404\n"
630//                               "BL sub_FF83D2AC\n" // start diskboot.bin
631                                 "BL sub_FF83D5AC\n"
632                                 "BL sub_FF81648C\n"
633                                 "BL sub_FF836754\n"
634                                 "LDR R1, =0x7C007C00\n"
635                                 "LDR R0, =0xC0F1800C\n"
636                                 "BL sub_FF835A3C\n"
637                                 "LDR R0, =0xC0F18010\n"
638                                 "MOV R1, #0\n"
639                                 "BL sub_FF835A3C\n"
640                                 "LDR R0, =0xC0F18018\n"
641                                 "MOV R1, #0\n"
642                                 "BL sub_FF835A3C\n"
643                                 "LDR R0, =0xC0F1801C\n"
644                                 "MOV R1, #0x1000\n"
645                                 "BL sub_FF835A3C\n"
646                                 "LDR R0, =0xC0F18020\n"
647                                 "MOV R1, #8\n"
648                                 "BL sub_FF835A3C\n"
649                                 "LDR R0, =0xC022D06C\n"
650                                 "MOV R1, #0xE000000\n"
651                                 "BL sub_FF835A3C\n"
652                                 "BL sub_FF8164CC\n"
653                                 "BL sub_FF8324F4\n"
654                                 "BL sub_FF83D434\n"
655                                 "BL sub_FF83AB90\n"
656                                 "BL sub_FF83D5B0\n"
657
658              "BL      CreateTask_spytask\n"    // +
659                                                                //---------------->
660                 "BL sub_FF834788\n"    //taskcreate_PhySw
661);
662
663//                      CreateTask_PhySw();                                     // our keyboard task
664
665//                      CreateTask_spytask();                           // chdk initialization
666
667
668        //                       "BL      CreateTask_spytask\n"    // +
669                                                                    //---------------->
670
671
672   asm volatile (
673                                 "BL sub_FF838CF0\n"
674                                 "BL sub_FF83D5C8\n"
675                                 "BL sub_FF8318F8\n"  //nullsub_2
676                                 "BL sub_FF8334A0\n"
677                                 "BL sub_FF83CF9C\n"  //taskcreate_Bye
678                                 "BL sub_FF833AF0\n"
679                                 "BL sub_FF83343C\n"
680                                 "BL sub_FF832528\n"
681                                 "BL sub_FF83E1D0\n"
682                                 "BL sub_FF8333F8\n"
683                                 "LDMFD SP!, {R4,LR}\n"
684//                               "BL blink\n"
685                                 "B sub_FF8166B4\n"
686     );
687}
688
689
690/*
691void __attribute__((naked,noinline)) CreateTask_PhySw() {
692    asm volatile (
693"               STMFD   SP!, {R3-R5,LR} \n"
694"               LDR     R4, =0x1C34 \n"
695"               LDR     R0, [R4,#0x10] \n"
696"               CMP     R0, #0 \n"
697"               BNE     loc_FF8347BC \n"
698"               MOV     R3, #0 \n"
699"               STR     R3, [SP] \n"
700
701//"             ADR     R3, task_PhySw \n"
702//"             LDR R3, =sub_FF834754 \n"
703//"             MOV     R2, #0x800 \n"
704
705"               LDR     R3, =mykbd_task \n"                             // PhySw Task patch
706"               MOV     R2, #0x2000 \n"                                 // larger stack
707
708"               MOV     R1, #0x17 \n"
709
710//"             ADR     R0, aPhysw \n"
711"               LDR     R0, =0xFF8349DC \n"                             // "PhySw"
712
713"               BL      sub_FF83B634 \n"                                // KernelCreateTask
714"               STR     R0, [R4,#0x10] \n"
715"loc_FF8347BC: \n"
716"               BL      sub_FF863968 \n"
717"               BL      sub_FF8941DC \n"
718"               BL      sub_FF837060 \n"                        //IsFactoryMode
719"               CMP     R0, #0 \n"
720"               LDREQ   R1, =0x34414 \n"
721"               LDMEQFD SP!, {R3-R5,LR} \n"
722"               BEQ     sub_FF894164 \n"                                // eventproc_export_OpLog.Start
723"               LDMFD   SP!, {R3-R5,PC} \n"
724        );
725}
726*/
727
728
729/*----------------------------------------------------------------------
730        JogDial_task_my()
731
732        Patched jog dial task  at FF86363C
733-----------------------------------------------------------------------*/
734void __attribute__((naked,noinline)) JogDial_task_my() {
735        asm volatile (
736"               STMFD   SP!, {R4-R11,LR} \n"
737"               SUB     SP, SP, #0x1C \n"
738"               BL      sub_FF863A68 \n"
739"               LDR     R1, =0x2560 \n"
740"               LDR     R6, =0xFFB8D5F0 \n"
741"               MOV     R0, #0 \n"
742"               ADD     R3, SP, #0x10 \n"
743"               ADD     R12, SP, #0x14 \n"
744"               ADD     R10, SP, #0x08 \n"
745"               MOV     R2, #0 \n"
746"               ADD     R9, SP, #0xC \n"
747
748"loc_FF863668: \n"
749"               ADD     R12, SP, #0x14 \n"
750"               ADD     LR, R12, R0,LSL#1 \n"
751"               MOV     R2, #0 \n"
752"               ADD     R3, SP, #0x10 \n"
753"               STRH    R2, [LR] \n"
754"               ADD     LR, R3, R0,LSL#1 \n"
755"               STRH    R2, [LR] \n"
756"               STR     R2, [R9,R0,LSL#2] \n"
757"               STR     R2, [R10,R0,LSL#2] \n"
758"               ADD     R0, R0, #1 \n"
759"               CMP     R0, #2 \n"
760"               BLT     loc_FF863668 \n"
761
762"loc_FF863698: \n"
763"               LDR     R0, =0x2560 \n"
764"               MOV     R2, #0 \n"
765"               LDR     R0, [R0,#0xC] \n"
766"               MOV     R1, SP \n"
767"               BL      sub_FF83AE20 \n"
768"               CMP     R0, #0 \n"
769"               LDRNE   R1, =0x262 \n"
770
771//"             ADRNE   R0, 0xFF8638F8 \n"                      // "RotaryEncoder.c"
772"               LDRNE   R0, =0xFF8638F8 \n"                     // "RotaryEncoder.c"
773
774"               BLNE    sub_FF81EB78 \n"                        // DebugAssert
775
776//------------------  begin added code ---------------
777"labelA:\n"
778                "LDR     R0, =jogdial_stopped\n"
779                "LDR     R0, [R0]\n"
780                "CMP     R0, #1\n"
781                "BNE     labelB\n"                                      // continue on if jogdial_stopped = 0
782                "MOV     R0, #40\n"
783                "BL      _SleepTask\n"                          // jogdial_stopped=1 -- give time back to OS and suspend jogdial task
784                "B       labelA\n"
785"labelB:\n"
786//------------------  end added code -----------------
787
788"               LDR     R0, [SP] \n"
789"               AND     R4, R0, #0xFF \n"
790"               AND     R0, R0, #0xFF00 \n"
791"               CMP     R0, #0x100 \n"
792"               BEQ     loc_FF863708 \n"
793"               CMP     R0, #0x200 \n"
794"               BEQ     loc_FF863740 \n"
795"               CMP     R0, #0x300 \n"
796"               BEQ     loc_FF863938 \n"
797"               CMP     R0, #0x400 \n"
798"               BNE     loc_FF863698 \n"
799"               CMP     R4, #0 \n"
800"               LDRNE   R1, =0x2ED \n"
801
802//"             ADRNE   R0, 0xFF8638F8 \n"                      // "RotaryEncoder.c"
803"               LDRNE   R0, =0xFF8638F8 \n"                     // "RotaryEncoder.c"
804
805"               BLNE    sub_FF81EB78 \n"                        // DebugAssert
806"               RSB     R0, R4, R4,LSL#3 \n"
807"               LDR     R0, [R6,R0,LSL#2] \n"
808
809"loc_FF863700: \n"
810"               BL      sub_FF863A40 \n"
811"               B       loc_FF863698 \n"
812
813"loc_FF863708: \n"
814"               LDR     R7, =0x2570 \n"
815"               LDR     R0, [R7,R4,LSL#2] \n"
816"               BL      sub_FF83BDB8 \n"
817
818//"             ADR     R2, 0xFF863588 \n"
819"               LDR     R2, =0xFF863588 \n"
820
821"               ADD     R1, R2, #0 \n"
822"               ORR     R3, R4, #0x200 \n"
823"               MOV     R0, #0x28 \n"
824"               BL      sub_FF83BCD4 \n"
825"               TST     R0, #1 \n"
826"               CMPNE   R0, #0x15 \n"
827"               STR     R0, [R10,R4,LSL#2] \n"
828"               BEQ     loc_FF863698 \n"
829"               MOV     R1, #0x274 \n"
830"               B       loc_FF8638E4 \n"
831
832"loc_FF863740: \n"
833"               RSB     R5, R4, R4,LSL#3 \n"
834"               LDR     R0, [R6,R5,LSL#2] \n"
835"               LDR     R1, =0xC0240104 \n"
836"               LDR     R0, [R1,R0,LSL#8] \n"
837"               MOV     R2, R0,ASR#16 \n"
838"               ADD     R0, SP, #0x14 \n"
839"               ADD     R0, R0, R4,LSL#1 \n"
840"               STR     R0, [SP,#0x18] \n"
841"               STRH    R2, [R0] \n"
842"               ADD     R0, SP, #0x10 \n"
843"               ADD     R11, R0, R4,LSL#1 \n"
844"               LDRSH   R3, [R11] \n"
845"               SUB     R0, R2, R3 \n"
846"               CMP     R0, #0 \n"
847"               BNE     loc_FF8637C0 \n"
848"               LDR     R0, [R9,R4,LSL#2] \n"
849"               CMP     R0, #0 \n"
850"               BEQ     loc_FF8638A0 \n"
851"               LDR     R7, =0x2570 \n"
852"               LDR     R0, [R7,R4,LSL#2] \n"
853"               BL      sub_FF83BDB8 \n"
854
855//"             ADR     R2, 0xFF863594 \n"
856"               LDR     R2, =0xFF863594 \n"
857
858"               ADD     R1, R2, #0 \n"
859"               ORR     R3, R4, #0x300 \n"
860"               MOV     R0, #0x1F4 \n"
861"               BL      sub_FF83BCD4 \n"
862"               TST     R0, #1 \n"
863"               CMPNE   R0, #0x15 \n"
864"               STR     R0, [R7,R4,LSL#2] \n"
865"               BEQ     loc_FF8638A0 \n"
866"               LDR     R1, =0x28D \n"
867"               B       loc_FF863898 \n"
868
869"loc_FF8637C0: \n"
870"               MOV     R1, R0 \n"
871"               RSBLT   R0, R0, #0 \n"
872"               MOVLE   R7, #0 \n"
873"               MOVGT   R7, #1 \n"
874"               CMP     R0, #0xFF \n"
875"               BLS     loc_FF863800 \n"
876"               CMP     R1, #0 \n"
877"               RSBLE   R0, R3, #0xFF \n"
878"               ADDLE   R0, R0, #0x7F00 \n"
879"               ADDLE   R0, R0, R2 \n"
880"               RSBGT   R0, R2, #0xFF \n"
881"               ADDGT   R0, R0, #0x7F00 \n"
882"               ADDGT   R0, R0, R3 \n"
883"               ADD     R0, R0, #0x8000 \n"
884"               ADD     R0, R0, #1 \n"
885"               EOR     R7, R7, #1 \n"
886
887"loc_FF863800: \n"
888"               STR     R0, [SP,#0x04] \n"
889"               LDR     R0, [R9,R4,LSL#2] \n"
890"               CMP     R0, #0 \n"
891"               ADDEQ   R0, R6, R5,LSL#2 \n"
892"               LDREQ   R0, [R0,#8] \n"
893"               BEQ     loc_FF863838 \n"
894"               ADD     R8, R6, R5,LSL#2 \n"
895"               ADD     R1, R8, R7,LSL#2 \n"
896"               LDR     R1, [R1,#0x10] \n"
897"               CMP     R1, R0 \n"
898"               BEQ     loc_FF86383C \n"
899"               LDR     R0, [R8,#0xC] \n"
900"               BL      sub_FF89C2E4 \n"
901"               LDR     R0, [R8,#8] \n"
902
903"loc_FF863838: \n"
904"               BL      sub_FF89C2E4 \n"
905
906"loc_FF86383C: \n"
907"               ADD     R0, R6, R5,LSL#2 \n"
908"               ADD     R7, R0, R7,LSL#2 \n"
909"               LDR     R0, [R7,#0x10] \n"
910"               LDR     R1, [SP,#0x04] \n"
911"               BL      sub_FF89C20C \n"
912"               LDR     R0, [R7,#0x10] \n"
913"               LDR     R7, =0x2570 \n"
914"               STR     R0, [R9,R4,LSL#2] \n"
915"               LDR     R0, [SP,#0x18] \n"
916"               LDRH    R0, [R0] \n"
917"               STRH    R0, [R11] \n"
918"               LDR     R0, [R7,R4,LSL#2] \n"
919"               BL      sub_FF83BDB8 \n"
920
921//"             ADR     R2, 0xFF863594 \n"
922"               LDR     R2, =0xFF863594 \n"
923
924"               ADD     R1, R2, #0 \n"
925"               ORR     R3, R4, #0x300 \n"
926"               MOV     R0, #0x1F4 \n"
927"               BL      sub_FF83BCD4 \n"
928"               TST     R0, #1 \n"
929"               CMPNE   R0, #0x15 \n"
930"               STR     R0, [R7,R4,LSL#2] \n"
931"               BEQ     loc_FF8638A0 \n"
932"               LDR     R1, =0x2CF \n"
933
934"loc_FF863898: \n"
935//"             ADR     R0, 0xFF8638F8 \n"                      // "RotaryEncoder.c"
936"               LDR     R0, =0xFF8638F8 \n"                     // "RotaryEncoder.c"
937
938"               BL      sub_FF81EB78 \n"                        // DebugAssert
939
940"loc_FF8638A0: \n"
941"               ADD     R0, R6, R5,LSL#2 \n"
942"               LDR     R0, [R0,#0x18] \n"
943"               CMP     R0, #1 \n"
944"               BNE     loc_FF863930 \n"
945"               LDR     R0, =0x2560 \n"
946"               LDR     R0, [R0,#0x14] \n"
947"               CMP     R0, #0 \n"
948"               BEQ     loc_FF863930 \n"
949
950//"             ADR     R2, 0xFF863588 \n"
951"               LDR     R2, =0xFF863588 \n"
952
953"               ADD     R1, R2, #0 \n"
954"               ORR     R3, R4, #0x400 \n"
955"               BL      sub_FF83BCD4 \n"
956"               TST     R0, #1 \n"
957"               CMPNE   R0, #0x15 \n"
958"               STR     R0, [R10,R4,LSL#2] \n"
959"               BEQ     loc_FF863698 \n"
960"               LDR     R1, =0x2D6 \n"
961
962"loc_FF8638E4: \n"
963//"             ADR     R0, 0xFF8638F8 \n"                      // "RotaryEncoder.c"
964"               LDR     R0, =0xFF8638F8 \n"                     // "RotaryEncoder.c"
965
966"               BL      sub_FF81EB78 \n"                        // DebugAssert
967"               B       loc_FF863698 \n"
968
969                "NOP \n"
970
971
972"loc_FF863930: \n"
973"               LDR     R0, [R6,R5,LSL#2] \n"
974"               B       loc_FF863700 \n"
975
976"loc_FF863938: \n"
977"               LDR     R0, [R9,R4,LSL#2] \n"
978"               CMP     R0, #0 \n"
979"               MOVEQ   R1, #0x2E0 \n"
980
981//"             ADREQ   R0, 0xFF8638F8 \n"                      // "RotaryEncoder.c"
982"               LDREQ   R0, =0xFF8638F8 \n"                     // "RotaryEncoder.c"
983
984"               BLEQ    sub_FF81EB78 \n"                        // DebugAssert
985"               RSB     R0, R4, R4,LSL#3 \n"
986"               ADD     R0, R6, R0,LSL#2 \n"
987"               LDR     R0, [R0,#0xC] \n"
988"               BL      sub_FF89C2E4 \n"
989"               MOV     R2, #0 \n"
990"               STR     R2, [R9,R4,LSL#2] \n"
991"               B       loc_FF863698 \n"
992 );
993};
994
995
996//FILE INIT STUFF
997void __attribute__((naked,noinline)) init_file_modules_task() {
998 asm volatile(
999         "STMFD   SP!, {R4-R6,LR}\n"
1000         "BL      sub_FF896688\n"
1001         "LDR     R5, =0x5006\n"
1002         "MOVS    R4, R0\n"
1003         "MOVNE   R1, #0\n"
1004         "MOVNE   R0, R5\n"
1005         "BLNE    sub_FF89A464\n"  //PostLogicalEventToUI
1006//       "BL      sub_FF8966B4\n"
1007         "BL      sub_FF8966B4_my\n"
1008         //----------------------->
1009     "BL      core_spytask_can_start\n" // + safe to start spytask
1010         "CMP     R4, #0\n"
1011         "MOVEQ   R0, R5\n"
1012         "LDMEQFD SP!, {R4-R6,LR}\n"
1013         "MOVEQ   R1, #0\n"
1014         "BEQ    sub_FF89A464\n"  //PostLogicalEventToUI
1015         "LDMFD   SP!, {R4-R6,PC}\n"
1016         );
1017};
1018
1019void __attribute__((naked,noinline)) sub_FF8966B4_my() {
1020 asm volatile(
1021         "STMFD   SP!, {R4,LR}\n"
1022         "MOV     R0, #3\n"
1023//       "BL      sub_FF87538C\n"         //__Mounter.c__0
1024         "BL      sub_FF87538C_my\n"      //__Mounter.c__0
1025
1026         "B       sub_FF8966C0\n" // continue in firmware
1027         );
1028};
1029
1030void __attribute__((naked,noinline)) sub_FF87538C_my() {
1031 asm volatile(
1032                 "STMFD   SP!, {R4-R8,LR}\n"
1033                 "MOV     R8, R0\n"
1034                 "BL      sub_FF87530C\n" //__Mounter.c__0
1035                 "LDR     R1, =0x3A068\n"
1036                 "MOV     R6, R0\n"
1037                 "ADD     R4, R1, R0,LSL#7\n"
1038                 "LDR     R0, [R4,#0x6C]\n"
1039                 "CMP     R0, #4\n"
1040                 "LDREQ   R1, =0x83F\n"
1041                 "LDREQ   R0, =0xFF874E4C\n" //aMounter_c
1042                 "BLEQ    sub_FF81EB78\n"  //DebugAssert
1043                 "MOV     R1, R8\n"
1044                 "MOV     R0, R6\n"
1045                 "BL      sub_FF874BC0\n"
1046                 "LDR     R0, [R4,#0x38]\n"
1047                 "BL      sub_FF875A30\n"
1048                 "CMP     R0, #0\n"
1049                 "STREQ   R0, [R4,#0x6C]\n"
1050                 "MOV     R0, R6\n"
1051                 "BL      sub_FF874C50\n"
1052                 "MOV     R0, R6\n"
1053//               "BL      sub_FF874FB4\n"
1054                 "BL      sub_FF874FB4_my\n"
1055                 //------------------->
1056                 "B       sub_FF8753E4 \n" //continue in firmware
1057                 );
1058
1059         };
1060void __attribute__((naked,noinline)) sub_FF874FB4_my() {
1061 asm volatile(
1062                         "STMFD   SP!, {R4-R6,LR}\n"
1063                         "MOV     R5, R0\n"
1064                         "LDR     R0, =0x3A068\n"
1065                         "ADD     R4, R0, R5,LSL#7\n"
1066                         "LDR     R0, [R4,#0x6C]\n"
1067                         "TST     R0, #2\n"
1068                         "MOVNE   R0, #1\n"
1069                         "LDMNEFD SP!, {R4-R6,PC}\n"
1070                         "LDR     R0, [R4,#0x38]\n"
1071                         "MOV     R1, R5\n"
1072//                       "BL      sub_FF874CD4\n"
1073                         "BL      sub_FF874CD4_my\n"
1074                                    //------------------->
1075
1076             "B      sub_FF874FE0\n"  //continue in firmware
1077
1078                         );
1079
1080         };
1081
1082void __attribute__((naked,noinline)) sub_FF874CD4_my() {
1083 asm volatile(
1084         "              STMFD   SP!, {R4-R10,LR}\n"
1085         "              MOV     R9, R0\n"
1086         "              LDR     R0, =0x3A068\n"
1087         "              MOV     R8, #0\n"
1088         "              ADD     R5, R0, R1,LSL#7\n"
1089         "              LDR     R0, [R5,#0x3C]\n"
1090         "              MOV     R7, #0\n"
1091         "              CMP     R0, #7\n"
1092         "              MOV     R6, #0\n"
1093         "              ADDLS   PC, PC, R0,LSL#2\n"
1094         "              B       loc_FF874E2C\n"
1095         "loc_FF874D00:\n"
1096         "              B       loc_FF874D38\n"
1097         "loc_FF874D04:\n"
1098         "              B       loc_FF874D20\n"
1099         "loc_FF874D08:\n"
1100         "              B       loc_FF874D20\n"
1101         "loc_FF874D0C:\n"
1102         "              B       loc_FF874D20\n"
1103         "loc_FF874D10:\n"
1104         "              B       loc_FF874D20\n"
1105         "loc_FF874D14:\n"
1106         "              B       loc_FF874E24\n"
1107         "loc_FF874D18:\n"
1108         "              B       loc_FF874D20\n"
1109         "loc_FF874D1C:\n"
1110         "              B       loc_FF874D20\n"
1111"loc_FF874D20:\n"
1112         "              MOV     R2, #0\n"
1113         "              MOV     R1, #0x200\n"
1114         "              MOV     R0, #2\n"
1115         "              BL      sub_FF890738\n"
1116         "              MOVS    R4, R0\n"
1117         "              BNE     loc_FF874D40\n"
1118"loc_FF874D38:\n"
1119         "              MOV     R0, #0\n"
1120         "              LDMFD   SP!, {R4-R10,PC}\n"
1121"loc_FF874D40:\n"
1122         "              LDR     R12, [R5,#0x50]\n"
1123         "              MOV     R3, R4\n"
1124         "              MOV     R2, #1\n"
1125         "              MOV     R1, #0\n"
1126         "              MOV     R0, R9\n"
1127         "              BLX     R12\n"
1128         "              CMP     R0, #1\n"
1129         "              BNE     loc_FF874D6C\n"
1130         "              MOV     R0, #2\n"
1131         "              BL      sub_FF890888\n" //__ExMemMan.c__0 ; LOCATION: ExMemMan.c:0
1132         "              B       loc_FF874D38\n"
1133"loc_FF874D6C:\n"
1134         "              LDR     R1, [R5,#0x64]\n"
1135         "              MOV     R0, R9\n"
1136         "              BLX     R1\n"
1137//Allready inserted code
1138
1139                 "MOV   R1, R4\n"           //  pointer to MBR in R1
1140                 "BL    mbr_read_dryos\n"   //  total sectors count in R0 before and after call
1141
1142        // Start of DataGhost's FAT32 autodetection code
1143          // Policy: If there is a partition which has type W95 FAT32, use the first one of those for image storage
1144          // According to the code below, we can use R1, R2, R3 and R12.
1145          // LR wasn't really used anywhere but for storing a part of the partition signature. This is the only thing
1146          // that won't work with an offset, but since we can load from LR+offset into LR, we can use this to do that :)
1147          "MOV     R12, R4\n"                    // Copy the MBR start address so we have something to work with
1148          "MOV     LR, R4\n"                     // Save old offset for MBR signature
1149          "MOV     R1, #1\n"                     // Note the current partition number
1150          "B       dg_sd_fat32_enter\n"          // We actually need to check the first partition as well, no increments yet!
1151     "dg_sd_fat32:\n"
1152          "CMP     R1, #4\n"                     // Did we already see the 4th partition?
1153          "BEQ     dg_sd_fat32_end\n"            // Yes, break. We didn't find anything, so don't change anything.
1154          "ADD     R12, R12, #0x10\n"            // Second partition
1155          "ADD     R1, R1, #1\n"                 // Second partition for the loop
1156     "dg_sd_fat32_enter:\n"
1157          "LDRB    R2, [R12, #0x1BE]\n"          // Partition status
1158          "LDRB    R3, [R12, #0x1C2]\n"          // Partition type (FAT32 = 0xB)
1159          "CMP     R3, #0xB\n"                   // Is this a FAT32 partition?
1160          "CMPNE   R3, #0xC\n"                   // Not 0xB, is it 0xC (FAT32 LBA) then?
1161          "BNE     dg_sd_fat32\n"                // No, it isn't. Loop again.
1162          "CMP     R2, #0x00\n"                  // It is, check the validity of the partition type
1163          "CMPNE   R2, #0x80\n"
1164          "BNE     dg_sd_fat32\n"                // Invalid, go to next partition
1165                                                 // This partition is valid, it's the first one, bingo!
1166          "MOV     R4, R12\n"                    // Move the new MBR offset for the partition detection.
1167
1168     "dg_sd_fat32_end:\n"
1169          // End of DataGhost's FAT32 autodetection code
1170
1171
1172
1173
1174
1175         "              LDRB    R1, [R4,#0x1C9]\n"
1176         "              LDRB    R3, [R4,#0x1C8]\n"
1177         "              LDRB    R12, [R4,#0x1CC]\n"
1178         "              MOV     R1, R1,LSL#24\n"
1179         "              ORR     R1, R1, R3,LSL#16\n"
1180         "              LDRB    R3, [R4,#0x1C7]\n"
1181         "              LDRB    R2, [R4,#0x1BE]\n"
1182         //"            LDRB    LR, [R4,#0x1FF]\n"     //remains commented as in sx200
1183         "              ORR     R1, R1, R3,LSL#8\n"
1184         "              LDRB    R3, [R4,#0x1C6]\n"
1185         "              CMP     R2, #0\n"
1186         "              CMPNE   R2, #0x80\n"
1187         "              ORR     R1, R1, R3\n"
1188         "              LDRB    R3, [R4,#0x1CD]\n"
1189         "              MOV     R3, R3,LSL#24\n"
1190         "              ORR     R3, R3, R12,LSL#16\n"
1191         "              LDRB    R12, [R4,#0x1CB]\n"
1192         "              ORR     R3, R3, R12,LSL#8\n"
1193         "              LDRB    R12, [R4,#0x1CA]\n"
1194         "              ORR     R3, R3, R12\n"
1195         //"            LDRB    R12, [R4,#0x1FE]\n"    //remains commented as in sx200
1196     // Left as in sx200
1197             "LDRB    R12, [LR,#0x1FE]\n"           // + First MBR signature byte (0x55), LR is original offset.
1198             "LDRB    LR, [LR,#0x1FF]\n"            // + Last MBR signature byte (0xAA), LR is original offset.
1199
1200
1201         "              BNE     loc_FF874DF8\n"
1202         "              CMP     R0, R1\n"
1203         "              BCC     loc_FF874DF8\n"
1204         "              ADD     R2, R1, R3\n"
1205         "              CMP     R2, R0\n"
1206         "              CMPLS   R12, #0x55\n"
1207         "              CMPEQ   LR, #0xAA\n"
1208         "              MOVEQ   R7, R1\n"
1209         "              MOVEQ   R6, R3\n"
1210         "              MOVEQ   R4, #1\n"
1211         "              BEQ     loc_FF874DFC\n"
1212"loc_FF874DF8:\n"
1213         "              MOV     R4, R8\n"
1214"loc_FF874DFC:\n"
1215         "              MOV     R0, #2\n"
1216         "              BL      sub_FF890888\n" //__ExMemMan.c__0 ; LOCATION: ExMemMan.c:0
1217         "              CMP     R4, #0\n"
1218         "              BNE     loc_FF874E38\n"
1219         "              LDR     R1, [R5,#0x64]\n"
1220         "              MOV     R7, #0\n"
1221         "              MOV     R0, R9\n"
1222         "              BLX     R1\n"
1223         "              MOV     R6, R0\n"
1224         "              B       loc_FF874E38\n"
1225"loc_FF874E24:\n"
1226         "              MOV     R6, #0x40\n"
1227         "              B       loc_FF874E38\n"
1228"loc_FF874E2C:\n"
1229         "              LDR     R1, =0x597\n"
1230         "              LDR     R0, =0xFF874E4C\n" //aMounter_c ; Mounter.c
1231         "              BL      sub_FF81EB78\n" //DebugAssert
1232
1233"loc_FF874E38:\n"
1234         "              STR     R7, [R5,#0x44]!\n"
1235         "              STMIB   R5, {R6,R8}\n"
1236         "              MOV     R0, #1\n"
1237"               LDMFD   SP!, {R4-R10,PC}\n"
1238
1239                  );
1240
1241                 };
Note: See TracBrowser for help on using the repository browser.