Mercurial > repos > blastem
comparison zdis.c @ 817:e95978c0988c
Added a -s paramter for specifying a start offset in the Z80 disassembler
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 28 Jul 2015 20:47:13 -0700 |
parents | 3eced113081c |
children | a634ed0a92cf |
comparison
equal
deleted
inserted
replaced
816:7ed55a361e79 | 817:e95978c0988c |
---|---|
75 fseek(f, 0, SEEK_SET); | 75 fseek(f, 0, SEEK_SET); |
76 filebuf = malloc(filesize); | 76 filebuf = malloc(filesize); |
77 fread(filebuf, 1, filesize, f); | 77 fread(filebuf, 1, filesize, f); |
78 fclose(f); | 78 fclose(f); |
79 deferred *def = NULL, *tmpd; | 79 deferred *def = NULL, *tmpd; |
80 uint16_t offset = 0; | |
80 for(uint8_t opt = 2; opt < argc; ++opt) { | 81 for(uint8_t opt = 2; opt < argc; ++opt) { |
81 if (argv[opt][0] == '-') { | 82 if (argv[opt][0] == '-') { |
82 FILE * address_log; | 83 FILE * address_log; |
83 switch (argv[opt][1]) | 84 switch (argv[opt][1]) |
84 { | 85 { |
109 def = defer(address, def); | 110 def = defer(address, def); |
110 reference(address); | 111 reference(address); |
111 } | 112 } |
112 } | 113 } |
113 } | 114 } |
115 break; | |
116 case 's': | |
117 opt++; | |
118 if (opt >= argc) { | |
119 fputs("-s must be followed by a start offset in hex\n", stderr); | |
120 exit(1); | |
121 } | |
122 offset = strtol(argv[opt], NULL, 16); | |
123 break; | |
114 } | 124 } |
115 } else { | 125 } else { |
116 uint16_t address = strtol(argv[opt], NULL, 16); | 126 uint16_t address = strtol(argv[opt], NULL, 16); |
117 def = defer(address, def); | 127 def = defer(address, def); |
118 reference(address); | 128 reference(address); |
119 } | 129 } |
120 } | 130 } |
121 uint16_t start = 0; | 131 uint16_t start = offset; |
122 uint8_t *encoded, *next; | 132 uint8_t *encoded, *next; |
123 uint32_t size; | 133 uint32_t size; |
124 if (!def || !only) { | 134 if (!def || !only) { |
125 def = defer(start, def); | 135 def = defer(start, def); |
126 } | 136 } |
128 while(def) { | 138 while(def) { |
129 do { | 139 do { |
130 encoded = NULL; | 140 encoded = NULL; |
131 address = def->address; | 141 address = def->address; |
132 if (!is_visited(address)) { | 142 if (!is_visited(address)) { |
133 encoded = filebuf + address; | 143 encoded = filebuf + address - offset; |
134 } | 144 } |
135 tmpd = def; | 145 tmpd = def; |
136 def = def->next; | 146 def = def->next; |
137 free(tmpd); | 147 free(tmpd); |
138 } while(def && encoded == NULL); | 148 } while(def && encoded == NULL); |
139 if (!encoded) { | 149 if (!encoded) { |
140 break; | 150 break; |
141 } | 151 } |
142 for(;;) { | 152 for(;;) { |
143 if (address > filesize || is_visited(address)) { | 153 if ((address - offset) > filesize || is_visited(address) || address < offset) { |
144 break; | 154 break; |
145 } | 155 } |
146 visit(address); | 156 visit(address); |
147 next = z80_decode(encoded, &instbuf); | 157 next = z80_decode(encoded, &instbuf); |
148 address += (next-encoded); | 158 address += (next-encoded); |
152 //printf("%X: %s\n", address, disbuf); | 162 //printf("%X: %s\n", address, disbuf); |
153 switch (instbuf.op) | 163 switch (instbuf.op) |
154 { | 164 { |
155 case Z80_JR: | 165 case Z80_JR: |
156 address += instbuf.immed; | 166 address += instbuf.immed; |
157 encoded = filebuf + address; | 167 encoded = filebuf + address - offset; |
158 break; | 168 break; |
159 case Z80_JRCC: | 169 case Z80_JRCC: |
160 reference(address + instbuf.immed); | 170 reference(address + instbuf.immed); |
161 def = defer(address + instbuf.immed, def); | 171 def = defer(address + instbuf.immed, def); |
162 break; | 172 break; |
163 case Z80_JP: | 173 case Z80_JP: |
164 address = instbuf.immed; | 174 address = instbuf.immed; |
165 encoded = filebuf + address; | 175 encoded = filebuf + address - offset; |
166 break; | 176 break; |
167 case Z80_JPCC: | 177 case Z80_JPCC: |
168 case Z80_CALL: | 178 case Z80_CALL: |
169 case Z80_CALLCC: | 179 case Z80_CALLCC: |
170 case Z80_RST: | 180 case Z80_RST: |
184 printf("ADR_%X equ $%X\n", address, address); | 194 printf("ADR_%X equ $%X\n", address, address); |
185 } | 195 } |
186 } | 196 } |
187 puts(""); | 197 puts(""); |
188 } | 198 } |
189 for (address = 0; address < filesize; address++) { | 199 for (address = offset; address < filesize; address++) { |
190 if (is_visited(address)) { | 200 if (is_visited(address)) { |
191 encoded = filebuf + address; | 201 encoded = filebuf + address - offset; |
192 z80_decode(encoded, &instbuf); | 202 z80_decode(encoded, &instbuf); |
193 if (labels) { | 203 if (labels) { |
194 /*m68k_disasm_labels(&instbuf, disbuf); | 204 /*m68k_disasm_labels(&instbuf, disbuf); |
195 if (is_label(instbuf.address)) { | 205 if (is_label(instbuf.address)) { |
196 printf("ADR_%X:\n", instbuf.address); | 206 printf("ADR_%X:\n", instbuf.address); |