NED@YMIR.BITNET (Ned Freed) (08/06/87)
==Instruction set help file part 2==cut here==cut here==cut here==cut here==
longword 0 is pushed on the stack (for the condition
handler). FP is replaced by SP, AP is replaced by
arglist. The trap enables in PSW are set to a known
state. Integer and decimal overflow are set
according to bits 14 and 15 of the entry mask
respectively. The floating underflow bit is cleared
and the T-bit is unaffected. PC is replaced by dst +
2, skipping the entry mask and transferring control
to the byte beyond the mask.
.if manual
.s 1
.endif manual
Notes: If bits 13:12 of the entry mask are not zero, a
reserved operand fault occurs and the condition
codes will be unpredictable. The procedure calling
standard specifies that any procedure must preserve
the values of R2 through R11 (via the entry mask),
and R0 and R1 are never preserved. The time shown
for CALLG assumes no registers are saved. If R0
through R9 are saved the time is [780-23.40]. If
no registers are saved a CALLG followed immediately
by a RET requires:
[780-13.88, 750-19.41, 730-36.78]
[780F-13.87, 750F-19.41, 730F-37.65]
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CALLS instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><CALLS
.else manual
2 CALLS
.endif manual
.nf
Purpose: call with stack argument list - invoke a procedure
with actual arguments on the stack
.if manual
.s 1
.endif manual
Format: opcode numarg.rl,dst.ab
.if manual
.s 1
.endif manual
Operation: {push arg count}; {align stack}; {create stack
frame}; {set arithmetic trap enables}; {set new
values of AP, FP, PC}
.if manual
.s 1
.endif manual
C. Codes: N = 0, Z = 0, V = 0, C = 0
.if manual
.s 1
.endif manual
Exceptions: Reserved operand
.if manual
.s 1
.endif manual
Opcode: FB CALLS Call proc. with stack arglist
[780-9.80]
.if manual
.s 1
.endif manual
Description: numarg is pushed on the stack as a longword (byte 0
contains the number of arguments, the high-order 24
bits are used by Digital software), SP is saved in a
temporary (tmp) and then bits 1:0 of SP are cleared
so the stack is longword aligned. The procedure
entry mask (pointed to by dst) is scanned from bit
11 to bit 0 and the contents of the registers whose
numbers correspond to set bits in the mask are
pushed on the stack as longwords. AP, FP and the
current PC are pushed onto the stack as longwords.
The condition codes are cleared. A longword
containing the saved two low bits of SP in bits
31:30 (tmp), 1 in bit 29, a 0 in bit 28, the low 12
bits of the entry mask in bits 27:16 and the PSW in
bits 15:0 with T cleared is pushed on the stack. A
longword 0 is pushed on the stack (for the condition
handler address within the procedure). FP is
replaced by SP, AP is set to the saved SP (value of
SP after numarg was pushed. The trap enables in PSW
are set to a known state. Integer and decimal
overflow are set according to bits 14 and 15 of the
entry mask respectively. The floating underflow bit
is cleared and the T-bit is unaffected. PC is
replaced by dst + 2, skipping the entry mask and
transferring control to the byte beyond the mask.
.if manual
.s 1
.endif manual
Notes: If bits 13:12 of the entry mask are not zero, a
reserved operand fault occurs and the condition
codes will be unpredictable. The procedure calling
standard specifies that any procedure must preserve
the values of R2 through R11 (via the entry mask),
and R0 and R1 are never preserved. The normal
practice with CALLS is to push arguments onto the
stack in reverse order. On return the argument list
is removed from the stack automatically. The time
shown for CALLS assumes no registers are saved.
If R0 through R9 are saved the time is [780-24.40].
If no registers are saved a CALLS with no arguments
immediately followed by a RET requires:
[780-14.76, 750-20.87, 730-37.15]
[780F-14.75, 750F-20.87, 730F-36.61]
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CASEx instructions\*
.restore
.send toc .endif global
.else manual
2 CASEx
.endif manual
.nf
Purpose: perform multi-way branching depending on arithmetic
input
.if manual
.s 1
.endif manual
Format: opcode selector.rx,base.rx,limit.rx,disp[0].bw,...,
disp[limit].bw
.if manual
.s 1
.endif manual
Operation: tmp = selector - base; PC = PC + if tmp LEQU limit
then SEXT (displ[tmp]) else {2 + 2*ZEXT (limit)}
.if manual
.s 1
.endif manual
C. Codes: N = {tmp LSS limit}, Z = {tmp EQL limit}, V = 0,
C = {tmp LSSU limit}
.if manual
.s 1
.endif manual
Exceptions: None
.if manual
.s 1
.endif manual
Opcodes: 8F CASEB Case byte [780-2.40]
.index ^Instructions, machine><CASEB
AF CASEW Case word [780-2.40]
.index ^Instructions, machine><CASEW
CF CASEL Case long [780-2.20]
.index ^Instructions, machine><CASEL
.if manual
.s 1
.endif manual
Description: base is subtracted from selector and tmp is replaced
by the result. The temporary tmp is compared with
limit and if it is less than or equal (unsigned) a
branch displacement is selected by tmp added to PC
and PC is replaced by the result. Otherwise 2 *
(limit+1) is added to PC and the result is placed
in PC. This causes PC to be moved past the table of
branch displacements. The condition codes are always
affected by the comparison of tmp with limit.
.if manual
.s 1
.endif manual
Notes: The times shown assume the branch is taken. If the
branch is not taken the time for all CASE
instructions is [780-2.20].
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CHMx instructions\*
.restore
.send toc .endif global
.else manual
2 CHMx
.endif manual
.nf
Purpose: request the services of more privileged software
by changing the process mode
.if manual
.s 1
.endif manual
Format: opcode code.rw
.if manual
.s 1
.endif manual
Operation: tmp1 = {mode selected by opcode (K = 0, E = 1,
S = 2, U = 3)}; tmp2 = MINU(tmp1,PSL_<CUR__MOD_>);
{maximize privilege}; tmp3 = SEXT(code); if
{PSL_<IS_> EQLU 1} then HALT; PSL_<CUR__MOD_>__SP = SP
tmp4 = tmp2__sp; PROBEW (from tmp4 - 1 to tmp4 - 12
with mode = tmp2); if {access violation} then
{initiate access violation fault}; if {translation
not valid} then {initiate translation not valid};
{initiate CHMx exception with new__mode = tmp2
and parameter = tmp3 using 40 + tmp1*4 as SCB offset
using tmp4 as the new SP and not storing SP again}
.if manual
.s 1
.endif manual
C. Codes: N = 0, Z = 0, V = 0, C = 0
.if manual
.s 1
.endif manual
Exceptions: Halt
.if manual
.s 1
.endif manual
Opcodes: BC CHMK Change mode to kernel
.index ^Instructions, machine><CHMK
BD CHME Change mode to executive
.index ^Instructions, machine><CHME
BE CHMS Change mode to supervisor
.index ^Instructions, machine><CHMS
BF CHMU Change mode to user
.index ^Instructions, machine><CHMU
.if manual
.s 1
.endif manual
Description: Change mode instructions allow processes to change
their access mode in a controlled manner. The
instructions only increase privilege. A change in
mode also results in a change of stack pointers;
the old pointer is saved, the new pointer is loaded.
The PSL, PC and any code passed by the instruction
are pushed on the new stack. The code is sign
extended. The destination mode selected by the
opcode is used to select a vector from the System
Control Block. Software convention reserves the
negative code values to customers, positive
code values to Digital.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CLRx instructions\*
.restore
.send toc .endif global
.else manual
2 CLRx
.endif manual
.nf
Purpose: clear or zero a scalar quantity
.if manual
.s 1
.endif manual
Format: opcode dst.wx
.if manual
.s 1
.endif manual
Operation: dst = 0
.if manual
.s 1
.endif manual
C. Codes: N = 0, Z = 1, V = 0, C = 0
.if manual
.s 1
.endif manual
Exceptions: None
.if manual
.s 1
.endif manual
Opcodes: 94 CLRB Clear byte [780-0.60]
.index ^Instructions, machine><CLRB
B4 CLRW Clear word [780-0.60]
.index ^Instructions, machine><CLRW
D4 CLRL Clear long
.index ^Instructions, machine><CLRL
[780-0.60, 750-1.00, 730-1.40]
[780F-0.60, 750F-1.00, 730F-1.27]
7C CLRQ Clear quad
.index ^Instructions, machine><CLRQ
[780-1.20, 750-1.32, 730-4.02]
[780F-1.20, 750F-1.32, 730F-4.02]
7CFD CLRO Clear octa
.index ^Instructions, machine><CLRO
D4 CLRF Clear F__floating [780-0.60]
.index ^Instructions, machine><CLRF
7C CLRD Clear D__floating [780-1.20]
.index ^Instructions, machine><CLRD
7C CLRG Clear G__floating [780-1.20]
.index ^Instructions, machine><CLRG
7CFD CLRH Clear H__floating
.index ^Instructions, machine><CLRH
.if manual
.s 1
.endif manual
Description: The destination operand is replaced by 0.
.if manual
.s 1
.endif manual
Notes: CLRx is equivalent to MOVx S_^_#0,dst, but it
is shorter.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CMPx instructions\*
.restore
.send toc .endif global
.else manual
2 CMPx
.endif manual
.nf
Purpose: arithmetic comparison between two scalar quantities
.if manual
.s 1
.endif manual
Format: opcode scr1.rx,src2.rx
.if manual
.s 1
.endif manual
Operation: src1 - src2
.if manual
.s 1
.endif manual
C. Codes: N = {src1 LSS src2}, Z = {src1 EQL src2},
V = 0, C = {src1 LSSU src2} (integer),
C = 0 (floating)
.if manual
.s 1
.endif manual
Exceptions: None (integer), reserved operand (floating)
.if manual
.s 1
.endif manual
Opcodes: 91 CMPB Compare byte [780-0.40]
.index ^Instructions, machine><CMPB
B1 CMPW Compare word [780-0.40]
.index ^Instructions, machine><CMPW
D1 CMPL Compare long [780-0.40]
.index ^Instructions, machine><CMPL
51 CMPF Compare F__floating [780-1.60]
.index ^Instructions, machine><CMPF
71 CMPD Compare D__floating [780-3.00]
.index ^Instructions, machine><CMPD
51FD CMPG Compare G__floating
.index ^Instructions, machine><CMPG
71FD CMPH Compare H__floating
.index ^Instructions, machine><CMPH
.if manual
.s 1
.endif manual
Description: src1 is compared with src2. The only action is to
affect the condition codes.
.if manual
.s 1
.endif manual
Notes: On a floating reserved operand fault, the
condition codes are unpredictable.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CMPCx instructions\*
.restore
.send toc .endif global
.else manual
2 CMPCx
.endif manual
.nf
Purpose: compare two character strings
.if manual
.s 1
.endif manual
Format: opcode len.rw,src1addr.ab,src2addr.ab ;3 operand
opcode src1len.rw,src1addr.ab,fill.rb ;5 operand
src2len.rw,src2addr.ab
.if manual
.s 1
.endif manual
Operation: {compare two strings with optional filling}
.if manual
.s 1
.endif manual
C. Codes: [final codes reflect last affecting of codes
in the operation.]
N = {{first byte} LSS {second byte}}, Z =
{{first byte} EQL {second byte}}, V = 0,
C = {{first byte} LSSU {second byte}}
.if manual
.s 1
.endif manual
Exceptions: None
.if manual
.s 1
.endif manual
Opcodes: 29 CMPC3 Compare character 3 operand
[780-14.27, 750-26.48, 730-61.80]
[780F-14.27, 750F-26.48, 730F-62.43]
.index ^Instructions, machine><CMPC3
2D CMPC5 Compare character 5 operand
.index ^Instructions, machine><CMPC5
.if manual
.s 1
.endif manual
Description: In 3-operand format the bytes of string 1 specified
by len and src1addr are compared with string 2
specified by len and src2addr. In 5-operand format
the bytes of string 1 specified by src1len and
src1addr are compared with string 2 specified by
src2len and src2addr. If one string is longer than
the other the shorter string is conceptually
extended by appending bytes with the value of fill
to the end. Comparison proceeds until all the bytes
have been examined or inequality is detected.
Condition codes are affected by the last character
comparison.
.if manual
.s 1
.endif manual
Notes: After execution R0 = number of bytes left in string
1, R1 = address of last compared byte in string 1
(if the strings are equal R1 will point to one
beyond string 1), R2 = number of bytes remaining in
string 2, R3 = address of last byte used in string
2 (if strings are equal R3 will be one beyond the
end of string 2). The times shown assume equal
strings of length 10. If equal strings of length 64
are used the times are CMPC3 - [780-24.20], CMPC5 -
[780-26.80]. If equal strings of length 4 are used
the times are CMPC3 - [780-5.80], CMPC5 - [780-8.00].
If equal strings of length 512 are used the times
are CMPC3 - [780-159.40], CMPC5 - [780-161.80]. If
strings of length 4 with the first character unequal
are used the times are CMPC3 - [780-7.00],
CMPC5 - [780-9.20].
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CMPPx instructions\*
.restore
.send toc .endif global
.else manual
2 CMPPx
.endif manual
.nf
Purpose: compare two packed decimal strings and set the
condition codes
.if manual
.s 1
.endif manual
Format: opcode len.rw,scr1addr.ab,src2addr.ab ;3 operand
opcode src1len.rw,src1addr.ab,
src2len.rw,src2addr.ab ;4 operand
.if manual
.s 1
.endif manual
Operation: ({src1addr + ZEXT(len/2)}:src1addr) =
({src2addr + ZEXT(len/2)}:src2addr) ;3 operand
({src1addr + ZEXT(src1len/2)}:src1addr =
({arc2addr + ZEXT(src2len/2)}:src2addr ;4 operand
.if manual
.s 1
.endif manual
C. Codes: N = {{src1 string} LSS {src2 string}}, V = 0,
Z = {{src1 string} EQL {src2 string}}, C = 0
.if manual
.s 1
.endif manual
Exceptions: Reserved operand
.if manual
.s 1
.endif manual
Opcodes: 35 CMPP3 Compare packed 3 operand
.index ^Instructions, machine><CMPP3
37 CMPP4 Compare packed 4 operand
.index ^Instructions, machine><CMPP4
.if manual
.s 1
.endif manual
Description: In 3-operand format, the source 1 string specified
by src1addr and len is compared with the source 2
string specified by the src2addr and len. In
4-operand format, the source 1 string is specified
by src1addr and src1len, the source 2 string by
src2addr and src2len. The only action in either
case is to affect the condition codes.
.if manual
.s 1
.endif manual
Notes: The registers are set as follows by CMPP3 or CMPP4:
R0 = 0, R1 = address of most significant digits of
string 1, R2 = 0, R3 = address of most significant
digit of string 2. R0 through R3 and the condition
codes are unpredictable if the strings overlap or
if a reserved operand fault occurs.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CMPxV instructions\*
.restore
.send toc .endif global
.else manual
2 CMPxV
.endif manual
.nf
Purpose: compare field - compare bit field to integer
.if manual
.s 1
.endif manual
Format: opcode pos.rl,size.rb,base.rb,src.rl
.if manual
.s 1
.endif manual
Operation: FIELD (pos, size, base) - src
.if manual
.s 1
.endif manual
C. Codes: N = {field LSS src}, Z = {field EQL src},
V = 0, C = {field LSSU src}
.if manual
.s 1
.endif manual
Exceptions: Reserved operand
.if manual
.s 1
.endif manual
Opcodes: EC CMPV Compare field [780-3.00]
.index ^Instructions, machine><CMPV
ED CMPZV Compare zero-extended field
.index ^Instructions, machine><CMPZV
[780-2.80]
.if manual
.s 1
.endif manual
Description: The field specified by pos, base and size is
compared with the source operand. For CMPV, src is
compared with the sign extended field. For CMPZV,
src is compared with the zero extended field. The
only action is to affect the condition codes.
.if manual
.s 1
.endif manual
Notes: The times shown assume 20 bits extracted positioned
at bit 4.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CRC instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><CRC
.else manual
2 CRC
.endif manual
.nf
Purpose: calculate cyclic redundancy check for software
or communications checking
.if manual
.s 1
.endif manual
Format: opcode tbl.ab,inicrc.rl,strlen.rw,stream.ab
.if manual
.s 1
.endif manual
Operation: R0 = CRC__accumulation (initial value - inicrc,
polynomial table - tbl, data stream - (stream,
strlen))
.if manual
.s 1
.endif manual
C. Codes: N = {R0 LSS 0}, Z = {R0 EQL 0}, V = 0, C = C
.if manual
.s 1
.endif manual
Exceptions: None
.if manual
.s 1
.endif manual
Opcodes: 0B CRC Cyclic redundancy check
[780-47.91, 750-86.84, 730-188.88]
[780F-47.89, 750-86.84, 730-186.26]
.if manual
.s 1
.endif manual
Description: The CRC of the data stream pointed to by stream
and of length strlen is calculated. The initial
CRC is given by inicrc and is normally 0 or -1
unless the CRC is calculated in several steps.
R0 is replaced by the result. If the polynomial
is less than order -32, the result must be
extracted from R0. The CRC polynomial is expressed
by the contents of the 16-longword table.
.if manual
.s 1
.endif manual
Notes: If the data stream is not a multiple of 8 bits in
length, it must be right adjusted with leading 0
fill. If the CRC polynomial is less than order -32,
the result must be extracted from the low order
bits of R0. Given a polynomial, the CRC table for
that polynomial may be found by the relation:
poly_<n_> = {coefficient of x**(order-1-n)}. This
operation is done automatically by the system
library routine LIB_$CRC__TABLE (poly.rl, table.ab).
The table is the location of a 64-byte table into
which the result will be written. This instruction
will produce an unpredictable result if the table
is not well formed. All well formed tables have
entry[0] = 0 and entry[8] = a polynomial created
by the relationship given above. If the data
is of zero length, R0 = inicrc. The times shown
assume a 16 byte CRC operation.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CVTxx instructions\*
.restore
.send toc .endif global
.else manual
2 CVTxx
.endif manual
.index ^Instructions, machine><CVT\x\x
.nf
Purpose: convert a signed quantity to a different signed
data type
.if manual
.s 1
.endif manual
Format: opcode src.rx,dst.wy
.if manual
.s 1
.endif manual
Operation: dst = conversion or src
.if manual
.s 1
.endif manual
C. Codes: N = dst LSS 0, Z = dst EQL 0, C = 0
V = {src cannot be represented in dst}
.if manual
.s 1
.endif manual
Exceptions: Integer/floating overflow, reserved operand
.if manual
.s 1
.endif manual
Opcodes: See table below:
.s 1
.test page 14
from/to |Byte |Word |Long |F__float|D__float|G__float|H__float|
--------|-------|-------|-------|-------|-------|-------|-------|
Byte | |99 xg|98 xg|4C ei|6C el|4CFD e|6CFD e|
Word |33 th| |32 xg|4D ei|6D el|4DFD e|6DFD e|
Long |F6 th|F7 th| |4E rj|6E el|4EFD e|6EFD e|
F__float |48 tm|49 tm|4A tm| |56 ek|99FD e|98FD e|
D__float |68 tn|69 tn|6A tn|76 rl| | |32FD e|
G__float |48FD t|49FD t|4AFD t|33FD r| | |56FD e|
H__float |68FD t|69FD t|6AFD t|F6FD r|F7FD r|76FD r| |
--------|-------|-------|-------|-------|-------|-------|-------|
legend: t - truncate, x - sign extend, e - exact, r - rounded,
g - [780-0.80], h - [780-1.00], i - [780-1.20],
j - [780-1.40], k - [780-1.60], l - [780-1.80],
m - [780-2.80], n - [780-4.60].
.if manual
.s 1
.endif manual
4B CVTRFL Convert and round F__floating to long
[780-2.80]
6B CVTRDL Convert and round D__floating to long
[780-5.40]
4BFD CVTRGL Convert and round G__floating to long
6BFD CVTRHL Convert and round H__floating to long
.if manual
.s 1
.endif manual
Notes: Integer overflow occurs if any truncated bits of src
are not equal to the MSB of the dst. On integer
overflow, the low order bits of the true result are
retained. On floating overflow, dst is replaced with
a reserved operand, with the flags: N=1, Z=0, V=1,
and C=0. Only converts with a floating point source
can result in a reserved operand fault. The library
procedures MTH$CVT__D__G (rounded) and MTH$CVT__G__D
(exact) can be used to convert between D__floating
and G__floating, since no instructions exist
for this operation.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CVTLP instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><CVTLP
.else manual
2 CVTLP
.endif manual
.nf
Purpose: convert longword to a packed decimal string
.if manual
.s 1
.endif manual
Format: opcode src.rl,dstlen.rw,dstaddr.ab
.if manual
.s 1
.endif manual
Operation: {dst string} = conversion of src
.if manual
.s 1
.endif manual
C. Codes: N = {{dst string} LSS 0}, V = {decimal overflow},
Z = {{dst string} EQL 0}, C = 0
.if manual
.s 1
.endif manual
Exceptions: Reserved operand, decimal overflow
.if manual
.s 1
.endif manual
Opcode: F9 CVTLP Convert long to packed
.if manual
.s 1
.endif manual
Description: src is converted to a packed decimal string and the
destination string operand specified by dstlen and
dstaddr is replaced by the result. After execution
R0 = R1 = R2 = 0 and R3 = address of the most
significant digit of the destination string. dst
and R0-R3 are unpredictable on a reserved operand
abort. Overlapping operands will produce correct
results.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CVTPL instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><CVTPL
.else manual
2 CVTPL
.endif manual
.nf
Purpose: convert a packed decimal string to a longword
.if manual
.s 1
.endif manual
Format: opcode srclen.rw,srcaddr.ab,dst.wl
.if manual
.s 1
.endif manual
Operation: dst = conversion of {src string}
.if manual
.s 1
.endif manual
C. Codes: N = {dst LSS 0}, V = {integer overflow},
Z = {dst EQL 0}, C = 0
.if manual
.s 1
.endif manual
Exceptions: Reserved operand, integer overflow
.if manual
.s 1
.endif manual
Opcode: 36 CVTPL Convert packed to long
[780-10.85, 750-16.96, 730-47.61]
[780F-10.85, 750F-16.96, 730F-46.93]
.if manual
.s 1
.endif manual
Description: The packed decimal source string src specified by
srclen and srcaddr is converted to a longword and
the result is placed in dst. After execution R0 =
R2 = R3 = 0 and R1 = address of the most significant
digit of the source string. dst is stored after all
the registers are updated. This means that dst can
be a register. Integer overflow can occur if the
decimal string converts to a value outside a
longword integer range. If this happens dst is
replaced by the low order bits of the correct
result. Overlapping operands will produce correct
results.
.if manual
.s 1
.endif manual
Notes: The times shown above assume 7 digits are converted;
if 18 are converted the times are:
[780-13.27, 750-21.01, 730-66.56]
[780F-13.27, 750F-21.01, 730F-65.59]
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CVTPS instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><CVTPS
.else manual
2 CVTPS
.endif manual
.nf
Purpose: convert a packed decimal string to leading separate
numeric
.if manual
.s 1
.endif manual
Format: opcode srclen.rw,srcaddr.ab,dstlen.rw,dstaddr.ab
.if manual
.s 1
.endif manual
Operation: {dst string} = conversion of {src string}
.if manual
.s 1
.endif manual
C. Codes: N = {{src string} LSS 0}, V = {decimal overflow},
Z = {{src string} EQL 0}, C = 0
.if manual
.s 1
.endif manual
Exceptions: Reserved operand, decimal overflow
.if manual
.s 1
.endif manual
Opcode: 08 CVTPS Convert packed to leading separate
.if manual
.s 1
.endif manual
Description: The packed decimal source string src specified by
srclen and srcaddr is changed to a leading separate
numeric string and the result is placed in dst as
specified by dstlen and dstaddr. Conversion is
effected by replacing the lowest addressed byte of
dst by the ASCII character "+" or "-", determined by
the sign of the source string. The remaining bytes of
dst are replaced by the ASCII characters that
correspond to the digits in src.
.if manual
.s 1
.endif manual
Notes: After execution R0 = R2 = 0, R1 = address of the most
significant digit of src and R3 = address of the
sign byte of dst. dst and R0-R3 are unpredictable if
src overlaps dst, src contains an invalid nibble, or
a reserved operand abort occurs. In the event of
decimal overflow, the value stored in dst may differ
from what the N and Z flags indicate. If CVTPS
produces a -0 without overflow, dst will be changed
to a +0 representation.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CVTPT instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><CVTPT
.else manual
2 CVTPT
.endif manual
.nf
Purpose: convert a packed decimal string to trailing numeric
.if manual
.s 1
.endif manual
Format: opcode srclen.rw,srcaddr.ab,tbladdr.ab,
dstlen.rw,dstaddr.ab
.if manual
.s 1
.endif manual
Operation: {dst string} = conversion of {src string}
.if manual
.s 1
.endif manual
C. Codes: N = {{src string} LSS 0}, V = {decimal overflow},
Z = {{src string} EQL 0}, C = 0
.if manual
.s 1
.endif manual
Exceptions: Reserved operand, decimal overflow
.if manual
.s 1
.endif manual
Opcode: 24 CVTPT Convert packed to trailing numeric
[780-14.48, 750-18.82, 730-73.27]
[780F-14.49, 750F-18.82, 730F-73.23]
.if manual
.s 1
.endif manual
Description: The packed decimal source string src specified by
srclen and srcaddr is converted to a trailing
numeric string and the result is placed in dst as
specified by dstlen and dstaddr. Conversion is
effected by using the highest addressed byte of src
(i.e. the byte containing the sign and least
significant digit) as an unsigned index into a 256
byte table whose 0th entry is specified by tbladdr.
The byte read out of the table replaces the least
significant byte of dst. The remaining bytes of dst
are replaced by the ASCII representations of the
digits in src.
.if manual
.s 1
.endif manual
Notes: After execution R0 = R2 = 0, R1 = address of the
most significant digit of src and R3 = address of
the sign of dst. dst and R0-R3 are unpredictable if
src overlaps dst, src contains an invalid nibble, or
a reserved operand abort occurs. The condition codes
are set by the value of src even if overflow occurs.
N is set if and only if src is nonzero and contains
a "-". In the event of decimal overflow, the value
stored in dst may differ from what the N and Z flags
indicate. The times shown assume that 7 digits are
converted; if 18 digits are converted the times are:
[780-22.75, 750-37.18, 730-143.55]
[780F-22.75, 750F-37.18, 730F-141.44]
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CVTSP instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><CVTSP
.else manual
2 CVTSP
.endif manual
.nf
Purpose: convert a leading separate numeric string to packed
decimal
.if manual
.s 1
.endif manual
Format: opcode srclen.rw,srcaddr.ab,dstlen.rw,dstaddr.ab
.if manual
.s 1
.endif manual
Operation: {dst string} = conversion of {src string}
.if manual
.s 1
.endif manual
C. Codes: N = {{dst string} LSS 0}, V = {decimal overflow},
Z = {{dst string} EQL 0}, C = 0
.if manual
.s 1
.endif manual
Exceptions: Reserved operand, decimal overflow
.if manual
.s 1
.endif manual
Opcode: 09 CVTSP Convert leading separate to packed
.if manual
.s 1
.endif manual
Description: The source leading separate numeric string src
specified by srclen and srcaddr is converted to
a packed decimal string and the result is placed
in dst as specified by dstlen and dstaddr.
.if manual
.s 1
.endif manual
Notes: A reserved operand fault will occur if the length
of src is outside the range 0 to 31, the length of
dst is outside the range 0 to 31, or src contains
an invalid. Valid bytes for src are ASCII digits,
"+", "-", or _<space_>. After execution R0 = R2 = 0,
R1 = address of the sign byte of src and R3 =
address of the most significant digit of dst. dst
and R0-R3 are unpredictable if src overlaps dst or
a reserved operand abort occurs.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*CVTTP instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><CVTTP
.else manual
2 CVTTP
.endif manual
.nf
Purpose: convert a trailing numeric string to packed decimal
.if manual
.s 1
.endif manual
Format: opcode srclen.rw,srcaddr.ab,tbladdr.ab,
dstlen.rw,dstaddr.ab
.if manual
.s 1
.endif manual
Operation: {dst string} = conversion of {src string}
.if manual
.s 1
.endif manual
C. Codes: N = {{dst string} LSS 0}, V = {decimal overflow},
Z = {{dst string} EQL 0}, C = 0
.if manual
.s 1
.endif manual
Exceptions: Reserved operand, decimal overflow
.if manual
.s 1
.endif manual
Opcode: 26 CVTTP Convert trailing numeric to packed
[780-13.47, 750-24.14, 730-53.09]
[780F-13.47, 750F-24.14, 730F-52.28]
.if manual
.s 1
.endif manual
Description: The trailing numeric source string src specified by
srclen and srcaddr is converted to a packed
decimal string and the result is placed in dst as
specified by dstlen and dstaddr. Conversion is
effected by using the highest addressed byte of src
(i.e. the byte containing the sign and least
significant digit) as an unsigned index into a 256
byte table whose 0th entry is specified by tbladdr.
The byte read out of the table replaces the highest
addressed byte of dst. The packed digits of dst
are replaced by the low order four bits of each
ASCII character in src.
.if manual
.s 1
.endif manual
Notes: After execution R0 = R2 = 0, R1 = address of the
most significant digit of src and R3 = address of
the byte holding the most significant digit of dst.
dst and R0-R3 are unpredictable if dst overlaps src
or tbl or if a reserved operand abort occurs. A
reserved operand fault will occur if srclen or
dstlen are not in the range 0 to 31, src contains
an illegal ASCII character (i.e. not "0 to "9",
"+", "-", or _<space_>), or if the translation of the
least significant digit produces an invalid decimal
digit or sign nibble. If src is -0, dst will be set
to +0 with N = 0 and Z = 1. If srclen is 0 dst will
be set to +0 and tbl will not be referenced. The times
shown above assume 7 digits are packed; if 18 are
packed the times are:
[780-25.57, 750-36.27, 730-87.51]
[780F-25.57, 750F-36.27, 730F-86.55]
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*DECx instructions\*
.restore
.send toc .endif global
.else manual
2 DECx
.endif manual
.nf
Purpose: decrement - subtract 1 from an integer
.if manual
.s 1
.endif manual
Format: opcode dif.mx
.if manual
.s 1
.endif manual
Operation: dif = dif - 1
.if manual
.s 1
.endif manual
C. Codes: N = dif LSS 0, Z = dif EQL 0
V = {integer overflow}, C = {borrow from MSB}
.if manual
.s 1
.endif manual
Exceptions: Integer overflow
.if manual
.s 1
.endif manual
Opcodes: 97 DECB Decrement byte [780-0.40]
.index ^Instructions, machine><DECB
B7 DECW Decrement word [780-0.40]
.index ^Instructions, machine><DECW
D7 DECL Decrement long [780-0.40]
.index ^Instructions, machine><DECL
.if manual
.s 1
.endif manual
Description: One is subtracted from the dif operand and the
dif operand is replaced by the result.
.if manual
.s 1
.endif manual
Notes: Arithmetic overflow occurs if the largest negative
integer is decremented. On overflow, dif is replaced
by the largest positive integer. DECx sum is
equivalent to SUBx2 _#1,sum, but is shorter.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*DIVxx instructions\*
.restore
.send toc .endif global
.else manual
2 DIVxx
.endif manual
.nf
Purpose: perform arithmetic division
.if manual
.s 1
.endif manual
Format: opcode divr.rx,quo.mx ;2 operand
opcode divr.rx,divd.rx,quo.wx ;3 operand
.if manual
.s 1
.endif manual
Operation: quo = quo / divr ;2 operand
quo = divd / divr ;3 operand
.if manual
.s 1
.endif manual
C. Codes: N = {quo LSS 0}, Z = {quo EQL 0}, C = 0,
V = {overflow or {divr EQL 0}}
.if manual
.s 1
.endif manual
Exceptions: Integer or floating overflow, divide by zero
Floating underflow, reserved operand
.if manual
.s 1
.endif manual
Opcodes: 86 DIVB2 Divide byte 2 operand [780-4.60]
.index ^Instructions, machine><DIVB2
87 DIVB3 Divide byte 3 operand [780-4.80]
.index ^Instructions, machine><DIVB3
A6 DIVW2 Divide word 2 operand [780-6.20]
.index ^Instructions, machine><DIVW2
A7 DIVW3 Divide word 3 operand [780-6.40]
.index ^Instructions, machine><DIVW3
C6 DIVL2 Divide long 2 operand
.index ^Instructions, machine><DIVL2
[780-9.44, 750-8.14, 730-66.99]
[780F-9.44, 750F-8.14, 730F-15.23]
C7 DIVL3 Divide long 3 operand
.index ^Instructions, machine><DIVL3
[780-9.64, 750-8.88, 730-70.28]
[780F-9.64, 750F-8.88, 730F-16.15]
46 DIVF2 Divide F__floating 2 operand
.index ^Instructions, machine><DIVF2
47 DIVF3 Divide F__floating 3 operand
.index ^Instructions, machine><DIVF3
[780-8.49, 750-12.83, 730-228.06]
[780F-4.62, 750F-6.61, 730F-10.60]
66 DIVD2 Divide D__floating 2 operand [780-42.80]
.index ^Instructions, machine><DIVD2
67 DIVD3 Divide D__floating 3 operand
.index ^Instructions, machine><DIVD3
[780-43.60, 750-71.14, 730-557.52]
[780F-8.84, 750F-12.82, 730F-19.58]
46FD DIVG2 Divide G__floating 2 operand
.index ^Instructions, machine><DIVG2
47FD DIVG3 Divide G__floating 3 operand
.index ^Instructions, machine><DIVG3
[780-52.85, 750-81.03, 730-528.25]
[780F-52.85, 750F-81.03, 730F-23.52]
66FD DIVH2 Divide H__floating 2 operand
.index ^Instructions, machine><DIVH2
67FD DIVH3 Divide H__floating 3 operand
.index ^Instructions, machine><DIVH3
[780-223.00, 750-350.96, 730-1435.65]
[780F-223.00, 750F-350.96, 730F-91.33]
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*DIVP instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><DIVP
.else manual
2 DIVP
.endif manual
.nf
Purpose: divide one packed decimal string by a second
decimal string
.if manual
.s 1
.endif manual
Format: opcode divrlen.rw,divraddr.ab,divdlen.rw,
divdaddr.ab,quolen.rw,quoaddr.ab
.if manual
.s 1
.endif manual
Operation: {quo string} = {divd string} / {divr string}
.if manual
.s 1
.endif manual
C. Codes: N = {{quo string} LSS 0}, V = {decimal overflow},
Z = {{quo string} EQL 0}, C = 0
.if manual
.s 1
.endif manual
Exceptions: Reserved operand, decimal overflow, divide by zero
.if manual
.s 1
.endif manual
Opcode: 27 DIVP Divide packed
[780-40.44, 750-86.12, 730-584.35]
[780F-40.45, 750F-86.12, 730F-575.59]
.if manual
.s 1
.endif manual
Description: The dividend string specified by divdlen and divdaddr
is divided by the divisor string specified by divrlen
and divraddr. The result of the division is placed in
the quotient string specified by quolen and quoaddr.
.if manual
.s 1
.endif manual
Notes: This instruction may allocate a 16 byte workspace on
the stack. After execution the SP is restored to its
original value and the contents of {(SP) - 16} to
{(SP) - 1} are unpredictable. The division is done
such that: (1) The absolute value of the remainder
(which is lost) is less than the absolute value of
the divisor. (2) The product of the absolute value
of the quotient and the absolute value of the divisor
is less than or equal to the absolute value of the
dividend. If the value of the quotient is zero the
sign of the quotient is always positive. After DIVP
R0 = R2 = R4 = 0, R1 = address of the most significant
digit of divr, R3 = address of the most significant
digit of divd and R5 = address of the most
significant digit of quo. quo and R0-R5 will have
unpredictable values if quo overlaps divr or divd,
divr is 0, or a reserved operand abort occurs. The
times for DIVP shown above assume 7 digit operands,
if 18 digit operands are used the times are:
[780-150.87, 750-245.95, 730-8473.45]
[780F-150.83, 750F-245.95, 730F-8402.25]
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*EDIV instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><EDIV
.else manual
2 EDIV
.endif manual
.nf
Purpose: perform extended-precision division
.if manual
.s 1
.endif manual
Format: opcode divr.rl,divd.rq,quo.wl,rem.wl
.if manual
.s 1
.endif manual
Operation: quo = divd/divr; rem = REM (divd, divr)
.if manual
.s 1
.endif manual
C. Codes: N = {quo LSS 0}, Z = {quo EQL 0}, C = 0,
V = {{integer overflow} OR {divr EQL 0}}
.if manual
.s 1
.endif manual
Exceptions: Integer overflow, divide by zero
.if manual
.s 1
.endif manual
Opcode: 7B EDIV Extended divide
[780-11.93, 750-11.86, 730-100.31]
[780F-11.86, 750F-11.86, 730F-100.29]
.if manual
.s 1
.endif manual
Notes: The division is performed such that the remainder
operand (unless it is 0) has the same sign as divd.
On overflow, or if divr is 0, then quo is replaced
by bits 31:0 of divd and rem is replaced by 0.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*EMODx instructions\*
.restore
.send toc .endif global
.else manual
2 EMODx
.endif manual
.nf
Purpose: extended multiply and integerize - perform accurate
range reduction of math function arguments
.if manual
.s 1
.endif manual
Format: opcode mulr.rx,mulrx.rb,muld.rx,int.wl,fract.wx
.if manual
.s 1
.endif manual
Operation: int = {integer part of muld * {mulr'mulrx}};
frac = {fractional part of muld * {mulr'mulrx}}
.if manual
.s 1
.endif manual
C. Codes: N = {fract LSS 0}, Z = {fract EQL 0},
V = {integer overflow}, C = 0
.if manual
.s 1
.endif manual
Exceptions: Integer or floating overflow, divide by zero
.if manual
.s 1
.endif manual
Opcodes: 54 EMODF Ext. mul., integerize F__floating
.index ^Instructions, machine><EMODF
[780-11.80]
74 EMODD Ext. mul., integerize D__floating
.index ^Instructions, machine><EMODD
[780-33.00]
54FD EMODG Ext. mul., integerize G__floating
.index ^Instructions, machine><EMODG
74FD EMODH Ext. mul., integerize H__floating
.index ^Instructions, machine><EMODH
.if manual
.s 1
.endif manual
Description: The floating multiplier extension mulrx is concatenated
with the floating point multiplier (mulr) to gain eight
additional low order fraction bits. This is then
multiplied by muld. After multiplication, the integer
portion is extracted and a floating point number is
formed from the fractional part by truncating extra
bits. The integer part is placed in int and the
fractional part in frac.
.if manual
.s 1
.endif manual
Notes: On floating underflow, both results are replaced by
zero. Floating overflow is indicated by integer
overflow, however integer overflow is possble without
floating overflow.
.if manual
.test page 10
.send toc .ifnot global
.save
.flags bold
.hl 1 ^*EMUL instruction\*
.restore
.send toc .endif global
.index ^Instructions, machine><EMUL
.else manual
2 EMUL
.endif manual
.nf
Purpose: perform extended-precision multiplication
.if manual
.s 1
.endif manual
Format: opcode mulr.rl,muld.rl,add.rl,prod.wq
.if manual
.s 1
.endif manual
Operation: prod = {{muld * mulr} + SEXT (add)}
.if manual
.s 1
.endif manual
C. Codes: N = {prod LSS 0}, Z = {prod EQL 0}, V = 0, C = 0
.if manual
.s 1
.endif manual
Exceptions: None
.if manual
.s 1
.endif manual
Opcode: 7A EMUL Extended multiply
[780-6.83, 750-10.33, 730-20.52]
[780F-6.83, 750F-6.48, 730F-20.23]
.if manual
.s 1
.endif manual
Description: mulr is multiplied by muld to give a double length
result. The addend operand is sign extended to
==End of part 2=============================================================