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