by Paul McKee
The program was written in VAX-11 C by Paul McKee during the fall semester, 1986. The program should be portable (with reasonable changes) to any C language implementation that supports 32-bit integers.
Each line of the source code consists of the following fields:
LABEL OPERATION OPERAND,OPERAND,... COMMENTFor example,
LOOP MOVE.L (A0)+,(A1)+ Sample source lineThe fields may be separated by any combination of spaces and tabs. Except for the comment field and quoted strings, there must be no spaces or tabs within a field.
spaces or tabs. (There may be spaces or tabs within an item, but only within quoted strings.)
A comment may also be inserted in the source file in another way: An asterisk ("*") at the beginning of the line or after the label field will cause the rest of the line to be ignored, i.e., treated as a comment.
Symbols appear in the source code as labels, constants, and operands. The first character of a symbol must be either a letter (A-Z) or a period ("."). The remaining characters may be letters, dollar signs ("$"), periods ("."), or underscores("_"). A symbol may be of any length, but only the first 8 characters are significant. Remember that capitalization is ignored, so symbols which are capitalized differently are really the same.
A decimal number consists of a sequence of decimal digits (0-9) of any length. A warning will be generated if the value of the number cannot be represented in 32 bits.
A hexadecimal number consists of a dollar sign ("$") followed by a sequence of hexadecimal digits (0-9 and A-F) of any
length. A warning will be generated if the value of the number cannot be represented in 32 bits.
A binary number consists of a percent sign ("%") followed by a sequence of binary digits (0 and 1) of any length. A warning will be generated if the number consists of more that 32 digits.
An octal number consists of a commercial at sign ("@") followed by a sequence of octal digits (0-7) of any length. A warning will be generated if the value of the number cannot be represented in 32 bits.
An ASCII constant consists of one to four ASCII characters enclosed in single quote marks. If it is desired to put a single quote mark inside an ASCII constant, then two consecutive single quotes may be used to represent one such character.
If the ASCII constant consists of one character, then it will be placed in the bottom byte of the 32 bit value; two characters will be placed in the bottom word, with the first character in the higher-order position. If four characters are used, then all four bytes will contain characters, with the first in the highest-order location. However, if three characters are used, then they will be placed in the three highest-order bytes of the 32-bit value, with 0 in the low byte (this is to accommodate the high-byte-first addressing used on the 68000).
Note that ASCII constants in expressions are different from strings in DC directives, as the latter may be of any length.
|Operators in Expressions|
|2.||-||Unary minus (two's complement)|
|~||Bitwise not (one's complement)|
|3.||<<||Shift left (x<<y produces x shifted left by y bits and zero filled)|
|\||Modulus (x\y produces the remainder when x is divided by y)|
|An||=||Address Register (SP may used instead of A7)|
|Xn||=||Data or Address register|
|.s||=||Index register size code, either .W or .L|
|(.W will be assumed if omitted)|
|<ex8>||=||Expression that evaluates to an 8-bit value|
|(may be empty, in which case 0 will be used)|
|<ex16>||=||Expression that evaluates to a 16-bit value|
|(may be empty, in which case 0 will be used)|
|Addressing Mode Specifications|
|Data Register Direct||Dn|
|Address Register Direct||An|
|Address Register Indirect||(An)|
|Address Register Indirect with Predecrement||-(An)|
|Address Register Indirect with Postincrement||(An)+|
|Address Register Indirect with Displacement||<ex16>(An)|
|Address Register Indirect with Index||<ex8>(An,Xn.s)|
|Absolute Short or Long (chosen by assembler)||<ex>|
|Program Counter with Displacement||<ex16>(PC)|
|Program Counter with Index||<ex8>(PC,Xn.s)|
|CCR||=||Condition Code Register|
|USP||=||User Stack Pointer|
|VBR||=||Vector Base Register (68010)|
|SFC||=||Source Function Code Register (68010)|
|DFC||=||Destination Function Code Register (68010)|
MOVEM <register_list>,<effective_address> MOVEM <effective_address>,<register_list>The register list may be an explicit register list of the form described in Section 4.2.3. On the other hand, if a particular set of registers is to be saved and restored repeatedly, the REG directive (Section 4.2.3) can be used to define a register list symbol that specifies the registers. For example, if the register list symbol WORKSET is defined as follows:
WORKSET REG A0-A4/D1/D2then the following instructions will perform the same function:
MOVEM.L WORKSET,-(SP) MOVEM.L A0-A4/D1/D2,-(SP)If a register list symbol is used, it must be defined before it appears in any MOVEM instructions.
The MOVEQ instruction may be used for moving an immediate value in the range -128 to +127 into a data register. The assembler will assemble a MOVE.L #<value>,Dn as a MOVEQ if the value is known on the first pass.
The ADDQ (SUBQ) instruction adds (subtracts) an immediate value from 1 to 8 to (from) any alterable destination. The assembler will use the quick form if the value is known on the first pass to be in the range 1 to 8.
<label> ORG <expression>where <expression> is an expression containing no forward references, i.e., its value must be known on the first pass at the point where the ORG directive appears. An error will result if an attempt is made to set the location counter to an odd value; in this case the location counter will be set to the specified value plus one. The <label> is optional and, if present, the specified symbol will be set to the new value of the location counter.
<label> EQU <expression>where <expression> is an expression containing no forward refer ences, i.e., its value must be known on the first pass at the point where the EQU directive appears. The <label> must be specified, since it tells what symbol is being defined. If <label> is omitted, an error will result. If an attempt is made to redefine a symbol that was defined with EQU, either as a label or using any symbol definition directive, an error message will be printed.
<label> SET <expression>
D3-D0/D7/A1-A3The registers and ranges may be specified in any order. The same format for register lists may be used with the MOVEM instruction directly. In order to avoid confusion, it is best to avoid specifying a range that includes both an address register and a data register, although the assembler will not treat this as an error.
<label> DC.<size> <item>,<item>,...The label will be defined to equal the address of the start of the list of data. The size code specifies that a list of bytes (.B), words (.W), or longwords (.L) is being defined; if omitted, word size is used.
A list of items follows the directive; each item may be an expression or a string. If an item is an expression, the expres sion is evaluated and stored as the size indicated, i.e., a byte, a word, or a longword. An error is generated if the value will not fit as either a signed or unsigned value in the specified size. If an item is a string, delimited by single quotes, then the string will be stored in successive entities of the size specified; if words or longwords are being generated, and the string does not fit into an whole number of words or longwords, then the string will be padded with zeros at the end to make a
whole number of words or longwords. Strings and expressions may intermixed in a single DC directive.
If words (DC.W) or longwords (DC.L) are being generated, then the start of the list of constants will be aligned on a word boundary by increasing the location counter by one, if necessary. This is not performed for DC.B directives, so that strings of bytes may be contiguous in memory. If an instruction follows a DC.B directive, the assembler will automatically adjust the location counter (if necessary) to place the instruction on a word boundary.
An example of a DC directive that defines a null-terminated string:
TEXT DC.B 'DC Example',$0D,$0A,0This directive results in the following data at location TEXT:
44 43 20 45 78 61 6D 70 6C 65 0D 0A 00 (hexadecimal)
<label> DCB.<size> <length>,<value>The label will be defined to equal the address of the start of the block. The size code specifies that a block of bytes (.B), words (.W), or longwords (.L) is being set up; if omitted, word size is used.
The length argument is an expression that tells the number of bytes, words, or longwords that are to be in the block. This value must be known on the first pass at the point where the DCB directive appears, and it must be non-negative. The value argument is an expression whose value is to be placed in each data item in the block; it needn't be known on the first pass. An warning message will be printed if the value will not fit (as a signed or unsigned number) in the data size selected.
If word or longword size is selected, then the start of the block will be placed on a word boundary by increasing the location counter by one, if necessary. If an instruction follows a DCB.B directive, the assembler will automatically adjust the location counter (if necessary) to place the instruction on a word boundary.
block of bytes, words, or longwords. The format of the directive is
<label> DS.<size> <length>The label will be defined to equal the address of the start of the block. The size code specifies that a block of bytes (.B), words (.W), or longwords (.L) is being set up; if omitted, word size is used.
The length argument is an expression that tells the number of bytes, words, or longwords that are to be in the block. This value must be known on the first pass at the point where the DCB directive appears, and it must be non-negative. The effect of the DS directive is basically to increase the value of the location counter by <length> times one (if DS.B is used), two (if DS.W is used), or four (if DS.L is used)
If word or longword size is selected, then the start of the block will be placed on a word boundary by increasing the loca tion counter by one, if necessary. Thus, DS.W 0 can be used to force the location counter to be aligned on a word boundary without allocating any space. However, if an instruction follows a DS.B directive, the assembler will automatically adjust the location counter (if necessary) to align the instruction on a word boundary.
ENDThe assembler will ignore anything in the source file after the END directive.
ASM <options> <filename>The options are a string of letters, preceded by a dash, which alter the behavior of the assembler. The following option letters are allowed:
|C||=||Show all the Constants produced by DC directives|
|(see Section 5.2)|
|L||=||Produce a Listing file|
|N||=||Produce No object code file|
The filename is the name, including directory specifica tions, of the file to be assembled. No default file extension is applied. The names of the listing and object code files, if generated, are constructed by using the source file name with an extension of ".LIS" (for the listing) or ".H68" (for the object file); the output files are always placed in the user's default directory.
The program will print "68000 Assembler by PGM" when it begins work. If any errors occur, the program will print ËRROR in line X" or "WARNING in line X" (this information is also placed in the listing file). Upon conclusion, it will print the number of errors encountered and warnings generated during the assembly.
If there is an error in the command line, e.g., if no file name is specified, then the assembler will print a brief usage summary and abort.
The assembler produces a listing file which shows the source code alongside the the object code produced by the assembler. A typical listing file line might appear as follows (not to scale):
0000102E 22D8 200 LOOP MOVE.L (A0)+,(A1)+ SampleThe eight digit hexadecimal number at the left is the assembler's location counter; the generated instruction word, $22D8, is placed at that address. The next number is the source file line number, and the remainder of the line simply repeats the source line. Remember that if the source lines are no longer than 80 columns, then the listing file lines will not exceed 132 columns.
If an error is encountered or a warning is generated for a given source line, then in the listing that line will be followed by a line that describes the error. At the end of the listing, the program prints the total number of errors and warnings.
There is only limited space to list the object code in this format. There is sufficient space for the longest possible instruction, but the DC directive poses a problem, since it may generate, e.g., dozens of longwords from a single source line. The assembler's -C command line option controls the assembler's actions when the object code exceeds the space available on one line. If -C is not specified, then the assembler will print only one listing line with an ellipsis ("...") at the end of the object code field, indicating that some of the data produced by the directive was omitted from the listing. If -C is included on the command line, then the assembler will use as many source lines as are needed to print all the data produced by the directive. Each line after the first will contain only the location counter and the object code field (the source line is not repeated).
The S-record format is designed to allow files containing any data to
be interchanged in text file format with checksum error detection. The
format of these files will not be described here, but the following technical
information will be provided: The first line of the object file is an S0
(header) record and the last line is an S9 (termination) record. The lines
in between are S1, S2, or S3 records, depending on the whether the address
of the first byte in a record requires 2, 3, or 4 bytes to be represented.
No record is longer than 80 characters.