tcploader: added possibility to deny connection and wait for new client
[svpe-wii.git] / sdelfloader / loader / source / dol.c
blob35fedea697166c0d38418411fcded4b69a54e343
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) {
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 printf ("loading text section %u @ 0x%08x "
33 "(0x%08x bytes)\n",
34 i, dolfile->text_start[i],
35 dolfile->text_size[i]);
36 VIDEO_WaitVSync();
38 ICInvalidateRange ((void *) dolfile->text_start[i],
39 dolfile->text_size[i]);
40 memmove ((void *) dolfile->text_start[i],
41 dolstart+dolfile->text_pos[i],
42 dolfile->text_size[i]);
45 for(i = 0; i < 11; i++) {
46 if ((!dolfile->data_size[i]) ||
47 (dolfile->data_start[i] < 0x100))
48 continue;
50 printf ("loading data section %u @ 0x%08x "
51 "(0x%08x bytes)\n",
52 i, dolfile->data_start[i],
53 dolfile->data_size[i]);
54 VIDEO_WaitVSync();
56 memmove ((void*) dolfile->data_start[i],
57 dolstart+dolfile->data_pos[i],
58 dolfile->data_size[i]);
59 DCFlushRangeNoSync ((void *) dolfile->data_start[i],
60 dolfile->data_size[i]);
63 printf ("clearing bss\n");
64 VIDEO_WaitVSync();
66 memset ((void *) dolfile->bss_start, 0, dolfile->bss_size);
67 DCFlushRange((void *) dolfile->bss_start, dolfile->bss_size);
69 return dolfile->entry_point;
72 return 0;