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