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