mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
199 lines
10 KiB
Plaintext
199 lines
10 KiB
Plaintext
as68 - assembler for the Motorola 68000 The REGULUS assembler
|
|
'as' is designed to be used in conjunction with the other RE-
|
|
GULUS standard language processing tools: c68 and lo68. The
|
|
language implemented is primarily as is described in any of the
|
|
standard 68000 assembler manuals, with a few enhancements to
|
|
make it accept some of the more standard assembler mnemonics.
|
|
It will attempt to optimize instructions to take advantage of
|
|
certain 68000 instructions (for example the add quick instruc-
|
|
tion).
|
|
|
|
The following instructions are recoginized to aid the assembly
|
|
language programmer by making the assembly language more regu-
|
|
lar: clr.x An (where x is l,b, or w) is allowed and will actual-
|
|
ly generate a suba.x An,An instruction; add, sub, cmp with an A
|
|
register source/destination are allowed and generate adda, suba,
|
|
cmpa; add, and, cmp, eor, or, sub are allowed with immediate
|
|
first operands and actually generate addi, andi, cmpi, eori,
|
|
ori, subi instructions if the second operand is not register
|
|
direct; any shift instruction with no shift count specified as-
|
|
sumes a shift count of one (ie. "asl r1" is equivalent to "asl
|
|
#1,r1"); the mnemonics 'inc' and 'dec' are also recognized and
|
|
are functionally equivilent to "addq 1" or "subq 1". Several
|
|
mnemonics have been added to the standard set of condition code
|
|
instructions: 'bt' maps to 'bra', 'bhs' maps to 'bhis', 'bnz'
|
|
maps to 'bne', 'bze' maps to 'beq', 'dbhs' maps to 'dbhi',
|
|
'dblo' maps to 'dbcs', 'dbnz' maps to 'dbne', 'dbze' maps to
|
|
'dbeq', 'shs' maps to 'scc', 'slo' maps to 'scc', 'snz' maps to
|
|
'sne', and 'sze' maps to 'seq'.
|
|
|
|
Several optimizations take place. All branch instructions gen-
|
|
erate short relative branches where possible, including forward
|
|
references. 'jsr' instructions are changed to 'bsr' instruc-
|
|
tions if the resulting 'bsr' is shorter than the 'jsr'. 'move',
|
|
'add', 'sub' mnemonics will actually generate 'moveq', 'addq',
|
|
and 'suba' instructions where possible. If a 'move' instruction
|
|
rather than a 'moveq' instruction is desired (affecting only
|
|
lower byte or word of D register), the size attribute must be
|
|
explicitly coded ie. move.b or move.w. The assembler will
|
|
change any move or move.l to moveq if possible.
|
|
|
|
All labels must terminate with a ':', unless they start in
|
|
column 1. Registers may be referenced as r0 - r15, R0 - R15, D0
|
|
- D7, d0 - d7, A0 - A7, or a0-a7. Registers R8 - R15 are the
|
|
same as A0 - A7. Numbers are interpreted as decimal. Hexide-
|
|
cimal may be specified by preceding the number by a dollar sign
|
|
($) and numbers which begin with a preceeding zero (0) are as-
|
|
sumed to be octal.
|
|
|
|
REGULUS assembler directives can be specified in upper and/or
|
|
lower case characters and may be preceded by an optional dot
|
|
(.). The following directives have been implemented:
|
|
|
|
text
|
|
data
|
|
bss
|
|
These three directives instruct the assembler to
|
|
change the assembler base segment to the text, data,
|
|
or bss segment respectively. Each assembly starts in
|
|
the text segment. It is illegal to assemble instruc-
|
|
tions or data into the bss segment. Symbols may be
|
|
defined and storage may be reserved using the .ds
|
|
directive in the bss segment.
|
|
|
|
section #
|
|
This directive is used to define a base segment like
|
|
the .bss, .data and .text directives discussed above.
|
|
The sections can be numbered 0 to 15 inclusive. Sec-
|
|
tion 14 maps to data, section 15 is bss and all the
|
|
others are text sections.
|
|
|
|
globl name[,name...]
|
|
xdef name[,name...]
|
|
xref name[,name...]
|
|
These directives make the name(s) external. If they
|
|
are defined in the current assembly, this statement
|
|
makes these names available to other routines during a
|
|
load by lo68. If these names are not defined in the
|
|
current assembly, they become undefined external
|
|
references and lo68 will link them to external values
|
|
of the same name in other routines. Specifying the -u
|
|
flag will force the assembler to make all undefined
|
|
names external.
|
|
|
|
comm name,expression
|
|
This directive defines a named block common area.
|
|
When several routines are linked together with lo68,
|
|
all block common areas with the same name are loaded
|
|
at the same address. The size of this block common
|
|
storage area is the largest value of the expression
|
|
part of all 'comm' directives with the same name. No
|
|
error message is produced if the areas are of dif-
|
|
ferent sizes.
|
|
|
|
even
|
|
If the location counter is odd, it is incremented by
|
|
one so that the next instruction or data field will
|
|
begin on an even memory boundary.
|
|
|
|
The relocation counter may be manipulated with a
|
|
statement like:
|
|
*=expr
|
|
Care should be exercised when using this facility.
|
|
The expression may only move the relocation counter
|
|
forward. The unused space is filled with zeroes in
|
|
the text or data segments and is simply not assigned
|
|
in the bss segment. This facility requires the assem-
|
|
bler to not allow comment lines which begin with "*=".
|
|
Comments beginning with "* =" are allowed.
|
|
|
|
org expression
|
|
This directive is used to change the program counter
|
|
to the specified address. The expression must not
|
|
contain any external references and must be computable
|
|
at the time of assembly.
|
|
|
|
ds[.x] operand
|
|
This is the directive used to define storage. Storage
|
|
can be defined in bytes, words or long words depending
|
|
upon the extension specified ('b', 'w', 'l' where word
|
|
is the default). The memory is not initialized, just
|
|
reserved. Word or long defined storage will be
|
|
aligned on a word boundary.
|
|
|
|
comline expression
|
|
This directive is identical to the 'ds.b' instruction.
|
|
The specified argument must be a constant expression.
|
|
|
|
equ expression
|
|
set expression
|
|
Currently 'set' and 'equ' are implemented exactly the
|
|
same. These directives are used to assign a value to
|
|
the specified label. This non-optional label may not
|
|
be redefined elsewhere in the program. It can then be
|
|
used anywhere that a constant is required and will be
|
|
evaluated to the specified value.
|
|
|
|
end
|
|
The 'end' directive specifies the end of the assembler
|
|
text. It is not required for appropriate assembly.
|
|
If it is not at the end of the text an error will be
|
|
reported.
|
|
|
|
offset expression
|
|
This directive creates a dummy storage section using
|
|
the 'ds' directive. No code generating instructions
|
|
may occur. It is terminated by a 'section', 'data',
|
|
'bss', 'text' or 'end'. The offset table begins at
|
|
the address specified in the expression. The 'set',
|
|
'equ', 'reg', 'xref', 'xdef', 'globl', 'offset', and
|
|
any conditional directive may appear inside.
|
|
|
|
dcb[.x] size,value
|
|
Just like the dc.b command. Defines a constant block
|
|
of the specified size of bytes, words or longs.
|
|
|
|
reg reglist
|
|
This directive builds a register mask which can be
|
|
used by the movem instruction. One or more registers
|
|
can be listed in increasing order of the form : 'R?[-
|
|
R?[/R?[-R?...]...]]'. Where R? can be replaced by
|
|
A0-A7, D0-D7 and R0-R15. The register list might look
|
|
like : A2-A4/A7/D1/D3-D5. The registers may also be
|
|
designated separated by commas (eg. A1,A2,D5,D7).
|
|
|
|
Conditional assembly directives can have any level of nesting.
|
|
The following conditional assembler directives have been imple-
|
|
mented:
|
|
|
|
ifeq expression
|
|
ifne expression
|
|
ifle expression
|
|
iflt expression
|
|
ifge expression
|
|
ifgt expression
|
|
The expression is tested against zero (with ifeq:
|
|
equal, ifne: not equal, ifle: less or equal, iflt:
|
|
less than, ifge: greater or equal, ifgt: greater) and
|
|
if it is evaluated true then the code enclosed is as-
|
|
sembled, otherwise the code is ignored until the
|
|
matching endc is found.
|
|
|
|
ifc 'string1','string2'
|
|
ifnc 'string1','string2'
|
|
The two strings are compared. The 'c' condition is
|
|
true if they are exactly the same, the 'nc' condition
|
|
is true if they do not match.
|
|
|
|
endc
|
|
Signifies the end of the code to be conditionally as-
|
|
sembled.
|
|
|
|
ASCII string constants may be enclosed in single quotes (ie.
|
|
'ABCD') or in double quotes (ie. "ac14").
|
|
|
|
Several directives are recognized, but ignored: 'mask2', 'idnt',
|
|
'ttl', 'opt', and 'page'.
|
|
|
|
as68(cmnd)
|