PulkoMandy | 15f3f26 | 2014-06-28 11:45:08 +0200 | [diff] [blame] | 1 | #include "loader.h" |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 2 | #include "rel.h" |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame^] | 3 | #include "log.h" |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 4 | #include <stddef.h> |
| 5 | #include <malloc.h> |
| 6 | |
| 7 | extern void *progend; |
| 8 | |
| 9 | struct prg_hdr { |
| 10 | char *relocatedata; |
| 11 | char arch[8]; |
| 12 | char version[8]; |
| 13 | char initfunc[1]; |
| 14 | }; |
| 15 | |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 16 | unsigned char loader_arch_load(const char *name, char *arg) |
| 17 | { |
| 18 | char *loadaddr; |
| 19 | struct prg_hdr *prghdr; |
| 20 | int length; |
| 21 | |
| 22 | /* get length of file */ |
| 23 | length = get_file_length(name); |
| 24 | if (length==0) |
| 25 | return LOADER_ERR_OPEN; |
| 26 | |
| 27 | /* allocate memory */ |
| 28 | loadaddr = malloc(length); |
| 29 | if (loadaddr==NULL) |
| 30 | return LOADER_ERR_MEM; |
| 31 | |
| 32 | /* load the file */ |
| 33 | load_file(name,loadaddr); |
| 34 | |
| 35 | prghdr = (struct prg_hdr *)loadaddr; |
| 36 | |
| 37 | /* relocate it */ |
| 38 | relocate(prghdr->relocatedata,loadaddr); |
| 39 | |
| 40 | ((void (*)(char *))prghdr->initfunc)(arg); |
| 41 | |
| 42 | return LOADER_OK; |
| 43 | } |
| 44 | |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame^] | 45 | |
| 46 | static void relocate_dsc(struct dsc* data, int loadaddr) |
| 47 | { |
| 48 | data->description += loadaddr; |
| 49 | data->prgname += loadaddr; |
| 50 | data->icon = (struct ctk_icon*)(((char*)data->icon)+ loadaddr); |
| 51 | |
| 52 | data->icon->title += loadaddr; |
| 53 | //data->icon->bitmap += loadaddr; |
| 54 | data->icon->textmap += loadaddr; |
| 55 | } |
| 56 | |
| 57 | |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 58 | struct dsc *loader_arch_load_dsc(const char *name) |
| 59 | { |
| 60 | char *loadaddr; |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame^] | 61 | struct dsc *dschdr; |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 62 | int length; |
| 63 | |
| 64 | /* get length of file */ |
| 65 | length = get_file_length(name); |
| 66 | if (length==0) |
| 67 | return NULL; |
| 68 | |
| 69 | /* allocate memory */ |
| 70 | loadaddr = malloc(length); |
| 71 | if (loadaddr==NULL) |
| 72 | return NULL; |
| 73 | |
| 74 | /* load the file */ |
| 75 | load_file(name, loadaddr); |
| 76 | |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame^] | 77 | dschdr = (struct dsc *)loadaddr; |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 78 | /* relocate it */ |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame^] | 79 | relocate_dsc(dschdr, (int)loadaddr); |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 80 | |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame^] | 81 | return dschdr; |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 82 | } |
| 83 | |
| 84 | void loader_arch_free(void *loadaddr) |
| 85 | { |
| 86 | /* free module */ |
| 87 | /* we're given the start of 'arch' member of the prg_hdr, |
| 88 | calculate the real start address and then free the block */ |
| 89 | void *header = (void *)((char *)loadaddr - offsetof(struct prg_hdr,arch)); |
| 90 | free(header); |
| 91 | } |
| 92 | |
| 93 | void loader_arch_free_dsc(struct dsc *dscdata) |
| 94 | { |
PulkoMandy | b2082f6 | 2014-06-30 13:11:14 +0200 | [diff] [blame^] | 95 | free(dscdata); |
kthacker | 6de6775 | 2006-04-17 15:02:26 +0000 | [diff] [blame] | 96 | } |
| 97 | |