Amiga DOS Developer Manual
Amiga DOS Developer Manual
Developerfe Manual
AmigaDOS Developer's Manual
Acknowledgements
This manual was originally written by Tim King and then completely revised by Jessica King.
A special thanks to Patria Brown whose editorial suggestions substantially contributed to the quality
of the manual.
Also thanks to Bruce Barrett, Keith Stobie, Robert Peck and all the others at Commodore-Amiga who
carefully checked the contents; to Tim King, Paul Floyd, and Alan Cosslett who did the same at
Metacomco; and to Pamela Clare and Liz Laban who spent many hours carefully proof-reading each
version.
COPYRIGHT
This manual Copyright (c) 1985, Commodore-Amiga Inc. All Rights Reserved. This document may not,
in whole or in part, be copied, photocopied, reproduced, translated, or reduced to any electronic
medium or machine readable form without prior consent, in writing, from Commodore-Amiga Inc.
AmigaDOS software Copyright (c) 1985, Commodore-Amiga Inc. All Rights Reserved The
distribution and sale of this product are intended for the use of the original purchaser only. Lawful
users of this program are hereby licensed only to read the program, from its medium into memory of a
computer, solely for the purpose of executing the program. Duplicating, copying, selling, or otherwise
distributing this product is a violation of the law.
DISCLAIMER
THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE RESULTS AND PERFORMANCE OF THE PROGRAM IS ASSUMED BY YOU. SHOULD
THE PROGRAM PROVE DEFECTIVE, YOU (AND NOT THE DEVELOPER OR
COMMODORE-AMIGA, INC. OR ITS PARENT AND AFFILIATED DEALERS) ASSUME THE
ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. FURTHER,
COMMODORE-AMIGA, INC. OR ITS PARENT AND AFFILIATED COMPANIES DO NOT
WARRANT, GUARANTEE OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF
THE PROGRAM IN TERMS OF CORRECTNESS, ACCURACY, RELIABILITY, CURRENTNESS,
OR OTHERWISE; AND YOU RELY ON THE PROGRAM AND RESULTS SOLELY AT YOUR OWN
RISK. IN NO EVENT WILL COMMODORE-AMIGA, INC. OR ITS PARENT COMPANY AND
AFFILIATED COMPANIES BE LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, OR
CONSEQUENTAL DAMAGES RESULTING FROM ANY DEFECT IN THE PROGRAM EVEN IF IT
HAS BEEN ADVISED OF THE POSSIBILITY OF IMPLIED WARRANTIES OR LIABILITIES FOR
INCIDENTAL OR CONSEQUENTAL DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION
MAY NOT APPLY.
Amiga and AmigaDOS are trademarks of Commodore-Amiga, Inc. Unix is a trademark of Bell
Laboratories. MS-DOS is a trademark of Microsoft Corporation. IBM is a registered trademark of
International Business Machines, Inc. Sun Workstation, and the combination of Sun with a numeric
suffix are trademarks of Sun Microsystems, Inc.
If you have a working version of Preferences and you change the text size, for example, from 60 to 80,
then AmigaDOS renders any new windows that you create in 80 columns. However, any old windows
in the system remain with a text size of 60. To incorporate text size into the system, you need to create
a new window, select the old window, and finally delete the old window.
Ifyou alter the CLI selection, the change may not take effect immediately. Ifyou give the new
preferences and re-boot, they take effect.
Table of Contents
2. Calling AmigaDOS
4. The Linker
Chapter 1: Programming on the Amiga
1.1. Introduction
1.1 Introduction
The AmigaDOS programming environment is available on the Amiga, Sun, and IBM PC.
This manual assumes that you have some familiarity with either C or Assembler. It does not attempt
to teach either of these languages. An introduction to C can be found in the book The C Programming
Language by Brian W. Kernighan and Dennis M. Ritchie, published by Prentice Hall. There are a
number of books on writing 68000 assembler, including Programming the MC68000 by Tim King
and Brian Knight, published by Addison Wesley.
This section describes how to develop programs for the Amiga. It describes what you need before you
start, how you can call the system routines, and how to create a file that you can execute on the Amiga.
WARNING: Before you do ANYTHING, you should make a backup copy of your system disk. For
instructions, see the section, "Backing Up," at the beginning of the AmigaDOS User's Manual.
Before you start writing programs for the Amiga, you need the following items:
1. Documentation on AmigaDOS and other system routines that you can call. For example, you
need the AmigaDOS User's Manual, ROM Kernel Manual, and possibly the AmigaDOS
Technical Reference Manual as well.
2. Documentation on the language you intend to use. If you intend to use Assembler or C, then this
manual tells you how to use these tools although it does not contain any specific information
normally found in a language reference manual.
3. Header files containing the necessary Amiga structure definitions and the values for calling the
system routines that you need. Commodore-Amiga provides these header files as include files
for either C (usually ending in .h) or assembler (ending in .i). To use a particular resident
library, you must include one or more header files containing the relevant definitions. For
example, to use AmigaDOS from C, you must include the file 'dos.h.9
4. An assembler or compiler either running on the Amiga itself or on one of the cross development
environments.
5. The Amiga linker, again running on the Amiga or on another computer, as well as the standard
Amiga library containing functions, interface routines, and various absolute values.
1-1
Programming on the Amiga AmigaDOS Developers Manual
You should note that there are two ways of calling system routines from a user assembly program. C
programmers simply call the function as specified. You usually call a system routine in assembler by
placing the library base pointer for that resident library in register A6 and then jumping to a suitable
negative offset from that pointer. The offsets are available to you as absolute externals
in the Amiga library, with names of the form LVO_name. So, for instance, a call could be JSR
LV0_name(A6), where you have loaded A6 with a suitable library base pointer. These base pointers
are available to you from the OpenLibrary call to Exec; you can find the base pointer for Exec at
location 4 (the only absolute location used in the Amiga). This location is also known as AbsExecBase
which is defined in amiga.lib. (See the ROM Kernel Manual for further details on Exec.)
You can call certain RAM-based resident libraries and the AmigaDOS library in this way, if required.
Note that the AmigaDOS library is called 'dos.library1. However, you do not need to use A6 to hold a
pointer to the library base; you may use any other register if you need to. In addition, you may call
AmigaDOS using the resident library call feature of the linker. In this case, simply code a JSR to the
entry point and the linker notes the fact that you have used a reference to a resident library. When
your code is loaded into memory, the loader automatically opens the library and closes it for you when
you have unloaded. The loader automatically patches references to AmigaDOS entry points to refer to
the correct offset from the library base pointer.
To produce a file that you can execute on the Amiga, you should follow the four steps below. You can do
each step either on the Amiga itself or on a suitable cross development computer.
1. Get your program source into the Amiga. To do this, you can type it directly in using an editor,
or you can transfer it from another computer. Note that you can use the READ and
DOWNLOAD programs on the Amiga to transfer character or binary files.
3. Link your program together, including any startup code you may require at the beginning, and
scan the Amiga library and any others you may need to satisfy any external references.
1-2
AmigaDOS Developer's Manual Programming on the Amiga
There are two ways you can run a program. First, you can run your program under a CLI (Command
Line Interface). Second, you can run your program under the Workbench. This section describes the
first of the two ways.
Running a program under the CLI is a little like using an old-fashioned line-oriented TTY system
although you might find a CLI useful, for example, to port your program over to your Amiga as a first
step in development. To load and enter your program, you simply type the name of the file that
contains the binary and possibly follow this with a number of arguments.
When you load a program under a CLI, you type the name of the program and a set of arguments. You
may also specify input or output redirection by means of the •>• and f<' symbols. The CLI
automatically provides all this information for the program when it starts up.
When the CLI starts up a program, it allocates a stack for that program. This stack is initially 4000
bytes, but you may change the stack size with the STACK command. AmigaDOS obtains this stack
from the general free memory heap just before you run the program; it is not, however, the same as the
stack that the CLI uses. AmigaDOS pushes a suitable return address onto the stack that tells the CLI
to regain control and unload your program. Below this on the stack at 4(SP) is the size of the stack in
bytes, which may be useful if you wish to perform stack checking.
Your program starts with register A0 pointing to the arguments you, or anyone else running your
program typed. AmigaDOS stores the argument line in memory within the CLI stack and this pointer
remains valid throughout your program. Register DO indicates the number of characters in the
argument line. You can use these initial values to decode the argument line to find out what the user
requires. Note that all registers may be corrupted by a user program.
To make the initial input and output file handles available, you call the AmigaDOS routines InputO
and OutputO. Remember that you may have to open the AmigaDOS library before you do this. The
calls return file handles that refer to the standard input and output the user requires. This standard
input and output is usually the terminal unless you redirected the I/O by including *>' or v<9 on the
argument line. You should not close these file handles with your program; the CLI opened them for you
and it will close them, if required.
When programming in C, you should always include the startup code as the first element in the linker
input. This means that the linker enters your program at the startup code entry point. This section of
code scans the argument list and makes the arguments available in 'argv', with the number of
arguments in 'argc1 as usual. It also opens the AmigaDOS library and calls InputO and OutputO for
you, placing the resulting file handles into 'stdin' and fstdout\ It then calls the C function 'main.1
Most AmigaDOS routines return a zero if they fail; the exceptions are the Read and Write calls that
return -1 on finding an error. If you receive an error return, you can call IoErrO to obtain more
information on the failure. IoErrO returns an integer that corresponds to a full error code, and you may
wish to take different actions depending on exactly why the call failed. A complete list of error codes
and messages can be found at the end of the AmigaDOS User's Manual.
1-3
Programming on the Amiga AmigaDOS Developer's Manual
To exit from a program, it is sufficient to give a simple RTS using the initial stack pointer (SP). In this
case, you should provide a return code in register DO. This is zero if your program succeeded;
otherwise, it is a positive number. If you return a non-zero number, then the CLI notices an error.
Depending on the current fail value (set by the command FAILAT), a non-interactive CLI, such as one
running a command sequence set up by the EXECUTE command, terminates. A program written in C
can simply return from 'main' which returns to the startup code; this clears DO and performs an RTS.
Alternatively a program may call the AmigaDOS function Exit, which takes the return code as
argument. This instructs your program to exit no matter what value the stack pointer has.
It is important at this stage to stress that AmigaDOS does not control any resources; this is left
entirely up to the programmer. Any files that a user program opens must be closed before the program
terminates. Likewise, any locks it obtains must be freed, any code it loads must be unloaded, and any
memory it allocates returned. Of course, there may be cases where you do not wish to return all
resources, for example, when you have written a program that loads a code segment into memory for
later use. This is perfectly acceptable, but you must have a mechanism for eventually returning any
memory, file locks, and so on.
To run a program under the Workbench, you need to appreciate the different ways in which a program
may be run on the Amiga. Under the CLI your program is running as part of the CLI process. It can
inherit I/O streams and other information from the CLI, such as the arguments you provided.
If a program is running under the Workbench, then AmigaDOS starts it as a new process running at
the same time as Workbench. Workbench loads the program and then sends a message to get it
started. You must therefore wait for this initial message before you start to do anything. You must
retain the message and return it back to Workbench when your program has finished, so that
Workbench can unload the code of your program.
For C programmers, this is all done by simply using a different startup routine. For assembly
language programmers, this work must be done yourself.
You should also note that a program running as a new process initiated by Workbench has no default
input and output streams. You must ensure that your program opens all the I/O channels that it needs,
and that it closes them all when it has finished.
1-4
AmigaDOS Developer's Manual Programming on the Amiga
If you are using a cross-development environment, then you need to download your code onto the
Amiga. This section describes the special support Commodore-Amiga gives to Sun and MSDOS
environments. It also describes how to cross-develop in other environments without this special
support.
The tools available on the Sun for cross development include the assembler, linker, and two C
compilers. The argument formats of the assembler and linker on the Sun are identical to those on the
Amiga when running under the CLI. The Greenhills C compiler is only available on the Sun and is
described here.
The compiler is called metacc, and it accepts several types of files. It assumes that filenames ending in
.c represent C source programs. The compiler then compiles these c files and places the resulting
object program in the current directory with the same filename, but ending with .obj. The suffix .obj
denotes an object file. The compiler assumes that files ending in .asm are assembly source programs.
You can use the assembler to assemble these and produce an object file (ending with .obj) in the current
directory.
The compiler metacc takes many options with the following format:
metacc [<optl>[,<opt2>[,..<optn>]]l[<file>[,...<filen>]l
-c just compile the program, suppressing the loading phase of the compilation,
and forcing an object file to be produced even if it only compiles one program.
-g produce additional symbol table information for the debugger dbx and to pass
the-lg flag to Id.
-go produce additional symbol table information in an older format set by the adb
debugger. Also, pass the -lg flag to Id.
-p produce profiling code to count the number of times each routine is called. If
loading takes place, replace the standard startup routine by one that is
automatically called by the monitor and uses a special profiling library instead
of the standard C library.
pg produce profiling code like -p, but invokes a run-time recording mechanism
that keeps more extensive statistics and produces a gmon.out file at normal
termination.
1-5
Profframminff on the Amiga Ami&aDOS Develotrer's Manual
-O [<optflags>] use the object code optimizer to improve the generated code.
If 'optflags' appears, you include <optflags> in the command line to run the
optimizer. You can use -0 to pass option flags.
WARNING: Certain programs run much faster using the fsingle option, but beware that
you can lose significance due to lower precision intermediate values.
-E run only the C preprocessor on the named C program(s) and send the result to
the standard output.
-X70 generate code using Amiga floating point format. This code is compatible with
the floating point math ROM library provided on the Amiga.
-o <output> name the final output file 'output'. If you use this option, the file a.out is left
undisturbed.
-Kdir> always look for #include files whose names do not begin with V first in the
directory of the <file> argument, then look in the <dir> specified in the -I
option, and finally look in the /usr/include directory.
-B<string> find substitute compiler passes in the files specified by < string> with the
endings cpp, ccom, and c2. If'string' is empty, use a backup version.
-t[pO12] find only the designated compiler passes in the files whose names are
constructed by a -B option. In the absence of a -B option, assume < string > to
be /usr/new/.
1-6
AmigaDOS Developer's Manual Programming on the Amiga
The letter and number combinations that you can specify for the -t option have
the following meanings:
The compiler metacc assumes that other arguments are loaded option arguments, object programs, or
libraries of object programs. Unless you specify -c, -S, or -E, metacc loads these programs and libraries
together with the results of any compilations or assemblies specified, (in the order given) to produce an
executable program named a.out. To override the name a.out, you can use the loader's -o<name>
option.
Ifa single C program is compiled and loaded all at once, the intermediate .o file is deleted.
Figure 1-A lists the filenames of special metacc files and their descriptions.
Special Files
File Description Filename
You can download the files you produce from the linker on the Sun to your Amiga in three ways: the
first, and by far the easiest, requires a BillBoard; the second requires a parallel port; and the third
requires a serial line.
If you have the special hardware device called a BillBoard, you can download your linked load file (by
convention this should end with .Id) as follows:
1-7
Programming on the Amiga AmigaDOS Developer's Manual
binload -p &
<amiga filename>
For example:
binload -p &
or type
then type
test
Note that DOWNLOAD gains access to files on the Sun relative to the directory where binload started.
If the directory on the Sun was /usr/commodore/amiga/V24/examples/DOS as above, the filename
test.ld is all that is necessary. If you cannot remember the directory where binload started, you must
specify the full name. To stop binload, do a 'ps' and then a 'kill' on its PID. Note that the soft reset of the
computer tells binload to write a message to its standard output (the default is the window where it
started). If the transfer hangs, press CTRL-C at the Amiga to kill DOWNLOAD. (See the AmigaDOS
User's Manual for further information on the AmigaDOS control conventions CTRL-C, CTRL-D,
CTRL-E,andCTRL-F.)
If you do not have a BillBoard, you can download files through a parallel port. To do this, follow these
steps:
1. Send the download ASCII files to the Amiga via the parallel port by typing
send demo.Id
If you do not give 'send' any arguments, the standard input is used. The default output device
is /dev/lpO, which is usually correct. To change the default output, use the -o argument.
1-8
AmigaDOS Developer's Manual Programming on the Amiga
READ demo
READ then reads characters from the parallel port and places them in the file named vdemo9.
demo
You can also download files serially. To do this, follow these steps:
1 Convert the Binary Load File into an ASCII hex file ending with Q by typing
(where .dl, by convention, stands for DownLoad). The above rule exists in the included
makefile, makeamiga. (See the AmigaDOS Technical Reference Manual for further
details on the Amiga Binary Load files.)
2. Type
tip amiga
~> demo.dl
5. When the READ completes on the Amiga, type the filename fdemof to run it
WARNING: The Sun serial link often hangs for no apparent reason. Reboot the Sun if this happens.
If the Sun serial link should happen to hang, reboot the Sun, then type
tip
1-9
Programming on the Amiga AmigaDOS Developer's Manual
to get the READ on the Amiga to complete. Once this is done, start a new READ and type the following
symbols on the Sun
To cross develop on a computer running MSDOS for your Amiga, you need various tools that are
supplied in the directory \V25\bin. These include the C compiler, assembler, and linker as well as
commands to assist in downloading. You use the same syntax for the tools running under MSDOS as
under the CLI on the Amiga.
To download via an IBM PC serial port (called AUX), follow these steps:
file
You'll need to have a suitable cross compiler or assembler, and the include files defining all the entry
points. You'll also need either the Amiga linker ALINK running on your equipment or on the Amiga.
Finally you'll need a way to convert a binary file into a hexadecimal stream terminated with a Q (as
this is the way that READ accepts data), and a way of putting this data out from a serial or parallel
port.
Once you have created a suitable binary file, you must transfer this to the Amiga using the READ
command (as described in Section 1.5.2 of this manual). If you have the Amiga linker running on your
computer, then you can transfer complete binary load files; otherwise, you'll have to transfer binary
object files in the format accepted by ALINK, and then perform the link step on the Amiga.
MO
Chapter 2: Calling AmigaDOS
This chapter describes the functions provided by the AmigaDOS resident library. To help you, it
provides the following: an explanation of the syntax, a full description of each function, and a quick
reference card of the available functions.
Table of Contents
2.1 Syntax
2.1 Syntax
The syntax used in this chapter shows the C function call for each AmigaDOS function and the
corresponding register you use when you program in assembler.
1. Register values
The letter/number combinations (DCL.Dn) represent registers. The text to the left of an equals sign
represents the result of a function. A register (that is, DO) appearing under such text indicates the
register value of the result. Text to the right of an equals sign represents a function and its arguments,
where the text enclosed in parentheses is a list of the arguments. A register (for example, D2)
appearing under an argument indicates the register value of that argument.
2. Case
The letter case (that is, lower or upper case) IS significant. For example, you must enter the word
'FilelnfoBlock* with the first letter of each component word in upper case.
3. Boolean returns
4. Values
All values are longwords (that is, 4 byte values or 32 bits). Values referred to as "string" are 32 bit
pointers to NULL terminated series of characters.
Look at 'Argument:1 and •Result:1 for further details on the syntax used after 'Format:'. Result
describes what is returned by the function (that is, the left of the equal sign). Argument describes what
the function expects to work on (that is, the list in parentheses). Figure 2-A should help explain the
syntax.
2-1
Calling AmigaDOS AmigaDOS Developer's Manual
This reference section describes the functions provided by the AmigaDOS resident library. Each
function is arranged alphabetically under the following headings: File Handling, Process Handling,
and Loading Code. These headings indicate the action of the functions they cover. Under each function
name, there is a brief description of the function's purpose, a specification of the format and the
register values, a fuller description of the function, and an explanation of the svntax of the arguments
and result. To use any of these functions, you must link with amiga.lib.
File Handling
CLOSE
Description:
The file handle 'file' indicates the file that Close snould close. You obtain this file handle as a result of
a call to Open. You must remember to close explicitly all the files you open in a program. However, you
should not close inherited file handles opened elsewhere.
CREATEDIR
Description:
CreateDir creates a new directory with the name you specified, if possible. It returns an error if it fails.
Remember that AmigaDOS can only create directories on devices which support them, for example,
disks.
2-2
AmigaDOS Developer's Manual Calling AmieaDOS
A return of zero means that AmigaDOS has found an error (such as: disk write protected), you should
then call IoErrO; otherwise, CreateDir returns a shared read lock on the new directory.
CURRENTDIR
Purpose: To make a directory associated with a lock the current working directory.
Description:
CurrentDir makes current a directory associated with a lock. (See also LOCK). It returns the old
current directory lock.
A value of zero is a valid result here and indicates that the current directory is the root of the initial
start-up disk.
DELETEFILE
Result: success-boolean
Description:
DeleteFile attempts to delete the file or directory 'name1. It returns an error if the deletion fails. Note
that you must delete all the files within a directory before you can delete the directory itself.
2-3
Calling AmigaDOS AmigaDOS Developer's Manual
DUPLOCK
Description:
DupLock takes a shared filing system read lock and returns another shared read lock to the same
object. It is impossible to create a copy of a write lock. (For more information on locks, see under
LOCK.)
EXAMINE
Result: success-boolean
Description:
Examine fills in information in the FilelnfoBlock concerning the file or directory associated with the
lock. This information includes the name, size, creation date, and whether it is a file or directory.
Note: FilelnfoBlock must be longword aligned. You can ensure this in the language C if you use
Allocmem. (See the ROM Kernel Manual for further details on the exec call Allocmem.)
2-4
AmigaDOS Developer's Manual Calling AmigaDOS
EXNEXT
Description:
This routine is passed a lock, usually associated with a directory, and a FilelnfoBlock filled in by a
previous call to Examine. The FilelnfoBlock contains information concerning the first file or directory
stored in the directory associated with the lock. ExNext also modifies the FilelnfoBlock so that
subsequent calls return information about each following entry in the directory.
ExNext gives a return code of zero if it fails for some reason. One reason for failure is reaching the last
entry in the directory. However, IoErrO holds a code that may give more information on the exact
cause of a failure. When ExNext finishes after the last entry, it returns
ERROR_NO_MORE_ENTRIES
1) Use Examine to get a FilelnfoBlock about the directory you wish to examine.
2) Pass ExNext the lock related to the directory and the FilelnfoBlock filled in by the previous
call to Examine.
3) Keep calling ExNext until it fails with the error code held in IoErrO equal to
ERROR_NO_MORE_ENTRIES.
4) Note that if you don't know what you are examining, inspect the type field of the
FilelnfoBlock returned from Examine to find out whether it is a file or a directory which is
worth calling ExNext for.
The type field in the FilelnfoBlock has two values: if it is negative, then the file system object is a file;
if it is positive, then it is a directory.
2-5
Calling AmigaDOS AmigaDOS Developer's Manual
INFO
Description:
Info finds out information about any disk in use. 'lock' refers to the disk, or any file on the disk. Info
returns the Info_Data structure with information about the size of the disk, number of free blocks and
any soft errors. Note that Info_Data must be longword aligned.
INPUT
Form:
file = Input()
DO
Description:
To identify the program's initial input file handle, you use Input. (To identify the initial output, see
under OUTPUT.)
2-6
AmigaDOS Developer's Manual Calling AmigaDOS
IOERR
Description:
I/O routines return zero to indicate an error. When an error occurs, call this routine to find out more
information. Some routines use IoErrO, for example, DeviceProc, to pass back a secondary result.
^INTERACTIVE
Description:
The function Islnteractive gives a boolean return. This indicates whether or not the file associated
with the file handle 'file' is connected to a virtual terminal.
2-7
Calling AmigaDOS AmigaDOS Developer's Manual
LOCK
Description:
Lock returns, if possible, a filing system lock on the file or directory 'name'. If the accessMode is
ACCESS_READ, the lock is a shared read lock; if the accessMode is ACCESS_WRITE, then it is an
exclusive write lock. If LOCK fails (that is, if it cannot obtain a filing system lock on the file or
directory) it returns a zero.
Note that the overhead for doing a Lock is less than that for doing an Open, so that, if you want to test
to see if a file exists, you should use Lock. Of course, once you've found that it exists, you have to use
Open to open it.
OPEN
Description:
Open opens 'name' and returns a file handle. If the accessMode is MODE_OLDFILE (=1005), OPEN
opens an existing tile for reading or writing. However, Open creates a new file for writing if the value
is MODE_NEWFILE (=1006). The 'name' can be a filename (optionally prefaced by a device name), a
simple device such as NIL:, a window specification such as CON: or RAW: followed by window
parameters, or *, representing the current window.
For further details on the devices NIL:, CON:, and RAW:, see Chapter 1 of the of the AmigaDOS
User' s Manual. If Open cannot open the file 'name' for some reason, it returns the value zero (0). In
this case, a call to the routine IoErrO supplies a secondary error code.
2-8
AmigaDOS Developer's Manual Calling AmigaDOS
For testing to see if a file exists, see the entry under LOCK.
OUTPUT
Form:
file = Output()
DO
Description:
To identify the program's initial output file handle, you use Output. (To identify the initial input, see
under INPUT.)
PARENTDIR
Description:
This function returns a lock associated with the parent directory of a file or directory. That is,
ParentDir takes a lock associated with a file or directory and returns the lock of its parent directory.
Note: The result of ParentDir may be zero (0) for the root of the current filing system.
READ
2-9
Calling AmigaDOS AmigaDOS Developer's Manual
Description:
You can copy data with a combination of Read and Write. Read reads bytes of information from an
opened file (represented here by the argument 'file1) into the memory buffer indicated. Read attempts
to read as many bytes as fit into the buffer as indicated by the value of length. You should always make
sure that the value you give as the length really does represent the size of the buffer. Read may return
a result indicating that it read less bytes than you requested, for example, when reading a line of data
that you typed at the terminal.
The value returned is the length of the information actually read. That is to say, when 'actualLength'
is greater than zero, the value of'actualLength1 is the the number of characters read. A value of zero
means that end-of-file has been reached. Errors are indicated by a value of-1. Read from the console
returns a value when a return is found or the buffer is full.
A call to Read also modifies or changes the value of IoErrO. IoErrO gives more information about an
error (for example, actualLength equals -1) when it is called.
RENAME
Description:
Rename attempts to rename the file or directory specified as 'oldName' with the name 'newName'. If
the file or directory 'newName' exists, Rename fails and Rename returns an error.
Both the 'oldName' and the 'newName* can be complex filenames containing a directory specification.
In this case, the file will be moved from one directory to another. However, the destination directory
must exist before you do this.
2-10
AmiffaDOS Devekroer's Manual Calling AmigaDOS
SEEK
Description:
Seek sets the read/write cursor for the file 'file1 to the position 'position1. Both Read and Write use this
position as a place to start reading or writing. If all goes well, the result is the previous position in the
file. If an error occurs, the result is -1. You can then use IoErrO to find out more information about the
error.
To find out the current file position without altering it, you call to Seek specifying an offset of zero from
the current position.
To move to the end of a file, Seek to end-of-file offset with zero position. Note that you can append
information to a file by moving to the end of a file with Seek and then writing. You cannot Seek beyond
the end of a file.
SETCOMMENT
Description:
2-11
Calling AmigaDOS AmigaDOS DeveloDerfs Manual
SETPROTECTION
Description:
SetProtection sets the protection attributes on a file or directory. The lower four bits of the mask are as
follows:
Only delete is checked for in the current release of AmigaDOS. Rather than referring to bits by
number you should use the definitions in "include/libraries/dos.h".
UNLOCK
Description:
UnLock removes a filing system lock obtained from Lock, DupLock, or CreateDir.
2-12
AmisraDOS Develoner's Manual Calling AmigaDOS
WATTFORCHAR
Result: bool-boolean
Description:
If a character is available to be read from the file associated with the handle file' within a certain time,
indicated by 'timeout1, WaitForChar returns -1 (TRUE); otherwise, it returns 0 (FALSE). If a
character is available, you can use Read to read it. Note that WaitForChar is only valid when the I/O
streams are connected to a virtual terminal device, 'timeout' is specified in microseconds.
WRITE
Description:
You can copy data with a combination of Read and Write. Write writes bytes of data to the opened file
file', length' refers to the actual length of data to be transferred; 'buffer' refers to the buffer size.
Write returns a value that indicates the length of information actually written. That is to say, when
length' is greater than zero, the value of 'length' is the number of characters written. A value of-1
indicates an error. The user of this call must always check for an error return which may, for example,
indicate that the disk is full.
2-13
Calling AmigaDOS AmigaDOS DeveloDerfs Manual
Process Handling
CREATEPROC
Form:
process = CreateProc( name, prif segment, stackSize )
DO Dl D2 D3 D4
Description:
CreateProc creates a process with the name 'name1. That is to say, CreateProc allocates a process
control structure from the free memory area and then initializes it.
CreateProc takes a segment list as the argument 'segment1. (See also under LOADSEG and
UNLOADSEG.) This segment list represents the section of code that you intend to run as a new
process. CreateProc enters the code at the first segment in the segment list, which should contain
suitable initialization code or ajump to such.
•stackSize1 represents the size of the root stack in bytes when CreateProc activates the process. fprif
specifies the required priority of the new process. The result is the process identifier of the new
process, or zero if the routine failed.
2-14
AmigaDOS Developer's Manual Calling AmigaDOS
DATESTAMP
Argument: v - pointer
Description:
DateStamp takes a vector of three longwords that is set to the current time. The first element in the
vector is a count of the number of days. The second element is the number of minutes elapsed in the
day. The third is the number of ticks elapsed in the current minute. A tick happens 50 times a second.
DateStamp ensures that the day and minute are consistent. All three elements are zero if the date is
unset. DateStamp currently only returns even multiples of 50 ticks. Therefore the time you get is
always an even number of ticks.
DELAY
Description:
The function Delay takes an argument 'timeout1, 'timeout1 allows you to specify how long the process
should wait in ticks (50 per second).
DEVICEPROC
Purpose: To return the process identifier of the process handling that I/O.
Description:
DeviceProc returns the process identifier of the process that handles the device associated with the
specified name. If DeviceProc cannot find a process handler, the result is zero. If'name' refers to a file
on a mounted device, then IoErrO returns a pointer to a directory lock.
2-15
Calling AmigaDOS AmigaDOS Developer's Manual
You can use this function to determine the process identification of the handler process where the
system should send its messages.
EXIT
Description:
Exit acts differently depending on whether you are running a program under a CLI or not. If you run,
as a command under a CLI, a program that calls Exit, the command finishes and control reverts to the
CLI. Exit then interprets the argument VeturnCode' as the return code from the program.
If you run the program as a distinct process, Exit deletes the process and releases the space associated
with the stack, segment list, and process structure.
Loading Code
EXECUTE
Description:
This function takes a string (commandString) that specifies a CLI command and arguments, and
attempts to execute it. The CLI string can contain any valid input that you could type directly at a CLI,
including input and output indirection using > and <.
The input file handle will normally be zero, and in this case the EXECUTE command will perform
whatever was requested in the commandString and then return. If the input file handle is nonzero then
after the (possibly null) commandString is performed subsequent input is read from the specified input
file handle until end offile is reached.
2-16
AmigaDOS Developerys Manual Calling AmigaDOS
In most cases the output file handle must be provided, and will be used by the CLI commands as their
output stream unless redirection was specified. If the output file handle is set to zero then the current
window, normally specified as *, is used. Note that programs running under the Workbench do not
normally have a current window.
The Execute function may also be used to create a new interactive CLI process just like those created
with the NEWCLI function. In order to do this you should call Execute with an empty commandString,
and pass a file handle relating to a new window as the input file handle. The output file handle should
be set to zero. The CLI will read commands from the new window, and will use the same window for
output. This new CLI window can only be terminated by using the ENDCLI command. For this
command to work the program C.RUN must be present in C:.
LOADSEG
Description:
The file 'name* is a load module produced by the linker. LoadSeg takes this and scatter loads the code
segments into memory, chaining the segments together on their first words. It recognizes a zero as
indicating the end of the chain.
Ifan error occurs, Loadseg unloads any loaded blocks and returns a false (zero) result.
If all goes well (that is, LoadSeg has loaded the module correctly), then Loadseg returns a pointer to
the beginning of the list of blocks. Once you have finished with the loaded code, you can unload it with
a call to UnLoadSeg. (For using the loaded code, see under CREATEPROC.)
2-17
Calling AmigaDOS AmigaDOS Developer's Manual
UNLOADSEG
Description:
UnLoadSeg unloads the segment identifier that was returned by LoadSeg. 'segment' may be zero.
2-18
AmigaDOS Developer's Manual Calling AmigaDOS
File Handling
CurrentDir to make a directory associated with a lock the current working directory.
219
Calling AmieraDOS AmicraDOS Develnner'q Manual
Process Handling
DeviceProc to return the process identifier of the process handling that I/O.
Loading Code
2-20
Chapter 3: The Macro Assembler
This chapter describes the AmigaDOS Macro Assembler. It gives a brief introduction to the 68000
microchip. This chapter is intended for the reader who is acquainted with an assembly language on
another computer.
Table of Contents
3.3.1 Comments
3.4 Expressions
3.4.1 Operators
3.4.3 Symbols
3.4.4 Numbers
3.7 Directives
AmigaDOS Developer's Manual Macro Assembler
This section gives a brief introduction to the 68000 microchip. It should help you to understand the
concepts introduced later in the chapter. It assumes that you have already had experience with
assembly language on another computer.
There are 17 registers, but only 16 are available at any given moment. Eight of them are data registers
named DO to D7, and the others are address registers called A0 to A7. Each register contains 32 bits. In
many contexts, you may use either kind of register, but others demand a specific kind. For instance,
you may use any register for operations on word (16-bit) and long word (32-bit) quantities or for
indexed addressing of main memory. Although, for operations on byte (8-bit) operands, you may only
use data registers, and for addressing main memory, you may only use address registers as stack
pointers or base registers. Register A7 is the stack pointer, this is in fact two distinct registers; the
system stack pointer available in supervisor mode and the user stack pointer available in user mode.
The main memory consists of a number of bytes of memory. Each byte has an identifying number
called its address. Memory is usually (but not always) arranged so that its bytes have addresses 0,1,2,
..., N-2, N-l where there are N bytes of memory in total. The size of memory that you can directly
access is very large - up to 16 million bytes. The 68000 can perform operations on bytes, words, or long
words of memory. A word is two consecutive bytes. In a word, the first byte has an even address. A long
word is four consecutive bytes also starting at an even address. The address of a long word is the even
address of its lowest numbered first byte.
As well as holding items of data being manipulated by the computer, the main memory also holds the
instructions that tell the computer what to do. Each instruction occupies from one to 5 words,
consisting of an operation word between zero and four operand words. The operation word specifies
what action is to be performed (and implicitly how many words there are in the whole instruction). The
operand words indicate where in the registers or main memory are the items to be manipulated, and
where the result should be placed.
The assembler usually executes instructions one at a time in the order that they occur in memory, like
the way you follow the steps in a recipe or play the notes in a piece of written music. There is a special
register called the program counter (PC) which you use to hold the address of the instruction you want
the assembler to execute next. Some instructions, called jumps or branches, upset the usual order, and
force the assembler to continue executing the instruction at a specific address. This lets the computer
perform an action repeatedly, or do different things depending on the values of data items.
To remember particular things about the state of the computer, you can use one other special register
called the status register (SR).
3-1
Macro Assembler AmigaDOS Developer's Manual
assem < source file > [-0 < object file > ]
[-1 <listingfile>]
[-v < verification file >]
[-h <headerfile>]
[-c < options >]
[-i < include dirlist>]
The assembler does not produce an object file or a listing file unless you request them explicitly.
As the assembler is running, it generates diagnostic messages (errors, warnings, and assembly
statistics) and sends them to the screen unless you specify a verification file.
To force the inclusion of the named file in the assembly at the head of the source file, you use
-h < filename > on the command line. This has the same effect as using
INCLUDE M<filename>M
To set up the list of directories that the assembler should search for any INCLUDEd files, you use the
-i keyword. You should specify as many directories as you require after the -i, separating the directory
names by a comma (,), a plus sign (+), or a space. Note that if you use a space, you must enclose the
entire directory list in double quotes ("). Unix users, however, must escape any double quotes with a
backslash (V1).
The order of the list determines the order of the directories where the assembler should search for
INCLUDEd files. The assembler^ initially searches the current directory before any others. Thus any
file that you INCLUDE in a program must be in the current directory, or in one of the directories listed
in the -i list. For instance, if the program Tred1 INCLUDES, apart from files in the current directory, a
file from the directory 'intrnl/incl1, a file from the directory 'include/asm1, and a file from the directory
•extrnl/incl1, you can give the -i directory list in these three ways:
or, by using the space separator on the Sun under Unix, like this
The -c keyword allows you to pass certain options to the assembler. Each option consists of a single
character (in either upper or lower case), possibly followed immediately by a number. Valid options
follow here:
3-2
AmigaDOS Developer's Manual Macro Assembler
assembles the file fred.asm and produces an object module in the file fred.o.
assembles the file fred.asm, produces an object module in the file fred.o, and produces a listing file in
fred.lst.
A program acceptable to the assembler takes the form of a series of input lines that can include any of
the following:
3.3.1 Comments
To introduce comments into the program, you can use three different methods:
1. Type a semicolon (;) anywhere on a line and follow it with the text of the comment.
For example,
2. Type an asterisk (*) in column one of a line and follow it with the text of the
comment. For example,
3. Follow any complete instruction or directive with a least one space and some text.
For example,
In addition, note that all blank lines are treated by the assembler as comment lines.
3-3
Macro Assembler AmigaDOS Developers Manual
<opcode> [<operand>[,<operand>]...][<comment>l
To separate each field from the next, press the SPACEBAR or TAB key. This produces a separator
character. You may use more than one space to separate fields.
a) Starts in the first column and is separated from the next field by at least one space, or
b) Starts in any column, and is followed immediately with a colon (:).
If a label is present, then it must be the first non-blank item on the line. The assembler assigns the
value and type of the program counter, that is, the memory address of the first byte of the instruction
or data being referenced, to the label. Labels are allowed on all instructions, and on some directives, or
they may stand alone on a line. See the specifications of individual directives in Section 3.7 for whether
a label field is allowed.
Note: You must not give multiple definitions to labels. Also, you must not use instruction names,
directives, or register names as labels.
Local labels are provided as an extension to the MOTOROLA specification. They take the form nnn$
and are only valid between any proper (named) labels. Thus, in this example code segment
the label 1$ is only available from the line following the one labelled FOO to the line before the one
labelled BAA. In this case, you could then use the label 1$ in a different scope elsewhere in the
program.
3-4
AmigaDOS Developer's Manual Macro Assembler
The Opcode field follows the Label field and is separated from it by at least one space. Entries in this
field are of three types.
2. Assembler Directives.
3. Macro invocations.
To enter instructions and directives that can operate on more than one data size, you use an optional
Size-Specifier subfield, which is separated from the opcode by the period (.) character. Possible size
specifiers are as follows:
The size specifier must match with the instruction or directive type that you use.
If present, the operand field contains one or more operands to the instruction or directive, and must be
separated from it by at least one space. When you have two or more operands in the field, you must
separate them with a comma (,). The operand field terminates with a space or newline character (a
newline character is what the assembler receives when you press RETURN), so you must not use
spaces between operands.
Anything after the terminating space of the operand field is ignored. So the assembler treats any
characters you insert after a space as a comment.
3-5
Macro Assembler AmigaDOS Developer's Manual
3.4 Expressions
An expression is a combination of symbols, constants, algebraic operators, and parentheses that you
can use to specify the operand field to instructions or directives. You may include relative symbols in
expressions, but they can only be operated on by a subset of the operators.
3.4.1 Operators
To override the precedence of the operators, enclose sub-expressions in parentheses. The assembler
evaluates operators of equal precedence from left to right. Note that, normally, you should not have
any spaces in an expression, as a space is regarded as a delimiter between one field and another.
In the following table, fAf represents absolute symbols, and R represents relative symbols. The table
shows all the possible operator/operand combinations, with the type of the resulting value. V
indicates an error. The Monadic minus and the Logical not operators are only valid with an absolute
operand.
Operands
Operators
A Op A R op R A op R R op A
+ A X R R
- A A X R
A X X X
/ A X X X
& A X X X
! A X X X
» A X X X
« A X X X
3.4.3 Symbols
A symbol is a string of up to 30 characters. The first character of a symbol must be one of following:
3-6
AmigaDOS Developer's Manual Macro Assembler
The rest of the characters in the string can be any of these characters or also numeric (0 through 9). In
all symbols, the lower case characters (a-z) are not treated as synonyms with their upper case
equivalents (unless you use the option C when you invoke the assembler). So ffredf is different from
TRED9 and TRedV However, the assembler recognizes instruction optcodes, directives, and register
names in either upper or lower case. A label equated to a register name with EQUR is also recognized
by the assembler in either upper or lower case. Symbols can be up to 30 characters in length, all of
which are significant. The assembler takes symbols longer than this and truncates them to 30
characters, giving a warning that it has done so. The Instruction names, Directive names, Register
names, and special symbols CCR, SR, SP and USP cannot be used as user symbols. A symbol can be
one of three types:
Absolute
Relative
Register
a) The symbol was set to a register name using EQUR (This is an extension from the
MOTOROLA specification).
There is a special symbol *, which has the value and type of the current program counter, that is, the
address of the current instruction or directive that the assembler is acting on.
3.4.4 Numbers
You may use a number as a term of an expression, or as a single value. Numbers ALWAYS have
absolute values and can take one of the following formats:
Decimal
(a string of decimal digits)
Example: 1234
Hexadecimal
($ followed by a string of hex digits)
Example: $89AB
Octal
(@ followed by a string of octal digits)
Example: @743
3-7
Macro Assembler AmigaDOS Developer's Manual
Binary
(% followed by zeros and ones)
Example: %10110111
ASCn Literal
(Up to 4 ASCII characters within quotes)
Strings of less than 4 characters are justified to the right, using NUL as the packing character.
To obtain a quote character in the string, you must use two quotes. An example of this is
•Ifs1
The effective address modes define the operands to instructions and directives, and you can find a
detailed description of them in any good reference book on the 68000. Addresses refer to individual
bytes, but instructions, Word and Long Word references, access more than one byte, and the address
for these must be word aligned.
In the following table, Dn represents one of the data registers (D0-D7), 'An1 represents one of the
address registers (A0-A7, SP and PC), 'a1 represents an absolute expression, Y represents a relative
expression, and fXn' represents An or Dn, with an optional \W or \L' size specifier. The syntax for each
of the modes is as follows:
3-8
AmigaDOS Developer's Manual Macro Assembler
3-9
Macro Assembler AmigaDOS Developer's Manual
(continuation of 3-B)
#a Immediate data
Example: MOVE #1234,D0
USP )
CCR ) Special addressing modes
SR )
Example: MOVE A0,USP
MOVE D0,CCR
MOVE D1,SR
Certain instructions (for example, ADD, CMP) have an address variant (that refers to address
registers as destinations), immediate and quick forms (when immediate data possibly within a
restricted size range appears as an operand), and a memory variant (where both operands must be a
postincrement address).
To force a particular variant to be used, you may append A, Q, I or M to the instruction mnemonic. In
this case, the assembler uses the specified form of the instruction, if it exists, or gives an error
message.
If, however, you specify no particular variant, the assembler automatically converts to the T, 'A1 or TVT
forms where appropriate. However, it does not convert to the 'Q' form. For example, the assembler
converts the following:
ADD.L A2,A1
to
ADDA.L A2,A1
3-10
AmieraDOS Developer's Manual Macro Assembler
3.7 Directives
All assembler directives (with the exception of DC and DCB) are instructions to the assembler, rather
than instructions to be translated into object code. At the beginning of this section, there is a list of all
the directives (Table 3-C), arranged by function; at the end there is an individual decription for each
directive, arranged by function.
Note that the assembler only allows labels on directives where specified. For example, EQU is allowed
a label. It is optional for RORG, but not allowed for LLEN or TTL.
Assembly Control
Directive Description
Symbol Definition
Directive Description
Data Definition
Directive Description
DC Define constants
DCB Define Constant Block
DS Define storage
3-11
Macro Assembler AmigaDi
(continuation of 3-O
Listing Control
Directive Description
Conditional Assembly
Directive Description
Macro Directives
Directive Description
External Symbols
Directive Description
3-12
AmigaDOS Developer's Manual Macro Assembler
(continuation of3-C)
General Directives
Directive Description
This directive tells the assembler to restore the counter to the last location allocated in the named
section (or to zero if used for the first time).
CODE indicates that the section contains relocatable code. This is the default.
DATA indicates that the section contains initialized data (only).
BSS indicates that the section contains uninitialized data
The assembler can maintain up to 255 sections. Initially, the assembler begins with an unnamed
CODE section. The assembler assigns the optional symbol < labels > to the value of the program
counter after it has executed the SECTION directive. In addition, where a section is unnamed, the
shorthand for that section is the keyword CODE.
The RORG directive changes the program counter to be <absexp> bytes from the start of the current
relocatable section. The assembler assigns relocatable memory locations to subsequent statements,
starting with the value assigned to the program counter. To do addressing in relocatable sections, you
use the 'program counter relative with displacement* addressing mode. The label value assignment is
the same as for SECTION.
3-13
Macro Assembler AmigaDOS Developer's Manual
To define a table of offsets via the DS directive beginning at the address <absexp>, you use the
OFFSET directive. Symbols defined in an OFFSET table are kept internally, but no code-producing
inductions or directives may appear. To terminate an OFFSET section, you use a RORG, OFFSET,
SECTION, or END directive.
The END directive tells the assembler that the source is finished, and the assembler ignores
subsequent source statements. When the assembler encounters the END directive during the first
pass, it begins the second pass. If, however, it detects an end-of-file before an END directive, it gives a
warning message. If the label field is present, then the assembler assigns the value of the current
program counter to the label before it executes the END directive.
The EQU directive assigns the value of the expression in the operand field to the symbol in the label
field. The value assigned is permanent, so you may not define the label anywhere else in the program.
This directive lets you equate one of the processor registers with a user symbol. Only the Address and
Data registers are valid, so special symbols like SR, CCR, and USP are illegal here. The register is
permanent, so you cannot define the label anywhere else in the program. The register must not be a
forward reference to another EQUR statement. The assembler matches labels defined in this way
without distinguishing upper and lower case.
3-14
AmigaDOS Developer's Manual Macro Assembler
The REG directive assigns a value to label that the assembler can translate into the register list mask
format used in the MOVEM instruction. < register list> is of the form
Rl[-R2][/R3[-R411...
The SET directive assigns the value of the expression in the operand field to the symbol in the label
field. SET is identical to EQU, apart from the fact that the assignment is temporary. You can always
change SET later on in the program.
Note: You should not insert forward references within the expression or refer forward to symbols that
you defined with SET.
DC Define Constant
The DC directive defines a constant value in memory. It may have any number of operands, separated
by commas (,). The values in the list must be capable of being held in the data location whose size is
given by the size specifier on the directive. If you do not give a size specifier, DC assumes it is .W. If the
size is .B, then there is one other data type that can be used: that of the ASCII string. This is an
arbitrarily long series of ASCII characters, contained within quotation marks. As with ASCII literals,
if you require a quotation mark in the string, then you must enter two. If the size is .W or .L, then the
assembler aligns the data onto a word boundary.
You use the DCB directive to set a number (given by <absexp>) of bytes, words, or longwords to the
value of the expression <exp>. DCB. < size > n,exp is equivalent to repeating n times the statement
DC.<size>exp.
3-15
Macro Assembler AmigaDOS Developer's Manual
DS Define Storage
To reserve memory locations, you use the DS directive. DS, however, does no initialization. The
amount of space the assembler allocates depends on the data size (that you give with the size specifier
on the directive), and the value of the expression in the operand field. The assembler interprets this as
the number of data items of that size to allocate. As with DC, if the size specifier is .W or .L, DS aligns
the space onto a word boundary. So, DS. W 0 has the effect of aligning to a word boundary only. If you do
not give a size specifier, DS assumes a default of.W. See CNOP for a more general way of handling
alignment.
Format: PAGE
Unless paging has been inhibited, PAGE advances the assembly listing to the top of the next page. The
PAGE directive does not appear on the output listing.
Format: LIST
The LIST directive tells the assembler to produce the assembly listing file. Listing continues until it
encounters either an END or a NOLIST directive. This directive is only active when the assembler is
producing a listing file. The LIST directive does not appear on the output listing.
Format: NOLIST
NOL
The NOLIST or NOL directive turns off the production of the assembly listing file. Listing ceases until
the assembler encounters either an END or a LIST directive. The NOLIST directive does not appear on
the program listing.
3-16
AmigaDOS Developer's Manual Macro Assembler
The SPC directive outputs the number of blank lines given by the operand field, to the assembly
listing. The SPC directive does not appear on the program listing.
Format NOPAGE
The NOPAGE directive turns off the printing of page throws and title headers on the assembly listing.
The LLEN directive sets the line length of the assembly listing file to the value you specified in the
operand field. The value must lie between 60 and 132, and can only be set once in the program. The
LLEN directive does not appear on the assembly listing. The default is 132 characters.
The PLEN directive sets the page length of the assembly listing file to the value you specified in the
operand field. The value must lie between 24 and 100, and you can only set it once in the program. The
default is 60 lines.
The TTL directive sets the title of the program to the string you gave in the operand field. This string
appears as the page heading in the assembly listing. The string starts at the first non-blank character
after the TTL, and continues until the end of line. It must not be longer than 40 characters in length.
The TTL directive does not appear on the program listing.
3-17
Macro Assembler AmigaDOS Developer's Manual
Format: NOOBJ
The NOOBJ directive disables the production of the object code file at the end of assembly. This
directive disables the production of the code file, even if you specified a file name when you called the
assembler.
Format: FAIL
The FAIL directive tells the assembler to flag an error for this input line.
FORMAT No action
Format: FORMAT
The assembler accepts this directive but takes no action on receiving it. FORMAT is included for
compatibility with other assemblers.
NOFORMAT No action
Format: NOFORMAT
The assembler accepts this directive but takes no action on receiving it. NOFORMAT is included for
compatibility with other assemblers.
This directive is an extension from the Motorola standard and allows a section of code to be aligned on
any boundary. In particular, it allows any data structure or entry point to be aligned to a long word
boundary.
The first expression represents an offset, while the second expression represents the alignment
required for the base. The code is aligned to the specified offset from the nearest required alignment
boundary. Thus
3-18
AmigaDOS Developer's Manual Macro Assembler
CNOP 0,4
CNOP 2,4
aligns code to the word boundary 2 bytes beyond the nearest long word aligned boundary.
You use the IFxx range of directives to enable or disable assembly, depending on the value of the
expression in the operand field. If the condition is not TRUE (for example, IFEQ 2+1), assembly
ceases (that is, it is disabled). The conditional assembly switch remains active until the assembler
finds a matching ENDC statement. You can nest conditional assembly switches arbitrarily,
terminating each level of nesting with a matching ENDC.
The strings must be a series of ASCII characters enclosed in single quotes, for example, TOO1 orfl (the
empty string). If the condition is not TRUE, assembly ceases (that is, it is disabled). Again the
conditional assembly switch remains active until the assembler finds a matching ENDC statement.
Depending on whether or not you have already defined the symbol, the assembler enables or disables
assembly until it finds a matching ENDC.
3-19
Macro Assembler AmigaDOS Developer's Manual
Format: ENDC
To terminate a conditional assembly, you use the ENDC directive, set up with any of the 8 IFxx
directives above. ENDC matches the most recently encountered condition directive.
Macro Directives
MACRO introduces a macro definition. ENDM terminates a macro definition. You must provide a
label, which the assembler uses as the name of the macro; subsequent uses of that label as an operand
expand the contents of the macro and insert them into the source code. A macro can contain any
opcode, most assembler directives, or any previously defined macro. A plus sign (+) in the listing,
marks any code generated by macro expansion. When you use a macro name, you may append a
number of arguments, separated by commas. If the argument contains a space (for example, a string
containing a space) then you must enclose the entire argument within < (less than) and > (greater
than) symbols.
The assembler stores up and saves the source code that you enter (after a MACRO directive and before
an ENDM directive) as the contents of the macro. The code can contain any normal source code. In
addition, the symbol \ (backslash) has a special meaning. Backslash followed by a number n indicates
that the value of the nth argument is to be inserted into the code. If the nth argument is omitted then
nothing is inserted. Backslash followed by the symbol v@* tells the assembler to generate the text
\nnn\ where nnn is the number of times the \@ combination it has encountered. This is normally used
to generate unique labels within a macro.
You may not nest macro definitions, that is, you cannot define a macro within a macro, although you
can call a macro you previously defined. There is a limit to the level of nesting of macro calls. This
limit is currently set at ten.
Macro expansion stops when the assembler encounters the end of the stored macro text, or when it
finds a MEXIT directive.
Format: NARG
The symbol NARG is a special reserved symbol and the assembler assigns it the index of the last
argument passed to the macro in the parameter list (even nulls). Outside of a macro expansion, NARG
has the value 0.
3-20
AmigaDOS Developer's Manual Macro Assembler
Format: ENDM
Format: MEXIT
You use this directive to exit from macro expansion mode, usually in conjunction with the IFEQ and
IFNE directives. It allows conditional expansion of macros. Once it has executed the directive, the
assembler stops expanding the current macro as though there were no more stored text to include.
External Symbols
One or more absolute or relocatable labels may follow the XDEF directive. Each label defined here
generates an external symbol definition. You can make references to the symbol in other modules
(possibly from a high-level language) and satisfy the references with a linker. If you use this directive
or XREF, then you cannot directly execute the code produced by the assembler.
3-21
Macro Assembler AmigaDOS Developer's Manual
One or more labels that must not have been defined elsewhere in the program follow the XREF
directive. Subsequent uses of the label tell the assembler to generate an external reference for that
label. You use the label as if it referred to an absolute or relocatable value depending on whether the
matching XDEF referred to an absolute or relocatable symbol.
The actual value used is filled in from another module by the linker. The linker also generates any
relocation information that may be required in order for the resulting code to be relocatable.
External symbols are normally used as follows. To specify a routine in one program segment as an
external definition, you place a label at the start of the routine and quote the label after an XDEF
directive. Another program may call that routine if it declares a label via the XREF directive and then
jumps to the label so declared.
General Directives
The INCLUDE directive allows the inclusion of external files into the program source. You set up the
file that INCLUDE inserts with the string descriptor in the operand field. You can nest INCLUDE
directives up to a depth of three, enclosing the file names in quotes as shown. INCLUDE is especially
useful when you require a standard set of macro definitions or EQUs in several programs.
You can place the definitions in a single file and then refer to them from other programs with a
suitable INCLUDE. It is often convenient to place NOLIST and LIST directives at the head and tail of
files you intend to include via INCLUDE. AmigaDOS searches for the file specification first in the
current directory, then in each subsequent directory in the list you gave in the -i option.
MASK2 No action
Format: MASK2
The assembler accepts the MASK2 directive, but it takes no action on receiving it.
3-22
AmigaDOS Developer's Manual Macro Assembler
A program unit, which consists of one or more sections, must have a name. Using the IDNT directive,
you can define a name consisting of a string optionally enclosed in double quotes. If the assembler does
not find a IDNT directive, it outputs a program unit name that is a null string.
3-23
Chapter 4: The Linker
This chapter describes the AmigaDOS Linker. The AmigaDOS Linker produces a single binary load
file from one or more input files. It can also produce overlaid programs.
Table of Contents
4.1 Introduction
4.3 Overlaying
4.1 Introduction
ALINK produces a single binary output file from one or more input files. These input files, known as
object files, may contain external symbol information. To produce object files, you use your assembler
or language translator. Before producing the output, or load file, the linker resolves all references to
symbols.
The linker can also produce a link map and symbol cross reference table.
Associated with the linker is an overlay supervisor. You can use the overlay supervisor to overlay
programs written in a variety of languages. The linker produces load files suitable for overlaying in
this way.
1. as a Command line. You can specify most of the information necessary for running the linker in
the command parameters.
2. as a Parameter file. As an alternative, if a program is being linked repetitively, you can use a
parameter file to specify all the data for the linker.
1. Primary binary input. This refers to one or more object files that form the initial binary input to
the linker. These files are always output to the load file, and the primary input must not be
empty.
2. Overlay files. If overlaying, the primary input forms the root of the overlay tree, and the overlay
files form the rest of the structure.
3. Libraries. This refers to specified code that the linker incorporates automatically. Libraries
may be resident or scanned. A resident library is a load file which may be resident in memory,
or loaded as part of the 'library open9 call in the operating system. A scanned library is an object
file within an archive format file. The linker only loads the file if there are any outstanding
external references to the library.
1. In the first pass, the linker reads all the primary, library and overlay files, and records the code
segments and external symbol information. At the end of the first pass, the linker outputs the
map and cross reference table, if required.
2. If you specify an output file, then the linker makes second pass through the input. First it copies
the primary input files to the output, resolving symbol references in the process, and then it
copies out the required library code segments in the same way. Note that the library code
segments form part of the root of the overlay tree. Next, the linker produces data for the overlay
supervisor, and finally outputs the overlay files.
In the first pass, after reading the primary and overlay input files, the linker inspects its table of
symbols, and if there are any remaining unresolved references, it reads the files, if any, that you
specified as the library input. The linker then marks any code segments containing external
definitions for these unresolved references for subsequent inclusion in the load file. The linker only
4-1
The Linker AmigaDOS Developer's Manual
To use the linker, you must know the command syntax, the type of input and output that the linker
uses, and the possible errors that may occur. This section attempts to explain these things.
tfFROM=ROOT,TO/K,WITH/K,VER^,LIBRARY=LIB/K,
MAP/K,XREF/K,WIDTH/Klf
In the above, file means a single file name, 'files1 means zero or more file names, separated by a
comma or plus sign, and vnv is an integer.
ALINK a
ALINK ROOT a+b+c+d MAP map-file WIDTH 120
ALINK a,b,c TO output LIBRARY :flib/1ib,obj/newlib
When you give a list of files, the linker reads them in the order you specify.
FROM: specifies the object files that you want as the primary binary input. The linker always
copies the contents of these files to the load file to form part of the overlay root. At least
one primary binary input file must be specified. ROOT is a synonym for FROM.
TO: specifies the destination for the load file. If this parameter is not given, the linker omits
the second pass.
WITH: specifies files containing the linker parameters, for example, normal command lines.
Usually you only use one file here, but, for completeness, you can give a list of files. Note
that parameters on the command line override those in WITH files. You can find a full
description of the syntax of these files in section 4.2.2 of this manual.
VER: specifies the destination of messages from the linker. If you do not specify VER, the
linker sends all messages to the standard output (usually the terminal).
LIBRARY: specifies the files that you want to be scanned as the library. The linker includes only
referenced code segments. LIB is a valid alternative for LIBRARY.
4-2
AmigaDOS Developer's Manual The Linker
WIDTH: specifies the output width that the linker can use when producing the link map and cross
reference table. For example, if you send output to a printer, you may need this
parameter.
WITH files contain parameters for the linker. You use them to save typing a long and complex ALINK
command line many times.
A WITH file consists of a series of parameters, one per line, each consisting of a keyword followed by
data. You can terminate lines with a semicolon (;), where the linker ignores the rest of the line. You
can then use the rest of the line after the semicolon to include a comment. The linker ignores blank
lines.
where 'file* is a single filename, 'files' is one or more filenames, '[file]' is an optional filename, and 'nf is
an integer. You may use an asterisk symbol (*) to split long lines; placing one at the end of a line tells
the printer to read the next line as a continuation line. If the filename after MAP or XREF is omitted,
the output goes to the VER file (the terminal by default).
Parameters on the command line override those in a WITH file, so that you can make small variations
on standard links by combining command line parameters and WITH files. Similarly, if you specify a
parameter more than once in WITH files, the linker uses the first occurrence.
Note: In the second example below, this is true even if the first value given to a parameter is null.
FROM obj/main,obj/s
TO bin/test
LIBRARY obj/lib
MAP
XREF XO
4-3
The Linker AmigaDOS Developer's Manual
The command
FROM bin/prog/bin/subs
LIBRARY nag/fortlib
TO linklib/prog
Note: In the example above, the null parameter for LIBRARY on the command line overrides the value
'nag/fortlib1 in the WITH file, and so the linker does not read any libraries.
Various errors can occur while the linker is running. Most of the messages are self-explanatory and
refer to the failure to open files, or to errors in command or binary file format. After an error, the
linker terminates at once.
There are a few messages that are warnings only. The most important ones refer to undefined or
multiply-defined symbols. The linker should not terminate after receiving a warning.
If any undefined symbols remain at the end of the first pass, the linker produces a warning, and
outputs a table of such symbols. During the second pass, references to these symbols become references
to location zero.
If the linker finds more than one definition of a symbol during the first pass, it puts out a warning, and
ignores the later definition. The linker does not produce this message if the second definition occurs in
a library file, so that you can replace library routines without it producing spurious messages. A
serious error follows if the linker finds inconsistent symbol references, and linking then terminates at
once.
Since the linker only uses the first definition of any symbol, it is important that you understand the
following order in which files are read.
Within each group, the linker reads the files in the order that you specify in the file list. Thus
definitions in the primary input override those in the overlay files, and those in the libraries have
lowest priority.
4-4
AmigaDOS Developer's Manual The Linker
The link map, which the linker produces after the first pass, lists all the code segments that the linker
output to the load file in the second pass, in the order that they must be written.
For each code segment, the linker outputs a header, starting with the name of the file (truncated to
eight letters), the code segment reference number, the type (that is, data, code, bss, or COMMON), and
size. If the code segment was in an overlay file, the linker also gives the overlay level and overlay
ordinate.
After the header, the linker prints each symbol defined in the code segment, together with its value. It
prints the symbols in ascending order of their values, appending an asterisk (*) to absolute values.
The value of the WIDTH parameter determines the number of symbols printed per line. If this is too
small, then the linker prints one symbol on each line.
The cross reference output also lists each code segment, with the same header as in the map.
The header is followed by a list of the symbols with their references. Each reference consists of a pair of
integers, giving the offset of the reference and the number of the code segment in which it occurs. The
code segment number refers to the number given in each header.
4.3 Overlaying
The automatic overlay system provided by the linker and the overlay supervisor allows programs to
occupy less memory when running, without any alterations to the program structure.
When using overlaying, you should consider the program as a tree structure. That is, with the root of
the tree as the primary binary input, together with library code segments and COMMON blocks. This
root is always resident in memory. The overlay files then form the other nodes of the tree, according to
specifications in the OVERLAY directive.
The output from the linker when overlaying, as in the usual case, is a single binary file, which consists
of all the code segments, together with information giving the location within the file of each node of
the overlay tree. When you load the program only the root is brought into memory. An overlaj
supervisor takes care of loading and unloading the overlay segments automatically. The linker
includes this overlay supervisor in the output file produced from an link using overlays. The overlay
supervisor is invisible to the program running.
To specify the tree structure of a program to the linker, you use the OVERLAY directive. This
directive is exceptional in that you can only use it in WITH files. As with other parameters, the linker
uses the first OVERLAY directive you give it.
4-5
The Linker AmieaDOS Develoner's Manual
OVERLAY
Xfiles
Note: The overlay directive can span many lines. The linker recognizes a hash sign (#) or the
end-of-file as a terminator for the directive.
Each line after OVERLAY specifies one node of the tree, and consists of a count X and a file list.
The level of a node specifies its 'depth' in the tree, starting at zero, which is the level of the root. The
count, X, given in the directive, consists of zero or more asterisks, and the overlay level of the node is
given by X+l.
As well as the level, each node other than the root has an ordinate value. This refers to the order in
which the linker should read the descendents of each node, and starts at 1, for the first 'offspring' of a
parent node.
Note: There may be nodes with the same level and ordinate, but with different parents.
While reading the OVERLAY directive, the linker remembers the current level, and, for each new
node, compares the level specified with this value. If less, then the new node is a descendent of a
previous one. If equal, the new node has the same parent as the current one. If greater, the new node is
a direct descendant of the current one, and so the new level must be one greater than the current value.
OVERLAY ROOT
a 1 1 /l\
b 1 2 a b c
c 1 3
OVERLAY ROOT
a 1 1 A
b 1 2 a b
*c 2 1 /I
*d 2 2 c d
#
Figure 4-A
4-6
AmigaDOS Developer's Manual The Linker
OVERLAY -ROOT-
a 1 1 / /l\ \
b 1 2 / / 1 \ \
*c 2 1 a b e £ 1
*d 2 2 /I /l\
e 1 3 c d ghk
f 1 4 /I
*g 2 1 i j
*h 2 2
**i 3 1
**j 3 2
*k 2 3
1 1 5
The level and ordinate values given above refer to ttie node specified on the same line. Note that all the
files given in the examples above could have been file lists. Single letters are for clarity. For example,
Figure 4-B
ROOT bin/mainaaa
OVERLAY
bin/mainbbb,bin/mainccc,bin/mainddd
*bin/makereal
*bin/trbblock,bin/transint,bin/transr*
bin/transri
bin/outcode
#
Figure 4-B
4-7
The Linker n AmigaDOS Developer's Manual
bin/mainaaa
A
/ \
/ \
/ \
/ \
/ \
b in/ma inbbb b in/outcode
bin/mainccc
bin/mainddd
A
/ \
/ \
/ \
/ \
/ \
bin/tnakereal bin/trbblock
bin/transint
bin/transr •
bin/transri
Figure 4-C
During linking, the linker reads the overlay files in the order you specified in the directive, line by
line. The linker preserves this order in the map and cross reference output, and so you can deduce the
exact tree structure from the overlay level and ordinate the linker prints with each code segment.
While linking an overlaid program, the linker checks each symbol reference for validity.
Suppose that the reference is in a tree node R, and the symbol in a node S. Then the reference is legal if
one of the following is true.
References of the third type above are known as overlay references. In this case, the linker enters the
overlay supervisor when the program is run. The overlay supervisor then checks to see if the code
segment containing the symbol is already in memory. If not, first the code segment, if any, at this
level, and all its descendents are unloaded, and then the node containing the symbol is brought into
memory. An overlaid code segment returns directly to its caller, and so is not unloaded from memory
until another node is loaded on top of it.
4-8
AmigaDOS Developer's Manual The Linker
/I
/ I
B C
l
/ I \
D E F
When the linker first loads the program, only A is in memory. When the linker finds a reference in A to
a symbol in B, it loads and enters B. If B in turn calls D then again a new node is loaded. When B
returns to A, both B and D are left in memory, and the linker does not reload them if the program
requires them later. Now suppose that A calls C. First the linker unloads the code segments that it
does not require, and which it may overwrite. In this case, these are B and D. Once it has reclaimed the
memory for these, the linker can load C.
Thus, when the linker executes a given node, all the node's 'ancestors9, up to the root are in memory,
and possibly some of its descendents.
The linker assumes that all overlay references are jumps or subroutine calls, and routes them through
the overlay supervisor. Thus, you should not use overlay symbols as data labels.
Try to avoid impure code when overlaying because the linker does not always load a node that is fresh
from the load file.
The linker gives each symbol that has an overlay reference an overlay number. It uses this value,
which is zero or more, to construct the overlay supervisor entry label associated with that symbol. This
label is of the form 'OVLYnnnn1, where nnnn is the overlay number. You should not use symbols with
this format elsewhere.
The linker gathers together all program sections with the same section name. It does this so that it can
then load them continuously in memory.
4-9
The Linker AmieaDOS Develoaer's Manual
These errors should be rare. If they do occur, the error is probably in the compiler and not in your
program. However, you should first check to see that you sent the linker a proper program (for
example, an input program must have an introductory program unit that tells the linker to expect a
program).
Internal Errors
4-10
AmieraDOS Developer's Manual Appendix A
Note: Throughout this appendix, the characters fl<CSI>fl represent the "Control Sequence
Introducer. For output, you may either use the two character sequence Esc-[ or the one
byte value $9B (hex). For input, you receive $9B's.
Introduction
This appendix describes several ways to do console (keyboard and screen) input and output on the
Amiga. You can open the console as you would any other AmigaDOS file (with fl*ff, "CON:11, "RAW:")
or do direct calls to console.library. The advantages of using each are listed below:
♦ "Star" does not open any windows; it just uses the existing CLI window. You do not
receive any complex character sequences. You do receive lowercase letters a-z,
uppercase letters A-Z, numbers, ASCII special symbols, and control characters.
Basically, if a teletype can generate the character with a single keystroke, you can
receive it. In addition to these characters, you can receive each of them with the
high-order bit set ($80-$FF). Line editing is also performed for you. This means
AmighaDOS accepts < Backspace > and CRTL-X for character and line deletions.
You do not have to deal with these. Any <CSI> sequence is swallowed for you as
well as control characters: C, D, E, F, H, and X. Any <CR> or CTRL-M
characters are converted to CTRL-J (new-line).
CON: Is just like "*" except that you also get to define a new window.
RAW: The simple case: With RAW: (as compared to CON:) you lose the line editing
functions and you gain access to the function and arrow keys. These are sent as
sequences of characters which you must parse in an intelligent manner.
The "complex" cases: By issuing additional commands to the console processor (by
doing writes to RAW:), you can get even more detailed information. For example,
you can request key press and release information or data on mouse events. See
"Selection of RAW Input Events" below for details on requesting this information.
console.library:
With this method, you have full control over the console device. You may change
the KeyMap to one of your own design and completely "redesign" your keyboard.
A-l
Appendix A AmigaDOS Developer's Manual
Two very helpful AmigaDOS commands let you play with these functions. The first:
accepts input from a RAW: window and displays the results in hex and ASCII. If you want to know for
sure what characters the keyboard is sending, this command provides a very simple way.
The second:
lets you type sequences into the input window and watch the cursor movement in the output window.
COPY cannot detect end of file on RAW: input, so you have to reboot when you are finished with this
command.
If you read from the CON: device, the keyboard inputs are preprocessed for you.
You get the ASCII characters like "B". Most normal text gathering programs read from the CON:
device. Special programs like word processors and music keyboard programs use RAW:.
To generate the international and special characters at the keyboard, you can press either ALT key.
This sets the high bit of the ASCII code returned for the key pressed.
Generating $FF (umlaut y) is a special case. If it followed the standard convention, it would be
generated by ALT-DEL. But since the ASCII code <Del> (hex 7F) is not generally a printable
character and it is our philosophy that Alt-non-printing character should not generate a printing
character, we have substituted ALT-numeric pad "-".
Table A-l lists the characters you can display on the Amiga. The characters NBSP (non-break space)
and SHY (soft hyphen) are used to render a space and hyphen in text processing with additional
meaning about the properties of the character.
A-2
AmicaDOS Developer's Manual Appendix A
B rrn 1. 1 1
1 1
0 11
iE o""l o t
n 1 n T" -V 0 ± 0 1 1 0 0 1 1
mmmYHmmmmEI —o
MMMMMH
—T [U it 1 0 1 0 1 0 1
IS:
061 !m 0309 10 11 12 13 14 15
wl
00 01 02 03 04 05 ■MMMMl MMMMMMMMMMMM
a ■M
■Ml ■■ ■■ ■Mj
ooH5
m
SI
■MMMM
SP I ol
% 1
1
AI
0 0 0 0
Mi MM MM MM
mmmmm
a
MM
P
2. a
MM
0 0 0 1 01 li 1 1 A Q a q i A N a
Tl
MMBBM MMMM
6
MM
2
MM MM! Mi
0 0 1 0 02 ;&$■
**'**#X#X II
2 B R b r A
■MMMMl
a
MMMBM
PMMHM MMMMl MMMMMB
Ml
A
MM MM Mi
3
0 0 1 1 03 II # 3 C S c s . £ MMMMMB MMMM
0
MM
a
MMMM MMM
6
■MM ■MM MMMMM
MM Mi MMl
6 6
MM M
0 1 0 0 04 HI •X*Xv> $ 4 D T d t j HI S
K MMMMl MM MMMB
MMMMM MMMMMB MM
MMH
MM Hi
0 1 0 1 05 #M 5 E U e u . |i a
MBBBM
6
MMMM
§
MMMM
5
MMMMM
MHMMM MHMMM ■MMMM ■■■^
MM MB Mi
0 1 1 0 06 & 6 F V f V
1
1
0 s
■BBBBM
5
MMMMM MMMMl
■Ml BBl Mi MM
0 1 1 1 07 9 1
7 G w g w
m § m
? Wx 5
0
U ( h m E 0
ft
1 0 0 0 08 8 H X X
MMMM
MMMHM MBBMB HMMM
MM
m t 0
1
1 0 0 1 09 m i&Sx ) 9 I Y i y u
§ 0
■
2
10 ■
»
1 0 1 0 * : J Z J z E u mmmm ■BBBBB
MM MMMBM ■MMMM ■MMMM
Ml
1 0 1 1 11 m + ; K C k •C x*x#x#
i 0 § Q
1 1 0 0 12 m < L \ L 1 MMMMH ■■MMl
t U
MMMMM
u
MMMMM
9
MM
1 1 0 1 13 II H - s
M. 3 m m SHY I 1
MMMMM BMMBBB
MBMM
■M MMJ MM MMMMl
1 1 1 0 14 • > N n ®
Tj
MMl
■M MM M
it
1 1 1 1 115 Hi
1
0 -
0
II 6 a 1
MM MMl Mi MM
Lmh M
A-3
Appendix A AmigaDOS Developer's Manual
Note: AmigaDOS uses CON: input for the CLI and most other commands. When it does this, it filters
out ALL of the function key and cursor key inputs. Programs that run under AmigaDOS can (and
some do) still open the RAW: console handler and process function key input.
CON: screen output is just like RAW: screen output except that <LF> (hex OA) is translated into a
new-line character. The net effect is that the cursor moves to the first column of the next line
whenever a < LF > is displayed.
Precede the following characters with < ESC > to perform the indicated actions.
Precede the following characters with <Esc> or press CTRL-ALT and the letter to perform the
indicated actions.
AmigaDOS Developer's Manual Appendix A
845tD IND INDEX: move the active position down one line
85 E NEL NEXT LINE:
8D M RI REVERSE INDEX:
9B [ CSI CONTROL SEQUENCE INTRODUCER:
see next list
Control Sequences (introduced by < CSI >) with parameters. The first character in the following table
(under the <CSI> column) represents the number of allowable parameters, as follows:
fl0fl
0" indicates no parameters allowed.
fTf indicates 0 or 1 numeric parameters.
"2" indicates 2 numeric parameters. (I14;94f)
3"
"3" indicates any number of numeric parameters, separated by semicolons.
"4"
4" indicates exactly 4 numeric parameters.
lion
8M indicates exactly 8 numeric parameters.
A-5
Appendix A AmigaDOS Developer's Manual
A-6
AmigaDOS Developer's Manual Appendix A
The following are not ANSI standard sequences; rather, they are private Amiga sequences.
Examples:
<CSI>20C
Move cursor to the forth column of the first line of the window:
<CSI>1;4H or <CSI>;4H
A-7
Appendix A AmigaDOS Developer's Manual
Reading input from the RAW: console device returns an ANSI x3.64 standard byte stream. This
stream may contain normal characters and/or RAW input event information. You may also request
other RAW input events using the SET RAW EVENTS (aSRE) and RESET RAW EVENTS (aRRE)
control sequences discussed below. See "Selection of RAW input events" for details.
If you issue a RAW input request and there is no pending input, the read command waits until some
input is received. You can test for characters pending by doing "WaitforChar" requests.
In the default state, the function and arrow keys cause the following sequences to be sent to your
process:
Fl <CSI>0 <CSI>1(T
F2 <CSI>1
F3 <CSI>2 <CSI>12~
F4 <CSI>3 <CSI>13~
F5 <CSI>4 <CSI>14~
F6 <CSI>5 <CSI>15~
F7 <CSI>6 <CSI>16~
F8 <CSI>7 <CSI>17~
F9 <CSI>8 <CSI>18~
F10 <CSI>9 <CSI>19~
HELP <CSI>? <CSI>?~ (same)
Arrow keys:
Up <CSI>A
Down <CSI>B <CSI>S~
Left <CSI>C <CSI> A* (note space)
Right <CSI>D <CSI> @~ (note space)
If you are using RAW by default, you get the ANSI data and control sequences mentioned above. If this
does not give you enough information about input events, you can request additional information from
the console driver.
If, for example, you need to know when each key is pressed and released, you would request "RAW
keyboard input.11 This is done by writing "<CSI>1{" to the console. The following is a list of valid
RAW input requests:
A-8
AmigaDOS Developer's Manual Appendix A
Request
Number Description
If you select any of these events, you start to get information about the events in the following form:
<CSlxclass>;<subclass>;<keycode>;<qualifiers>;<x>;<y>;
<seconds>;<microseconds>|
<class > is the RAW input event type, from the above table.
<keycode> indicates which key number was pressed (see Figure A-l and Table A-2). This field can
also be used for mouse information.
The <qualifiers> field indicates the state of the keyboard and system. The qualifiers are defined as
follows:
A-9
Appendix A AmisaOOS Developer's Manual
The CAPS LOCK key is handled in a special manner. It only generates a keycode when it is pressed,
not when it is released. However, the up and down bit (80 hex) is still used and reported If pressing
the CAPS LOCK key turns on the LED, then key code 62 (CAPS LOCK pressed) is sent. Ifpressing the
caps lock key extinguishes the LED, then key code 190 (CAPS LOCK released) is sent. In effect, the
keyboard reports this key being held down until it is struck again.
The < seconds > and < microseconds > fields are system time stamp taken at the time the event
occurred. These values are stored as long-words by the system and as such could (theoretically) reach
4 billion.
With RAW: keyboard input, selected keys no longer return a simple 1 character "A" to flZfl but rather
return raw keycode reports with the following form:
<CSI>1;0;<keycode>;<qualifiers>;0 ? 0;<secs>;<microsecs>|
For example, if the user pressed and released the "B" key with the left SHIFT and right Amiga keys
also pressed, you might receive the following data:
<CSI>l;0;35?129;0;0;23987;99|
<CSI>l;0;163;129;0;0;24003;18|
The ff0;0;lf fields are for not used for keyboard input but are, rather used if you select mouse input. For
mouse input, these fields would indicate the X and Y coordinates of the mouse.
The <keycode > field is an ASCII decimal value representing the key pressed or released. Adding 128
to the pressed key code results in the released keycode. Figure A-l lets you convert quickly from a key
to its keycode. Table A-l lets you convert quickly from a keycode to a key.
A-10
AmigaDOS Developer's Manual Appendix A
ESC F2 F5 |F6
45 50 51 52 53 54 55 56 57 58 59 46
7 8 9
00 01 02 03 04 05 06 07 08 09 OA OB OC ODl 41 3D 3E 3F
TAB 4 5 6
42 10 11 12 13 14 15 16 17 18 19 1A ' IB 1 44 5F 2D
2
2E
3
2F
IftETURN 1
G
S D i
LOCK
63 62 20 21 22 23 24 25 26 27 28 29 2A| 2B 4C 1D IE 1F
SHIFT 0
60 30 31 32 33 34 35 36 37 38 39 3A 61 4F 4E OF 3C
ENTER
64 66 40 67 43
1) The values the CON: device returns when these keys are pressed, and
A-ll
Appendix A Amiga
AmigaDOS Developer's Manual
Table A-2
09 9 (
0A 0 )
OB - (Hyphen) _ (Underscore)
OC = +
OD \ i
OE (undefined)
OF 0 0 (Numeric pad)
10 Q q
11 W w
12 E e
13 R r
14 T t
15 Y y
16 U u
17 I i
18 0 o
19 P P
1A { [
IB } ]
1C (undefined)
ID 1 1 (Numeric pad)
IE 2 2 (Numeric pad)
IF 3 3 (Numeric pad)
20 A a
21 S s
22 D d
23 F f
24 G g
25 H h
26 J j
27 K k
28 L 1
A-12
AmigaDOS Developer's Manual Appendix A
29 •
•
•
r
2A tl
• (single quote)
2B (RESERVED) (RESERVED)
2C (undefined)
2D 4 4 (Numeric pad)
2E 5 5 (Numeric pad)
2F 6 6 (Numeric pad)
30 (RESERVED) (RESERVED)
31 Z z
32 X X
33 c c
34 V V
35 B b
36 N n
37 M m
38 < , (comma)
39 > • (period)
3A ? /
3B (undefined)
3C • • (Numeric pad)
3D 7 7 (Numeric pad)
3E 8 8 (Numeric pad)
3F 9 9 (Numeric pad)
40 Space
41 BACKSPACE
42 TAB
43 ENTER ENTER (Numeric
pad)
44 RETURN
45 Escape (Esc)
46 DEL
47 (undefined)
48 (undefined)
49 (undefined)
4A -
- (Numeric Pad)
4B (undefined)
4C Cursor Up Scroll down
4D Cursor Down Scroll up
4E Cursor Forward Scroll left
4F Cursor Backward Scroll right
50 Fl <CSI>1(T
51 F2 <CSI>11~
52 F3 <CSI>12~
53 F4 <CSI>13"
A-13
Appendix A Ami
AmigaDOS Developer's Manual
54 F5 <CSI>14~
55 F6 <CSI>15~
56 F7 <CSI>16~
57 F8 <CSI>17~
58 F9 <CSI>18~
59 F10 <CSI>19~
5A (undefined)
5B (undefined)
5C (undefined)
5D (undefined)
5E (undefined)
5F Help
60 SHIFT (left of space bar)
61 SHIFT (right of space bar)
62 Caps Lock
63 Control
64 Left Alt
65 Right Alt
66 "Amiga" (left of space bar)
67 "Amiga" (right of space bar)
68 Left Mouse Button
(not converted) Inputs are only
for the
69 Right Mouse Button
(not converted) mouse connected
to Intuition,
6A Middle Mouse Button
(not converted) currently
"gameport" one.
6B (undefined)
6C (undefined)
6D (undefined)
6E (undefined)
6F (undefined)
70-7F (undefined)
80-F8 Up transition (release or unpress
key) of one of the above keys.
80 for 00, F8 for 7F.
F9 Last keycode was bad (was sent in
order to resync)
FA Keyboard buffer overflow.
FB (undefined, reserved for keyboard
processor catastrophe)
FC Keyboard self-test failed.
A-14
AmigaDOS Developer's Manual Appendix A
Raw Unshifted
Key Default
Number Value
1) "(undefined)" indicates that the current keyboard design should not generate this
number. If you are using "SetKeyMap" to change the key map, the entries for these
numbers must still be included.
2) The "(not converted)" refers to mouse button events. You must use the sequence
"<CSI>2{" to inform the console driver that you wish to receive mouse events;
otherwise, these are not transmitted.
3) "(RESERVED)" indicates that these keycodes have been reserved for non-US keyboards.
The "2B" code key is between the double quote and return keys. The "30" code key is
between the SHIFT and Z keys.
A-15
AmisaDOS Developer's Manual Index
-l-
Index AmigaDOS Developer's Manual
-ii-
AmigaDOS Developer's Manual Index
-iii-
Index AmieraDOS Develoner's Manual
IV
Ami&aDOS Developer's Manual Index
-v-
Index AmigaDOS Developer's Manual
-vi-
Commodore Business Machines, Inc.
1200 Wilson Drive, West Chester, PA 19380