Mercurial > hg > forks > dxa
comparison dump.c @ 4:0990d9322fc8
Implement address-ranged labels. Breaks compatibility of label files.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 25 Feb 2015 04:15:07 +0200 |
parents | ec2f8f6f1dc9 |
children | 81b25f8cde12 |
comparison
equal
deleted
inserted
replaced
3:a07eb3757bf0 | 4:0990d9322fc8 |
---|---|
88 | 88 |
89 /* print the label definitions */ | 89 /* print the label definitions */ |
90 | 90 |
91 for (address = EndAddress < StartAddress ? EndAddress : 0; | 91 for (address = EndAddress < StartAddress ? EndAddress : 0; |
92 address != StartAddress; address++) | 92 address != StartAddress; address++) |
93 if (IsLabeled (address)) | 93 if (IsLabeled (address) && !IsInsideRegion(address)) |
94 fprintf (stdout, "%s%s = $%x\n", lineprefix, Label (address, abso), | 94 fprintf (stdout, "%s%s = $%x\n", lineprefix, Label (address, abso, 0), |
95 address); | 95 address); |
96 | 96 |
97 if (EndAddress >= StartAddress) | 97 if (EndAddress >= StartAddress) |
98 for (address = EndAddress; address; address++) | 98 for (address = EndAddress; address; address++) |
99 if (IsLabeled (address)) | 99 if (IsLabeled (address) && !IsInsideRegion(address)) |
100 fprintf (stdout, "%s%s = $%x\n", lineprefix, Label (address, abso), | 100 fprintf (stdout, "%s%s = $%x\n", lineprefix, Label (address, abso, 0), |
101 address); | 101 address); |
102 | 102 |
103 /* dump the program */ | 103 /* dump the program */ |
104 | 104 |
105 if(Options & B_SA_WORD) | 105 if(Options & B_SA_WORD) |
110 (ADDR_T)(EndAddress - StartAddress); address += size) | 110 (ADDR_T)(EndAddress - StartAddress); address += size) |
111 if (GetMemType (address) == MEM_INSTRUCTION) { | 111 if (GetMemType (address) == MEM_INSTRUCTION) { |
112 if (IsLabeled (address)) { | 112 if (IsLabeled (address)) { |
113 if (Options & M_ADDRESSES) | 113 if (Options & M_ADDRESSES) |
114 fprintf (stdout, "%04x %s%s:\n", address, | 114 fprintf (stdout, "%04x %s%s:\n", address, |
115 lineinfix, Label (address, abso)); | 115 lineinfix, Label (address, abso, 0)); |
116 else { | 116 else { |
117 fprintf (stdout, "%s", Label (address, abso)); | 117 fprintf (stdout, "%s", Label (address, abso, 0)); |
118 if (Options & B_LABCOL) | 118 if (Options & B_LABCOL) |
119 fprintf(stdout, ":\n"); | 119 fprintf(stdout, ":\n"); |
120 } | 120 } |
121 } | 121 } |
122 | 122 |
126 for (counter = 1; counter < size; counter++) { | 126 for (counter = 1; counter < size; counter++) { |
127 if (IsLabeled (address + counter)) { | 127 if (IsLabeled (address + counter)) { |
128 if (Options & M_ADDRESSES) | 128 if (Options & M_ADDRESSES) |
129 fprintf (stdout, "\t%04x %s%s = * + %u\n", | 129 fprintf (stdout, "\t%04x %s%s = * + %u\n", |
130 (ADDR_T)(address + counter), | 130 (ADDR_T)(address + counter), |
131 lineinfix, Label (address + counter, abso), counter); | 131 lineinfix, Label (address + counter, abso, 0), counter); |
132 else | 132 else |
133 fprintf (stdout, "\t%s = * + %u\n", | 133 fprintf (stdout, "\t%s = * + %u\n", |
134 Label (address + counter, abso), counter); | 134 Label (address + counter, abso, 0), counter); |
135 } | 135 } |
136 | 136 |
137 if (FindNextEntry (NULL, address, ~0, WRN_INSTR_WRITTEN_TO)) | 137 if (FindNextEntry (NULL, address, ~0, WRN_INSTR_WRITTEN_TO)) |
138 fprintf (stdout, "%s; Instruction opcode accessed.\n", lineprefix); | 138 fprintf (stdout, "%s; Instruction opcode accessed.\n", lineprefix); |
139 | 139 |
189 /* Fix to ensure 16-bit addresses to zero-page are maintained as 16-bit */ | 189 /* Fix to ensure 16-bit addresses to zero-page are maintained as 16-bit */ |
190 fprintf (stdout, "%s %s%s%s%s\n", mne[instr->mnemonic], | 190 fprintf (stdout, "%s %s%s%s%s\n", mne[instr->mnemonic], |
191 prefix[instr->admode], | 191 prefix[instr->admode], |
192 ((addr < 256 && instr->mnemonic != S_JMP && | 192 ((addr < 256 && instr->mnemonic != S_JMP && |
193 instr->mnemonic != S_JSR) ? "!" : ""), | 193 instr->mnemonic != S_JSR) ? "!" : ""), |
194 Label (addr, abso),postfix[instr->admode]); | 194 Label (addr, abso, 1), postfix[instr->admode]); |
195 break; | 195 break; |
196 case zp: | 196 case zp: |
197 case zpx: | 197 case zpx: |
198 case zpy: | 198 case zpy: |
199 case ind: | 199 case ind: |
200 case indx: | 200 case indx: |
201 case indy: | 201 case indy: |
202 addr = Memory[(ADDR_T)(address + 1)]; | 202 addr = Memory[(ADDR_T)(address + 1)]; |
203 fprintf (stdout, "%s %s%s%s\n", mne[instr->mnemonic], | 203 fprintf (stdout, "%s %s%s%s\n", mne[instr->mnemonic], |
204 prefix[instr->admode], Label (addr, zp), | 204 prefix[instr->admode], Label (addr, zp, 1), |
205 postfix[instr->admode]); | 205 postfix[instr->admode]); |
206 break; | 206 break; |
207 case rel: | 207 case rel: |
208 addr = (int)(char)Memory[(ADDR_T)(address + 1)]; | 208 addr = (int)(char)Memory[(ADDR_T)(address + 1)]; |
209 /* addr -= (addr > 127) ? 256 : 0; BUGFIX: sign extend already done */ | 209 /* addr -= (addr > 127) ? 256 : 0; BUGFIX: sign extend already done */ |
210 /*fprintf(stderr, "%d %d %d\n", address, size, addr);*/ | 210 /*fprintf(stderr, "%d %d %d\n", address, size, addr);*/ |
211 addr += address + size; | 211 addr += address + size; |
212 fprintf (stdout, "%s %s%s%s\n", mne[instr->mnemonic], | 212 fprintf (stdout, "%s %s%s%s\n", mne[instr->mnemonic], |
213 prefix[instr->admode], Label (addr, abso), | 213 prefix[instr->admode], Label (addr, abso, 1), |
214 postfix[instr->admode]); | 214 postfix[instr->admode]); |
215 break; | 215 break; |
216 case zrel: /* BBR0, etc. 65C02 instructions */ | 216 case zrel: /* BBR0, etc. 65C02 instructions */ |
217 addr = (int)(char)Memory[(ADDR_T)(address + 2)]; | 217 addr = (int)(char)Memory[(ADDR_T)(address + 2)]; |
218 /* addr -= (addr > 127) ? 256 : 0; BUGFIX: sign extend already done */ | 218 /* addr -= (addr > 127) ? 256 : 0; BUGFIX: sign extend already done */ |
219 addr += address + size; | 219 addr += address + size; |
220 fprintf (stdout, "%s %s, %s\n", mne[instr->mnemonic], | 220 fprintf (stdout, "%s %s, %s\n", mne[instr->mnemonic], |
221 Label (Memory[(ADDR_T)(address + 1)], abso), | 221 Label (Memory[(ADDR_T)(address + 1)], abso, 1), |
222 Label (addr, abso)); | 222 Label (addr, abso, 1)); |
223 break; | 223 break; |
224 } | 224 } |
225 } | 225 } |
226 else if (address != (addr = WordTableEnd (address))) { /* word table */ | 226 else if (address != (addr = WordTableEnd (address))) { /* word table */ |
227 for (size = (ADDR_T)(addr - address); size; | 227 for (size = (ADDR_T)(addr - address); size; |
228 address += (counter = size > (maxwidth & ~1) ? | 228 address += (counter = size > (maxwidth & ~1) ? |
229 (maxwidth & ~1) : size), size -= counter) { | 229 (maxwidth & ~1) : size), size -= counter) { |
230 if (IsLabeled (address)) { | 230 if (IsLabeled (address)) { |
231 if (Options & M_ADDRESSES) | 231 if (Options & M_ADDRESSES) |
232 fprintf (stdout, "%04x %s%s:\n", address, lineinfix, | 232 fprintf (stdout, "%04x %s%s:\n", address, lineinfix, |
233 Label (address, abso)); | 233 Label (address, abso, 0)); |
234 else | 234 else |
235 fprintf (stdout, "%s ", Label (address, abso)); | 235 fprintf (stdout, "%s ", Label (address, abso, 0)); |
236 } | 236 } |
237 for (counter = size > (maxwidth & ~1) ? (maxwidth & ~1) : size, | 237 for (counter = size > (maxwidth & ~1) ? (maxwidth & ~1) : size, |
238 addr = address + 1; --counter; addr++) | 238 addr = address + 1; --counter; addr++) |
239 if (IsLabeled (addr)) { | 239 if (IsLabeled (addr)) { |
240 if (Options & M_ADDRESSES) | 240 if (Options & M_ADDRESSES) |
241 fprintf (stdout, "%04x %s%s = * + %u\n", addr, lineinfix, | 241 fprintf (stdout, "%04x %s%s = * + %u\n", addr, lineinfix, |
242 Label (addr, abso), (ADDR_T)(addr - address)); | 242 Label (addr, abso, 0), (ADDR_T)(addr - address)); |
243 else | 243 else |
244 fprintf (stdout, "\t%s = * + %u\n", Label (addr, abso), | 244 fprintf (stdout, "\t%s = * + %u\n", Label (addr, abso, 0), |
245 (ADDR_T)(addr - address)); | 245 (ADDR_T)(addr - address)); |
246 } | 246 } |
247 | 247 |
248 if (Options & M_ADDRESSES) | 248 if (Options & M_ADDRESSES) |
249 fprintf (stdout, "%04x ", address); | 249 fprintf (stdout, "%04x ", address); |
257 (maxwidth & ~1) : size), stdout); | 257 (maxwidth & ~1) : size), stdout); |
258 } | 258 } |
259 | 259 |
260 fprintf (stdout, " .word %s", | 260 fprintf (stdout, " .word %s", |
261 Label (Memory[address] | | 261 Label (Memory[address] | |
262 (Memory[(ADDR_T)(address + 1)] << 8), abso)); | 262 (Memory[(ADDR_T)(address + 1)] << 8), abso, 0)); |
263 | 263 |
264 for (counter = size > (maxwidth & ~1) ? (maxwidth & ~1) : size, | 264 for (counter = size > (maxwidth & ~1) ? (maxwidth & ~1) : size, |
265 addr = address + 2; counter -= 2; addr += 2) | 265 addr = address + 2; counter -= 2; addr += 2) |
266 fprintf (stdout, ",%s", | 266 fprintf (stdout, ",%s", |
267 Label (Memory[addr] | (Memory[(ADDR_T)(addr + 1)] << 8), | 267 Label (Memory[addr] | (Memory[(ADDR_T)(addr + 1)] << 8), |
268 abso)); | 268 abso, 0)); |
269 | 269 |
270 | 270 |
271 fputc ('\n', stdout); | 271 fputc ('\n', stdout); |
272 } | 272 } |
273 } | 273 } |
281 } | 281 } |
282 | 282 |
283 if (IsLabeled (address)) { | 283 if (IsLabeled (address)) { |
284 if (Options & M_ADDRESSES) | 284 if (Options & M_ADDRESSES) |
285 fprintf (stdout, "%04x %s%s:\n", address, lineinfix, | 285 fprintf (stdout, "%04x %s%s:\n", address, lineinfix, |
286 Label (address, abso)); | 286 Label (address, abso, 0)); |
287 else | 287 else |
288 fprintf (stdout, "%s ", Label (address, abso)); | 288 fprintf (stdout, "%s ", Label (address, abso, 0)); |
289 } | 289 } |
290 | 290 |
291 for (counter = size, addr = address + 1; --counter; addr++) | 291 for (counter = size, addr = address + 1; --counter; addr++) |
292 if (IsLabeled (addr)) { | 292 if (IsLabeled (addr)) { |
293 if (Options & M_ADDRESSES) | 293 if (Options & M_ADDRESSES) |
294 fprintf (stdout, "%04x %s%s = * + %u\n", addr, lineinfix, | 294 fprintf (stdout, "%04x %s%s = * + %u\n", addr, lineinfix, |
295 Label (addr, abso), (ADDR_T)(addr - address)); | 295 Label (addr, abso, 0), (ADDR_T)(addr - address)); |
296 else | 296 else |
297 fprintf (stdout, "\t%s = * + %u\n", Label (addr, abso), | 297 fprintf (stdout, "\t%s = * + %u\n", Label (addr, abso, 0), |
298 (ADDR_T)(addr - address)); | 298 (ADDR_T)(addr - address)); |
299 } | 299 } |
300 | 300 |
301 if (Options & M_ADDRESSES) | 301 if (Options & M_ADDRESSES) |
302 fprintf (stdout, "%04x ", address); | 302 fprintf (stdout, "%04x ", address); |