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