.so /usr/lib/tmac/tmac.e .TH ASM 1 "1 May 1986" .SH NAME asm \- generic assembler .SH SYNOPSIS .B asm [ .B \-o binname] [ .B \-l listname] [ .B \-x xrefname] inputfile .br .SH DESCRIPTION The generic assembler is an attempt to build a quick-and-dirty meta- assembler, with which code for several types of microcomputers can be generated. It outputs absolute code in two passes, contains a minimum of pseudo-ops, and is quasi-portable between micro types. The opcodes and instruction layout information is contained within tables, leaving the code unchanged from micro to micro. There has been no effort expended to make the assembler match any particular assembly format on the market, so don't expect any miracles there. The statup options specify various files for input and output. The basic option is the name of the input file; normally it is suffixed by ".a", although this is not necessary. If no file is given, then input is taken from standard input. The .B \-o option introduces the name of the file to receive the binary output. If the option does not exist, the binary goes to standard output (since the output is actually in ASCII format, it won't bolix your screen if you forget). If the option is not followed immediately by a filename, then the binary will be output to the input file name suffixed by ".o". The format of the binary output is "Intel Standard Hexadecimal Format" and is documented in the source code. The .B \-l option similarly specifies the file for the assembly listing; if the option is not given, no listing is produced. If the option is alone, then the listing will go into the input file name suffixed with ".l". The .B \-x option specifies the file to receive the cross-reference; it defaults to the same filename as the listing, and is deleted if the option is not given. .pp The assembler boasts (or at least admits) the following features: .in +.5i .ip \(bu Two pass, all labels are defined both forward and backward. .ip \(bu Absolute format code only, no relocation information available. .ip \(bu Table driven instruction formats, including single opcodes and fixed numbers of operands. .ip \(bu Expression evaluation in operands is left-to-right, no precedence or parentheses. .ip \(bu Predefined symbols accomodated. .ip \(bu Pseudo-ops include org, equ, set (for changing manifest variables), bss, data, data2 (two bytes!!), string, seg (for setting up data segments that are made contiguous right after pass 1) and end. .ip \(bu Atoms in operands include labels, ops add (+), subtract (-), multiply (*), integer divide (/), mod (%), and (&), or (|), and exclusive or (^), decimal constants, hexadecimal constants (with a leading zero), right justified zero-filled single characters ('x) and double characters ("xx). The string pseudo-op supports strings surrounded by any unused delimiter. .in -.5i .pp The pseudo op syntax is as follows: .in +.5i .ip "[label] org expr Set the value of the symbol in label to the current location counter; set the location counter to the value of the expression. .ip "label equ expr Set the value of the symbol in label to the value of the expression. Any such value may only be changed by a "set" pseudo. .ip "label set expr Reset the value of a symbol to the value of the expression. .ip "[label] bss expr Set the value of the symbol in the label to the current location counter, then set the location counter to its current value plus the value of the expression. .ip "[label] data [:count:]expr Set the value of the label to the current location counter, and then generate count (default 1) bytes of data, each containing the value of the expression. Count must contain no forward referenced symbols. .ip "[label] data2 [:count:]expr Set the value of the label to the current location counter, and then generate count (default 1) double-bytes of data, each double-byte containing the value of the expression. Count must contain no forward referenced symbols. .ip "[label] string $string$ Set the value of the label to the current location counter, and then generate the string as bytes from left to right, appending a single nul byte. The string delimiter shown above ($) may be any character that doesn't appear in the string itself, except blank or tab. The special escapes \\t (tab), \\r (carriage return), \\n (newline), \\b (backspace), \\? (del), \\^ (escape), \\nn (nn is any hex pair) and \\\\ (\\ itself) are allowed. .ip " seg [name] Declare a new or reuse an older data segment, which defines it's own location counter. The segment that is predefined at the beginning of the assembler may be returned to by a .b seg with no argument. Any number of segments may be invoked. Each segment's location counter starts at zero during pass 1. When pass 1 is complete, the segments are "stacked" in the order that they were created, so that the second segment's lc starts at the first location following the end of the first segment's highest lc. These computed lc's are displayed in the pass 2 listing output. The name used may be any non-blank-containing string; it is also independent of the symbol name space. At this time, there are no other definable characteristics of segments. .in -.5i .SH "OTHER FILES /tmp/asm* - intermediate files. .SH AUTHOR Lyle McElhaney