tcploader addded
[svpe-wii.git] / tcploader / wii / dol.c
blob40fd6b99314e5b4ce5a9c8bcbb15d0cffef7da93
1 // this code was contributed by shagkur of the devkitpro team, thx!
3 #include <stdio.h>
4 #include <string.h>
6 #include <gccore.h>
7 #include <ogcsys.h>
9 typedef struct _dolheader {
10 u32 text_pos[7];
11 u32 data_pos[11];
12 u32 text_start[7];
13 u32 data_start[11];
14 u32 text_size[7];
15 u32 data_size[11];
16 u32 bss_start;
17 u32 bss_size;
18 u32 entry_point;
19 } dolheader;
21 u32 load_dol_image (void *dolstart, int print) {
22 u32 i;
23 dolheader *dolfile;
25 if (dolstart) {
26 dolfile = (dolheader *) dolstart;
27 for (i = 0; i < 7; i++) {
28 if ((!dolfile->text_size[i]) ||
29 (dolfile->text_start[i] < 0x100))
30 continue;
32 if(print)
33 printf ("loading text section %u @ 0x%08x "
34 "(0x%08x bytes)\n",
35 i, dolfile->text_start[i],
36 dolfile->text_size[i]);
37 VIDEO_WaitVSync();
39 ICInvalidateRange ((void *) dolfile->text_start[i],
40 dolfile->text_size[i]);
41 memcpy ((void *) dolfile->text_start[i],
42 dolstart+dolfile->text_pos[i],
43 dolfile->text_size[i]);
46 for(i = 0; i < 11; i++) {
47 if ((!dolfile->data_size[i]) ||
48 (dolfile->data_start[i] < 0x100))
49 continue;
51 if(print)
52 printf ("loading data section %u @ 0x%08x "
53 "(0x%08x bytes)\n",
54 i, dolfile->data_start[i],
55 dolfile->data_size[i]);
56 VIDEO_WaitVSync();
58 memcpy ((void*) dolfile->data_start[i],
59 dolstart+dolfile->data_pos[i],
60 dolfile->data_size[i]);
61 DCFlushRangeNoSync ((void *) dolfile->data_start[i],
62 dolfile->data_size[i]);
65 if(print)
66 printf ("clearing bss\n");
67 VIDEO_WaitVSync();
69 memset ((void *) dolfile->bss_start, 0, dolfile->bss_size);
70 DCFlushRange((void *) dolfile->bss_start, dolfile->bss_size);
72 return dolfile->entry_point;
75 return 0;