Mercurial > repos > blastem
comparison dis.c @ 632:80e111b48d4b
Add -r option to indicate VOS program module contains a 68K reset vector
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 11 Oct 2014 21:20:02 -0700 |
parents | de6f00204fa2 |
children | a759f4e38488 |
comparison
equal
deleted
inserted
replaced
631:de6f00204fa2 | 632:80e111b48d4b |
---|---|
106 char disbuf[1024]; | 106 char disbuf[1024]; |
107 m68kinst instbuf; | 107 m68kinst instbuf; |
108 unsigned short * cur; | 108 unsigned short * cur; |
109 deferred *def = NULL, *tmpd; | 109 deferred *def = NULL, *tmpd; |
110 | 110 |
111 uint8_t labels = 0, addr = 0, only = 0, vos = 0; | 111 uint8_t labels = 0, addr = 0, only = 0, vos = 0, reset = 0; |
112 | 112 |
113 for(uint8_t opt = 2; opt < argc; ++opt) { | 113 for(uint8_t opt = 2; opt < argc; ++opt) { |
114 if (argv[opt][0] == '-') { | 114 if (argv[opt][0] == '-') { |
115 FILE * address_log; | 115 FILE * address_log; |
116 switch (argv[opt][1]) | 116 switch (argv[opt][1]) |
124 case 'o': | 124 case 'o': |
125 only = 1; | 125 only = 1; |
126 break; | 126 break; |
127 case 'v': | 127 case 'v': |
128 vos = 1; | 128 vos = 1; |
129 break; | |
130 case 'r': | |
131 reset = 1; | |
129 break; | 132 break; |
130 case 'f': | 133 case 'f': |
131 opt++; | 134 opt++; |
132 if (opt >= argc) { | 135 if (opt >= argc) { |
133 fputs("-f must be followed by a filename\n", stderr); | 136 fputs("-f must be followed by a filename\n", stderr); |
172 address_end = address_off + filesize - 0x1000; | 175 address_end = address_off + filesize - 0x1000; |
173 def = defer(header.main_entry_link.code_address, def); | 176 def = defer(header.main_entry_link.code_address, def); |
174 named_labels = add_label(named_labels, "main_entry_link", header.main_entry_link.code_address); | 177 named_labels = add_label(named_labels, "main_entry_link", header.main_entry_link.code_address); |
175 for (int i = 0; i < header.n_modules; i++) | 178 for (int i = 0; i < header.n_modules; i++) |
176 { | 179 { |
177 def = defer(header.module_map_entries[i].code_address, def); | 180 if (!reset || header.module_map_entries[i].code_address != header.user_boundary) |
181 { | |
182 def = defer(header.module_map_entries[i].code_address, def); | |
183 } | |
178 named_labels = add_label(named_labels, header.module_map_entries[i].name.str, header.module_map_entries[i].code_address); | 184 named_labels = add_label(named_labels, header.module_map_entries[i].name.str, header.module_map_entries[i].code_address); |
179 } | 185 } |
180 fseek(f, 0x1000, SEEK_SET); | 186 fseek(f, 0x1000, SEEK_SET); |
181 filebuf = malloc(filesize - 0x1000); | 187 filebuf = malloc(filesize - 0x1000); |
182 if (fread(filebuf, 2, (filesize - 0x1000)/2, f) != (filesize - 0x1000)/2) | 188 if (fread(filebuf, 2, (filesize - 0x1000)/2, f) != (filesize - 0x1000)/2) |
185 } | 191 } |
186 fclose(f); | 192 fclose(f); |
187 for(cur = filebuf; cur - filebuf < ((filesize - 0x1000)/2); ++cur) | 193 for(cur = filebuf; cur - filebuf < ((filesize - 0x1000)/2); ++cur) |
188 { | 194 { |
189 *cur = (*cur >> 8) | (*cur << 8); | 195 *cur = (*cur >> 8) | (*cur << 8); |
196 } | |
197 if (reset) | |
198 { | |
199 def = defer(filebuf[2] << 16 | filebuf[3], def); | |
200 named_labels = add_label(named_labels, "reset", filebuf[2] << 16 | filebuf[3]); | |
190 } | 201 } |
191 } else { | 202 } else { |
192 address_off = 0; | 203 address_off = 0; |
193 address_end = filesize; | 204 address_end = filesize; |
194 filebuf = malloc(filesize); | 205 filebuf = malloc(filesize); |