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);