Delete 689 undead files.
These files "magically reappeared" after the conversion from CVS to Mercurial. The old CVS repository deleted these files but did not record *when* it deleted these files. The conversion resurrected these files because they have no history of deletion. These files were probably deleted before year 1995. The CVS repository begins to record deletions around 1995. These files may still appear in older revisions of this Mercurial repository, when they should already be deleted. There is no way to fix this, because the CVS repository provides no dates of deletion. See http://sourceforge.net/mailarchive/message.php?msg_id=29823032
This commit is contained in:
@@ -1,66 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH 6500_AS 1ACK
|
||||
.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.
|
||||
.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)
|
||||
@@ -1,55 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH 6800_AS 1
|
||||
.ad
|
||||
.SH NAME
|
||||
6800_as \- assembler for Motorola 6800
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/6800_as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
This assembler is made with the general framework
|
||||
described in \fIuni_ass\fP(6).
|
||||
.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),
|
||||
.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
|
||||
.data
|
||||
val: 0
|
||||
.text
|
||||
ldx <val
|
||||
com val, x
|
||||
bhs someplace ! branch on carry clear
|
||||
sta <val
|
||||
adda #18 ! add 18 to accumulator A
|
||||
.fi
|
||||
.SH BUGS
|
||||
You have to specify whether an address fits in one byte
|
||||
with the token \fI<\fP. It should be done automatically.
|
||||
@@ -1,96 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH 6805_AS 1
|
||||
.ad
|
||||
.SH NAME
|
||||
6805_as \- assembler for Motorola 6805
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/6805_as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
This assembler is made with the general framework
|
||||
described in \fIuni_ass\fP(6).
|
||||
.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"
|
||||
|
||||
.dram use the zero page ram/io segment.
|
||||
.dprom use the zero page (ep)rom segment.
|
||||
.cmos assemble cmos version instructions.
|
||||
.SH "SEE ALSO"
|
||||
uni_ass(6),
|
||||
ack(1),
|
||||
.br
|
||||
M6805 HMOS, M146805 CMOS family, Motorola,
|
||||
Prentice-Hall, Inc., 1983, (ISBN 0-13-541375-3).
|
||||
.SH EXAMPLE
|
||||
An example of Motorola 6805 assembly code.
|
||||
.sp 2
|
||||
.nf
|
||||
.ta 8n 16n 32n 40n 48n 56n 64n
|
||||
.dram
|
||||
one: .space 1 ! a-port
|
||||
.dprom
|
||||
c1: .byte 1
|
||||
.text
|
||||
start: ldx #c1 ! load address of c1
|
||||
txa
|
||||
sta one
|
||||
add c1 ! add one
|
||||
brset 1,one,whoop ! jif bit one of aport
|
||||
bset 1,one ! set it now
|
||||
.data
|
||||
.ascii "unused string"
|
||||
.text
|
||||
whoop: nop
|
||||
.org 0xff8
|
||||
.word start ! set vector address
|
||||
.text
|
||||
nop ! resume code
|
||||
.fi
|
||||
.SH AUTHOR
|
||||
Written by Gijs Mos.
|
||||
Not a member of the ACK group.
|
||||
.SH BUGS
|
||||
The assembler has not been well tested.
|
||||
147
man/6809_as.1
147
man/6809_as.1
@@ -1,147 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH 6809_AS 1
|
||||
.ad
|
||||
.SH NAME
|
||||
6809_as \- assembler for 6809
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/6809_as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
This assembler is made with the general framework
|
||||
described in \fIuni_ass\fP(6).
|
||||
.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),
|
||||
.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
|
||||
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
|
||||
@@ -1,36 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH 8080_AS 1
|
||||
.ad
|
||||
.SH NAME
|
||||
8080_as \- assembler for Intel 8080 and 8085
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/8080_as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
This assembler is made with the general framework
|
||||
described in \fIuni_ass\fP(6).
|
||||
.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),
|
||||
.br
|
||||
System 80/20-4 microcomputer hardware reference manual, 1978 Intel corporation
|
||||
30
man/Makefile
30
man/Makefile
@@ -1,30 +0,0 @@
|
||||
# $Header$
|
||||
|
||||
NROFF=nroff
|
||||
MANDIR=/usr/man
|
||||
SUF=opr
|
||||
|
||||
all:
|
||||
for i in *.[1-8] ; do \
|
||||
$(NROFF) -man head $$i > $$i.$(SUF) ; \
|
||||
done
|
||||
|
||||
install:
|
||||
for i in *.[1-8] ; do \
|
||||
num=`expr $$i : '.*\.\([1-8]\)'` ; \
|
||||
if test -f $(MANDIR)/man$$num/$$i ; \
|
||||
then cat head $$i > $(MANDIR)/man$$num/em_$$i ; \
|
||||
else cat head $$i > $(MANDIR)/man$$num/$$i ; \
|
||||
fi ; \
|
||||
done
|
||||
|
||||
opr:
|
||||
make pr | opr
|
||||
|
||||
pr:
|
||||
@make all >make.pr.out 2>&1 &
|
||||
@cat *.opr
|
||||
|
||||
clean:
|
||||
-rm -f *.opr *.out
|
||||
-rm -f *.$(SUF)
|
||||
46
man/a.out.5
46
man/a.out.5
@@ -1,46 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH A.OUT 5
|
||||
.SH NAME
|
||||
a.out \- universal assembler load format
|
||||
.SH DESCRIPTION
|
||||
The load files produced by the universal assemblers look very
|
||||
much alike.
|
||||
These load files consist of sequences of variable length
|
||||
records, each describing a part of the initialized memory.
|
||||
Bss type memory is left uninitialized by the universal assembler
|
||||
and has to be initialized at run-time.
|
||||
The EM header em_head will perform this task on most systems.
|
||||
Each record consists of a \fIcount\fP, an \fIaddress\fP and
|
||||
\fIcount\fP bytes.
|
||||
The first byte should be placed at \fIaddress\fP, the second at
|
||||
\fIaddress+1\fP, etc.
|
||||
|
||||
.nf
|
||||
struct loadf {
|
||||
unsigned short l_addr[2] ; /* address */
|
||||
short l_cnt ; /* count */
|
||||
unsigned char data[] ; /* data */
|
||||
} ;
|
||||
.fi
|
||||
|
||||
This representation is machine dependent in two ways.
|
||||
First, the byte order in the first three fields is the byte order
|
||||
of the machine the universal assembler is running.
|
||||
Second, the format of the address differs from machine to machine.
|
||||
.br
|
||||
For example, for the Intel 8086 the first entry contains a
|
||||
16-bit offset and the second entry a segment number.
|
||||
The segment number has to be multiplied by 16 and added to
|
||||
the addres to obtain the address of the first byte to be
|
||||
initialized.
|
||||
.br
|
||||
The PDP 11 version stores the address in l_addr[0] and the type
|
||||
of the initialized memory in l_addr[1].
|
||||
Types 1 and 3 are absolute, 4 is text, 5 is data and 6 BSS.
|
||||
.br
|
||||
For all other currently available machines the
|
||||
array of shorts is 'replaced' by a long.
|
||||
This long contains the 32-bit address.
|
||||
.SH "SEE ALSO"
|
||||
uni_ass(VI)
|
||||
.SH BUGS
|
||||
135
man/arch.1
135
man/arch.1
@@ -1,135 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH ARCH 1
|
||||
.SH NAME
|
||||
arch \- archive and library maintainer
|
||||
.SH SYNOPSIS
|
||||
.B arch
|
||||
key [ posname ] afile name ...
|
||||
.SH DESCRIPTION
|
||||
.I Arch
|
||||
maintains groups of files
|
||||
combined into a single archive file.
|
||||
Its main use
|
||||
is to create and update library files as used by a linker.
|
||||
It can be used, though, for any similar purpose.
|
||||
The Amsterdam compiler kit provides its own archiver with a
|
||||
fixed, machine-independent format, much like the UNIX-V7
|
||||
archive format.
|
||||
EM programs using libraries assume archives in EM format.
|
||||
.PP
|
||||
.I Key
|
||||
is one character from the set
|
||||
.B drqtpmx,
|
||||
optionally concatenated with
|
||||
one or more of
|
||||
.B vuaibcl.
|
||||
.I Afile
|
||||
is the archive file.
|
||||
The
|
||||
.I names
|
||||
are constituent files in the archive file.
|
||||
The meanings of the
|
||||
.I key
|
||||
characters are:
|
||||
.TP
|
||||
.B d
|
||||
Delete the named files from the archive file.
|
||||
.TP
|
||||
.B r
|
||||
Replace the named files in the archive file.
|
||||
If the optional character
|
||||
.B u
|
||||
is used with
|
||||
.B r,
|
||||
then only those files with
|
||||
modified dates later than
|
||||
the archive files are replaced.
|
||||
If an optional positioning character from the set
|
||||
.B abi
|
||||
is used, then the
|
||||
.I posname
|
||||
argument must be present
|
||||
and specifies that new files are to be placed
|
||||
after
|
||||
.RB ( a )
|
||||
or before
|
||||
.RB ( b
|
||||
or
|
||||
.BR i )
|
||||
.IR posname .
|
||||
Otherwise
|
||||
new files are placed at the end.
|
||||
.TP
|
||||
.B q
|
||||
Quickly append the named files to the end of the archive file.
|
||||
Optional positioning characters are invalid.
|
||||
The command does not check whether the added members
|
||||
are already in the archive.
|
||||
Useful only to avoid quadratic behavior when creating a large
|
||||
archive piece-by-piece.
|
||||
.TP
|
||||
.B t
|
||||
Print a table of contents of the archive file.
|
||||
If no names are given, all files in the archive are tabled.
|
||||
If names are given, only those files are tabled.
|
||||
.TP
|
||||
.B p
|
||||
Print the named files in the archive.
|
||||
.TP
|
||||
.B m
|
||||
Move the named files to the end of the archive.
|
||||
If a positioning character is present,
|
||||
then the
|
||||
.I posname
|
||||
argument must be present and,
|
||||
as in
|
||||
.B r,
|
||||
specifies where the files are to be moved.
|
||||
.TP
|
||||
.B x
|
||||
Extract the named files.
|
||||
If no names are given, all files in the archive are
|
||||
extracted.
|
||||
In neither case does
|
||||
.B x
|
||||
alter the archive file.
|
||||
.TP
|
||||
.B v
|
||||
Verbose.
|
||||
Under the verbose option,
|
||||
.I arch
|
||||
gives a file-by-file
|
||||
description of the making of a
|
||||
new archive file from the old archive and the constituent files.
|
||||
When used with
|
||||
.B t,
|
||||
it gives a long listing of all information about the files.
|
||||
When used with
|
||||
.BR p ,
|
||||
it precedes each file with a name.
|
||||
.TP
|
||||
.B c
|
||||
Create.
|
||||
Normally
|
||||
.I arch
|
||||
will create
|
||||
.I afile
|
||||
when it needs to.
|
||||
The create option suppresses the
|
||||
normal message that is produced when
|
||||
.I afile
|
||||
is created.
|
||||
.TP
|
||||
.B l
|
||||
Local.
|
||||
Normally
|
||||
.I arch
|
||||
places its temporary files in the directory /tmp.
|
||||
This option causes them to be placed in the local directory.
|
||||
.SH FILES
|
||||
/tmp/v* temporaries
|
||||
.SH "SEE ALSO"
|
||||
em_ass(I), arch(V),
|
||||
.SH BUGS
|
||||
If the same file is mentioned twice in an argument list,
|
||||
it may be put in the archive twice.
|
||||
52
man/arch.5
52
man/arch.5
@@ -1,52 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH ARCH 5
|
||||
.SH NAME
|
||||
arch \- archive (library) file format
|
||||
.SH SYNOPSIS
|
||||
.B #include "/usr/em/h/arch.h"
|
||||
.SH DESCRIPTION
|
||||
The archive command
|
||||
.I arch
|
||||
is used to combine several files into
|
||||
one.
|
||||
Archives are used mainly as libraries to be searched
|
||||
by the EM assembler/linker em_ass(VI) or the universal
|
||||
assembler/linker em_unias(VI).
|
||||
.PP
|
||||
A file produced by
|
||||
.I arch
|
||||
has a magic number at the start,
|
||||
followed by the constituent files, each preceded by a file header.
|
||||
The magic number and header layout as described in the
|
||||
include file are:
|
||||
.RS
|
||||
.PP
|
||||
.nf
|
||||
.ta \w'#define 'u +\w'ARMAG 'u
|
||||
.so ../h/arch.h
|
||||
.fi
|
||||
.RE
|
||||
.LP
|
||||
The name is a null-terminated string;
|
||||
The sizes of the other entries are determined as follows:
|
||||
long's are 4 bytes in PDP-11 order, int are 2 bytes, low order
|
||||
byte first, char's are 1 byte.
|
||||
The date is in the
|
||||
form of
|
||||
.IR time (2);
|
||||
the user ID and group ID are numbers; the mode is a bit pattern
|
||||
per
|
||||
.IR chmod (2);
|
||||
the size is counted in bytes.
|
||||
.PP
|
||||
Each file begins on a even offset;
|
||||
a null byte is inserted between files if necessary.
|
||||
Nevertheless the size given reflects the
|
||||
actual size of the file exclusive of padding.
|
||||
.PP
|
||||
Notice there is no provision for empty areas in an archive
|
||||
file.
|
||||
.SH "SEE ALSO"
|
||||
arch(I), em_ass(VI), em_unias(VI)
|
||||
.SH BUGS
|
||||
Coding user and group IDs as characters is a botch.
|
||||
87
man/em.1
87
man/em.1
@@ -1,87 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH EM I
|
||||
.ad
|
||||
.SH NAME
|
||||
em \- calling program for em interpreters
|
||||
.SH SYNOPSIS
|
||||
em [-t] [+fcp] [loadfile [args ... ...] ]
|
||||
.SH DESCRIPTION
|
||||
The loadfile ("e.out" if not specified) is opened to read the first 8 word header.
|
||||
The format of this header is explained in e.out(V).
|
||||
One of these 8 words is a flag word
|
||||
specifying the interpreter options requested at compile time.
|
||||
The usual setting of these options is +t -f -c -p.
|
||||
One of these options may be overridden at run time
|
||||
by the corresponding flag of em.
|
||||
Based on these options the name of the appropriate interpreter
|
||||
is constructed.
|
||||
.PP
|
||||
This interpreter is first searched for in /usr/em/mach/pdp/int, then in the current
|
||||
directory.
|
||||
.PP
|
||||
The flags control the following options that can be turned off
|
||||
or on by prepending them with - or + respectively:
|
||||
.IP t
|
||||
run time tests for undefined variables, array bounds etc...
|
||||
This option costs a small amount of memory and some time.
|
||||
However, it is very useful for debugging.
|
||||
.IP p
|
||||
profiling of the entire program. The interpreter maintain tables containing
|
||||
an estimate of the number of memory cycles used per source line.
|
||||
This option is expensive in time as well as in memory space.
|
||||
The result tables made at run time are dumped onto a file named
|
||||
em_runinf. This file is converted to human readable format
|
||||
by the program eminform(I) which writes the profiling information
|
||||
on a file called em_profile.
|
||||
.IP f
|
||||
maintain a bit map of all source lines that have been executed.
|
||||
This map is written also onto the file em_runinf and can be interpreted by eminform(I) which writes in this case the file em_flow.
|
||||
This option is almost free in time and space.
|
||||
.IP c
|
||||
count line usage in tables that
|
||||
contains for every source line the number of times it
|
||||
was entered.
|
||||
These tables are also written onto em_runinf.
|
||||
Eminform(I) can be used to convert this information into the
|
||||
file em_count.
|
||||
Cheap in time, expensive in memory space.
|
||||
.PP
|
||||
These flags
|
||||
give rise to 5 different interpreters which are in the
|
||||
directory /usr/em/mach/pdp/int
|
||||
.PP
|
||||
If the interpreter exits with a non-zero exit status, then the line numbers
|
||||
of the 64 last executed source lines are dumped on the file
|
||||
em_runinf
|
||||
in the current directory. Eminform(I) writes this information
|
||||
on the human readable file em_last.
|
||||
.SH "FILES"
|
||||
.IP /usr/em/mach/pdp/int/em_???? 35
|
||||
interpreters proper
|
||||
.PD 0
|
||||
.IP /usr/em/lib/pdp_int/em_????
|
||||
source of interpreter
|
||||
.IP /usr/em/mach/pdp/int/?+
|
||||
positive option switch
|
||||
.IP /usr/em/mach/pdp/int/?-
|
||||
negative option switch
|
||||
.IP em_runinf
|
||||
memory dump containing runtime information
|
||||
.IP em_profile
|
||||
profile data
|
||||
.IP em_count
|
||||
source line count data
|
||||
.IP em_flow
|
||||
source line flow data
|
||||
.IP em_last
|
||||
last lines executed
|
||||
.PD
|
||||
.SH "SEE ALSO"
|
||||
eminform(I), ack(I), int(I)
|
||||
.SH BUGS
|
||||
Most error messages are self explanatory.
|
||||
The interpreter stops in case of lack of space with an error
|
||||
message SEGVIO stack overflow.
|
||||
If runtime flags are turned on it is advisable to try again
|
||||
with the default options.
|
||||
Bugs should be reported to Evert Wattel.
|
||||
@@ -1,40 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH EM_DECODE VI
|
||||
.ad
|
||||
.SH NAME
|
||||
em_decode,em_encode \- compact to readable EM and v.v.
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/em_decode [ inputfile [ outputfile ] ]
|
||||
.br
|
||||
/usr/em/lib/em_encode [ inputfile [ outputfile ] ]
|
||||
.SH DESCRIPTION
|
||||
Most programs involved with the EM project only produce and accept
|
||||
EM programs in compact form.
|
||||
These files are only machine readable.
|
||||
A description of this compact form can be found in [1].
|
||||
To inspect the code produced by compilers or to patch them for one reason
|
||||
or another, you need human readable assembly code.
|
||||
Em_decode will do the job for you.
|
||||
.PP
|
||||
Em_decode accepts the normal compact form in both optimized and
|
||||
unoptimized form
|
||||
.PP
|
||||
Sometimes you have to make some special routines directly
|
||||
in EM, for instance the routines implementing the system calls.
|
||||
At these times you may use em_encode to produce compact routines
|
||||
out of these human readable assembly modules.
|
||||
.PP
|
||||
The first argument is the input file.
|
||||
The second argument is the output file.
|
||||
Both programs can act as a filter.
|
||||
.SH "SEE ALSO"
|
||||
.IP [1]
|
||||
A.S.Tanenbaum, Ed Keizer, Hans van Staveren & J.W.Stevenson
|
||||
"Description of a machine architecture for use of
|
||||
block structured languages" Informatica rapport IR-81.
|
||||
.IP [2]
|
||||
ack(I)
|
||||
.SH DIAGNOSTICS
|
||||
Error messages are intended to be self-explanatory.
|
||||
.SH AUTHOR
|
||||
Johan Stevenson, Vrije Universiteit.
|
||||
@@ -1,51 +0,0 @@
|
||||
.\" $Header$
|
||||
.tr ~
|
||||
.TH EMINFORM I
|
||||
.ad
|
||||
.SH NAME
|
||||
eminform \- converts runtime information of interpreted em to
|
||||
human readable form.
|
||||
.SH SYNOPSIS
|
||||
eminform
|
||||
.SH DESCRIPTION
|
||||
The EM interpreter, em(I), has several debugging features built in.
|
||||
They can be activated by flag options to em(I).
|
||||
The EM interpreter collects the information while it runs the program.
|
||||
When the program is terminated, the interpreter dumps this information onto
|
||||
a file called em_runinf.
|
||||
Eminform converts this information in human readable form onto
|
||||
a set of files with fixed names, the file em_runinf itself is unlinked.
|
||||
.PP
|
||||
.in +15
|
||||
.ti -13
|
||||
~~em_last~~~~A circular buffer is used to keep track of
|
||||
the last collection of executed source lines.
|
||||
.ti -13
|
||||
~~em_flow~~~~A bit map for all source lines tells which lines
|
||||
are executed.
|
||||
.ti -13
|
||||
~~em_count~~~Count the number of times each source line was entered.
|
||||
.ti -13
|
||||
~~em_profile~Estimate the number of memory cycles
|
||||
spent on each source line.
|
||||
.in -15
|
||||
.LP
|
||||
The most common use of eminform is to print the numbers of the last executed
|
||||
source lines if an execution error occurred.
|
||||
No arguments are needed in this case.
|
||||
.LP
|
||||
Eminform will create only those files for which there were
|
||||
interpreter flags turned on. If no runtime error occurred and
|
||||
no flag was turned on the file em_runinf is not created. In
|
||||
this case eminform will give the error message "read header
|
||||
failed".
|
||||
.SH FILES
|
||||
em_runinf, em_last, em_flow, em_count, em_profile
|
||||
.SH "SEE ALSO"
|
||||
ack(I), int(I), em(I).
|
||||
.SH BUGS
|
||||
If an entire procedure is not touched, the the file name in
|
||||
which this procedure occured is unknown.
|
||||
If no em_runinf is available the error message is "read header
|
||||
failed" and a core dump is created.
|
||||
Bugs should be reported to Evert Wattel
|
||||
145
man/i86_as.1
145
man/i86_as.1
@@ -1,145 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH I86_AS 1
|
||||
.ad
|
||||
.SH NAME
|
||||
i86_as \- assembler for Intel 8086
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/i86_as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
This assembler is made with the general framework
|
||||
described in \fIuni_ass\fP(6).
|
||||
.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).
|
||||
For each segment type (.org, .text, .data, or .bss) the segment number
|
||||
must be given with the .sbase pseudo-instruction.
|
||||
The syntax is:
|
||||
.br
|
||||
.sbase <segment-id> expression
|
||||
.br
|
||||
with segment-id one of .org, .text, .data, or .bss.
|
||||
Example:
|
||||
.br
|
||||
.sbase .text 0x1000
|
||||
|
||||
.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),
|
||||
.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:
|
||||
|
||||
_panic:
|
||||
push bp
|
||||
mov bp,sp
|
||||
.data
|
||||
_35:
|
||||
.word 24944
|
||||
.word 26990
|
||||
.word 14947
|
||||
.word 32
|
||||
.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
|
||||
.data
|
||||
_38:
|
||||
.word 28526
|
||||
.word 24944
|
||||
.word 26990
|
||||
.word 14947
|
||||
.word 32
|
||||
.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.1
100
man/m68k2_as.1
@@ -1,100 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH M68K2_AS 1
|
||||
.ad
|
||||
.SH NAME
|
||||
m68k2_as \- assembler for Motorola 68000
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/m68k2_as [options] argument ...
|
||||
.br
|
||||
/usr/em/lib/m68k4_as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
This assembler is made with the general framework
|
||||
described in \fIuni_ass\fP(6).
|
||||
.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),
|
||||
.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
|
||||
|
||||
.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
|
||||
@@ -1,96 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH EM I
|
||||
.ad
|
||||
.SH NAME
|
||||
em \- calling program for em interpreters
|
||||
.SH SYNOPSIS
|
||||
em [-t] [+fcp] [loadfile [args ... ...] ]
|
||||
.SH DESCRIPTION
|
||||
The loadfile ("e.out" if not specified) is opened to read the first 8 word header.
|
||||
The format of this header is explained in e.out(V).
|
||||
One of these 8 words is a flag word
|
||||
specifying the interpreter options requested at compile time.
|
||||
The usual setting of these options is +t -f -c -p.
|
||||
These options may be overridden at runtime as follows:
|
||||
em -t turns the test option of; em +c turns count on ; em +p turns profile
|
||||
on ; em +c +p turns both count and profile on.
|
||||
Based on these options the name of the appropriate interpreter
|
||||
is constructed.
|
||||
Two versions exist, one for two byte words and four byte pointers and
|
||||
one for four byte words and pointers.
|
||||
The information in the header of the e.out file is used by em to select the
|
||||
right interpreter for the word size of used in the e.out file.
|
||||
.PP
|
||||
This interpreter is searched for in /usr/em/lib/int[24]4.
|
||||
.PP
|
||||
The flags control the following options that can be turned off
|
||||
or on by prepending them with - or + respectively:
|
||||
.IP t
|
||||
run time tests for undefined variables, array bounds etc...
|
||||
This option costs a small amount of memory and some time.
|
||||
However, it is very useful for debugging.
|
||||
.IP p
|
||||
profiling of the entire program. The interpreter maintains tables containing
|
||||
an estimate of the number of processor state cycles used per source line.
|
||||
A processor state cycle is equal to two internal clock cycles.
|
||||
This option is expensive in time as well as in memory space.
|
||||
The result tables made at run time are dumped in a human readable
|
||||
format onto a file named
|
||||
em_profile.
|
||||
.IP f
|
||||
maintain a bit map of all source lines that have been executed.
|
||||
This map is written onto a file em_flow .
|
||||
This option is almost free in time and space.
|
||||
The file is not easy to read.
|
||||
Of each procedure only the lines between the first statement and the last
|
||||
statement are represented in the bit map.
|
||||
Currently this option is not installed in the em tree.
|
||||
.IP c
|
||||
count line usage in tables that
|
||||
contains for every source line the number of times it
|
||||
was entered.
|
||||
These tables are written onto em_count, a human readable file .
|
||||
This option is cheap in time, but costs some in memory space.
|
||||
.IP l
|
||||
dump the line numbers of the last 64 lines entered onto a file named
|
||||
em_last.
|
||||
This file will be in a human readable format.
|
||||
This option is used simultaneously with the test option.
|
||||
.PP
|
||||
These flags
|
||||
give rise to 5 different interpreters which are in the
|
||||
directory /usr/em/lib/int24 or in /usr/em/lib/int44
|
||||
for the two byte word or the four byte word options, respectively.
|
||||
.PP
|
||||
.SH "FILES"
|
||||
.IP /usr/em/lib/int[24]4/em_???? 35
|
||||
interpreters proper
|
||||
.PD 0
|
||||
.IP /usr/em/mach/m68k2/int/mloop?
|
||||
source of interpreter
|
||||
.IP em_profile
|
||||
profile data
|
||||
.IP em_count
|
||||
source line count data
|
||||
.IP em_flow
|
||||
source line flow data
|
||||
.IP em_last
|
||||
last lines executed
|
||||
.PD
|
||||
.SH "SEE ALSO"
|
||||
\fIack\fP(I),
|
||||
\fIint24\fP(I),
|
||||
\fIint44\fP(I)
|
||||
.SH BUGS
|
||||
Most error messages are self explanatory.
|
||||
If runtime flags are turned on it is advisable to try again
|
||||
with the default options.
|
||||
If the interpreter does not work most probably your particular
|
||||
machine has an other format for the system calls then assumed
|
||||
in the source.
|
||||
In that case adapt source file mloopc to your machine.
|
||||
Also the instruction that causes the machine to allocate stack
|
||||
space might differ .
|
||||
In that case adapt the macro \fIclaimstack\fP in deffile.
|
||||
.SH AUTHOR
|
||||
Freek van Schagen
|
||||
66
man/macro.v7
66
man/macro.v7
@@ -1,66 +0,0 @@
|
||||
.\" $Header$
|
||||
.de TH
|
||||
.PD
|
||||
.br
|
||||
.bp
|
||||
.lc
|
||||
.nr in 5
|
||||
.de hd
|
||||
'sp 2
|
||||
'tl '\\$1(\\$2)'Amsterdam Compiler Kit'\\$1(\\$2)'
|
||||
'sp 2
|
||||
\\..
|
||||
.wh -6 fo
|
||||
.wh 0 hd
|
||||
.nr pi 5
|
||||
..
|
||||
.de fo
|
||||
'sp 2
|
||||
'tl ''- % -''
|
||||
'bp
|
||||
..
|
||||
.de PD
|
||||
.nr pd 0.5v
|
||||
.if \\n(.$ .nr pd \\$1
|
||||
..
|
||||
.de SH
|
||||
.nr in 5
|
||||
.nr pi 5
|
||||
.in \\n(in
|
||||
.ti 0
|
||||
.sp \\n(pdu
|
||||
.ne 2
|
||||
.fi
|
||||
\fB\\$1\fP
|
||||
.br
|
||||
..
|
||||
.de LP
|
||||
.PP
|
||||
..
|
||||
.de PP
|
||||
.sp \\n(pdu
|
||||
.ne 2
|
||||
.in \\n(in
|
||||
.nr pi 5
|
||||
.ns
|
||||
..
|
||||
.de IP
|
||||
.if \\n(.$-1 .nr pi \\$2
|
||||
.sp \\n(pdu
|
||||
.in \\n(in+\\n(pi
|
||||
.ta \\n(in \\n(in+\\n(pi
|
||||
.ti 0
|
||||
\fB\\$1\fR\c
|
||||
.if \w'\fB\\$1\fP'-\\n(pin+1n .br
|
||||
..
|
||||
.de RS
|
||||
.nr in +5
|
||||
.in +5
|
||||
..
|
||||
.de RE
|
||||
.in -5
|
||||
.nr in -5
|
||||
..
|
||||
.de RF
|
||||
\fI\\$1\fP(\\$2)\\$3
|
||||
..
|
||||
148
man/ns_as.1
148
man/ns_as.1
@@ -1,148 +0,0 @@
|
||||
.TH NS_ASS VI
|
||||
.ad
|
||||
.SH NAME
|
||||
ns_as \- National Semiconductor 16032 assembler/linker
|
||||
.SH SYNOPSIS
|
||||
\&..../lib/ns/as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
The assembler for the National Semiconductor 16032 is based
|
||||
on the universal assembler \fIuni_ass\fP(VI).
|
||||
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
|
||||
The external mode is provided, although this assembler
|
||||
does not build a module table.
|
||||
.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 EXAMPLE
|
||||
.nf
|
||||
.ta 12n 20n 28n 36n
|
||||
|
||||
00000000 0E0B02 setcfg [ m ]
|
||||
label:
|
||||
00000003 EC3E lprb psr,r7
|
||||
00000005 2D37 sprw intbase,r6
|
||||
|
||||
00000007 EA7C br label
|
||||
|
||||
00000009 02803B bsr rout1
|
||||
0000000C 228044 cxp rout1
|
||||
0000000F 1204 ret 4
|
||||
00000011 4204 rett 4
|
||||
00000013 328044 rxp rout1
|
||||
|
||||
00000016 1E0300 rdval r0
|
||||
00000019 163028 scsr r5
|
||||
|
||||
0000001C 3F32 shid r6
|
||||
0000001E 7F0B bispsrd r1
|
||||
00000020 7C17 caseb r2
|
||||
00000022 7FA806 cxpd @6
|
||||
|
||||
00000025 021F jsr @rout1
|
||||
|
||||
00000027 BEB529 absf f5,f6
|
||||
0000002A EE0538 movusw r7,r0
|
||||
0000002D 3E40A101 movbl 1,f5
|
||||
00000031 CE440003 cmpmb r0,r1,4
|
||||
|
||||
00000035 CE4F0800 extsd r1,r1,0,1
|
||||
00000039 62A0 save [ r5, r7 ]
|
||||
0000003B 1E0B00 lmr bpr0,r0
|
||||
|
||||
0000003E 0E8C04 skpst w
|
||||
00000041 CC0042 acbb 1,r0,label
|
||||
00000044 B2 rout1: wait
|
||||
00000045 7F950C0B adjspd 11(12(sb))
|
||||
00000049 7CA50D adjspb 13
|
||||
0000004C 7DB50102 adjspw external(1)+2
|
||||
00000050 7FBD adjspd tos
|
||||
|
||||
00000052 7CED860807 adjspb 7(8(fp))[r6:w]
|
||||
|
||||
.fi
|
||||
.SH "SEE ALSO"
|
||||
uni_ass(VI)
|
||||
.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
|
||||
138
man/pdp_as.1
138
man/pdp_as.1
@@ -1,138 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH PDP_AS 1
|
||||
.ad
|
||||
.SH NAME
|
||||
pdp_as \- assembler for PDP 11
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/pdp_as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
This assembler is made with the general framework
|
||||
described in \fIuni_ass\fP(6).
|
||||
.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
|
||||
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),
|
||||
.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).
|
||||
163
man/z8000_as.1
163
man/z8000_as.1
@@ -1,163 +0,0 @@
|
||||
.TH Z8000_AS 1
|
||||
.ad
|
||||
.SH NAME
|
||||
z8000_as \- assembler for Zilog z8000 (segmented version)
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/z8000_as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
This assembler is made with the general framework
|
||||
described in \fIuni_ass\fP(6).
|
||||
.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.
|
||||
|
||||
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).
|
||||
.br
|
||||
ack(1).
|
||||
.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.
|
||||
66
man/z80_as.1
66
man/z80_as.1
@@ -1,66 +0,0 @@
|
||||
.\" $Header$
|
||||
.TH z80_AS 1
|
||||
.ad
|
||||
.SH NAME
|
||||
z80_as \- assembler for Zilog z80
|
||||
.SH SYNOPSIS
|
||||
/usr/em/lib/z80_as [options] argument ...
|
||||
.SH DESCRIPTION
|
||||
This assembler is made with the general framework
|
||||
described in \fIuni_ass\fP(6).
|
||||
.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),
|
||||
.br
|
||||
Z80 Users Manual, Joseph J. Carr, Reston Publishing Company, 1980
|
||||
Reference in New Issue
Block a user