Mercurial > repos > blastem
comparison dis.c @ 1078:c4bfbf55d418
Added some hacky support for specifying a start offset in 68K disassembler
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 04 Oct 2016 18:28:35 -0700 |
parents | d29722e3359c |
children | 137dbd05ceab |
comparison
equal
deleted
inserted
replaced
1077:1a66d5165ea7 | 1078:c4bfbf55d418 |
---|---|
151 deferred *def = NULL, *tmpd; | 151 deferred *def = NULL, *tmpd; |
152 | 152 |
153 uint8_t labels = 0, addr = 0, only = 0, vos = 0, reset = 0; | 153 uint8_t labels = 0, addr = 0, only = 0, vos = 0, reset = 0; |
154 tern_node * named_labels = NULL; | 154 tern_node * named_labels = NULL; |
155 | 155 |
156 uint32_t address_off = 0, address_end; | |
156 for(uint8_t opt = 2; opt < argc; ++opt) { | 157 for(uint8_t opt = 2; opt < argc; ++opt) { |
157 if (argv[opt][0] == '-') { | 158 if (argv[opt][0] == '-') { |
158 FILE * address_log; | 159 FILE * address_log; |
159 switch (argv[opt][1]) | 160 switch (argv[opt][1]) |
160 { | 161 { |
170 case 'v': | 171 case 'v': |
171 vos = 1; | 172 vos = 1; |
172 break; | 173 break; |
173 case 'r': | 174 case 'r': |
174 reset = 1; | 175 reset = 1; |
176 break; | |
177 case 's': | |
178 opt++; | |
179 if (opt >= argc) { | |
180 fputs("-s must be followed by an offset\n", stderr); | |
181 exit(1); | |
182 } | |
183 address_off = strtol(argv[opt], NULL, 0); | |
175 break; | 184 break; |
176 case 'f': | 185 case 'f': |
177 opt++; | 186 opt++; |
178 if (opt >= argc) { | 187 if (opt >= argc) { |
179 fputs("-f must be followed by a filename\n", stderr); | 188 fputs("-f must be followed by a filename\n", stderr); |
206 if (*end == '=') { | 215 if (*end == '=') { |
207 named_labels = add_label(named_labels, end+1, address); | 216 named_labels = add_label(named_labels, end+1, address); |
208 } | 217 } |
209 } | 218 } |
210 } | 219 } |
211 | |
212 FILE * f = fopen(argv[1], "rb"); | 220 FILE * f = fopen(argv[1], "rb"); |
213 fseek(f, 0, SEEK_END); | 221 fseek(f, 0, SEEK_END); |
214 filesize = ftell(f); | 222 filesize = ftell(f); |
215 fseek(f, 0, SEEK_SET); | 223 fseek(f, 0, SEEK_SET); |
216 | 224 |
217 char int_key[MAX_INT_KEY_SIZE]; | 225 char int_key[MAX_INT_KEY_SIZE]; |
218 uint32_t address_off, address_end; | |
219 if (vos) | 226 if (vos) |
220 { | 227 { |
221 vos_program_module header; | 228 vos_program_module header; |
222 vos_read_header(f, &header); | 229 vos_read_header(f, &header); |
223 vos_read_alloc_module_map(f, &header); | 230 vos_read_alloc_module_map(f, &header); |
248 { | 255 { |
249 def = defer(filebuf[2] << 16 | filebuf[3], def); | 256 def = defer(filebuf[2] << 16 | filebuf[3], def); |
250 named_labels = add_label(named_labels, "reset", filebuf[2] << 16 | filebuf[3]); | 257 named_labels = add_label(named_labels, "reset", filebuf[2] << 16 | filebuf[3]); |
251 } | 258 } |
252 } else { | 259 } else { |
253 address_off = 0; | 260 address_end = address_off + filesize; |
254 address_end = filesize; | |
255 filebuf = malloc(filesize); | 261 filebuf = malloc(filesize); |
256 if (fread(filebuf, 2, filesize/2, f) != filesize/2) | 262 if (fread(filebuf, 2, filesize/2, f) != filesize/2) |
257 { | 263 { |
258 fprintf(stderr, "Failure while reading file %s\n", argv[1]); | 264 fprintf(stderr, "Failure while reading file %s\n", argv[1]); |
259 } | 265 } |