]> Shamusworld >> Repos - rmac/blob - docs/rmac.rst
Introducing .align directive, thanks to Bastian Schick for most of the implementation...
[rmac] / docs / rmac.rst
1 RMAC
2 ----
3 68000 Macro Assembler
4 =====================
5 Reference Manual
6 ================
7 version 2.0.23
8 ==============
9
10 © and notes
11 ===========
12
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.*
18
19
20 *Copyright © 2011-2022, the rmac authors*
21
22 *All rights reserved.*
23
24 Contents
25 ========
26
27 .. contents::
28
29 Introduction
30 ============
31
32 Introduction
33 ''''''''''''
34 This document describes RMAC, a fast macro assembler for the 68000. RMAC currently
35 runs on the any POSIX compatible platform and the Atari ST. It was initially written
36 at Atari Corporation by programmers who needed a high performance assembler
37 for their work. Then, more than 20 years later, because there was still a need for
38 such an assembler and what was available wasn't up to expectations, Subqmod
39 and eventually Reboot continued work on the freely released source, adding Jaguar
40 extensions and fixing bugs. Over time the assembler has been extended by adding
41 support for Motorola's 68020/30/40/60, 68881/2, DSP56001 CPUs as well as Atari's
42 Object Processor (OP) found on the Atari Jaguar.
43
44 RMAC is intended to be used by programmers who write mostly in assembly language.
45 It was not originally a back-end to a C compiler, therefore it
46 has creature comfort that are usually neglected in such back-end assemblers. It
47 supports include files, macros, symbols with limited scope, some limited control
48 structures, and other features. RMAC is also blindingly fast, another feature
49 often sadly and obviously missing in today's assemblers.\ [1]_
50
51 RMAC is not entirely compatible with the AS68 assembler provided with
52 the original Atari ST Developer's Kit, but most changes are minor and a few minutes
53 with an editor should allow you to assemble your current source files. If you are an
54 AS68 user, before you leap into the unknown please read the section on Notes for
55 AS68 Users.
56
57 .. [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!
58
59 `Getting Started`_
60 ''''''''''''''''''
61
62
63 * The distribution disk contains a file called README that you should read.
64   This file contains important nays about the contents of the distribution disk
65   and summarizes the most recent changes to the tools.
66
67 * Hard disk users can simply copy the executable files to their work or binary
68   directories. People with floppy disks can copy the executables to ramdisks,
69   install the assembler with the -q option, or even work right off of the floppies.
70
71 * You will need an editor that can produce "normal" format text files. Micro
72   Emacs will work well, as will most other commercial program editors, but not
73   most word processors (such as First Word or Microsoft Write).
74
75 * You will probably want to examine or get a listing of the file "ATARI.S". It
76   contains lots of definitions for the Atari ST, including BIOS variables, most
77   BIOS, XBIOS and GEMDOS traps, and line-A equates. We (or you) could
78   split the file up into pieces (a file for line-A equates, a file for hardware and
79   BIOS variables and so on), but RMAC is so fast that it doesn't matter
80   much.
81
82 * Read the rest of the manual, especially the first two chapters on The Command Line and Using RMAC.
83   Also, `Notes for migrating from other 68000 assemblers`_ will save a lot of time and frustration in the long run.
84   The distribution disk contains example
85   programs that you can look at, assemble and modify.
86
87 `The Command Line`_
88 '''''''''''''''''''
89
90 The assembler is called "**rmac**" or "**rmac.prg**". The command line takes the form:
91
92                           **rmac** [*switches*] [*files* ...]
93
94 A command line consists of any number of switches followed by the names of files
95 to assemble. A switch is specified with a dash (**-**) followed immediately by a key
96 character. Key characters are not case-sensitive, so "**-d**" is the same as "**-D**". Some
97 switches accept (or require) arguments to immediately follow the key character,
98 with no spaces in between.
99
100 Switch order is important. Command lines are processed from left to right in
101 one pass, and switches usually take effect when they are encountered. In general it
102 is best to specify all switches before the names of any input files.
103
104 If the command line is entirely empty then RMAC prints a copyright message
105 along with usage info and exit.
106
107 Input files are assumed to have the extension "**.s**"; if a filename has no extension
108 (i.e. no dot) then "**.s**" will be appended to it. More than one source filename may be
109 specified: the files are assembled into one object file, as if they were concatenated.
110
111 RMAC normally produces object code in "**file.o**" if "**file.s**" is the first
112 input filename. If the first input file is a special character device, the output name
113 is noname.o. The **-o** switch (see below) can be used change the output file name.
114
115
116 ===================  ===========
117 Switch               Description
118 ===================  ===========
119 -dname\ *[=value]*   Define symbol, with optional value.
120 -e\ *[file[.err]]*   Direct error messages to the specified file.
121 -fa                  ALCYON output object file format (implied when **-ps** is enabled).
122 -fb                  BSD COFF output object file format.
123 -fe                  ELF output object file format.
124 -fr                  Absolute address. Source code is required to have one .org statement.
125 -fx                  Atari 800 com/exe/xex output object file format.
126 -g                   Generate source level debug info. Requires BSD COFF object file format.
127 -i\ *path*           Set include-file directory search path.
128 -l\ *[file[prn]]*    Construct and direct assembly listing to the specified file.
129 -l\ *\*[filename]*   Create an output listing file without pagination.
130 -m\ *cpu*            Switch CPU type
131
132                       `68000 - MC68000`
133
134                       `68020 - MC68020`
135
136                       `68030 - MC68030`
137
138                       `68040 - MC68040`
139
140                       `68060 - MC68060`
141
142                       `68881 - MC68881`
143
144                       `68882 - MC68882`
145
146                       `56001 - DSP56001`
147
148                       `6502 - MOS 6502`
149
150                       `tom - Jaguar GPU JRISC`
151
152                       `jerry - Jaguar DSP JRISC`
153
154                       -o\ *file[.o]*       Direct object code output to the specified file.
155 +/~oall               Turn all optimisations on/off
156 +o\ *0-30*/*p*        Enable specific optimisation
157 ~o\ *0-30*/*p*        Disable specific optimisation
158
159                       `0: Absolute long adddresses to word`
160
161                       `1: move.l #x,Dn/An to moveq`
162
163                       `2: Word branches to short`
164
165                       `3: Outer displacement 0(An) to (An)`
166
167                       `4: lea to addq`
168
169                       `5: 68020+ Absolute long base/outer displacement to word`
170
171                       `6: Convert null short branches to NOP`
172
173                       `7: Convert clr.l Dn to moveq #0,Dn`
174
175                       `8: Convert adda.w/l #x,Dy to addq.w/l #x,Dy`
176
177                       `9: Convert adda.w/l #x,Dy to lea x(Dy),Dy`
178
179                       `10: 56001 Use short format for immediate values if possible`
180
181                       `11: 56001 Auto convert short addressing mode to long (default: on)`
182
183                       `30: Enforce PC relative (alternative name: op)`
184
185 -p                   Produce an executable (**.prg**) output file.
186 -ps                  Produce an executable (**.prg**) output file with symbols.
187 -px                  Produce an executable (**.prg**) output file with extended symbols.
188 -q                   Make RMAC resident in memory (Atari ST only).
189 -r *size*            automatically pad the size of each
190                      segment in the output file until the size is an integral multiple of the
191                      specified boundary. Size is a letter that specifies the desired boundary.
192
193                       `-rw Word (2 bytes, default alignment)`
194
195                       `-rl Long (4 bytes)`
196
197                       `-rp Phrase (8 bytes)`
198
199                       `-rd Double Phrase (16 bytes)`
200
201                       `-rq Quad Phrase (32 bytes)`
202 -s                   Warn about unoptimized long branches and applied optimisations.
203 -u                   Force referenced and undefined symbols global.
204 -v                   Verbose mode (print running dialogue).
205 -x                   Turn on debugging mode.
206 -yn                  Set listing page size to n lines.
207 -4                   Use C style operator precedence.
208 file\ *[s]*          Assemble the specified file.
209 ===================  ===========
210
211 The switches are described below. A summary of all the switches is given in
212 the table.
213
214 **-d**
215  The **-d** switch permits symbols to be defined on the command line. The name
216  of the symbol to be defined immediately follows the switch (no spaces). The
217  symbol name may optionally be followed by an equals sign (=) and a decimal
218  number. If no value is specified the symbol's value is zero. The symbol at-
219  tributes are "defined, not referenced, and absolute". This switch is most useful
220  for enabling conditionally-assembled debugging code on the command line; for
221  example:
222
223   ::
224
225       -dDEBUG -dLoopCount=999 -dDebugLevel=55
226
227 **-e**
228  The -e switch causes RMAC to send error messages to a file, instead of the
229  console. If a filename immediately follows the switch character, error messages
230  are written to the specified file. If no filename is specified, a file is created with
231  the default extension "**.err**" and with the root name taken from the first input
232  file name (e.g. error messages are written to "**file.err**" if "**file**" or "**file.s**" is
233  the first input file name). If no errors are encountered, then no error listing
234  file is created. Beware! If an assembly produces no errors, any error file from
235  a previous assembly is not removed.
236
237 **-g**
238  The **-g** switch causes RMAC to generate source-level debug symbols using the
239  stabs format. When linked with a compatible linker such as RLN, these symbols
240  can be used by source-level debuggers such as rdbjag, wdb, or gdb to step
241  through assembly code line-by-line with all the additional context of labels,
242  macros, constants, register equates, etc. available in the original assembly
243  listings rather than relying on the simple disassembly or raw machine code
244  available when stepping through instruction-by-instruction. This option only
245  works with the BSD COFF object file format, as the others do not use the
246  a.out-style symbol tables required by stabs, and RMAC does not currently
247  support placing stabs debug symbols in their own dedicated section in ELF
248  format object files.
249
250 **-i**
251  The **-i** switch allows automatic directory searching for include files. A list of
252  semi-colon seperated directory search paths may be mentioned immediately
253  following the switch (with no spaces anywhere). For example:
254
255   ::
256
257          -im:;c:include;c:include\sys
258
259  will cause the assembler to search the current directory of device **M**, and the
260  directories include and include\sys on drive **C**. If *-i* is not specified, and the
261  enviroment variable "**RMACPATH**" exists, its value is used in the same manner.
262  For example, users of the Mark Williams shell could put the following line in
263  their profile script to achieve the same result as the **-i** example above:
264
265   ::
266
267       setenv RMACPATH="m:;c:include;c:include\sys"
268 **-l**
269  The -l switch causes RMAC to generate an assembly listing file. If a file-
270  name immediately follows the switch character, the listing is written to the
271  specified file. If no filename is specified, then a listing file is created with the
272  default extension "**.prn**" and with the root name taken from the first input file
273  name (e.g. the listing is written to "**file.prn**" if "**file**" or "**file.s**" is the first
274  input file name).
275 **-o**
276  The -o switch causes RMAC to write object code on the specified file. No
277  default extension is applied to the filename. For historical reasons the filename
278  can also be seperated from the switch with a space (e.g. "**-o file**").
279
280 **-p**
281
282 **-ps**
283  The **-p** and **-ps** switches cause RMAC to produce an Atari ST executable
284  file with the default extension of "**.prg**". If there are any external references
285  at the end of the assembly, an error message is emitted and no executable file
286  is generated. The **-p** switch does not write symbols to the executable file. The
287  **-ps** switch includes symbols (Alcyon format) in the executable file.
288 **-q**
289   The **-q** switch is aimed primarily at users of floppy-disk-only systems. It causes
290   RMAC to install itself in memory, like a RAMdisk. Then the program
291   **m.prg** (which is very short - less than a sector) can be used instead of
292   **mac.prg**, which can take ten or twelve seconds to load. (**NOTE** not available
293   for now, might be re-implemented in the future).
294 **-s**
295   The **-s** switch causes RMAC to generate a list of unoptimized forward
296   branches as warning messages. This is used to point out branches that could
297   have been short (e.g. "bra" could be "bra.s").
298 **-u**
299   The **-u** switch takes effect at the end of the assembly. It forces all referenced
300   and undefined symbols to be global, exactly as if they had been made global
301   with a **.extern** or **.globl** directive. This can be used if you have a lot of
302   external symbols, and you don't feel like declaring them all external.
303 **-v**
304   The **-v** switch turns on a "verbose" mode in which RMAC prints out (for
305   example) the names of the files it is currently processing. Verbose mode is
306   automatically entered when RMAC prompts for input with a star.
307 **-y**
308   The **-y** switch, followed immediately by a decimal number (with no intervening
309   space), sets the number of lines in a page. RMAC will produce *N* lines
310   before emitting a form-feed. If *N* is missing or less than 10 an error message is
311   generated.
312 **-4**
313   Use C style order of precedence in expressions. See `Order of Evaluation`_ for more
314   information.
315
316 `Using RMAC`_
317 ===============
318
319 Let's assemble and link some example programs. These programs are included
320 on the distribution disk in the "**EXAMPLES**" directory - you should copy them to
321 your work area before continuing. In the following examples we adopt the conven-
322 tions that the shell prompt is a percent sign (%) and that your input (the stuff you
323 type) is presented in **bold face**.
324
325 If you have been reading carefully, you know that RMAC can generate
326 an executable file without linking. This is useful for making small, stand alone
327 programs that don't require externals or library routines. For example, the following
328 two commands:
329
330  ::
331
332       % rmac examples
333       % aln -s example.s
334
335 could be replaced by the single command:
336
337  ::
338
339       % rmac -ps example.s
340
341 since you don't need the linker for stand-alone object files.
342
343 Successive source files named in the command line are are concatenated, as in
344 this example, which assembles three files into a single executable, as if they were
345 one big file:
346
347  ::
348
349       % rmac -p bugs shift images
350
351 Of course you can get the same effect by using the **.include** directive, but sometimes
352 it is convenient to do the concatenation from the command line.
353
354    Here we have an unbelievably complex command line:
355
356     ::
357
358       % rmac -lzorf -y95 -o tmp -ehack -Ddebug=123 -ps example
359
360 This produces a listing on the file called "**zorf.prn**" with 95 lines per page, writes
361 the executable code (with symbols) to a file called "**tmp.prg**", writes an error listing
362 to the file "**hack.err**", specifies an include-file path that includes the current
363 directory on the drive "**M:**," defines the symbol "**debug**" to have the value 123, and
364 assembles the file "**example.s**". (Take a deep breath - you got all that?)
365
366 One last thing. If there are any assembly errors, RMAC will terminate
367 with an exit code of 1. If the assembly succeeds (no errors, although there may be
368 warnings) the exit code will be 0. This is primarily for use with "make" utilities.
369
370 Things You Should Be Aware Of
371 '''''''''''''''''''''''''''''
372 RMAC is a one pass assembler. This means that it gets all of its work done by
373 reading each source file exactly once and then "back-patching" to fix up forward
374 references. This one-pass nature is usually transparent to the programmer, with
375 the following important exceptions:
376
377  * In listings, the object code for forward references is not shown. Instead, lower-
378    case "xx"s are displayed for each undefined byte, as in the following example:
379
380     ::
381
382      60xx      1: bra.s.2  ;forward branch
383      xxxxxxxx     dc.l .2  ;forward reference
384      60FE     .2: bra.s.2  ;backward reference
385
386  * Forward branches (including **BSR**\s) are never optimized to their short forms.
387    To get a short forward branch it is necessary to explicitly use the ".s" suffix in
388    the source code.
389  * Error messages may appear at the end of the assembly, referring to earlier source
390    lines that contained undefined symbols.
391  * All object code generated must fit in memory. Running out of memory is a
392    fatal error that you must deal with by splitting up your source files, re-sizing
393    or eliminating memory-using programs such as ramdisks and desk accessories,
394    or buying more RAM.
395
396 Forward Branches
397 ''''''''''''''''
398 RMAC does not optimize forward branches for you, but it will tell you about
399 them if you use the -s (short branch) option:
400
401  ::
402
403      % mac -s example.s
404      "example.s", line 20: warning: unoptimized short branch
405
406 With the -e option you can redirect the error output to a file, and determine by
407 hand (or editor macros) which forward branches are safe to explicitly declare short.
408
409 `Notes for migrating from other 68000 assemblers`_
410 ''''''''''''''''''''''''''''''''''''''''''''''''''
411 RMAC is not entirely compatible with the other popular assemblers
412 like Devpac or vasm. This section
413 outlines the major differences. In practice, we have found that very few changes are
414 necessary to make other assemblers' source code assemble.
415
416 * A semicolon (;) must be used to introduce a comment,
417   except that a star (*)
418   may be used in the first column. AS68 treated anything following the operand
419   field, preceeded by whitespace, as a comment. (RMAC treats a star that
420   is not in column 1 as a multiplication operator).
421 * Labels require colons (even labels that begin in column 1).
422
423 * Conditional assembly directives are called **if**, **else** and **endif**.
424   Devpac and vasm call these
425   **ifne**, **ifeq** (etc.), and **endc**.
426 * The tilde (~) character is an operator, and back-quote (`) is an illegal character.
427   AS68 permitted the tilde and back-quote characters in symbols.
428 * There are no equivalents to org or section directives apart from .text, .data, .bss.
429   The **.xdef** and **.xref** directives are not implemented,
430   but **.globl** makes these unnecessary anyway.
431
432 * The location counter cannot be manipulated with a statement of the form:
433
434   ::
435
436                                 * = expression
437
438   Exceptions to this rule are when outputting a binary using the **-fr** switch,
439   6502 mode, and Jaguar GPU/DSP.
440 * Back-slashes in strings are "electric" characters that are used to escape C-like
441   character codes. Watch out for GEMDOS path names in ASCII constants -
442   you will have to convert them to double-backslashes.
443 * Expression evaluation is done left-to-right without operator precedence. Use parentheses to
444   force the expression evaluation as you wish. Alternatively, use the **-4** switch to switch
445   to C style precedence. For more information refer to `Order of Evaluation`_.
446 * Mark your segments across files.
447   Branching to a code segment that could be identified as BSS will cause a "Error: cannot initialize non-storage (BSS) section"
448 * In 68020+ mode **Zan** and **Zri** (register suppression) is not supported.
449 * rs.b/rs.w/rs.l/rscount/rsreset can be simulated in rmac using **.abs**.
450   For example the following source:
451
452    ::
453
454     rsreset
455     label1: rs.w 1
456     label2: rs.w 10
457     label3: rs.l 5
458     label4: rs.b 2
459
460     size_so_far equ rscount
461
462   can be converted to:
463
464    ::
465
466     abs
467     label1: ds.w 1
468     label2: ds.w 10
469     label3: ds.l 5
470     label4: ds.b 2
471
472     size_so_far equ ^^abscount
473 * A rare case: if your macro contains something like:
474
475    ::
476
477     macro test
478     move.l #$\1,d0
479     endm
480
481     test 10
482
483   then by the assembler's design this will fail as the parameters are automatically converted to hex. Changing the code like this works:
484
485    ::
486
487     macro test
488     move.l #\1,d0
489     endm
490
491     test $10
492
493 `Text File Format`_
494 '''''''''''''''''''
495 For those using editors other than the "Emacs" style ones (Micro-Emacs, Mince,
496 etc.) this section documents the source file format that RMAC expects.
497
498  * Files must contain characters with ASCII values less than 128; it is not per-
499    missable to have characters with their high bits set unless those characters are
500    contained in strings (i.e. between single or double quotes) or in comments.
501
502  * Lines of text are terminated with carriage-return/line-feed, linefeed alone, or
503    carriage-return alone.
504
505  * The file is assumed to end with the last terminated line. If there is text beyond
506    the last line terminator (e.g. control-Z) it is ignored.
507
508 `Source Format`_
509 ================
510
511 `Statements`_
512 '''''''''''''
513 A statement may contain up to four fields which are identified by order of ap-
514 pearance and terminating characters. The general form of an assembler statement
515 is:
516
517   ::
518
519       label: operator operand(s)  ; comment
520
521 The label and comment fields are optional. An operand field may not appear
522 without an operator field. Operands are seperated with commas. Blank lines are
523 legal. If the first character on a line is an asterisk (*) or semicolon (;) then the
524 entire line is a comment. A semicolon anywhere on the line (except in a string)
525 begins a comment field which extends to the end of the line.
526
527 The label, if it appears, must be terminated with a single or double colon. If
528 it is terminated with a double colon it is automatically declared global. It is illegal
529 to declare a confined symbol global (see: `Symbols and Scope`_).
530
531 As an addition, the exclamation mark character (**!**) can be placed at the very first
532 character of a line to disbale all optimisations for that specific line, i.e.
533
534   ::
535
536       !label: operator operand(s)  ; comment
537
538 `Equates`_
539 ''''''''''
540 A statement may also take one of these special forms:
541
542       *symbol* **equ** *expression*
543
544       *symbol* **=** *expression*
545
546       *symbol* **==** *expression*
547
548       *symbol* **set** *expression*
549
550       *symbol* **reg** *register list*
551
552 The first two forms are identical; they equate the symbol to the value of an
553 expression, which must be defined (no forward references). The third form, double-
554 equals (==), is just like an equate except that it also makes the symbol global. (As
555 with labels, it is illegal to make a confined equate global.) The fourth form allows
556 a symbol to be set to a value any number of times, like a variable. The last form
557 equates the symbol to a 16-bit register mask specified by a register list. It is possible
558 to equate confined symbols (see: `Symbols and Scope`_). For example:
559
560   ::
561
562       cr    equ    13          carriage-return
563       if    =      10          line-feed
564       DEBUG ==     1           global debug flag
565       count set    0           variable
566       count set    count + 1   increment variable
567       .rags reg    d3-d7/a3-a6 register list
568       .cr          13          confined equate
569
570 `Symbols and Scope`_
571 ''''''''''''''''''''
572 Symbols may start with an uppercase or lowercase letter (A-Z a-z), an underscore
573 (**_**), a question mark (**?**) or a period (**.**). Each remaining character may be an
574 upper or lowercase letter, a digit (**0-9**), an underscore, a dollar sign (**$**), or a question
575 mark. (Periods can only begin a symbol, they cannot appear as a symbol
576 continuation character). Symbols are terminated with a character that is not a
577 symbol continuation character (e.g. a period or comma, whitespace, etc.). Case is
578 significant for user-defined symbols, but not for 68000 mnemonics, assembler direc-
579 tives and register names. Symbols are limited to 100 characters. When symbols
580 are written to the object file they are silently truncated to eight (or sixteen) char-
581 acters (depending on the object file format) with no check for (or warnings about)
582 collisions.
583
584    For example, all of the following symbols are legal and unique:
585
586      ::
587
588       reallyLongSymbolName .reallyLongConfinedSymbolName
589       a10 ret  move  dc  frog  aa6 a9 ????
590       .a1 .ret .move .dc .frog .a9 .9 ????
591       .0  .00  .000 .1  .11. .111 . ._
592       _frog ?zippo? sys$syetem atari Atari ATARI aTaRi
593
594 while all of the following symbols are illegal:
595
596      ::
597
598       12days dc.10   dc.z   'quote  .right.here
599       @work hi.there $money$ ~tilde
600
601
602 Symbols beginning with a period (**.**) are *confined*; their scope is between two
603 normal (unconfined) labels. Confined symbols may be labels or equates. It is illegal
604 to make a confined symbol global (with the ".globl" directive, a double colon, or a
605 double equals). Only unconfined labels delimit a confined symbol's scope; equates
606 (of any kind) do not count. For example, all symbols are unique and have unique
607 values in the following:
608
609    ::
610
611       zero:: subq.w $1,d1
612              bmi.s .ret
613       .loop: clr.w (a0)+
614              dbra  d0,.loop
615       .ret:  rta
616       FF::   subq.w #1,d1
617              bmi.s .99
618       .loop: move.w -1,(a0)+
619              dbra  d0,.loop
620       .99:   its
621
622 Confined symbols are useful since the programmer has to be much less inventive
623 about finding small, unique names that also have meaning.
624
625 It is legal to define symbols that have the same names as processor mnemonics
626 (such as "**move**" or "**rts**") or assembler directives (such as "**.even**"). Indeed, one
627 should be careful to avoid typographical errors, such as this classic (in 6502 mode):
628
629     ::
630
631              .6502
632       .org   =     $8000
633
634
635 which equates a confined symbol to a hexadecimal value, rather than setting the
636 location counter, which the .org directive does (without the equals sign).
637
638 `Keywords`_
639 '''''''''''
640 The following names, in all combinations of uppercase and lowercase, are keywords
641 and may not be used as symbols (e.g. labels, equates, or the names of macros):
642
643    ::
644
645       Common:
646       equ set reg
647       MC68000:
648       sr ccr pc sp ssp usp
649       d0 d1 d2 d3 d4 d5 d6 d7
650       a0 a1 a2 a3 a4 a5 a6 a7
651       Tom/Jerry:
652       r0 r1 r2 r3 r4 r5 r6 r7
653       r8 r9 r10 r11 r12 r13 r14 r15
654       6502:
655       x y a
656       DSP56001:
657       x x0 x1 x2 y y0 y1 y2
658       a a0 a1 a2 b b0 b1 b2 ab ba
659       mr omr la lc ssh ssl ss
660       n0 n1 n2 n3 n4 n5 n6 n7
661       m0 m1 m2 m3 m4 m5 m6 m7
662       r0 r1 r2 r3 r4 r5 r6 r7
663
664
665 `Constants`_
666 ''''''''''''
667 Numbers may be decimal, hexadecimal, octal, binary or concatenated ASCII. The
668 default radix is decimal, and it may not be changed. Decimal numbers are specified
669 with a string of digits (**0-9**). Hexadecimal numbers are specified with a leading
670 dollar sign (**$**) followed by a string of digits and uppercase or lowercase letters (**A-F
671 a-f**). Octal numbers are specified with a leading at-sign (**@**) followed by a string
672 of octal digits (**0-7**). Binary numbers are specified with a leading percent sign
673 (**%**) followed by a string of binary digits (**0-1**). Concatenated ASCII constants are
674 specified by enclosing from one to four characters in single or double quotes. For
675 example:
676
677     ::
678
679       1234   *decimal*
680       $1234  *hexadecimal*
681       @777   *octal*
682       %10111 *binary*
683       "z"    *ASCII*
684       'frog' *ASCII*
685
686 Negative numbers Are specified with a unary minus (**-**). For example:
687
688     ::
689
690       -5678  -@334 -$4e71
691       -%11011 -'z' -"WIND"
692
693 `Strings`_
694 ''''''''''
695 Strings are contained between double (") or single ( ') quote marks. Strings may
696 contain non-printable characters by specifying "backslash" escapes, similar to the
697 ones used in the C programming language. RMAC will generate a warning if a
698 backslash is followed by a character not appearing below:
699
700     ::
701
702       \\    $5c    backslash
703       \n    $0a    line-feed (newline)
704       \b    $08    backspace
705       \t    $09    tab
706       \r    $0c1   carriage-return
707       \f    $0c    form-feed
708       \e    $1b    escape
709       \'    $27    single-quote
710       \"    $22    double-quote
711
712 It is possible for strings (but not symbols) to contain characters with their high
713 bits set (i.e. character codes 128...255).
714
715 You should be aware that backslash characters are popular in GEMDOS path
716 names, and that you may have to escape backslash characters in your existing source
717 code. For example, to get the file "'c:\\auto\\ahdi.s'" you would specify the string
718 "`c:\\\\auto\\\\ahdi.s`".
719
720 `Register Lists`_
721 '''''''''''''''''
722 Register lists are special forms used with the **movem** mnemonic and the **.reg**
723 directive. They are 16-bit values, with bits 0 through 15 corresponding to registers
724 **D0** through **A7**. A register list consists of a series of register names or register
725 ranges seperated by slashes. A register range consists of two register names, Rm
726 and Rn,m<n, seperated by a dash. For example:
727
728      ::
729
730        register list           value
731        -------------           -----
732        d0-d7/a0-a7             $FFFF
733        d2-d7/a0/a3-a6          $39FC
734        d0/d1/a0-a3/d7/a6-a7    $CF83
735        d0                      $0001
736        r0-r16                  $FFFF
737
738 Register lists and register equates may be used in conjunction with the movem
739 mnemonic, as in this example:
740
741      ::
742
743        temps   reg     d0-d2/a0-a2     ; temp registers
744        keeps   reg     d3-d7/d3-a6     ; registers to preserve
745        allregs reg     d0-d7/a0-a7     ; all registers
746                movem.l #temps,-(sp)    ; these two lines ...
747                movem.l d0-d2/a0-a2,-(sp) ; are identical
748                movem.l #keeps,-(sp)    ; save "keep" registers
749                movem.l (sp)+,#keeps    ; restore "keep" registers
750
751
752 `Expressions`_
753 ==============
754 `Order of Evaluation`_
755 ''''''''''''''''''''''
756 All values are computed with 32-bit 2's complement arithmetic. For boolean operations
757 (such as if or **assert**) zero is considered false, and non-zero is considered
758 true.
759
760      **Expressions are evaluated strictly left-to-right, with no
761      regard for operator precedence.**
762
763 Thus the expression "1+2*3" evaluates to 9, not 7. However, precedence may be
764 forced with parenthesis (**()**) or square-brackets (**[]**).
765
766 All the above behavior is the default. However if the command line switch **-4**
767 is used, then C style of operator precedence is enforced. The following list
768 shows the order of precedence in this mode, from lowest to highest:
769
770  * bitwise XOR ^
771
772  * bitwise OR |
773
774  * bitwise AND &
775
776  * relational = < <= >= > !=
777
778  * shifts << >>
779
780  * sum + -
781
782  * product * /
783
784 `Types`_
785 '''''''''
786 Expressions belong to one of three classes: undefined, absolute or relocatable. An
787 expression is undefined if it involves an undefined symbol (e.g. an undeclared sym-
788 bol, or a forward reference). An expression is absolute if its value will not change
789 when the program is relocated (for instance, the number 0, all labels declared in
790 an abs section, and all Atari ST hardware register locations are absolute values).
791 An expression is relocatable if it involves exactly one symbol that is contained in a
792 text, data or BSS section.
793
794 Only absolute values may be used with operators other than addition (+) or
795 subtraction (-). It is illegal, for instance, to multiply or divide by a relocatable or
796 undefined value. Subtracting a relocatable value from another relocatable value in
797 the same section results in an absolute value (the distance between them, positive
798 or negative). Adding (or subtracting) an absolute value to or from a relocatable
799 value yeilds a relocatable value (an offset from the relocatable address).
800
801 It is important to realize that relocatable values belong to the sections they
802 are defined in (e.g. text, data or BSS), and it is not permissible to mix and match
803 sections. For example, in this code:
804
805     ::
806
807      linel:  dc.l   line2, line1+8
808      line2:  dc.l   line1, line2-8
809      line3:  dc.l   line2-line1, 8
810      error:  dc.l   line1+line2, line2 >> 1, line3/4
811
812 Line 1 deposits two longwords that point to line 2. Line 2 deposits two longwords
813 that point to line 1. Line 3 deposits two longwords that have the absolute value
814 eight. The fourth line will result in an assembly error, since the expressions (re-
815 spectively) attempt to add two relocatable values, shift a relocatable value right by
816 one, and divide a relocatable value by four.
817
818 The pseudo-symbol "*****" (star) has the value that the current section's location
819 counter had at the beginning of the current source line. For example, these two
820 statements deposit three pointers to the label "**bar**":
821
822     ::
823
824      too:    dc.l   *+4
825      bar:    dc.l   *, *
826
827 Similarly, the pseudo-symbol "**$**" has the value that the current section's location
828 counter has, and it is kept up to date as the assembler deposits information
829 "across" a line of source code. For example, these two statements deposit four
830 pointers to the label "zip":
831
832         ::
833
834           zip:      dc.l      $+8, $+4
835           zop:      dc.l      $, $-4
836
837 `Unary Operators`_
838 ''''''''''''''''''
839
840 ================================    ==========================================
841 Operator                            Description
842 ================================    ==========================================
843 **-**                               Unary minus (2's complement).
844 **!**                               Logical (boolean) NOT.
845 **~**                               Tilde: bitwise not (l's complement).
846 **^^defined** *symbol*              True if symbol has a value.
847 **^^referenced** *symbol*           True if symbol has been referenced.
848 **^^streq** *string1*, *string2*    True if the strings are equal.
849 **^^macdef** *macroName*            True if the macro is defined.
850 **^^abscount**                      Returns the size of current .abs section
851 **^^filesize** *string_filename*    Returns the file size of supplied filename
852 ================================    ==========================================
853
854  * The boolean operators generate the value 1 if the expression is true, and 0 if it is not.
855
856  * A symbol is referenced if it is involved in an expression.
857      A symbol may have
858      any combination of attributes: undefined and unreferenced, defined and unref-
859      erenced (i.e. declared but never used), undefined and referenced (in the case
860      of a forward or external reference), or defined and referenced.
861
862
863
864 `Binary Operators`_
865 '''''''''''''''''''
866
867 ===========  ==============================================
868 Operator     Description
869 ===========  ==============================================
870 \ + - * /    The usual arithmetic operators.
871 %            Modulo. Do *not* attempt to modulo by 0 or 1.
872 & | ^        Bit-wise **AND**, **OR** and **Exclusive-OR**.
873 << >>        Bit-wise shift left and shift right.
874 < <=  >=  >  Boolean magnitude comparisons.
875 =            Boolean equality.
876 <>  !=       Boolean inequality.
877 ===========  ==============================================
878
879  * All binary operators have the same precedence:
880    expressions are evaluated strictly left to right,
881    with the exception of the **-4** switch. For more information
882    refer to `Order of Evaluation`_.
883
884  * Division or modulo by zero yields an assembly error.
885
886  * The "<>" and "!=" operators are synonyms.
887
888  * Note that the modulo operator (%) is also used to introduce binary constants
889    (see: `Constants`_). A percent sign should be followed by at least one space if
890    it is meant to be a modulo operator, and is followed by a '0' or '1'.
891
892 `Special Forms`_
893 ''''''''''''''''
894
895 ============    =========================================
896 Special Form    Description
897 ============    =========================================
898 **^^date**      The current system date (Gemdos format).
899 **^^time**      The current system time (Gemdos format).
900 ============    =========================================
901
902    * The "**^^date**" special form expands to the current system date, in Gemdos
903      format. The format is a 16-bit word with bits 0 ...4 indicating the day of the
904      month (1...31), bits 5...8 indicating the month (1...12), and bits 9...15
905      indicating the year since 1980, in the range 0...119.
906
907    * The "**^^time**" special form expands to the current system time, in Gemdos
908      format. The format is a 16-bit word with bits 0...4 indicating the current
909      second divided by 2, bits 5...10 indicating the current minute 0...59. and
910      bits 11...15 indicating the current hour 0...23.
911
912 `Example Expressions`_
913 ''''''''''''''''''''''
914
915        ::
916
917         line address contents      source code
918         ---- ------- --------      -------------------------------
919            1 00000000 4480         lab1:  neg.l  d0
920            2 00000002 427900000000 lab2:  clr.w  lab1
921            3         =00000064     equ1   =      100
922            4         =00000096     equ2   =      equ1 + 50
923            5 00000008 00000064            dc.l   lab1 + equ1
924            6 0000000C 7FFFFFE6            dc.l   (equl + ~equ2) >> 1
925            7 00000010 0001                dc.w   ^^defined equl
926            8 00000012 0000                dc.w   ^^referenced lab2
927            9 00000014 00000002            dc.l   lab2
928           10 00000018 0001                dc.w   ^^referenced lab2
929           11 0000001A 0001                dc.w   lab1 = (lab2 - 6)
930
931 Lines 1 through four here are used to set up the rest of the example. Line 5 deposits
932 a relocatable pointer to the location 100 bytes beyond the label "**lab1**". Line 6 is
933 a nonsensical expression that uses the and right-shift operators. Line 7 deposits
934 a word of 1 because the symbol "**equ1**" is defined (in line 3).
935
936 Line 8 deposits a word of 0 because the symbol "**lab2**", defined in line 2, has
937 not been referenced. But the expression in line 9 references the symbol "**lab2**", so
938 line 10 (which is a copy of line-8) deposits a word of 1. Finally, line 11 deposits a
939 word of 1 because the Boolean equality operator evaluates to true.
940
941 The operators "**^^defined**" and "**^^referenced**" are particularly useful in
942 conditional assembly. For instance, it is possible to automatically include debugging
943 code if the debugging code is referenced, as in:
944
945       ::
946
947                lea    string,a0            ; AO -> message
948                jsr    debug                ; print a message
949                rts                         ; and return
950         string: dc.b  "Help me, Spock!",0  ; (the message)
951                     .
952                     .
953                     .
954                .iif ^^referenced debug, .include "debug.s"
955
956 The **jsr** statement references the symbol debug. Near the end of the source file, the
957 "**.iif**" statement includes the file "**debug.s**" if the symbol debug was referenced.
958
959 In production code, presumably all references to the debug symbol will be removed,
960 and the debug source file will not be included. (We could have as easily made the
961 symbol **debug** external, instead of including another source file).
962
963
964 `Directives`_
965 =============
966
967 Assembler directives may be any mix of upper- or lowercase. The leading periods
968 are optional, though they are shown here and their use is encouraged. Directives
969 may be preceeded by a label; the label is defined before the directive is executed.
970 Some directives accept size suffixes (**.b**, **.s**, **.w**, **.1**, **.d**, **.x**, **.p**, or  **.q**);
971 the default is word (**.w**) if no size is specified. The **.s** suffix is identical to **.b**,
972 with the exception of being used in a **dc** statement. In that case the **.s**
973 refers to single precision floating point numbers.
974 Directives relating to the 6502 are described in the chapter on `6502 Support`_.
975
976
977
978 **.even**
979
980    If the location counter for the current section is odd, make it even by adding
981    one to it. In text and data sections a zero byte is deposited if necessary.
982
983 **.long**
984
985    Align the program counter to the next integral long boundary (4 bytes).
986    Note that GPU/DSP code sections are not contained in their own
987    segments and are actually part of the TEXT or DATA segments.
988    Therefore, to align GPU/DSP code, align the current section before and
989    after the GPU/DSP code.
990
991 **.print**
992    This directive is similar to the standard ‘C’ library printf() function
993    and is used to print user messages from the assembly process. You can
994    print any string or valid expression. Several format flags that can be used
995    to format your output are also supported.
996
997           ::
998
999            /x hexadecimal
1000            /d signed decimal
1001            /u unsigned decimal
1002            /w word
1003            /l long
1004
1005    For example:
1006
1007           ::
1008
1009            MASK .equ $FFF8
1010            VALUE .equ -100000
1011             .print “Mask: $”,/x/w MASK
1012             .print “Value: “,/d/l VALUE
1013
1014 **.phrase**
1015
1016    Align the program counter to the next integral phrase boundary (8 bytes).
1017    Note that GPU/DSP code sections are not contained in their own
1018    segments and are actually part of the TEXT or DATA segments.
1019    Therefore, to align GPU/DSP code, align the current section before and
1020    after the GPU/DSP code.
1021
1022 **.dphrase**
1023
1024    Align the program counter to the next integral double phrase boundary (16
1025    bytes). Note that GPU/DSP code sections are not contained in their own
1026    segments and are actually part of the TEXT or DATA segments.
1027    Therefore, to align GPU/DSP code, align the current section before and
1028    after the GPU/DSP code.
1029
1030 **.qphrase**
1031
1032    Align the program counter to the next integral quad phrase boundary (32
1033    bytes). Note that GPU/DSP code sections are not contained in their own
1034    segments and are actually part of the TEXT or DATA segments.
1035    Therefore, to align GPU/DSP code, align the current section before and
1036    after the GPU/DSP code.
1037
1038 **.align** *expression*
1039
1040   A generalised version of the above directives, this will align the program
1041   counter to the boundary of the specified value. Note that there is not much
1042   error checking happening (only values 0 and 1 are rejected). Also note that
1043   in DSP56001 mode the align value is assumed to be in DSP words, i.e. 24 bits.
1044
1045 **.assert** *expression* [,\ *expression*...]
1046
1047    Assert that the conditions are true (non-zero). If any of the comma-seperated
1048    expressions evaluates to zero an assembler warning is issued. For example:
1049
1050           ::
1051
1052            .assert *-start = $76
1053            .assert stacksize >= $400
1054
1055 **.bss**
1056
1057 **.data**
1058
1059 **.text**
1060
1061    Switch to the BSS, data or text segments. Instructions and data may not
1062    be assembled into the BSS-segment, but symbols may be defined and storage
1063    may be reserved with the **.ds** directive. Each assembly starts out in the text
1064    segment.
1065
1066 **.68000**
1067 **.68020**
1068 **.68030**
1069 **.68040**
1070 **.68060**
1071
1072    Enable different flavours of the MC68000 family of CPUs. Bear in mind that not all
1073    instructions and addressing modes are available in all CPUs so the correct CPU
1074    should be selected at all times. Notice that it is possible to switch CPUs
1075    during assembly.
1076
1077 **.68881**
1078 **.68882**
1079
1080    Enable FPU support. Note that *.68882* is on by default when selecting *.68030*.
1081
1082 **.56001**
1083
1084    Switch to Motorola DSP56001 mode.
1085
1086 **.org** *location* [*X:*/*Y:*/*P:*/*L:*]
1087
1088    This directive sets the value of the location counter (or **pc**) to location, an
1089    expression that must be defined and absolute. It is legal to use the directive in
1090    the following modes: 6502, Tom, Jerry, OP, 56001 and 680x0 (only with -fr switch).
1091    Especially for the 56001 mode the *location* field **must** be prefixed with the
1092    intended section (*X:*, *Y:*, *P:* or *L:*).
1093
1094 **.opt** *"+On"*
1095 **.opt** *"~On"*
1096 **.opt** *"+Oall"*
1097 **.opt** *"~Oall"*
1098
1099    These directives control the optimisations that rmac applies to the source
1100    automatically. Each directive is applied immediately from the line encountered
1101    onwards. So it is possible to turn specific optimisations on and off globally
1102    (when placed at the start of the first file) or locally (by turning desired
1103    optimisations on and off at certain parts of the source). For a list of the
1104    optimisations (*n*) available please consult the table in section `The Command Line`_.
1105
1106    **all**, as expected, turns all available optimisations on or off. An exception to this
1107    is *o10*/*op* as this is not an optimisation that should be turned on unless the user
1108    absolutely needs it.
1109
1110    Lastly, as a "creature comfort" feature, if the first column of any line is prefixed
1111    with an exclamation mark (*!*) then for that line all optimisations are turned off.
1112
1113 **.abs** [*location*]
1114
1115    Start an absolute section, beginning with the specified location (or zero, if
1116    no location is specified). An absolute section is much like BSS, except that
1117    locations declared with .ds are based absolute. This directive is useful for
1118    declaring structures or hardware locations.
1119    For example, the following equates:
1120
1121           ::
1122
1123            VPLANES = 0
1124            VWRAP   = 2
1125            CONTRL  = 4
1126            INTIN   = 8
1127            PTSIN   = 12
1128
1129    could be as easily defined as:
1130
1131           ::
1132
1133                    .abs
1134            VPLANES: ds.w    1
1135            VWRAP:  ds.w     1
1136            CONTRL: ds.l     1
1137            INTIE:  ds.l     1
1138            PTSIN:  ds.l     1
1139
1140    Another interesting example worth mentioning is the emulation of "C"'s "union" keyword
1141    using *.abs*. For example, the following "C" code:
1142
1143           ::
1144
1145            struct spritesheet
1146            {
1147                 short spf_w;
1148                 short spf_h;
1149                 short spf_xo;
1150                 short spf_yo;
1151                 union { int spf_em_colour;     int spf_emx_colour;    };
1152                 union { int spf_em_psmask[16]; int spf_emx_colouropt; };
1153            }
1154
1155    can be expressed as:
1156
1157           ::
1158
1159            .abs
1160            *-------------------------------------------------------*
1161            spf_w:          ds.w    1   ;<- common
1162            spf_h:          ds.w    1
1163            spf_xo:         ds.w    1
1164            spf_yo:         ds.w    1
1165            spf_data:       ds.l    0
1166            *-------------------------------------------------------*
1167            ;           .union  set
1168            spf_em_colour:      ds.l    1   ;<- union #1
1169            spf_em_psmask:      ds.l    16
1170            *-------------------------------------------------------*
1171            .68000
1172                        .abs spf_em_colour
1173            ;           .union  reset
1174            spf_emx_colour:     ds.l    1   ;<- union #2
1175            spf_emx_colouropt:  ds.l    1
1176            spf_emx_psmask:     ds.l    16
1177            spf_emx_psmaskopt:  ds.l    16
1178
1179            .68000
1180            ;*-------------------------------------------------------*
1181
1182                move #spf_em_colour,d0
1183                move #spf_emx_colour,d0
1184
1185    In this example, *spf_em_colour* and *spf_emx_colour* will have the same value.
1186
1187 **.comm** *symbol*, *expression*
1188
1189    Specifies a label and the size of a common region. The label is made global,
1190    thus confined symbols cannot be made common. The linker groups all common
1191    regions of the same name; the largest size determines the real size of the
1192    common region when the file is linked.
1193
1194 **.ccdef** *expression*
1195
1196    Allows you to define names for the condition codes used by the JUMP
1197    and JR instructions for GPU and DSP code. For example:
1198
1199     ::
1200
1201      Always .ccdef 0
1202      . . .
1203           jump Always,(r3) ; 'Always' is actually 0
1204
1205 **.ccundef** *regname*
1206
1207    Undefines a register name (regname) previously assigned using the
1208    .CCDEF directive. This is only implemented in GPU and DSP code
1209    sections.
1210
1211 **.dc.i** *expression*
1212
1213    This directive generates long data values and is similar to the DC.L
1214    directive, except the high and low words are swapped. This is provided
1215    for use with the GPU/DSP MOVEI instruction.
1216
1217 **.dc**\ [.\ *size*] *expression* [, *expression*...]
1218
1219    Deposit initialized storage in the current section. If the specified size is word
1220    or long, the assembler will execute a .even before depositing data. If the size
1221    is .b, then strings that are not part of arithmetic expressions are deposited
1222    byte-by-byte. If no size is specified, the default is .w. This directive cannot be
1223    used in the BSS section.
1224
1225 **.dcb**\ [.\ *size*] *expression1*, *expression2*
1226
1227    Generate an initialized block of *expression1* bytes, words or longwords of the
1228    value *expression2*. If the specified size is word or long, the assembler will
1229    execute .even before generating data. If no size is specified, the default is **.w**.
1230    This directive cannot be used in the BSS section.
1231
1232 **.ds**\ [.\ *size*] *expression*
1233
1234    Reserve space in the current segment for the appropriate number of bytes,
1235    words or longwords. If no size is specified, the default size is .w. If the size
1236    is word or long, the assembler will execute .even before reserving space.
1237
1238 **.dsp**
1239
1240    Switch to Jaguar DSP assembly mode. This directive must be used
1241    within the TEXT or DATA segments.
1242
1243 **.init**\ [.\ *size*] [#\ *expression*,]\ *expression*\ [.\ *size*] [,...]
1244
1245    Generalized initialization directive. The size specified on the directive becomes
1246    the default size for the rest of the line. (The "default" default size is **.w**.) A
1247    comma-seperated list of expressions follows the directive; an expression may be
1248    followed by a size to override the default size. An expression may be preceeded
1249    by a sharp sign, an expression and a comma, which specifies a repeat count to
1250    be applied to the next expression. For example:
1251
1252       ::
1253
1254        .init.l -1, 0.w, #16,'z'.b, #3,0, 11.b
1255
1256    will deposit a longword of -1, a word of zero, sixteen bytes of lower-case 'z',
1257    three longwords of zero, and a byte of 11.
1258
1259    No auto-alignment is performed within the line, but a **.even** is done once
1260    (before the first value is deposited) if the default size is word or long.
1261
1262 **.cargs** [#\ *expression*,] *symbol*\ [.\ *size*] [, *symbol*\ [.\ *size*].. .]
1263
1264    Compute stack offsets to C (and other language) arguments. Each symbol is
1265    assigned an absolute value (like equ) which starts at expression and increases
1266    by the size of each symbol, for each symbol. If the expression is not supplied,
1267    the default starting value is 4. For example:
1268
1269     ::
1270
1271      .cargs #8, .fileliams.1, .openMode, .butPointer.l
1272
1273    could be used to declare offsets from A6 to a pointer to a filename, a word
1274    containing an open mode, and a pointer to a buffer. (Note that the symbols
1275    used here are confined). Another example, a C-style "string-length" function,
1276    could be written as:
1277
1278         ::
1279
1280          _strlen:: .cargs .string     ; declare arg
1281                move.l .string(sp),a0  ; a0 -> string
1282                moveq  #-1,d0          ; initial size = -1
1283          .1:   addq.1 #1,d0           ; bump size
1284                tst.b  (a0)+           ; at end of string?
1285                bne   .1               ; (no -- try again)
1286                rts                    ; return string length
1287
1288 **.error** ["*string*"]
1289
1290   Aborts the build, optionally printing a user defined string. Can be useful
1291   inside conditional assembly blocks in order to catch errors. For example:
1292
1293         ::
1294
1295          .if ^^defined JAGUAR
1296            .error "TOS cannot be built on Jaguar, don't be silly"
1297          .endif
1298
1299 **.end**
1300
1301    End the assembly. In an include file, end the include file and resume assembling
1302    the superior file. This statement is not required, nor are warning messages
1303    generated if it is missing at the end of a file. This directive may be used inside
1304    conditional assembly, macros or **.rept** blocks.
1305
1306 **.equr** *expression*
1307
1308    Allows you to name a register. For example:
1309
1310     ::
1311
1312      .gpu
1313      Clipw .equr r19
1314      . . .
1315           add ClipW,r0 ; ClipW actually is r19
1316
1317 **.if** *expression*
1318
1319 **.else**
1320
1321 **.endif**
1322
1323    Start a block of conditional assembly. If the expression is true (non-zero) then
1324    assemble the statements between the .if and the matching **.endif** or **.else**.
1325    If the expression is false, ignore the statements unless a matching .else is
1326    encountered. Conditional assembly may be nested to any depth.
1327
1328    It is possible to exit a conditional assembly block early from within an include
1329    file (with **end**) or a macro (with **endm**).
1330
1331 **.iif** *expression*, *statement*
1332
1333    Immediate version of **.if**. If the expression is true (non-zero) then the state-
1334    ment, which may be an instruction, a directive or a macro, is executed. If
1335    the expression is false, the statement is ignored. No **.endif** is required. For
1336    example:
1337
1338         ::
1339
1340          .iif age < 21, canDrink = 0
1341          .iif weight > 500, dangerFlag = 1
1342          .iif !(^^defined DEBUG), .include dbsrc
1343
1344 **.macro** *name* [*formal*, *formal*,...]
1345
1346 **.endm**
1347
1348 **.exitm**
1349
1350    Define a macro called name with the specified formal arguments. The macro
1351    definition is terminated with a **.endm** statement. A macro may be exited early
1352    with the .exitm directive. See the chapter on `Macros`_ for more information.
1353
1354 **.undefmac** *macroName* [, *macroName*...]
1355
1356    Remove the macro-definition for the specified macro names. If reference is
1357    made to a macro that is not defined, no error message is printed and the name
1358    is ignored.
1359
1360 **.rept** *expression*
1361
1362 **.endr**
1363
1364    The statements between the **.rept** and **.endr** directives will be repeated *expression*
1365    times. If the expression is zero or negative, no statements will be
1366    assembled. No label may appear on a line containing either of these directives.
1367
1368 **.globl** *symbol* [, *symbol*...]
1369
1370 **.extern** *symbol* [, *symbol*...]
1371
1372    Each symbol is made global. None of the symbols may be confined symbols
1373    (those starting with a period). If the symbol is defined in the assembly, the
1374    symbol is exported in the object file. If the symbol is undefined at the end
1375    of the assembly, and it was referenced (i.e. used in an expression), then the
1376    symbol value is imported as an external reference that must be resolved by the
1377    linker. The **.extern** directive is merely a synonym for **.globl**.
1378
1379 **.include** "*file*"
1380
1381    Include a file. If the filename is not enclosed in quotes, then a default extension
1382    of "**.s**" is applied to it. If the filename is quoted, then the name is not changed
1383    in any way.
1384
1385    Note: If the filename is not a valid symbol, then the assembler will generate an
1386              error message. You should enclose filenames such as "**atari.s**" in quotes,
1387              because such names are not symbols.
1388
1389    If the include file cannot be found in the current directory, then the directory
1390    search path, as specified by -i on the commandline, or' by the 'RMACPATH'
1391    enviroment string, is traversed.
1392
1393 **.incbin** "*file*" [, [*size*], [*offset*]]
1394
1395    Include a file as a binary. This can be thought of a series of **dc.b** statements
1396    that match the binary bytes of the included file, inserted at the location of the
1397    directive. The directive is not allowed in a BSS section. Optional parameters
1398    control the amount of bytes to be included and offset from the start of the file.
1399    All the following lines are valid:
1400
1401               ::
1402                 .incbin "test.bin"          ; Include the whole file
1403                 .incbin "test.bin",,$30     ; Skip the first 48 bytes
1404                 .incbin "test.bin",$70,$30  ; Include $70 bytes starting at offset $30
1405                 .incbin "test.bin",$48      ; Include the file starting at offset 48 till the end
1406                 .incbin "test.bin",,        ; Include the whole file
1407
1408 **.eject**
1409
1410    Issue a page eject in the listing file.
1411
1412 **.title** "*string*"
1413
1414 **.subttl** [-] "*string*"
1415
1416    Set the title or subtitle on the listing page. The title should be specified on
1417    the the first line of the source program in order to take effect on the first page.
1418    The second and subsequent uses of **.title** will cause page ejects. The second
1419    and subsequent uses of .subttl will cause page ejects unless the subtitle string
1420    is preceeded by a dash (-).
1421
1422 **.list**
1423
1424 **.nlist**
1425
1426    Enable or disable source code listing. These directives increment and decrement
1427    an internal counter, so they may be appropriately nested. They have no effect
1428    if the **-l** switch is not specified on the commandline.
1429
1430 **.goto** *label*
1431
1432    This directive provides unstructured flow of control within a macro definition.
1433    It will transfer control to the line of the macro containing the specified goto
1434    label. A goto label is a symbol preceeded by a colon that appears in the first
1435    column of a source line within a macro definition:
1436
1437                  :  *label*
1438
1439    where the label itself can be any valid symbol name, followed immediately by
1440    whitespace and a valid source line (or end of line). The colon **must** appear in
1441    the first column.
1442
1443    The goto-label is removed from the source line prior to macro expansion -
1444    to all intents and purposes the label is invisible except to the .goto directive
1445    Macro expansion does not take place within the label.
1446
1447    For example, here is a silly way to count from 1 to 10 without using **.rept**:
1448
1449               ::
1450
1451                                .macro Count
1452                  count         set     1
1453                  :loop         dc.w    count
1454                  count         set     count + 1
1455                                iif count <= 10, goto loop
1456                                .endm
1457
1458 **.gpu**
1459
1460    Switch to Jaguar GPU assembly mode. This directive must be used
1461    within the TEXT or DATA segments.
1462
1463 **.gpumain**
1464
1465    No. Just... no. Don't ask about it. Ever.
1466
1467 **.prgflags** *value*
1468
1469    Sets ST executable .PRG field *PRGFLAGS* to *value*. *PRGFLAGS* is a bit field defined as follows:
1470
1471 ============ ======  =======
1472 Definition   Bit(s)  Meaning
1473 ============ ======  =======
1474 PF_FASTLOAD  0       If set, clear only the BSS area on program load, otherwise clear the entire heap.
1475 PF_TTRAMLOAD 1       If set, the program may be loaded into alternative RAM, otherwise it must be loaded into standard RAM.
1476 PF_TTRAMMEM  2       If set, the program's Malloc() requests may be satisfied from alternative RAM, otherwise they must be satisfied from standard RAM.
1477 --           3       Currently unused.
1478 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.
1479 --           6-15    Currently unused.
1480 ============ ======  =======
1481
1482 **.regequ** *expression*
1483    Essentially the same as **.EQUR.** Included for compatibility with the GASM
1484    assembler.
1485
1486 **.regundef**
1487    Essentially the same as **.EQURUNDEF.** Included for compatibility with
1488    the GASM assembler.
1489
1490
1491 `68000 Mnemonics`_
1492 ==================
1493
1494 `Mnemonics`_
1495 ''''''''''''
1496 All of the standard Motorola 68000 mnemonics and addressing modes are supported;
1497 you should refer to **The Motorola M68000 Programmer's Reference Manual**
1498 for a description of the instruction set and the allowable addressing modes for each
1499 instruction. With one major exception (forward branches) the assembler performs
1500 all the reasonable optimizations of instructions to their short or address register
1501 forms.
1502
1503 Register names may be in upper or lower case. The alternate forms ``R0`` through
1504 ``R15`` may be used to specify ``D0`` through ``A7``. All register names are keywords, and
1505 may not be used as labels or symbols. None of the 68010 or 68020 register names
1506 are keywords (but they may become keywords in the future).
1507
1508 `Addressing Modes`_
1509 '''''''''''''''''''
1510
1511 =====================================    ===========================================
1512 Assembler Syntax                         Description
1513 =====================================    ===========================================
1514 *Dn*                                     Data register direct
1515 *An*                                     Address register direct
1516 (*An*)                                   Address register indirect
1517 (*An*)+                                  Address register indirect postincrement
1518 -(*An*)                                  Address register indirect predecrement
1519 *disp*\ (*An*)                           Address register indirect with displacement
1520 *bdisp*\ (*An*, *Xi*\ [.\ *size*])       Address register indirect indexed
1521 *abs*.w                                  Absolute short
1522 *abs*                                    Absolute (long or short)
1523 *abs*.l                                  Forced absolute long
1524 *disp*\ (PC)                             Program counter with displacement
1525 *bdisp*\ (PC, *Xi*\ )                    Program counter indexed
1526 #\ *imm*                                 Immediate
1527 =====================================    ===========================================
1528
1529 `68020+ Addressing Modes`_
1530 ''''''''''''''''''''''''''
1531
1532 The following addressing modes are only valid for 68020 and newer CPUs. In these
1533 modes most of the parameters like Base Displacement (**bd**), Outer Displacement
1534 (**od**), Base Register (**An**) and Index Register (**Xn**) can be omitted. RMAC
1535 will detect this and *suppress* the registers in the produced code.
1536
1537 Other assemblers
1538 use a special syntax to denote register suppression like **Zan** to suppress the Base
1539 Register and **Rin** to suppress the Index Register. RMAC has no support for this
1540 behaviour nor needs it to suppress registers.
1541
1542 In addition, other assemblers will allow reordering of the parameters (for example
1543 ([*An*,\ *bd*])). This is not allowed in RMAC.
1544
1545 Also noteworthy is that the Index Register can be an address or data register.
1546
1547 To avoid internal confusion the 68040/68060 registers *DC*, *IC* and *BC* are named
1548 *DC40*, *IC40* and *BC40* respectively.
1549
1550 ======================================================    =============================================================
1551 Assembler Syntax                                          Description
1552 ======================================================    =============================================================
1553 *bd*\ (*An*, *Xi*\ [.\ *size*][*\*scale*])                Address register indirect indexed
1554 ([*bd*,\ *An*],\ *Xn*\[.\ *siz*][*\*scale*],\ *od*)       Register indirect preindexed with outer displacement
1555 ([*bd*,\ *An*,\ *Xn*\[.\ *siz*][*\*scale*],\ *od*)        Register indirect postindexed with outer displacement
1556 ([*bd*,\ *PC*],\ *Xn*\[.\ *siz*][*\*scale*],\ *od*)       Program counter indirect preindexed with outer displacement
1557 ([*bd*,\ *PC*,\ *Xn*\[.\ *siz*][*\*scale*],\ *od*)        Program counter indirect postindexed with outer displacement
1558 ======================================================    =============================================================
1559
1560 `Branches`_
1561 '''''''''''
1562 Since RMAC is a one pass assembler, forward branches cannot be automatically
1563 optimized to their short form. Instead, unsized forward branches are assumed to
1564 be long. Backward branches are always optimized to the short form if possible.
1565
1566 A table that lists "extra" branch mnemonics (common synonyms for the Motorola
1567 defined mnemonics) appears below.
1568
1569 `Linker Constraints`_
1570 '''''''''''''''''''''
1571 It is not possible to make an external reference that will fix up a byte. For example:
1572
1573                    ::
1574
1575                      extern frog
1576                     move.l frog(pc,d0),d1
1577
1578 is illegal (and generates an assembly error) when frog is external, because the
1579 displacement occupies a byte field in the 68000 offset word, which the object file
1580 cannot represent.
1581
1582 `Branch Synonyms`_
1583 ''''''''''''''''''
1584 ============== ========
1585 Alternate name Becomes:
1586 ============== ========
1587 bhs            bcc
1588 blo            bcs
1589 bse, bs        beq
1590 bns            bne
1591 dblo           dbcs
1592 dbse           dbeq
1593 dbra           dbf
1594 dbhs           dbhi
1595 dbns           dbne
1596 ============== ========
1597
1598 `Optimizations and Translations`_
1599 '''''''''''''''''''''''''''''''''
1600 The assembler provides "creature comforts" when it processes 68000 mnemonics:
1601
1602  * **CLR.x An** will really generate **SUB.x An,An**.
1603
1604  * **ADD**, **SUB** and **CMP** with an address register will really generate **ADDA**,
1605    **SUBA** and **CMPA**.
1606
1607  * The **ADD**, **AND**, **CMP**, **EOR**, **OR** and **SUB** mnemonics with immediate
1608    first operands will generate the "I" forms of their instructions (**ADDI**, etc.) if
1609    the second operand is not register direct.
1610
1611  * All shift instructions with no count value assume a count of one.
1612
1613  * **MOVE.L** is optimized to **MOVEQ** if the immediate operand is defined and
1614    in the range -128...127. However, **ADD** and **SUB** are never translated to
1615    their quick forms; **ADDQ** and **SUBQ** must be explicit.
1616
1617  * All optimisations are controllable using the **.opt** directive. Refer to its
1618    description in section `Directives`_.
1619
1620  * All optimisations are turned off for any source line that has an exclamation mark
1621    (*!*) on their first column.
1622
1623  * Optimisation switch 11 is turned on by default for compatibility with the
1624    Motorola reference 56001 DSP assembler.
1625    All other levels are off by default. (refer to section `The Command Line`_
1626    for a description of all the switches).
1627
1628  * Optimisation warnings are off by default. Invoke RMAC with the *-s* switch to
1629    turn on warnings in console and listing output.
1630
1631  * In GPU/DSP code sections, you can use JUMP (Rx) in place of JUMP T, (Rx) and JR
1632    (Rx) in place of JR T,(Rx).
1633
1634  * RMAC tests all GPU/DSP restrictions and corrects them wherever possible (such as
1635    inserting a NOP instruction when needed).
1636
1637  * The *(Rx+N)* addressing mode for GPU/DSP instructions is optimized to *(Rx)*
1638    when *N* is zero.
1639
1640 `Macros`_
1641 =========
1642 `Macro declaration`_
1643 ''''''''''''''''''''
1644 A macro definition is a series of statements of the form:
1645                               ::
1646
1647                                  .macro name [ formal-arg, ...]
1648                                     .
1649                                     .
1650                                     .
1651                                  statements making up the macro body
1652                                     .
1653                                     .
1654                                     .
1655                                  .endm
1656
1657 The name of the macro may be any valid symbol that is not also a 68000 instruction
1658 or an assembler directive. (The name may begin with a period - macros cannot
1659 be made confined the way labels or equated symbols can be). The formal argument
1660 list is optional; it is specified with a comma-seperated list of valid symbol names.
1661 Note that there is no comma between the name of the macro and the name of the
1662 first formal argument. It is not advised to begin an argument name with a numeric
1663 value.
1664
1665 A macro body begins on the line after the **.macro** directive. All instructions
1666 and directives, except other macro definitions, are legal inside the body.
1667
1668 The macro ends with the **.endm** statement. If a label appears on the line with
1669 this directive, the label is ignored and a warning is generated.
1670
1671 `Parameter Substitution`_
1672 '''''''''''''''''''''''''
1673 Within the body, formal parameters may be expanded with the special forms:
1674               ::
1675
1676                 \name
1677                 \{name}
1678
1679 The second form (enclosed in braces) can be used in situations where the characters
1680 following the formal parameter name are valid symbol continuation characters. This
1681 is usually used to force concatentation, as in:
1682
1683                ::
1684
1685                 \{frog}star
1686                 \(godzilla}vs\{reagan}
1687
1688 The formal parameter name is terminated with a character that is not valid in
1689 a symbol (e.g. whitespace or puncuation); optionally, the name may be enclosed in
1690 curly-braces. The names must be symbols appearing on the formal argument list,
1691 or a single decimal digit (``\1`` corresponds to the first argument, ``\2`` to the second,
1692 ``\9`` to the ninth, and ``\0`` to the tenth). It is possible for a macro to have more than
1693 ten formal arguments, but arguments 11 and on must be referenced by name, not
1694 by number.
1695
1696         Other special forms are:
1697
1698 ============ ================================================
1699 Special Form Description
1700 ============ ================================================
1701 ``\\``       a single "\",
1702 ``\~``       a unique label of the form "Mn"
1703 ``\#``       the number of arguments actually specified
1704 ``\!``       the "dot-size" specified on the macro invocation
1705 ``\?name``   conditional expansion
1706 ``\?{name}`` conditional expansion
1707 ============ ================================================
1708
1709 The last two forms are identical: if the argument is specified and is non-empty, the
1710 form expands to a "1", otherwise (if the argument is missing or empty) the form
1711 expands to a "0".
1712
1713 The form "``\!``" expands to the "dot-size" that was specified when the macro
1714 was invoked. This can be used to write macros that behave differently depending
1715 on the size suffix they are given, as in this macro which provides a synonym for the
1716 "``dc``" directive:
1717
1718               ::
1719
1720                .macro deposit value
1721                dc\!   \value
1722                .endm
1723                deposit.b 1          ; byte of 1
1724                deposit.w 2          ; word of 2
1725                deposit.l 3          ; longvord of 3
1726                deposit   4          ; word of 4 (no explicit size)
1727
1728 `Macro Invocation`_
1729 '''''''''''''''''''
1730 A previously-defined macro is called when its name appears in the operation field of
1731 a statement. Arguments may be specified following the macro name; each argument
1732 is seperated by a comma. Arguments may be empty. Arguments are stored for
1733 substitution in the macro body in the following manner:
1734
1735   * Numbers are converted to hexadecimal.
1736
1737   * All spaces outside strings are removed.
1738
1739   * Keywords (such as register names, dot sizes and "^^" operators) are converted
1740     to lowercase.
1741
1742   * Strings are enclosed in double-quote marks (").
1743
1744 For example, a hypothetical call to the macro "``mymacro``", of the form:
1745        ``mymacro A0, , 'Zorch' / 32, "^^DEFINED foo, , , tick tock``
1746
1747 will result in the translations:
1748
1749 ========      ================= =================================================
1750 Argument      Expansion         Comment
1751 ========      ================= =================================================
1752 ``\1``        ``a0``            "``A0``" converted to lower-case
1753 ``\2``                          empty
1754 ``\3``        ``"Zorch"/$20``   "``Zorch``" in double-quotes, 32 in hexadecimal
1755 ``\4``        ``^^defined foo`` "``^^DEFINED``" converted to lower-case
1756 ``\5``                          empty
1757 ``\6``                          empty
1758 ``\7``        ``ticktock``      spaces removed (note concatenation)
1759 ========      ================= =================================================
1760
1761 The **.exitm** directive will cause an immediate exit from a macro body. Thus
1762 the macro definition:
1763
1764          ::
1765
1766           .macro foo source
1767               .iif !\?source, .exitm ; exit if source is empty
1768               move \source,d0        ; otherwise, deposit source
1769           .endm
1770
1771 will not generate the move instruction if the argument **"source"** is missing from
1772 the macro invocation.
1773
1774 The **.end**, **.endif** and **.exitm** directives all pop-out of their include levels
1775 appropriately. That is, if a macro performs a **.include** to include a source file, an
1776 executed **.exitm** directive within the include-file will pop out of both the include-file
1777 and the macro.
1778
1779 Macros may be recursive or mutually recursive to any level, subject only to
1780 the availability of memory. When writing recursive macros, take care in the coding
1781 of the termination condition(s). A macro that repeatedly calls itself will cause the
1782 assembler to exhaust its memory and abort the assembly.
1783
1784
1785 `Example Macros`_
1786 '''''''''''''''''
1787 The Gemdos macro is used to make file system calls. It has two parameters, a
1788 function number and the number of bytes to clean off the stack after the call. The
1789 macro pushes the function number onto the stack and does the trap to the file
1790 system. After the trap returns, conditional assembly is used to choose an addq or
1791 an **add.w** to remove the arguments that were pushed.
1792
1793      ::
1794
1795        .macro Gemdos trpno, clean
1796           move.w  #\trpno,-(sp)  ; push trap number
1797           trap    #1             ; do GEMDOS trap
1798           .if \clean <= 8        ;
1799           addq    #\clean,sp     ; clean-up up to 8 bytes
1800           .else                  ;
1801           add.w   #\clean,sp     ; clean-up more than 8 bytes
1802           .endif                 ;
1803        .endm
1804
1805 The Fopen macro is supplied two arguments; the address of a filename, and
1806 the open mode. Note that plain move instructions are used, and that the caller of
1807 the macro must supply an appropriate addressing mode (e.g. immediate) for each
1808 argument.
1809
1810      ::
1811
1812        .macro Fopen file, mode
1813           movs.w   \mode,-(sp)  ;push open mode
1814           move.1   \file,-(sp)  ;push address of tile name
1815           Gemdos   $3d,8        ;do the GEMDOS call
1816        .endm
1817
1818 The **String** macro is used to allocate storage for a string, and to place the
1819 string's address somewhere. The first argument should be a string or other expres-
1820 sion acceptable in a dc.b directive. The second argument is optional; it specifies
1821 where the address of the string should be placed. If the second argument is omitted,
1822 the string's address is pushed onto the stack. The string data itself is kept in the
1823 data segment.
1824
1825                   ::
1826
1827                    .macro String str,loc
1828                        .if \?loc                                        ; if loc is defined
1829                          move.l #.\~,\loc                               ; put the string's address there
1830                        .else                                            ; otherwise
1831                          pea .\~                                        ; push the string's address
1832                        .endif                                           ;
1833                        .data                                            ; put the string data
1834                    .\~: dc.b \str,0                                     ;  in the data segment
1835                        .text                                            ; and switch back to the text segment
1836                    .endm
1837
1838 The construction "``.\~``" will expand to a label of the form "``.M``\ *n*" (where *n* is
1839 a unique number for every macro invocation), which is used to tag the location of
1840 the string. The label should be confined because the macro may be used along with
1841 other confined symbols.
1842
1843 Unique symbol generation plays an important part in the art of writing fine
1844 macros. For instance, if we needed three unique symbols, we might write "``.a\~``",
1845 "``.b\~``" and "``.c\~``".
1846
1847 `Repeat Blocks`_
1848 ''''''''''''''''
1849 Repeat-blocks provide a simple iteration capability. A repeat block allows a range
1850 of statements to be repeated a specified number of times. For instance, to generate
1851 a table consisting of the numbers 255 through 0 (counting backwards) you could
1852 write:
1853
1854                   ::
1855
1856                    .count  set     255             ; initialize counter
1857                            .rept 256               ; repeat 256 times:
1858                            dc.b    .count          ;   deposit counter
1859                    .count  set     .count - 1      ;   and decrement it
1860                            .endr                   ; (end of repeat block)
1861
1862 Repeat blocks can also be used to duplicate identical pieces of code (which are
1863 common in bitmap-graphics routines). For example:
1864
1865                   ::
1866
1867                    .rept 16                        ; clear 16 words
1868                    clr.w (a0)+                     ;   starting at AO
1869                    .endr                           ;
1870
1871 `Jaguar GPU/DSP Mode`_
1872 ======================
1873
1874 RMAC will generate code for the Atari Jaguar GPU and DSP custom RISC (Reduced
1875 Instruction Set Computer) processors. See the Atari Jaguar Software reference Manual - Tom
1876 & Jerry for a complete listing of Jaguar GPU and DSP assembler mnemonics and addressing
1877 modes.
1878
1879 `Condition Codes`_
1880 ''''''''''''''''''
1881 The following condition codes for the GPU/DSP JUMP and JR instructions are built-in:
1882
1883   ::
1884
1885    CC (Carry Clear) = %00100
1886    CS (Carry Set)   = %01000
1887    EQ (Equal)       = %00010
1888    MI (Minus)       = %11000
1889    NE (Not Equal)   = %00001
1890    PL (Plus)        = %10100
1891    HI (Higher)      = %00101
1892    T (True)         = %00000
1893
1894 `Jaguar Object Processor Mode`_
1895 ===============================
1896
1897 `What is it?`_
1898 ''''''''''''''
1899
1900 An assembler to generate object lists for the Atari Jaguar's Object processor.
1901
1902
1903 `Why is it here?`_
1904 ''''''''''''''''''
1905
1906 To really utilize the OP properly, it needs an assembler. Otherwise, what
1907 happens is you end up writing an assembler in your code to assemble the OP
1908 list, and that's a real drag--something that *should* be handled by a proper
1909 assembler.
1910
1911
1912 `How do I use it?`_
1913 ''''''''''''''''''''
1914
1915 The OP assembler works similarly to the RISC assembler; to enter the OP
1916 assembler, you put the .objproc directive in your code (N.B.: like the RISC
1917 assembler, it only works in a TEXT or DATA section). From there, you build
1918 the OP list how you want it and go from there. A few caveats: you will want
1919 to put a .org directive at the top of your list, and labels that you want to
1920 be able to address in 68xxx code (for moving from a data section to an
1921 address where it will be executed by the OP, for example) should be created
1922 in .68xxx mode.
1923
1924
1925 `What are the opcodes?`_
1926 ''''''''''''''''''''''''
1927
1928 They are **bitmap**, **scbitmap**, **gpuobj**, **branch**, **stop**, **nop**, and **jump**. **nop** and **jump**
1929 are psuedo-ops, they are there as a convenience to the coder.
1930
1931
1932 `What are the proper forms for these opcodes?`_
1933 '''''''''''''''''''''''''''''''''''''''''''''''
1934
1935 They are as follows:
1936
1937 **bitmap** *data addr*, *xloc*, *yloc*, *dwidth*, *iwidth*, *iheight*, *bpp*,
1938 *pallete idx*, *flags*, *firstpix*, *pitch*
1939
1940 **scbitmap** *data addr*, *xloc*, *yloc*, *dwidth*, *iwidth*, *iheight*,
1941 *xscale*, *yscale*, *remainder*, *bpp*, *pallete idx*,
1942 *flags*, *firstpix*, *pitch*
1943
1944 **gpuobj** *line #*, *userdata* (bits 14-63 of this object)
1945
1946 **branch** VC *condition (<, =, >)* *line #*, *link addr*
1947
1948 **branch** OPFLAG, *link addr*
1949
1950 **branch** SECHALF, *link addr*
1951
1952 **stop**
1953
1954 **nop**
1955
1956 **jump** *link addr*
1957
1958 Note that the *flags* field in bitmap and scbitmap objects consist of the
1959 following: **REFLECT**, **RMW**, **TRANS**, **RELEASE**. They can be in any order (and
1960 should be separated by whitespace **only**), and you can only put a maximum of
1961 four of them in. Further note that with bitmap and scbitmap objects, all the
1962 parameters after *data addr* are optional--if they are omitted, they will
1963 use defaults (mostly 0, but 1 is the default for pitch). Also, in the
1964 scbitmap object, the *xscale*, *yscale*, and *remainder* fields can be
1965 floating point constants/expressions. *data addr* can refer to any address
1966 defined (even external!) and the linker (rln v1.6.0 or greater) will
1967 properly fix up the address.
1968
1969
1970 `What do they do?`_
1971 '''''''''''''''''''
1972
1973 Pretty much what you expect. It's beyond the scope of this little note to
1974 explain the Jaguar's Object Processor and how it operates, so you'll have to
1975 seek explanations for how they work elsewhere.
1976
1977
1978 `Why do I want to put a *.org* directive at the top of my list?`_
1979 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
1980
1981 You want to put a *.org* directive at the top of your list because otherwise
1982 the assembler will not know where in memory the object list is supposed
1983 go--then when you move it to its destination, the object link addresses will
1984 all be wrong and it won't work.
1985
1986
1987 `Why would I copy my object list to another memory location?`_
1988 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
1989
1990 Simple: because the OP destroys the list as it uses it to render the screen.
1991 If you don't keep a fresh copy stashed away somewhere to refresh it before
1992 the next frame is rendered, what you see on the screen will not be what you
1993 expect, as the OP has scribbled all over it!
1994
1995
1996 `Does the assembler do anything behind my back?`_
1997 '''''''''''''''''''''''''''''''''''''''''''''''''
1998
1999 Yes, it will emit **NOP** s to ensure that bitmaps and scbitmaps are on proper
2000 memory boundaries, and fixup link addresses as necessary. This is needed
2001 because of a quirk in how the OP works (it ORs constants on the address
2002 lines to get the phrases it needs and if they are not zeroes, it will fail
2003 in bizarre ways). It will also set all *ypos* constants on the correct
2004 half-line (as that's how the OP views them).
2005
2006
2007 `Why can't I define the link addresses for all the objects?`_
2008 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
2009
2010 You really, *really* don't want to do this. Trust me on this one.
2011
2012 `How about an example of an object list?`_
2013 ''''''''''''''''''''''''''''''''''''''''''
2014
2015     ::
2016
2017                 objList = $10000
2018                 bRam = $20000
2019         ;
2020                 .68000
2021         objects:            ; This is the label you will use to address this in 68K code
2022                 .objproc    ; Engage the OP assembler
2023                 .org    objList ; Tell the OP assembler where the list will execute
2024         ;
2025                 branch      VC < 69, .stahp     ; Branch to the STOP object if VC < 69
2026                 branch      VC > 241, .stahp    ; Branch to the STOP object if VC > 241
2027                 bitmap      bRAM, 22, 70, 24, 24, 22, 4
2028                 bitmap      bRAM, 20+96+96, 70, 24, 24, 22, 4, 0, REFLECT
2029                 scbitmap    tms, 20, 70, 1, 1, 8, 3.0, 3.0, 2.9999, 0, 0, TRANS
2030                 scbitmap    tmsShadow, 23, 73, 1, 1, 8, 3.0, 3.0, 2.9999, 0, 3, TRANS
2031                 bitmap      sbRelBM, 30, 108, 3, 3, 8, 0, 1, TRANS
2032                 bitmap      txt1BM, 46, 132, 3, 3, 8, 0, 2, TRANS
2033                 bitmap      txt2BM, 46, 148, 3, 3, 8, 0, 2, TRANS
2034                 bitmap      txt3BM, 22, 164, 3, 3, 8, 0, 2, TRANS
2035                 jump        .haha
2036         .stahp:
2037                 stop
2038         .haha:
2039                 jump        .stahp
2040
2041
2042 `DSP 56001 Mode`_
2043 =================
2044
2045 RMAC fully supports Motorola's DSP56001 as used on the Atari Falcon and can output
2046 binary code in the two most popular formats: *.lod* (ASCII dump, supported by the
2047 Atari Falcon XBIOS) and *.p56* (binary equivalent of *.lod*)
2048
2049 `Differences from Motorola's assembler`_
2050 ''''''''''''''''''''''''''''''''''''''''
2051
2052 - Motorola's assembler aliases **and #xxx,reg** with **andi #xxx,reg** and can
2053   distinguish between the two. rmac needs the user to be explicit and will
2054   generate an error if the programmer tries to use syntax from one instruction
2055   to the other.
2056 - Similarly Motorola's assembler can alias **move** with **movec**, **movep**
2057   and **movem**. rmac also not accept such aliasing and generate an error.
2058 - Motorola's assembler uses the underscore character (*_*) to define local
2059   labels. In order for rmac to maintain a uniform syntax across all platforms,
2060   such labels will not be treated as local.
2061 - Macros syntax is different from Motorola's assembler. This includes local
2062   labels inside macros. The user is encouraged to study the `Macros`_ section
2063   and compare syntactical differences.
2064 - Motorola's assembler allows reordering of addressing modes **x:**, **x:r**,
2065   **r:y**, **x:y**. rmac will only accept syntax as is defined on the reference
2066   manual.
2067 - In **L:** section a dc value cannot be 12 hex digits like Motorola's assmebler.
2068   Instead, the value needs to be split into two parts separated by **:**.
2069
2070 `6502 Support`_
2071 ===============
2072 RMAC will generate code for the MOS 6502 microprocessor. This chapter
2073 describes extra addressing modes and directives used to support the 6502.
2074
2075 As the 6502 object code is not linkable (currently there is no linker) external
2076 references may not be made. (Nevertheless, RMAC may reasonably be used for
2077 large assemblies because of its blinding speed.)
2078
2079 `6502 Addressing Modes`_
2080 ''''''''''''''''''''''''
2081 All standard 6502 addressing modes are supported, with the exception of the
2082 accumulator addressing form, which must be omitted (e.g. "ror a" becomes "ror").
2083 Five extra modes, synonyms for existing ones, are included for compatibility with
2084 the Atari Coinop assembler.
2085
2086 ============== ========================================
2087 *empty*        implied or accumulator (e.g. tsx or ror)
2088 *expr*         absolute or zeropage
2089 #\ *expr*      immediate
2090 #<\ *expr*     immediate low byte of a word
2091 #>\ *expr*     immediate high byte of a word
2092 (*expr*,x)     indirect X
2093 (*expr*),y     indirect Y
2094 (*expr*)       indirect
2095 *expr*,x       indexed X
2096 *expr*,y       indexed Y
2097 @\ *expr*\ (x) indirect X
2098 @\ *expr*\ (y) indirect Y
2099 @expr          indirect
2100 x,\ *expr*     indexed X
2101 y,\ *expr*     indexed Y
2102 ============== ========================================
2103
2104 `6502 Directives`_
2105 ''''''''''''''''''
2106 **.6502**
2107    This directive enters the 6502 section. The location counter is undefined, and
2108    must be set with ".org" before any code can be generated.
2109
2110    The "``dc.w``" directive will produce 6502-format words (low byte first). The
2111    68000's reserved keywords (``d0-d7/a0-a7/ssp/usp`` and so on) remain reserved
2112    (and thus unusable) while in the 6502 section. The directives **globl**, **dc.l**,
2113    **dcb.l**, **text**, **data**, **bss**, **abs**, **even** and **comm** are illegal in the 6502 section.
2114    It is permitted, though probably not useful, to generate both 6502 and 68000
2115    code in the same object file.
2116 **.68000**
2117    This directive leaves the 6502 segment and returns to the 68000's text segment.
2118    68000 instructions may be assembled as normal.
2119 **.org** *location*
2120    This directive sets the value of the location
2121    counter (or **pc**) to location, an expression that must be defined, absolute, and
2122    less than $10000.
2123
2124    WARNING
2125
2126    It is possible to assemble "beyond" the microprocessor's 64K address space, but
2127    attempting to do so will probably screw up the assembler. DO NOT attempt
2128    to generate code like this:
2129
2130      ::
2131
2132       .org $fffe
2133       nop
2134       nop
2135       nop
2136
2137    the third NOP in this example, at location $10000, may cause the assembler
2138    to crash or exhibit spectacular schizophrenia. In any case, RMAC will give
2139    no warning before flaking out.
2140
2141 `6502 Object Code Format`_
2142 ''''''''''''''''''''''''''
2143 Traditionally Madmac had a very kludgy way of storing object files. This has been
2144 replaced with a more standard *.exe* (or *.com* or *.xex* if you prefer). Briefly,
2145 the *.exe* format consists of chunks of this format (one after the other):
2146
2147     ::
2148
2149      Offset     Description
2150      00-01      $FFFF - Indicates a binary load file. Mandatory for first segment, optional for any other segment
2151      02-03      Start Address. The segment will load at this address
2152      04-05      End Address. The last byte to load for this segment
2153      06-..      The actual segment data to load (End Address-Start Address + 1 bytes)
2154
2155 `Error Messages`_
2156 =================
2157
2158 `When Things Go Wrong`_
2159 '''''''''''''''''''''''
2160 Most of RMAC's error messages are self-explanatory. They fall into four classes:
2161 warnings about situations that you (or the assembler) may not be happy about,
2162 errors that cause the assembler to not generate object files, fatal errors that cause
2163 the assembler to abort immediately, and internal errors that should never happen.\ [3]_
2164
2165 You can write editor macros (or sed or awk scripts) to parse the error messages
2166 RMAC generates. When a message is printed, it is of the form:
2167
2168          "*filename*" , ``line`` *line-number*: *message*
2169
2170 The first element, a filename enclosed in double quotes, indicates the file that generated
2171 the error. The filename is followed by a comma, the word "``line``", and a line
2172 number, and finally a colon and the text of the message. The filename "**(\*top\*)**"
2173 indicates that the assembler could not determine which file had the problem.
2174
2175 The following sections list warnings, errors and fatal errors in alphabetical
2176 order, along with a short description of what may have caused the problem.
2177
2178 .. [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.
2179
2180 `Warnings`_
2181 '''''''''''
2182 **bad backslash code in string**
2183   You tried to follow a backslash in a string with a character that the assembler
2184   didn't recognize. Remember that RMAC uses a C-style escape system in
2185   strings.
2186 **label ignored**
2187   You specified a label before a macro, **rept** or **endm** directive. The assembler
2188   is warning you that the label will not be defined in the assembly.
2189 **unoptimized short branch**
2190   This warning is only generated if the -s switch is specified on the command
2191   line. The message refers to a forward, unsized long branch that you could have
2192   made short (.s).
2193
2194 `Fatal Errors`_
2195 '''''''''''''''
2196
2197 **cannot continue**
2198   As a result of previous errors, the assembler cannot continue processing. The
2199   assembly is aborted.
2200 **line too long as a result of macro expansion**
2201   When a source line within a macro was expanded, the resultant line was too
2202   long for RMAC (longer than 200 characters or so).
2203
2204
2205 **memory exhausted**
2206     The assembler ran out of memory. You should (1) split up your source files
2207     and assemble them seperately, or (2) if you have any ramdisks or RAM-resident
2208     programs (like desk accessories) decrease their size so that the assembler has
2209     more RAM to work with. As a rule of thumb, pure 68000 code will use up to
2210     twice the number of bytes contained in the source files, whereas 6502 code will
2211     use 64K of ram right away, plus the size of the source files. The assembler itself
2212     uses about 80K bytes. Get out your calculator...
2213 **too many ENDMs**
2214     The assembler ran across an **endm** directive when it wasn't expecting to see
2215     one. The assembly is aborted. Check the nesting of your macro definitions -
2216     you probably have an extra **endm**.
2217
2218
2219 `Errors`_
2220 '''''''''
2221
2222 **.cargs syntax**
2223
2224     Syntax error in **.cargs** directive.
2225
2226 **.comm symbol already defined**
2227
2228     You tried to ``.comm`` a symbol that was already defined.
2229
2230 **.init not permitted in BSS or ABS**
2231
2232     You tried to use ``.init`` in the BSS or ABS section.
2233
2234 **Cannot create:** *filename*
2235
2236     The assembler could not create the indicated filename.
2237
2238 **External quick reference**
2239
2240     You tried to make the immediate operand of a **moveq**, **subq** or **addq** instruction external.
2241
2242 **PC-relative expr across sections**
2243
2244     You tried to make a PC-relative reference to a location contained in another
2245     section.
2246
2247 **[bwsl] must follow '.' in symbol**
2248
2249     You tried to follow a dot in a symbol name with something other than one of
2250     the four characters 'B', 'W', 'S' or 'L'.
2251
2252 **addressing mode syntax**
2253
2254     You made a syntax error in an addressing mode.
2255
2256 **assert failure**
2257
2258     One of your **.assert** directives failed!
2259
2260 **bad (section) expression**
2261
2262     You tried to mix and match sections in an expression.
2263
2264 **bad 6502 addressing mode**
2265
2266     The 6502 mnemonic will not work with the addressing mode you specified.
2267
2268 **bad expression**
2269
2270     There's a syntax error in the expression you typed.
2271
2272 **bad size specified**
2273
2274   You tried to use an inappropriate size suffix for the instruction. Check your
2275   68000 manual for allowable sizes.
2276
2277 **bad size suffix**
2278
2279   You can't use .b (byte) mode with the **movem** instruction.
2280
2281 **cannot .globl local symbol**
2282
2283   You tried to make a confined symbol global or common.
2284
2285 **cannot initialize non-storage (BSS) section**
2286
2287   You tried to generate instructions (or data, with dc) in the BSS or ABS section.
2288
2289 **cannot use '.b' with an address register**
2290
2291   You tried to use a byte-size suffix with an address register. The 68000 does not
2292   perform byte-sized address register operations.
2293
2294 **directive illegal in .6502 section**
2295
2296   You tried to use a 68000-oriented directive in the 6502 section.
2297
2298 **divide by zero**
2299
2300   The expression you typed involves a division by zero.
2301
2302 **expression out of range**
2303
2304   The expression you typed is out of range for its application.
2305
2306 **external byte reference**
2307
2308   You tried to make a byte-sized reference to an external symbol, which the
2309   object file format will not allow.
2310
2311 **external short branch**
2312
2313   You tried to make a short branch to an external symbol, which the linker cannot
2314   handle.
2315
2316 **extra (unexpected) text found after addressing mode**
2317
2318   RMAC thought it was done processing a line, but it ran up against "extra"
2319   stuff. Be sure that any comment on the line begins with a semicolon, and check
2320   for dangling commas, etc.
2321
2322 **forward or undefined .assert**
2323
2324   The expression you typed after a **.assert** directive had an undefined value.
2325   Remember that RMAC is one-pass.
2326
2327 **hit EOF without finding matching .endif**
2328
2329   The assembler fell off the end of last input file without finding a **.endif** to
2330   match an . it. You probably forgot a **.endif** somewhere.
2331
2332 **illegal 6502 addressing mode**
2333
2334   The 6502 instruction you typed doesn't work with the addressing mode you
2335   specified.
2336
2337 **illegal absolute expression**
2338
2339   You can't use an absolute-valued expression here.
2340
2341 **illegal bra.s with zero offset**
2342
2343   You can't do a short branch to the very next instruction (read your 68000
2344   manual).
2345
2346 **illegal byte-sized relative reference**
2347
2348   The object file format does not permit bytes contain relocatable values; you
2349   tried to use a byte-sized relocatable expression in an immediate addressing
2350   mode.
2351
2352 **illegal character**
2353
2354  Your source file contains a character that RMAC doesn't allow. (most
2355  control characters fall into this category).
2356
2357 **illegal initialization of section**
2358
2359  You tried to use .dc or .dcb in the BSS or ABS sections.
2360
2361 **illegal relative address**
2362
2363  The relative address you specified is illegal because it belongs to a different
2364  section.
2365
2366 **illegal word relocatable (in .PRG mode)**
2367
2368  You can't have anything other than long relocatable values when you're gener-
2369  ating a **.PRG** file.
2370
2371 **inappropriate addressing mode**
2372
2373  The mnemonic you typed doesn't work with the addressing modes you specified.
2374  Check your 68000 manual for allowable combinations.
2375
2376 **invalid addressing mode**
2377
2378  The combination of addressing modes you picked for the **movem** instruction
2379  are not implemented by the 68000. Check your 68000 reference manual for
2380  details.
2381
2382 **invalid symbol following ^^**
2383
2384  What followed the ^^ wasn't a valid symbol at all.
2385
2386 **mis-nested .endr**
2387
2388  The assembler found a **.endr** directive when it wasn't prepared to find one.
2389  Check your repeat-block nesting.
2390
2391 **mismatched .else**
2392
2393  The assembler found a **.else** directive when it wasn't prepared to find one.
2394  Check your conditional assembly nesting.
2395
2396 **mismatched .endif**
2397
2398  The assembler found a **.endif** directive when it wasn't prepared to find one.
2399  Check your conditional assembly nesting.
2400
2401 **missing '='**
2402
2403 **missing '}'**
2404
2405 **missing argument name**
2406
2407 **missing close parenthesis ')'**
2408
2409 **missing close parenthesis ']'**
2410
2411 **missing comma**
2412
2413 **missing filename**
2414
2415 **missing string**
2416
2417 **missing symbol**
2418
2419 **missing symbol or string**
2420
2421  The assembler expected to see a symbol/filename/string (etc...), but found
2422  something else instead. In most cases the problem should be obvious.
2423
2424 **misuse of '.', not allowed in symbols**
2425
2426  You tried to use a dot (.) in the middle of a symbol name.
2427
2428 **mod (%) by zero**
2429
2430  The expression you typed involves a modulo by zero.
2431
2432 **multiple formal argument definition**
2433
2434   The list of formal parameter names you supplied for a macro definition includes
2435   two identical names.
2436
2437 **multiple macro definition**
2438
2439   You tried to define a macro which already had a definition.
2440
2441 **non-absolute byte reference**
2442
2443   You tried to make a byte reference to a relocatable value, which the object file
2444   format does not allow.
2445
2446 **non-absolute byte value**
2447
2448   You tried to dc.b or dcb.b a relocatable value. Byte relocatable values are
2449   not permitted by the object file format.
2450
2451 **register list order**
2452
2453   You tried to specify a register list like **D7-D0**, which is illegal. Remember
2454   that the first register number must be less than or equal to the second register
2455   number.
2456
2457 **register list syntax**
2458
2459   You made an error in specifying a register list for a **.reg** directive or a **.movem**
2460   instruction.
2461
2462 **symbol list syntax**
2463
2464   You probably forgot a comma between the names of two symbols in a symbol
2465   list, or you left a comma dangling on the end of the line.
2466
2467 **syntax error**
2468
2469   This is a "catch-all" error.
2470
2471 **undefined expression**
2472
2473   The expression has an undefined value because of a forward reference, or an
2474   undefined or external symbol.
2475
2476 **unimplemented directive**
2477
2478   You have found a directive that didn't appear in the documentation. It doesn't
2479   work.
2480
2481 **unimplemented mnemonic**
2482
2483   You've found a bug.
2484
2485 **unknown symbol following ^^**
2486
2487   You followed a ^^ with something other than one of the names defined, referenced
2488   or streq.
2489
2490 **unterminated string**
2491
2492   You specified a string starting with a single or double quote, but forgot to type
2493   the closing quote.
2494
2495 **write error**
2496
2497   The assembler had a problem writing an object file. This is usually caused by
2498   a full disk, or a bad sector on the media.