1767 lines
32 KiB
Plaintext
1767 lines
32 KiB
Plaintext
|
Optimizations for the 68020+
|
|||
|
|
|||
|
|
|||
|
|
|||
|
by Erik H. Bakke
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Written 13/10-93
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--- I ------------------------- INTRODUCTION ---------------------- I ---
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1.1 Introduction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 68020+ (from here on 020) has several new registers and commands that
|
|||
|
|
|||
|
help speeding up your code.
|
|||
|
|
|||
|
This text also mentions some concepts new to the 68010 processor.
|
|||
|
|
|||
|
This text contains information on how to use the new instructions, and
|
|||
|
|
|||
|
address modes, as well as what modes are available to what instructions,
|
|||
|
|
|||
|
and how much space they require.
|
|||
|
|
|||
|
However, the timing diagrms for the different instructions are not
|
|||
|
|
|||
|
included (I don't know them).
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1.2 Index
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Chapter I-----------------Introduction-------------------
|
|||
|
|
|||
|
1.1 Introduction
|
|||
|
|
|||
|
1.2 Index
|
|||
|
|
|||
|
Chapter II------------New Addressing Modes---------------
|
|||
|
|
|||
|
2.1 Extended Address Register Indirect with Index mode
|
|||
|
|
|||
|
2.2 Memory Indirect modes
|
|||
|
|
|||
|
Chapter III---------------Improvements-------------------
|
|||
|
|
|||
|
3.1 General Improvements
|
|||
|
|
|||
|
3.2 The CMP2 instruction
|
|||
|
|
|||
|
3.3 Improved Multiply/Divide instructions
|
|||
|
|
|||
|
3.4 The CHK2 instruction
|
|||
|
|
|||
|
3.5 The EXTB instruction
|
|||
|
|
|||
|
Chapter IV--------------New Instructions-----------------
|
|||
|
|
|||
|
4.1 The BitField instructions
|
|||
|
|
|||
|
1...Single operand
|
|||
|
|
|||
|
2...Double operand
|
|||
|
|
|||
|
4.2 The RTD instruction
|
|||
|
|
|||
|
4.3 The BCD instructions
|
|||
|
|
|||
|
1...PACK
|
|||
|
|
|||
|
2...UNPK
|
|||
|
|
|||
|
4.4 The MC68040 Block Move instruction (MOVE16)
|
|||
|
|
|||
|
4.5 The 68010 BKPT instruction
|
|||
|
|
|||
|
4.6 The 68020 Module instructions
|
|||
|
|
|||
|
4.7 The CAS/CAS2 instructions
|
|||
|
|
|||
|
4.8 The CoProcessor interface instructions
|
|||
|
|
|||
|
1...User state
|
|||
|
|
|||
|
2...Supervisor state
|
|||
|
|
|||
|
4.9 Conditional TRAP instruction
|
|||
|
|
|||
|
Chapter V-------------Addressing mode tables-------------
|
|||
|
|
|||
|
5.1 Allowed Adressing modes
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--- II --------------------- NEW ADDRESSING MODES ---------------- II ---
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
First, some new addressing modes:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 020 supports 18 different addressing modes, where the 68000 only
|
|||
|
|
|||
|
supports 12. The 6 new modes expand memory access.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
- The address register indirect with index now permit the index register
|
|||
|
|
|||
|
to be scaled by a factor of 1,2,4 or 8 to allow easy access to byte,
|
|||
|
|
|||
|
word, longword and quadword data units. This, in turn greatly improves
|
|||
|
|
|||
|
access to arrays of such data.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
- The address register and PC indirect with index modes have been
|
|||
|
|
|||
|
extended to a more general syntax, allowind 32-bit displacements.
|
|||
|
|
|||
|
Any of the components of these modes are optional, giving us some very
|
|||
|
|
|||
|
interesting addressing modes, such as DATA register indirect, called
|
|||
|
|
|||
|
base displacement.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
- Another new concept in the 020 is the memory indirect addressing, which
|
|||
|
|
|||
|
allows intermediate use of a pointer in memory. The contents of this
|
|||
|
|
|||
|
pointer is then used as the base address for further memory access. We
|
|||
|
|
|||
|
will see examples of how this is used later.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
2.1 EXTENDED ADDRESS REGISTER INDIRECT with INDEX mode
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 020 supports a scale factor to be used with the index register.
|
|||
|
|
|||
|
This eliminates the need for an additional multiply/rotation instruction
|
|||
|
|
|||
|
to compute the correct index value.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: 1 (d8,An,Rm.Size*Scale) uses old 8-bit displacement
|
|||
|
|
|||
|
2 (bd,An,Rm.Size*Scale) uses 16 or 32-bit base displacement
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3 (d8,PC,Rm.Size*Scale) uses old 8-bit displacement
|
|||
|
|
|||
|
4 (bd,PC,Rm.size*Scale) uses 16 or 32-bit base displacement
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1 <ea>=d8+An+(Rm.Size*Scale)
|
|||
|
|
|||
|
2 <ea>=bd+An+(Rm.Size*Scale)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3 <ea>=d8+PC+(Rm.Size*Scale)
|
|||
|
|
|||
|
4 <ea>=bd+PC+(Rm.Size*Scale)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The addressing mode works just like the old version of it, except that
|
|||
|
|
|||
|
you may include the scale factor to multiply the index register by
|
|||
|
|
|||
|
1,2,4 or 8. The old version can be regarded as having a scale factor
|
|||
|
|
|||
|
of 1.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
"Table" is an array of quadwords (64-bits)
|
|||
|
|
|||
|
"Element" (16 bits) is the element number to be looked up. (32-bit)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
move.l (Element,pc),d0
|
|||
|
|
|||
|
move.l (Table,pc,d0.w*8),d0
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This code fetches the 32-bit element as indicated by "Element" from the
|
|||
|
|
|||
|
table "Table".
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Many forms of this addressing mode is legal, as the different elements
|
|||
|
|
|||
|
are optional. Allowed forms may be:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
(bd,An,Rm.Size) Corresponds to the old version
|
|||
|
|
|||
|
(bd,Rm.Size*Scale) Omits the address register from the <ea>
|
|||
|
|
|||
|
(bd) Equivalent to absolute addressing
|
|||
|
|
|||
|
(Dm.l) Data register indirect addressing
|
|||
|
|
|||
|
() Just an <ea> of 0
|
|||
|
|
|||
|
|
|||
|
|
|||
|
If you choose to omit the PC, you may have to use the notation ZPC
|
|||
|
|
|||
|
and/or note the base displacement with .L, depending on your assembler.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
2.2 MEMORY INDIRECT modes
|
|||
|
|
|||
|
|
|||
|
|
|||
|
These modes enables the processor to step on a pointer in memory when
|
|||
|
|
|||
|
computing an <ea>. These modes can be divided in two categories,
|
|||
|
|
|||
|
Pre-indexed and Post-indexed.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: 1 ([bd,An,Rm.Size*Scale],od) Pre-indexed form
|
|||
|
|
|||
|
2 ([bd,An],Rm.Size*Scale,od) Post-indexed form
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3 ([bd,PC,Rm.Size*Scale],od) Pre-indexed form
|
|||
|
|
|||
|
4 ([bd,PC],Rm.Size*Scale,od) Post-indexed form
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1 <ea>=Contents of(bd+An+Rm*Scale) + od
|
|||
|
|
|||
|
2 <ea>=Contents of(bd+An) + Rm*Scale+od
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3 <ea>=Contents of(bd+PC+Rm*Scale) + od
|
|||
|
|
|||
|
4 <ea>=Contents of(bd+An) + Rm*Scale+od
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The same rules apllies to these addressing modes as do for the
|
|||
|
|
|||
|
previously described modes.
|
|||
|
|
|||
|
All elements are optional and may be omitted.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
On Amiga computers, graphics rendering functions need a pointer to a
|
|||
|
|
|||
|
rastport.
|
|||
|
|
|||
|
To extract this RastPort pointer from a Window sctructure the
|
|||
|
|
|||
|
following code would be used:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
move.l ([WindowBase,pc],wd_RPort),a2
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
When getting to grips with these addressing modes, they can greatly improve
|
|||
|
|
|||
|
the performance of your program, as well as reducing the length of the
|
|||
|
|
|||
|
code.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--- III ---------------------- IMPROVEMENTS --------------------- III ---
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.1 General improvements:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 020 improves the branch instructions to use an 8, 16 or 32-bit
|
|||
|
|
|||
|
displacement.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.2 The CMP2 instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The CMP instructions are extended to compare a register against a pair of
|
|||
|
|
|||
|
bounds:
|
|||
|
|
|||
|
CMP2.Size <ea>,Rn
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The <ea> is a pointer to the bounds. The bounds are the same size as the
|
|||
|
|
|||
|
operation. The lower bound is stored first, then the upper bound.
|
|||
|
|
|||
|
If Rn is outside the bounds, the C flag is set, If Rn is equal to either
|
|||
|
|
|||
|
of the bounds, the Z flag is set, and both are cleared if Rn is within
|
|||
|
|
|||
|
the bounds.
|
|||
|
|
|||
|
-This operation may be used on both unsigned and signed data.
|
|||
|
|
|||
|
-If Rn is an address register, byte/word data is sign extended before
|
|||
|
|
|||
|
comparison
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3 Improved Multiply/Divide instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 020 greatly improves the multiplication/division instructions.
|
|||
|
|
|||
|
Now, you have these possibilities:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3.1 MULU/MULS instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Instruction Precision
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
1 MULU.W <ea>,Dn 16b*16b=>32b (68000 instruction)
|
|||
|
|
|||
|
2 MULU.L <ea>,Dl 32b*32b=>32b
|
|||
|
|
|||
|
3 MULU.L <ea>,Dh:Dl 32b*32b=>64b
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The syntax and precision of the MULS instruction are identical
|
|||
|
|
|||
|
to those of the MULU instructions.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3.1.1 MULU.W <ea>,Dn
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction multiplies the 16-bit value indicated by <ea> with
|
|||
|
|
|||
|
the 16-bit contents of Dn, and stores the result as a 32-bit value
|
|||
|
|
|||
|
in Dn. This is the basic MULU instruction that is found on the
|
|||
|
|
|||
|
68000 processor.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3.1.2 MULU.L <ea>,Dl
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction multiplies the 32-bit value indicated by <ea> with
|
|||
|
|
|||
|
the 32-bit contents of Dl. This produces a 64-bit result of which
|
|||
|
|
|||
|
the low 32 bits are discarded. The high 32 bits are then stored in
|
|||
|
|
|||
|
Dl.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3.2.3 MULU.L <ea>,Dh:Dl
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction multiplies the 32-bit value indicated by <ea> with
|
|||
|
|
|||
|
the 32-bit contents of Dl. This produces a 64-bit result. The high
|
|||
|
|
|||
|
32 bits are stored in Dh, and the low 32 bits are stored in Dl.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3.2 DIVU/DIVS
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Instruction Precision
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
1 DIVU.W <ea>,Dn 32b/16b=>16r:16q (68000 instruction)
|
|||
|
|
|||
|
2 DIVU.L <ea>,Dq 32b/32b=>32q
|
|||
|
|
|||
|
3 DIVU.L <ea>,Dr:Dq 64b/32b=>32r:32q
|
|||
|
|
|||
|
4 DIVUL.L <ea>,Dr:Dq 32b/32b=>32r:32q
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The syntax and precision of the DIVS instruction are identical
|
|||
|
|
|||
|
to those of the DIVU instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3.2.1 DIVU.W <ea>,Dn
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction divides the 32-bit contents of Dn with the 16-bit
|
|||
|
|
|||
|
value indicated by <ea>, and stores the quotient is stored in the
|
|||
|
|
|||
|
lowest word of Dn, and the remainder is stored in the highest.
|
|||
|
|
|||
|
This is the basic DIVU instruction that is found on the 68000
|
|||
|
|
|||
|
processor
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3.2.2 DIVU.L <ea>,Dq
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction divides the 32-bit contents of Dq with the 32-bit
|
|||
|
|
|||
|
value indicated by <ea>, and stores the quotient in Dq. The remainder
|
|||
|
|
|||
|
is discarded.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3.2.3 DIVU.L <ea>,Dr:Dq
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction divides the 64-bit contents of Dr(MSLW):Dq(LSLW)
|
|||
|
|
|||
|
with the 32-bit value indicated by <ea> and stores the quotien in
|
|||
|
|
|||
|
Dq, and the remainder in Dr.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.3.2.4 DIVUL.L <ea>,Dr:Dq
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction divides the 32-bit contents of Dq with the 32-bit
|
|||
|
|
|||
|
value indicated by <ea>, and stores the quotient in Dq, and the remainder
|
|||
|
|
|||
|
in Dr.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.4 The CHK2 instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 020 extends the CHK instruction to check a value against a pair
|
|||
|
|
|||
|
of bounds. See the description of CMP2 for information about these
|
|||
|
|
|||
|
bounds. If the value is outside the specified bounds, a CHK
|
|||
|
|
|||
|
exception is taken.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
3.5 The EXTB instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 020 allows the direct sign extension from a byte to a longword.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
EXTB.L Dn Extend byte to long
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The following code:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
ext.w d0
|
|||
|
|
|||
|
ext.l d0
|
|||
|
|
|||
|
|
|||
|
|
|||
|
can be replaced with:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
extb.l d0
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--- IV ---------------------- NEW INSTRUCTIONS ------------------- IV ---
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.1 Bit Field Instructions:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 020 is not confined to addressing data at byte, word or longword
|
|||
|
|
|||
|
boundaries, the new bit-field instructions allows access to data at
|
|||
|
|
|||
|
any arbitrarily bit position in a data register or memory. The length
|
|||
|
|
|||
|
of the data may be from 1 up to 32 bits. These instructions have a
|
|||
|
|
|||
|
different bit numbering than the ordinary instructions. The bits are
|
|||
|
|
|||
|
numbered from the leftmost digit towards the right.
|
|||
|
|
|||
|
To indicate a bit-field, the following syntax is used: {offset:width}
|
|||
|
|
|||
|
The "offset" is the number of bits to skip
|
|||
|
|
|||
|
The "width" is the number of bits included in the bit-field
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The following bit-field is described as {13:12}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
31 23 15 7 0 Ordinary bit numbering
|
|||
|
|
|||
|
| | | | |
|
|||
|
|
|||
|
-------------XXXXXXXXXXXX------- Bit field
|
|||
|
|
|||
|
| | | | |
|
|||
|
|
|||
|
0 8 16 24 31 Bit field numbering
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A bit field may also stretch across boundaries in memory, f. eks.:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
31 23 15 7 031 23 15
|
|||
|
|
|||
|
| | | | || | |
|
|||
|
|
|||
|
--------------------------XXXXXXXXXXXXXXXXX--------
|
|||
|
|
|||
|
| | | | | | |
|
|||
|
|
|||
|
0 8 16 24 32 40 48
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This bit-field would have been described as {26:17}
|
|||
|
|
|||
|
In addition, the offset may be negative when used in memory.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The control of bit-field is supported by 8 instructions, 4 single-
|
|||
|
|
|||
|
operand instructions (BFTST,BFCLR,BFSET, and BFCHG), and 4 double-
|
|||
|
|
|||
|
operand instructions. (BFFFO,BFEXTU,BFEXTS, and BFINS)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.1.1 Single operand Bit-field instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
These instructions can be viewed as extensions of the corresponding
|
|||
|
|
|||
|
bit instructions (BTST,BCLR,BSET, and BCHG)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
1 BFTST <ea>{offset:width} Test bit-field
|
|||
|
|
|||
|
2 BFCLR <ea>{offset:width} Test bit-field and clear it
|
|||
|
|
|||
|
3 BFSET <ea>{offset:width} Test bit-field and set it
|
|||
|
|
|||
|
4 BFCHG <ea>{offset:width} Test bit-field and invert it
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Each of these instructions first tests the bit-field and sets the
|
|||
|
|
|||
|
condition codes accordingly, then perform the action on the data
|
|||
|
|
|||
|
(SET,CLR or CHG).
|
|||
|
|
|||
|
Condition codes:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
N Set if the most significant digit was 1
|
|||
|
|
|||
|
Z Set if all bits are 0
|
|||
|
|
|||
|
C Cleared
|
|||
|
|
|||
|
V Cleared
|
|||
|
|
|||
|
X Not affected
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Only data register direct and control addressing modes are allowed
|
|||
|
|
|||
|
for the operand.
|
|||
|
|
|||
|
The offset may be either a value from 0-31 or contained as a 32-bit
|
|||
|
|
|||
|
signed value in a data register.
|
|||
|
|
|||
|
The width may be either a value from 1-32 or contained in the lower
|
|||
|
|
|||
|
5 bits of a data register.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.1.2 Double operand Bit-field instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
These instruction provides more control over bit-fields, such as
|
|||
|
|
|||
|
inserting, extracting and searching
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
1 BFEXTU <ea>{offset:width},Dn Extract a bit-field
|
|||
|
|
|||
|
2 BFEXTS <ea>{offset:width},Dn Extract and sign extend
|
|||
|
|
|||
|
3 BFINS Dn,<ea>{offset:width} Inserts a bitfield
|
|||
|
|
|||
|
4 BFFFO <ea>{offset:width},Dn Find First 1 in a BF.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Condition codes:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
N Set if the most significant bit in the BF is set
|
|||
|
|
|||
|
Z Set if all bits in the BF are 0
|
|||
|
|
|||
|
C Cleared
|
|||
|
|
|||
|
V Cleared
|
|||
|
|
|||
|
X Not affected
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The offset may be either a value of 0-31 or contained as a 32-bit
|
|||
|
|
|||
|
signed value in a data register.
|
|||
|
|
|||
|
The width may be either a value of 1-32 or contained in the lower
|
|||
|
|
|||
|
5 bits of a data register.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.1.2.1 BFEXTU instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction extracts a bit-field from the source operand,
|
|||
|
|
|||
|
right-justifies it, and places it in the destination register.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.1.2.2 BFEXTS instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction works just like the BFEXTU (4.1.2.1) instruction,
|
|||
|
|
|||
|
but sign extends the bit-field to 32-bits before storing it in
|
|||
|
|
|||
|
the destination register.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.1.2.3 BFINS instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction extracts the <width> lower bits of the source
|
|||
|
|
|||
|
register, and inserts it into the destination bit-field.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.1.2.4 BFFFO instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The bit offset of the most significant 1 in the bit-field is
|
|||
|
|
|||
|
stored in the data register. If no 1 is found in the bit-field,
|
|||
|
|
|||
|
the sum of the offset and width is stored in the destination.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The Bit-field instructions can be used for handling floating point
|
|||
|
|
|||
|
numbers in software.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.2 The RTD instruction (68010 and up)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction extends the operation of the RTS instruction.
|
|||
|
|
|||
|
It pops the PC off the stack, then a 16-bit displacement is added
|
|||
|
|
|||
|
to the SP. This makes it possible to clear parameters pushed on
|
|||
|
|
|||
|
to the stack by a calling program.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
RTD #displacement
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
A subroutine is called with parameters on the stack.
|
|||
|
|
|||
|
The size of these parameters equals <ParamSize>
|
|||
|
|
|||
|
The subroutine allocates some stack space for local data.
|
|||
|
|
|||
|
The size of this local data equals <LocalSize>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
SubRoutine:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
link a5,#-LocalSize ;Allocate local data space
|
|||
|
|
|||
|
movem.l d0-a6,-(sp) ;Save registers
|
|||
|
|
|||
|
.
|
|||
|
|
|||
|
. ;Do whatever...
|
|||
|
|
|||
|
.
|
|||
|
|
|||
|
movem.l (sp)+,d0-a6 ;Restore registers
|
|||
|
|
|||
|
unlk a5 ;Deallocate local data space
|
|||
|
|
|||
|
rtd #ParamSize ;Deallocate parameter space
|
|||
|
|
|||
|
; and return to caller
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Without this instruction, the stack cleanup would look like this:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
movem.l (sp)+,d0-a6
|
|||
|
|
|||
|
unlk a5
|
|||
|
|
|||
|
move.l (sp),(ParamSize,sp)
|
|||
|
|
|||
|
lea (ParamSize,sp),sp
|
|||
|
|
|||
|
rts
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.3 The BCD instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 68000 has some instructions for the manipulating of BCD coded data
|
|||
|
|
|||
|
(ABCD,NBCD,SBCD). The 020 extends this command set to include
|
|||
|
|
|||
|
instructions for packing/unpacking of such data, the PACK and UNPK
|
|||
|
|
|||
|
instructions.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.3.1 The PACK instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction packs data to a format usable by the other BCD
|
|||
|
|
|||
|
instructions. When used in memory, the instruction fetches 2 bytes of
|
|||
|
|
|||
|
data, adds a displacement, and concatenates bits 11-8 and 3-0 into
|
|||
|
|
|||
|
a single byte. When used on a data register, the displacement and the
|
|||
|
|
|||
|
contents of the data register is added, then bits 11-8 and 3-0 are
|
|||
|
|
|||
|
contatenated to form a byte.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction is useful for encoding a decimal number stored as a
|
|||
|
|
|||
|
string of ascii characters into a usable BCD code.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
1 PACK -(An),-(Am),#displacement
|
|||
|
|
|||
|
2 PACK Dn,Dm,#displacement
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
We want to encode the ascii string "76" ($3736) to BCD.
|
|||
|
|
|||
|
Recall that the numeric characters have ascii codes $30-$39.
|
|||
|
|
|||
|
"Data" is a pointer to the string we wish to convert.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
move.l (Data,pc),a0
|
|||
|
|
|||
|
move.w (a0),d0
|
|||
|
|
|||
|
pack d0,d1,#$0000
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Register d1 now contains the hex value $76.
|
|||
|
|
|||
|
If we'd wished to, we could have added the BCD 12 to the number in the
|
|||
|
|
|||
|
same instruction, like this:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
pack d0,d1,#$0102
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Register d1 now contains the hex value $88
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.3.2 The UNPK instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction unpacks a BCD coded number to a less compact version.
|
|||
|
|
|||
|
When used in memory, this instruction copies the 2 nibbles of the source
|
|||
|
|
|||
|
byte to the low nibble of two separate bytes, the two bytes are
|
|||
|
|
|||
|
concatenated into a word, and a displacement is added to the word.
|
|||
|
|
|||
|
When used on a data register, the nibbles are copied from the LSB or the
|
|||
|
|
|||
|
source register, and the unpacked word is placed in the LSW of the
|
|||
|
|
|||
|
destination register.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
1 UNPK -(An),-(An),#displacement
|
|||
|
|
|||
|
2 UNPK Dn,Dm,#displacement
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
We want to unpack the BCD number $76 to a printable ascii string.
|
|||
|
|
|||
|
The numberical characters start at ascii $30, so we must add this
|
|||
|
|
|||
|
value to both bytes. The displacement is then $3030.
|
|||
|
|
|||
|
"Data" is a pointer to the string we wish to fill.
|
|||
|
|
|||
|
Register d0 is preloaded with $76
|
|||
|
|
|||
|
|
|||
|
|
|||
|
move.l (Data,pc),a0
|
|||
|
|
|||
|
unpk d0,d1,#$3030
|
|||
|
|
|||
|
move.w d0,(a0)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.4 The MC68040 Block move instruction (MOVE16)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction uses the burst mode for rapid movement of a
|
|||
|
|
|||
|
block of data. The instruction can be used for fast block copy,
|
|||
|
|
|||
|
memory initialization and co-processor communication.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction aligns all addresses to 16-byte boundaries by masking
|
|||
|
|
|||
|
off the lower 4 bits of the addresses. A line of 16 bytes is copied
|
|||
|
|
|||
|
from the source to the destination address.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
1 MOVE16 (Ax)+,(Ay)+
|
|||
|
|
|||
|
2 MOVE16 xxx.L,(An)
|
|||
|
|
|||
|
3 MOVE16 xxx.L,(An)+
|
|||
|
|
|||
|
4 MOVE16 (An),xxx.L
|
|||
|
|
|||
|
5 MOVE16 (An)+,xxx.L
|
|||
|
|
|||
|
|
|||
|
|
|||
|
For the Amiga computers, some precautions must be taken when using this
|
|||
|
|
|||
|
instruction in Chip Memory. Fast Memory works fine, though.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
We want to copy an area of 128 bytes from "A" to "B"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
lea (A,pc),a0
|
|||
|
|
|||
|
lea (B,pc),a1
|
|||
|
|
|||
|
moveq #7,d0
|
|||
|
|
|||
|
Loop:
|
|||
|
|
|||
|
move16 (a0)+,(a1)+
|
|||
|
|
|||
|
dbf d0,Loop
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.5 The 68010 BKPT instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
This instruction is used for hardware testing, and executes differently
|
|||
|
|
|||
|
on the various members of the 68000 family, and is not described here.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.6 The 68020 Module instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
These instructions, (CALLM and RTM) appear only on the 68020 processor,
|
|||
|
|
|||
|
and the use of them is beyond the scope of this text.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.7 The CAS/CAS2 instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
These instructrions are provided for maintaining and protecting critical
|
|||
|
|
|||
|
data in a multiprocessor environment. Multiprocessing is beyond the
|
|||
|
|
|||
|
scope of this text, but I'll explain these instructions anyway
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Suppose two different processes write to the same memory, and have access
|
|||
|
|
|||
|
to a shared variable. This variable may be anything, such as a pointer
|
|||
|
|
|||
|
to a list. Process 1 retrieves this variable in d7, and copies it to d0
|
|||
|
|
|||
|
as a backup pointer. It then operates upon the pointer in d7.
|
|||
|
|
|||
|
Before Process 1 is finished with the operation, it is put to sleep, and
|
|||
|
|
|||
|
another process is made ready to run. This process alters the contents
|
|||
|
|
|||
|
of our variable. Later, our process is allowed to run again.
|
|||
|
|
|||
|
Before it can update the variable, it must test if someone else has
|
|||
|
|
|||
|
altered the variable in memory. This is done by comparing the backup
|
|||
|
|
|||
|
pointer in d0 with the data in memory.
|
|||
|
|
|||
|
-If the values are equal, the variable has not been altered by anybody,
|
|||
|
|
|||
|
and the new value can safely be written to the variable.
|
|||
|
|
|||
|
-However, if the values are not equal, the process should reload the new
|
|||
|
|
|||
|
value of the variable, and rerun it's operation.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The other process should protect itself in the same way as our process
|
|||
|
|
|||
|
did.
|
|||
|
|
|||
|
As a final point, the comparison and rewriting must be protected, so
|
|||
|
|
|||
|
that the other process doesn't alter the variable between the comparison
|
|||
|
|
|||
|
and rewriting. This is done by using an indivisible RMW cycle (RMW=
|
|||
|
|
|||
|
Read-Modify-Write)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.7.1 The CAS instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The instruction CAS implements this comparison between global data and
|
|||
|
|
|||
|
a register, as well as a data transfer using this RMW cycle.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
CAS.Size Dc,Du,<ea>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The <ea> is compared to the contents of register Dc. If they are equal,
|
|||
|
|
|||
|
the contents of Du is written to <ea>. If they are not equal, the
|
|||
|
|
|||
|
contents of <ea> is copied to Dc. The Z bit reflects the result of the
|
|||
|
|
|||
|
comparison.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.7.2 The CAS2 instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The CAS2 instruction works like the CAS instruction except that it
|
|||
|
|
|||
|
performs comparisons and updates on two data values.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
CAS2.Size Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rn may be any data or address register.
|
|||
|
|
|||
|
Only if the contents of Dc1 equals (Rn1) and the contents of Dc2
|
|||
|
|
|||
|
equals (Rn2) will the contents of Du1 be written to (Rn1) and
|
|||
|
|
|||
|
Du2 be written to (Rn2). This instruction is well suited to
|
|||
|
|
|||
|
protect multi-linked lists in a multi-processor environment.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
WARNING:
|
|||
|
|
|||
|
Like the TAS instruction, the CAS/CAS2 instructions should NOT be
|
|||
|
|
|||
|
used on an Amiga, as they are not supported by the hardware.
|
|||
|
|
|||
|
The indivisable RMW cycle conflicts with the Amiga's bus system.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.8 The CoProcessor interface instructions.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
These instructions are outside the scope of this text, see the
|
|||
|
|
|||
|
"MC68020 CoProcessor support instructions" text by this author
|
|||
|
|
|||
|
for information about how to program using these instructions.
|
|||
|
|
|||
|
However, here is a list of the instructions:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.8.1 User state coprocessor instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
cpBcc Branch on Coprocessor Condition
|
|||
|
|
|||
|
cpDBcc Test coprocessor Condition, Decrement and Branch
|
|||
|
|
|||
|
cpGEN Coprocessor general function
|
|||
|
|
|||
|
cpScc Set on Coprocessor Condition
|
|||
|
|
|||
|
cpTRAPcc Trap on Coprocessor Condition
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.8.2 Supervisor state coprocessor instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
cpRESTORE Coprocessor Restore Functions
|
|||
|
|
|||
|
cpSAVE Coprocessor save Function
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4.9 Conditional TRAP instruction
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The 020 allows conditional traps. If the specified condition is true,
|
|||
|
|
|||
|
a TRAPcc exception (exception 7) will be taken.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax:
|
|||
|
|
|||
|
TRAPcc #Data
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The <cc> may be any of the <cc>'s that are supported by the ordinary
|
|||
|
|
|||
|
conditional branch instructions.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--- V ---------------------ADDRESSING MODE TABLES------------------- V ---
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
5.1 Allowed Adressing modes
|
|||
|
|
|||
|
|
|||
|
|
|||
|
CMP2 Compare Register Against Bounds
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: CMP2 <ea>,Rn
|
|||
|
|
|||
|
Size: Byte/Word/Long
|
|||
|
|
|||
|
Length: 4 bytes+<ea> data
|
|||
|
|
|||
|
Modes: (An)
|
|||
|
|
|||
|
(d16,An)
|
|||
|
|
|||
|
(d8,An,Xn)
|
|||
|
|
|||
|
(bd,An,Xn)
|
|||
|
|
|||
|
$xxx.W
|
|||
|
|
|||
|
$xxx.L
|
|||
|
|
|||
|
(d16,PC)
|
|||
|
|
|||
|
(d8,PC,Xn)
|
|||
|
|
|||
|
(bd,PC,Xn)
|
|||
|
|
|||
|
([bd,An,Xn],od)
|
|||
|
|
|||
|
([bd,An],Xn,od)
|
|||
|
|
|||
|
([bd,PC,Xn],od)
|
|||
|
|
|||
|
([bd,PC],Xn,od)
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
MULU/MULS Multiply (Un)signed
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: MULU/S.W <ea>,Dn 16b*16b=>32b
|
|||
|
|
|||
|
MULU/S.L <ea>,Dl 32b*32b=>32b
|
|||
|
|
|||
|
MULU/S.L <ea>,Dh:Dl 32b*32B=>64b
|
|||
|
|
|||
|
Size: Word/Long
|
|||
|
|
|||
|
Length: 2 bytes+<ea> data (word)
|
|||
|
|
|||
|
4 bytes+<ea> data (long)
|
|||
|
|
|||
|
Modes: (both)
|
|||
|
|
|||
|
Dn
|
|||
|
|
|||
|
(An)
|
|||
|
|
|||
|
(An)+
|
|||
|
|
|||
|
-(An)
|
|||
|
|
|||
|
(d16,An)
|
|||
|
|
|||
|
(d8,An,Xn)
|
|||
|
|
|||
|
$xxx.W
|
|||
|
|
|||
|
$xxx.L
|
|||
|
|
|||
|
#<data>
|
|||
|
|
|||
|
(d16,PC)
|
|||
|
|
|||
|
(d8,PC,Xn)
|
|||
|
|
|||
|
(bd,An,Xn)
|
|||
|
|
|||
|
([bd,An,Xn],od)
|
|||
|
|
|||
|
([bd,An],Xn,od)
|
|||
|
|
|||
|
(bd,PC,Xn)
|
|||
|
|
|||
|
([bd,PC,Xn],od)
|
|||
|
|
|||
|
([bd,PC],Xn,od)
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
DIVU(L)/DIVS(L) Divide (Un)signed
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: DIVU.W <ea>,Dn 32b/16b=>16r:16q
|
|||
|
|
|||
|
DIVU.L <ea>,Dq 32b/32b=>32q
|
|||
|
|
|||
|
DIVU.L <ea>,Dr:Dq 64b/32b=>32r:32q
|
|||
|
|
|||
|
DIVUL.L <ea>,Dr:Dq 32b/32b=>32r:32q
|
|||
|
|
|||
|
Size: Word/Long
|
|||
|
|
|||
|
Length: 2 bytes+<ea> data (word)
|
|||
|
|
|||
|
4 bytes+<ea> data (long)
|
|||
|
|
|||
|
Modes: (both)
|
|||
|
|
|||
|
Dn
|
|||
|
|
|||
|
(An)
|
|||
|
|
|||
|
(An)+
|
|||
|
|
|||
|
-(An)
|
|||
|
|
|||
|
(d16,An)
|
|||
|
|
|||
|
(d8,An,Xn)
|
|||
|
|
|||
|
$xxx.W
|
|||
|
|
|||
|
$xxx.L
|
|||
|
|
|||
|
#<data>
|
|||
|
|
|||
|
(d16,PC)
|
|||
|
|
|||
|
(d8,PC,Xn)
|
|||
|
|
|||
|
(bd,An,Xn)
|
|||
|
|
|||
|
([bd,An,Xn],od)
|
|||
|
|
|||
|
([bd,An],Xn,od)
|
|||
|
|
|||
|
(bd,PC,Xn)
|
|||
|
|
|||
|
([bd,PC,Xn],od)
|
|||
|
|
|||
|
([bd,PC],Xn,od)
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
CHK2 Check Register Against Bounds
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: CHK2 <ea>,Rn
|
|||
|
|
|||
|
Size: Byte/Word/Long
|
|||
|
|
|||
|
Length: 4 bytes+<ea> data
|
|||
|
|
|||
|
Modes: (An)
|
|||
|
|
|||
|
(d16,An)
|
|||
|
|
|||
|
(d8,An,Xn)
|
|||
|
|
|||
|
(bd,An,Xn)
|
|||
|
|
|||
|
$xxx.W
|
|||
|
|
|||
|
$xxx.L
|
|||
|
|
|||
|
(d16,PC)
|
|||
|
|
|||
|
(d8,PC,Xn)
|
|||
|
|
|||
|
(bd,PC,Xn)
|
|||
|
|
|||
|
([bd,An,Xn],od)
|
|||
|
|
|||
|
([bd,An],Xn,od)
|
|||
|
|
|||
|
([bd,PC,Xm],od)
|
|||
|
|
|||
|
([bd,PC],Xn,od)
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
EXTB Extend Byte to long
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: EXTB.L Dn
|
|||
|
|
|||
|
Size: Word/Long
|
|||
|
|
|||
|
Length: 2 bytes
|
|||
|
|
|||
|
Modes: Dn
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
BFxxx BitField instructions
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: BFTST <ea>{offset:width} BF Test
|
|||
|
|
|||
|
BFSET <ea>{offset:width} BF test and Set
|
|||
|
|
|||
|
BFCLR <ea>{offset:width} BF test and clear
|
|||
|
|
|||
|
BFCHG <ea>{offset:width} BF test and Change
|
|||
|
|
|||
|
BFEXTS <ea>{offset:width},Dn BF Extract Signed
|
|||
|
|
|||
|
BFEXTU <ea>{offset:width},Dn BF Extract Unsigned
|
|||
|
|
|||
|
BFFFO <ea>{offset:width},Dn BF Find First One
|
|||
|
|
|||
|
BFINS Dn,<ea>{offset:width} BF Insert
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Both offset and width may be specified as data registers
|
|||
|
|
|||
|
Size: The BF instructions are unsized
|
|||
|
|
|||
|
Length: 4 bytes+<ea> data
|
|||
|
|
|||
|
Modes: Dn
|
|||
|
|
|||
|
(An)
|
|||
|
|
|||
|
(d16,An)
|
|||
|
|
|||
|
(d8,An,Xn)
|
|||
|
|
|||
|
(db,An,Xn)
|
|||
|
|
|||
|
([bd,An,Xn],od)
|
|||
|
|
|||
|
([bd,An],Xn,od)
|
|||
|
|
|||
|
([bd,PC,Xn],od)
|
|||
|
|
|||
|
([bd,PC],Xn,od)
|
|||
|
|
|||
|
$xxx.W
|
|||
|
|
|||
|
$xxx.L
|
|||
|
|
|||
|
(d16,PC)
|
|||
|
|
|||
|
(d8,PC,Xn)
|
|||
|
|
|||
|
(bd,PC,Xn)
|
|||
|
|
|||
|
([bd,PC,Xn],od)
|
|||
|
|
|||
|
([bd,PC],Xn,od)
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
RTD Return and Deallocate
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: RTD #displacement
|
|||
|
|
|||
|
Size: Unsized
|
|||
|
|
|||
|
Length: 4 bytes
|
|||
|
|
|||
|
Modes: #<data>
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
PACK Pack BCD data
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: PACK -(Ax),-(Ay),#displacement
|
|||
|
|
|||
|
PACK Dx,Dy,#displacement
|
|||
|
|
|||
|
Size: Unsized
|
|||
|
|
|||
|
Length: 4 bytes
|
|||
|
|
|||
|
Modes: See syntax
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
UNPK Unpack BCD data
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: UNPK -(Ax),-(Ay),#displacement
|
|||
|
|
|||
|
UNPK Dx,Dy,#displacement
|
|||
|
|
|||
|
Size: Unsized
|
|||
|
|
|||
|
Length: 4 bytes
|
|||
|
|
|||
|
Modes: See sntax
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
MOVE16 Move 16 bytes block
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: MOVE16 (Ax)+,(Ay)+
|
|||
|
|
|||
|
MOVE16 $xxx.L,(An)
|
|||
|
|
|||
|
MOVE16 $xxx.L,(An)+
|
|||
|
|
|||
|
MOVE16 (An),$xxx.L
|
|||
|
|
|||
|
MOVE16 (An)+,$xxx.L
|
|||
|
|
|||
|
Size: 1 line (16 bytes)
|
|||
|
|
|||
|
Length: 4 bytes (Ax)+,(Ay)+
|
|||
|
|
|||
|
6 bytes The rest
|
|||
|
|
|||
|
Modes: See syntax
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
CAS/CAS2 Compare And Swap with operand
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: CAS Dc,Du,<ea>
|
|||
|
|
|||
|
CAS2 Dc1:Dc2,Du1:Du2,(Rn1):(Rn2)
|
|||
|
|
|||
|
Size: Byte/Word/Long (CAS)
|
|||
|
|
|||
|
Word/Long (CAS2)
|
|||
|
|
|||
|
Length: 4 bytes+<ea> data (CAS)
|
|||
|
|
|||
|
6 bytes+<ea> data (CAS2)
|
|||
|
|
|||
|
Modes: (CAS)
|
|||
|
|
|||
|
(An)
|
|||
|
|
|||
|
(An)+
|
|||
|
|
|||
|
-(An)
|
|||
|
|
|||
|
(d16,An)
|
|||
|
|
|||
|
(d8,An,Xn)
|
|||
|
|
|||
|
(bd,An,Xn)
|
|||
|
|
|||
|
([bd,An,Xn],od)
|
|||
|
|
|||
|
([bd,An],Xn,od)
|
|||
|
|
|||
|
$xxx.W
|
|||
|
|
|||
|
$xxx.L
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
TRAPcc Trap on Condition
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Syntax: TRAPcc
|
|||
|
|
|||
|
TRAPcc.W #<data>
|
|||
|
|
|||
|
TRAPcc.L #<data>
|
|||
|
|
|||
|
Size: Unsized/Word/Long
|
|||
|
|
|||
|
Length: 2 bytes (Unsized)
|
|||
|
|
|||
|
4 bytes (Word)
|
|||
|
|
|||
|
6 bytes (Long)
|
|||
|
|
|||
|
Modes: #<data>
|
|||
|
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
***********************************************************************************************
|
|||
|
|
|||
|
* The text in this document is written by Erik H. Bakke *
|
|||
|
|
|||
|
* <20> 1993 Erik H. Bakke/Bakke SoftDev *
|
|||
|
|
|||
|
* This document may be freely redistributed as long as it remains unchanged and together with *
|
|||
|
|
|||
|
* the FPU programming document *
|
|||
|
|
|||
|
***********************************************************************************************
|
|||
|
|
|||
|
*Permission is granted to Michael Glew to incorporate it in his Asp68k project, and eventually*
|
|||
|
|
|||
|
* editing it to fit in the Asp68k environment *
|
|||
|
|
|||
|
*Permission is granted to include this document in the HowToCode archive as long as it remains*
|
|||
|
|
|||
|
* unchanged. *
|
|||
|
|
|||
|
***********************************************************************************************
|
|||
|
|
|||
|
* For error corrections, comments etc., the author can be reached at *
|
|||
|
|
|||
|
* e-mail: db36@hp825.bih.no *
|
|||
|
|
|||
|
* phone: +47-5630-5537 (13:00-21:00 GMT) *
|
|||
|
|
|||
|
* post: Erik H. Bakke *
|
|||
|
|
|||
|
* Bj<42>rnen *
|
|||
|
|
|||
|
* N-5227 S<>RE NESET *
|
|||
|
|
|||
|
* Norway *
|
|||
|
|
|||
|
*********************************************************************************************** |