'\" t . .\" ASCII for Unicode ellipsis is three dots .schar \[u2026] ... .\" New escape [...] maps to Unicode ellipsis .char \[...] \[u2026] . .\" an-ext.tmac: Check whether we are using grohtml. .nr mH 0 .if \n(.g \ . if '\*(.T'html' \ . nr mH 1 . .\" What about gropdf? .nr mP 0 .if \n(.g \ . if '\*(.T'pdf' \ . nr mP 1 . .\" an-ext.tmac: Start example. .de EX . nr mE \\n(.f . nf . nh . ft CW .. . .\" an-ext.tmac: End example. .de EE . ft \\n(mE . fi . hy \\n(HY .. . .\" Top level heading; wraps .SH .de H1 . if \\n(mP .pdfhref O 1 \\$* . SH \\$* .. . .\" 2nd level heading; wraps .SS .de H2 . if \\n(mP .pdfhref O 2 \\$* . SS \\$* .. . .\" 3rd level heading; bold font, no indent .de H3 . if \\n(.$ \{\ . if \\n(mP .pdfhref O 3 \\$* . .B \&"\\$*" . \} . br .. . .\" Render URL .de UU . ie \\n(mH \{\ \\$1\c . do HTML-NS "" \\$2\c . do HTML-NS "" \\$3 . \} . el \{\ . ie \\n(mP \{\ . pdfhref -W -P "\\$1" -A "\\$3" "\\$2" . \} . el \{\ \\$1\\$2\\$3 . \} . \} .. . .nr PDFOUTLINE.FOLDLEVEL 3 .\" .pdfview /PageMode /UseOutlines .pdfinfo /Title asm6809 2.11 .pdfinfo /Author Ciaran Anscomb . .TH "asm6809" "1" "May 2018" "asm6809-2.11" .hy 0 .nh .H1 NAME .PP asm6809\[em]6809 cross-assembler .H1 SYNOPSIS .PP \fBasm6809\fR \[lB]\fIOPTION\fR\[rB]\[...] \[lB]\fISOURCE-FILE\fR\[rB]\[...] .H1 DESCRIPTION .PP \fBasm6809\fR is a portable macro cross assembler targeting the Motorola 6809 and Hitachi 6309 processors. These processors are most commonly encountered in the Dragon and Tandy Colour Computer. .H1 OPTIONS .TP \f(CB\-B\fR, \f(CB\-\-bin\fR output raw binary file (default) .TP \f(CB\-D\fR, \f(CB\-\-dragondos\fR output DragonDOS binary file .TP \f(CB\-C\fR, \f(CB\-\-coco\fR output CoCo RS-DOS (\[lq]DECB\[rq]) segmented binary file .TP \f(CB\-S\fR, \f(CB\-\-srec\fR output Motorola SREC file .TP \f(CB\-H\fR, \f(CB\-\-hex\fR output Intel hex record file .TP \f(CB\-e\fR, \f(CB\-\-exec\fR \fIaddr\fR EXEC address (for output formats that support one) .TP \f(CB\-8\fR, \f(CB\-9\fR, \f(CB\-\-6809\fR use 6809 ISA (default) .TP \f(CB\-3\fR, \f(CB\-\-6309\fR use 6309 ISA (6809 with extensions) .TP \f(CB\-d\fR, \f(CB\-\-define\fR \fIsym\fR\[lB]=\fInumber\fR\[rB] define a symbol .TP \f(CB\-\-setdp\fR \fIvalue\fR initial value assumed for DP \[lB]undefined\[rB] .TP \f(CB\-o\fR, \f(CB\-\-output\fR \fIfile\fR output filename .TP \f(CB\-l\fR, \f(CB\-\-listing\fR \fIfile\fR create listing file .TP \f(CB\-E\fR, \f(CB\-\-exports\fR \fIfile\fR create exports table .TP \f(CB\-s\fR, \f(CB\-\-symbols\fR \fIfile\fR create symbol table .TP \f(CB\-q\fR, \f(CB\-\-quiet\fR don\[aq]t warn about illegal (but working) code .TP \f(CB\-v\fR, \f(CB\-\-verbose\fR warn about explicitly inefficient code .TP \f(CB\-\-help\fR show help .TP \f(CB\-\-version\fR show program version .PP If more than one \fISOURCE-FILE\fR is specified, they are assembled as though they were all in one file. .H1 USAGE .PP Text is read in and parsed, then as many passes are made over the parsed source as necessary (up to a limit), until symbols are resolved and addresses are stable. The fastest or smallest representation should always be chosen where there is ambiguity. .PP Output formats are: Raw binary, DragonDOS binary, CoCo RS-DOS (\[lq]DECB\[rq]) binary, Motorola SREC, Intel HEX. .PP Additional optional output files are: .IP \(bu 2 A listing file is an annotated copy of the source file with addresses and generated code prepended to each line. .IP \(bu 2 An exports file contains a list of all macro definitions and symbols flagged for export with the \f(CBEXPORT\fR pseudo-op. Suitable for inclusion in subsequent source files. .IP \(bu 2 A symbols file contains a list of \fIall\fR non-local symbols. Suitable for inclusion in subsequent source files, but beware multiple definitions errors if two source files include a common set of symbols. .PP Home page: .UU "<" "http://www.6809.org.uk/asm6809/" ">" .H2 Differences to other assemblers .PP Motorola syntax allows a comment to follow any operands, separated from them only by whitespace. To an extent, this assembler accepts that, but be aware that as spaces are allowed within expressions, if the comment looks like it is continuing an expression it will generate bad code (or raise an error if the result is syntactically incorrect). Example: .IP .EX 0000\ \ 8605\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lda\ \ \ \ \ #5 0002\ \ C60A\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ldb\ \ \ \ \ #5\ *\ 2\ \ twice\ first\ number .EE .PP A strict Motorola assembler would generate bytes C6 05 for the second line, as the \[lq]*\~2\[rq] would be ignored. For consistency, it is best to introduce end of line comments with a \f(CB;\fR character. An asterisk (\f(CB*\fR) can introduce whole line comments. .PP An unquoted semicolon always introduces a comment. The alternate form of the 6309 instructions \f(CBAIM\fR, \f(CBOIM\fR, etc. listed in some documentation that uses a semicolon as a separator is not accepted. .PP A symbol may be forward referenced; any time a reference is unresolvable, another pass is triggered, up to some defined maximum. .PP In 6809 indexed addressing, the offset size will default to the fastest possible form, e.g. if the offset is an expression that happens to evaluate to zero, the \fIno offset\fR form will be used. Prepend \f(CB<<\fR to coerce a 5 bit offset, \f(CB<\fR to coerce 8 bits or \f(CB>\fR to coerce 16 bits. .PP \fBasm6809\fR currently has no support for OS-9 modules or multiple object linking. .H2 Program syntax .PP Program files are considered line by line. Each line contains up to three fields, separated by whitespace: label, instruction and arguments. An unquoted semicolon (\f(CB;\fR) indicates that the rest of the line is to be considered a comment. Whole line comments may be introduced with an asterisk (\f(CB*\fR). Motorola-style end of line comments without a \f(CB;\fR are accepted, but see the notes about assembler differences. .PP Any label must appear at the very beginning of the line. If a label is omitted, whitespace must appear before the operator field. Certain pseudo-ops may affect a label\[aq]s meaning, but usually labels define a symbol referring to the current position in the code (Program Counter, or PC). .PP The instruction field contains either an instruction op-code (mnemonic), a pseudo-op (assembler directive), or a macro name for expansion. .PP Pseudo-ops allow conditional assembly and inline data, can affect code placement and symbol values and be used to include further files inline. See the section on Pseudo-ops for more information. .PP Arguments are a comma-separated list: either instruction operands or arguments to a pseudo-op or macro. Permitted arguments are specific to the instruction or pseudo-op, but in general they may be: .IP \(bu 2 An expression. .IP \(bu 2 A register name, with optional pre-decrement or post-increment. .IP \(bu 2 A nested list surrounded by \f(CB\[lB]\fR and \f(CB\[rB]\fR. This is generally only used to indicate indirect indexed addressing. .PP In addition, any argument may be preceded by: .IP \(bu 2 \f(CB#\fR, indicate immediate value. .IP \(bu 2 \f(CB<<\fR, force 5-bit index offset. .IP \(bu 2 \f(CB<\fR, force direct addressing, 8-bit value or 8-bit index offset. .IP \(bu 2 \f(CB>\fR, force extended addressing, 16-bit value or 16-bit index offset. .H2 Expressions .PP Expressions are formed of: .IP \(bu 2 A decimal number. .IP \(bu 2 An octal number preceded by \f(CB@\fR or with a leading \f(CB0\fR. .IP \(bu 2 A binary number preceded by \f(CB%\fR or \f(CB0b\fR. .IP \(bu 2 A hexadecimal number preceded by \f(CB$\fR or \f(CB0x\fR. .IP \(bu 2 A floating point number: decimal digits surrounding exactly one full stop (\f(CB.\fR). .IP \(bu 2 A single quote followed by any ASCII character (yielding the ASCII value of that character). .IP \(bu 2 A symbol name, local forward reference or local back reference. .IP \(bu 2 Any of the above prefixed with a unary minus (\f(CB\-\fR) or plus (\f(CB+\fR). .IP \(bu 2 A string delimited either by double quotes or \f(CB/\fR. .IP \(bu 2 A combination of any of the above with arithmetic, bitwise, logical or relational operators. .IP \(bu 2 Parenthesis to specify precedence. .PP The assembler uses multiple passes to resolve expressions. If an expression refers to a symbol that cannot currently be resolved, an extra pass is triggered. Similarly, if a symbol is assigned a value (e.g. by an \f(CBEQU\fR pseudo-op) that differs to its value on the previous pass, another is triggered until it becomes stable. .PP When not directly used for their contents (e.g. by \f(CBFCC\fR), strings can be used in place of integer values. The ASCII value of each character is used to represent 8 bits of the integer result up to 32 bits. Example: .IP .EX 0000\ \ CC443A\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ldd\ \ \ \ \ #"D:" .EE .H2 Operators .PP The following operators are available, listed in descending order of precedence (where operators share a precedence, left-to-right evaluation is performed): .RS .TS tab(;); c | l. \fBOperator\fR ;\fBDescription\fR .T& _ | _ c | l. \f(CB+\fR ;unary plus \f(CB\-\fR ;unary minus \f(CB!\fR \f(CB\[ti]\fR ;logical, bitwise NOT .T& _ | _ c | l. \f(CB*\fR ;multiplication \f(CB/\fR ;division \f(CB%\fR ;modulo .T& _ | _ c | l. \f(CB+\fR ;addition \f(CB\-\fR ;subtraction .T& _ | _ c | l. \f(CB<<\fR ;bitwise shift left \f(CB>>\fR ;bitwise shift right .T& _ | _ c | l. \f(CB<\fR \f(CB<=\fR ;relational operators \f(CB>\fR \f(CB>=\fR ;relational operators .T& _ | _ c | l. \f(CB==\fR ;relational equal \f(CB!=\fR ;relational not equal .T& _ | _ c | l. \f(CB&\fR ;bitwise AND .T& _ | _ c | l. \f(CB\[ha]\fR ;bitwise XOR .T& _ | _ c | l. \f(CB|\fR ;bitwise OR .T& _ | _ c | l. \f(CB&&\fR ;logical AND .T& _ | _ c | l. \f(CB||\fR ;logical OR .T& _ | _ c | l. \f(CB?:\fR ;ternary operator .TE .RE .PP Division always returns a floating point result. Other arithmetic operators return integers if both operands are integers, otherwise floating point. Bitwise operators and modulo all cast their operands to integers and return an integer. Relational and logical operators result in 0 if false, 1 if true. Integer calculations are performed using the platform\[aq]s \fIint64_t\fR type, floating point uses \fIdouble\fR. .H2 Conditional assembly .PP The pseudo-ops \f(CBIF\fR, \f(CBELSIF\fR, \f(CBELSE\fR and \f(CBENDIF\fR guide conditional assembly. \f(CBIF\fR and \f(CBELSIF\fR take one argument, which is evaluated as an integer. If the result is non-zero, the following code will be assembled, else it will be skipped. Undefined symbols encountered while evaluating the condition are interpreted as zero (false) rather than raising an error. .PP Conditional assembly pseudo-ops are permitted within macro definitions and will be evaluated at the time of expansion, therefore positional variables can be used to affect macro expansion. .H2 Sections .PP Code can be placed into named sections with the \f(CBSECTION\fR pseudo-op. This can make breaking source into multiple input files more comfortable. Without \f(CBORG\fR or \f(CBPUT\fR directives, sections will follow each other in memory in the order they are first defined. .PP Within each section, there may exist multiple spans of discontiguous data. Certain output formats are able to represent this, for the others (e.g. DragonDOS), the spans are combined first, with the gaps between them padded with zero bytes. .H2 Local labels .PP Local labels are considered local to the current \fIsection\fR. A local label is any decimal number used in the label field, and the same local label may appear mulitple times, unlike other labels. .PP As an operand, a decimal number followed by \f(CBB\fR or \f(CBF\fR is considered to be a back or forward reference to the previous or next occurrence of that numerical local label in the section. .PP In this example, the \f(CB1\fR label occurs twice, but each use of \f(CB1B\fR refers to the closest one searching backwards: .IP .EX 0000\ \ 8E0400\ \ \ \ scroll\ \ \ \ \ \ ldx\ \ \ \ \ #$0400 0003\ \ EC8820\ \ \ \ 1\ \ \ \ \ \ \ \ \ \ \ ldd\ \ \ \ \ 32,x 0006\ \ ED81\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std\ \ \ \ \ ,x++ 0008\ \ 8C05E0\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ cmpx\ \ \ \ #$05e0 000B\ \ 25F6\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ blo\ \ \ \ \ 1B 000D\ \ CC6060\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ldd\ \ \ \ \ #$6060 0010\ \ ED81\ \ \ \ \ \ 1\ \ \ \ \ \ \ \ \ \ \ std\ \ \ \ \ ,x++ 0012\ \ 8C0600\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ cmpx\ \ \ \ #$0600 0015\ \ 25F9\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ blo\ \ \ \ \ 1B 0017\ \ 39\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rts .EE .PP An exclamation mark (\f(CB!\fR) in the label field is treated as a local label numbered zero. Operands of \f(CB<\fR and \f(CB>\fR are considered equivalent to \f(CB0B\fR and \f(CB0F\fR respectively, and can therefore refer to the \f(CB!\fR local label. This is included for compatibility with other assemblers. .PP As local labels can be repeated, their position is used to distinguish them. For this reason, all file inclusions and macro expansion must occur during the first pass so that the absolute line count at which each local label is encountered remains the same between passes. .H2 Macros .PP Start a macro definition by specifying a name for it in the label field, and \f(CBMACRO\fR in the instruction field. Finish the definition with \f(CBENDM\fR in the instruction field. .PP Use a macro by specifying its name in the instruction field. Any arguments given will be available during expansion as a positional variable. .PP Positional variables can be used within strings, or pasted to form symbol names. In either case, they must be quoted or they will be passed by value, which will result in an error if they do not correspond to valid symbols by themselves. .PP The positional variables are referred to with \f(CB\\{1}\fR, \f(CB\\{2}\fR, \[...], \f(CB\\{\fIn\fB}\fR. For the first nine arguments, the braces are not required, so \f(CB\\1\fR, \f(CB\\2\fR, \[...], \f(CB\\9\fR are valid alternatives. For compatibility with the TSC Flex assembler, another form is accepted: \f(CB&{1}\fR, \f(CB&{2}\fR, \[...], \f(CB&{\fIn\fB}\fR. Within a string, the shorter \f(CB&1\fR, \f(CB&2\fR, \[...], \f(CB&9\fR is still valid, but as this can be confused with bitwise AND, it is not permitted elsewhere. .PP Here\[aq]s a silly example demonstrating positional variables and symbol pasting. Consider the following macro definition and utilising code: .IP .EX go_left\ \ \ \ \ \ \ \ \ equ\ \ \ \ \ \-1 go_right\ \ \ \ \ \ \ \ equ\ \ \ \ \ +1 move\ \ \ \ \ \ \ \ \ \ \ \ macro \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lda\ \ \ \ \ x_position \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ adda\ \ \ \ #go_\\1 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ sta\ \ \ \ \ x_position \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ endm do_move \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ move\ \ \ \ "right" \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rts x_position\ \ \ \ \ \ rmb\ \ \ \ \ 1 .EE .PP The main code generated is as follows: .IP .EX 0000\ \ \ \ \ \ \ \ \ \ \ \ do_move 0000\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ move\ \ \ \ "right" 0000\ \ B60009\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lda\ \ \ \ \ x_position 0003\ \ 8B01\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ adda\ \ \ \ #go_\\1 0005\ \ B70009\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ sta\ \ \ \ \ x_position 0008\ \ 39\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ rts .EE .H2 Pseudo-ops .PP Conditional assembly: .TP \f(CBIF\fR \fIcondition\fR Subsequent lines are assembled only if \fIcondition\fR evaluates to true (non-zero). .TP \f(CBELSIF\fR \fIcondition\fR Subsequent lines are assembled only if all preceding \f(CBIF\fR and \f(CBELSIF\fR pseudo-ops evaluated to false (zero) and \fIcondition\fR evaluates to true (non-zero). .TP \f(CBELSE\fR Subsequent lines are assembled only if all preceding \f(CBIF\fR and \f(CBELSIF\fR pseudo-ops evaluated to false (zero). .TP \f(CBENDIF\fR Terminate an \f(CBIF\fR statement. .PP Macro definition: .TP \f(CBMACRO\fR Start defining a macro. The macro\[aq]s name shall be in the label field. Subsequent lines up to the enclosing \f(CBENDM\fR pseudo-op will not be assembled until the macro is expanded. Macro definitions may be nested; that is, using a macro may define another macro. .TP \f(CBENDM\fR Finish a macro definition started with \f(CBMACRO\fR. .PP Inline data: .TP \f(CBFCB\fR \fIvalue\fR\[lB],\fIvalue\fR\[rB]\[...] .TQ \f(CBFCC\fR \fIvalue\fR\[lB],\fIvalue\fR\[rB]\[...] Form Constant Byte. Each \fIvalue\fR is evaluated either to a number or a string. Numbers are truncated to 8 bits and stored directly as bytes. For strings, the ASCII value of each character is stored in sequential bytes. .IP Historically, \f(CBFCB\fR handled bytes and \f(CBFCC\fR (Form Constant Character string) handled strings. \fBasm6809\fR treats them as synonymous, but is rather more strict about what is allowed as a string delimiter. .TP \f(CBFCN\fR \fIvalue\fR\[lB],\fIvalue\fR\[rB]\[...] Identical to \f(CBFCC\fR, but a terminating zero byte is stored after the data. Included to increase compatibility with other assemblers. .TP \f(CBFCS\fR \fIvalue\fR\[lB],\fIvalue\fR\[rB]\[...] .PP Like \f(CBFCC\fR, but the last byte in each \fIvalue\fR has its top bit set. This is the format used to represent keywords in the Dragon and Tandy Colour Computer BASIC ROMs. .TP \f(CBFCV\fR \fIvalue\fR\[lB],\fIvalue\fR\[rB]\[...] .PP Like \f(CBFCC\fR, but ASCII is translated into the values typically required for display by the MC6847 VDG as present in the Dragon and Tandy Colour Computer. .TP \f(CBFCI\fR \fIvalue\fR\[lB],\fIvalue\fR\[rB]\[...] .PP Like \f(CBFCV\fR, but inverts bit 6 for inverse video. .TP \f(CBFDB\fR \fIvalue\fR\[lB],\fIvalue\fR\[rB]\[...] Form Double Byte. Each \fIvalue\fR is evaluated to a number, which is truncated to 16 bits and stored as two successive bytes (big-endian). .TP \f(CBFQB\fR \fIvalue\fR\[lB],\fIvalue\fR\[rB]\[...] Form Quad Byte. Each \fIvalue\fR is evaluated to a number, which is truncated to 32 bits and stored as four successive bytes (big-endian). .TP \f(CBFILL\fR \fIvalue\fR,\fIcount\fR Insert \fIcount\fR bytes of \fIvalue\fR. This is effectively the same as the two-argument form of \f(CBRZB\fR with its arguments swapped. .TP \f(CBRZB\fR \fIcount\fR\[lB],\fIvalue\fR\[rB] .TQ \f(CBZMB\fR \fIcount\fR\[lB],\fIvalue\fR\[rB] .TQ \f(CBBSZ\fR \fIcount\fR\[lB],\fIvalue\fR\[rB] Reserve Zeroed Bytes. Inserts a sequence of \fIcount\fR bytes of zero, or \fIvalue\fR if specified. The two-argument form is effectively the same as \f(CBFILL\fR with its arguments swapped. .IP \f(CBZMB\fR and \f(CBBSZ\fR are alternate forms recognised for compatibility with other assemblers. .PP Code placement & addressing: .TP \f(CBALIGN\fR \fIalignment\fR\[lB],\fIvalue\fR\[rB]\[...] Align to memory next \fIalignment\fR bytes. Pads with \fIvalue\fR. If \fIvalue\fR is not specified, this behaves like \f(CBRMB\fR instead. .TP \f(CBORG\fR \fIaddress\fR Sets the Program Counter\[em]the base address assumed for the next assembled instruction. Unless followed by a \f(CBPUT\fR pseudo-op, this will also be the instruction\[aq]s actual address in memory. A label on the same line will define a symbol with a value of the specified address. .TP \f(CBPUT\fR \fIaddress\fR Modify the put address\[em]the Program Counter is unaffected, so the assumed address for subsequent instructions remains the same, but the actual data will be located elsewhere. Useful for assembling code that is going to be copied into place before executing. .TP \f(CBRMB\fR \fIcount\fR Reserve Memory Bytes. The Program Counter is advanced \fIcount\fR bytes. In some output formats this region may be padded with zeroes, in others a new loadable section may be created. .TP \f(CBSECTION\fR \fIname\fR .TQ \f(CBCODE\fR .TQ \f(CBDATA\fR .TQ \f(CBBSS\fR .TQ \f(CBRAM\fR .TQ \f(CBAUTO\fR Switch to the named section. The Program Counter will continue from the last value it had while assembling this section, or follow the previous section if had not previously been seen. .IP Each of \f(CBCODE\fR, \f(CBDATA\fR, \f(CBBSS\fR, \f(CBRAM\fR, and \f(CBAUTO\fR switches to a section named after the pseudo-op. They are recognised for compatibility with other assemblers. .TP \f(CBSETDP\fR \fIpage\fR Set the assumed value of the Direct Page (\f(CBDP\fR) register to \fIpage\fR for subsequent instructions. Any non-negative \fIpage\fR is truncated to 8 bits, or specify a negative number to disable automatic direct addressing. .IP See the section on Direct Page addressing for more information. .PP Symbols: .TP \f(CBEQU\fR \fIvalue\fR Short for \[lq]equate\[rq], this must be used with a label and defines a symbol with the specified \fIvalue\fR. This may be any single valid argument (e.g. an expression or a string). .TP \f(CBEXPORT\fR \fIname\fR\[lB],\fIname\fR\[rB]\[...] Each \fIname\fR\[em]either the name of a macro or a symbol\[em]is flagged to be exported. Exported macros and symbols will be listed in the exports output file, if specified. .TP \f(CBSET\fR \fIvalue\fR Similar to \f(CBEQU\fR, this must be used with a label and defines a symbol with the specified \fIvalue\fR. Unlike \f(CBEQU\fR, you can use \f(CBSET\fR multiple times to assign different values to the same symbol without error. .PP Files: .TP \f(CBEND\fR \[lB]\fIaddress\fR\[rB] Signifies the end of input. All further lines are disregarded. .IP Optionally specifies an EXEC address to be included in the output, where supported by the output format. An EXEC address specified on the command line will override any value specified here. .TP \f(CBINCLUDE\fR \fIfilename\fR Includes the contents of another file at this point in assembly. The \fIfilename\fR argument must be a string, i.e. delimited by quotes or \f(CB/\fR characters. .TP \f(CBINCLUDEBIN\fR \fIfilename\fR Includes the binary data from \fIfilename\fR (which, as with \f(CBINCLUDE\fR must be a delimited string) directly. .H2 Direct Page addressing .PP The 6809 extends the zero page concept from other processors by allowing fast accesses to whichever page is selected by the Direct Page register (\f(CBDP\fR). An assembler is not able to keep track of what the code has set this register to, but the information is useful when deciding which addressing mode to use for an instruction. The \f(CBSETDP\fR pseudo-op, or \f(CB\-\-setdp\fR option, informs the assembler that the supplied value is to be assumed for \f(CBDP\fR. Set this to a negative number to undefine it and disable automatic use of direct addressing (this is the default). .H1 LICENCE .PP This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. .PP This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. .PP You should have received a copy of the GNU General Public License along with this program. If not, see .UU "<" "http://www.gnu.org/licenses/" ">."