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