Мнемоника
| Код
| NZVC | Description | Notes |
ADCb d | B055DD | **** | Add Carry | d=d+C |
ADD s,d | 06SSDD | **** | Add | d=s+d |
ASH s,r | 072RSS | **** | Arithmetic Shift | r=r*2^s(EIS)# |
ASHC s,r | 073RSS | **** | Arithmetic Shift Combined | (EIS)# |
ASLb d | B063DD | **** | Arithmetic Shift Left | d=d*2 |
ASRb d | B062DD | **** | Arithmetic Shift Right | d=d/2 |
BCC a | 1030XX | ---- | Branch if Carry Clear | If C=0 |
BCS a | 1034XX | ---- | Branch if Carry Set | If C=1 |
BEQ a | 0014XX | ---- | Branch if Equal | If Z=1 |
BGE a | 0020XX | ---- | Branch if Greater or Equal | If NxV?=0 |
BGT a | 0030XX | ---- | Branch if Greater Than | If Zv{NxV}=0 |
BICb s,d | B4SSDD | **0- | Bit Clear | d=d&{~s} |
BISb s,d | B5SSDD | **0- | Bit Set (OR) | d=dvs |
BITb s,d | B3SSDD | **0- | Bit Test (AND) | d&s |
BHI a | 1010XX | ---- | Branch if Higher | If CvZ?=0 |
BHIS a | 1030XX | ---- | Branch if Higher or Same | If C=0 |
BLE a | 0034XX | ---- | Branch if Less or Equal | If Zv{NxV}=1 |
BLT a | 0024XX | ---- | Branch if Less Than | If NxV?=1 |
BLO a | 1034XX | ---- | Branch if Lower | If C=1 |
BLOS a | 1014XX | ---- | Branch if Lower or Same | If CvZ?=1 |
BMI a | 1004XX | ---- | Branch if Minus | If N=1 |
BNE a | 0010XX | ---- | Branch if Not Equal | If Z=0 |
BPL a | 1000XX | ---- | Branch if Plus | If N=0 |
BR a | 0004XX | ---- | Branch | PC=PC+2*XX |
BVC a | 1020XX | ---- | Branch if Overflow Clear | If V=0 |
BVS a | 1024XX | ---- | Branch if Overflow Set | If V=1 |
CALL d | 0047DD | ---- | Call subroutine | (= JSR PC,d) |
CCC | 000257 | 0000 | Clear all Condition Codes | {C,N,V,Z}=0 |
CLC | 000241 | ---0 | Clear Carry | C=0 |
CLN | 000250 | 0--- | Clear Negative | N=0 |
CLRb d | B050DD | 0100 | Clear | d=0 |
CLV | 000242 | --0- | Clear Overflow | V=0 |
CLZ | 000244 | -0-- | Clear Zero | Z=0 |
CMPb s,d | B2SSDD | **** | Compare | s-d |
COMb d | B051DD | **01 | Complement | d=~d |
DECb d | B053DD | ***- | Decrement | d=d-1 |
HALT | 000000 | ---- | Halt | |
INCb d | B052DD | ***- | Increment | d=d+1 |
JMP d | 0001DD | ---- | Jump | PC=d |
JSR r,d | 004RDD | ---- | Jump to Subroutine | r=PC,PC=d |
MOVb s,d | B1SSDD | **0- | Move | d=s |
NEGb d | B054DD | **** | Negate | d=-d |
NOP | 000240 | ---- | No Operation | |
RESET | 000005 | ---- | Reset external bus | |
RETURN | 000207 | ---- | Return from subroutine | (= RTS PC) |
ROLb d | B061DD | **** | Rotate Left | d={C,d}<- </td> |
RORb d | B060DD | **** | Rotate Right | d=->{C,d} |
RTS r | 00020R | ---- | Return from Subroutine | PC=r,r=(SP)+ |
SBCb d | B056DD | **** | Subtract Carry | d=d-C |
SCC | 000277 | 1111 | Set all Condition Codes | {C,N,V,Z}=0 |
SEC | 000261 | ---1 | Set Carry | C=1 |
SEN | 000270 | 1--- | Set Negative | N=1 |
SEV | 000262 | --1- | Set Overflow | V=1 |
SEZ | 000264 | -1-- | Set Zero | Z=1 |
SOB r,a | 077RNN | ---- | Subtract One and Branch | PC=PC-2*NN # |
SUB s,d | 16SSDD | **** | Subtract | d=d-s |
SWAB d | 0003DD | **00 | Swap Bytes | |
SXT d | 0067DD | -*0- | Sign Extend | d=0 or -1 # |
TSTb d | B057DD | **00 | Test | d |
XOR r,d | 074RDD | **0- | Exclusive OR | d=dxr # |
CmdLegend?
Обозначения | |
Rn | General purpose Register (16-bit, n=0-5) |
SP | Stack Pointer (16-bit, R6) |
PC | Program Counter (16-bit, R7) |
PS | Processor Status (16-bit) |
описания | |
a | Relative address |
b | Blank or B for word or byte operand(s) |
d s | Destination/source |
n | Register number (0 to 5) |
nn | 16-bit expression (0 to 65535) |
r | Register (Rn,SP,PC) |
t | Trap number (0 to 255) |
+ - * / ^ | Add/subtract/multiply/divide/power |
& ~ v x | Logical AND/NOT, inclusive/exclusive OR |
<- -> | Rotate left/right |
{ } < : > | Combination of operands/bit range |
# | Not applicable to all PDP-11s |
Не обязательные к реализации на эмуляторе команды:
BPT | 000003 | ---- | Breakpoint Trap | Vector at 14 |
DIV s,r | 071RSS | ** | Divide (см. ниже) | r=r/s (EIS) |
DIV
Команды MUL и DIV
Приведенное ранее описание этих команд дает о них упрощенное
представление. Если в команде MUL MEM,R используется нечетный регистр R,
то все верно. Если же используется четный, то произведение в виде
тридцатидвухразрядного числа заносится в регистр R и регистр со
следующим номером. Рассмотрим такой пример:
MOV #1100,R2
MUL #1000,R2
Результат, если его рассматривать как тридцатидвухразрядное число,
содержит 1 в битах 15 и 18 и нули в остальных. Младшие шестнадцать битов
запоминаются в R3, а старшие — в R2. Таким образом, в данном случае
после выполнения команды MUL третий регистр содержит число 100000, а
второй 4:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
31 | 16 | 15 | 0 |
В команде MUL операнды считаются целыми двоичными числами со знаком, а
результат формируется в виде тридцатидвухразрядного числа, 15-й бит
старшего слова которого является знаковым. Нужно заметить, что результат
умножения всегда корректен, потому что произведение двух
шестнадцатиразрядных чисел не выходит за пределы двойного слова.
Команда DIV выполняет деление целого числа в форме двойного слова,
расположенного в регистре с четным номером и следующим за ним:
MOV #1,R0
MOV #100007,R1
DIV #400,R0
В этом примере две первые команды загружают число 300007 в регистры R0 и
R1. Команда DIV частное (600) запишет в R0, а остаток (7) — в R1.
Если бы первой шла команда MOV #1000,R0, то результат от деления не
поместился бы в одно слово. Действительно, при делении числа 200100007
на 400 получается 400200. При подобных попытках выполнение команды
прерывается и устанавливается бит V.
DIV - совсем на пальцах
Пусть в регистре R1 находится число восемнадцать, которое мы хотим
разделить на десять и сохранить остаток. Для этого подходит команда DIV:
DIV #12,R0 ; четный регистр!
Обратите внимание, что сначала мы пишем число (в восьмеричной системе
счисления), на которое хотим разделить. Число, которое мы собираемся
делить, должно быть занесено в регистр. Кроме того, это должен быть
регистр с нечетным номером, а в команде DIV должен быть указан регистр с
предыдущим номером; в этот регистр нужно предварительно поместить нуль
(например, с помощью команды «очистки» CLR):
CLR R0
DIV #12,R0
Команда DIV сохранит частное в регистре с предыдущим номером (в данном
примере — R0), а остаток— в регистре, который использовался для хранения
делимого (R1). Итак, в данном случае в R0 будет 1 и 8 — в R1 |