Общая информация | |
---|---|
Запущен | 1976 ( 1976 ) |
Обычный производитель | |
Производительность | |
Макс. тактовая частота ЦП | до 3,3 МГц |
Ширина данных | 16 |
Ширина адреса | 16 |
Архитектура и классификация | |
Набор инструкций | PDP-11 нравится |
Количество инструкций | 119 |
Физические характеристики | |
Упаковка |
|
История | |
Преемник | никто |
WD16 — 16-разрядный микропроцессор , представленный Western Digital в октябре 1976 года. Он основан на чипсете MCP-1600 , универсальном дизайне, который также использовался для реализации низкоуровневого мини-компьютера DEC LSI-11 и процессора Pascal MicroEngine . Три системы различались в основном своим микрокодом , что давало каждой системе уникальную архитектуру набора инструкций (ISA).
WD16 реализует расширение архитектуры набора инструкций PDP-11 , но несовместим с машинным кодом PDP-11. [1] Набор инструкций и микрокодирование были созданы Диком Уилкоксом и Ричем Нотари. [2] WD16 является примером ортогональной архитектуры CISC . Большинство двухоперандных инструкций могут работать с памятью в памяти с любым режимом адресации, а некоторые инструкции могут приводить к десяти обращениям к памяти.
WD16 реализован в пяти 40-контактных DIP- корпусах. Максимальная тактовая частота составляет 3,3 МГц. Его интерфейс с памятью осуществляется через 16-битную мультиплексную шину данных/адреса. [3]
WD16 наиболее известен по использованию в процессорных платах Alpha Microsystems AM-100 и AM-100/T. [4] Прототип был продемонстрирован в 1977 году. [5] По состоянию на 1981 год насчитывалось не менее 5000 компьютеров Alpha Micro на базе WD16. [6] Еще в 1982 году компьютеры Alpha Micro на базе WD16 все еще характеризовались как «супермикро». [7] В июне 1982 года WD16 был заменен на Motorola 68000. [8]
Наименьшая единица адресуемой и записываемой памяти — 8-битный байт . Байты также могут храниться в нижней половине регистров R0 — R5. [9]
16-битные слова хранятся в порядке от младшего к младшему с младшими байтами по нижнему адресу. Слова всегда выравниваются по четным адресам памяти. Слова могут храниться в регистрах R0 — R7.
32-битные двойные слова могут храниться только в парах регистров, при этом младшее слово хранится в регистре с меньшим номером. 32-битные значения используются в инструкциях MUL, DIV и некоторых инструкциях поворота и арифметического сдвига.
Значения с плавающей точкой имеют длину 48 бит и могут храниться только в памяти. Этот формат находится на полпути между форматами с плавающей точкой одинарной и двойной точности. Они хранятся в необычном формате middle-endian, который иногда называют «PDP-endian». Значения с плавающей точкой всегда выравниваются по четным адресам. Первое слово содержит знак, показатель степени и старший байт мантиссы. Следующий по величине адрес содержит средние два байта мантиссы, а следующий по величине адрес содержит младшие два байта мантиссы. Полный формат выглядит следующим образом:
1. Знак 1 бит для всего числа, который равен нулю для положительного числа.
2. 8-битная экспонента с основанием 2 в записи с превышением 128 и диапазоном от +127 до -128. Единственное допустимое число с экспонентой -128 — это истинный ноль (все нули).
3. 40-битная мантисса с подразумеваемым старшим битом.
15 | 14 | 7 | 6 | 0 | ||||||||||||
Адрес+0 | С | Экспонента | Мантисса (высокая) |
15 | 8 | 7 | 0 | |||||||||||||
Адрес+2 | Мантисса | (середина) |
15 | 8 | 7 | 0 | |||||||||||||
Адрес+4 | Мантисса | (низкий) |
16-битные адреса WD16 могут напрямую обращаться к 64 КБ памяти. WD16 не предлагает никакого встроенного управления памятью или защиты. В приложении AM-100 последние 256 ячеек памяти отображаются в портовое пространство. [10] Поскольку большинство компьютеров AM-100 использовались как многопользовательские, память обычно расширялась за пределы 64 КБ с переключением банков . Хотя AM-100 можно было настроить для 22 пользователей и 512 килобайт оперативной памяти, [6] типичная конфигурация памяти для 9-пользовательского AM-100 могла быть в диапазоне 352 килобайт. [11] В 1981 году для AM-100/T был предложен дополнительный блок управления памятью AM-700, который позволял сегментировать память с шагом в 256 байт. [12]
|
Процессор содержит восемь 16-битных регистров общего назначения , от R0 до R7. Регистры могут использоваться для любых целей, за исключением следующих: Регистр R7 — это счетчик программ (PC). Хотя любой регистр может использоваться как указатель стека, R6 — это указатель стека (SP), используемый для аппаратных прерываний и ловушек. R0 — это счетчик для инструкций по передаче блока. [9]
Большинство инструкций выделяют шесть бит для указания каждого операнда. Три бита выбирают один из восьми режимов адресации, а три бита выбирают общий регистр. Кодировка шестибитного режима адресации операнда выглядит следующим образом: [9]
5 | 3 | 2 | 0 | ||
Режим | Зарегистрироваться |
В следующих разделах каждый элемент включает пример того, как операнд будет записан на языке ассемблера. Rn означает один из восьми регистров, обозначаемых как R0 — R7.
Следующие восемь режимов могут быть применены к любому общему регистру. Их эффекты при применении к R6 (указатель стека, SP) и R7 (счетчик программ, PC) изложены отдельно в следующих разделах.
Код | Имя | Пример | Описание |
---|---|---|---|
0н | Зарегистрироваться | Рн | Операнд находится в Rn |
1н | Регистрация отложена | (Рн) | Rn содержит адрес операнда |
2н | Автоинкремент | (Рн)+ | Rn содержит адрес операнда, затем инкремент Rn |
3н | Автоинкремент отложен | @(Рн)+ | Rn содержит адрес адреса операнда, затем увеличиваем Rn на 2 |
4н | Автодекремент | −(Рн) | Уменьшить Rn, затем использовать результат как адрес операнда. |
5н | Автодекремент отложен | @−(Рн) | Уменьшить Rn на 2, затем использовать результат в качестве адреса операнда. |
6н | Индекс | X(Рн) | Rn+X — адрес операнда |
7н | Индекс отложен | @X(Рн) | Rn+X — адрес адреса операнда |
В индексном и индексном отложенном режимах X — это 16-битное значение, взятое из второго слова инструкции. В двухоперандных инструкциях оба операнда могут использовать эти режимы. Такие инструкции имеют длину в три слова.
Операции автоинкремента и автодекремента в регистре выполняются на 1 в байтовых инструкциях, на 2 в словарных инструкциях и на 2 всякий раз, когда используется отложенный режим, поскольку величина, к которой обращается регистр, является указателем (словом).
Когда указан R7 (счетчик программ), четыре режима адресации естественным образом дают полезные эффекты:
Код | Имя | Пример | Описание |
---|---|---|---|
27 | Немедленный | #н | Операнд — это следующее слово инструкции. |
37 | Абсолютный | @#а | Адрес операнда — это следующее слово инструкции. |
67 | Родственник | а | Адрес операнда — это следующее слово инструкции, добавленное в ПК. |
77 | Относительная отсрочка | @а | Адрес адреса операнда — это следующее слово инструкции, добавленное к PC. |
Существует только два распространенных варианта использования абсолютного режима, синтаксис которого сочетает в себе немедленный и отложенный режимы. Первый — доступ к зарезервированным ячейкам процессора по адресу 0000-003F. Другой — указание регистров ввода/вывода в пространстве порта, поскольку регистры для каждого устройства имеют определенные адреса памяти. Относительный режим имеет более простой синтаксис и более типичен для ссылки на переменные программы и назначения переходов. Программа, которая использует относительный режим (и относительный отложенный режим) исключительно для внутренних ссылок, является позиционно-независимой ; она не содержит никаких предположений о своем собственном местоположении, поэтому ее можно загрузить в произвольную ячейку памяти или даже переместить, без необходимости корректировать ее адреса для отражения ее местоположения. При вычислении таких адресов относительно текущего местоположения процессор выполняет перемещение на лету.
Непосредственный и абсолютный режимы — это просто автоинкремент и автоинкремент отложенного режима, соответственно, применяемые к PC. Когда вспомогательное слово находится в инструкции, PC для следующей инструкции автоматически увеличивается после вспомогательного слова. Поскольку PC всегда указывает на слова, операция автоинкремента всегда выполняется с шагом 2 .
R6, также пишется SP, используется как аппаратный стек для ловушек и прерываний. Соглашение, навязываемое набором режимов адресации, предоставляемых WD16, заключается в том, что стек растет вниз — в сторону меньших адресов — по мере помещения в него элементов. Когда режим применяется к SP или к любому регистру, который программист выбирает для использования в качестве программного стека, режимы адресации имеют следующие эффекты:
Код | Имя | Пример | Описание |
---|---|---|---|
16 | Отсроченный | (СП) | Операнд находится на вершине стека. |
26 | Автоинкремент | (СП)+ | Операнд находится наверху стека, затем извлеките его |
36 | Автоинкремент отложен | @(СП)+ | Указатель на операнд находится наверху стека; извлеките указатель |
46 | Автодекремент | −(СП) | Поместить значение в стек |
66 | Индексированный | X(СП) | Операнд расположен на расстоянии X от вершины стека. |
76 | Индексированный отложенный | @X(СП) | Указатель на операнд находится на расстоянии X от вершины стека. |
Хотя программные стеки могут содержать байты, SP всегда указывает на стек слов. Операции автоинкремента и автодекремента на SP всегда выполняются с шагом 2.
Большинство инструкций WD16 работают с байтами и словами. Байты указываются номером регистра, идентифицирующим младший байт регистра, или расположением в памяти. Слова указываются номером регистра или расположением в памяти младшего байта, которое должно быть четным числом. Все коды операций и адреса выражаются в шестнадцатеричном формате . [9]
Старшие четыре бита определяют операцию, которую необходимо выполнить. Две группы по шесть бит определяют режим адресации исходного операнда и режим адресации целевого операнда, как определено выше. Эта группа инструкций занимает 75% доступных опкодов.
15 | 12 | 11 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||
Код операции | Источник | Зарегистрироваться | Место назначения | Зарегистрироваться |
Код операции | Мнемонический | Операция |
---|---|---|
1000 | ДОБАВЛЯТЬ | Добавлять:Dest ← Dest + Src |
2000 | СУБ | Вычесть:Dest ← Dest - Src |
3000 | И | И:Dest ← Dest ∧ Src |
4000 | БИК | Немного ясно:Dest ← Dest ∧ (-1 - Src) |
5000 | БИС | Набор бит:Dest ← Dest ∨ Src |
6000 | XOR | Эксклюзив или:Dest ← Dest ⊻ Src |
9000 | КМП | Сравнивать:Set-flags(Src − Dest) |
А000 | КУСОЧЕК | Тест бита:Set-flags(Dest ∧ Src) |
Б000 | МОВ | Двигаться:Dest ← Src |
С000 | ЦМПБ | Сравнение байтов:Set-flags(Src − Dest) |
Д000 | МОВБ | Переместить байт: Dest ← Src (Знак назначения регистра расширяется до битов 8-15) |
Е000 | БИСБ | Байт установки бита:Dest ← Dest ∨ Src |
Некоторые двухоперандные инструкции используют режим адресации для одного операнда и регистр для второго операнда:
15 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||||
Код операции | Рег | Источник/назначение | Зарегистрироваться |
Старшие семь бит определяют операцию, которую необходимо выполнить, шесть бит определяют режим адресации операнда, а три бита определяют регистр или пару регистров. Если используется пара регистров (ниже записано как "Reg+1:Reg"), Reg содержит младшую часть операнда. Следующий по порядку регистр содержит старшую часть операнда (или остаток).
Код операции | Мнемонический | Операция |
---|---|---|
7200 | ЛЕА | Эффективный адрес загрузки:Reg ← ea(Dest) |
73С0 | СПМ | Jump: PC ← ea(Dest) (Это то же самое LEA PC,Dest , и имеет тот же код операции.) |
7400 | ПЕПЕЛ | Арифметический сдвиг:if Src < 0 then Reg ← Shift-right(Reg, -Src) else Reg ← Shift-left(Reg, Src) |
7800 | XCH | Обмен:Reg ↔ Src |
7A00 | АСХК | Арифметический сдвиг комбинированный (32 бита):if Src < 0 then (Reg+1:Reg) ← Shift-right((Reg+1:Reg), -Src) else (Reg+1:Reg) ← Shift-left((Reg+1:Reg), Src) |
7C00 | МУЛ | Умножить:(Reg+1:Reg) ← Reg × Src |
7E00 | ДИВ | Разделять:Compute (Reg+1:Reg) ÷ Src; Reg ← quotient; Reg+1 ← remainder |
Старшие десять бит определяют операцию, которая должна быть выполнена, причем бит 15 обычно выбирает адресацию байта или слова. Одна группа из шести бит определяет операнд, как определено выше.
15 | 6 | 5 | 3 | 2 | 0 | ||||||||||
Код операции | Источник/назначение | Зарегистрироваться |
Код операции | Мнемонический | Операция |
---|---|---|
0BC0 | ТАМПОН | Поменять местами байты слова:Dest ← (Dest × 256) ∨ (Dest ÷ 256) |
8BC0 | ЮЗАО | Поменять местами цифры байта:Dest ← (Dest × 16) ∨ (Dest ÷ 16) |
0840 | КЛР | Прозрачный:Dest ← 0 |
8840 | КЛРБ | |
0C00 | КОМ | Дополнение:Dest ← (-1 - Dest) |
8C00 | ГРЕБЕНЬ | |
0C80 | ИНК | Приращение:Dest ← Dest + 1 |
8С80 | МККН | |
0CC0 | ДЕКАБРЬ | Уменьшение:Dest ← Dest − 1 |
8CC0 | ДЕКБ | |
0C40 | ОТРИЦАТЕЛЬНЫЙ | Отрицать:Dest ← -Dest |
8С40 | НЕГБ | |
0B00 | НАБОР | Набор:Dest ← -1 |
8B00 | СЕТБ | |
0A80 | ТСТ | Тест:Set-flags(Src) |
8А80 | ТСТБ | |
0А00 | РОР | Повернуть вправо:Dest:Cflag ← Rotate-right(Dest:Cflag, 1) |
8А00 | РОРБ | |
0А40 | РОЛ | Поворот влево:Cflag:Dest ← Rotate-left(Cflag:Dest, 1) |
8А40 | РОЛБ | |
0B80 | АСР | Арифметический сдвиг вправо:Dest ← Dest ÷ 2, sign preserved |
8Б80 | АСРБ | |
0AC0 | АМЖ | Арифметический сдвиг влево:Dest ← Dest × 2 |
8AC0 | АСЛБ | |
8Д80 | АЦП | Добавить переноску:Dest ← Dest + Cflag |
8DC0 | ЮБК | Вычесть перенос:Dest ← Dest - Cflag |
0D00 | IW2 | Увеличить слово на 2:Dest ← Dest + 2 |
0DC0 | ТЖМП | Прыжок с трамплина:PC ← PC + (Dest), PC ← PC + @PC |
0D80 | TCALL | Вызов по таблице:-(SP) ← PC, PC ← PC + (Dest), PC ← PC + @PC |
0D40 | SXT | Знак продлен:if N flag = 1 then Dest ← -1 else Dest ← 0 |
8D00 | ЛСТС | Статус процессора загрузки:PSW ← Dest |
8Д40 | ССТС | Сохранить статус процессора:Dest ← PSW |
Старшие семь битов и биты 5 и 4 определяют операцию, которую необходимо выполнить. Одна группа из трех бит определяет регистр. Четырехбитное поле счетчика содержит небольшой немедленный или счетчик. Во всех случаях к этому полю добавляется единица, что делает диапазон от 1 до 16.
15 | 9 | 8 | 6 | 5 | 4 | 3 | 0 | ||||||||
Код операции | Рег | Оп | Считать |
Код операции | Мнемонический | Операция |
---|---|---|
0800 | АДДИ | Добавить немедленно:Reg ← Reg + Count + 1 |
0810 | СУБИ | Вычесть немедленно:Reg ← Reg - Count - 1 |
0820 | БИКИ | Немного ясности немедленно:Reg ← Reg ∧ (-1 - (Count+1)) |
0830 | МОВИ | Двигайтесь немедленно:Reg ← Count + 1 |
8800 | ССРР | Множественный поворот вправо:Reg:C-flag ← Rotate-right(Reg:C-flag, Count+1) |
8810 | SSLR | Поворот влево, множественный:C-flag:Reg ← Rotate-left(C-flag:Reg, Count+1) |
8820 | ССРА | Множественный арифметический сдвиг вправо:Reg:C-flag ← Arithmetic-shift-right(Reg, Count+1) |
8830 | SSLA | Множественный арифметический сдвиг влево:C-flag:Reg ← Arithmetic-shift-left(Reg, Count+1) |
8E00 | СДРР | Двойной поворот вправо множественный (33 бита):Reg+1:Reg:C-flag ← Rotate-right(Reg+1:Reg:C-flag, Count+1) |
8E10 | SDLR | Двойной левый поворот множественный (33 бита):C-flag:Reg+1:Reg ← Rotate-left(C-flag:Reg+1:Reg, Count+1) |
8E20 | СДР | Двойной арифметический сдвиг вправо, кратный (32 бита):Reg:Reg+1:C-flag ← Arithmetic-shift-right(Reg:Reg+1, Count+1) |
8E30 | СДЛА | Двойной арифметический сдвиг влево, кратный (32 бита):C-flag:Reg:Reg+1 ← Arithmetic-shift-left(Reg:Reg+1, Count+1) |
Старшие восемь бит определяют операцию, которую необходимо выполнить. Две группы по четыре бита определяют исходный и целевой режим адресации и регистр. Если поле I = 0, назначенный регистр содержит адрес операнда, эквивалент режима адресации (Rn). Если поле I = 1, назначенный регистр содержит адрес адреса операнда, эквивалент режима адресации @0(Rn).
15 | 8 | 7 | 6 | 4 | 3 | 2 | 0 | ||||||||
Код операции | я | СРег | я | ДРег |
Код операции | Мнемонический | Операция |
---|---|---|
Ф000 | ФАДД | Плавающая надстройка:Dest ← Dest + Src |
Ф100 | ФСУБ | Плавающее вычитание:Dest ← Dest - Src |
Ф200 | ФМУЛЬ | Плавающее умножение:Dest ← Dest × Src |
Ф300 | ФДИВ | Плавающий разрыв:Dest ← Dest ÷ Src |
Ф400 | ФЦМП | Плавающий Сравнить:Dest - Src |
Коды операций F500 - FFFF были сопоставлены четвертому микрому для реализации еще одиннадцати инструкций с плавающей точкой. Нет никаких доказательств того, что этот четвертый микром когда-либо производился. Когда стандартный процессор WD16 выполняет коды операций F500 - FFFF, зарезервированная ловушка кода операции берется, загружая ПК с 001A.
Старшие десять бит определяют операцию, которую необходимо выполнить. Две группы по три бита определяют исходный и целевой регистры. Во всех случаях исходный регистр содержит адрес первого слова или байта памяти, подлежащего перемещению, а целевой регистр содержит адрес первого слова или байта памяти для получения перемещаемых данных. Количество перемещаемых слов или байтов содержится в R0 как беззнаковое целое число. Диапазон счетчика составляет от 1 до 65536. Эти инструкции полностью прерываемы.
15 | 6 | 5 | 3 | 2 | 0 | ||||||||||
Код операции | СРег | ДРег |
Код операции | Мнемонический | Операция |
---|---|---|
0E00 | МБВУ | Переместить блок слов вверх:(DReg) ← (SReg), SReg ← SReg + 2, DReg ← DReg + 2, R0 ← R0 - 1, until R0 = 0 |
0E40 | МБВД | Переместить блок слов вниз:(DReg) ← (SReg), SReg ← SReg - 2, DReg ← DReg - 2, R0 ← R0 - 1, until R0 = 0 |
0E80 | МББУ | Переместить блок байтов вверх:(DReg) ← (SReg), SReg ← SReg + 1, DReg ← DReg + 1, R0 ← R0 - 1, until R0 = 0 |
0EC0 | МББД | Переместить блок байтов вниз:(DReg) ← (SReg), SReg ← SReg - 1, DReg ← DReg - 1, R0 ← R0 - 1, until R0 = 0 |
0F00 | МБВА | Переместить блок слов по адресу:(DReg) ← (SReg), SReg ← SReg + 2, R0 ← R0 - 1, until R0 = 0 |
0F40 | МБВА | Переместить блок байтов по адресу:(DReg) ← (SReg), SReg ← SReg + 1, R0 ← R0 - 1, until R0 = 0 |
0F80 | МАБВ | Переместить адрес в блок слов:(DReg) ← (SReg), DReg ← DReg + 2, R0 ← R0 - 1, until R0 = 0 |
0FC0 | МАББ | Переместить адрес в блок байтов:(DReg) ← (SReg), DReg ← DReg + 1, R0 ← R0 - 1, until R0 = 0 |
Старший байт инструкции определяет операцию. Младший байт — это смещение знакового слова относительно текущего положения счетчика программ. Это позволяет осуществлять прямые и обратные переходы в коде. Максимальный диапазон переходов составляет +128, -127 слов от кода операции перехода.
В большинстве инструкций ветвления выбор перехода зависит от состояния кодов условий. Инструкции ветвления обычно предшествует инструкция CMP с двумя операндами (сравнение) или BIT (тест бита) или инструкция TST с одним операндом (тест). Арифметические и логические инструкции также устанавливают коды условий. В отличие от процессоров Intel в архитектуре x86 , инструкции MOV также устанавливают их, поэтому инструкция ветвления может использоваться для перехода в зависимости от того, было ли перемещенное значение нулевым или отрицательным.
15 | 8 | 7 | 0 | ||||||||||||
Код операции | Компенсировать |
Код операции | Мнемонический | Состояние или операция |
---|---|---|
0100 | БР | Филиал всегдаPC ← PC + (2 × Sign-extend(Offset)) |
0200 | БНЕ | Ветвь, если не равноZ = 0 |
0300 | БЭК | Ветвь, если равноZ = 1 |
0400 | БГЕ | Переход, если больше или равно(N ⊻ V) = 0 |
0500 | БЛТ | Ветвь, если меньше(N ⊻ V) = 1 |
0600 | БГТ | Ветвь, если больше(Z ∨ (N ⊻ V)) = 0 |
0700 | БЛЕ | Переход, если меньше или равно(Z ∨ (N ⊻ V)) = 1 |
8000 | БПЛ | Ветвь, если плюсN = 0 |
8100 | ИМТ | Ветвь, если минусN = 1 |
8200 | БХИ | Ветвь, если выше(C ∨ Z) = 0 |
8300 | БЛОС | Филиал, если ниже или такой же(C ∨ Z) = 1 |
8400 | БВК | Ветвление, если переполнение устраненоV = 0 |
8500 | БВС | Ветвление, если установлено переполнениеV = 1 |
8600 | BCC или BHIS | Разделение, если перенос чистый, или разделение, если выше или равноC = 0 |
8700 | БКС или БЛО | Разделение, если набор для переноски, или разделение, если нижеC = 1 |
Ограниченный диапазон инструкций ветвления означает, что по мере роста кода целевые адреса некоторых ветвлений могут стать недостижимыми. Программист менял однословную инструкцию Bcc на двухсловную инструкцию JMP. Поскольку JMP не имеет условных форм, программист менял Bcc на противоположный смысл, чтобы выполнить ветвление вокруг JMP.
15 | 9 | 8 | 6 | 5 | 0 | ||||||||||
Код операции | Рег | Компенсировать |
Код операции | Мнемонический | Операция |
---|---|---|
7600 | СОБ | Subtract One and Branch: Reg ← Reg - 1; if Reg ≠ 0 then PC ← PC - (2 × Offset) |
SOB (Subtract One and Branch) — еще одна инструкция условного перехода. Указанный регистр уменьшается на 1, и если результат не равен нулю, выполняется обратный переход на основе 6-битного смещения слова.
15 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||||
Код операции | Рег | Источник | Зарегистрироваться |
Код операции | Мнемонический | Операция |
---|---|---|
7000 | JSR | Перейти к подпрограмме:-(SP) ← Reg; Reg ← PC; PC ← Src |
JSR вызывает подпрограмму. Группа из шести бит определяет режим адресации. Инструкция JSR может сохранять любой регистр в стеке. Программы, которым не нужна эта функция, указывают PC в качестве регистра ( JSR PC, address
), а подпрограмма возвращает значение с помощью RTN PC
. Если бы подпрограмма была вызвана, например, с помощью JSR R4, address
, то старое значение R4 было бы сохранено наверху стека, а адрес возврата (сразу после JSR) был бы в R4. Это позволяет подпрограмме получить доступ к значениям, закодированным в строке, путем указания (R4)+ или к указателям в строке, путем указания @(R4)+. Автоинкрементация перемещается мимо этих данных к точке, в которой возобновляется код вызывающей стороны. Такая подпрограмма указала бы RTN R4
возврат к своей вызывающей стороне.
Форму JSR PC,@(SP)+
можно использовать для реализации сопрограмм . Первоначально адрес входа сопрограммы помещается в стек, и с этого момента JSR PC,@(SP)+
инструкция используется как для вызова, так и для оператора возврата. Результатом этой инструкции JSR является обмен содержимым PC и верхнего элемента стека, что позволяет двум процедурам обмениваться управлением и возобновлять работу, когда каждая из них была завершена предыдущей заменой.
15 | 3 | 2 | 0 | ||||||||||||
Код операции | Рег |
Код операции | Мнемонический | Операция |
---|---|---|
0018 | РТН | Возврат из подпрограммы:PC ← Reg; Reg ← (SP)+ |
0028 | ПРНТ | Извлечь стек и вернуть:SP ← SP + (2 × @SP), PC ← Reg; Reg ← (SP)+ |
PRTN удаляет ряд параметров из стека и возвращается. PRTN — это ответ WD16 на сложную инструкцию MARK PDP-11. В отличие от MARK, PRTN выполняется в программном пространстве и может использовать любой регистр в качестве регистра связи. Для этого объяснения в качестве связи будет использоваться R5. Сначала вызывающий помещает R5 в стек. Затем в стек может быть помещено любое количество аргументов-слов. Затем вызывающий помещает количество слов-аргументов + 1 в R5. Вызывающий выполняет инструкцию, JSR R5,address
которая помещает количество слов-аргументов + 1 в стек, помещает адрес возврата в R5 и переходит к подпрограмме. После выполнения своего кода подпрограмма завершается с помощью PRTN R5
. PRTN удваивает число на вершине стека и добавляет его к SP, удаляя параметры. Затем PRTN продолжает, возвращаясь к вызывающему с эквивалентом RTN R5
, загружая R5 в PC и выталкивая R5.
Эти инструкции имеют 13-битный код операции и трехбитный аргумент регистра.
15 | 3 | 2 | 0 | ||||||||||||
Код операции | Рег |
Код операции | Мнемонический | Операция |
---|---|---|
0010 | ИАК | Подтверждение прерывания:Interrupt acknowledge state code, Reg ← Bus read |
0020 | МСКО | Маскировка:(002E) ← Reg, Mask out state code |
15 | 0 | ||||||||||||||
Код операции |
Код операции | Мнемонический | Операция |
---|---|---|
0000 | НОП | Нет операции:Do nothing |
0001 | ПЕРЕЗАГРУЗИТЬ | Перезагрузить:Transmit reset pulse to I/O devices |
0002 | ИЭН | Разрешение прерывания:I2 ← 1 |
0003 | ИДС | Отключение прерываний:I2 ← 0 |
0004 | ОСТАНОВИТЬ | Остановка:Executes the selected halt option |
0005 | XCT | Выполнить отдельную инструкцию:PC ← (SP)+, PS ← (SP)+, set trace flag, execute opcode, -(SP) ← PS, -(SP) ← PC, trace flag reset, If no error PC ← (0020) else PC ← (001E) |
0006 | БПТ | Ловушка точки останова:-(SP) ← PS, -(SP) ← PC, PC ← (002C) |
0007 | ВиДи | Ожидание прерывания:Enable interrupts (I2 ← 1). Bus activity ceases. |
0008 | РСВК | Ответ от руководителя (B или C):REST, SP ← SP + 2, RTT |
0009 | РРТТ | Восстановление и возвращение из ловушки:REST, RTT |
000А | СОХРАНЯТЬ | Сохранить регистры:-(SP) ← R5, -(SP) ← R4, -(SP) ← R3, -(SP) ← R2, -(SP) ← R1, -(SP) ← R0 |
000Б | САВС | Сохранить статус:SAVE, -(SP) ← (002E), (002E) ← (002E) ∨ Mask, MSKO, IEN. Note Mask is stored in the second word of instruction. |
000С | ОТДЫХ | Восстановить регистры:R0 ← (SP)+, R1 ← (SP)+, R2 ← (SP)+, R3 ← (SP)+, R4 ← (SP)+, R5 ← (SP)+ |
000D | РРТН | Восстановить и вернуть:REST, PC ← (SP)+ |
000E | РСТС | Восстановить статус:(002E) ← (SP)+, MSKO, REST, RTT |
000Ф | РТТ | Возвращение из ловушки:PC ← (SP)+, PS ← (SP)+ |
Эти инструкции используются для реализации вызовов операционной системы (супервизора). Все они имеют шестибитный аргумент регистра. SVCB и SVCC разработаны таким образом, чтобы аргумент операционной системы мог использовать большинство режимов адресации, поддерживаемых собственным набором инструкций.
15 | 6 | 5 | 0 | ||||||||||||
Код операции | Арг |
Код операции | Мнемонический | Операция |
---|---|---|
0040 | СВКА | Руководитель Звонок А:-(SP) ← PS ,-(SP) ← PC, PC ← (0022) + Arg × 2, PC ← (PC) |
0080 | СВЦБ | Вызов супервайзера B:TMPA ← SP, -(SP) ← PS, -(SP) ← PC, TMPB ← SP, -(SP) ← TMPA, -(SP) ← R5, -(SP) ← R4, -(SP) ← R3, -(SP) ← R2, -(SP) ← R1, -(SP) ← R0, R1 ← TMPB, R5 ← Arg × 2, PC ← (0024) |
00С0 | SVCC | Руководитель Звонок C:TMPA ← SP, -(SP) ← PS, -(SP) ← PC, TMPB ← SP, -(SP) ← TMPA, -(SP) ← R5, -(SP) ← R4, -(SP) ← R3, -(SP) ← R2, -(SP) ← R1, -(SP) ← R0, R1 ← TMPB, R5 ← Arg × 2, PC ← (0026) |
15 | 4 | 3 | 2 | 1 | 0 | ||||||||||
Код операции | Н | З | В | С |
Код операции | Мнемонический | Операция |
---|---|---|
0030 | ЛКК | Коды условий нагрузки:Load according to N, Z, V, C bits |
Четыре кода состояния в слове состояния процессора (PSW) следующие:
WD16 имеет три типа прерываний: невекторные, векторные и halt. Невекторные и векторные прерывания включаются и выключаются инструкциями IEN
и IDS
. Halt не может быть отключен.
Невекторное прерывание (NVI) имеет приоритет над векторными прерываниями. NVI используется только для двух вещей: сбой питания и линейный тактовый сигнал. (Линейный тактовый сигнал обычно представляет собой вход с частотой 50 или 60 Гц, используемый для квантования времени и отсчета времени .) При получении NVI нажимаются PS и PC. Проверяется статус сбоя питания. Если это сбой питания, WD16 перейдет по адресу, сохраненному в 0014. Если это не сбой питания, то предполагается такт линейных тактовых сигналов, и WD16 перейдет по адресу, сохраненному в 002A.
Поддерживается шестнадцать векторов прерываний. При получении векторного прерывания выдвигаются PS и PC. Во время подтверждения прерывания WD16 принимает четырехбитный номер прерывания, предоставленный прерывающим устройством. Адрес таблицы векторов прерываний извлекается из 0028, и к нему добавляется номер прерывания, указывая на одно из 16 слов в таблице. Смещение слова извлекается из таблицы и добавляется к его собственному адресу таблицы. Результат загружается в PC, вызывая переход к процедуре обслуживания прерываний . То, какие одновременные прерывания будут приняты, определяется 16-битной маской приоритета прерываний , которая в основном реализуется с помощью внешнего оборудования. WD16 сохраняет текущую маску приоритета в 002E, передавая маску напрямую оборудованию. Маска обрабатывается с помощью инструкций MSKO
, SAVS
и RSTS
. Если требуется более 16 векторных прерываний, их можно инициировать через NVI и отправлять с помощью IAK
инструкции.
Halt — это немаскируемое прерывание, которое может использоваться для переключения программиста или других целей в зависимости от того, как настроены его перемычки. Хотя halt может изменить адрес выполнения и не маскируется разрешением прерывания, его нельзя использовать как типичное немаскируемое прерывание, поскольку PC не нажат. В зависимости от перемычек линия halt может даже не останавливаться. Если инструкция HALT
выполнена, она может быть очищена линией halt, опять же, в зависимости от перемычек.
Ячейки памяти между 0000 и 003F имеют фиксированные функции, определяемые процессором. Все адреса ниже являются адресами слов. [9]
Вектор | Состояние |
---|---|
0000-0010 | R0 - R5, SP, PC и PS для опций включения/остановки |
0012 | ошибка шины ПК |
0014 | невекторное прерывание питания сбой ПК |
0016 | опция включения/остановки питания восстановление питания ПК |
0018 | ошибка четности ПК |
001А | зарезервированный код операции ПК |
001С | незаконный формат кода операции ПК |
001Е | Ошибка XCT ПК |
0020 | XCT трассировка ПК |
0022 | Адрес таблицы SVCA |
0024 | ПК СВК |
0026 | ПК SVCC |
0028 | адрес таблицы векторных прерываний (I0) |
002А | невекторное прерывание (I1) ПК |
002С | БПТ ПК |
002Е | Маска прерывания приоритета ввода-вывода |
0030-003С | Блокнот с плавающей точкой |
003Е | Ошибка с плавающей точкой ПК |
Скорость процессора WD16 зависит от тактовой частоты, конфигурации памяти, кода операции и режимов адресации. Время выполнения инструкции может включать до трех компонентов: выборку/выполнение самой инструкции и время доступа к источнику и месту назначения. Последние два компонента зависят от режима адресации. Например, при частоте 3,3 МГц инструкция вида ADD x (R m ), y (R n ) имеет время выборки/выполнения 3,3 микросекунды плюс время источника 2,7 микросекунды и время назначения 3,0 микросекунды, что в итоге составляет 9,0 микросекунд. Регистр-регистр ADD R m ,R n выполняется за 3,3 микросекунды. Плавающая точка значительно медленнее. Плавающая инструкция сложения с точностью один с половиной (48 бит) обычно занимает от 54 до 126 микросекунд. Точность WD16 представляет собой компромисс между традиционными плавающими числами одинарной и двойной точности. [9]
Для сравнения, самым быстрым компьютером PDP-11 в то время был PDP-11/70. Инструкция вида ADD x (R m ), y (R n ) имеет время выборки/выполнения 1,35 микросекунды плюс время источника и назначения по 0,6 микросекунды каждое, что составляет общее время инструкции 2,55 микросекунды. Любой случай, когда адресуемая память не была в кэше, добавляет 1,02 микросекунды. Регистр-регистр ADD R m ,R n может быть выполнен из кэша за 0,3 микросекунды. [13] Плавающая инструкция сложения одинарной точности, выполняемая сопроцессором FP11-C, может иметь время в диапазоне от 0,9 до 2,5 микросекунд плюс время выборки операндов, которое может составлять до 4,2 микросекунд. [14]
Инструкции по передаче блоков WD16 примерно вдвое увеличивают скорость перемещений и ввода-вывода блоков. Перемещение слова с помощью MOV (R1)+,(R2)+, SOB R0,loop
инструкций занимает 9,6 микросекунд на итерацию. MBWU R1,R2
Эквивалент занимает 4,8 микросекунд на итерацию.
Ассоциация пользователей компьютеров провела ряд тестов на системе на базе AM-100T стоимостью 35 680 долларов США (что эквивалентно 131 941 доллару США в 2023 году). Они обнаружили, что их тест, связанный с процессором, был выполнен за 31,4 секунды на AM-100T по сравнению с 218 секундами для средней однопользовательской системы в ценовом диапазоне от 15 000 до 25 000 долларов США. [15] В группе многопользовательских компьютеров стоимостью от 25 000 до 50 000 долларов США AM-100T оказался в «верхней трети» по скорости. [16]
Тест Creative Computing Benchmark за май 1984 года поставил WD16 (в приложении AM-100T) на 34-е место из 183 протестированных машин. Прошедшее время составило 10 секунд, по сравнению с 24 секундами для IBM PC . [17]
Virtual Alpha Micro — это эмулятор WD16 с открытым исходным кодом. Написанный на языке C, он эмулирует процессор WD16 и аппаратную среду Alpha Micro AM-100. Автор утверждает, что он работает на Linux (включая Raspberry Pi), Windows и Macintosh, хотя двоичные файлы не предоставляются. Он будет запускать операционную систему Alpha Micro (AMOS) и все связанные с ней программы. В 2002 году Alpha Micro предоставила ограниченное разрешение на распространение двоичных файлов AMOS 4.x или 5.0, включая руководства, только для любительского использования. [18]