]> git.sur5r.net Git - cc65/blob - doc/da65.sgml
Merge pull request #143 from greg-king5/basic-stub
[cc65] / doc / da65.sgml
1 <!doctype linuxdoc system>
2
3 <article>
4 <title>da65 Users Guide
5 <author>
6 <url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz">,<newline>
7 <url url="mailto:greg.king5@verizon.net" name="Greg King">
8 <date>2014-11-23
9
10 <abstract>
11 da65 is a 6502/65C02 disassembler that is able to read user-supplied
12 information about its input data, for better results. The output is ready for
13 feeding into ca65, the macro assembler supplied with the cc65 C compiler.
14 </abstract>
15
16 <!-- Table of contents -->
17 <toc>
18
19 <!-- Begin the document -->
20
21 <sect>Overview<p>
22
23 da65 is a disassembler for 6502/65C02 code. It is supplied as a utility with
24 the cc65 C compiler and generates output that is suitable for the ca65
25 macro assembler.
26
27 Besides generating output for ca65, one of the design goals was that the user
28 is able to feed additional information about the code into the disassembler,
29 for improved results. This information may include the location and size of
30 tables, and their format.
31
32 One nice advantage of this concept is that disassembly of copyrighted binaries
33 may be handled without problems: One can just pass the information file for
34 disassembling the binary, so everyone with a legal copy of the binary can
35 generate a nicely formatted disassembly with readable labels and other
36 information.
37
38
39 <sect>Usage<p>
40
41
42 <sect1>Command line option overview<p>
43
44 The assembler accepts the following options:
45
46 <tscreen><verb>
47 ---------------------------------------------------------------------------
48 Usage: da65 [options] [inputfile]
49 Short options:
50   -g                    Add debug info to object file
51   -h                    Help (this text)
52   -i name               Specify an info file
53   -o name               Name the output file
54   -v                    Increase verbosity
55   -F                    Add formfeeds to the output
56   -S addr               Set the start/load address
57   -V                    Print the disassembler version
58
59 Long options:
60   --argument-column n   Specify argument start column
61   --comment-column n    Specify comment start column
62   --comments n          Set the comment level for the output
63   --cpu type            Set cpu type
64   --debug-info          Add debug info to object file
65   --formfeeds           Add formfeeds to the output
66   --help                Help (this text)
67   --hexoffs             Use hexadecimal label offsets
68   --info name           Specify an info file
69   --label-break n       Add newline if label exceeds length n
70   --mnemonic-column n   Specify mnemonic start column
71   --pagelength n        Set the page length for the listing
72   --start-addr addr     Set the start/load address
73   --text-column n       Specify text start column
74   --verbose             Increase verbosity
75   --version             Print the disassembler version
76 ---------------------------------------------------------------------------
77 </verb></tscreen>
78
79
80 <sect1>Command line options in detail<p>
81
82 Here is a description of all the command line options:
83
84 <descrip>
85
86   <label id="option--argument-column">
87   <tag><tt>--argument-column n</tt></tag>
88
89   Specifies the column where the argument for a mnemonic or pseudo instruction
90   starts.
91
92
93   <label id="option--comment-column">
94   <tag><tt>--comment-column n</tt></tag>
95
96   Specifies the column where the comment for an instruction starts.
97
98
99   <label id="option--comments">
100   <tag><tt>--comments n</tt></tag>
101
102   Set the comment level for the output. Valid arguments are 0..4. Greater
103   values will increase the level of additional information written to the
104   output file in form of comments.
105
106
107   <label id="option--cpu">
108   <tag><tt>--cpu type</tt></tag>
109
110   Set the CPU type. The option takes a parameter, which may be one of
111   <itemize>
112   <item>6502
113   <item>6502x
114   <item>65sc02
115   <item>65c02
116   <item>huc6280
117   </itemize>
118
119   6502x is for the NMOS 6502 with unofficial opcodes. huc6280 is the CPU of
120   the PC engine. Support for the 65816 currently is not available.
121
122
123   <label id="option--formfeeds">
124   <tag><tt>-F, --formfeeds</tt></tag>
125
126   Add formfeeds to the generated output. This feature is useful together
127   with the <tt><ref id="option--pagelength" name="--pagelength"></tt> option.
128   If <tt/--formfeeds/ is given, a formfeed is added to the output after each
129   page.
130
131
132   <tag><tt>-g, --debug-info</tt></tag>
133
134   This option adds the <tt/.DEBUGINFO/ command to the output file, so the
135   assembler will generate debug information when re-assembling the generated
136   output.
137
138
139   <tag><tt>-h, --help</tt></tag>
140
141   Print the short option summary shown above.
142
143
144   <label id="option--hexoffs">
145   <tag><tt>--hexoffs</tt></tag>
146
147   Output label offsets in hexadecimal instead of decimal notation.
148
149
150   <label id="option--info">
151   <tag><tt>-i name, --info name</tt></tag>
152
153   Specify an info file. The info file contains global options that may
154   override or replace command line options plus informations about the code
155   that has to be disassembled. See the separate section <ref id="infofile"
156   name="Info File Format">.
157
158
159   <label id="option-o">
160   <tag><tt>-o name</tt></tag>
161
162   Specify a name for an output file. The default is to use <tt/stdout/, so
163   without this switch or the corresponding <ref id="global-options"
164   name="global option"> <tt><ref id="OUTPUTNAME" name="OUTPUTNAME"></tt>,
165   the output will go to the terminal.
166
167
168   <label id="option--label-break">
169   <tag><tt>--label-break n</tt></tag>
170
171   Adds a newline if the length of a label exceeds the given length.
172   Note: If the label would run into the code in the mid column, a
173   linefeed is always inserted regardless of this setting.
174
175   This option overrides the <ref id="global-options" name="global option">
176   <tt><ref id="LABELBREAK" name="LABELBREAK"></tt>.
177
178
179   <label id="option--mnemonic-column">
180   <tag><tt>--mnemonic-column n</tt></tag>
181
182   Specifies the column where a mnemonic or pseudo instrcuction is output.
183
184
185   <label id="option--pagelength">
186   <tag><tt>--pagelength n</tt></tag>
187
188   Sets the length of a listing page in lines. After this number of lines, a
189   new page header is generated. If the <tt><ref id="option--formfeeds"
190   name="--formfeeds"></tt> is also given, a formfeed is inserted before
191   generating the page header.
192
193   A value of zero for the page length will disable paging of the output.
194
195
196   <label id="option--start-addr">
197   <tag><tt>-S addr, --start-addr addr</tt></tag>
198
199   Specify the start/load address of the binary code that is going to be
200   disassembled. The given address is interpreted as an octal value if
201   preceded with a '0' digit, as a hexadecimal value if preceded
202   with '0x', '0X', or '$', and as a decimal value in all other cases. If no
203   start address is specified, $10000 minus the size of the input file is used.
204
205
206   <label id="option--text-column">
207   <tag><tt>--text-column n</tt></tag>
208
209   Specifies the column where additional text is output. This additional text
210   consists of the bytes encoded in this line in text representation.
211
212
213   <tag><tt>-v, --verbose</tt></tag>
214
215   Increase the disassembler verbosity. Usually only needed for debugging
216   purposes. You may use this option more than one time for even more
217   verbose output.
218
219
220   <tag><tt>-V, --version</tt></tag>
221
222   Print the version number of the assembler. If you send any suggestions
223   or bugfixes, please include the version number.
224
225 </descrip>
226 <p>
227
228
229 <sect>Detailed workings<p>
230
231 <sect1>Supported CPUs<p>
232
233 The default (no CPU given on the command line or in the <tt/GLOBAL/ section of
234 the info file) is the 6502 CPU. The disassembler knows all "official" opcodes
235 for this CPU. Invalid opcodes are translated into <tt/.byte/ commands.
236
237 With the command line option <tt><ref id="option--cpu" name="--cpu"></tt>, the
238 disassembler may be told to recognize either the 65SC02 or 65C02 CPUs. The
239 latter understands the same opcodes as the former, plus 16 additional bit
240 manipulation and bit test-and-branch commands.
241
242 While there is some code for the 65816 in the sources, it is currently
243 unsupported.
244
245
246 <sect1>Attribute map<p>
247
248 The disassembler works by creating an attribute map for the whole address
249 space ($0000 - $FFFF). Initially, all attributes are cleared. Then, an
250 external info file (if given) is read. Disassembly is done in several passes.
251 In all passes, with the exception of the last one, information about the
252 disassembled code is gathered and added to the symbol and attribute maps. The
253 last pass generates output using the information from the maps.
254
255 <sect1>Labels<p>
256
257 Some instructions may generate labels in the first pass, while most other
258 instructions do not generate labels, but use them if they are available. Among
259 others, the branch and jump instructions will generate labels for the target
260 of the branch in the first pass. External labels (taken from the info file)
261 have precedence over internally generated ones, They must be valid identifiers
262 as specified for the ca65 assembler. Internal labels (generated by the
263 disassembler) have the form <tt/Labcd/, where <tt/abcd/ is the hexadecimal
264 address of the label in upper case letters. You should probably avoid using
265 such label names for external labels.
266
267
268 <sect1>Info File<p>
269
270 The info file is used to pass additional information about the input code to
271 the disassembler. This includes label names, data areas or tables, and global
272 options like input and output file names. See the <ref id="infofile"
273 name="next section"> for more information.
274
275
276
277 <sect>Info File Format<label id="infofile"><p>
278
279 The info file contains lists of specifications grouped together. Each group
280 directive has an identifying token and an attribute list enclosed in curly
281 braces. Attributes have a name followed by a value. The syntax of the value
282 depends on the type of the attribute. String attributes are places in double
283 quotes, numeric attributes may be specified as decimal numbers or hexadecimal
284 with a leading dollar sign. There are also attributes where the attribute
285 value is a keyword; in this case, the keyword is given as-is (without quotes or
286 anything). Each attribute is terminated by a semicolon.
287
288 <tscreen><verb>
289         group-name { attribute1 attribute-value; attribute2 attribute-value; }
290 </verb></tscreen>
291
292
293 <sect1>Comments<p>
294
295 Comments start with a hash mark (<tt/#/); and, extend from the position of
296 the mark to the end of the current line. Hash marks inside of strings will
297 <em/not/ start a comment, of course.
298
299
300 <sect1>Specifying global options<label id="global-options"><p>
301
302 Global options may be specified in a group with the name <tt/GLOBAL/. The
303 following attributes are recognized:
304
305 <descrip>
306
307   <tag><tt/ARGUMENTCOLUMN/</tag>
308   This attribute specifies the column in the output, where the argument for
309   an opcode or pseudo instruction starts. The corresponding command line
310   option is
311   <tt><ref id="option--argument-column" name="--argument-column"></tt>.
312
313
314   <tag><tt/COMMENTCOLUMN/</tag>
315   This attribute specifies the column in the output, where the comment starts
316   in a line. It is only used for in-line comments. The corresponding command
317   line option is
318   <tt><ref id="option--comment-column" name="--comment-column"></tt>.
319
320
321   <label id="COMMENTS">
322   <tag><tt/COMMENTS/</tag>
323   This attribute may be used instead of the <tt><ref id="option--comments"
324   name="--comments"></tt> option on the command line. It takes a numerical
325   parameter between 0 and 4. Higher values increase the amount of information
326   written to the output file in form of comments.
327
328
329   <tag><tt/CPU/</tag>
330   This attribute may be used instead of the <tt><ref id="option--cpu"
331   name="--cpu"></tt> option on the command line. For possible values see
332   there. The value is a string and must be enclosed in quotes.
333
334
335   <tag><tt/HEXOFFS/</tag>
336   The attribute is followed by a boolean value. If true, offsets to labels are
337   output in hex, otherwise they're output in decimal notation. The default is
338   false. The attribute may be changed on the command line using the <tt><ref
339   id="option--hexoffs" name="--hexoffs"></tt> option.
340
341
342   <tag><tt/INPUTNAME/</tag>
343   The attribute is followed by a string value, which gives the name of the
344   input file to read. If it is present, the disassembler does not accept an
345   input file name on the command line.
346
347
348   <tag><tt/INPUTOFFS/</tag>
349   The attribute is followed by a numerical value that gives an offset into
350   the input file which is skipped before reading data. The attribute may be
351   used to skip headers or unwanted code sections in the input file.
352
353
354   <tag><tt/INPUTSIZE/</tag>
355   <tt/INPUTSIZE/ is followed by a numerical value that gives the amount of
356   data to read from the input file. Data beyond <tt/INPUTOFFS + INPUTSIZE/
357   is ignored.
358
359
360   <label id="LABELBREAK">
361   <tag><tt/LABELBREAK/</tag>
362   <tt/LABELBREAK/ is followed by a numerical value that specifies the label
363   length that will force a newline. To have all labels on their own lines,
364   you may set this value to zero.
365
366   See also the <tt><ref id="option--label-break" name="--label-break"></tt>
367   command line option. A <tt/LABELBREAK/ statement in the info file will
368   override any value given on the command line.
369
370
371   <tag><tt/MNEMONICCOLUMN/</tag>
372   This attribute specifies the column in the output, where the mnemonic or
373   pseudo instruction is placed. The corresponding command line option is
374   <tt><ref id="option--mnemonic-column" name="--mnemonic-column"></tt>.
375
376
377   <tag><tt/NEWLINEAFTERJMP/</tag>
378   This attribute is followed by a boolean value. When true, a newline is
379   inserted after each <tt/JMP/ instruction. The default is false.
380
381
382   <tag><tt/NEWLINEAFTERRTS/</tag>
383   This attribute is followed by a boolean value. When true, a newline is
384   inserted after each <tt/RTS/ instruction. The default is false.
385
386
387   <label id="OUTPUTNAME">
388   <tag><tt/OUTPUTNAME/</tag>
389   The attribute is followed by string value, which gives the name of the
390   output file to write. If it is present, specification of an output file on
391   the command line using the <tt><ref id="option-o" name="-o"></tt> option is
392   not allowed.
393
394   The default is to use <tt/stdout/ for output, so without this attribute or
395   the corresponding command line option <tt/<ref id="option-o" name="-o">/
396   the output will go to the terminal.
397
398
399   <tag><tt/PAGELENGTH/</tag>
400   This attribute may be used instead of the <tt><ref id="option--pagelength"
401   name="--pagelength"></tt> option on the command line. It takes a numerical
402   parameter. Using zero as page length (which is the default) means that no
403   pages are generated.
404
405
406   <tag><tt/STARTADDR/</tag>
407   This attribute may be used instead of the <tt><ref id="option--start-addr"
408   name="--start-addr"></tt> option on the command line. It takes a numerical
409   parameter. The default for the start address is $10000 minus the size of
410   the input file (this assumes that the input file is a ROM that contains the
411   reset and irq vectors).
412
413
414   <tag><tt/TEXTCOLUMN/</tag>
415   This attribute specifies the column, where the data bytes are output
416   translated into ASCII text. It is only used if
417   <tt><ref id="COMMENTS" name="COMMENTS"></tt> is set to at least 4. The
418   corresponding command line option is
419   <tt><ref id="option--text-column" name="--text-column"></tt>.
420
421 </descrip>
422
423
424 <sect1>Specifying Ranges<p>
425
426 The <tt/RANGE/ directive is used to give information about address ranges. The
427 following attributes are recognized:
428
429 <descrip>
430
431   <tag><tt>COMMENT</tt></tag>
432   This attribute is only allowed if a label is also given. It takes a string
433   as argument. See the description of the <tt><ref id="infofile-label"
434   name="LABEL"></tt> directive for an explanation.
435
436   <tag><tt>END</tt></tag>
437   This gives the end address of the range. The end address is inclusive, that
438   means, it is part of the range. Of course, it may not be smaller than the
439   start address.
440
441   <tag><tt>NAME</tt></tag>
442   This is a convenience attribute. It takes a string argument and will cause
443   the disassembler to define a label for the start of the range with the
444   given name. So a separate <tt><ref id="infofile-label" name="LABEL"></tt>
445   directive is not needed.
446
447   <tag><tt>START</tt></tag>
448   This gives the start address of the range.
449
450   <tag><tt>TYPE</tt></tag>
451   This attribute specifies the type of data within the range. The attribute
452   value is one of the following keywords:
453
454   <descrip>
455     <tag><tt>ADDRTABLE</tt></tag>
456     The range consists of data and is disassembled as a table of words
457     (16 bit values). The difference to the <tt/WORDTABLE/ type is that
458     a label is defined for each entry in the table.
459
460     <tag><tt>BYTETABLE</tt></tag>
461     The range consists of data and is disassembled as a byte table.
462
463     <tag><tt>CODE</tt></tag>
464     The range consists of code.
465
466     <tag><tt>DBYTETABLE</tt></tag>
467     The range consists of data and is disassembled as a table of dbytes
468     (double byte values, 16 bit values with the low byte containing the
469     most significant byte of the 16 bit value).
470
471     <tag><tt>DWORDTABLE</tt></tag>
472     The range consists of data and is disassembled as a table of double
473     words (32 bit values).
474
475     <tag><tt>RTSTABLE</tt></tag>
476     The range consists of data and is disassembled as a table of words (16 bit
477     values). The values are interpreted as words that are pushed onto the
478     stack and jump to it via <tt/RTS/. This means that they contain
479     <tt/address-1/ of a function, for which a label will get defined by the
480     disassembler.
481
482     <tag><tt>SKIP</tt></tag>
483     The range is simply ignored when generating the output file. Please note
484     that this means that reassembling the output file will <em/not/ generate
485     the original file, not only because the missing piece in between, but also
486     because the following code will be located on wrong addresses. Output
487     generated with <tt/SKIP/ ranges will need manual rework.
488
489     <tag><tt>TEXTTABLE</tt></tag>
490     The range consists of readable text.
491
492     <tag><tt>WORDTABLE</tt></tag>
493     The range consists of data and is disassembled as a table of words
494     (16 bit values).
495
496   </descrip>
497
498 </descrip>
499
500
501 <sect1>Specifying Labels<label id="infofile-label"><p>
502
503 The <tt/LABEL/ directive is used to give names for labels in the disassembled
504 code. The following attributes are recognized:
505
506 <descrip>
507
508   <tag><tt>ADDR</tt></tag>
509   Followed by a numerical value. Specifies the value of the label.
510
511   <tag><tt>COMMENT</tt></tag>
512   Attribute argument is a string. The comment will show up in a separate line
513   before the label, if the label is within code or data range, or after the
514   label if it is outside.
515
516   Example output:
517
518 <tscreen><verb>
519         foo     := $0001        ; Comment for label named "foo"
520
521         ; Comment for label named "bar"
522         bar:
523 </verb></tscreen>
524
525   <tag><tt>NAME</tt></tag>
526   The attribute is followed by a string value which gives the name of the
527   label. Empty names are allowed, in this case the disassembler will create
528   an unnamed label (see the assembler docs for more information about unnamed
529   labels).
530
531   <tag><tt>SIZE</tt></tag>
532   This attribute is optional and may be used to specify the size of the data
533   that follows. If a size greater than 1 is specified, the disassembler will
534   create labels in the form <tt/label+offs/ for all bytes within the given
535   range, where <tt/label/ is the label name given with the <tt/NAME/
536   attribute, and <tt/offs/ is the offset within the data.
537
538 </descrip>
539
540
541 <sect1>Specifying Segments<label id="infofile-segment"><p>
542
543 The <tt/SEGMENT/ directive is used to specify a segment within the
544 disassembled code. The following attributes are recognized:
545
546 <descrip>
547
548   <tag><tt>START</tt></tag>
549   Followed by a numerical value. Specifies the start address of the segment.
550
551   <tag><tt>END</tt></tag>
552   Followed by a numerical value. Specifies the end address of the segment. The
553   end address is the last address that is a part of the segment.
554
555   <tag><tt>NAME</tt></tag>
556   The attribute is followed by a string value which gives the name of the
557   segment.
558 </descrip>
559
560 All attributes are mandatory. Segments must not overlap. The disassembler will
561 change back to the (default) <tt/.code/ segment after the end of each defined
562 segment. That might not be what you want. As a rule of thumb, if you're using
563 segments, you should define segments for all disassembled code.
564
565
566 <sect1>Specifying Assembler Includes<label id="infofile-asminc"><p>
567
568 The <tt/ASMINC/ directive is used to give the names of input files containing
569 symbol assignments in assembler syntax:
570
571 <tscreen><verb>
572         Name = value
573         Name := value
574 </verb></tscreen>
575
576 The usual conventions apply for symbol names. Values may be specified as hex
577 (leading &dollar;), binary (leading %) or decimal. The values may optionally
578 be signed.
579
580 NOTE: The include file parser is very simple. Expressions are not allowed, and
581 anything but symbol assignments is flagged as an error (but see the
582 <tt/IGNOREUNKNOWN/ directive below).
583
584 The following attributes are recognized:
585
586 <descrip>
587
588   <tag><tt>FILE</tt></tag>
589   Followed by a string value. Specifies the name of the file to read.
590
591   <tag><tt>COMMENTSTART</tt></tag>
592   The optional attribute is followed by a character constant. It specifies the
593   character that starts a comment. The default value is a semicolon. This
594   value is ignored if <tt/IGNOREUNKNOWN/ is true.
595
596   <tag><tt>IGNOREUNKNOWN</tt></tag>
597   This attribute is optional and is followed by a boolean value. It allows to
598   ignore input lines that don't have a valid syntax. This allows to read in
599   assembler include files that contain more than just symbol assignments.
600   Note: When this attribute is used, the disassembler will ignore any errors
601   in the given include file. This may have undesired side effects.
602
603 </descrip>
604
605
606 <sect1>An Info File Example<p>
607
608 The following is a short example for an info file that contains most of the
609 directives explained above:
610
611 <tscreen><verb>
612         # This is a comment. It extends to the end of the line
613         GLOBAL {
614             OUTPUTNAME      "kernal.s";
615             INPUTNAME       "kernal.bin";
616             STARTADDR       $E000;
617             PAGELENGTH      0;                  # No paging
618             CPU             "6502";
619         };
620
621         # One segment for the whole stuff
622         SEGMENT { START $E000;  END   $FFFF; NAME "kernal"; };
623
624         RANGE { START $E612;    END   $E631; TYPE Code;      };
625         RANGE { START $E632;    END   $E640; TYPE ByteTable; };
626         RANGE { START $EA51;    END   $EA84; TYPE RtsTable;  };
627         RANGE { START $EC6C;    END   $ECAB; TYPE RtsTable;  };
628         RANGE { START $ED08;    END   $ED11; TYPE AddrTable; };
629
630         # Zero-page variables
631         LABEL { NAME "fnadr";   ADDR  $90;   SIZE 3;    };
632         LABEL { NAME "sal";     ADDR  $93;   };
633         LABEL { NAME "sah";     ADDR  $94;   };
634         LABEL { NAME "sas";     ADDR  $95;   };
635
636         # Stack
637         LABEL { NAME "stack";   ADDR  $100;  SIZE 255;  };
638
639         # Indirect vectors
640         LABEL { NAME "cinv";    ADDR  $300;  SIZE 2;    };      # IRQ
641         LABEL { NAME "cbinv";   ADDR  $302;  SIZE 2;    };      # BRK
642         LABEL { NAME "nminv";   ADDR  $304;  SIZE 2;    };      # NMI
643
644         # Jump table at end of kernal ROM
645         LABEL { NAME "kscrorg"; ADDR  $FFED; };
646         LABEL { NAME "kplot";   ADDR  $FFF0; };
647         LABEL { NAME "kiobase"; ADDR  $FFF3; };
648         LABEL { NAME "kgbye";   ADDR  $FFF6; };
649
650         # Hardware vectors
651         LABEL { NAME "hanmi";   ADDR  $FFFA; };
652         LABEL { NAME "hares";   ADDR  $FFFC; };
653         LABEL { NAME "hairq";   ADDR  $FFFE; };
654 </verb></tscreen>
655
656
657
658 <sect>Copyright<p>
659
660 da65 (and all cc65 binutils) is (C) Copyright 1998-2011, Ullrich von
661 Bassewitz. For usage of the binaries and/or sources, the following
662 conditions do apply:
663
664 This software is provided 'as-is', without any expressed or implied
665 warranty.  In no event will the authors be held liable for any damages
666 arising from the use of this software.
667
668 Permission is granted to anyone to use this software for any purpose,
669 including commercial applications, and to alter it and redistribute it
670 freely, subject to the following restrictions:
671
672 <enum>
673 <item>  The origin of this software must not be misrepresented; you must not
674         claim that you wrote the original software. If you use this software
675         in a product, an acknowledgment in the product documentation would be
676         appreciated but is not required.
677 <item>  Altered source versions must be plainly marked as such, and must not
678         be misrepresented as being the original software.
679 <item>  This notice may not be removed or altered from any source
680         distribution.
681 </enum>
682
683
684
685 </article>