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