Mercurial > hg > forks > dxa
comparison dxa.1 @ 0:4410c9c7750d
Initial import.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 24 Feb 2015 18:53:52 +0200 |
parents | |
children | 84c0facfc43c |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4410c9c7750d |
---|---|
1 .TH DXA "1" "31 January 2007" | |
2 | |
3 .SH NAME | |
4 dxa \- 6502/R65C02 disassembler | |
5 | |
6 .SH SYNOPSIS | |
7 .B dxa | |
8 [\fIOPTION\fR]... \fIFILE\fR | |
9 | |
10 .SH DESCRIPTION | |
11 .B dxa | |
12 is the semi-official disassembler option for the | |
13 .BR xa (1) | |
14 package, a weakly patched version of Marko Mäkelä's | |
15 .B d65 | |
16 disassembler that generates output similar to the de facto coding | |
17 conventions used for | |
18 .BR xa (1). | |
19 The package is designed to intelligently(?) scan arbitrary code and (with | |
20 hints) can identify the difference between data and valid machine code, | |
21 generating a sane looking, "perfect" disassembly with data and code portions. | |
22 .LP | |
23 Perfect, in this case, means that you can take what | |
24 .B dxa | |
25 spits out and feed it right back into | |
26 .BR xa (1), | |
27 and get the exact same object file you started with, even if sometimes | |
28 .B dxa | |
29 can't identify everything correctly. With a few extra options, you can tease | |
30 and twist the output to generate something not quite so parseable, or even | |
31 more like true assembler source. | |
32 .SH OPTIONS | |
33 For historical and compatibility reasons, the long options (--) only exist | |
34 if | |
35 .B dxa | |
36 were compiled with LONG_OPTIONS enabled in options.h. | |
37 .TP | |
38 .B \--datablock xxxx-yyyy | |
39 .TP | |
40 .B \-b xxxx-yyyy | |
41 Defines the memory range xxxx to yyyy (hexadecimal, inclusive) to be a data | |
42 block. The memory range can be further specified: | |
43 .RS | |
44 .IP * | |
45 If the range is preceded by ! (an exclamation point), such as | |
46 .BR !c000-cfff , | |
47 then it is | |
48 further defined to be a data block with no vectors in it either. | |
49 .IP * | |
50 If the range is preceded by ? (a question mark), then it is further | |
51 defined to be a data block that is completely unused and therefore | |
52 no valid routine may contain instructions whose parameter lie in this | |
53 range. Useful for providing enhanced protection against misinterpreting | |
54 data to be program code, but be careful, or some code may be listed as | |
55 data. For instance, the Commodore 64 firmware uses the base address $CFFF | |
56 when initializing the video chip, and the BASIC interpreter uses the | |
57 addresses $9FEA and $9FEB while loading the instruction pointers. | |
58 In addition to this, there are a number of BIT instructions used for | |
59 skipping the next instruction. Thus, you must allow addresses like $1A9, | |
60 $2A9 and so on. | |
61 .RE | |
62 .TP | |
63 .B \--datablocks filename | |
64 .TP | |
65 .B \-B filename | |
66 Reads data blocks from file | |
67 .B filename | |
68 as if they had been specified on the command | |
69 line, one per line (such as xxxx-yyyy, ?xxxx-yyyy, etc.). | |
70 .TP | |
71 .B \--labels filename | |
72 .TP | |
73 .B \-l filename | |
74 Causes label names to be read from file | |
75 .BR filename . | |
76 This file format is the same as the labelfile/symbol table file generated | |
77 by | |
78 .BR xa (1) | |
79 with the | |
80 .B \-l | |
81 option. The | |
82 .B \-l | |
83 was chosen on purpose for consistency with | |
84 .BR xa (1). | |
85 .TP | |
86 .B \--routine xxxx | |
87 .TP | |
88 .B \-r xxxx | |
89 Specifies an address (in hexadecimal) that is declared to be a valid routine. | |
90 .B It is strongly recommended | |
91 that you specify the initial execution address as a routine. | |
92 For example, for a Commodore 64 binary with a | |
93 .B SYS 2064 | |
94 header, add | |
95 .B \-r0810 | |
96 so that disassembly starts at that location. This may have interactions with | |
97 datablock detection | |
98 .RB ( \-d ). | |
99 .TP | |
100 .B \--routines filename | |
101 .TP | |
102 .B \-R filename | |
103 Causes a list of routines to be read from file | |
104 .BR filename , | |
105 one per line as if they had been specified on the command line. | |
106 .TP | |
107 .B \--addresses option | |
108 .TP | |
109 .B \-a option | |
110 Determines if and what kind of address information should be dumped with the | |
111 disassembly, if any. Note that this may make your output no longer intelligible | |
112 to | |
113 .BR xa (1). | |
114 The valid options are: | |
115 .RS | |
116 .TP | |
117 .B disabled | |
118 Dump source only with no address information. This is the default. | |
119 .TP | |
120 .B enabled | |
121 Write the current address at the beginning of each line. | |
122 .TP | |
123 .B dump | |
124 Write the current address at the beginning of each line, along with a hexdump | |
125 of the bytes for which the statement was generated. | |
126 .RE | |
127 .TP | |
128 .B \--colon-newline | |
129 .TP | |
130 .B \-N | |
131 .TP | |
132 .B \--no-colon-newline | |
133 .TP | |
134 .B \-n | |
135 A purely cosmetic option to determine how labels are emitted. Many people, | |
136 including myself, prefer a listing where the label is given, then a tab, | |
137 then the code | |
138 .RB ( \-n ). | |
139 Since this is | |
140 .I my | |
141 preference, it's the default. On the other hand, there are also many who | |
142 prefer to have the label demarcated by a colon and a newline, and the code | |
143 beginning indented on the next line. This is the way | |
144 .B d65 | |
145 used to do it, and is still supported with | |
146 .BR \-N . | |
147 .TP | |
148 .B \--processor option | |
149 .TP | |
150 .B \-p option | |
151 Specify the instruction set. Note that specifying an instruction set that | |
152 permits and disassembles illegal and/or undocumented | |
153 NMOS opcodes may make your output unintelligible to | |
154 .BR xa (1). | |
155 Only one may be specified. The valid options are: | |
156 .RS | |
157 .TP | |
158 .B standard-nmos6502 | |
159 Only official opcodes will be recognized. This is the default. | |
160 .TP | |
161 .B r65c02 | |
162 Opcodes specific to the Rockwell 65C02 (R65C02) will also be allowed. | |
163 .TP | |
164 .B all-nmos6502 | |
165 Allows all 256 NMOS opcodes to be disassembled, whether documented or | |
166 undocumented. | |
167 Note that instructions generated by this mode are not guaranteed to work on | |
168 all NMOS 6502s. | |
169 .TP | |
170 .B rational-nmos6502 | |
171 Only allows "rational" undocumented instructions. This excludes ANE, SHA, | |
172 SHS, SHY, SHX, LXA and LAXS. This is a judgment call. | |
173 .TP | |
174 .B useful-nmos6502 | |
175 Only allows "useful" undocumented instructions. This excludes ANE, SHA, | |
176 SHS, SHY, SHX, LXA, LAXS, NOOP and STP. This is a judgment call. | |
177 .TP | |
178 .B traditional-nmos6502 | |
179 Only allows the most widely accepted undocumented instructions based on | |
180 combinations of ALU and RMW operations. This excludes ANE, SHA, SHS, SHY, | |
181 SHX, LXA, LAXS, NOOP, STP, ARR, ASR, ANC, SBX and USBC. | |
182 This is a judgment call. | |
183 .RE | |
184 .TP | |
185 .B \--get-sa | |
186 .TP | |
187 .B \-G | |
188 .TP | |
189 .B \--no-get-sa xxxx | |
190 .TP | |
191 .B \-g xxxx | |
192 Enables or disables automatic starting address detection. If enabled (the | |
193 default), | |
194 .B dxa | |
195 looks at the first two bytes as a 16-bit word in 6502 little-endian format | |
196 and considers that to be the starting address for the object, discarding them | |
197 without further interpretation. This is very useful for Commodore computers in | |
198 particular. If your binary does not have a starting address, you must | |
199 specify one using | |
200 .B \-g | |
201 or | |
202 .B \--no-get-sa | |
203 followed by a hexadecimal address. The starting address will then be encoded | |
204 into the output using | |
205 .BR "* =" . | |
206 .TP | |
207 .B \--no-word-sa | |
208 .TP | |
209 .B \-q | |
210 .TP | |
211 .B \--word-sa | |
212 .TP | |
213 .B \-Q | |
214 Only relevant if automatic starting address detection is enabled. If so, | |
215 the default is to also emit the starting address as a | |
216 .B \&.word | |
217 pseudo-op before the starting address indicated with | |
218 .B * = | |
219 so that it will be regenerated on re-assembly | |
220 .RB ( \-Q ). | |
221 Otherwise, if this option is disabled, the starting address word will not be | |
222 re-emitted and | |
223 will need to be tacked back on if the target requires it. If you specify an | |
224 address with | |
225 .BR \-g , | |
226 then that address will be used here too. | |
227 .TP | |
228 .B \--verbose | |
229 .TP | |
230 .B \-v | |
231 Enables verbose output, which may or may not be useful in the same way that | |
232 Schroedinger's Cat may or may not be dead. | |
233 .TP | |
234 .B \--help | |
235 .TP | |
236 .B \-? | |
237 .TP | |
238 .B \-V | |
239 A quick summary of options. | |
240 .LP | |
241 The following options control how program code is scanned and determined | |
242 to be a valid (or invalid) portion of a putative routine. | |
243 .TP | |
244 .B \--datablock-detection option | |
245 .TP | |
246 .B \-d option | |
247 This controls how the program automatically detects data blocks for addresses | |
248 where no previous hints are specified. Only one method may be specified. | |
249 The valid options are: | |
250 .RS | |
251 .TP | |
252 .B poor | |
253 As much as the object as possible will be listed as program code, even if | |
254 there are illegal instructions present. This is the default. | |
255 .TP | |
256 .B strict | |
257 Assumes that all declared routines call and execute only valid instructions. If | |
258 any portion of code declared as a routine leads to an address block containing | |
259 illegal opcodes, a consistency error will occur and disassembly will stop. | |
260 .TP | |
261 .B skip-scanning | |
262 Program addresses that are not referenced by any routine will not be scanned | |
263 for valid routines (thus data a priori). | |
264 .RE | |
265 .TP | |
266 .B \--no-external-labels | |
267 .TP | |
268 .B \-e | |
269 .TP | |
270 .B \--external-labels | |
271 .TP | |
272 .B \-E | |
273 Controls whether labels should be generated for addresses outside of the | |
274 program itself. The default is not to (i.e., leave the addresses absolute). | |
275 .TP | |
276 .B \--address-tables option | |
277 .TP | |
278 .B \-t option | |
279 Controls detection of address tables/dispatch tables. The following options | |
280 are available: | |
281 .RS | |
282 .TP | |
283 .B ignore | |
284 Don't attempt to detect address tables. | |
285 .TP | |
286 .B detect-all | |
287 Address tables referencing any label will be detected. | |
288 .TP | |
289 .B detect-internal | |
290 Address tables with labels whose addresses lie within the program's address | |
291 range will be detected. This is the default. | |
292 .RE | |
293 .TP | |
294 .B \--no-suspect-jsr | |
295 .TP | |
296 .B \-j | |
297 .TP | |
298 .B \--suspect-jsr | |
299 .TP | |
300 .B \-J | |
301 These options indicate whether JSRs are always expected to return to the | |
302 following instruction or not. This will affect how routines are parsed. For | |
303 example, the Commodore 128 KERNAL has a routine called PRIMM that prints a | |
304 null-terminated string directly following the JSR instruction, returning after | |
305 the null byte. In this case, | |
306 .B \-J | |
307 should be specified to alert the disassembler that this is possible. The | |
308 default is to expect "normal" JSRs (i.e., | |
309 .BR \-j ). | |
310 .TP | |
311 .B \--no-one-byte-routines | |
312 .TP | |
313 .B \-o | |
314 .TP | |
315 .B \--one-byte-routines | |
316 .TP | |
317 .B \-O | |
318 These options permit or inhibit a single RTS, RTI or BRK instruction (or STP | |
319 if enabled by the instruction set), or a conditional branch, from being | |
320 automatically identified as a routine. The default is to inhibit this; specific | |
321 cases may be selectively overridden with the | |
322 .B \-r | |
323 option. | |
324 .TP | |
325 .B \--no-stupid-jumps | |
326 .TP | |
327 .B \-m | |
328 .TP | |
329 .B \--stupid-jumps | |
330 .TP | |
331 .B \-M | |
332 These options consider jumps or branches to the current address (such as | |
333 JMP *, BCC *) to be invalid or valid code depending on which is specified. | |
334 Note that BVC * is always accepted as the V flag can sometimes be toggled | |
335 by an external hardware signal. The default is to consider them | |
336 invalid otherwise. | |
337 .TP | |
338 .B \--no-allow-brk | |
339 .TP | |
340 .B \-w | |
341 .TP | |
342 .B \--allow-brk | |
343 .TP | |
344 .B \-W | |
345 These options control if BRK (or STP if enabled by the instruction set) should | |
346 be treated as a valid exit from a routine, just like RTS or RTI. The default | |
347 is not to do so. | |
348 .TP | |
349 .B \--no-suspect-branches | |
350 .TP | |
351 .B \-c | |
352 .TP | |
353 .B \--suspect-branches | |
354 .TP | |
355 .B \-C | |
356 These options are rarely needed, but account for the case where a program may | |
357 intentionally obfuscate its code using branches with unusual destination | |
358 addresses like LDA #2:BEQ *-1. In the default case, this would be considered | |
359 to be invalid and not treated as a routine | |
360 .RB ( \-c ); | |
361 if | |
362 .B \-C | |
363 is specified, it would be accepted as valid. | |
364 .SH BUGS/TO-DO | |
365 There are probably quite a few bugs yet to be found. | |
366 .LP | |
367 65816 opcodes are not (yet) supported. | |
368 .LP | |
369 The disassembler can easily be confused by the common idiom of tacking on | |
370 BASIC text to call an appended ML routine. There probably should be a special | |
371 case option for this. One workaround is to use the | |
372 .B \--datablock | |
373 option and specify the range as unused (such as in the case of | |
374 .B 10 SYS2061 | |
375 (Commodore), giving | |
376 .B \-b ?0801-080c | |
377 to ignore that range as data). | |
378 .LP | |
379 There are a few options Marko created that aren't hooked up to anything (and | |
380 are not documented here on purpose). I might finish these later. | |
381 | |
382 .SH "SEE ALSO" | |
383 .BR xa (1), | |
384 .BR file65 (1), | |
385 .BR ldo65 (1), | |
386 .BR printcbm (1), | |
387 .BR reloc65 (1), | |
388 .BR uncpk (1) | |
389 | |
390 .SH AUTHOR | |
391 This manual page was written by Cameron Kaiser <ckaiser@floodgap.com>. | |
392 .B dxa | |
393 is based on | |
394 .B d65 | |
395 0.2.1 by Marko Mäkelä. | |
396 Original package (C)1993, 1994, 2000 Marko Mäkelä. Additional changes | |
397 (C)2006 Cameron Kaiser. | |
398 .B dxa | |
399 is maintained independently. | |
400 | |
401 .SHWEBSITE | |
402 http://www.floodgap.com/retrotech/xa/ |