source: trunk/platform/a495/sub/100f/boot.c @ 1198

Revision 1198, 18.6 KB checked in by msl, 2 years ago (diff)

CHDK support for A495

+ Added support for A495 1.00d, 1.00e & 1.00f http://chdk.setepontos.com/index.php?topic=650.msg68027#msg68027

Line 
1#include "lolevel.h"
2#include "platform.h"
3#include "core.h"
4#include "dryos31.h"
5
6#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
7
8const char * const new_sa = &_end;
9
10void taskHook(context_t **context) {
11        task_t *tcb=(task_t*)((char*)context-offsetof(task_t, context));
12
13        if(!_strcmp(tcb->name, "PhySw"))           tcb->entry = (void*)mykbd_task;
14        if(!_strcmp(tcb->name, "CaptSeqTask"))     tcb->entry = (void*)capt_seq_task;
15        if(!_strcmp(tcb->name, "InitFileModules")) tcb->entry = (void*)init_file_modules_task;
16        if(!_strcmp(tcb->name, "MovieRecord"))     tcb->entry = (void*)movie_record_task;
17        if(!_strcmp(tcb->name, "ExpDrvTask"))      tcb->entry = (void*)exp_drv_task;
18}
19
20void CreateTask_spytask() {
21        _CreateTask("SpyTask", 0x19, 0x2000, core_spytask, 0);
22};
23
24
25void __attribute__((naked,noinline)) boot() {
26        asm volatile (
27                        /*// LED Test
28                        "LDR     R1, =0xC0220088\n"     // Green LED
29                        "MOV     R0, #0x46\n"                   // Power on LED
30                        "STR     R0, [R1]\n"
31                        // End LED Test*/
32
33                        "LDR     R1, =0xC0410000\n"
34                        "MOV     R0, #0\n"
35                        "STR     R0, [R1]\n"
36                        "MOV     R1, #0x78\n"
37                        "MCR     p15, 0, R1,c1,c0\n"
38                        "MOV     R1, #0\n"
39                        "MCR     p15, 0, R1,c7,c10, 4\n"
40                        "MCR     p15, 0, R1,c7,c5\n"
41                        "MCR     p15, 0, R1,c7,c6\n"
42                        "MOV     R0, #0x3D\n"
43                        "MCR     p15, 0, R0,c6,c0\n"
44                        "MOV     R0, #0xC000002F\n"
45                        "MCR     p15, 0, R0,c6,c1\n"
46                        "MOV     R0, #0x31\n"
47                        "MCR     p15, 0, R0,c6,c2\n"
48                        "LDR     R0, =0x10000031\n"
49                        "MCR     p15, 0, R0,c6,c3\n"
50                        "MOV     R0, #0x40000017\n"
51                        "MCR     p15, 0, R0,c6,c4\n"
52                        "LDR     R0, =0xFFC0002B\n"
53                        "MCR     p15, 0, R0,c6,c5\n"
54                        "MOV     R0, #0x34\n"
55                        "MCR     p15, 0, R0,c2,c0\n"
56                        "MOV     R0, #0x34\n"
57                        "MCR     p15, 0, R0,c2,c0, 1\n"
58                        "MOV     R0, #0x34\n"
59                        "MCR     p15, 0, R0,c3,c0\n"
60                        "LDR     R0, =0x3333330\n"
61                        "MCR     p15, 0, R0,c5,c0, 2\n"
62                        "LDR     R0, =0x3333330\n"
63                        "MCR     p15, 0, R0,c5,c0, 3\n"
64                        "MRC     p15, 0, R0,c1,c0\n"
65                        "ORR     R0, R0, #0x1000\n"
66                        "ORR     R0, R0, #4\n"
67                        "ORR     R0, R0, #1\n"
68                        "MCR     p15, 0, R0,c1,c0\n"
69                        "MOV     R1, #0x40000006\n"
70                        "MCR     p15, 0, R1,c9,c1\n"
71                        "MOV     R1, #6\n"
72                        "MCR     p15, 0, R1,c9,c1, 1\n"
73                        "MRC     p15, 0, R1,c1,c0\n"
74                        "ORR     R1, R1, #0x50000\n"
75                        "MCR     p15, 0, R1,c1,c0\n"
76                        "LDR     R2, =0xC0200000\n"
77                        "MOV     R1, #1\n"
78                        "STR     R1, [R2,#0x10C]\n"
79                        "MOV     R1, #0xFF\n"
80                        "STR     R1, [R2,#0xC]\n"
81                        "STR     R1, [R2,#0x1C]\n"
82                        "STR     R1, [R2,#0x2C]\n"
83                        "STR     R1, [R2,#0x3C]\n"
84                        "STR     R1, [R2,#0x4C]\n"
85                        "STR     R1, [R2,#0x5C]\n"
86                        "STR     R1, [R2,#0x6C]\n"
87                        "STR     R1, [R2,#0x7C]\n"
88                        "STR     R1, [R2,#0x8C]\n"
89                        "STR     R1, [R2,#0x9C]\n"
90                        "STR     R1, [R2,#0xAC]\n"
91                        "STR     R1, [R2,#0xBC]\n"
92                        "STR     R1, [R2,#0xCC]\n"
93                        "STR     R1, [R2,#0xDC]\n"
94                        "STR     R1, [R2,#0xEC]\n"
95                        "STR     R1, [R2,#0xFC]\n"
96                        "LDR     R1, =0xC0400008\n"
97                        "LDR     R2, =0x430005\n"
98                        "STR     R2, [R1]\n"
99                        "MOV     R1, #1\n"
100                        "LDR     R2, =0xC0243100\n"
101                        "STR     R2, [R1]\n"
102                        "LDR     R2, =0xC0242010\n"
103                        "LDR     R1, [R2]\n"
104                        "ORR     R1, R1, #1\n"
105                        "STR     R1, [R2]\n"
106                        "LDR     R0, =0xFFEEB810\n"
107                        "LDR     R1, =0x1900\n"
108                        "LDR     R3, =0xABA4\n"
109"loc_FFC0013C:\n"
110                        "CMP     R1, R3\n"
111                        "LDRCC   R2, [R0],#4\n"
112                        "STRCC   R2, [R1],#4\n"
113                        "BCC     loc_FFC0013C\n"
114                        "LDR     R1, =0x128E90\n"
115                        "MOV     R2, #0\n"
116"loc_FFC00154:\n"
117                        "CMP     R3, R1\n"
118                        "STRCC   R2, [R3],#4\n"
119                        "BCC     loc_FFC00154\n"
120                        "B       sub_FFC00358_my\n"  //--------->
121        );
122};
123
124
125void __attribute__((naked,noinline)) sub_FFC00358_my() {
126        *(int*)0x1934=(int)taskHook;    // ?
127        *(int*)0x1938=(int)taskHook;    // ?
128
129        // "correct power on" is to start in record mode if the power button is held down, on cameras that can start with play or power button. Otherwise CHDK always starts in play mode.
130        *(int*)(0x20F8)= (*(int*)0xC022005C) & 1 ? 0x4000000 : 0x2000000; // replacement of sub_FFC42F30 for correct power-on.
131       
132asm volatile (
133                        "LDR     R0, =0xFFC003D0\n"
134                        "MOV     R1, #0\n"
135                        "LDR     R3, =0xFFC00408\n"
136"loc_FFC00364:\n"
137                        "CMP     R0, R3\n"
138                        "LDRCC   R2, [R0],#4\n"
139                        "STRCC   R2, [R1],#4\n"
140                        "BCC     loc_FFC00364\n"
141                        "LDR     R0, =0xFFC00408\n"
142                        "MOV     R1, #0x4B0\n"
143                        "LDR     R3, =0xFFC0061C\n"
144"loc_FFC00380:\n"
145                        "CMP     R0, R3\n"
146                        "LDRCC   R2, [R0],#4\n"
147                        "STRCC   R2, [R1],#4\n"
148                        "BCC     loc_FFC00380\n"
149                        "MOV     R0, #0xD2\n"
150                        "MSR     CPSR_cxsf, R0\n"
151                        "MOV     SP, #0x1000\n"
152                        "MOV     R0, #0xD3\n"
153                        "MSR     CPSR_cxsf, R0\n"
154                        "MOV     SP, #0x1000\n"
155                        "LDR     R0, =0x6C4\n"
156                        "LDR     R2, =0xEEEEEEEE\n"
157                        "MOV     R3, #0x1000\n"
158"loc_FFC003B4:\n"
159                        "CMP     R0, R3\n"
160                        "STRCC   R2, [R0],#4\n"
161                        "BCC     loc_FFC003B4\n"
162                        "BL      sub_FFC0119C_my\n" //-------->
163        );
164}
165
166void __attribute__((naked,noinline)) sub_FFC0119C_my() {
167        asm volatile (
168                        "STR     LR, [SP,#-4]!\n"
169                        "SUB     SP, SP, #0x74\n"
170                        "MOV     R0, SP\n"
171                        "MOV     R1, #0x74\n"
172                        "BL      sub_FFE81080\n"
173                        "MOV     R0, #0x53000\n"
174                        "STR     R0, [SP,#4]\n"
175                        //    "LDR     R0, =0x128E90\n"                 // -
176                        "LDR     R0, =new_sa\n"                         // +
177                        "LDR     R0, [R0]\n"                            // +
178                        "LDR     R2, =0x279C00\n"
179                        "LDR     R1, =0x2724A8\n"
180                        "STR     R0, [SP,#8]\n"
181                        "SUB     R0, R1, R0\n"
182                        "ADD     R3, SP, #0xC\n"
183                        "STR     R2, [SP]\n"
184                        "STMIA   R3, {R0-R2}\n"
185                        "MOV     R0, #0x22\n"
186                        "STR     R0, [SP,#0x18]\n"
187                        "MOV     R0, #0x68\n"
188                        "STR     R0, [SP,#0x1C]\n"
189                        "LDR     R0, =0x19B\n"
190                        "LDR     R1, =sub_FFC05E5C_my\n"        //--------->
191                        "STR     R0, [SP,#0x20]\n"
192                        "MOV     R0, #0x96\n"
193                        "STR     R0, [SP,#0x24]\n"
194                        "MOV     R0, #0x78\n"
195                        "STR     R0, [SP,#0x28]\n"
196                        "MOV     R0, #0x64\n"
197                        "STR     R0, [SP,#0x2C]\n"
198                        "MOV     R0, #0\n"
199                        "STR     R0, [SP,#0x30]\n"
200                        "STR     R0, [SP,#0x34]\n"
201                        "MOV     R0, #0x10\n"
202                        "STR     R0, [SP,#0x5C]\n"
203                        "MOV     R0, #0x800\n"
204                        "STR     R0, [SP,#0x60]\n"
205                        "MOV     R0, #0xA0\n"
206                        "STR     R0, [SP,#0x64]\n"
207                        "MOV     R0, #0x280\n"
208                        "STR     R0, [SP,#0x68]\n"
209                        "MOV     R0, SP\n"
210                        "MOV     R2, #0\n"
211                        "BL      sub_FFC03408\n"
212                        "ADD     SP, SP, #0x74\n"
213                        "LDR     PC, [SP],#4\n"
214        );
215}
216
217
218void __attribute__((naked,noinline)) sub_FFC05E5C_my() {
219        asm volatile (
220                        "STMFD   SP!, {R4,LR}\n"
221                        "BL      sub_FFC00B24\n"
222                        "BL      sub_FFC0A8D0\n"
223                        "CMP     R0, #0\n"
224                        "LDRLT   R0, =0xFFC05F70\n"
225                        "BLLT    sub_FFC05F50\n"
226                        "BL      sub_FFC05A98\n"
227                        "CMP     R0, #0\n"
228                        "LDRLT   R0, =0xFFC05F78\n"
229                        "BLLT    sub_FFC05F50\n"
230                        "LDR     R0, =0xFFC05F88\n"
231                        "BL      sub_FFC05B80\n"
232                        "CMP     R0, #0\n"
233                        "LDRLT   R0, =0xFFC05F90\n"
234                        "BLLT    sub_FFC05F50\n"
235                        "LDR     R0, =0xFFC05F88\n"
236                        "BL      sub_FFC03BF4\n"
237                        "CMP     R0, #0\n"
238                        "LDRLT   R0, =0xFFC05FA4\n"
239                        "BLLT    sub_FFC05F50\n"
240                        "BL      sub_FFC0A2C8\n"
241                        "CMP     R0, #0\n"
242                        "LDRLT   R0, =0xFFC05FB0\n"
243                        "BLLT    sub_FFC05F50\n"
244                        "BL      sub_FFC01680\n"
245                        "CMP     R0, #0\n"
246                        "LDRLT   R0, =0xFFC05FBC\n"
247                        "BLLT    sub_FFC05F50\n"
248                        "LDMFD   SP!, {R4,LR}\n"
249                        "B       taskcreate_Startup_my\n" //-------->
250        );
251};
252
253
254void __attribute__((naked,noinline)) taskcreate_Startup_my() {
255        asm volatile (
256                        "STMFD   SP!, {R3,LR}\n"
257                        //  "BL      j_nullsub_192\n"
258                        "BL      sub_FFC2ABA4\n"
259                        "CMP     R0, #0\n"
260                        "BNE     loc_FFC10690\n"
261                        "BL      sub_FFC250BC\n"
262                        "CMP     R0, #0\n"
263                        "BEQ     loc_FFC10690\n"
264                        "BL      sub_FFC238CC\n"
265                        "CMP     R0, #0\n"
266                        "BNE     loc_FFC10690\n"
267                        "LDR     R1, =0xC0220000\n"
268                        "MOV     R0, #0x44\n"
269                        "STR     R0, [R1,#0x20]\n"
270"loc_FFC1068C:\n"
271                        "B       loc_FFC1068C\n"
272"loc_FFC10690:\n"
273                        //  "BL      sub_FFC238D8\n"                    // removed for correct power-on on 'on/off' button.
274                        //  "BL      j_nullsub_193\n"
275                        "BL      sub_FFC28FD4\n"
276                        "LDR     R1, =0x2CE000\n"
277                        "MOV     R0, #0\n"
278                        "BL      sub_FFC2921C\n"
279                        "BL      sub_FFC291C8\n"
280                        "MOV     R3, #0\n"
281                        "STR     R3, [SP]\n"
282                        "LDR     R3, =task_Startup_my\n"        //-------->
283                        "MOV     R2, #0\n"
284                        "MOV     R1, #0x19\n"
285                        "LDR     R0, =0xFFC106D8\n"
286                        "BL      sub_FFC0F1A8\n"
287                        "MOV     R0, #0\n"
288                        "LDMFD   SP!, {R12,PC}\n"
289        );
290}
291
292void __attribute__((naked,noinline)) task_Startup_my() {
293        asm volatile (
294                        "STMFD   SP!, {R4,LR}\n"
295                        "BL      sub_FFC06278\n"
296                        "BL      sub_FFC249CC\n"
297                        "BL      sub_FFC2326C\n"
298                        //  "BL      j_nullsub_196\n"
299                        "BL      sub_FFC2ADD0\n"
300                        //  "BL      sub_FFC2AC78\n"            // - start diskboot.bin
301                        "BL      sub_FFC2AF6C\n"
302                        "BL      sub_FFC2AE00\n"
303                        "BL      sub_FFC2846C\n"
304                        "BL      sub_FFC2AF70\n"
305                        "BL      CreateTask_spytask\n"  // +
306                        //  "BL      sub_FFC237C0\n"            // original taskcreate_PhySw
307                        "BL      taskcreate_PhySw_my\n" // +
308                        "BL      sub_FFC26CF8\n"
309                        "BL      sub_FFC2AF88\n"
310                        //  "BL      nullsub_173\n"
311                        "BL      sub_FFC22D48\n"
312                        "BL      sub_FFC2A97C\n"
313                        "BL      sub_FFC23220\n"
314                        "BL      sub_FFC22CE8\n"
315                        "BL      sub_FFC2B9B4\n"
316                        "BL      sub_FFC22CC0\n"
317                        "LDMFD   SP!, {R4,LR}\n"
318                        "B       sub_FFC06128\n"
319        );
320}
321
322// ROM:FFC237C0 taskcreate_PhySw
323void __attribute__((naked,noinline)) taskcreate_PhySw_my() {
324        asm volatile(
325                        "STMFD   SP!, {R3-R5,LR}\n"
326                        "LDR     R4, =0x1BE4\n"
327                        "LDR     R0, [R4,#0x10]\n"
328                        "CMP     R0, #0\n"
329                        "BNE     loc_FFC237F4\n"
330                        "MOV     R3, #0\n"
331                        "STR     R3, [SP]\n"
332                        "LDR     R3, =mykbd_task\n"             // Changed
333                        //  "MOV     R2, #0x800\n"
334                        "MOV     R2, #0x2000\n"                 // + stack size for new task_PhySw so we don't have to do stack switch
335                        "B       sub_FFC237E4\n"    // Continue code
336"loc_FFC237F4:\n"
337                        "B       sub_FFC237F4\n"    // Continue code
338        );
339}
340/*******************************************************************/
341
342// ROM:FFC705AC task_InitFileModules
343void __attribute__((naked,noinline)) init_file_modules_task() {
344        asm volatile(
345                        "STMFD   SP!, {R4-R6,LR}\n"
346                        "BL      sub_FFC69E48\n"
347                        "LDR     R5, =0x5006\n"
348                        "MOVS    R4, R0\n"
349                        "MOVNE   R1, #0\n"
350                        "MOVNE   R0, R5\n"
351                        "BLNE    sub_FFC6C70C\n"
352                        "BL      sub_FFC69E74_my\n"                     //------------->
353                        "BL      core_spytask_can_start\n"      // + set "it's safe to start" flag for spytask
354                        "CMP     R4, #0\n"
355                        "MOVEQ   R0, R5\n"
356                        "LDMEQFD SP!, {R4-R6,LR}\n"
357                        "MOVEQ   R1, #0\n"
358                        "BEQ     sub_FFC6C70C\n"
359                        "LDMFD   SP!, {R4-R6,PC}\n"
360        );
361}
362
363void __attribute__((naked,noinline)) sub_FFC69E74_my() {
364        asm volatile(
365                        "STMFD   SP!, {R4,LR}\n"
366                        "MOV     R0, #3\n"
367                        "BL      sub_FFC50E94_my\n"                     //---------->
368                        //  "BL      nullsub_67\n"
369                        "LDR     R4, =0x2A30\n"
370                        "LDR     R0, [R4,#4]\n"
371                        "CMP     R0, #0\n"
372                        "BNE     loc_FFC69EAC\n"
373                        "BL      sub_FFC500DC\n"
374                        "BL      sub_FFCF0788\n"
375                        "BL      sub_FFC500DC\n"
376                        "BL      sub_FFC4CB54\n"
377                        "BL      sub_FFC4FFDC\n"
378                        "BL      sub_FFCF081C\n"
379"loc_FFC69EAC:\n"
380                        "MOV     R0, #1\n"
381                        "STR     R0, [R4]\n"
382                        "LDMFD   SP!, {R4,PC}\n"
383        );
384}
385
386
387void __attribute__((naked,noinline)) sub_FFC50E94_my() {
388                asm volatile(
389                "STMFD   SP!, {R4-R8,LR}\n"
390                "MOV     R8, R0\n"
391                "BL      sub_FFC50E14\n"
392                "LDR     R1, =0x32350\n"
393                "MOV     R6, R0\n"
394                "ADD     R4, R1, R0,LSL#7\n"
395                "LDR     R0, [R4,#0x6C]\n"
396                "CMP     R0, #4\n"
397                "LDREQ   R1, =0x817\n"
398                "LDREQ   R0, =0xFFC50954\n"
399                "BLEQ    sub_FFC0F680\n"
400                "MOV     R1, R8\n"
401                "MOV     R0, R6\n"
402                "BL      sub_FFC506CC\n"
403                "LDR     R0, [R4,#0x38]\n"
404                "BL      sub_FFC51534\n"
405                "CMP     R0, #0\n"
406                "STREQ   R0, [R4,#0x6C]\n"
407                "MOV     R0, R6\n"
408                "BL      sub_FFC5075C\n"
409                "MOV     R0, R6\n"
410                "BL      sub_FFC50ABC_my\n"             //--------->
411                "MOV     R5, R0\n"
412                "MOV     R0, R6\n"
413                "BL      sub_FFC50CEC\n"
414                "LDR     R6, [R4,#0x3C]\n"
415                "AND     R7, R5, R0\n"
416                "CMP     R6, #0\n"
417                "LDR     R1, [R4,#0x38]\n"
418                "MOVEQ   R0, #0x80000001\n"
419                "MOV     R5, #0\n"
420                "BEQ     loc_FFC50F44\n"
421                "MOV     R0, R1\n"
422                "BL      sub_FFC50244\n"
423                "CMP     R0, #0\n"
424                "MOVNE   R5, #4\n"
425                "CMP     R6, #5\n"
426                "ORRNE   R0, R5, #1\n"
427                "BICEQ   R0, R5, #1\n"
428                "CMP     R7, #0\n"
429                "BICEQ   R0, R0, #2\n"
430                "ORREQ   R0, R0, #0x80000000\n"
431                "BICNE   R0, R0, #0x80000000\n"
432                "ORRNE   R0, R0, #2\n"
433"loc_FFC50F44:\n"
434                "CMP     R8, #7\n"
435                "STR     R0, [R4,#0x40]\n"
436                "LDMNEFD SP!, {R4-R8,PC}\n"
437                "MOV     R0, R8\n"
438                "BL      sub_FFC50E64\n"
439                "CMP     R0, #0\n"
440                "LDMEQFD SP!, {R4-R8,LR}\n"
441                "LDREQ   R0, =0xFFC50F90\n"
442                "BEQ     sub_FFC01780\n"
443                "LDMFD   SP!, {R4-R8,PC}\n"
444                );
445}
446
447void __attribute__((naked,noinline)) sub_FFC50ABC_my() {
448        asm volatile(
449                        "STMFD   SP!, {R4-R6,LR}\n"
450                        "MOV     R5, R0\n"
451                        "LDR     R0, =0x32350\n"
452                        "ADD     R4, R0, R5,LSL#7\n"
453                        "LDR     R0, [R4,#0x6C]\n"
454                        "TST     R0, #2\n"
455                        "MOVNE   R0, #1\n"
456                        "LDMNEFD SP!, {R4-R6,PC}\n"
457                        "LDR     R0, [R4,#0x38]\n"
458                        "MOV     R1, R5\n"
459                        "BL      sub_FFC507DC_my\n"  //--------->
460                        "CMP     R0, #0\n"
461                        "LDRNE   R0, [R4,#0x38]\n"
462                        "MOVNE   R1, R5\n"
463                        "BLNE    sub_FFC50978\n"
464                        "LDR     R2, =0x323D0\n"
465                        "ADD     R1, R5, R5,LSL#4\n"
466                        "LDR     R1, [R2,R1,LSL#2]\n"
467                        "CMP     R1, #4\n"
468                        "BEQ     loc_FFC50B1C\n"
469                        "CMP     R0, #0\n"
470                        "LDMEQFD SP!, {R4-R6,PC}\n"
471                        "MOV     R0, R5\n"
472                        "BL      sub_FFC502D4\n"
473"loc_FFC50B1C:\n"
474                        "CMP     R0, #0\n"
475                        "LDRNE   R1, [R4,#0x6C]\n"
476                        "ORRNE   R1, R1, #2\n"
477                        "STRNE   R1, [R4,#0x6C]\n"
478                        "LDMFD   SP!, {R4-R6,PC}\n"
479        );
480}
481
482void __attribute__((naked,noinline)) sub_FFC507DC_my() {
483asm volatile(
484                        "STMFD   SP!, {R4-R10,LR}\n"
485                        "MOV     R9, R0\n"
486                        "LDR     R0, =0x32350\n"
487                        "MOV     R8, #0\n"
488                        "ADD     R5, R0, R1,LSL#7\n"
489                        "LDR     R0, [R5,#0x3C]\n"
490                        "MOV     R7, #0\n"
491                        "CMP     R0, #7\n"
492                        "MOV     R6, #0\n"
493                        "ADDLS   PC, PC, R0,LSL#2\n"
494                        "B       loc_FFC50934\n"
495"loc_FFC50808:\n"
496                        "B       loc_FFC50840\n"
497"loc_FFC5080C:\n"
498                        "B       loc_FFC50828\n"
499"loc_FFC50810:\n"
500                        "B       loc_FFC50828\n"
501"loc_FFC50814:\n"
502                        "B       loc_FFC50828\n"
503"loc_FFC50818:\n"
504                        "B       loc_FFC50828\n"
505"loc_FFC5081C:\n"
506                        "B       loc_FFC5092C\n"
507"loc_FFC50820:\n"
508                        "B       loc_FFC50828\n"
509"loc_FFC50824:\n"
510                        "B       loc_FFC50828\n"
511"loc_FFC50828:\n"
512                        "MOV     R2, #0\n"
513                        "MOV     R1, #0x200\n"
514                        "MOV     R0, #2\n"
515                        "BL      sub_FFC64074\n"
516                        "MOVS    R4, R0\n"
517                        "BNE     loc_FFC50848\n"
518"loc_FFC50840:\n"
519                        "MOV     R0, #0\n"
520                        "LDMFD   SP!, {R4-R10,PC}\n"
521"loc_FFC50848:\n"
522                        "LDR     R12, [R5,#0x50]\n"
523                        "MOV     R3, R4\n"
524                        "MOV     R2, #1\n"
525                        "MOV     R1, #0\n"
526                        "MOV     R0, R9\n"
527                        "BLX     R12\n"
528                        "CMP     R0, #1\n"
529                        "BNE     loc_FFC50874\n"
530                        "MOV     R0, #2\n"
531                        "BL      sub_FFC641C0\n"
532                        "B       loc_FFC50840\n"
533"loc_FFC50874:\n"
534                        "LDR     R1, [R5,#0x64]\n"
535                        "MOV     R0, R9\n"
536                        "BLX     R1\n"
537
538                        "MOV   R1, R4\n"           // + pointer to MBR in R1
539                        "BL    mbr_read_dryos\n"   // + total sectors count in R0 before and after call
540
541                        // Start of DataGhost's FAT32 autodetection code
542                        // Policy: If there is a partition which has type W95 FAT32, use the first one of those for image storage
543                        // According to the code below, we can use R1, R2, R3 and R12.
544                        // LR wasn't really used anywhere but for storing a part of the partition signature. This is the only thing
545                        // that won't work with an offset, but since we can load from LR+offset into LR, we can use this to do that :)
546                        "MOV     R12, R4\n"                    // Copy the MBR start address so we have something to work with
547                        "MOV     LR, R4\n"                     // Save old offset for MBR signature
548                        "MOV     R1, #1\n"                     // Note the current partition number
549                        "B       dg_sd_fat32_enter\n"          // We actually need to check the first partition as well, no increments yet!
550"dg_sd_fat32:\n"
551                        "CMP     R1, #4\n"                     // Did we already see the 4th partition?
552                        "BEQ     dg_sd_fat32_end\n"            // Yes, break. We didn't find anything, so don't change anything.
553                        "ADD     R12, R12, #0x10\n"            // Second partition
554                        "ADD     R1, R1, #1\n"                 // Second partition for the loop
555"dg_sd_fat32_enter:\n"
556                        "LDRB    R2, [R12, #0x1BE]\n"          // Partition status
557                        "LDRB    R3, [R12, #0x1C2]\n"          // Partition type (FAT32 = 0xB)
558                        "CMP     R3, #0xB\n"                   // Is this a FAT32 partition?
559                        "CMPNE   R3, #0xC\n"                   // Not 0xB, is it 0xC (FAT32 LBA) then?
560                        "BNE     dg_sd_fat32\n"                // No, it isn't. Loop again.
561                        "CMP     R2, #0x00\n"                  // It is, check the validity of the partition type
562                        "CMPNE   R2, #0x80\n"
563                        "BNE     dg_sd_fat32\n"                // Invalid, go to next partition
564                        // This partition is valid, it's the first one, bingo!
565                        "MOV     R4, R12\n"                    // Move the new MBR offset for the partition detection.
566
567"dg_sd_fat32_end:\n"
568                        // End of DataGhost's FAT32 autodetection code
569
570
571                        "LDRB    R1, [R4,#0x1C9]\n"
572                        "LDRB    R3, [R4,#0x1C8]\n"
573                        "LDRB    R12, [R4,#0x1CC]\n"
574                        "MOV     R1, R1,LSL#24\n"
575                        "ORR     R1, R1, R3,LSL#16\n"
576                        "LDRB    R3, [R4,#0x1C7]\n"
577                        "LDRB    R2, [R4,#0x1BE]\n"
578                        //   "LDRB    LR, [R4,#0x1FF]\n"     // -
579                        "ORR     R1, R1, R3,LSL#8\n"
580                        "LDRB    R3, [R4,#0x1C6]\n"
581                        "CMP     R2, #0\n"
582                        "CMPNE   R2, #0x80\n"
583                        "ORR     R1, R1, R3\n"
584                        "LDRB    R3, [R4,#0x1CD]\n"
585                        "MOV     R3, R3,LSL#24\n"
586                        "ORR     R3, R3, R12,LSL#16\n"
587                        "LDRB    R12, [R4,#0x1CB]\n"
588                        "ORR     R3, R3, R12,LSL#8\n"
589                        "LDRB    R12, [R4,#0x1CA]\n"
590                        "ORR     R3, R3, R12\n"
591                        //   "LDRB    R12, [R4,#0x1FE]\n"     // -
592                        "LDRB    R12, [LR,#0x1FE]\n"           // + First MBR signature byte (0x55), LR is original offset.
593                        "LDRB    LR, [LR,#0x1FF]\n"            // + Last MBR signature byte (0xAA), LR is original offset.
594                        "BNE     loc_FFC50900\n"
595                        "CMP     R0, R1\n"
596                        "BCC     loc_FFC50900\n"
597                        "ADD     R2, R1, R3\n"
598                        "CMP     R2, R0\n"
599                        "CMPLS   R12, #0x55\n"
600                        "CMPEQ   LR, #0xAA\n"
601                        "MOVEQ   R7, R1\n"
602                        "MOVEQ   R6, R3\n"
603                        "MOVEQ   R4, #1\n"
604                        "BEQ     loc_FFC50904\n"
605"loc_FFC50900:\n"
606                        "MOV     R4, R8\n"
607"loc_FFC50904:\n"
608                        "MOV     R0, #2\n"
609                        "BL      sub_FFC641C0\n"
610                        "CMP     R4, #0\n"
611                        "BNE     loc_FFC50940\n"
612                        "LDR     R1, [R5,#0x64]\n"
613                        "MOV     R7, #0\n"
614                        "MOV     R0, R9\n"
615                        "BLX     R1\n"
616                        "MOV     R6, R0\n"
617                        "B       loc_FFC50940\n"
618"loc_FFC5092C:\n"
619                        "MOV     R6, #0x40\n"
620                        "B       loc_FFC50940\n"
621"loc_FFC50934:\n"
622                        "LDR     R1, =0x572\n"
623                        "LDR     R0, =0xFFC50954\n"
624                        "BL      sub_FFC0F680\n"
625"loc_FFC50940:\n"
626                        "STR     R7, [R5,#0x44]!\n"
627                        "STMIB   R5, {R6,R8}\n"
628                        "MOV     R0, #1\n"
629                        "LDMFD   SP!, {R4-R10,PC}\n"
630        );
631}
632
633
634
Note: See TracBrowser for help on using the repository browser.