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