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