Initial revision
This commit is contained in:
parent
e4af749931
commit
b0d2a7c913
68
man/6500_as.6
Normal file
68
man/6500_as.6
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH 6500_AS 6ACK
|
||||||
|
.SH NAME
|
||||||
|
6500_as \- assembler for Mostek 6500
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/6500/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler-loader.
|
||||||
|
Output is in \fIack.out\fP(5) object format, but not relocatable.
|
||||||
|
.SH "SECTIONS and TYPES"
|
||||||
|
An additional section, the \fIzeropage\fP, can be started by the
|
||||||
|
\&\fI.sect .zero\fP pseudo-instruction.
|
||||||
|
Some adressing-modes require an address between 0 and 255.
|
||||||
|
Such an address must be defined with the means of the \fI.sect .zero\fP
|
||||||
|
pseudo-instruction.
|
||||||
|
A plain number between 0 and 255 is not allowed.
|
||||||
|
The assembler will complain that it must be a zero page expression.
|
||||||
|
.IP example
|
||||||
|
\&.sect .zero
|
||||||
|
.br
|
||||||
|
answer: .space 1
|
||||||
|
.br
|
||||||
|
\&.text
|
||||||
|
.br
|
||||||
|
and (answer, x)
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP expressions
|
||||||
|
An two-byte expression followed by the pseudo-operator \fI.h\fP (\fI.l\fP)
|
||||||
|
has the value of the higher (lower) byte of the expression.
|
||||||
|
\&\fI.h\fP and \fI.l\fP bind stronger than all other operators.
|
||||||
|
E.g. -1.h parses as -[1.h] which has value 0.
|
||||||
|
You have to write [-1].h to get 0xFF.
|
||||||
|
.IP "addressing modes"
|
||||||
|
.nf
|
||||||
|
.ta 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning (name)
|
||||||
|
|
||||||
|
#expr 8-bit value (immediate)
|
||||||
|
|
||||||
|
expr address (direct)
|
||||||
|
|
||||||
|
expr, x expr + contents of x
|
||||||
|
or or
|
||||||
|
expr, y expr + contents of y
|
||||||
|
yields address (indexed)
|
||||||
|
|
||||||
|
(expr) address of address (only with JMP) (indirect)
|
||||||
|
.fi
|
||||||
|
|
||||||
|
In the next two addressing modes \fIexpr\fP has to be
|
||||||
|
a zeropage expression.
|
||||||
|
|
||||||
|
.nf
|
||||||
|
(expr, x) expr + contents of x
|
||||||
|
yields address (pre-indexed indirect)
|
||||||
|
|
||||||
|
(expr), y contents of expr + contents of y
|
||||||
|
yields address (post-indexed indirect)
|
||||||
|
.fi
|
||||||
|
.IP instructions
|
||||||
|
There are two mnemonics that do not map onto one machine-instruction:
|
||||||
|
\fIadd\fP and \fIsub\fP. \fIAdd mode\fP maps onto \fIclc; adc mode\fP.
|
||||||
|
\fISub mode\fP maps onto \fIsec; sbc mode\fP.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(6),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5),
|
54
man/6800_as.6
Normal file
54
man/6800_as.6
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH 6800_AS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
6800_as \- assembler for Motorola 6800
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/6800/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler generating relocatable
|
||||||
|
object code in \fIAck.out\fP(5) format.
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP registers
|
||||||
|
The 6800 has two accumulator registers, A and B. An instruction that refers
|
||||||
|
to accumulator A, has an "a" as last character. In the same way a "b" means
|
||||||
|
that the instruction uses B as accumulator.
|
||||||
|
.IP "addressing modes"
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning (name)
|
||||||
|
|
||||||
|
#expr with cpx, ldx, lds a 2-byte value,
|
||||||
|
otherwise a 1-byte value (immediate)
|
||||||
|
|
||||||
|
<expr 1-byte address. Not allowed with:
|
||||||
|
asl, asr, clr, com, dec, inc, lsl, lsr,
|
||||||
|
neg, rol, ror, tst (base page direct)
|
||||||
|
|
||||||
|
expr 2-byte address (extended direct)
|
||||||
|
|
||||||
|
expr, x 1-byte expr + contents of x
|
||||||
|
yields address (indexed)
|
||||||
|
.fi
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(6),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5)
|
||||||
|
.br
|
||||||
|
A. Osborne, 6800 programming for logic design,
|
||||||
|
Adam Osborne and Associates Inc., 1977
|
||||||
|
.SH EXAMPLE
|
||||||
|
An example of Motorola 6800 assembly code.
|
||||||
|
.sp 2
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 32n 40n 48n 56n 64n
|
||||||
|
.sect .text; .sect .data
|
||||||
|
val: 0
|
||||||
|
.sect .text
|
||||||
|
ldx <val
|
||||||
|
com val, x
|
||||||
|
bhs someplace ! branch on carry clear
|
||||||
|
sta <val
|
||||||
|
adda #18 ! add 18 to accumulator A
|
||||||
|
.fi
|
71
man/6805_as.6
Normal file
71
man/6805_as.6
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH 6805_AS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
6805_as \- assembler for Motorola 6805
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/6805/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler generating relocatable
|
||||||
|
object code in \fIack.out\fP(5) format.
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP registers
|
||||||
|
The 6805 has an accumulator register A and an index register X. An
|
||||||
|
instruction (from the read-modify-write group) that references the
|
||||||
|
A-register has an "a" suffixed to the mnemonic. In a similar way
|
||||||
|
the X-register, apart from indexing operations, is addressed with
|
||||||
|
an "x" suffix, i.e. "lsra" and "negx".
|
||||||
|
.IP "addressing modes"
|
||||||
|
The assembler automatically selects the shortest opcode if
|
||||||
|
appropriate and possible. Thus "sub 10" will use the direct
|
||||||
|
addressing mode whereas "neg 0,x" will use indexed (no offset) mode.
|
||||||
|
There are sick constructions where the assembler can't find out
|
||||||
|
the shortest form in time. In those cases the longest form is used.
|
||||||
|
.br
|
||||||
|
Branches are handled in much the same way. If a branch is out of
|
||||||
|
range it is replaced by a reversed condition branch, followed by
|
||||||
|
a jump, automatically.
|
||||||
|
.sp
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning (name)
|
||||||
|
|
||||||
|
#expr a one byte value (immediate)
|
||||||
|
<expr 1-byte zero page address. Allowed in
|
||||||
|
the register/memory and read-modify-
|
||||||
|
write instruction groups. (direct)
|
||||||
|
>expr 2-byte address. Allowed in the register
|
||||||
|
memory group. (extended)
|
||||||
|
expr 1-byte address if appropriate, 2-byte
|
||||||
|
in other cases. (auto-direct/extended)
|
||||||
|
,x indexed with zero offset. (indexed)
|
||||||
|
<expr,x indexed with 8 bit offset. (indexed-1)
|
||||||
|
>expr,x indexed with 16 bit offset. (indexed-2)
|
||||||
|
expr,x indexed with the shortest possible off-
|
||||||
|
set. (auto indexed)
|
||||||
|
bit,expr bit number and direct address.
|
||||||
|
(bit set/clear)
|
||||||
|
bit,expr,tag bit number, direct address and branch
|
||||||
|
tag. Automatically changed to reversed
|
||||||
|
condition branch and jump if appropri-
|
||||||
|
ate. (bit test and branch)
|
||||||
|
tag branch tag. Converted to reversed con-
|
||||||
|
dition branch and jump if appropriate.
|
||||||
|
(branch)
|
||||||
|
.fi
|
||||||
|
.IP "PSEUDO INSTRUCTIONS"
|
||||||
|
|
||||||
|
.cmos assemble cmos version instructions.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(6),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5)
|
||||||
|
.br
|
||||||
|
M6805 HMOS, M146805 CMOS family, Motorola,
|
||||||
|
Prentice-Hall, Inc., 1983, (ISBN 0-13-541375-3).
|
||||||
|
.SH AUTHOR
|
||||||
|
Written by Gijs Mos.
|
||||||
|
Not a member of the ACK group.
|
||||||
|
.SH BUGS
|
||||||
|
The assembler has not been well tested.
|
150
man/6809_as.6
Normal file
150
man/6809_as.6
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH 6809_AS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
6809_as \- assembler for 6809
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/6809/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler generating relocatable
|
||||||
|
object code in \fIack.out\fP(5) format.
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP registers
|
||||||
|
The 6809 contains four 8-bit registers registers:
|
||||||
|
two accumulators (a and b),
|
||||||
|
a direct page register (dp),
|
||||||
|
and a condition code register (cc),
|
||||||
|
and five 16-bit registers:
|
||||||
|
two index registers (x and y),
|
||||||
|
a user an a hardware stack pointer (u resp. s),
|
||||||
|
and a program counter (pc).
|
||||||
|
The index registers and the stack pointers are indexable.
|
||||||
|
Accumulators a and b can be concatenated to form
|
||||||
|
the double accumulator d,
|
||||||
|
of which a is the high and b is the low byte.
|
||||||
|
An instruction that refers to accumulator a
|
||||||
|
has an "a" as last character.
|
||||||
|
In the same way a "b" means that the instruction
|
||||||
|
uses b as accumulator.
|
||||||
|
.IP "pseudo instructions"
|
||||||
|
The 6809 assembler recognizes one additional instruction
|
||||||
|
that is not translated into a machine instruction: setdp.
|
||||||
|
It expects an expression as argument.
|
||||||
|
This is used for efficient address encoding of some addressing
|
||||||
|
mode (see below).
|
||||||
|
.IP "addressing modes"
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning (name)
|
||||||
|
|
||||||
|
reg The operand of the instruction is in \fIreg\fP.
|
||||||
|
|
||||||
|
reglist \fIreglist\fP is a either list of registers, seperated
|
||||||
|
by ','s, or the word "all". It encodes in a register
|
||||||
|
save mask, where "all" means all registers, that can
|
||||||
|
be used by the push-pull instructions pshs, pshu,
|
||||||
|
puls, and pulu.
|
||||||
|
|
||||||
|
<expr The one-byte value of \fIexpr\fP is an address within
|
||||||
|
a 256-byte page. The particular page in use is
|
||||||
|
indicated by the contents of dp, so \fIexpr\fP is the
|
||||||
|
low byte of the effective address of the operand,
|
||||||
|
and dp the high byte. (direct)
|
||||||
|
|
||||||
|
>expr The two-byte value of \fIexpr\fP is the exact memory
|
||||||
|
address. Not that this mode always requires one
|
||||||
|
byte more than "<expr". (extended)
|
||||||
|
|
||||||
|
expr The value of \fIexpr\fP is an address.
|
||||||
|
Except for long branches, this value is examined
|
||||||
|
first to see if a short encoding is possible.
|
||||||
|
When the instruction is a short branch, the value
|
||||||
|
is checked to see if the address is not too remote,
|
||||||
|
because in that case this branch is automatically
|
||||||
|
replaced by a long branch. When the instruction is
|
||||||
|
not a branch, the high byte of the value is compared
|
||||||
|
with the value of the argument of the last setdp
|
||||||
|
pseudo. If they are equal, this mode is replaced by
|
||||||
|
"<expr", else by ">expr".
|
||||||
|
(relative for branch-instructions)
|
||||||
|
|
||||||
|
#expr The value of \fIexpr\fP is one- or two-byte immediate
|
||||||
|
data. (immediate)
|
||||||
|
|
||||||
|
(expr) The value of \fIexpr\fP is a pointer to the address
|
||||||
|
of the operand. (indirect)
|
||||||
|
|
||||||
|
expr, reg The value of \fIexpr\fP added to the contents of \fIreg\fP
|
||||||
|
(which must be a 16-bit register) yields the
|
||||||
|
effective address of the operand.
|
||||||
|
(constant-offset indexed)
|
||||||
|
|
||||||
|
, ireg The contents of \fIireg\fP (which must be indexable)
|
||||||
|
yields the effective address of the operand.
|
||||||
|
(constant-offset indexed)
|
||||||
|
|
||||||
|
(expr, reg) The value of \fIexpr\fP added to the contents of \fIreg\fP
|
||||||
|
(which must be a 16-bit register) yields a pointer
|
||||||
|
to the effective address of the operand.
|
||||||
|
(constant-offset indexed indirect)
|
||||||
|
|
||||||
|
(, ireg) The contents of \fIireg\fP (which must be indexable)
|
||||||
|
yields a pointer to the effective address of the
|
||||||
|
operand. (constant-offset indexed indirect)
|
||||||
|
|
||||||
|
ac, ireg The contents of \fIac\fP (which must be an accumulator)
|
||||||
|
added to the contents of \fIireg\fP (which must be
|
||||||
|
indexable) yields the effective address of the
|
||||||
|
operand. (accumulator indexed)
|
||||||
|
|
||||||
|
(ac, ireg) The contents of \fIac\fP (which must be an accumulator)
|
||||||
|
added to the contents of \fIireg\fP (which must be
|
||||||
|
indexable) yields a pointer to the effective address
|
||||||
|
of the operand. (accumulator indexed indirect)
|
||||||
|
|
||||||
|
,ireg+
|
||||||
|
,ireg++ The contents of \fIireg\fP (which must be indexable) is
|
||||||
|
used as effective address of the operand. After that
|
||||||
|
it is incremented by 1 (+) or 2 (++).
|
||||||
|
(auto-increment)
|
||||||
|
|
||||||
|
(,ireg++) The contents of \fIireg\fP (which must be indexable) is
|
||||||
|
used as a pointer to the effective address of the
|
||||||
|
operand. After that it is incremented by 2.
|
||||||
|
(auto-increment indirect)
|
||||||
|
|
||||||
|
,-ireg
|
||||||
|
,--ireg \fIireg\fP (which must be indexable) is decremented
|
||||||
|
by 1 (-) or 2 (--). After that, its contents is used
|
||||||
|
as effective address of the operand.
|
||||||
|
(auto-decrement)
|
||||||
|
|
||||||
|
(,--ireg) \fIireg\fP (which must be indexable) is decremented by 2.
|
||||||
|
After that, its contents is used as a pointer to the
|
||||||
|
effective address of the operand.
|
||||||
|
(auto-decrement indirect)
|
||||||
|
|
||||||
|
.fi
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(6),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5),
|
||||||
|
.br
|
||||||
|
MC6809 preliminary programming manual, Motorola Inc., First Edition, 1979
|
||||||
|
.SH EXAMPLE
|
||||||
|
An example of 6809 assembly code.
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
.sect .text
|
||||||
|
contby = 80
|
||||||
|
|
||||||
|
compgo: lda #contby
|
||||||
|
ldx #table - 2 !start of table
|
||||||
|
|
||||||
|
clrb
|
||||||
|
co1: addb #2
|
||||||
|
lsra
|
||||||
|
bcc co1
|
||||||
|
jmp (b, x) !accumulator offset indirect
|
||||||
|
.fi
|
38
man/8080_as.6
Normal file
38
man/8080_as.6
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH 8080_AS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
8080_as \- assembler for Intel 8080 and 8085
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/8080/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler generating relocatable
|
||||||
|
object code in \fIack.out\fP(5) format.
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP registers
|
||||||
|
The 8080 has seven one-byte registers: a, b, c, d, e, h, l;
|
||||||
|
and two two-byte registers: sp and psw, respectively the stack pointer
|
||||||
|
and the processor status word.
|
||||||
|
.IP "addressing modes"
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning
|
||||||
|
|
||||||
|
expr one- or two-byte address or immediate
|
||||||
|
data, depending on the instruction.
|
||||||
|
|
||||||
|
a,b,c,d,e,h,l
|
||||||
|
sp,psw (lower byte) of register
|
||||||
|
|
||||||
|
b,d,h register-pair b-c, d-e, or h-l
|
||||||
|
|
||||||
|
m register-pair h-l is address of
|
||||||
|
(one or two byte) operand
|
||||||
|
.fi
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(1),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5),
|
||||||
|
.br
|
||||||
|
System 80/20-4 microcomputer hardware reference manual, 1978 Intel corporation
|
137
man/i86_as.6
Normal file
137
man/i86_as.6
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH I86_AS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
i86_as \- assembler for Intel 8086
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/i86/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler generating relocatable
|
||||||
|
object code in \fIack.out\fP(5) format.
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP segments
|
||||||
|
An address on the Intel 8086 consists of two pieces:
|
||||||
|
a segment number and an offset. A memory address is computed as
|
||||||
|
the segment number shifted left 4 bits + the offset.
|
||||||
|
Assembly language addresses only give the offset, with the exception of
|
||||||
|
the address of an inter-segment jump or call (see \fIaddressing modes\fP
|
||||||
|
below).
|
||||||
|
.IP registers
|
||||||
|
The Intel 8086 has the following 16-bit registers:
|
||||||
|
.br
|
||||||
|
Four general registers: ax (accumulator), bx (base), cx (count), and dx (data).
|
||||||
|
The upper halves and lower halves of these registers are separately
|
||||||
|
addressable as ah, bh, ch, dh, and al, bl, cl, dl respectively.
|
||||||
|
.br
|
||||||
|
Two pointer registers: sp (stack pointer) and bp (base pointer).
|
||||||
|
.br
|
||||||
|
Two index registers: si (source index) and di (destination index).
|
||||||
|
.br
|
||||||
|
Four segment registers: cs (code), ds (data), ss (stack), and es (extra).
|
||||||
|
.IP "addressing modes"
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning
|
||||||
|
|
||||||
|
expr the value of \fIexpr\fP is immediate data or
|
||||||
|
an address offset. There is no special
|
||||||
|
notation for immediate data.
|
||||||
|
|
||||||
|
register one of the aforementioned general registers
|
||||||
|
or their upper or lower halves, or one of the
|
||||||
|
four segment registers.
|
||||||
|
|
||||||
|
(expr) the value of expr is the address of the operand.
|
||||||
|
|
||||||
|
(reg)
|
||||||
|
expr (reg) the value of \fIexpr\fP (if present) + the contents of
|
||||||
|
\fIreg\fP (which must be a pointer or an index register)
|
||||||
|
is the address of the operand.
|
||||||
|
|
||||||
|
(preg) (ireg)
|
||||||
|
expr (preg) (ireg)
|
||||||
|
the value of \fIexpr\fP (if present) + the contents of
|
||||||
|
\fIpreg\fP (which must be a pointer register) + the
|
||||||
|
contents of \fIireg\fP (which must be an index register)
|
||||||
|
is the address of the operand.
|
||||||
|
|
||||||
|
The next addressing mode is only allowed with the instructions
|
||||||
|
"callf" or "jmpf".
|
||||||
|
|
||||||
|
expr : expr the value of the first \fIexpr\fP is a segment number,
|
||||||
|
the value of the second \fIexpr\fP is an address offset.
|
||||||
|
The (absolute) address of the operand is computed
|
||||||
|
as described above.
|
||||||
|
.fi
|
||||||
|
|
||||||
|
.IP instructions
|
||||||
|
Each time an address is computed the assembler decide which segment register
|
||||||
|
to use. You can override the assembler's choice by prefixing the instruction
|
||||||
|
with one of eseg, cseg, sseg, or dseg; these prefixes indicate that the
|
||||||
|
assembler should choose es, cs, ss, or ds instead.
|
||||||
|
.br
|
||||||
|
Example:
|
||||||
|
.ti +8
|
||||||
|
dseg movs
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(6),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5),
|
||||||
|
.br
|
||||||
|
MCS-86 assembly language reference manual, 1978, Intel Corporation
|
||||||
|
.SH EXAMPLE
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
An example of Intel 8086 assembly language:
|
||||||
|
|
||||||
|
.sect .text
|
||||||
|
_panic:
|
||||||
|
push bp
|
||||||
|
mov bp,sp
|
||||||
|
.sect .data
|
||||||
|
_35:
|
||||||
|
.word 24944
|
||||||
|
.word 26990
|
||||||
|
.word 14947
|
||||||
|
.word 32
|
||||||
|
.sect .text
|
||||||
|
call _disable
|
||||||
|
mov ax,_35
|
||||||
|
push ax
|
||||||
|
call _str
|
||||||
|
pop si
|
||||||
|
push 4(bp)
|
||||||
|
call _str
|
||||||
|
pop si
|
||||||
|
call _nlcr
|
||||||
|
call _exit
|
||||||
|
mov sp,bp
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
.extern _nopanic
|
||||||
|
_nopanic:
|
||||||
|
push bp
|
||||||
|
mov bp,sp
|
||||||
|
.sect .data
|
||||||
|
_38:
|
||||||
|
.word 28526
|
||||||
|
.word 24944
|
||||||
|
.word 26990
|
||||||
|
.word 14947
|
||||||
|
.word 32
|
||||||
|
.sect .text
|
||||||
|
mov ax,_38
|
||||||
|
push ax
|
||||||
|
call _str
|
||||||
|
pop si
|
||||||
|
push 4(bp)
|
||||||
|
call _str
|
||||||
|
pop si
|
||||||
|
push 6(bp)
|
||||||
|
call _octal
|
||||||
|
pop si
|
||||||
|
mov sp,bp
|
||||||
|
pop bp
|
||||||
|
ret
|
||||||
|
.fi
|
100
man/m68k2_as.6
Normal file
100
man/m68k2_as.6
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH M68K2_AS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
m68k2_as \- assembler for Motorola 68000
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/m68k2/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler generating relocatable
|
||||||
|
object code in \fIack.out\fP(5) format.
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP registers
|
||||||
|
The 68000 has the following registers:
|
||||||
|
seven data-registers (d1 - d7), seven address-registers (a1 - a6, sp)
|
||||||
|
of which sp is the system stack pointer, a program counter (pc),
|
||||||
|
a status register (sr), and a condition codes register (ccr) which is actually
|
||||||
|
just the low order byte of the status register.
|
||||||
|
.IP "addressing modes"
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning (name)
|
||||||
|
|
||||||
|
reg contents of \fIreg\fP is operand, where \fIreg\fP is
|
||||||
|
one of the registers mentioned above (register direct)
|
||||||
|
|
||||||
|
(areg) contents of \fIareg\fP is address of operand, where
|
||||||
|
\fIareg\fP is an address-register
|
||||||
|
(address register indirect)
|
||||||
|
|
||||||
|
(areg)+ same as (areg), but after the address is used,
|
||||||
|
\fIareg\fP is incremented by the operand length
|
||||||
|
(postincrement)
|
||||||
|
|
||||||
|
-(areg) same as (areg), but before the address is used,
|
||||||
|
\fIareg\fP is decremented by the operand length
|
||||||
|
(predecrement)
|
||||||
|
|
||||||
|
expr(areg)
|
||||||
|
expr(pc) \fIexpr\fP + the contents of the register yields the
|
||||||
|
address of the operand (displacement)
|
||||||
|
|
||||||
|
expr(areg, ireg)
|
||||||
|
expr(pc, ireg) \fIexpr\fP + the contents of the register + the contents
|
||||||
|
of \fIireg\fP yields the address of the operand. \fIireg\fP is
|
||||||
|
an address- or a data-register.
|
||||||
|
\fIireg\fP may be followed by .w or .l indicating whether
|
||||||
|
the size of the index is a word or a long
|
||||||
|
(displacement with index)
|
||||||
|
|
||||||
|
expr \fIexpr\fP is the address of the operand
|
||||||
|
(absolute address)
|
||||||
|
|
||||||
|
#expr \fIexpr\fP is the operand (immediate)
|
||||||
|
.fi
|
||||||
|
|
||||||
|
Some instructions have as operand a register list. This list consists of
|
||||||
|
one or more ranges of registers separated by '/'s. A register range consists
|
||||||
|
of either one register (e.g. d3) or two registers separated by a '-'
|
||||||
|
(e.g. a2-a4, or d4-d5). The two registers must be in the same set (address-
|
||||||
|
or data-registers) and the first must have a lower number than the second.
|
||||||
|
.IP instructions
|
||||||
|
Some instructions can have a byte, word, or longword operand.
|
||||||
|
This may be indicated by prepending the mnemonic with .b, .w, or .l
|
||||||
|
respectively. Default is .w.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(6),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5),
|
||||||
|
.br
|
||||||
|
MC68000 16-bit microprocessor User's manual, Motorola Inc, 1979
|
||||||
|
.SH EXAMPLE
|
||||||
|
.sp 2
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n 56n 64n
|
||||||
|
.define .cii
|
||||||
|
|
||||||
|
.sect .text
|
||||||
|
.cii:
|
||||||
|
movem.l a0/d0/d1,.savreg
|
||||||
|
move.l (sp)+,a0 ! return address
|
||||||
|
move (sp)+,d0 ! destination size
|
||||||
|
sub (sp)+,d0 ! destination - source size
|
||||||
|
bgt 1f
|
||||||
|
sub d0,sp ! pop extra bytes
|
||||||
|
bra 3f
|
||||||
|
1:
|
||||||
|
move (sp),d1
|
||||||
|
ext.l d1
|
||||||
|
swap d1
|
||||||
|
asr #1,d0
|
||||||
|
2:
|
||||||
|
move.w d1,-(sp)
|
||||||
|
sub #1,d0
|
||||||
|
bgt 2b
|
||||||
|
3:
|
||||||
|
move.l a0,-(sp)
|
||||||
|
movem.l .savreg,a0/d0/d1
|
||||||
|
rts
|
||||||
|
.fi
|
104
man/ns_as.6
Normal file
104
man/ns_as.6
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH NS_ASS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
ns_as \- National Semiconductor 16032 assembler/linker
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/ns/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The assembler for the National Semiconductor 16032 is based
|
||||||
|
on the universal assembler \fIuni_ass\fP(VI). It is an assembler generating
|
||||||
|
relocatable object code in \fIack.out\fP(5) format.
|
||||||
|
The mnemonics for the instructions are taken from the NS-16000
|
||||||
|
Programmers Reference Manual.
|
||||||
|
The syntax of the instruction operands is similar to the syntax used
|
||||||
|
in that manual,
|
||||||
|
although the meaning is sometimes quite different.
|
||||||
|
The cross assembler issued by National Semiconductor
|
||||||
|
associates a type (sb,..) with each symbol
|
||||||
|
and automatically generates sb offset mode for symbols of type sb.
|
||||||
|
This assembler does not record the types,
|
||||||
|
each symbol simply produces an untyped value.
|
||||||
|
.sp 1
|
||||||
|
The possible operands are:
|
||||||
|
.IP "general registers
|
||||||
|
These are called r0, r1, r2, r3, r4, r5, r6 and r7.
|
||||||
|
The symbol REG is used to indicate use of any of these 8 registers
|
||||||
|
in other operands.
|
||||||
|
.IP "floating point registers
|
||||||
|
These are called f0, f1, f2, f3, f4, f5, f6 and f7.
|
||||||
|
.IP "dedicated registers
|
||||||
|
All types of dedicated registers can be used with the appropriate instructions.
|
||||||
|
Examples: sb, fp, intbase, ptb1.
|
||||||
|
.IP expr(REG)
|
||||||
|
register relative
|
||||||
|
.IP expr(fp)
|
||||||
|
frame pointer relative
|
||||||
|
.IP expr(sb)
|
||||||
|
static base relative
|
||||||
|
.IP expr(sp)
|
||||||
|
stack pointer relative
|
||||||
|
.IP expr(pc)
|
||||||
|
program counter relative,
|
||||||
|
the expression indicates a location in memory from which the current value
|
||||||
|
of '.' is subtracted by the assembler.
|
||||||
|
E.g. "movw label(pc),r0; label: .word ..." moves the contents of the word
|
||||||
|
at \fIlabel\fP to r0.
|
||||||
|
.IP expr(expr(fb))
|
||||||
|
.IP expr(expr(sb))
|
||||||
|
.IP expr(expr(sp))
|
||||||
|
memory relative
|
||||||
|
.IP @expr
|
||||||
|
absolute
|
||||||
|
.IP external(expr)+expr
|
||||||
|
external
|
||||||
|
.IP tos
|
||||||
|
top of stack.
|
||||||
|
.PD 0
|
||||||
|
.sp 1
|
||||||
|
.PP
|
||||||
|
Usage of the scaled index operands is allowed.
|
||||||
|
.br
|
||||||
|
The convention used to indicate offset length by appending :B, :W or :D
|
||||||
|
to offsets is not implemented.
|
||||||
|
The assembler tries to find out the minimal size needed for any constant
|
||||||
|
in an operand of the instruction placed in the text segment.
|
||||||
|
Offsets in instructions outside \fI.text\fP are always four bytes.
|
||||||
|
.PP
|
||||||
|
All special operands, e.g. register list, configuration list, have
|
||||||
|
the same format as in the Programmers Reference Manual.
|
||||||
|
.PP
|
||||||
|
Whenever possible the assembler automatically uses the short(quick) opcodes for
|
||||||
|
jsr(jsb), jump(br), add(addq), cmp(cmpq) and mov(movq).
|
||||||
|
.SH BUGS
|
||||||
|
The data types floating and packed-decimal are not supported.
|
||||||
|
.br
|
||||||
|
Initialization of floating-point numbers is not possible.
|
||||||
|
.br
|
||||||
|
The mnemonics of the slave processor instructions are poorly documented,
|
||||||
|
the format of the NS-16032S-6 data sheet is used.
|
||||||
|
.br
|
||||||
|
The documentation gave contradictory information on the format
|
||||||
|
of a few instructions.
|
||||||
|
.IP -
|
||||||
|
Three different schemes are presented for the encoding
|
||||||
|
of the last operand of the block instructions.
|
||||||
|
.IP -
|
||||||
|
Two different values are specified for
|
||||||
|
the encoding of the msr register in smr and lmr instructions.
|
||||||
|
.IP -
|
||||||
|
Two different possibilities are given for the encoding of
|
||||||
|
the instructions movsu and movus.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(VI)
|
||||||
|
ack(1),
|
||||||
|
ack.out(5),
|
||||||
|
.br
|
||||||
|
NS 16000 Programmers Reference Manual. Publ. no. 420306565-001PB
|
||||||
|
.br
|
||||||
|
NS16032S-6, NS16032S-4 High Performance Microprocessors, november 1982
|
||||||
|
.br
|
||||||
|
publ. no. 420306619-002A.
|
||||||
|
.PD 0
|
||||||
|
.SH AUTHOR
|
||||||
|
Ed Keizer, Vrije Universiteit
|
141
man/pdp_as.6
Normal file
141
man/pdp_as.6
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH PDP_AS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
pdp_as \- assembler for PDP 11
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/pdp/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler generating relocatable
|
||||||
|
object code in \fIack.out\fP(5) format.
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP registers
|
||||||
|
The pdp11 has seven general registers, numbered r0 through r7.
|
||||||
|
Of these, r6 is the stack pointer and can also be referenced to by \fIsp\fP,
|
||||||
|
r7 is the program counter and has \fIpc\fP as synonym. There are also six
|
||||||
|
floating-point registers fr0 through fr5, but the names r0 through r5 can
|
||||||
|
also be used. From the context will be derived what kind of register is meant.
|
||||||
|
.IP "addressing modes"
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning (name)
|
||||||
|
|
||||||
|
reg contents of register reg is operand.
|
||||||
|
(register)
|
||||||
|
|
||||||
|
(reg) contents of reg is address of operand.
|
||||||
|
(register deferred)
|
||||||
|
|
||||||
|
(reg)+ as (reg), but after the operand is fetched
|
||||||
|
the contents of reg is incremented by the
|
||||||
|
size of the operand. (auto-increment)
|
||||||
|
|
||||||
|
*(reg)+ contents of reg points to address of the operand.
|
||||||
|
after the operand is fetched, reg is incremented
|
||||||
|
by two. (auto-increment deferred)
|
||||||
|
|
||||||
|
-(reg) as (reg), but before the operand is fetched
|
||||||
|
the contents of reg is decremented by the
|
||||||
|
size of the operand. (auto-decrement)
|
||||||
|
|
||||||
|
*-(reg) before the operand is fetched, reg is decremented
|
||||||
|
by two. then the contents of reg points to the
|
||||||
|
address of the operand. (auto-decrement deferred)
|
||||||
|
|
||||||
|
expr(reg) value of expr + contents of reg yields address
|
||||||
|
of operand. (index)
|
||||||
|
|
||||||
|
*expr(reg) value of expr + contents of reg yields pointer
|
||||||
|
to address of operand. (index deferred)
|
||||||
|
|
||||||
|
$expr the value of expr is the operand. (immediate)
|
||||||
|
|
||||||
|
*$expr the value of expr is the address of the operand.
|
||||||
|
(absolute)
|
||||||
|
|
||||||
|
expr expr is address of operand. (relative)
|
||||||
|
|
||||||
|
*expr expr points to the address of the operand.
|
||||||
|
(relative deferred)
|
||||||
|
|
||||||
|
.fi
|
||||||
|
.IP "condition code instructions"
|
||||||
|
Two or more of the "clear" instructions (clc, cln, clv, clz), or
|
||||||
|
two or more of the "set" instructions (sec, sen, sev, sez) may be
|
||||||
|
or-ed together with `|' to yield a instruction that clears or sets two or more
|
||||||
|
of the condition-bits. Scc and ccc are not predefined.
|
||||||
|
.IP "extended branches"
|
||||||
|
The assembler recognizes conditional branches with a "j" substituted for
|
||||||
|
the "b". When the target is too remote for a simple branch, a converse branch
|
||||||
|
over a jmp to the target is generated. Likewise jbr assembles into either br
|
||||||
|
or jmp.
|
||||||
|
.IP "floating-point instructions"
|
||||||
|
The names of several floating-point instructions differ from the names
|
||||||
|
in the handbook mentioned below. Synonyms ending in "d" for instructions ending
|
||||||
|
in "f" are not recognized. Some instructions have different names; the mapping
|
||||||
|
is as below.
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
|
||||||
|
handbook pdp_as
|
||||||
|
|
||||||
|
ldcif, ldclf,
|
||||||
|
ldcid, ldcld movif
|
||||||
|
|
||||||
|
stcfi, stcfl,
|
||||||
|
stcdi, stcdl movfi
|
||||||
|
|
||||||
|
ldcdf, ldcfd movof
|
||||||
|
|
||||||
|
stcdf, stcfd movfo
|
||||||
|
|
||||||
|
ldexp movie
|
||||||
|
|
||||||
|
stexp movei
|
||||||
|
|
||||||
|
ldd, ldf movf
|
||||||
|
|
||||||
|
std, stf movf
|
||||||
|
|
||||||
|
.fi
|
||||||
|
The movf instruction assembles into stf, when the first operand is one of the
|
||||||
|
first three floating-point registers, otherwise it assembles into ldf.
|
||||||
|
.IP sys
|
||||||
|
This instruction is synonymous with trap.
|
||||||
|
.SH EXAMPLE
|
||||||
|
An example of pdp11 assembly code.
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
|
||||||
|
!this is the routine that reads numbers into r0
|
||||||
|
!the number is terminated by any non digit
|
||||||
|
!the non digit is left in r1
|
||||||
|
.sect .text
|
||||||
|
innum: clr r3 !r3 will accumulate the number
|
||||||
|
inloop: jsr pc,_getchar !read a character into r0
|
||||||
|
cmp r0,$0121 !is it a Q?
|
||||||
|
jeq quit
|
||||||
|
cmp r0,$48 !is the character a digit?
|
||||||
|
jlt indone !digits 0-9 have codes 060-071 octal
|
||||||
|
cmp r0,$56
|
||||||
|
jgt indone
|
||||||
|
mul $10,r3 !r3 = 10 * r3
|
||||||
|
sub $48,r3 !convert ascii code to numerical value
|
||||||
|
add r0,r3 !r3 = old sum * 10 + new digi
|
||||||
|
jbr inloop
|
||||||
|
|
||||||
|
indone: mov r0,r1 !put the first non digit into r1
|
||||||
|
mov r3,r0 !put the number read into r0
|
||||||
|
rts pc !return to caller
|
||||||
|
|
||||||
|
.fi
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(6),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5),
|
||||||
|
.br
|
||||||
|
PDP11/60 processor handbook, Digital Equipment Corporation, 1977
|
||||||
|
.SH BUGS
|
||||||
|
You cannot use *reg in place of (reg). Likewise *(reg) is not understood as
|
||||||
|
*0(reg).
|
166
man/z8000_as.6
Normal file
166
man/z8000_as.6
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH Z8000_AS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
z8000_as \- assembler for Zilog z8000 (segmented version)
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/z8000/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler\-loader. Output is
|
||||||
|
in \fIack.out\fP(5) format, but not relocatable.
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP instructions
|
||||||
|
Instruction mnemonics are implemented exactly as described in
|
||||||
|
\fIZ8000 PLZ/ASM Assembly Language Programming Manual\fP and
|
||||||
|
\fIAmZ8001/2 Processor Instruction Set\fP.
|
||||||
|
.IP registers
|
||||||
|
The z8000 has sixteen 16-bit general purpose registers specified
|
||||||
|
as R0 through R15. All sixteen registers can be used as accumulators.
|
||||||
|
In addition to this, fifteen of the sixteen registers may be used
|
||||||
|
in addressing mode calculations as either indirect, index or
|
||||||
|
base-address registers. Because the instruction format encoding
|
||||||
|
uses the value zero to differentiate between various addressing
|
||||||
|
modes, register R0 (or the register pair RR0) cannot be used as an
|
||||||
|
indirect, index or base-address register.
|
||||||
|
It is also possible to address registers as groups of 8, 32 or 64 bits.
|
||||||
|
These registers are specified as follows.
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
- RH0, RL0, RH1, RL1, ..., RH7, RL7 for 8-bit regis-
|
||||||
|
ters. (\fIH\fP stands for high-order byte, and \fIL\fP stands
|
||||||
|
for low-order byte within a word register). These
|
||||||
|
registers overlap 16-bit registers R0 through R7.
|
||||||
|
- RR0, RR2, ..., RR14 for 32-bit register pairs.
|
||||||
|
- RQ0, RQ4, RQ8 and RQ12 for 64-bit register quadruples.
|
||||||
|
.fi
|
||||||
|
Besides register pair RR14 is used as stackpointer.
|
||||||
|
.IP "addressing modes"
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning (name-mnemonic)
|
||||||
|
|
||||||
|
$expr the value of expr is the operand.
|
||||||
|
(immediate-IM)
|
||||||
|
|
||||||
|
reg contents of register reg is operand. Any
|
||||||
|
register as described above is allowed.
|
||||||
|
(register-R)
|
||||||
|
|
||||||
|
*reg32 contents of register pair reg32 is add-
|
||||||
|
ress of operand. Any register pair can
|
||||||
|
be used except RR0.
|
||||||
|
(indirect register-IR)
|
||||||
|
|
||||||
|
expr expr is address of operand.
|
||||||
|
(direct address-DA)
|
||||||
|
|
||||||
|
expr(reg16) value of expr + contents of word regis-
|
||||||
|
ter reg16 yields address of operand.
|
||||||
|
Any word register can be used except R0.
|
||||||
|
(indexed address-X)
|
||||||
|
|
||||||
|
expr expr is address of operand. This mode
|
||||||
|
is implied by its instruction. It is
|
||||||
|
only used by CALR, DJNZ, JR, LDAR and
|
||||||
|
LDR and is the only mode available to
|
||||||
|
these instructions. In fact this mode
|
||||||
|
differs not from the mode DA.
|
||||||
|
(relative address-RA)
|
||||||
|
|
||||||
|
reg32($expr) contents of register pair reg32 + value
|
||||||
|
of expr yields address of operand. Any
|
||||||
|
register pair can be used except RR0.
|
||||||
|
(based address-BA)
|
||||||
|
|
||||||
|
reg32(reg16) contents of register pair reg32 + con-
|
||||||
|
tents of word register reg16 yields
|
||||||
|
address of operand. Any register pair/
|
||||||
|
word register can be used except RR0/R0.
|
||||||
|
(based indexed address-BX)
|
||||||
|
|
||||||
|
.fi
|
||||||
|
.IP "segmented addresses"
|
||||||
|
Segmented addresses require 23 bits, 7 bits for the segment number
|
||||||
|
and 16 bits for the offset within a segment.
|
||||||
|
So segment 0 contains addresses 0-FFFF, segment 1 contains addresses
|
||||||
|
10000-1FFFF, and so on.
|
||||||
|
.br
|
||||||
|
Assembler syntax of addresses and immediate data is as described above
|
||||||
|
(modes IM, DA and X).
|
||||||
|
Thus the assembler treats e.g. address 2BC0F as an address in segment 2
|
||||||
|
with offset BC0F within the segment.
|
||||||
|
There is also an explicit way to express this using the, more unusual,
|
||||||
|
syntax <<segment>>offset.
|
||||||
|
.br
|
||||||
|
There are two internal representations of segmented addresses
|
||||||
|
depending on the size of the offset. If the offset fits into 8 bits
|
||||||
|
the address is stored in one word (the low-order byte containing
|
||||||
|
the offset, bits 8 to 14 containing the segment number and
|
||||||
|
bit 15 containing a zero) otherwise the address is stored in two
|
||||||
|
words (the lower word containing the offset, the upper word as
|
||||||
|
before but bit 15 containing 1 indicating that the offset is in
|
||||||
|
the next word).
|
||||||
|
This is important for instructions which has an operand of mode DA
|
||||||
|
or X.
|
||||||
|
.IP "extended branches"
|
||||||
|
When the target address in a relative jump/call (JR/CALR)
|
||||||
|
does not fit into the instruction format, the assembler generates
|
||||||
|
a corresponding `normal' jump/call (JP/CALL).
|
||||||
|
.SH EXAMPLE
|
||||||
|
An example of z8000 assembly code.
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
|
||||||
|
! This z8000 assembly routine converts a positive number
|
||||||
|
!(in R1) to a string representing the number and puts this
|
||||||
|
!string into a buffer (R3 contains the starting address of
|
||||||
|
!this buffer. The base is in R4 determining %x, %d or %o.
|
||||||
|
|
||||||
|
.sect .text
|
||||||
|
convert:
|
||||||
|
exts RR0 !sign-extend R1
|
||||||
|
div RR0, R4 !divide by the base
|
||||||
|
test R1 !R1 contains the quotient
|
||||||
|
jr EQ, 5f
|
||||||
|
!if quotient is 0 convert is ready
|
||||||
|
!else push remainder onto the stack
|
||||||
|
push *RR14, R0
|
||||||
|
calr convert !and again...
|
||||||
|
pop R0, *RR14
|
||||||
|
5: add R0, $060 !add `0'
|
||||||
|
cp R0, $071 !compare to `9'
|
||||||
|
jr LE, 8f
|
||||||
|
add R0, $7 !in case of %x `A'-`F'
|
||||||
|
8: ldb 0(R3), RL0 !put character into buffer
|
||||||
|
inc R3
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fi
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(6),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5),
|
||||||
|
.br
|
||||||
|
Z8000 PLZ/ASM Assembly Language Programming Manual, april 1979.
|
||||||
|
.br
|
||||||
|
AmZ8001/2 Processor Instruction Set, 1979.
|
||||||
|
.SH BUGS
|
||||||
|
You cannot use (reg16) instead of 0(reg16).
|
||||||
|
.br
|
||||||
|
Condition codes \fIZ\fP (meaning zero), \fIC\fP (meaning carry) and <nothing>
|
||||||
|
(meaning always false) are not implemented.
|
||||||
|
The first two because they also represent flags and the third one
|
||||||
|
because it's useless.
|
||||||
|
So for \fIZ\fP/\fIC\fP use \fIEQ\fP/\fIULT\fP.
|
||||||
|
.br
|
||||||
|
The z8000 assembly instruction set as described in the book
|
||||||
|
\fIAmZ8001/2 Processor Instruction Set\fP differs from the one
|
||||||
|
described in the manual \fIZ8000 PLZ/ASM Assembly Language Programming
|
||||||
|
Manual\fP in that the book includes CLRL, LDL (format F5.1) and
|
||||||
|
PUSHL (format F5.1) which all in fact do not (!) work.
|
||||||
|
.br
|
||||||
|
On the other side the book excludes SIN, SIND, SINDR, SINI, SINIR,
|
||||||
|
SOUT, SOUTD, SOTDR, SOUTI and SOTIR.
|
||||||
|
Whether these instructions do work as described in the manual has not
|
||||||
|
been tested yet.
|
68
man/z80_as.6
Normal file
68
man/z80_as.6
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
.\" $Header$
|
||||||
|
.TH z80_AS 6ACK
|
||||||
|
.ad
|
||||||
|
.SH NAME
|
||||||
|
z80_as \- assembler for Zilog z80
|
||||||
|
.SH SYNOPSIS
|
||||||
|
~em/lib/z80/as [options] argument ...
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This assembler is made with the general framework
|
||||||
|
described in \fIuni_ass\fP(6). It is an assembler generating relocatable
|
||||||
|
object code in \fIack.out\fP(5) format.
|
||||||
|
.SH SYNTAX
|
||||||
|
.IP registers
|
||||||
|
The z80 has six general-purpose 8-bit registers: b, c, d, e, h, l;
|
||||||
|
an 8-bit accumulator: a; an 8-bit flag register: f; an 8-bit interrupt
|
||||||
|
vector: i; an 8-bit memory refresh register: r; two 16-bit index registers:
|
||||||
|
ix, iy; a 16-bit stack pointer: sp; and a 16-bit program counter: pc.
|
||||||
|
The general-purpose registers can be paired to form three registers pairs of
|
||||||
|
16 bits each: bc, de, hl.
|
||||||
|
An alternate set of registers is provided that duplicates the accumulator,
|
||||||
|
the flag register, and the general-purpose registers. The "exx"-instruction
|
||||||
|
exchanges the contents of the two sets of general-purpose registers; the
|
||||||
|
contents of the accumulator and flag register can be exchanged with the contents
|
||||||
|
of their alternates by the "ex af, af2"-instruction.
|
||||||
|
.IP "addressing modes"
|
||||||
|
.nf
|
||||||
|
.ta 8n 16n 24n 32n 40n 48n
|
||||||
|
syntax meaning
|
||||||
|
|
||||||
|
expr dependent on the instruction, the
|
||||||
|
value of \fIexpr\fP can be immediate
|
||||||
|
data or the address of the operand.
|
||||||
|
There is no special notation for
|
||||||
|
immediate data.
|
||||||
|
|
||||||
|
(ireg + expr)
|
||||||
|
(ireg - expr) the contents of ireg (which must be
|
||||||
|
one of the index-registers) + or -
|
||||||
|
the - one byte - value of \fIexpr\fP
|
||||||
|
yield the address of the operand.
|
||||||
|
|
||||||
|
(expr) the value of \fIexpr\fP is the address of
|
||||||
|
the operand.
|
||||||
|
|
||||||
|
reg the contents of \fIreg\fP - one of the above-
|
||||||
|
mentioned registers - is the operand.
|
||||||
|
|
||||||
|
(reg) the contents of \fIreg\fP - one of the 16-bit
|
||||||
|
registers except pc - is the address of
|
||||||
|
the operand.
|
||||||
|
|
||||||
|
nz, z, nc, c,
|
||||||
|
po, pe, p, m the letters indicate a condition-code:
|
||||||
|
nonzero, zero, carry, no carry,
|
||||||
|
parity odd, parity even, sign positive,
|
||||||
|
sign negative respectively. Used by conditional
|
||||||
|
jump, call, and return instructions.
|
||||||
|
|
||||||
|
.fi
|
||||||
|
.IP instructions
|
||||||
|
The jr-instruction will automatically be replaced by a jp-instruction if the
|
||||||
|
target is too remote.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
uni_ass(6),
|
||||||
|
ack(1),
|
||||||
|
ack.out(5),
|
||||||
|
.br
|
||||||
|
Z80 Users Manual, Joseph J. Carr, Reston Publishing Company, 1980
|
Loading…
Reference in a new issue