source: trunk/platform/a490/sub/100f/boot.c @ 686

Revision 686, 18.4 KB checked in by reyalp, 2 years ago (diff)

Aktualisierung auf Rev.1205-1206 offizieller Trunk

+ a490 100f beta, danke mrowl

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