Kingswood Software Development Tools AS65 ------------------------------------------------------------------------- NAME as65 - assembler for 6502 and 65SC02 microprocessors. SYNOPSIS as65 [-cdghilnopqstvwxz] file DESCRIPTION This documentation is for as65 [1.41]. Copyright 1990-2005, Frank A. Kingswood. AS65 is an assembler for the 6502 and 65SC02 microprocessors. It reads input from an ASCII text file, assembles this into memory, and then writes a listing and a binary or hex file. If the assembler can't find the source file specified, it tries appending '.a65', '.asm' and '.s' to the name before it gives up with an error message. When run in a DOS box under Windows 95 or later the assembler uses long file names. AS65 is case sensitive, not only does it differentiate between the labels XYZ and xyz, but it also requires all (pseudo) instruction and register names to be lower case. This way, the listing is the most readable. Option -i can be used to make the assembler case insensitive. Alternatively, the included TOLOWER program can be used to convert sources to lower case. OPTIONS As65 recognizes the following options: -c Show number of cycles per instruction in listing. This decreases the number of columns available for listing by 5. The number of cycles is printed between brackets [ and ]. -d Define a label before the first source line is read. If no name is specified, DEBUG is defined. The label is EQUated to be 1. -g Generate source-level debug information file. This file can then be used in in-system debugging or a software simulator. -h Specify height of page for listing. This option determines the number of lines per printed page. Each page has a header and is terminated by a form-feed character. The special case -h0 indicates an infinite page length. In this case, page breaks are only inserted between the two passes and the symbol table (if present). -i Ignore case in opcodes. In this way, the assembler does not differentiate between 'adc' and 'ADC', for example. Labels are still case sensitive. -l Generate pass 2 listing. -l Listing file name. The listing file is used for pass 1 and pass 2 listing, for the symbol table (printed between the two passes), and some statistics. When neither -p nor -t is specified, and -l is given, then the assembler automatically generates a pass 2 listing. When -p or -t is specified, an additional -l should be given is a pass 2 listing is required. The filename - can be used to direct the listing to standard output. -m Show macro expansions in listing. Macro lines are prefixed by a > sign. -n Disable optimizations. When this option is specified no optimizations will be done, even when the OPT pseudo- instruction is used in the source code. -o Specify binary or s-records output file name. The assembler automatically adds ".bin" for binary output or ".s19" for s-records output when no extension is given. -p Generate pass 1 listing. This may be used to examine any optimizations/bugs generated in pass 2. -q Quiet mode. No running line counter is displayed on standard error output. -s Write s-records instead of binary file. The s-records file contains data for (only) the used memory; the binary file begins at the lowest used address, and continues up to the highest used address; filling unused memory between these two addresses with either $ff or $00. -s2 Write intel-hex file instead of binary file. The intel-hex file contains data for (only) the used memory. -t Generate symbol table. The symbol table is listed between passes one and two, displaying the name, hexadecimal and decimal value of each label, using 4-digit hexadecimal numbers where possible, otherwise 8-digit numbers. The decimal value is followed by an asterisk if the label is redefinable (defined using SET instead of EQU). -v Verbose mode. More information is displayed on standard output. -w Specify column width. Normally, the listing is printed using 79 columns for output to a 80-column screen or printer. If the -w option is given without a number following it, then the listing will be 133 columns wide, otherwise it will be the number of colulmns specified (between 60 and 200). -x Use 65SC02 extensions. This CPU has several additional instructions. When this option is not specified the assembler rejects the 65SC02 extensions. -z Fill unused memory with zeros. Normally when a binary file is generated, unused bytes between the lowest and highest used addresses are filled with $ff, the unprogrammed state of EPROMs. If this is not wanted, the -z option can be used to initialize this memory to $00. With s-records, unused memory is not output to the file, and this option forces the creation of an S9 (start address) record instead, even if no start address is specified in the file with the END pseudo- instruction. Commandline options can be catenated, but no other option can follow one that may have a string parameter. Other options can follow one that has a numeric parameter. Thus: -tlfile is correct (specifying symbol table and pass 2 listing), and so is -h80t which specifies 80 lines per page and a symbol table. It is possible to discard any of the the output files by specifying the name 'nul'. EXPRESSIONS The assembler recognizes most C-language expressions. The operators are listed here in order of precedence, highest first: () braces to group subexpressions * $ current location counter unary + - ! ~ unary + (no-operation), negation, logical NOT, binary NOT * / % multiplication, division, modulo + - addition, subtraction << >> shift left, shift right < > <= >= comparison for greater/less than = != comparison for equality (== can be used for =) & binary AND ^ binary XOR | binary OR && logical AND || logical OR hi lo high byte, low byte The logical NOT (!) evaluates to zero if the parameter is nonzero, and vice versa. The binary NOT (~) complements all the bits in its parameter. Logical AND (&&) and OR (||) operators evaluate to one if both resp. at least one argument is nonzero. These two operators evaluate both arguments, unlike the C-language versions. Note: the asterisk is both used as the multiplication operator, and as symbol for the current location. The assembler determines from the context which is which. Thus: 5** is a valid expression, evaluating to five times the current location counter, and: 2+*/2 is too, evaluating to the current location counter divided by two, to which two is added. In the same way, the % sign is both used as the modulo operator and the prefix for binary numbers. Numbers can be specified in any number base between 2 and 36. Decimal numbers can be used without a prefix, hexadecimal numbers can be prefixed by $, octal numbers by @, and binary numbers by %. Other number bases can be used by using the following format: #, where the base is the number base to use (must be specified in decimal), and number is the value. Thus: 1000 - decimal number, value 10*10*10=1000 %1000 - binary number, value 2*2*2=8 @1000 - octal number, value 8*8*8=512 $1000 - hexadecimal number, value 16*16*16=4096 0b1000 - binary number, value 2*2*2=8 0x1000 - hexadecimal number, value 16*16*16=4096 2#1000 - binary number, value 2*2*2=8 4#1000 - base-4 number, value 4*4*4=64 7#1000 - base-7 number, value 7*7*7=343 36#1000 - base-36 number, value 36*36*36=444528 For number bases greater than 10, additional digits are represented by letters, starting from A. Both lower and upper case letters can be used. 11#aa = 120 16#ff = 255 25#oo = 624 36#zz = 1305 PSEUDO-INSTRUCTIONS align Align fills zero or more bytes with zeros until the new address modulo equals zero. If the expression is not present, align fills zero or one bytes with zeros until the new address is even. Example 1: align 256 ; continue assembly on the ; next 256-byte page Example 2: align ; make sure table begins Table dw 1,2,3 ; on an even address bss Put all following data in the bss segment. Only data pseudo-instructions can be used in the bss segment, and these only increment the location counter. It is up to the programmer to initialize the bss segment. The bss segment is especially meaningful in a ROM based system where variables must be placed in RAM, and RAM is not automatically initialized. The assembler internally maintains three separate location counters, one for the code segment, one for the data segment and one for the uninitialized data segment. The user is responsible for not overlapping the segments by setting appropriate origins. The code, data and bss pseudo-instructions can be used to interleave code and data in the source listing, while separating the three in the generated program. The assembler starts with the code segment if none is specified. Example: code org $f000 ; Assuming 4 kbyte code ROM data ; with 2 kbyte program and org $f800 ; 2 kbyte initialized data bss org 0 ; bss segment is in RAM Buffer ds 100 code Begin lda Table,x jsr MyFunc . . data Table db 1,2,3 code MyFunc . . cmap cmap cmap , Establish mapping of characters in strings used as argument of the db pseudo-instruction to byte values. In the first form of this instruction it clears the mapping to be the identity mapping. This is also the default when the assembler starts up. In the second form of this instruction it forces all characters to be mapped to that value (which must be possible to express in 8 bits). In the third form of this instruction it assigns the first byte of the bytelist (which may be expressed as a string) to be the mapping for , the second byte in the bytelist to be the mapping for the character following in the ASCII character set. Example: cmap "a","ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; convert to uppercase Example: cmap -1 ; value for non-digits cmap "0",0,1,2,3,4,5,6,7,8,9 ; decode ASCII digits to binary code Put all assembled instructions and data in the code segment. See BSS data Put all assembled instructions and data in the data segment. See BSS db Define bytes. The bytes may be specified as expressions or strings, and are placed in the current (code or data) segment. This pseudo instruction is similar to the fcb and fcc pseudo-instructions. Example: Message db "\aError\r\n",0 ds Define zero or more bytes empty space. The specified number of bytes are filled with zeros. This pseudo-instruction is identical to the pseudo-instruction rmb. Example: ds 100 ; reserve 100 bytes here dw Define words. The words are placed in the current (code or data) segment. This pseudo-instruction is identical to the fcw and fdb pseudo-instructions. Example: lda Function ; number of function asl a tax lda JumpTable+1,x pha lda JumpTable,x pha rts JumpTable dw Function0 dw Function1 dw Function2 else The else pseudo-instruction can be used for if-then-else constructions. It must be placed between an if and an endif instruction. For an example, see the if pseudo-instruction. end The end pseudo-instruction is optional, and need not be used. If it is used, its optional operand specifies the staring address of the program. This address is displayed when the program is assembled, and is also placed in the s-record output file. Example: end Start endif The endif pseudo-instruction must be used to close an if-endif or if-else-endif construction. For an example, see the if pseudo-instruction. endm The endm pseudo-instruction must be used to close a macro definition, and is only valid as the last statement of a macro.