13 *NOTE: Every effort has been made to ensure the accuracy and robustness of this
14 manual and the associated software. However, because Reboot is constantly improving
15 and updating its computer software, it is unable to guarantee
16 the accuracy of printed or duplicated material after the date of publication and
17 disclaims liability for changes, errors or omissions.*
20 *Copyright © 2011-2020, Reboot*
22 *All rights reserved.*
24 *Reboot Document number F00000K-001 Rev. A.*
36 This document describes RMAC, a fast macro assembler for the 68000. RMAC currently
37 runs on the any POSIX compatible platform and the Atari ST. It was initially written
38 at Atari Corporation by programmers who needed a high performance assembler
39 for their work. Then, more than 20 years later, because there was still a need for
40 such an assembler and what was available wasn't up to expectations, Subqmod
41 and eventually Reboot continued work on the freely released source, adding Jaguar
42 extensions and fixing bugs. Over time the assembler has been extended by adding
43 support for Motorola's 68020/30/40/60, 68881/2, DSP56001 CPUs as well as Atari's
44 Object Processor (OP) found on the Atari Jaguar.
46 RMAC is intended to be used by programmers who write mostly in assembly language.
47 It was not originally a back-end to a C compiler, therefore it
48 has creature comfort that are usually neglected in such back-end assemblers. It
49 supports include files, macros, symbols with limited scope, some limited control
50 structures, and other features. RMAC is also blindingly fast, another feature
51 often sadly and obviously missing in today's assemblers.\ [1]_
53 RMAC is not entirely compatible with the AS68 assembler provided with
54 the original Atari ST Developer's Kit, but most changes are minor and a few minutes
55 with an editor should allow you to assemble your current source files. If you are an
56 AS68 user, before you leap into the unknown please read the section on Notes for
59 .. [1] It processes 30,000 lines a minute on a lightly loaded VAX 11/780; maybe 40,000 on a 520-ST with an SH-204 hard disk. Yet it could be sped up even more with some effort and without resorting to assembly language; C doesn't have to be slow!
65 * The distribution disk contains a file called README that you should read.
66 This file contains important nays about the contents of the distribution disk
67 and summarizes the most recent changes to the tools.
69 * Hard disk users can simply copy the executable files to their work or binary
70 directories. People with floppy disks can copy the executables to ramdisks,
71 install the assembler with the -q option, or even work right off of the floppies.
73 * You will need an editor that can produce "normal" format text files. Micro
74 Emacs will work well, as will most other commercial program editors, but not
75 most word processors (such as First Word or Microsoft Write).
77 * You will probably want to examine or get a listing of the file "ATARI.S". It
78 contains lots of definitions for the Atari ST, including BIOS variables, most
79 BIOS, XBIOS and GEMDOS traps, and line-A equates. We (or you) could
80 split the file up into pieces (a file for line-A equates, a file for hardware and
81 BIOS variables and so on), but RMAC is so fast that it doesn't matter
84 * Read the rest of the manual, especially the first two chapters on The Command Line and Using RMAC.
85 Also, `Notes for migrating from other 68000 assemblers`_ will save a lot of time and frustration in the long run.
86 The distribution disk contains example
87 programs that you can look at, assemble and modify.
92 The assembler is called "**rmac**" or "**rmac.prg**". The command line takes the form:
94 **rmac** [*switches*] [*files* ...]
96 A command line consists of any number of switches followed by the names of files
97 to assemble. A switch is specified with a dash (**-**) followed immediately by a key
98 character. Key characters are not case-sensitive, so "**-d**" is the same as "**-D**". Some
99 switches accept (or require) arguments to immediately follow the key character,
100 with no spaces in between.
102 Switch order is important. Command lines are processed from left to right in
103 one pass, and switches usually take effect when they are encountered. In general it
104 is best to specify all switches before the names of any input files.
106 If the command line is entirely empty then RMAC prints a copyright message
107 along with usage info and exit.
109 Input files are assumed to have the extension "**.s**"; if a filename has no extension
110 (i.e. no dot) then "**.s**" will be appended to it. More than one source filename may be
111 specified: the files are assembled into one object file, as if they were concatenated.
113 RMAC normally produces object code in "**file.o**" if "**file.s**" is the first
114 input filename. If the first input file is a special character device, the output name
115 is noname.o. The **-o** switch (see below) can be used change the output file name.
118 =================== ===========
120 =================== ===========
121 -dname\ *[=value]* Define symbol, with optional value.
122 -e\ *[file[.err]]* Direct error messages to the specified file.
123 -fa ALCYON output object file format (implied when **-ps** is enabled).
124 -fb BSD COFF output object file format.
125 -fe ELF output object file format.
126 -fr Absolute address. Source code is required to have one .org statement.
127 -fx Atari 800 com/exe/xex output object file format.
128 -i\ *path* Set include-file directory search path.
129 -l\ *[file[prn]]* Construct and direct assembly listing to the specified file.
130 -l\ *\*[filename]* Create an output listing file without pagination
131 -m\ *cpu* Switch CPU type
151 `tom - Jaguar GPU JRISC`
153 `jerry - Jaguar DSP JRISC`
155 -o\ *file[.o]* Direct object code output to the specified file.
156 +/~oall Turn all optimisations on/off
157 +o\ *0-10*/*p* Enable specific optimisation
158 ~o\ *0-10*/*p* Disable specific optimisation
160 `0: Absolute long adddresses to word (on by default)`
162 `1: move.l #x,Dn/An to moveq (on by default)`
164 `2: Word branches to short (on by default)`
166 `3: Outer displacement 0(An) to (An)`
170 `5: 68020+ Absolute long base/outer displacement to word`
172 `6: Convert null short branches to NOP`
174 `7: Convert clr.l Dn to moveq #0,Dn`
176 `8: Convert adda.w/l #x,Dy to addq.w/l #x,Dy`
178 `9: Convert adda.w/l #x,Dy to lea x(Dy),Dy`
180 `p: Force PC-Relative mode (alternative: o10)`
181 -p Produce an executable (**.prg**) output file.
182 -ps Produce an executable (**.prg**) output file with symbols.
183 -px Produce an executable (**.prg**) output file with extended symbols.
184 -q Make RMAC resident in memory (Atari ST only).
185 -r *size* automatically pad the size of each
186 segment in the output file until the size is an integral multiple of the
187 specified boundary. Size is a letter that specifies the desired boundary.
189 `-rw Word (2 bytes, default alignment)`
193 `-rp Phrase (8 bytes)`
195 `-rd Double Phrase (16 bytes)`
197 `-rq Quad Phrase (32 bytes)`
198 -s Warn about unoptimized long branches and applied optimisations.
199 -u Force referenced and undefined symbols global.
200 -v Verbose mode (print running dialogue).
201 -x Turn on debugging mode
202 -yn Set listing page size to n lines.
203 file\ *[s]* Assemble the specified file.
204 =================== ===========
206 The switches are described below. A summary of all the switches is given in
210 The **-d** switch permits symbols to be defined on the command line. The name
211 of the symbol to be defined immediately follows the switch (no spaces). The
212 symbol name may optionally be followed by an equals sign (=) and a decimal
213 number. If no value is specified the symbol's value is zero. The symbol at-
214 tributes are "defined, not referenced, and absolute". This switch is most useful
215 for enabling conditionally-assembled debugging code on the command line; for
220 -dDEBUG -dLoopCount=999 -dDebugLevel=55
223 The -e switch causes RMAC to send error messages to a file, instead of the
224 console. If a filename immediately follows the switch character, error messages
225 are written to the specified file. If no filename is specified, a file is created with
226 the default extension "**.err**" and with the root name taken from the first input
227 file name (e.g. error messages are written to "**file.err**" if "**file**" or "**file.s**" is
228 the first input file name). If no errors are encountered, then no error listing
229 file is created. Beware! If an assembly produces no errors, any error file from
230 a previous assembly is not removed.
233 The **-i** switch allows automatic directory searching for include files. A list of
234 semi-colon seperated directory search paths may be mentioned immediately
235 following the switch (with no spaces anywhere). For example:
239 -im:;c:include;c:include\sys
241 will cause the assembler to search the current directory of device **M**, and the
242 directories include and include\sys on drive **C**. If *-i* is not specified, and the
243 enviroment variable "**RMACPATH**" exists, its value is used in the same manner.
244 For example, users of the Mark Williams shell could put the following line in
245 their profile script to achieve the same result as the **-i** example above:
249 setenv RMACPATH="m:;c:include;c:include\sys"
251 The -l switch causes RMAC to generate an assembly listing file. If a file-
252 name immediately follows the switch character, the listing is written to the
253 specified file. If no filename is specified, then a listing file is created with the
254 default extension "**.prn**" and with the root name taken from the first input file
255 name (e.g. the listing is written to "**file.prn**" if "**file**" or "**file.s**" is the first
258 The -o switch causes RMAC to write object code on the specified file. No
259 default extension is applied to the filename. For historical reasons the filename
260 can also be seperated from the switch with a space (e.g. "**-o file**").
265 The **-p** and **-ps** switches cause RMAC to produce an Atari ST executable
266 file with the default extension of "**.prg**". If there are any external references
267 at the end of the assembly, an error message is emitted and no executable file
268 is generated. The **-p** switch does not write symbols to the executable file. The
269 **-ps** switch includes symbols (Alcyon format) in the executable file.
271 The **-q** switch is aimed primarily at users of floppy-disk-only systems. It causes
272 RMAC to install itself in memory, like a RAMdisk. Then the program
273 **m.prg** (which is very short - less than a sector) can be used instead of
274 **mac.prg**, which can take ten or twelve seconds to load. (**NOTE** not available
275 for now, might be re-implemented in the future).
277 The **-s** switch causes RMAC to generate a list of unoptimized forward
278 branches as warning messages. This is used to point out branches that could
279 have been short (e.g. "bra" could be "bra.s").
281 The **-u** switch takes effect at the end of the assembly. It forces all referenced
282 and undefined symbols to be global, exactly as if they had been made global
283 with a **.extern** or **.globl** directive. This can be used if you have a lot of
284 external symbols, and you don't feel like declaring them all external.
286 The **-v** switch turns on a "verbose" mode in which RMAC prints out (for
287 example) the names of the files it is currently processing. Verbose mode is
288 automatically entered when RMAC prompts for input with a star.
290 The **-y** switch, followed immediately by a decimal number (with no intervening
291 space), sets the number of lines in a page. RMAC will produce *N* lines
292 before emitting a form-feed. If *N* is missing or less than 10 an error message is
298 Let's assemble and link some example programs. These programs are included
299 on the distribution disk in the "**EXAMPLES**" directory - you should copy them to
300 your work area before continuing. In the following examples we adopt the conven-
301 tions that the shell prompt is a percent sign (%) and that your input (the stuff you
302 type) is presented in **bold face**.
304 If you have been reading carefully, you know that RMAC can generate
305 an executable file without linking. This is useful for making small, stand alone
306 programs that don't require externals or library routines. For example, the following
314 could be replaced by the single command:
320 since you don't need the linker for stand-alone object files.
322 Successive source files named in the command line are are concatenated, as in
323 this example, which assembles three files into a single executable, as if they were
328 % rmac -p bugs shift images
330 Of course you can get the same effect by using the **.include** directive, but sometimes
331 it is convenient to do the concatenation from the command line.
333 Here we have an unbelievably complex command line:
337 % rmac -lzorf -y95 -o tmp -ehack -Ddebug=123 -ps example
339 This produces a listing on the file called "**zorf.prn**" with 95 lines per page, writes
340 the executable code (with symbols) to a file called "**tmp.prg**", writes an error listing
341 to the file "**hack.err**", specifies an include-file path that includes the current
342 directory on the drive "**M:**," defines the symbol "**debug**" to have the value 123, and
343 assembles the file "**example.s**". (Take a deep breath - you got all that?)
345 One last thing. If there are any assembly errors, RMAC will terminate
346 with an exit code of 1. If the assembly succeeds (no errors, although there may be
347 warnings) the exit code will be 0. This is primarily for use with "make" utilities.
349 Things You Should Be Aware Of
350 '''''''''''''''''''''''''''''
351 RMAC is a one pass assembler. This means that it gets all of its work done by
352 reading each source file exactly once and then "back-patching" to fix up forward
353 references. This one-pass nature is usually transparent to the programmer, with
354 the following important exceptions:
356 * In listings, the object code for forward references is not shown. Instead, lower-
357 case "xx"s are displayed for each undefined byte, as in the following example:
361 60xx 1: bra.s.2 ;forward branch
362 xxxxxxxx dc.l .2 ;forward reference
363 60FE .2: bra.s.2 ;backward reference
365 * Forward branches (including **BSR**\s) are never optimized to their short forms.
366 To get a short forward branch it is necessary to explicitly use the ".s" suffix in
368 * Error messages may appear at the end of the assembly, referring to earlier source
369 lines that contained undefined symbols.
370 * All object code generated must fit in memory. Running out of memory is a
371 fatal error that you must deal with by splitting up your source files, re-sizing
372 or eliminating memory-using programs such as ramdisks and desk accessories,
377 RMAC does not optimize forward branches for you, but it will tell you about
378 them if you use the -s (short branch) option:
383 "example.s", line 20: warning: unoptimized short branch
385 With the -e option you can redirect the error output to a file, and determine by
386 hand (or editor macros) which forward branches are safe to explicitly declare short.
388 `Notes for migrating from other 68000 assemblers`_
389 ''''''''''''''''''''''''''''''''''''''''''''''''''
390 RMAC is not entirely compatible with the other popular assemblers
391 like Devpac or vasm. This section
392 outlines the major differences. In practice, we have found that very few changes are
393 necessary to make other assemblers' source code assemble.
395 * A semicolon (;) must be used to introduce a comment,
396 except that a star (*)
397 may be used in the first column. AS68 treated anything following the operand
398 field, preceeded by whitespace, as a comment. (RMAC treats a star that
399 is not in column 1 as a multiplication operator).
400 * Labels require colons (even labels that begin in column 1).
402 * Conditional assembly directives are called **if**, **else** and **endif**.
403 Devpac and vasm call these
404 **ifne**, **ifeq** (etc.), and **endc**.
405 * The tilde (~) character is an operator, and back-quote (`) is an illegal character.
406 AS68 permitted the tilde and back-quote characters in symbols.
407 * There are no equivalents to org or section directives apart from .text, .data, .bss.
408 The **.xdef** and **.xref** directives are not implemented,
409 but **.globl** makes these unnecessary anyway.
411 * The location counter cannot be manipulated with a statement of the form:
417 Exceptions to this rule are when outputting a binary using the **-fr** switch,
418 6502 mode, and Jaguar GPU/DSP.
419 * Back-slashes in strings are "electric" characters that are used to escape C-like
420 character codes. Watch out for GEMDOS path names in ASCII constants -
421 you will have to convert them to double-backslashes.
422 * Expression evaluation is done left-to-right without operator precedence. Use parentheses to
423 force the expression evaluation as you wish.
424 * Mark your segments across files.
425 Branching to a code segment that could be identified as BSS will cause a "Error: cannot initialize non-storage (BSS) section"
426 * In 68020+ mode **Zan** and **Zri** (register suppression) is not supported.
427 * rs.b/rs.w/rs.l/rscount/rsreset can be simulated in rmac using **.abs**.
428 For example the following source:
438 size_so_far equ rscount
450 size_so_far equ ^^abscount
451 * A rare case: if your macro contains something like:
461 then by the assembler's design this will fail as the parameters are automatically converted to hex. Changing the code like this works:
473 For those using editors other than the "Emacs" style ones (Micro-Emacs, Mince,
474 etc.) this section documents the source file format that RMAC expects.
476 * Files must contain characters with ASCII values less than 128; it is not per-
477 missable to have characters with their high bits set unless those characters are
478 contained in strings (i.e. between single or double quotes) or in comments.
480 * Lines of text are terminated with carriage-return/line-feed, linefeed alone, or
481 carriage-return alone.
483 * The file is assumed to end with the last terminated line. If there is text beyond
484 the last line terminator (e.g. control-Z) it is ignored.
491 A statement may contain up to four fields which are identified by order of ap-
492 pearance and terminating characters. The general form of an assembler statement
497 label: operator operand(s) ; comment
499 The label and comment fields are optional. An operand field may not appear
500 without an operator field. Operands are seperated with commas. Blank lines are
501 legal. If the first character on a line is an asterisk (*) or semicolon (;) then the
502 entire line is a comment. A semicolon anywhere on the line (except in a string)
503 begins a comment field which extends to the end of the line.
505 The label, if it appears, must be terminated with a single or double colon. If
506 it is terminated with a double colon it is automatically declared global. It is illegal
507 to declare a confined symbol global (see: `Symbols and Scope`_).
509 As an addition, the exclamation mark character (**!**) can be placed at the very first
510 character of a line to disbale all optimisations for that specific line, i.e.
514 !label: operator operand(s) ; comment
518 A statement may also take one of these special forms:
520 *symbol* **equ** *expression*
522 *symbol* **=** *expression*
524 *symbol* **==** *expression*
526 *symbol* **set** *expression*
528 *symbol* **reg** *register list*
530 The first two forms are identical; they equate the symbol to the value of an
531 expression, which must be defined (no forward references). The third form, double-
532 equals (==), is just like an equate except that it also makes the symbol global. (As
533 with labels, it is illegal to make a confined equate global.) The fourth form allows
534 a symbol to be set to a value any number of times, like a variable. The last form
535 equates the symbol to a 16-bit register mask specified by a register list. It is possible
536 to equate confined symbols (see: `Symbols and Scope`_). For example:
540 cr equ 13 carriage-return
542 DEBUG == 1 global debug flag
544 count set count + 1 increment variable
545 .rags reg d3-d7/a3-a6 register list
546 .cr 13 confined equate
550 Symbols may start with an uppercase or lowercase letter (A-Z a-z), an underscore
551 (**_**), a question mark (**?**) or a period (**.**). Each remaining character may be an
552 upper or lowercase letter, a digit (**0-9**), an underscore, a dollar sign (**$**), or a question
553 mark. (Periods can only begin a symbol, they cannot appear as a symbol
554 continuation character). Symbols are terminated with a character that is not a
555 symbol continuation character (e.g. a period or comma, whitespace, etc.). Case is
556 significant for user-defined symbols, but not for 68000 mnemonics, assembler direc-
557 tives and register names. Symbols are limited to 100 characters. When symbols
558 are written to the object file they are silently truncated to eight (or sixteen) char-
559 acters (depending on the object file format) with no check for (or warnings about)
562 For example, all of the following symbols are legal and unique:
566 reallyLongSymbolName .reallyLongConfinedSymbolName
567 a10 ret move dc frog aa6 a9 ????
568 .a1 .ret .move .dc .frog .a9 .9 ????
569 .0 .00 .000 .1 .11. .111 . ._
570 _frog ?zippo? sys$syetem atari Atari ATARI aTaRi
572 while all of the following symbols are illegal:
576 12days dc.10 dc.z 'quote .right.here
577 @work hi.there $money$ ~tilde
580 Symbols beginning with a period (**.**) are *confined*; their scope is between two
581 normal (unconfined) labels. Confined symbols may be labels or equates. It is illegal
582 to make a confined symbol global (with the ".globl" directive, a double colon, or a
583 double equals). Only unconfined labels delimit a confined symbol's scope; equates
584 (of any kind) do not count. For example, all symbols are unique and have unique
585 values in the following:
596 .loop: move.w -1,(a0)+
600 Confined symbols are useful since the programmer has to be much less inventive
601 about finding small, unique names that also have meaning.
603 It is legal to define symbols that have the same names as processor mnemonics
604 (such as "**move**" or "**rts**") or assembler directives (such as "**.even**"). Indeed, one
605 should be careful to avoid typographical errors, such as this classic (in 6502 mode):
613 which equates a confined symbol to a hexadecimal value, rather than setting the
614 location counter, which the .org directive does (without the equals sign).
618 The following names, in all combinations of uppercase and lowercase, are keywords
619 and may not be used as symbols (e.g. labels, equates, or the names of macros):
627 d0 d1 d2 d3 d4 d5 d6 d7
628 a0 a1 a2 a3 a4 a5 a6 a7
630 r0 r1 r2 r3 r4 r5 r6 r7
631 r8 r9 r10 r11 r12 rl3 r14 ri5
635 x x0 x1 x2 y y0 y1 y2
636 a a0 a1 a2 b b0 b1 b2 ab ba
637 mr omr la lc ssh ssl ss
638 n0 n1 n2 n3 n4 n5 n6 n7
639 m0 m1 m2 m3 m4 m5 m6 m7
640 r0 r1 r2 r3 r4 r5 r6 r7
645 Numbers may be decimal, hexadecimal, octal, binary or concatenated ASCII. The
646 default radix is decimal, and it may not be changed. Decimal numbers are specified
647 with a string of digits (**0-9**). Hexadecimal numbers are specified with a leading
648 dollar sign (**$**) followed by a string of digits and uppercase or lowercase letters (**A-F
649 a-f**). Octal numbers are specified with a leading at-sign (**@**) followed by a string
650 of octal digits (**0-7**). Binary numbers are specified with a leading percent sign
651 (**%**) followed by a string of binary digits (**0-1**). Concatenated ASCII constants are
652 specified by enclosing from one to four characters in single or double quotes. For
664 Negative numbers Are specified with a unary minus (**-**). For example:
673 Strings are contained between double (") or single ( ') quote marks. Strings may
674 contain non-printable characters by specifying "backslash" escapes, similar to the
675 ones used in the C programming language. RMAC will generate a warning if a
676 backslash is followed by a character not appearing below:
681 \n $0a line-feed (newline)
684 \r $0c1 carriage-return
690 It is possible for strings (but not symbols) to contain characters with their high
691 bits set (i.e. character codes 128...255).
693 You should be aware that backslash characters are popular in GEMDOS path
694 names, and that you may have to escape backslash characters in your existing source
695 code. For example, to get the file "'c:\\auto\\ahdi.s'" you would specify the string
696 "`c:\\\\auto\\\\ahdi.s`".
700 Register lists are special forms used with the **movem** mnemonic and the **.reg**
701 directive. They are 16-bit values, with bits 0 through 15 corresponding to registers
702 **D0** through **A7**. A register list consists of a series of register names or register
703 ranges seperated by slashes. A register range consists of two register names, Rm
704 and Rn,m<n, seperated by a dash. For example:
712 d0/d1/a0-a3/d7/a6-a7 $CF83
716 Register lists and register equates may be used in conjunction with the movem
717 mnemonic, as in this example:
721 temps reg d0-d2/a0-a2 ; temp registers
722 keeps reg d3-d7/d3-a6 ; registers to preserve
723 allregs reg d0-d7/a0-a7 ; all registers
724 movem.l #temps,-(sp) ; these two lines ...
725 movem.l d0-d2/a0-a2,-(sp) ; are identical
726 movem.l #keeps,-(sp) ; save "keep" registers
727 movem.l (sp)+,#keeps ; restore "keep" registers
732 `Order of Evaluation`_
733 ''''''''''''''''''''''
734 All values are computed with 32-bit 2's complement arithmetic. For boolean operations
735 (such as if or **assert**) zero is considered false, and non-zero is considered
738 **Expressions are evaluated strictly left-to-right, with no
739 regard for operator precedence.**
741 Thus the expression "1+2*3" evaluates to 9, not 7. However, precedence may be
742 forced with parenthesis (**()**) or square-brackets (**[]**).
746 Expressions belong to one of three classes: undefined, absolute or relocatable. An
747 expression is undefined if it involves an undefined symbol (e.g. an undeclared sym-
748 bol, or a forward reference). An expression is absolute if its value will not change
749 when the program is relocated (for instance, the number 0, all labels declared in
750 an abs section, and all Atari ST hardware register locations are absolute values).
751 An expression is relocatable if it involves exactly one symbol that is contained in a
752 text, data or BSS section.
754 Only absolute values may be used with operators other than addition (+) or
755 subtraction (-). It is illegal, for instance, to multiply or divide by a relocatable or
756 undefined value. Subtracting a relocatable value from another relocatable value in
757 the same section results in an absolute value (the distance between them, positive
758 or negative). Adding (or subtracting) an absolute value to or from a relocatable
759 value yeilds a relocatable value (an offset from the relocatable address).
761 It is important to realize that relocatable values belong to the sections they
762 are defined in (e.g. text, data or BSS), and it is not permissible to mix and match
763 sections. For example, in this code:
767 linel: dc.l line2, line1+8
768 line2: dc.l line1, line2-8
769 line3: dc.l line2-line1, 8
770 error: dc.l line1+line2, line2 >> 1, line3/4
772 Line 1 deposits two longwords that point to line 2. Line 2 deposits two longwords
773 that point to line 1. Line 3 deposits two longwords that have the absolute value
774 eight. The fourth line will result in an assembly error, since the expressions (re-
775 spectively) attempt to add two relocatable values, shift a relocatable value right by
776 one, and divide a relocatable value by four.
778 The pseudo-symbol "*****" (star) has the value that the current section's location
779 counter had at the beginning of the current source line. For example, these two
780 statements deposit three pointers to the label "**bar**":
787 Similarly, the pseudo-symbol "**$**" has the value that the current section's location
788 counter has, and it is kept up to date as the assembler deposits information
789 "across" a line of source code. For example, these two statements deposit four
790 pointers to the label "zip":
800 ================================ ==========================================
802 ================================ ==========================================
803 **-** Unary minus (2's complement).
804 **!** Logical (boolean) NOT.
805 **~** Tilde: bitwise not (l's complement).
806 **^^defined** *symbol* True if symbol has a value.
807 **^^referenced** *symbol* True if symbol has been referenced.
808 **^^streq** *string1*, *string2* True if the strings are equal.
809 **^^macdef** *macroName* True if the macro is defined.
810 **^^abscount** Returns the size of current .abs section
811 **^^filesize** *string_filename* Returns the file size of supplied filename
812 ================================ ==========================================
814 * The boolean operators generate the value 1 if the expression is true, and 0 if it is not.
816 * A symbol is referenced if it is involved in an expression.
818 any combination of attributes: undefined and unreferenced, defined and unref-
819 erenced (i.e. declared but never used), undefined and referenced (in the case
820 of a forward or external reference), or defined and referenced.
827 =========== ==============================================
829 =========== ==============================================
830 \ + - * / The usual arithmetic operators.
831 % Modulo. Do *not* attempt to modulo by 0 or 1.
832 & | ^ Bit-wise **AND**, **OR** and **Exclusive-OR**.
833 << >> Bit-wise shift left and shift right.
834 < <= >= > Boolean magnitude comparisons.
836 <> != Boolean inequality.
837 =========== ==============================================
839 * All binary operators have the same precedence:
840 expressions are evaluated strictly left to right.
842 * Division or modulo by zero yields an assembly error.
844 * The "<>" and "!=" operators are synonyms.
846 * Note that the modulo operator (%) is also used to introduce binary constants
847 (see: `Constants`_). A percent sign should be followed by at least one space if
848 it is meant to be a modulo operator, and is followed by a '0' or '1'.
853 ============ =========================================
854 Special Form Description
855 ============ =========================================
856 **^^date** The current system date (Gemdos format).
857 **^^time** The current system time (Gemdos format).
858 ============ =========================================
860 * The "**^^date**" special form expands to the current system date, in Gemdos
861 format. The format is a 16-bit word with bits 0 ...4 indicating the day of the
862 month (1...31), bits 5...8 indicating the month (1...12), and bits 9...15
863 indicating the year since 1980, in the range 0...119.
865 * The "**^^time**" special form expands to the current system time, in Gemdos
866 format. The format is a 16-bit word with bits 0...4 indicating the current
867 second divided by 2, bits 5...10 indicating the current minute 0...59. and
868 bits 11...15 indicating the current hour 0...23.
870 `Example Expressions`_
871 ''''''''''''''''''''''
875 line address contents source code
876 ---- ------- -------- -------------------------------
877 1 00000000 4480 lab1: neg.l d0
878 2 00000002 427900000000 lab2: clr.w lab1
879 3 =00000064 equ1 = 100
880 4 =00000096 equ2 = equ1 + 50
881 5 00000008 00000064 dc.l lab1 + equ1
882 6 0000000C 7FFFFFE6 dc.l (equl + ~equ2) >> 1
883 7 00000010 0001 dc.w ^^defined equl
884 8 00000012 0000 dc.w ^^referenced lab2
885 9 00000014 00000002 dc.l lab2
886 10 00000018 0001 dc.w ^^referenced lab2
887 11 0000001A 0001 dc.w lab1 = (lab2 - 6)
889 Lines 1 through four here are used to set up the rest of the example. Line 5 deposits
890 a relocatable pointer to the location 100 bytes beyond the label "**lab1**". Line 6 is
891 a nonsensical expression that uses the and right-shift operators. Line 7 deposits
892 a word of 1 because the symbol "**equ1**" is defined (in line 3).
894 Line 8 deposits a word of 0 because the symbol "**lab2**", defined in line 2, has
895 not been referenced. But the expression in line 9 references the symbol "**lab2**", so
896 line 10 (which is a copy of line-8) deposits a word of 1. Finally, line 11 deposits a
897 word of 1 because the Boolean equality operator evaluates to true.
899 The operators "**^^defined**" and "**^^referenced**" are particularly useful in
900 conditional assembly. For instance, it is possible to automatically include debugging
901 code if the debugging code is referenced, as in:
905 lea string,a0 ; AO -> message
906 jsr debug ; print a message
908 string: dc.b "Help me, Spock!",0 ; (the message)
912 .iif ^^referenced debug, .include "debug.s"
914 The **jsr** statement references the symbol debug. Near the end of the source file, the
915 "**.iif**" statement includes the file "**debug.s**" if the symbol debug was referenced.
917 In production code, presumably all references to the debug symbol will be removed,
918 and the debug source file will not be included. (We could have as easily made the
919 symbol **debug** external, instead of including another source file).
925 Assembler directives may be any mix of upper- or lowercase. The leading periods
926 are optional, though they are shown here and their use is encouraged. Directives
927 may be preceeded by a label; the label is defined before the directive is executed.
928 Some directives accept size suffixes (**.b**, **.s**, **.w** or **.1**); the default is word (**.w**) if no
929 size is specified. The **.s** suffix is identical to **.b**. Directives relating to the 6502 are
930 described in the chapter on `6502 Support`_.
936 If the location counter for the current section is odd, make it even by adding
937 one to it. In text and data sections a zero byte is deposited if necessary.
941 Align the program counter to the next integral long boundary (4 bytes).
942 Note that GPU/DSP code sections are not contained in their own
943 segments and are actually part of the TEXT or DATA segments.
944 Therefore, to align GPU/DSP code, align the current section before and
945 after the GPU/DSP code.
948 This directive is similar to the standard ‘C’ library printf() function
949 and is used to print user messages from the assembly process. You can
950 print any string or valid expression. Several format flags that can be used
951 to format your output are also supported.
967 .print “Mask: $”,/x/w MASK
968 .print “Value: “,/d/l VALUE
972 Align the program counter to the next integral phrase boundary (8 bytes).
973 Note that GPU/DSP code sections are not contained in their own
974 segments and are actually part of the TEXT or DATA segments.
975 Therefore, to align GPU/DSP code, align the current section before and
976 after the GPU/DSP code.
980 Align the program counter to the next integral double phrase boundary (16
981 bytes). Note that GPU/DSP code sections are not contained in their own
982 segments and are actually part of the TEXT or DATA segments.
983 Therefore, to align GPU/DSP code, align the current section before and
984 after the GPU/DSP code.
988 Align the program counter to the next integral quad phrase boundary (32
989 bytes). Note that GPU/DSP code sections are not contained in their own
990 segments and are actually part of the TEXT or DATA segments.
991 Therefore, to align GPU/DSP code, align the current section before and
992 after the GPU/DSP code.
994 **.assert** *expression* [,\ *expression*...]
996 Assert that the conditions are true (non-zero). If any of the comma-seperated
997 expressions evaluates to zero an assembler warning is issued. For example:
1001 .assert *-start = $76
1002 .assert stacksize >= $400
1010 Switch to the BSS, data or text segments. Instructions and data may not
1011 be assembled into the BSS-segment, but symbols may be defined and storage
1012 may be reserved with the **.ds** directive. Each assembly starts out in the text
1021 Enable different flavours of the MC68000 family of CPUs. Bear in mind that not all
1022 instructions and addressing modes are available in all CPUs so the correct CPU
1023 should be selected at all times. Notice that it is possible to switch CPUs
1029 Enable FPU support. Note that *.68882* is on by default when selecting *.68030*.
1033 Switch to Motorola DSP56001 mode.
1035 **.org** *location* [*X:*/*Y:*/*P:*/*L:*]
1037 This directive sets the value of the location counter (or **pc**) to location, an
1038 expression that must be defined and absolute. It is legal to use the directive in
1039 the following modes: 6502, Tom, Jerry, OP, 56001 and 680x0 (only with -fr switch).
1040 Especially for the 56001 mode the *location* field **must** be prefixed with the
1041 intended section (*X:*, *Y:*, *P:* or *L:*).
1048 These directives control the optimisations that rmac applies to the source
1049 automatically. Each directive is applied immediately from the line encountered
1050 onwards. So it is possible to turn specific optimisations on and off globally
1051 (when placed at the start of the first file) or locally (by turning desired
1052 optimisations on and off at certain parts of the source). For a list of the
1053 optimisations (*n*) available please consult the table in section `The Command Line`_.
1055 **all**, as expected, turns all available optimisations on or off. An exception to this
1056 is *o10*/*op* as this is not an optimisation that should be turned on unless the user
1057 absolutely needs it.
1059 Lastly, as a "creature comfort" feature, if the first column of any line is prefixed
1060 with an exclamation mark (*!*) then for that line all optimisations are turned off.
1062 **.abs** [*location*]
1064 Start an absolute section, beginning with the specified location (or zero, if
1065 no location is specified). An absolute section is much like BSS, except that
1066 locations declared with .ds are based absolute. This directive is useful for
1068 declaring structures or hardware locations.
1069 For example, the following equates:
1079 could be as easily defined as:
1090 Another interesting example worth mentioning is the emulation of "C"'s "union" keyword
1091 using *.abs*. For example, the following "C" code:
1101 union { int spf_em_colour; int spf_emx_colour; };
1102 union { int spf_em_psmask[16]; int spf_emx_colouropt; };
1105 can be expressed as:
1110 *-------------------------------------------------------*
1111 spf_w: ds.w 1 ;<- common
1116 *-------------------------------------------------------*
1118 spf_em_colour: ds.l 1 ;<- union #1
1119 spf_em_psmask: ds.l 16
1120 *-------------------------------------------------------*
1124 spf_emx_colour: ds.l 1 ;<- union #2
1125 spf_emx_colouropt: ds.l 1
1126 spf_emx_psmask: ds.l 16
1127 spf_emx_psmaskopt: ds.l 16
1130 ;*-------------------------------------------------------*
1132 move #spf_em_colour,d0
1133 move #spf_emx_colour,d0
1135 In this example, *spf_em_colour* and *spf_emx_colour* will have the same value.
1137 **.comm** *symbol*, *expression*
1139 Specifies a label and the size of a common region. The label is made global,
1140 thus confined symbols cannot be made common. The linker groups all common
1141 regions of the same name; the largest size determines the real size of the
1142 common region when the file is linked.
1144 **.ccdef** *expression*
1146 Allows you to define names for the condition codes used by the JUMP
1147 and JR instructions for GPU and DSP code. For example:
1153 jump Always,(r3) ; 'Always' is actually 0
1155 **.ccundef** *regname*
1157 Undefines a register name (regname) previously assigned using the
1158 .CCDEF directive. This is only implemented in GPU and DSP code
1161 **.dc.i** *expression*
1163 This directive generates long data values and is similar to the DC.L
1164 directive, except the high and low words are swapped. This is provided
1165 for use with the GPU/DSP MOVEI instruction.
1167 **.dc**\ [.\ *size*] *expression* [, *expression*...]
1169 Deposit initialized storage in the current section. If the specified size is word
1170 or long, the assembler will execute a .even before depositing data. If the size
1171 is .b, then strings that are not part of arithmetic expressions are deposited
1172 byte-by-byte. If no size is specified, the default is .w. This directive cannot be
1173 used in the BSS section.
1175 **.dcb**\ [.\ *size*] *expression1*, *expression2*
1177 Generate an initialized block of *expression1* bytes, words or longwords of the
1178 value *expression2*. If the specified size is word or long, the assembler will
1179 execute .even before generating data. If no size is specified, the default is **.w**.
1180 This directive cannot be used in the BSS section.
1182 **.ds**\ [.\ *size*] *expression*
1184 Reserve space in the current segment for the appropriate number of bytes,
1185 words or longwords. If no size is specified, the default size is .w. If the size
1186 is word or long, the assembler will execute .even before reserving space.
1190 Switch to Jaguar DSP assembly mode. This directive must be used
1191 within the TEXT or DATA segments.
1193 **.init**\ [.\ *size*] [#\ *expression*,]\ *expression*\ [.\ *size*] [,...]
1195 Generalized initialization directive. The size specified on the directive becomes
1196 the default size for the rest of the line. (The "default" default size is **.w**.) A
1197 comma-seperated list of expressions follows the directive; an expression may be
1198 followed by a size to override the default size. An expression may be preceeded
1199 by a sharp sign, an expression and a comma, which specifies a repeat count to
1200 be applied to the next expression. For example:
1204 .init.l -1, 0.w, #16,'z'.b, #3,0, 11.b
1206 will deposit a longword of -1, a word of zero, sixteen bytes of lower-case 'z',
1207 three longwords of zero, and a byte of 11.
1209 No auto-alignment is performed within the line, but a **.even** is done once
1210 (before the first value is deposited) if the default size is word or long.
1212 **.cargs** [#\ *expression*,] *symbol*\ [.\ *size*] [, *symbol*\ [.\ *size*].. .]
1214 Compute stack offsets to C (and other language) arguments. Each symbol is
1215 assigned an absolute value (like equ) which starts at expression and increases
1216 by the size of each symbol, for each symbol. If the expression is not supplied,
1217 the default starting value is 4. For example:
1221 .cargs #8, .fileliams.1, .openMode, .butPointer.l
1223 could be used to declare offsets from A6 to a pointer to a filename, a word
1224 containing an open mode, and a pointer to a buffer. (Note that the symbols
1225 used here are confined). Another example, a C-style "string-length" function,
1226 could be written as:
1230 _strlen:: .cargs .string ; declare arg
1231 move.l .string(sp),a0 ; a0 -> string
1232 moveq #-1,d0 ; initial size = -1
1233 .1: addq.1 #1,d0 ; bump size
1234 tst.b (a0)+ ; at end of string?
1235 bne .1 ; (no -- try again)
1236 rts ; return string length
1238 **.error** ["*string*"]
1240 Aborts the build, optionally printing a user defined string. Can be useful
1241 inside conditional assembly blocks in order to catch errors. For example:
1245 .if ^^defined JAGUAR
1246 .error "TOS cannot be built on Jaguar, don't be silly"
1251 End the assembly. In an include file, end the include file and resume assembling
1252 the superior file. This statement is not required, nor are warning messages
1253 generated if it is missing at the end of a file. This directive may be used inside
1254 conditional assembly, macros or **.rept** blocks.
1256 **.equr** *expression*
1258 Allows you to name a register. This is only implemented for GPU/DSP
1259 code sections. For example:
1265 add ClipW,r0 ; ClipW actually is r19
1267 **.if** *expression*
1273 Start a block of conditional assembly. If the expression is true (non-zero) then
1274 assemble the statements between the .if and the matching **.endif** or **.else**.
1275 If the expression is false, ignore the statements unless a matching .else is
1276 encountered. Conditional assembly may be nested to any depth.
1278 It is possible to exit a conditional assembly block early from within an include
1279 file (with **end**) or a macro (with **endm**).
1281 **.iif** *expression*, *statement*
1283 Immediate version of **.if**. If the expression is true (non-zero) then the state-
1284 ment, which may be an instruction, a directive or a macro, is executed. If
1285 the expression is false, the statement is ignored. No **.endif** is required. For
1290 .iif age < 21, canDrink = 0
1291 .iif weight > 500, dangerFlag = 1
1292 .iif !(^^defined DEBUG), .include dbsrc
1294 **.macro** *name* [*formal*, *formal*,...]
1300 Define a macro called name with the specified formal arguments. The macro
1301 definition is terminated with a **.endm** statement. A macro may be exited early
1302 with the .exitm directive. See the chapter on `Macros`_ for more information.
1304 **.undefmac** *macroName* [, *macroName*...]
1306 Remove the macro-definition for the specified macro names. If reference is
1307 made to a macro that is not defined, no error message is printed and the name
1310 **.rept** *expression*
1314 The statements between the **.rept** and **.endr** directives will be repeated *expression*
1315 times. If the expression is zero or negative, no statements will be
1316 assembled. No label may appear on a line containing either of these directives.
1318 **.globl** *symbol* [, *symbol*...]
1320 **.extern** *symbol* [, *symbol*...]
1322 Each symbol is made global. None of the symbols may be confined symbols
1323 (those starting with a period). If the symbol is defined in the assembly, the
1324 symbol is exported in the object file. If the symbol is undefined at the end
1325 of the assembly, and it was referenced (i.e. used in an expression), then the
1326 symbol value is imported as an external reference that must be resolved by the
1327 linker. The **.extern** directive is merely a synonym for **.globl**.
1329 **.include** "*file*"
1331 Include a file. If the filename is not enclosed in quotes, then a default extension
1332 of "**.s**" is applied to it. If the filename is quoted, then the name is not changed
1335 Note: If the filename is not a valid symbol, then the assembler will generate an
1336 error message. You should enclose filenames such as "**atari.s**" in quotes,
1337 because such names are not symbols.
1339 If the include file cannot be found in the current directory, then the directory
1340 search path, as specified by -i on the commandline, or' by the 'RMACPATH'
1341 enviroment string, is traversed.
1343 **.incbin** "*file*" [, [*size*], [*offset*]]
1345 Include a file as a binary. This can be thought of a series of **dc.b** statements
1346 that match the binary bytes of the included file, inserted at the location of the
1347 directive. The directive is not allowed in a BSS section. Optional parameters
1348 control the amount of bytes to be included and offset from the start of the file.
1349 All the following lines are valid:
1352 .incbin "test.bin" ; Include the whole file
1353 .incbin "test.bin",,$30 ; Skip the first 48 bytes
1354 .incbin "test.bin",$70,$30 ; Include $70 bytes starting at offset $30
1355 .incbin "test.bin",$48 ; Include the file starting at offset 48 till the end
1356 .incbin "test.bin",, ; Include the whole file
1360 Issue a page eject in the listing file.
1362 **.title** "*string*"
1364 **.subttl** [-] "*string*"
1366 Set the title or subtitle on the listing page. The title should be specified on
1367 the the first line of the source program in order to take effect on the first page.
1368 The second and subsequent uses of **.title** will cause page ejects. The second
1369 and subsequent uses of .subttl will cause page ejects unless the subtitle string
1370 is preceeded by a dash (-).
1376 Enable or disable source code listing. These directives increment and decrement
1377 an internal counter, so they may be appropriately nested. They have no effect
1378 if the **-l** switch is not specified on the commandline.
1382 This directive provides unstructured flow of control within a macro definition.
1383 It will transfer control to the line of the macro containing the specified goto
1384 label. A goto label is a symbol preceeded by a colon that appears in the first
1385 column of a source line within a macro definition:
1389 where the label itself can be any valid symbol name, followed immediately by
1390 whitespace and a valid source line (or end of line). The colon **must** appear in
1393 The goto-label is removed from the source line prior to macro expansion -
1394 to all intents and purposes the label is invisible except to the .goto directive
1395 Macro expansion does not take place within the label.
1397 For example, here is a silly way to count from 1 to 10 without using **.rept**:
1405 iif count <= 10, goto loop
1410 Switch to Jaguar GPU assembly mode. This directive must be used
1411 within the TEXT or DATA segments.
1415 No. Just... no. Don't ask about it. Ever.
1417 **.prgflags** *value*
1419 Sets ST executable .PRG field *PRGFLAGS* to *value*. *PRGFLAGS* is a bit field defined as follows:
1421 ============ ====== =======
1422 Definition Bit(s) Meaning
1423 ============ ====== =======
1424 PF_FASTLOAD 0 If set, clear only the BSS area on program load, otherwise clear the entire heap.
1425 PF_TTRAMLOAD 1 If set, the program may be loaded into alternative RAM, otherwise it must be loaded into standard RAM.
1426 PF_TTRAMMEM 2 If set, the program's Malloc() requests may be satisfied from alternative RAM, otherwise they must be satisfied from standard RAM.
1427 -- 3 Currently unused.
1428 See left. 4 & 5 If these bits are set to 0 (PF_PRIVATE), the processes' entire memory space will be considered private (when memory protection is enabled).If these bits are set to 1 (PF_GLOBAL), the processes' entire memory space will be readable and writable by any process (i.e. global).If these bits are set to 2 (PF_SUPERVISOR), the processes' entire memory space will only be readable and writable by itself and any other process in supervisor mode.If these bits are set to 3 (PF_READABLE), the processes' entire memory space will be readable by any application but only writable by itself.
1429 -- 6-15 Currently unused.
1430 ============ ====== =======
1432 **.regequ** *expression*
1433 Essentially the same as **.EQUR.** Included for compatibility with the GASM
1437 Essentially the same as **.EQURUNDEF.** Included for compatibility with
1446 All of the standard Motorola 68000 mnemonics and addressing modes are supported;
1447 you should refer to **The Motorola M68000 Programmer's Reference Manual**
1448 for a description of the instruction set and the allowable addressing modes for each
1449 instruction. With one major exception (forward branches) the assembler performs
1450 all the reasonable optimizations of instructions to their short or address register
1453 Register names may be in upper or lower case. The alternate forms ``R0`` through
1454 ``R15`` may be used to specify ``D0`` through ``A7``. All register names are keywords, and
1455 may not be used as labels or symbols. None of the 68010 or 68020 register names
1456 are keywords (but they may become keywords in the future).
1461 ===================================== ===========================================
1462 Assembler Syntax Description
1463 ===================================== ===========================================
1464 *Dn* Data register direct
1465 *An* Address register direct
1466 (*An*) Address register indirect
1467 (*An*)+ Address register indirect postincrement
1468 -(*An*) Address register indirect predecrement
1469 *disp*\ (*An*) Address register indirect with displacement
1470 *bdisp*\ (*An*, *Xi*\ [.\ *size*]) Address register indirect indexed
1471 *abs*.w Absolute short
1472 *abs* Absolute (long or short)
1473 *abs*.l Forced absolute long
1474 *disp*\ (PC) Program counter with displacement
1475 *bdisp*\ (PC, *Xi*\ ) Program counter indexed
1477 ===================================== ===========================================
1479 `68020+ Addressing Modes`_
1480 ''''''''''''''''''''''''''
1482 The following addressing modes are only valid for 68020 and newer CPUs. In these
1483 modes most of the parameters like Base Displacement (**bd**), Outer Displacement
1484 (**od**), Base Register (**An**) and Index Register (**Xn**) can be omitted. RMAC
1485 will detect this and *suppress* the registers in the produced code.
1488 use a special syntax to denote register suppression like **Zan** to suppress the Base
1489 Register and **Rin** to suppress the Index Register. RMAC has no support for this
1490 behaviour nor needs it to suppress registers.
1492 In addition, other assemblers will allow reordering of the parameters (for example
1493 ([*An*,\ *bd*])). This is not allowed in RMAC.
1495 Also noteworthy is that the Index Register can be an address or data register.
1497 To avoid internal confusion the 68040/68060 registers *DC*, *IC* and *BC* are named
1498 *DC40*, *IC40* and *BC40* respectively.
1500 ====================================================== =============================================================
1501 Assembler Syntax Description
1502 ====================================================== =============================================================
1503 *bd*\ (*An*, *Xi*\ [.\ *size*][*\*scale*]) Address register indirect indexed
1504 ([*bd*,\ *An*],\ *Xn*\[.\ *siz*][*\*scale*],\ *od*) Register indirect preindexed with outer displacement
1505 ([*bd*,\ *An*,\ *Xn*\[.\ *siz*][*\*scale*],\ *od*) Register indirect postindexed with outer displacement
1506 ([*bd*,\ *PC*],\ *Xn*\[.\ *siz*][*\*scale*],\ *od*) Program counter indirect preindexed with outer displacement
1507 ([*bd*,\ *PC*,\ *Xn*\[.\ *siz*][*\*scale*],\ *od*) Program counter indirect postindexed with outer displacement
1508 ====================================================== =============================================================
1512 Since RMAC is a one pass assembler, forward branches cannot be automatically
1513 optimized to their short form. Instead, unsized forward branches are assumed to
1514 be long. Backward branches are always optimized to the short form if possible.
1516 A table that lists "extra" branch mnemonics (common synonyms for the Motorola
1517 defined mnemonics) appears below.
1519 `Linker Constraints`_
1520 '''''''''''''''''''''
1521 It is not possible to make an external reference that will fix up a byte. For example:
1526 move.l frog(pc,d0),d1
1528 is illegal (and generates an assembly error) when frog is external, because the
1529 displacement occupies a byte field in the 68000 offset word, which the object file
1534 ============== ========
1535 Alternate name Becomes:
1536 ============== ========
1546 ============== ========
1548 `Optimizations and Translations`_
1549 '''''''''''''''''''''''''''''''''
1550 The assembler provides "creature comforts" when it processes 68000 mnemonics:
1552 * **CLR.x An** will really generate **SUB.x An,An**.
1554 * **ADD**, **SUB** and **CMP** with an address register will really generate **ADDA**,
1555 **SUBA** and **CMPA**.
1557 * The **ADD**, **AND**, **CMP**, **EOR**, **OR** and **SUB** mnemonics with immediate
1558 first operands will generate the "I" forms of their instructions (**ADDI**, etc.) if
1559 the second operand is not register direct.
1561 * All shift instructions with no count value assume a count of one.
1563 * **MOVE.L** is optimized to **MOVEQ** if the immediate operand is defined and
1564 in the range -128...127. However, **ADD** and **SUB** are never translated to
1565 their quick forms; **ADDQ** and **SUBQ** must be explicit.
1567 * All optimisations are controllable using the **.opt** directive. Refer to its
1568 description in section `Directives`_.
1570 * All optimisations are turned off for any source line that has an exclamation mark
1571 (*!*) on their first column.
1573 * Optimisation switches 0, 1 and 2 are turned on by default for legacy reasons.
1574 All other levels are off by default. (refer to section `The Command Line`_
1575 for a description of all the switches).
1577 * Optimisation warnings are off by default. Invoke RMAC with the *-s* switch to
1578 turn on warnings in console and listing output.
1580 * In DSP56001 mode size optimisations are on by default. Currently there is no
1581 way to disable this behaviour.
1583 * In GPU/DSP code sections, you can use JUMP (Rx) in place of JUMP T, (Rx) and JR
1584 (Rx) in place of JR T,(Rx).
1586 * RMAC tests all GPU/DSP restrictions and corrects them wherever possible (such as
1587 inserting a NOP instruction when needed).
1589 * The *(Rx+N)* addressing mode for GPU/DSP instructions is optimized to *(Rx)*
1594 `Macro declaration`_
1595 ''''''''''''''''''''
1596 A macro definition is a series of statements of the form:
1599 .macro name [ formal-arg, ...]
1603 statements making up the macro body
1609 The name of the macro may be any valid symbol that is not also a 68000 instruction
1610 or an assembler directive. (The name may begin with a period - macros cannot
1611 be made confined the way labels or equated symbols can be). The formal argument
1612 list is optional; it is specified with a comma-seperated list of valid symbol names.
1613 Note that there is no comma between the name of the macro and the name of the
1614 first formal argument. It is not advised to begin an argument name with a numeric
1617 A macro body begins on the line after the **.macro** directive. All instructions
1618 and directives, except other macro definitions, are legal inside the body.
1620 The macro ends with the **.endm** statement. If a label appears on the line with
1621 this directive, the label is ignored and a warning is generated.
1623 `Parameter Substitution`_
1624 '''''''''''''''''''''''''
1625 Within the body, formal parameters may be expanded with the special forms:
1631 The second form (enclosed in braces) can be used in situations where the characters
1632 following the formal parameter name are valid symbol continuation characters. This
1633 is usually used to force concatentation, as in:
1638 \(godzilla}vs\{reagan}
1640 The formal parameter name is terminated with a character that is not valid in
1641 a symbol (e.g. whitespace or puncuation); optionally, the name may be enclosed in
1642 curly-braces. The names must be symbols appearing on the formal argument list,
1643 or a single decimal digit (``\1`` corresponds to the first argument, ``\2`` to the second,
1644 ``\9`` to the ninth, and ``\0`` to the tenth). It is possible for a macro to have more than
1645 ten formal arguments, but arguments 11 and on must be referenced by name, not
1648 Other special forms are:
1650 ============ ================================================
1651 Special Form Description
1652 ============ ================================================
1653 ``\\`` a single "\",
1654 ``\~`` a unique label of the form "Mn"
1655 ``\#`` the number of arguments actually specified
1656 ``\!`` the "dot-size" specified on the macro invocation
1657 ``\?name`` conditional expansion
1658 ``\?{name}`` conditional expansion
1659 ============ ================================================
1661 The last two forms are identical: if the argument is specified and is non-empty, the
1662 form expands to a "1", otherwise (if the argument is missing or empty) the form
1665 The form "``\!``" expands to the "dot-size" that was specified when the macro
1666 was invoked. This can be used to write macros that behave differently depending
1667 on the size suffix they are given, as in this macro which provides a synonym for the
1672 .macro deposit value
1675 deposit.b 1 ; byte of 1
1676 deposit.w 2 ; word of 2
1677 deposit.l 3 ; longvord of 3
1678 deposit 4 ; word of 4 (no explicit size)
1682 A previously-defined macro is called when its name appears in the operation field of
1683 a statement. Arguments may be specified following the macro name; each argument
1684 is seperated by a comma. Arguments may be empty. Arguments are stored for
1685 substitution in the macro body in the following manner:
1687 * Numbers are converted to hexadecimal.
1689 * All spaces outside strings are removed.
1691 * Keywords (such as register names, dot sizes and "^^" operators) are converted
1694 * Strings are enclosed in double-quote marks (").
1696 For example, a hypothetical call to the macro "``mymacro``", of the form:
1697 ``mymacro A0, , 'Zorch' / 32, "^^DEFINED foo, , , tick tock``
1699 will result in the translations:
1701 ======== ================= =================================================
1702 Argument Expansion Comment
1703 ======== ================= =================================================
1704 ``\1`` ``a0`` "``A0``" converted to lower-case
1706 ``\3`` ``"Zorch"/$20`` "``Zorch``" in double-quotes, 32 in hexadecimal
1707 ``\4`` ``^^defined foo`` "``^^DEFINED``" converted to lower-case
1710 ``\7`` ``ticktock`` spaces removed (note concatenation)
1711 ======== ================= =================================================
1713 The **.exitm** directive will cause an immediate exit from a macro body. Thus
1714 the macro definition:
1719 .iif !\?source, .exitm ; exit if source is empty
1720 move \source,d0 ; otherwise, deposit source
1723 will not generate the move instruction if the argument **"source"** is missing from
1724 the macro invocation.
1726 The **.end**, **.endif** and **.exitm** directives all pop-out of their include levels
1727 appropriately. That is, if a macro performs a **.include** to include a source file, an
1728 executed **.exitm** directive within the include-file will pop out of both the include-file
1731 Macros may be recursive or mutually recursive to any level, subject only to
1732 the availability of memory. When writing recursive macros, take care in the coding
1733 of the termination condition(s). A macro that repeatedly calls itself will cause the
1734 assembler to exhaust its memory and abort the assembly.
1739 The Gemdos macro is used to make file system calls. It has two parameters, a
1740 function number and the number of bytes to clean off the stack after the call. The
1741 macro pushes the function number onto the stack and does the trap to the file
1742 system. After the trap returns, conditional assembly is used to choose an addq or
1743 an **add.w** to remove the arguments that were pushed.
1747 .macro Gemdos trpno, clean
1748 move.w #\trpno,-(sp) ; push trap number
1749 trap #1 ; do GEMDOS trap
1751 addq #\clean,sp ; clean-up up to 8 bytes
1753 add.w #\clean,sp ; clean-up more than 8 bytes
1757 The Fopen macro is supplied two arguments; the address of a filename, and
1758 the open mode. Note that plain move instructions are used, and that the caller of
1759 the macro must supply an appropriate addressing mode (e.g. immediate) for each
1764 .macro Fopen file, mode
1765 movs.w \mode,-(sp) ;push open mode
1766 move.1 \file,-(sp) ;push address of tile name
1767 Gemdos $3d,8 ;do the GEMDOS call
1770 The **String** macro is used to allocate storage for a string, and to place the
1771 string's address somewhere. The first argument should be a string or other expres-
1772 sion acceptable in a dc.b directive. The second argument is optional; it specifies
1773 where the address of the string should be placed. If the second argument is omitted,
1774 the string's address is pushed onto the stack. The string data itself is kept in the
1779 .macro String str,loc
1780 .if \?loc ; if loc is defined
1781 move.l #.\~,\loc ; put the string's address there
1783 pea .\~ ; push the string's address
1785 .data ; put the string data
1786 .\~: dc.b \str,0 ; in the data segment
1787 .text ; and switch back to the text segment
1790 The construction "``.\~``" will expand to a label of the form "``.M``\ *n*" (where *n* is
1791 a unique number for every macro invocation), which is used to tag the location of
1792 the string. The label should be confined because the macro may be used along with
1793 other confined symbols.
1795 Unique symbol generation plays an important part in the art of writing fine
1796 macros. For instance, if we needed three unique symbols, we might write "``.a\~``",
1797 "``.b\~``" and "``.c\~``".
1801 Repeat-blocks provide a simple iteration capability. A repeat block allows a range
1802 of statements to be repeated a specified number of times. For instance, to generate
1803 a table consisting of the numbers 255 through 0 (counting backwards) you could
1808 .count set 255 ; initialize counter
1809 .rept 256 ; repeat 256 times:
1810 dc.b .count ; deposit counter
1811 .count set .count - 1 ; and decrement it
1812 .endr ; (end of repeat block)
1814 Repeat blocks can also be used to duplicate identical pieces of code (which are
1815 common in bitmap-graphics routines). For example:
1819 .rept 16 ; clear 16 words
1820 clr.w (a0)+ ; starting at AO
1823 `Jaguar GPU/DSP Mode`_
1824 ======================
1826 RMAC will generate code for the Atari Jaguar GPU and DSP custom RISC (Reduced
1827 Instruction Set Computer) processors. See the Atari Jaguar Software reference Manual - Tom
1828 & Jerry for a complete listing of Jaguar GPU and DSP assembler mnemonics and addressing
1833 The following condition codes for the GPU/DSP JUMP and JR instructions are built-in:
1837 CC (Carry Clear) = %00100
1838 CS (Carry Set) = %01000
1841 NE (Not Equal) = %00001
1843 HI (Higher) = %00101
1846 `Jaguar Object Processor Mode`_
1847 ===============================
1852 An assembler to generate object lists for the Atari Jaguar's Object processor.
1858 To really utilize the OP properly, it needs an assembler. Otherwise, what
1859 happens is you end up writing an assembler in your code to assemble the OP
1860 list, and that's a real drag--something that *should* be handled by a proper
1865 ''''''''''''''''''''
1867 The OP assembler works similarly to the RISC assembler; to enter the OP
1868 assembler, you put the .objproc directive in your code (N.B.: like the RISC
1869 assembler, it only works in a TEXT or DATA section). From there, you build
1870 the OP list how you want it and go from there. A few caveats: you will want
1871 to put a .org directive at the top of your list, and labels that you want to
1872 be able to address in 68xxx code (for moving from a data section to an
1873 address where it will be executed by the OP, for example) should be created
1877 `What are the opcodes?`_
1878 ''''''''''''''''''''''''
1880 They are **bitmap**, **scbitmap**, **gpuobj**, **branch**, **stop**, **nop**, and **jump**. **nop** and **jump**
1881 are psuedo-ops, they are there as a convenience to the coder.
1884 `What are the proper forms for these opcodes?`_
1885 '''''''''''''''''''''''''''''''''''''''''''''''
1887 They are as follows:
1889 **bitmap** *data addr*, *xloc*, *yloc*, *dwidth*, *iwidth*, *iheight*, *bpp*,
1890 *pallete idx*, *flags*, *firstpix*, *pitch*
1892 **scbitmap** *data addr*, *xloc*, *yloc*, *dwidth*, *iwidth*, *iheight*,
1893 *xscale*, *yscale*, *remainder*, *bpp*, *pallete idx*,
1894 *flags*, *firstpix*, *pitch*
1896 **gpuobj** *line #*, *userdata* (bits 14-63 of this object)
1898 **branch** VC *condition (<, =, >)* *line #*, *link addr*
1900 **branch** OPFLAG, *link addr*
1902 **branch** SECHALF, *link addr*
1908 **jump** *link addr*
1910 Note that the *flags* field in bitmap and scbitmap objects consist of the
1911 following: **REFLECT**, **RMW**, **TRANS**, **RELEASE**. They can be in any order (and
1912 should be separated by whitespace **only**), and you can only put a maximum of
1913 four of them in. Further note that with bitmap and scbitmap objects, all the
1914 parameters after *data addr* are optional--if they are omitted, they will
1915 use defaults (mostly 0, but 1 is the default for pitch). Also, in the
1916 scbitmap object, the *xscale*, *yscale*, and *remainder* fields can be
1917 floating point constants/expressions. *data addr* can refer to any address
1918 defined (even external!) and the linker (rln v1.6.0 or greater) will
1919 properly fix up the address.
1925 Pretty much what you expect. It's beyond the scope of this little note to
1926 explain the Jaguar's Object Processor and how it operates, so you'll have to
1927 seek explanations for how they work elsewhere.
1930 `Why do I want to put a *.org* directive at the top of my list?`_
1931 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
1933 You want to put a *.org* directive at the top of your list because otherwise
1934 the assembler will not know where in memory the object list is supposed
1935 go--then when you move it to its destination, the object link addresses will
1936 all be wrong and it won't work.
1939 `Why would I copy my object list to another memory location?`_
1940 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
1942 Simple: because the OP destroys the list as it uses it to render the screen.
1943 If you don't keep a fresh copy stashed away somewhere to refresh it before
1944 the next frame is rendered, what you see on the screen will not be what you
1945 expect, as the OP has scribbled all over it!
1948 `Does the assembler do anything behind my back?`_
1949 '''''''''''''''''''''''''''''''''''''''''''''''''
1951 Yes, it will emit **NOP** s to ensure that bitmaps and scbitmaps are on proper
1952 memory boundaries, and fixup link addresses as necessary. This is needed
1953 because of a quirk in how the OP works (it ORs constants on the address
1954 lines to get the phrases it needs and if they are not zeroes, it will fail
1955 in bizarre ways). It will also set all *ypos* constants on the correct
1956 half-line (as that's how the OP views them).
1959 `Why can't I define the link addresses for all the objects?`_
1960 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
1962 You really, *really* don't want to do this. Trust me on this one.
1964 `How about an example of an object list?`_
1965 ''''''''''''''''''''''''''''''''''''''''''
1973 objects: ; This is the label you will use to address this in 68K code
1974 .objproc ; Engage the OP assembler
1975 .org objList ; Tell the OP assembler where the list will execute
1977 branch VC < 69, .stahp ; Branch to the STOP object if VC < 69
1978 branch VC > 241, .stahp ; Branch to the STOP object if VC > 241
1979 bitmap bRAM, 22, 70, 24, 24, 22, 4
1980 bitmap bRAM, 20+96+96, 70, 24, 24, 22, 4, 0, REFLECT
1981 scbitmap tms, 20, 70, 1, 1, 8, 3.0, 3.0, 2.9999, 0, 0, TRANS
1982 scbitmap tmsShadow, 23, 73, 1, 1, 8, 3.0, 3.0, 2.9999, 0, 3, TRANS
1983 bitmap sbRelBM, 30, 108, 3, 3, 8, 0, 1, TRANS
1984 bitmap txt1BM, 46, 132, 3, 3, 8, 0, 2, TRANS
1985 bitmap txt2BM, 46, 148, 3, 3, 8, 0, 2, TRANS
1986 bitmap txt3BM, 22, 164, 3, 3, 8, 0, 2, TRANS
1997 RMAC fully supports Motorola's DSP56001 as used on the Atari Falcon and can output
1998 binary code in the two most popular formats: *.lod* (ASCII dump, supported by the
1999 Atari Falcon XBIOS) and *.p56* (binary equivalent of *.lod*)
2001 `Differences from Motorola's assembler`_
2002 ''''''''''''''''''''''''''''''''''''''''
2004 - Motorola's assembler aliases **and #xxx,reg** with **andi #xxx,reg** and can
2005 distinguish between the two. rmac needs the user to be explicit and will
2006 generate an error if the programmer tries to use syntax from one instruction
2008 - Similarly Motorola's assembler can alias **move** with **movec**, **movep**
2009 and **movem**. rmac also not accept such aliasing and generate an error.
2010 - Motorola's assembler uses the underscore character (*_*) to define local
2011 labels. In order for rmac to maintain a uniform syntax across all platforms,
2012 such labels will not be treated as local.
2013 - Macros syntax is different from Motorola's assembler. This includes local
2014 labels inside macros. The user is encouraged to study the `Macros`_ section
2015 and compare syntactical differences.
2016 - Motorola's assembler allows reordering of addressing modes **x:**, **x:r**,
2017 **r:y**, **x:y**. rmac will only accept syntax as is defined on the reference
2019 - In **L:** section a dc value cannot be 12 hex digits like Motorola's assmebler.
2020 Instead, the value needs to be split into two parts separated by **:**.
2024 RMAC will generate code for the Motorola 6502 microprocessor. This chapter
2025 describes extra addressing modes and directives used to support the 6502.
2027 As the 6502 object code is not linkable (currently there is no linker) external
2028 references may not be made. (Nevertheless, RMAC may reasonably be used for
2029 large assemblies because of its blinding speed.)
2031 `6502 Addressing Modes`_
2032 ''''''''''''''''''''''''
2033 All standard 6502 addressing modes are supported, with the exception of the
2034 accumulator addressing form, which must be omitted (e.g. "ror a" becomes "ror").
2035 Five extra modes, synonyms for existing ones, are included for compatibility with
2036 the Atari Coinop assembler.
2038 ============== ========================================
2039 *empty* implied or accumulator (e.g. tsx or ror)
2040 *expr* absolute or zeropage
2042 #<\ *expr* immediate low byte of a word
2043 #>\ *expr* immediate high byte of a word
2044 (*expr*,x) indirect X
2045 (*expr*),y indirect Y
2049 @\ *expr*\ (x) indirect X
2050 @\ *expr*\ (y) indirect Y
2052 x,\ *expr* indexed X
2053 y,\ *expr* indexed Y
2054 ============== ========================================
2059 This directive enters the 6502 section. The location counter is undefined, and
2060 must be set with ".org" before any code can be generated.
2062 The "``dc.w``" directive will produce 6502-format words (low byte first). The
2063 68000's reserved keywords (``d0-d7/a0-a7/ssp/usp`` and so on) remain reserved
2064 (and thus unusable) while in the 6502 section. The directives **globl**, **dc.l**,
2065 **dcb.l**, **text**, **data**, **bss**, **abs**, **even** and **comm** are illegal in the 6502 section.
2066 It is permitted, though probably not useful, to generate both 6502 and 68000
2067 code in the same object file.
2069 This directive leaves the 6502 segment and returns to the 68000's text segment.
2070 68000 instructions may be assembled as normal.
2072 This directive sets the value of the location
2073 counter (or **pc**) to location, an expression that must be defined, absolute, and
2078 It is possible to assemble "beyond" the microprocessor's 64K address space, but
2079 attempting to do so will probably screw up the assembler. DO NOT attempt
2080 to generate code like this:
2089 the third NOP in this example, at location $10000, may cause the assembler
2090 to crash or exhibit spectacular schizophrenia. In any case, RMAC will give
2091 no warning before flaking out.
2093 `6502 Object Code Format`_
2094 ''''''''''''''''''''''''''
2095 Traditionally Madmac had a very kludgy way of storing object files. This has been
2096 replaced with a more standard *.exe* (or *.com* or *.xex* if you prefer). Briefly,
2097 the *.exe* format consists of chunks of this format (one after the other):
2102 00-01 $FFFF - Indicates a binary load file. Mandatory for first segment, optional for any other segment
2103 02-03 Start Address. The segment will load at this address
2104 04-05 End Address. The last byte to load for this segment
2105 06-.. The actual segment data to load (End Address-Start Address + 1 bytes)
2110 `When Things Go Wrong`_
2111 '''''''''''''''''''''''
2112 Most of RMAC's error messages are self-explanatory. They fall into four classes:
2113 warnings about situations that you (or the assembler) may not be happy about,
2114 errors that cause the assembler to not generate object files, fatal errors that cause
2115 the assembler to abort immediately, and internal errors that should never happen.\ [3]_
2117 You can write editor macros (or sed or awk scripts) to parse the error messages
2118 RMAC generates. When a message is printed, it is of the form:
2120 "*filename*" , ``line`` *line-number*: *message*
2122 The first element, a filename enclosed in double quotes, indicates the file that generated
2123 the error. The filename is followed by a comma, the word "``line``", and a line
2124 number, and finally a colon and the text of the message. The filename "**(\*top\*)**"
2125 indicates that the assembler could not determine which file had the problem.
2127 The following sections list warnings, errors and fatal errors in alphabetical
2128 order, along with a short description of what may have caused the problem.
2130 .. [3] If you come across an internal error, we would appreciate it if you would contact the rmac development team and let us know about the problem.
2134 **bad backslash code in string**
2135 You tried to follow a backslash in a string with a character that the assembler
2136 didn't recognize. Remember that RMAC uses a C-style escape system in
2139 You specified a label before a macro, **rept** or **endm** directive. The assembler
2140 is warning you that the label will not be defined in the assembly.
2141 **unoptimized short branch**
2142 This warning is only generated if the -s switch is specified on the command
2143 line. The message refers to a forward, unsized long branch that you could have
2150 As a result of previous errors, the assembler cannot continue processing. The
2151 assembly is aborted.
2152 **line too long as a result of macro expansion**
2153 When a source line within a macro was expanded, the resultant line was too
2154 long for RMAC (longer than 200 characters or so).
2157 **memory exhausted**
2158 The assembler ran out of memory. You should (1) split up your source files
2159 and assemble them seperately, or (2) if you have any ramdisks or RAM-resident
2160 programs (like desk accessories) decrease their size so that the assembler has
2161 more RAM to work with. As a rule of thumb, pure 68000 code will use up to
2162 twice the number of bytes contained in the source files, whereas 6502 code will
2163 use 64K of ram right away, plus the size of the source files. The assembler itself
2164 uses about 80K bytes. Get out your calculator...
2166 The assembler ran across an **endm** directive when it wasn't expecting to see
2167 one. The assembly is aborted. Check the nesting of your macro definitions -
2168 you probably have an extra **endm**.
2176 Syntax error in **.cargs** directive.
2178 **.comm symbol already defined**
2180 You tried to ``.comm`` a symbol that was already defined.
2182 **.ds permitted only in BSS**
2184 You tried to use ``.ds`` in the text or data section.
2186 **.init not permitted in BSS or ABS**
2188 You tried to use ``.init`` in the BSS or ABS section.
2190 **Cannot create:** *filename*
2192 The assembler could not create the indicated filename.
2194 **External quick reference**
2196 You tried to make the immediate operand of a **moveq**, **subq** or **addq** instruction external.
2198 **PC-relative expr across sections**
2200 You tried to make a PC-relative reference to a location contained in another
2203 **[bwsl] must follow '.' in symbol**
2205 You tried to follow a dot in a symbol name with something other than one of
2206 the four characters 'B', 'W', 'S' or 'L'.
2208 **addressing mode syntax**
2210 You made a syntax error in an addressing mode.
2214 One of your **.assert** directives failed!
2216 **bad (section) expression**
2218 You tried to mix and match sections in an expression.
2220 **bad 6502 addressing mode**
2222 The 6502 mnemonic will not work with the addressing mode you specified.
2226 There's a syntax error in the expression you typed.
2228 **bad size specified**
2230 You tried to use an inappropriate size suffix for the instruction. Check your
2231 68000 manual for allowable sizes.
2235 You can't use .b (byte) mode with the **movem** instruction.
2237 **cannot .globl local symbol**
2239 You tried to make a confined symbol global or common.
2241 **cannot initialize non-storage (BSS) section**
2243 You tried to generate instructions (or data, with dc) in the BSS or ABS section.
2245 **cannot use '.b' with an address register**
2247 You tried to use a byte-size suffix with an address register. The 68000 does not
2248 perform byte-sized address register operations.
2250 **directive illegal in .6502 section**
2252 You tried to use a 68000-oriented directive in the 6502 section.
2256 The expression you typed involves a division by zero.
2258 **expression out of range**
2260 The expression you typed is out of range for its application.
2262 **external byte reference**
2264 You tried to make a byte-sized reference to an external symbol, which the
2265 object file format will not allow.
2267 **external short branch**
2269 You tried to make a short branch to an external symbol, which the linker cannot
2272 **extra (unexpected) text found after addressing mode**
2274 RMAC thought it was done processing a line, but it ran up against "extra"
2275 stuff. Be sure that any comment on the line begins with a semicolon, and check
2276 for dangling commas, etc.
2278 **forward or undefined .assert**
2280 The expression you typed after a **.assert** directive had an undefined value.
2281 Remember that RMAC is one-pass.
2283 **hit EOF without finding matching .endif**
2285 The assembler fell off the end of last input file without finding a **.endif** to
2286 match an . it. You probably forgot a **.endif** somewhere.
2288 **illegal 6502 addressing mode**
2290 The 6502 instruction you typed doesn't work with the addressing mode you
2293 **illegal absolute expression**
2295 You can't use an absolute-valued expression here.
2297 **illegal bra.s with zero offset**
2299 You can't do a short branch to the very next instruction (read your 68000
2302 **illegal byte-sized relative reference**
2304 The object file format does not permit bytes contain relocatable values; you
2305 tried to use a byte-sized relocatable expression in an immediate addressing
2308 **illegal character**
2310 Your source file contains a character that RMAC doesn't allow. (most
2311 control characters fall into this category).
2313 **illegal initialization of section**
2315 You tried to use .dc or .dcb in the BSS or ABS sections.
2317 **illegal relative address**
2319 The relative address you specified is illegal because it belongs to a different
2322 **illegal word relocatable (in .PRG mode)**
2324 You can't have anything other than long relocatable values when you're gener-
2325 ating a **.PRG** file.
2327 **inappropriate addressing mode**
2329 The mnemonic you typed doesn't work with the addressing modes you specified.
2330 Check your 68000 manual for allowable combinations.
2332 **invalid addressing mode**
2334 The combination of addressing modes you picked for the **movem** instruction
2335 are not implemented by the 68000. Check your 68000 reference manual for
2338 **invalid symbol following ^^**
2340 What followed the ^^ wasn't a valid symbol at all.
2342 **mis-nested .endr**
2344 The assembler found a **.endr** directive when it wasn't prepared to find one.
2345 Check your repeat-block nesting.
2347 **mismatched .else**
2349 The assembler found a **.else** directive when it wasn't prepared to find one.
2350 Check your conditional assembly nesting.
2352 **mismatched .endif**
2354 The assembler found a **.endif** directive when it wasn't prepared to find one.
2355 Check your conditional assembly nesting.
2361 **missing argument name**
2363 **missing close parenthesis ')'**
2365 **missing close parenthesis ']'**
2369 **missing filename**
2375 **missing symbol or string**
2377 The assembler expected to see a symbol/filename/string (etc...), but found
2378 something else instead. In most cases the problem should be obvious.
2380 **misuse of '.', not allowed in symbols**
2382 You tried to use a dot (.) in the middle of a symbol name.
2386 The expression you typed involves a modulo by zero.
2388 **multiple formal argument definition**
2390 The list of formal parameter names you supplied for a macro definition includes
2391 two identical names.
2393 **multiple macro definition**
2395 You tried to define a macro which already had a definition.
2397 **non-absolute byte reference**
2399 You tried to make a byte reference to a relocatable value, which the object file
2400 format does not allow.
2402 **non-absolute byte value**
2404 You tried to dc.b or dcb.b a relocatable value. Byte relocatable values are
2405 not permitted by the object file format.
2407 **register list order**
2409 You tried to specify a register list like **D7-D0**, which is illegal. Remember
2410 that the first register number must be less than or equal to the second register
2413 **register list syntax**
2415 You made an error in specifying a register list for a **.reg** directive or a **.movem**
2418 **symbol list syntax**
2420 You probably forgot a comma between the names of two symbols in a symbol
2421 list, or you left a comma dangling on the end of the line.
2425 This is a "catch-all" error.
2427 **undefined expression**
2429 The expression has an undefined value because of a forward reference, or an
2430 undefined or external symbol.
2432 **unimplemented addressing mode**
2434 You tried to use 68020 "square-bracket" notation for a 68020 addressing mode.
2435 RMAC does not support 68020 addressing modes.
2437 **unimplemented directive**
2439 You have found a directive that didn't appear in the documentation. It doesn't
2442 **unimplemented mnemonic**
2446 **unknown symbol following ^^**
2448 You followed a ^^ with something other than one of the names defined, referenced
2451 **unsupported 68020 addressing mode**
2453 The assembler saw a 68020-type addressing mode. RMAC does not assemble
2454 code for the 68020 or 68010.
2456 **unterminated string**
2458 You specified a string starting with a single or double quote, but forgot to type
2463 The assembler had a problem writing an object file. This is usually caused by
2464 a full disk, or a bad sector on the media.