Просмотр полной версии : Особенности процессоров и устройств архитектуры PDP-11. Тесты. Диагностика.
Страницы :
1
2
3
4
5
6
[
7]
8
9
10
Для установления истины написан тест
0
1
2
255
0
1
2
3
4
255
0
1
255
0
1
2й запуск
0
1
2
253
254
255
0
1
2
253
254
255
253
254
255
.
Новый тест: TDW2.SAV (http://emulator.pdp-11.org.ru/misc/TDW2.zip) - делает то же самое, но с предварительным сбросом контроллера.
Новый тест
0
1
2
0
1
2
3
4
5
0
1
2
0
1
2Результаты 2го раза такие же.
.
Ситуация прояснилась - любое обращение к регистру 174006 обнуляет позицию чтения/записи в буфере DW ( это пока не эмулируется ), и только запись в регистр 174016 даёт такой же эффект ( это уже эмулируется ).
А кто-нибудь может в двух словах рассказать как выполнять I/O на DW? Причем интересует 22 bit.
А кто-нибудь может в двух словах рассказать как выполнять I/O на DW? Причем интересует 22 bit. А биты там по барабану - он работает в PIO-mode. То есть посылаем цилиндр в 174012, поверхность в 174014, сектор в 174006, команду чтения в 174016, разрешение прерывания в 174020 и ждем прерывания. Пока выполняются операции, все регистры, кроме 174020 недоступны, бит 15 (100000) в нем на это указывает. То есть или жди прерывания, или пропалывай (POLL) этот бит. Впрочем и в RT-11, и в ДИАМСе, получив прерывание, первым делом его проверяют, если он стоит, уходят на повтор или ошибку.
А потом не спеша, прополкой, ждут бита готовности (200) в 174020, после чего пересылают очередное слово из 174010 в память. В RT-11 это делается на FORK-уровне. Запись примерно так же - выдают дисковый адрес, пословно пересылают из памяти в буфер DW (174010), выдают команду записи и ждут прерывания, после чего проверяют на ошибки
- - - Добавлено - - -
Ситуация прояснилась - любое обращение к регистру 174006 обнуляет позицию чтения/записи в буфере DW В принципе, почти логично - сектор изменили, значит позиция в старом секторе стала неактуальной. А то, что любое обращение, а не только запись - вероятно, или недоглядели, или были сложности в реализации. Да и нелогично делать чтение регистра служебной зоны формата посередине передачи блока...
Тоже вопрос или где можно почитать (желательно на русском), как процессор узнает по какому адресу находится подпрограмма прерывания выставленного аппаратурой? Если еще точнее, то вот например, есть регистры внешнего устройства к примеру 176570 и 176574 откуда процессор узнает что нужно перейти по вектору 374? Как этот механизм на железе работает, что выставляется на шину А/Д и т.п.?
как процессор узнает по какому адресу находится подпрограмма прерывания выставленного аппаратурой?
Ответ просто - он этого не узнает в принципе. Ему выставили вектор, он по нему выполнил прерывание, а была там подпрограмма обработки или нет - его не волнует :)
- - - Добавлено - - -
Как этот механизм на железе работает, что выставляется на шину А/Д и т.п.?
Можно взять например users guide по KDJ11-B (первое что на память пришло), там подробно все это расписно.
- - - Добавлено - - -
Вот здесь (http://ftp.vim.org/NetBSD/misc/ross/qbus/) еще вроде было про это.
Ему выставили вектор, он по нему выполнил прерывание
Т.е. аппаратура висящая на адресах 176570 - 176576 выставляет сигнал прерывания и на шину выставляется адрес вектора? или адрес вектор процессор читает из 176576 по сигналу прерывания? где, чем, определяется приоритет?
Можно взять например users guide по KDJ11-B (первое что на память пришло), там подробно все это расписно
Можно здесь, не очень подробно, сам механизм, мне пока не понятно.
Т.е. аппаратура висящая на адресах 176570 - 176576 выставляет сигнал прерывания и на шину выставляется адрес вектора? или адрес вектор процессор читает из 176576 по сигналу прерывания? где, чем, определяется приоритет? Загляни в книжку "Центральный процессор М2", ссылку давали недавно в теме "ДВК-УКНЦ поиск файлов". Коротко - ВП1-065 по адресу 176560, допустим, выставляет К ТПР Н, в ответ сначала выдается К ВВОД Н, по которому все подключенные фиксируют состояние своего триггера запроса прерывания и, если он установлен, перекрывают дальнейшее прохождение К ППР Н. Через несколько сотен нс выдается сигнал К ППР Н, первый по корзине с включенным триггером запроса прерывания выдаст на К ДА02-15 Н код вектора прерывания (в нашем случае - 360) и К СИП Н. Процессор считывает этот код, интерпретирует его, как адрес вектора и достает оттуда PC, потом, прибавив к нему двойку, достает приоритет. И вперед.Остальные устройства (дальше по корзине) сигнал К ППР Н не получат - наш ВП1-065 его перекрыл.
Остальные устройства (дальше по корзине) сигнал К ППР Н не получат - наш ВП1-065 его перекрыл.
Добавлю также, что если никто не ответит вектором вовремя - это вполне штатная ситуация и проц просто посчитает, что прерывания не требуется, однако на некоторых процах (ВМ2 например) будет останов проца по ошибке.
потом, прибавив к нему двойку, достает приоритет. И вперед.Остальные устройства (дальше по корзине) сигнал К ППР Н не получат - наш ВП1-065 его перекрыл.
А смысл в приоритете, если приоритет определяется расположением в корзине?
Если нет корзины должен быть арбитр приоритета или как это в "железе" сделано?
Добавлю также, что если никто не ответит вектором вовремя - это вполне штатная ситуация и проц просто посчитает, что прерывания не требуется, однако на некоторых процах (ВМ2 например) будет останов проца по ошибке. Э-60 тоже остановится. По M выдаст единицу.
А смысл в приоритете, если приоритет определяется расположением в корзине?
Так он определяется только для старого железа, не знающего про приоритет. Для более нового есть правила позиционно-независимого реагирования.
А смысл в приоритете, если приоритет определяется расположением в корзине?
Если нет корзины должен быть арбитр приоритета или как это в "железе" сделано? А у "больших" процессоров, включая ВМ3, не одна, а четыре линии запроса прерываний - К ТПР4 Н - К ТПР7 Н. Соответственно, если приоритет процессора, допустим, 5 (240), то запросы прерывания К ТПР4 Н и К ТПР5 Н будут ждать, а К ТПР6 Н или К ТПР7 Н будут приняты.
- - - Добавлено - - -
Правда, если начата обработка запроса К ТПР6 Н, а раньше по корзине окажется ожидающий обслуживания запроса К ТПР4 Н, то обработается он, но это уже издержки...
Правда, если начата обработка запроса К ТПР6 Н, а раньше по корзине окажется ожидающий обслуживания запроса К ТПР4 Н, то обработается он, но это уже издержки...
Тут уже вступит в силу реакция самих устройств. Устройство приоритета 4 не должно реагировать на ответ если выставлены IRQ5 или IRQ6, устройство 5 приоритета не должно реагировать на ответ если выставлен IRQ6; устройство 6 приоритета не должно реагировать если выставлен IRQ7.
Тут уже вступит в силу реакция самих устройств. Устройство приоритета 4 не должно реагировать на ответ если выставлены IRQ5 или IRQ6 приоритета, устройство 5 приоритета не должно реагировать на ответ если выставлен IRQ6; устройство 6 приоритета не должно реагировать если выставлен IRQ7. Угу, только бывают устройства, которые ничего не зают об IRQ5-7. Та же плата В21 или И7. Кстати, у кого схемы 1201.03/04 под рукой, гляньте, как там с проверкой IRQ5-7 для набортного ВП1-065.
устройства, которые ничего не зают об IRQ5-7
Бывают. Их просто желательно ставить в конец цепочки.
Не понимаю. Если нет корзины, два устройства с разным приоритетом выставили ТПР одновременно, то как процессор узнает у кого приоритет выше если ему надо сначала считать вектор? Или это уже зависит от скорости реакции на сигнал ППР, а если и здесь одновременно?
Бывают. Их просто желательно ставить в конец цепочки. Это-то понятно. Только вот как там с набортным ВП1-065 ? Впрочем, штатных для ДВК устройств с 5-7-м приоритетами в природе не существует...
Правила позиционно-независимой работы:
Уровень Выставляется Мониторится
4 TIRQ4 RIRQ5, RIRQ6
5 TIRQ4, TIRQ5 RIRQ6
6 TIRQ4, TIRQ6 RIRQ7
7 TIRQ4, TIRQ6, TIRQ7
Не понимаю. Если нет корзины, два устройства с разным приоритетом выставили ТПР одновременно, то как процессор узнает у кого приоритет выше если ему надо сначала считать вектор? Или это уже зависит от скорости реакции на сигнал ППР, а если и здесь одновременно? ППР идет через все устройства последовательно. То есть их два: IACKI и IACKO. Обычно, сигнал IACKI сразу транслируется на IACKO. Если требуется прерывание, то по сигналу К ВВОД Н запрос фиксируется в отдельном триггере, который запрещает дальнейшую трансляцию (отключает IACKO) и направляет его (IACKI) в схему выдачи вектора.
- - - Добавлено - - -
Не понимаю. Если нет корзины На каждой плате, если там несколько устройств, то у них прохождение сигнала ППР также должно идти последовательно. Цепочка начинается с выхода IACKO процессора, сигнал с которого идет на IACKI первого устройства, с его IACKO на IACKI второго, и т.д. Если цепочка кончилась, она выдается на контакт К ППР0 Н этой платы. Если плата не процессорная, то она начинается с контакта К ППРI Н. Поэтому из запросивших прерывание всегда сработает только одно устройство - ближайшее к процессору.
- - - Добавлено - - -
Правила позиционно-независимой работы: А для этого нужна логическая схемка, навскидку, не очень простая, одной 155ЛА3 не отделаешься. И я что-то не припомню таких в окрестностях набортного ВП1-065 на 1201.03/04. Сама же 065-я ничего подобного не умеет.
.
Новый тест: T4REG.SAV (http://emulator.pdp-11.org.ru/misc/T4REG.zip) - проверяет, как влияет зависание на выполнение автоинкремента регистра. Запускать можно на любых машинах.
Результат запуска на эмулируемой ДВК-2 такой :
.RU T4REG
Register Autoincrement TRAP4 test #1.
MOV #160020,R2
TST (R2)+
>>> Trap to 004 <<< ; R2/160022
CLR (R2)+
>>> Trap to 004 <<< ; R2/160024
CMP R0,(R2)+
>>> Trap to 004 <<< ; R2/160026
MOV R0,(R2)+
>>> Trap to 004 <<< ; R2/160030
TST -(R2)
>>> Trap to 004 <<< ; R2/160026
CLR -(R2)
>>> Trap to 004 <<< ; R2/160024
CMP R0,-(R2)
>>> Trap to 004 <<< ; R2/160022
MOV R0,-(R2)
>>> Trap to 004 <<< ; R2/160020
Program completed.
.
проверяет, как влияет зависание на выполнение автоинкремента регистра.
На 11/83 также. Согласно списка различий регистры не меняются только для 11/44, 11/04 и 11/34 (интересно как на ВМ3 и СМ1420).
Также полезно добавить тест когда PC содержит несуществующий адрес: здесь поведение отличается от обычных регистров: не меняется только для 11/35 и 11/40.
Исключение по low SP в режиме пульта: [http://s020.radikal.ru/i702/1602/38/2bd071d16709t.jpg (http://s020.radikal.ru/i702/1602/38/2bd071d16709.png)]
И кстати тест словного обращения к нечетному адресу интересен - в таблице и такое есть.
тест словного обращения к нечетному адресу интересенНовые тесты: T4REG2.SAV (http://emulator.pdp-11.org.ru/misc/T4REG2.zip) и T4REG3.SAV (http://emulator.pdp-11.org.ru/misc/T4REG3.zip) - проверяют адресацию типа @(R2)+ и автоинкремент при словном обращении к нечётным адресам.
.RU D10:T4REG3
Register Autoincrement TRAP4 test #3.
MOV #311,R2
TST (R2)+
>>> Trap to 004 <<< ; R2/000313
CLR (R2)+
>>> Trap to 004 <<< ; R2/000315
CMP R0,(R2)+
>>> Trap to 004 <<< ; R2/000317
MOV R0,(R2)+
>>> Trap to 004 <<< ; R2/000321
TST -(R2)
>>> Trap to 004 <<< ; R2/000317
CLR -(R2)
>>> Trap to 004 <<< ; R2/000315
CMP R0,-(R2)
>>> Trap to 004 <<< ; R2/000313
MOV R0,-(R2)
>>> Trap to 004 <<< ; R2/000311
Program completed.
.
.
Новый тест: T4PC.SAV (http://emulator.pdp-11.org.ru/misc/T4PC.zip) - проверяет, как влияют нечётное значение и зависание на выполнение автоинкремента PC. Запускать можно на любых машинах.
Результат запуска на эмулируемой ДВК-2 такой :
.RU T4PC
PC Autoincrement TRAP4 test.
001112/ INC PC
001114/
JMP @#160000
>>> Trap to 004 <<< ; PC/160002
157776/ TST (PC)+
>>> Trap to 004 <<< ; PC/160002
157776/ MOV R0,(PC)+
>>> Trap to 004 <<< ; PC/160002
157776/ MOV R0,@(PC)+
>>> Trap to 004 <<< ; PC/160002
157776/ MOV R0,240(PC)
>>> Trap to 004 <<< ; PC/160002
157776/ MOV R0,@240(PC)
>>> Trap to 004 <<< ; PC/160002
Program completed.
.
.RU T4PC
PC Autoincrement TRAP4 test.
001112/ INC PC
001114/
>>> Trap to 004 <<< ; PC/001115
JMP @#160000
>>> Trap to 004 <<< ; PC/160000
157776/ TST (PC)+
>>> Trap to 004 <<< ; PC/160002
157776/ MOV R0,(PC)+
>>> Trap to 004 <<< ; PC/160002
157776/ MOV R0,@(PC)+
>>> Trap to 004 <<< ; PC/160002
157776/ MOV R0,240(PC)
>>> Trap to 004 <<< ; PC/160002
157776/ MOV R0,@240(PC)
>>> Trap to 004 <<< ; PC/160002
Program completed.
.
- - - Добавлено - - -
Еще тест (http://pdp-11.org.ru/~form/files/pdp-11/tipc.sav) на тему PC - в сущности уже проверено предыдущим:
001036 TST @#160000 ;PC=001042
001134 MOV #160000,PC ;PC=160000
- - - Добавлено - - -
157776/ MOV R0,240(PC)
Хм... Это как? :)
Это как?Чтобы не рисовать там непонятные xxx - оставил то значение смещения, которое есть в тесте у оригинального кода команды до его копирования в R0.
- - - Добавлено - - -
Mov (PC)+, R0
Mov R0, 240(PC)
Mov R0, @#157776
Jmp @#157776
Чтобы не рисовать там непонятные xxx - оставил то значение смещения, которое есть в тесте у оригинального кода команды до его копирования в R0.
Так команда два слова занимает, а копируется одно причем в последнее слово памяти.
- - - Добавлено - - -
Или цель была как раз проверить команду которая частично не вместилась?
Или цель была как раз проверить команду которая частично не вместилась?Конечно. Ведь если PC инкрементится даже при невыборке смещения, то после успешной выборки смещения - PC по-любому уже будет инкрементирован.
На ВМ3А вот на ВМ3 - тест tipc.sav (http://pdp-11.org.ru/~form/files/pdp-11/tipc.sav) весьма актуален.
tipc сейчас проверим, а T4* на Э60 (M2) проверить не удалось - на имеющейся машине памяти 14KW, а тесты обращаются к памяти выше... Тамже:
TIPC
001036 TST @#160000 ;PC=001042
001134 MOV #160000,PC ;PC=160002
- - - Добавлено - - -
Позже соберусь с силами еще сделаю тест при обращении в память без доступа.
- - - Добавлено - - -
Еще ВМ3... TIPC: 1042, 160000
55843
Позже соберусь с силами еще сделаю тест при обращении в память без доступа.Зависание прерывает микропрограмму позже, чем ошибка MMU, поэтому результат для ВМ3 не должен отличаться.
Зависание прерывает микропрограмму позже, чем ошибка MMU, поэтому результат для ВМ3 не должен отличаться.
Ну мы уже знаем, что в принципе штатно бывает разное поведение при MMU fault, соответственно хочется проверить все...
Если ещё актуально, то вот:
На ВМ3
.T4REG
Register Autoincrement TRAP4 test #1.
MOV #160020,R2
TST (R2)+
>>> Trap to 004 <<< ; R2/160020
CLR (R2)+
>>> Trap to 004 <<< ; R2/160020
CMP R0,(R2)+
>>> Trap to 004 <<< ; R2/160020
MOV R0,(R2)+
>>> Trap to 004 <<< ; R2/160020
TST -(R2)
>>> Trap to 004 <<< ; R2/160016
CLR -(R2)
>>> Trap to 004 <<< ; R2/160014
CMP R0,-(R2)
>>> Trap to 004 <<< ; R2/160012
MOV R0,-(R2)
>>> Trap to 004 <<< ; R2/160010
Program completed.
.T4REG2
Register Autoincrement TRAP4 test #2.
MOV #160020,R2
TST @(R2)+
>>> Trap to 004 <<< ; R2/160020
CLR @(R2)+
>>> Trap to 004 <<< ; R2/160020
CMP R0,@(R2)+
>>> Trap to 004 <<< ; R2/160020
MOV R0,@(R2)+
>>> Trap to 004 <<< ; R2/160020
TST @-(R2)
>>> Trap to 004 <<< ; R2/160016
CLR @-(R2)
>>> Trap to 004 <<< ; R2/160014
CMP R0,@-(R2)
>>> Trap to 004 <<< ; R2/160012
MOV R0,@-(R2)
>>> Trap to 004 <<< ; R2/160010
Program completed.
.T4REG3
Register Autoincrement TRAP4 test #3.
MOV #311,R2
TST (R2)+
>>> Trap to 004 <<< ; R2/000311
CLR (R2)+
>>> Trap to 004 <<< ; R2/000311
CMP R0,(R2)+
>>> Trap to 004 <<< ; R2/000311
MOV R0,(R2)+
>>> Trap to 004 <<< ; R2/000311
TST -(R2)
>>> Trap to 004 <<< ; R2/000307
CLR -(R2)
>>> Trap to 004 <<< ; R2/000305
CMP R0,-(R2)
>>> Trap to 004 <<< ; R2/000303
MOV R0,-(R2)
>>> Trap to 004 <<< ; R2/000301
Program completed.
.T4PC
PC Autoincrement TRAP4 test.
001112/ INC PC
001114/
>>> Trap to 004 <<< ; PC/001115
JMP @#160000
>>> Trap to 004 <<< ; PC/160000
157776/ TST (PC)+
>>> Trap to 004 <<< ; PC/160000
157776/ MOV R0,(PC)+
>>> Trap to 004 <<< ; PC/160000
157776/ MOV R0,@(PC)+
>>> Trap to 004 <<< ; PC/160000
157776/ MOV R0,240(PC)
>>> Trap to 004 <<< ; PC/160000
157776/ MOV R0,@240(PC)
>>> Trap to 004 <<< ; PC/160000
Program completed.
.TIPC
001036 TST @#160000 ;PC=001042
001134 MOV #160000,PC ;PC=160000
Кстати еще тест (http://pdp-11.org.ru/~form/files/pdp-11/cm1420/mfps.sav) для СМ1420 и ВМ3.
.RU MFPS
UISDR7=077406, PSW=140016, MFPS R0, R0=000016
UISDR7=077400, PSW=140016, MFPS R0, R0=000016
.
- - - Добавлено - - -
И вот такой (http://pdp-11.org.ru/~form/files/pdp-11/mvps.sav) тест еще интересно прогнать на ВМ3 и СМ1420...
.RU MVPS
;PSW=170000, @#177776=123456
MFPS R1 ;R1=000000
MTPS #17 ;PSW=170017, @#177776=123456
.
.
Новый тест: YT4A.SAV (http://emulator.pdp-11.org.ru/misc/YT4A.zip) - проверяет YELLOW STACK TRAP для команд CMP -(SP),-(SP) и CMP @-(SP),@-(SP).
Запускать можно на любых машинах. На эмулируемой ДВК-2 результат такой :
.RU YT4A
Yellow Stack Trap test #1
SP/000400
CMP -(SP),-(SP)
SP/000374
SP/000400
CMP @-(SP),@-(SP)
SP/000374
Program completed.
.
на любых машинах
На некоторых (11/70) ограничение стека настраивается регистром 17777774.
.VDT
VDT V05.07
*177766/000130 0
*/000000 ^C
.RU YT4A
Yellow Stack Trap test #1
SP/000400
CMP -(SP),-(SP)
>>> Trap to 004 <<<
SP/000374
SP/000400
CMP @-(SP),@-(SP)
>>> Trap to 004 <<<
SP/000374
Program completed.
.VDT
VDT V05.07
*177766/000010
- - - Добавлено - - -
По идее результат однозначен - на то он и yellow, чтобы команда сама по себе отработала. Вот ежели в стек уже ничего положить нельзя - тогда где суппортится будет RSA (SP=4, 1777766 |= 4, trap to 4)
.
Не так давно мы удивлялись, почему в HALT-моде команда MFPI SP пишет в стек не USP, а KSP.
Но чему удивляться, если регистр SP предыдущей моды задаётся битом 13 в PSW, а при входе в HALT-моду этот бит обнуляется.
Новый вариант теста при входе в пульт корректно устанавливает предыдущую моду в PSW :
.ASect
. = 0
Jmp @#Next // Точка входа пульта.
. = 24
.Word Start // Адрес старта.
.Word 340
Start:
Mov #140340, @#177776 // Установить USER-моду
Mov #4444, SP // Стек USER-моды
Mov #340, @#177776 // Установить KERNEL-моду
Mov #2222, SP // Стек KERNEL-моды
HALT // Установить HALT-моду
Wait
Next:
MFPI SP // Запись KSP в стек
Mov #30340, @#177776 // Установить PrevMode=USER
MFPI SP // Запись USP в стек
Nop
Wait
- - - Добавлено - - -
Новый тест: MFPI.SAV (http://emulator.pdp-11.org.ru/misc/MFPI.zip) - проверяет работу команды MFPI SP в режиме MMU16 для всех комбинаций текущей и предыдущей моды.
Запускать на машинах с диспетчером памяти. На эмулируемой ДВК-3 результат такой :
.RU MFPI
MFPI SP command test.
MOV #140340,@#177776
MOV #44444, SP
MOV #000340,@#177776
MOV #22222, SP
MFPI SP
022220/022222
MOV #030340,@#177776
MFPI SP
022216/044444
MOV #140340,@#177776
MFPI SP
022214/000000
044442/022216
MOV #170340,@#177776
MFPI SP
022212/000000
044440/044442
Program completed.
.
.RU MFPI
MFPI SP command test.
MOV #140340,@#177776
MOV #44444, SP
MOV #000340,@#177776
MOV #22222, SP
MFPI SP
022220/022222
MOV #030340,@#177776
MFPI SP
022216/044444
MOV #140340,@#177776
MFPI SP
022214/000000
044442/022216
MOV #170340,@#177776
MFPI SP
022212/000000
044440/044442
Program completed.
.
- - - Добавлено - - -
битом 13 в PSW
Инетерсно все варианты битов перебрать как в CM так и в PM на ВМ3 - какая реакция будет.
Инетерсно все варианты битов перебратьВ документации по ВМ3 написано, что моды определяются только битами 15 и 13, но если BIT_14 отличается от BIT_15, то при включённом MMU занесение такой комбинации вызовет TrapTo_250. Что будет, если в такой же ситуации только BIT_12 отличается от BIT_13 - неизвестно.
На эмулируемой ДВК-3 результат такой
Когда уже первая бета будет? :)
- - - Добавлено - - -
На ВМ3:
.RU MVPS
;PSW=170000, @#177776=123456
MFPS R1 ;R1=000056
MTPS #17 ;PSW=170001, @#177776=123417
.
Интересный результат получился. То есть получается, что бит C устанавливается в PSW всегда по MTPS, а потом команда уже выполняет байтовую запись по виртуальному 177776. Ну и читает опять таки с виртуального адреса (в данном случае 160000 отмаплен в физические 40000 для усер моды).
.
Новый тест: PSW1.SAV (http://emulator.pdp-11.org.ru/misc/PSW1.zip) - проверяет байтовую запись в PSW по адресу 177776.
Запускать на машинах с диспетчером памяти.
.RU PSW1
PSW test #1
MOV #177777,@#177776
177776/001346
MOV #177777,@#177776
CLRB @#177776
177776/177400
MOV #177777,@#177776
MOVB #000000,@#177777
177776/000350
Program completed.
.
- - - Добавлено - - -
Mov #177777, (R5)
ClrB (R5)
Mov (R5), $PSW
Честно говоря навскидку даже не скажу что получится из этого :)
MOV #177777,@#177776
177776/001346
Это на ВМ3 такой результат ?
Честно говоря навскидку даже не скажу что получится из этого
Вот что я имею в виду:
.TY TEST.MAC
.TITLE TEST
.MCALL .EXIT,.PRINT
START:: MOV #-2,R5
MOV R5,ARGS
MOV #-1,@R5
MOV R5,ARGS+2
CLR @#-2
MOV #BUFF,R0
MOV #FMTS,R1
MOV #ARGS,R2
CALL $EDMSG
.PRINT #BUFF
.EXIT
ARGS: .BLKW 2
BUFF: .BLKW 40.
FMTS: .ASCII /MOV #177776,R5 ;R5=%P%N/
.ASCIZ /MOV #177777,(R5) ;R5=%P/
.END START
.RU TEST
MOV #177776,R5 ;R5=177776
MOV #177777,(R5) ;R5=000004
.
- - - Добавлено - - -
Это на ВМ3 такой результат ?
На 11/83. Выше показал что в этом тесте вызывает сомнения :)
- - - Добавлено - - -
На ВМ3 такого не будет.
На ВМ3 такого не будет.Перезалил на вариант без R5.
.RU PSW1
PSW test #1
MOV #177777,@#177776
177776/174757
MOV #177777,@#177776
CLRB @#177776
177776/174400
MOV #177777,@#177776
MOVB #000000,@#177777
177776/000357
Program completed.
.
Надежнее просто не трогать 11 бит.
Тесты на ВМ3.
.MFPS
UISDR7=077506, PSW=140016, MFPS R0, R0=000016
UISDR7=077400, PSW=140016, MFPS R0, R0=000016, MMU FAULT
.MVPS
;PSW=170000, @#177776=123456
MFPS R1 ;R1=000056
MTPS #17 ;PSW=170001, @#177776=123417
.YT4A
Yellow Stack Trap test #1
SP/000400
CMP -(SP),-(SP)
>>> Trap to 004 <<<
SP/000374
SP/000400
CMP @-(SP),@-(SP)
>>> Trap to 004 <<<
SP/000374
Program completed.
.MFPI
MFPI SP command test.
MOV #140340,@#177776
MOV #44444, SP
MOV #000340,@#177776
MOV #22222, SP
MFPI SP
022220/022222
MOV #030340,@#177776
MFPI SP
022216/044444
MOV #140340,@#177776
MFPI SP
022214/000000
044442/022216
MOV #170340,@#177776
MFPI SP
022212/000000
044440/044442
Program completed.
.PSW1
PSW test #1
MOV #177777,@#177776
177776/170357
MOV #177777,@#177776
CLRB @#177776
177776/170000
MOV #177777,@#177776
MOVB #000000,@#177777
177776/000345
Program completed.
.
Новый тест: PSW2.SAV (http://emulator.pdp-11.org.ru/misc/PSW2.zip) - проверяет момент изменения PSW в командах с приёмником @#177776.
Запускать на машинах с диспетчером памяти. На эмулируемой ДВК-3 результат такой :
.RU PSW2
PSW test #2
CLR @#177776
INC @#177776
177776/000001
ROL @#177776
177776/000003
CLR @#177776
BIS #140000, @#177776
177776/140000
CLR @#177776
BISB #000300, @#177777
177776/140010
CLR @#177776
MOV #000000, @#160000
>>> Trap to 004 <<<
177776/000004
Program completed.
.
.RU PSW2
PSW test #2
CLR @#177776
INC @#177776
177776/000001
ROL @#177776
177776/000003
CLR @#177776
BIS #140000, @#177776
177776/140000
CLR @#177776
BISB #000300, @#177777
177776/140000
CLR @#177776
MOV #000000, @#160000
>>> Trap to 004 <<<
177776/000004
Program completed.
.
CLR @#177776
BISB #000300, @#177777
177776/140000
Похоже, что хотя MOVB на 11/83 использует цикл DATOB и поэтому при обращении к старшему байту PSW не затирает изменения признаков в младшем байте PSW - модифицирующие байтовые команды ( типа BISB ) используют цикл DATIO и поэтому признаки в младшем байте PSW копируются из "прошлой версии" содержимого PSW.
.TY TEST.MAC
.TITLE TEST
.MCALL .EXIT,.PRINT
.ASECT
.=14
.WORD BESST,0
.PSECT
START:: MOV #ARGS,R2
MOV #30000,@#-2
BPT
BISB #1,@#-2
BPT
MOV @#-2,(R2)+
BPT
MOV #BUFF,R0
MOV #FMTS,R1
MOV #ARGS,R2
CALL $EDMSG
.PRINT #BUFF
.EXIT
BESST:: MOV 2(SP),(R2)+
RTI
ARGS: .BLKW 4
BUFF: .BLKW 40
FMTS: .ASCII /MOV #030000,@#177776 ;PSW=%P%N/
.ASCII /BISB #1,@#177776 ;PSW=%P%N/
.ASCIZ /MOV @#177776,ARGS+4 ;PSW=%P:%P/
.END START
.RU TEST
MOV #030000,@#177776 ;PSW=030000
BISB #1,@#177776 ;PSW=030001
MOV @#177776,ARGS+4 ;PSW=030001:030001
.
TEST.MACТочно. При операции BISB с младшим байтом - в старшем байте PSW ничего "по волшебству" не меняется, поэтому цикл DATIO не портит PSW, но при операции BISB со старшим байтом PSW - установившиеся по итогам операции признаки в младшем байте PSW затираются в фазе записи цикла DATIO.
DATIO
В таблице различий есть "MOV использует только DATO в последнем цикле" (23, 24, 34, 03, 35, 45, 70, 60, J11).
Для 04, 05, 10, 15, 20 - DATIP и DATO
(написал как в доке, видимо имеется в виду DATIO поскольку DATIP - цикл PMI).
В таблице различий есть "MOV использует только DATO в последнем цикле"Интересует - есть ли разница в поведении MOVB и BISB при модификации старшего байта PSW.
Если MOVB использует DATOB - свежие признаки в младшем байте PSW должны "выжить", в то время как команда BISB #xxx,@#177777 - затирает свежие признаки в PSW старыми ( которые были в младшем байте PSW в фазе чтения цикла DATIO ).
Для проверки - можно выполнить на 11/83 что-то типа такого:
Вариант с MOVB :
Clr @#177776
MovB #300, @#177777
Mov @#177776, $PSW
Clr @#177776
То же самое с BISB :
Clr @#177776
BiSB #300, @#177777
Mov @#177776, $PSW
Clr @#177776
.EX TEST/LINK:SY:RSXLIB
CLR @#177776 ;PSW=000000
BISB #0,@#177777 ;PSW=000000
BISB #300,@#177777 ;PSW=140000
.
.EX TEST/LINK:SY:RSXLIB
CLR @#177776 ;PSW=000000
MOVB #0,@#177777 ;PSW=000000
MOVB #1,@#177777 ;PSW=140000
.
Получается, что или 11/83 всегда эмулирует байтовые циклы через словные, или что цикл DATIO используется байтовыми командами только при работе с PSW ( специально - чтобы случайно не повлиять на содержимое соседнего байта ).
- - - Добавлено - - -
Интересно - учтена ли такая особенность 11/83 в SIMH и E11 ..
Получается, что или 11/83 всегда эмулирует байтовые циклы через словные
Это врядли очень много железа перестало бы работать без переделки софта.
- - - Добавлено - - -
E11
E11>set cpu 83
E11>a 1000
001000 clr @#177776
001004 movb #0,@#177777
001012 movb #300,@#177777
001020 clr @#177776
001024 bisb #0,@#177777
001032 bisb #300,@#177777
001040 ^C
E11>pc=1000
E11>sp=1000
E11>s
R0/000000 R1/000000 R2/000000 R3/000000 CM=K PM=K PRIO=0
R4/000000 R5/000000 SP/001000 PC/001004 N=0 Z=0 V=0 C=0
001004 movb #000000,@#177777
E11>s
R0/000000 R1/000000 R2/000000 R3/000000 CM=K PM=K PRIO=0
R4/000000 R5/000000 SP/001000 PC/001012 N=0 Z=0 V=0 C=0
001012 movb #000300,@#177777
E11>s
R0/000000 R1/000000 R2/000000 R3/000000 CM=U PM=K PRIO=0
R4/000000 R5/000000 SP/000000 PC/001020 N=0 Z=0 V=0 C=0
001020 clr @#177776
E11>s
R0/000000 R1/000000 R2/000000 R3/000000 CM=K PM=K PRIO=0
R4/000000 R5/000000 SP/001000 PC/001024 N=0 Z=0 V=0 C=0
001024 bisb #000000,@#177777
E11>s
R0/000000 R1/000000 R2/000000 R3/000000 CM=K PM=K PRIO=0
R4/000000 R5/000000 SP/001000 PC/001032 N=0 Z=0 V=0 C=0
001032 bisb #000300,@#177777
E11>s
R0/000000 R1/000000 R2/000000 R3/000000 CM=U PM=K PRIO=0
R4/000000 R5/000000 SP/000000 PC/001040 N=0 Z=0 V=0 C=0
001040 halt
E11>
Надеюсь, что реальный ВМ3 так не мудрит, ведь иначе придётся при эмуляции всех циклов с записью байта - вылавливать обращение к физическим адресам PSW и устанавливать флаг запрета модификации признаков.
Надеюсь, что реальный ВМ3 так не мудрит
Попросил выполнить PSW2. Ждем.
- - - Добавлено - - -
ВМ3:
RU HX1:PSW2
PSW test #2
vvvfж
INC @#177776
177776/000001
ROL @#177776
177776/000003
CLR @#177776
BIS #140000, @#177776
177776/140000
CLR @#177776
BISB #000300, @#177777
177776/140010
CLR @#177776
MOV #000000, @#160000
>>> Trap to 004 <<<
177776/000000
Program completed.
.
.
Новый тест: PSW3.SAV (http://emulator.pdp-11.org.ru/misc/PSW3.zip) - проверяет мапинг PSW в команде MTPS и во время сохранения PSW при входе в прерывание.
Запускать на машинах с диспетчером памяти. На эмулируемой ДВК-3 ( где сохранение PSW при входе в прерывание пока не мапится через 177776 ) результат такой :
.RU PSW3
PSW test #3
MOV #177400, @#177656
MOV #140340, @#177776
MTPS #000
>>> Trap to 004 <<<
177776/140351
MOV #000340, @#177776
MOV #140340, @#000022
IOT
177776/140350
Program completed.
.
.RU PSW3
PSW test #3
MOV #177400, @#177656
MOV #140340, @#177776
MTPS #000
002036
@
Висит. Останов с пульта.
- - - Добавлено - - -
Хинт: когда делаются тесты с включением MMU можно обойтись без сохранения-восстановления векторов :)
- - - Добавлено - - -
Mov @#057776, $PSW
Clr @#057776
Reset
RESET здесь эффективный NOP. Еще не нашел в коде выключения MMU обратно и восстановления маппинга. Хотя нет - про ресет погорячился.
- - - Добавлено - - -
Вобщем как раз в RESETе все дело видимо - MSCP контроллер после его выполнения становится неработоспособным до настройки.
UPD: не, видимо до него дело просто не доходит...
Висит. Останов с пульта.Обработчик TrapTo_4 вызывает подпрограмму, обращающуюся к странице I/O - и обращение вызывает новый TrapTo_4.
Но в векторе 06 записано 0340 - разве в обработчике страница I/O не должна мапиться куда надо..
- - - Добавлено - - -
Вобщем как раз в RESETе все дело видимоВсе предыдущие тесты тоже сбрасывают MMU через RESET.
Все предыдущие тесты тоже сбрасывают MMU через RESET.
Уже вижу что не в том дело - просто даже не доходит до этого места.
- - - Добавлено - - -
Вобщем работает если там где MTPS #0 возникает трап. У меня он не возникает. Воткнул туда HALT для трапа - все заработало...
- - - Добавлено - - -
MTPS #0
HALT
1$:
Mov $PSW, R1
.RU P3
PSW test #3
MOV #177400, @#177656
MOV #140340, @#177776
MTPS #000
>>> Trap to 004 <<<
177776/140340
MOV #000340, @#177776
MOV #140340, @#000022
IOT
177776/140350
Program completed.
.
- - - Добавлено - - -
HALT для трапа
Попутно, на 11/34 (на всех без CPUERR регистра?) HALT трапается по 10 - интересно будет на ВМ3 проверить.
Перезалил исправленную версию: PSW3.SAV (http://emulator.pdp-11.org.ru/misc/PSW3.zip).
.RU D10:PSW3
PSW test #3
MOV #177400, @#177656
MOV #140340, @#177776
MTPS #000
177776/140340
MOV #000340, @#177776
MOV #140340, @#000022
IOT
177776/140350
Program completed.
.
- - - Добавлено - - -
.RU PSW3
PSW test #3
MOV #177400, @#177656
MOV #140340, @#177776
MTPS #000
>>> Trap to 004 <<<
177776/140351
MOV #000340, @#177776
MOV #140340, @#000022
IOT
177776/140350
Program completed.
.
На ВМ3 тот же тест:
.
.RU HX1:PSW3
PSW test #3
Чс56vvFфvfVfж
MOV #140340, @#177776
MTPS #000
>>> Trap to 004 <<<
177776/140345
MOV #000340, @#177776
MOV #140340, @#000022
#177776/140350
Program completed.
.
- - - Добавлено - - -
Походу часть текста съелась. Издержки HX видимо.
MTPS #000
>>> Trap to 004 <<<
177776/140345Значит - признаки устанавливаются по аргументу MTPS, а не по записываемому в PSW значению.
Тесты на ВМ3.
.PSW2
PSW test #2
CLR @#177776
INC @#177776
177776/000001
ROL @#177776
177776/000003
CLR @#177776
BIS #140000, @#177776
177776/140000
CLR @#177776
BISB #000300, @#177777
177776/140010
CLR @#177776
MOV #000000, @#160000
>>> Trap to 004 <<<
177776/000000
Program completed.
.PSW3
PSW test #3
MOV #177400, @#177656
MOV #140340, @#177776
MTPS #000
>>> Trap to 004 <<<
177776/140345
MOV #000340, @#177776
MOV #140340, @#000022
IOT
177776/140350
Program completed.
Значит - признаки устанавливаются по аргументу MTPS, а не по записываемому в PSW значению.
Ну это мы вроде уже выяснили.
- - - Добавлено - - -
Небольшой тестик (http://pdp-11.org.ru/~form/files/pdp-11/mmu/mmu.sav) MMU. Можно запускать под любым монитором.
Интересно бы посмотреть на ВМ3 и СМ1420 (а также на прошниках/Э85 [требуется подключение терминала к принтерному порту в maintenance mode]).
.RU MMU
MMU FEATURES: 22-BIT, SUPERVISOR MODE, CSM INSTRUCTION, DATA SPACE
MOV #-1,@#MMR0 ;MMR0 = 160017
CLR @#MMR0 ;MMR0 = 000016
MOV #-1,@#MMR3 ;MMR3 = 000077
CLR @#MMR3 ;MMR3 = 000000
MOV #-1,@#KISAR0 ;KISAR0 = 177777
CLR @#KISAR0 ;KISAR0 = 000000
MOV #-1,@#KISDR0 ;KISDR0 = 177416
CLR @#KISDR0 ;KISDR0 = 000000
BIS #140000,@#PSW ;SET USER MODE
HALT ;TRAP TO 4
MOV #77404,@#UISDR1 ;ACF=10
TST @#20000 ;
*** MMU FAULT AT 002212, MMR0=100143, MMR1=000000, MMR2=002206 ***
CLR @#20000 ;
*** MMU FAULT AT 002242, MMR0=100143, MMR1=000000, MMR2=002236 ***
.
.RU MMU
MMU FEATURES: 18-BIT
MOV #-1,@#MMR0 ;MMR0 = 160157
CLR @#MMR0 ;MMR0 = 000000
MOV #-1,@#KISAR0 ;KISAR0 = 177777
CLR @#KISAR0 ;KISAR0 = 000000
MOV #-1,@#KISDR0 ;KISDR0 = 077416
CLR @#KISDR0 ;KISDR0 = 000000
BIS #140000,@#PSW ;SET USER MODE
HALT ;TRAP TO 10
MOV #77404,@#UISDR1 ;ACF=10
TST @#20000 ;
*** MMU FAULT AT 002212, MMR0=100143, MMR1=000000, MMR2=002206 ***
CLR @#20000 ;
*** MMU FAULT AT 002242, MMR0=100143, MMR1=000000, MMR2=002236 ***
.
.RU MMU
MMU FEATURES: 18-BIT, SUPERVISOR MODE, DATA SPACE
MOV #-1,@#MMR0 ;MMR0 = 171177
CLR @#MMR0 ;MMR0 = 000000
MOV #-1,@#MMR3 ;MMR3 = 000007
CLR @#MMR3 ;MMR3 = 000000
MOV #-1,@#KISAR0 ;KISAR0 = 177777
CLR @#KISAR0 ;KISAR0 = 000000
MOV #-1,@#KISDR0 ;KISDR0 = 077417
CLR @#KISDR0 ;KISDR0 = 000000
BIS #140000,@#PSW ;SET USER MODE
HALT ;TRAP TO 4
MOV #77404,@#UISDR1 ;ACF=10
TST @#20000 ;
CLR @#20000 ;
.
- - - Добавлено - - -
Ктати к вопросу об ACF из 3 бит - 11/45 и 11/70 их поддерживают (на тесте в E11 видно, что бит 0 регистра можно менять). В общем случае принцип остается тот же, но реакция на резервные комбинации может быть другой.
- - - Добавлено - - -
Ище маленький тест...
.RU TEST
TSTSET @#177776 ;PSW=140010, R0=140000
WRTLCK @#177776 ;PSW=140000
SEC ;
TSTSET @#177776 ;PSW=140011, R0=140011
.
.
Новый тест: PSW4.SAV (http://emulator.pdp-11.org.ru/misc/PSW4.zip) - проверяет реакцию включённого MMU на попадание в PSW неправильных комбинаций битов моды.
Запускать на машинах с диспетчером памяти. На эмулируемой ДВК-3 результат такой :
.RU PSW4
PSW test #4
MOV #000001, @#177572
MOV #100340, @#177776
>>> Trap to 250 <<<
MOV #040340, @#177776
>>> Trap to 250 <<<
MOV #020340, @#177776
MOV #010340, @#177776
MOV #100340, @#000022
IOT
>>> Trap to 250 <<<
MOV #100340, 2(SP)
RTI
>>> Trap to 250 <<<
Program completed.
.
.RU PSW4
PSW test #4
MOV #000001, @#177572
MOV #100340, @#177776
>>> Trap to 250 <<<
MOV #040340, @#177776
>>> Trap to 250 <<<
MOV #020340, @#177776
MOV #010340, @#177776
MOV #100340, @#000022
IOT
>>> Trap to 250 <<<
MOV #100340, 2(SP)
RTI
>>> Trap to 250 <<<
Program completed.
.
- - - Добавлено - - -
IOT
А зачем IOT, к слову?
- - - Добавлено - - -
MOV #040340, @#177776
>>> Trap to 250 <<<
Я так понимаю, что тест недописан - это правильный режим, но видимо в силу ненастроенности PAR/PDR трап.
- - - Добавлено - - -
MOV #020340, @#177776
MOV #010340, @#177776
А тут надо проверять командами MxPI...
.
Перезалил новую версию теста: PSW4.SAV (http://emulator.pdp-11.org.ru/misc/PSW4.zip) - теперь до и после IOT и RTI выводится значение SP :
.RU PSW4
PSW test #4
MOV #000001, @#177572
MOV #100340, @#177776
>>> Trap to 250 <<<
MOV #040340, @#177776
>>> Trap to 250 <<<
MOV #020340, @#177776
MOV #010340, @#177776
MOV #100340, @#000022
IOT ; SP/001000
>>> Trap to 250 <<< ; SP/001000
MOV #100340, 2(SP)
RTI ; SP/001000
>>> Trap to 250 <<< ; SP/001000
Program completed.
.
.VDT
VDT V05.07
*172240/000000 0
172242 /177737 200
172244 /177737 400
172246 /177737 600
172250 /177776 1000
172252 /173026 1200
172254 /173052 1400
172256 /173546 177600
*172200/000000 77406
172202 /000000 77406
172204 /000000 77406
172206 /000000 77406
172210 /000000 77406
172212 /000000 77406
172214 /000000 77406
172216 /000000 77406
*^C
.RU PSW4
PSW test #4
MOV #000001, @#177572
MOV #100340, @#177776
>>> Trap to 250 <<<
MOV #040340, @#177776
MOV #020340, @#177776
MOV #010340, @#177776
MOV #100340, @#000022
IOT
>>> Trap to 250 <<<
MOV #100340, 2(SP)
RTI
>>> Trap to 250 <<<
Program completed.
.
- - - Добавлено - - -
теперь до и после IOT и RTI выводится значение SP
.RU D10:PSW4
PSW test #4
MOV #000001, @#177572
MOV #100340, @#177776
>>> Trap to 250 <<<
MOV #040340, @#177776
MOV #020340, @#177776
MOV #010340, @#177776
MOV #100340, @#000022
IOT ; SP/001000
>>> Trap to 250 <<< ; SP/001000
MOV #100340, 2(SP)
RTI ; SP/001000
>>> Trap to 250 <<< ; SP/001000
Program completed.
.
.
Новый тест: PSW5.SAV (http://emulator.pdp-11.org.ru/misc/PSW5.zip) - выводит содержимое SR0 и SR2 после прерывания при неправильных комбинациях битов моды.
Запускать на машинах с диспетчером памяти.
На ВМ3:
.MMU
MMU FEATURES: 22-BIT
MOV #-1,@#MMR0 ;MMR0 = 160401
CLR @#MMR0 ;MMR0 = 000000
MOV #-1,@#MMR3 ;MMR3 = 177777
CLR @#MMR3 ;MMR3 = 177717
MOV #-1,@#KISAR0 ;KISAR0 = 007777
CLR @#KISAR0 ;KISAR0 = 000000
MOV #-1,@#KISDR0 ;KISDR0 = 077416
CLR @#KISDR0 ;KISDR0 = 000000
BIS #140000,@#PSW ;SET USER MODE
HALT ;TRAP TO 10
MOV #123456,@#20000 ;
MFPD @#20000 ;
MOV (SP)+,R0 ;R0=123456
MOV #77404,@#UISDR1 ;ACF=10
TST @#20000 ;
*** MMU FAULT AT 002312, MMR0=100143, MMR1=000000, MMR2=002306 ***
CLR @#20000 ;
*** MMU FAULT AT 002342, MMR0=100143, MMR1=000000, MMR2=002336 ***
.
- - - Добавлено - - -
На 11/83:
.RU PSW5
PSW test #5
001150/ MOV #100340, @#177776
001156/ MOV #000001, @#177572
001164/ NOP
>>> Trap to 250 <<< ; SR0/140101 ; SR2/001164
001224/ MOV #000001, @#177572
001232/ MOV #100340, @#177776
001240/ NOP
>>> Trap to 250 <<< ; SR0/140101 ; SR2/001240
001300/ MOV #000001, @#177572
001306/ MOV #020340, @#177776
001314/ MFPI (PC)
>>> Trap to 250 <<< ; SR0/140101 ; SR2/001314
Program completed.
.
На ВМ3:
MOV #-1,@#KISAR0 ;KISAR0 = 007777Это потому что обнулён флаг режима 22 бит.
Можно добавить в тест запись -1 в PAR как в режиме 18 бит, так и в режиме 22 бит.
MOV #-1,@#KISAR0 ;KISAR0 = 007777
А вот это интересный результат. Похоже пока 22 битный режим не включишь PARы не воспринимают значения за пределами 18 бит на ВМ3...
А вот это интересный результат. Похоже пока 22 битный режим не включишь PARы не воспринимают значения за пределами 18 бит на ВМ3...Такова сила эмуляции PDP-11/34.
Ещё можно проверить, обнуляются ли старшие биты в PAR при переходе в режим 18 бит - или только скрываются, а при возврате в режим 22 бита опять становятся видны.
Такова сила эмуляции PDP-11/34.
Ещё можно проверить, обнуляются ли старшие биты в PAR при переходе в режим 18 бит - или только скрываются, а при возврате в режим 22 бита опять становятся видны.
Попытка проверить с пульта провалилась: пишется-читается все.
- - - Добавлено - - -
Проверил, если установить 22-бит режим - прога читает полный регистр. Но кроме всего прочего получается вот такая штука...
@17777572/000016 0
@/000016
@17772516/177717 0
@
@
@1000/012737
00001002/177777
00001004/172340
00001006/013737 0
00001010/172340 13737
00001012/010000 172340
00001014/000000 10000
00001016/003214 0
00001020/104351
@1000G
@ 001010
@17772340/177777
@10000/007777 0
@P
@ 001020
@10000/007777
@
получается вот такая штукаТипа, в режимах HALT, MMU16 и MMU22 - доступны все биты PAR, а в режиме MMU18 - старшие биты PAR изолированы от шины.
а в режиме MMU18 - старшие биты PAR изолированы от шины
Я в MMU16 сейчас тестил - тоже читает младшие.
- - - Добавлено - - -
На эмулируемой ДВК-3
Эмулятор-то как-нибудь можно пощупать для ускорения процесса тестирования? :)
Эмулятор-то как-нибудь можно пощупать для ускорения процесса тестирования?Там щупать пока нечего.
ВМ3:
.TY PAR.MAC
.TITLE PAR
.MCALL .EXIT,.PRINT
START:: CLR @#177572
CLR @#172516
MOV #177777,@#172340
MOV @#172340,ARGS
BIS #20,@#172516
MOV @#172340,ARGS+2
MOV #177777,@#172340
MOV @#172340,ARGS+4
BIC #20,@#172516
MOV @#172340,ARGS+6
MOV #BUFF,R0
MOV #FMTS,R1
MOV #ARGS,R2
CALL $EDMSG
.PRINT #BUFF
.EXIT
ARGS: .BLKW 4
BUFF: .BLKB 80.
FMTS: .ASCIZ /%4P/
.END START
.RU HX1:PAR
007777 177777 177777 007777
.
PAR.MACЕсть смысл ещё проверить, пишутся ли старшие биты в 18-битном режиме :
BIS #20,@#172516
CLR @#172340
BIC #20,@#172516
MOV #177777,@#172340
MOV @#172340,ARGS+4
BIS #20,@#172516
MOV @#172340,ARGS+6
Есть смысл ещё проверить, пишутся ли старшие биты в 18-битном режиме
Так проверено - пишутся. Сначала пишется в 18 (первая цифра), потом включается 22 и ничего не пишется (2 цифра), потом снова пишется (третья) и выключается 22 (4 цифра).
То есть при выключенной 22-битной адресации только чтение ограничивается.
при выключенной 22-битной адресации только чтение ограничиваетсяЭто заставляет иначе взглянуть на начальные значения PAR (http://zx-pk.ru/showthread.php?t=18184&p=853562&viewfull=1#post853562).
начальные значения PAR
Касаемо начальных значений MMU.
Про KDJ11-B написано, что при включении значение PARов неопределено, не сбрасывается ни по ресету ни по консольному старту. Если включиться с выпаданием в пульт там 177777 у меня. На ВМ3 довелось посмотреть только после включения и загрузки SJ (VM нету) - содержимое напоминало код программы, но сильно не приглядывался.
Тесты на ВМ3
.MMU
MMU FEATURES: 22-BIT
MOV #-1,@#MMR0 ;MMR0 = 160401
CLR @#MMR0 ;MMR0 = 000000
MOV #-1,@#MMR3 ;MMR3 = 177777
CLR @#MMR3 ;MMR3 = 177717
MOV #-1,@#KISAR0 ;KISAR0 = 007777
CLR @#KISAR0 ;KISAR0 = 000000
MOV #-1,@#KISDR0 ;KISDR0 = 077416
CLR @#KISDR0 ;KISDR0 = 000000
BIS #140000,@#PSW ;SET USER MODE
HALT ;TRAP TO 10
MOV #123456,@#20000 ;
MFPD @#20000 ;
MOV (SP)+,R0 ;R0=123456
MOV #77404,@#UISDR1 ;ACF=10
TST @#20000 ;
*** MMU FAULT AT 002312, MMR0=100143, MMR1=000000, MMR2=002306 ***
CLR @#20000 ;
*** MMU FAULT AT 002342, MMR0=100143, MMR1=000000, MMR2=002336 ***
.PSW4
PSW test #4
MOV #000001, @#177572
MOV #100340, @#177776
>>> Trap to 250 <<<
MOV #040340, @#177776
>>> Trap to 250 <<<
MOV #020340, @#177776
MOV #010340, @#177776
MOV #100340, @#000022
IOT ; SP/001000
>>> Trap to 250 <<< ; SP/001000
MOV #100340, 2(SP)
RTI ; SP/001000
>>> Trap to 250 <<< ; SP/001000
Program completed.
.PSW5
PSW test #5
001150/ MOV #100340, @#177776
001156/ MOV #000001, @#177572
001164/ NOP
>>> Trap to 250 <<< ; SR0/100101 ; SR2/001156
001224/ MOV #000001, @#177572
001232/ MOV #100340, @#177776
001240/ NOP
>>> Trap to 250 <<< ; SR0/100101 ; SR2/001232
001300/ MOV #000001, @#177572
001306/ MOV #020340, @#177776
001314/ MFPI (PC)
>>> Trap to 250 <<< ; SR0/100101 ; SR2/001314
Program completed.
.
Новая версия теста: PSW4.SAV (http://emulator.pdp-11.org.ru/misc/PSW4.zip) - выводит значения USP и KSP.
Запускать на машинах с диспетчером памяти. На эмулируемой ДВК-3 результат такой :
.RU PSW4
PSW test #4a
MOV #000001, @#177572
MOV #100340, @#177776
>>> Trap to 250 <<<
MOV #040340, @#177776
>>> Trap to 250 <<<
MOV #020340, @#177776
MOV #010340, @#177776
MOV #100340, @#000022
IOT ; USP/010000 ; KSP/001000
>>> Trap to 250 <<< ; USP/007774 ; KSP/001000
MOV #100340, 2(SP)
RTI ; USP/007774 ; KSP/000774
>>> Trap to 250 <<< ; USP/007774 ; KSP/001000
Program completed.
.
выводит значения USP и KSP
.RU PSW4
PSW test #4a
MOV #000001, @#177572
MOV #100340, @#177776
>>> Trap to 250 <<<
MOV #040340, @#177776
MOV #020340, @#177776
MOV #010340, @#177776
MOV #100340, @#000022
IOT ; USP/010000 ; KSP/001000
>>> Trap to 250 <<< ; USP/010000 ; KSP/001000
MOV #100340, 2(SP)
RTI ; USP/010000 ; KSP/000774
>>> Trap to 250 <<< ; USP/010000 ; KSP/001000
Program completed.
.
- - - Добавлено - - -
ВМ3:
.RU HX1:PSW4
PSW test #4a
MOV #000001, @#177572
MOV #100340, @#177776
>>> Trap to 250 <<<
MOV #040340, @#177776
>>> Trap to 250 <<<
MOV #020340, @#177776
MOV #010340, @#177776
MOV #100340, @#000022
IOT ; USP/010000 ; KSP/001000
>>> Trap to 250 <<< ; USP/007776 ; KSP/001000
MOV #100340, 2(SP)
RTI ; USP/007776 ; KSP/000774
>>> Trap to 250 <<< ; USP/007776 ; KSP/001000
Program completed.
.
- - - Добавлено - - -
IOT ; USP/010000 ; KSP/001000
>>> Trap to 250 <<< ; USP/010000 ; KSP/001000
Тут как бы все логично: IOT не меняет SP (какой менять?)
IOT ; USP/010000 ; KSP/001000
>>> Trap to 250 <<< ; USP/007776 ; KSP/001000
А тут получается за неимением вариантов пытается запихать в USP, а потом спохватывается и посреди процесса вылетает? Или USP выбирается по одному старшему биту, а попытка записать PC (причем декремент сохраняется) вызывает MP SST - нет PAR/PDR... Надо еще наверное @xSP выводить
А тут получается за неимением вариантов пытается запихать в USP, а потом спохватывается и посреди процесса вылетает?В 1801ВМ3 мода выбирается только одним битом, но если соседний отличается - при мапинге происходит аборт.
Надо будет проверить, происходит ли у ВМ3 аборт при обращении к неправильной моде без мапинга :
Mov #020000, @#177776
MFPI R0
MFPI SP
В 1801ВМ3 мода выбирается только одним битом, но если соседний отличается - при мапинге происходит аборт.
Похоже второе мое предположение верно: SP выбирается по одному биту, делается запись в него и вызывает аборт - нет соответствующих PAR/PDR, но декремент сохраняется (хотя с MP STT наверное всегда так - не случайно в MMR1 возвращаются значения регистров и оффсетов для отката).
- - - Добавлено - - -
ВМ3 аборт при обращении к неправильной моде без мапинга
Похоже он и есть всегда без мапинга. То есть SP выбирается старшим битом, а пары PAR/PDR нету.
Новая версия теста
Результаты теста на ВМ3 аналогичны как у form.
Надо будет проверить
ДВК на той стороне ушла в неконтролируемый полет - пока пнуть ее некому...
ДВК на той стороне ушла в неконтролируемый полет - пока пнуть ее некому...
Ну так отправь команду 000005 или 000000.
Ну так отправь команду 000005 или 000000.
Кому? Работающей и зависшей в Казахстане ДВК? :)
- - - Добавлено - - -
11/83:
.RU TEST
BIS #20000,@#177776 ;PSW=160000
MFPI R0 ;R0=001110, @SP=001110
MFPI SP ;@SP=001000
BIC #20000,@#177776 ;
MFPI SP ;@SP=157010
.
.
Новый тест: PSW6.SAV (http://emulator.pdp-11.org.ru/misc/PSW6.zip) - проверяет обращение к неправильной моде без мапинга.
Запускать на машинах с диспетчером памяти. На эмулируемой ДВК-3 результат такой :
.RU PSW6
PSW test #6
001150/ MOV #000001, @#177572
001156/ MOV #020340, @#177776
001164/ MFPI R0
001224/ MOV #000001, @#177572
001232/ MOV #020340, @#177776
001240/ MFPI SP
001300/ MOV #000001, @#177572
001306/ MOV #020340, @#177776
001314/ MFPI (SP)
>>> Trap to 250 <<< ; SR0/100101 ; SR2/001314
Program completed.
.
.RU PSW6
PSW test #6
001150/ MOV #000001, @#177572
001156/ MOV #020340, @#177776
001164/ MFPI R0
001224/ MOV #000001, @#177572
001232/ MOV #020340, @#177776
001240/ MFPI SP
001300/ MOV #000001, @#177572
001306/ MOV #020340, @#177776
001314/ MFPI (SP)
>>> Trap to 250 <<< ; SR0/140101 ; SR2/001314
Program completed.
.
- - - Добавлено - - -
MFPI (SP)
Это @SP где SP от CM, а @ от PM...
Кому? Работающей и зависшей в Казахстане ДВК?
Да. ДВК/PDP не умеют зависать, они только трапятся. Единственная "ловушка" это команда WAIT. Из неё выход только по командам RTI/RTT.
...
Тест на ВМ3
PSW test #6
001150/ MOV #000001, @#177572
001156/ MOV #020340, @#177776
001164/ MFPI R0
001224/ MOV #000001, @#177572
001232/ MOV #020340, @#177776
001240/ MFPI SP
001300/ MOV #000001, @#177572
001306/ MOV #020340, @#177776
001314/ MFPI (SP)
>>> Trap to 250 <<< ; SR0/100101 ; SR2/001314
Program completed.
ДВК/PDP не умеют зависать
Неправда. У большинства PDP-11 есть такое понятие как sunset loop - состояние из которого нельзя выйти никак кроме останова с консоли. К примеру в @#16 установлен бит T, в @#242 прописан приоритет ниже чем запрашивается в @#17777772 итд...
У ДВК - да - чаще выпадание в пульт.
Единственная "ловушка" это команда WAIT. Из неё выход только по командам RTI/RTT.
Неверны оба утверждения. На сей раз и для ДВК. Выход из WAIT - только прерывание (ну это как бы очевидно), RTI - косвено и необязательно. А завесить легко другим способом - например записать в PSW 340 и наступить на код 777...
- - - Добавлено - - -
sunset loop
Или ближе к рассматриваемое сейчас теме: @#250/252 ссылается на неотмапленную страницу...
- - - Добавлено - - -
У большинства PDP-11
Чтобы не говорить только о PDP-11, назовем также абсолютно все СМ (те что PDP-11) и Э100/25...
Неправда. У большинства PDP-11 есть такое понятие как sunset loop - состояние из которого нельзя выйти никак кроме останова с консоли. К примеру в @#16 установлен бит T, в @#242 прописан приоритет ниже чем запрашивается в @#17777772 итд...
У ДВК - да - чаще выпадание в пульт.
Про PDP Вам виднее. Останов с консоли что подразумевается?
Выход из WAIT - только прерывание
Ну так если прерывание не приходит, значит будет ждать его вечно.
Про PDP Вам виднее. Останов с консоли что подразумевается?
Перкключателем ENABLE/HALT пульта или BREAK с консольного терминала для Q-Bus машин где такая возможность есть. Как уже написал, речь также о советских машинах...
Ну так если прерывание не приходит, значит будет ждать его вечно.
Именно так. Соответственно если приоритет процессора в 7 установлен (или просто установлен для ВМ2 к примеру), то WAIT ли там, бесконечный цикл ли, а выйти нельзя никак кроме останова машины... Или более прозаично: @#14 ссылается на команду RTI которая устанавливает бит T программе куда возвращается и даже приоритета 7 не нужно (подразумеваем что @#16 выставляет приоритет)...
- - - Добавлено - - -
000005
И на закуску способ завесить например из под SJ/SB/FB монитора (с оговорками): RESET, BR . :)
Всего же вариантов огромное количество - далеко не десятки...
.
Новый тест: T4REG4.SAV (http://emulator.pdp-11.org.ru/misc/T4REG4.zip) - проверяет автоинкремент регистра при зависании второго чтения косвенной адресации.
Запускать можно на любых машинах. На эмулируемой ДВК-3 результат такой :
.RU T4REG4
Register Autoincrement TRAP4 test #4.
MOV #000000, R2
MOV #160020,(R2)
TST @(R2)+
>>> Trap to 004 <<< ; R2/000002
Program completed.
.
проверяет автоинкремент регистра при зависании второго чтения косвенной адресации
Register Autoincrement TRAP4 test #4.
MOV #000000, R2
MOV #160020,(R2)
TST @(R2)+
>>> Trap to 004 <<< ; R2/000002
Program completed.
.
На эмулируемой ДВК-3 результат такой
Аналогично.
автоинкремент регистра при зависании
/44, /04, /34 по описанию не меняют регистр, правда написано только про mode 2.
/44, /04, /34 по описанию не меняют регистр, правда написано только про mode 2.ВМ3 по mode 2 тоже не меняет - вот и захотелось проверить mode 3.
ВМ3 по mode 2 тоже не меняет
Ну логично - видимо раз сама по себе выборка с автоинкрементом проблем не представляет, то и вопроса нет, но мало ли - с учетом того же ВМ3 я алгоритм проверки дополнительных фич MMU делал исходя из возможности поменять значение бита, а не из возможности установить его в MMR3...
- - - Добавлено - - -
Но кое-где mode 3 всеже может представлять сложность... Хотя и тут все логично ибо от mode 2 танцует...
Z 1 000000 010030 MOV R0,@(R0)+
T4REG5
Хм. Я где-то упустил этот тест, в теме не вижу...
- - - Добавлено - - -
Я где-то упустил этот тест
Но пока подтверждает предположение о том, что видимо при MMU failure всегда автоинк(дек)ремент выполняется. Иначе зачем огород с MMR1 городить... Хотя впрочем функционал MMR1 не исключает совместимости в случае если автоинк(дек)ремента не произошло...
UPD: расмотрел внимательнее - и так и так... Выходной инфы мало - нужен MMR1
Хм. Я где-то упустил этот тест, в теме не вижу...Там SP мапился неизвестно куда - пришлось тест удалить и начать дорабатывать.
и начать дорабатывать.
Ну как минимум вывод MMR1 полезен будет.
.
Новый тест: T4REG5.SAV (http://emulator.pdp-11.org.ru/misc/T4REG5.zip) - проверяет автоинкремент регистров в команде MTPI (R2)+ с неправильной предыдущей модой.
Запускать на машинах с диспетчером памяти.
.RU T4REG5
Register Autoincrement TRAP4 test #5.
MOV #000001, @#177572
MOV #020340, @#177776
MOV #000000, R2
MOV #066000, SP
CLR -(SP)
SP/065776
MTPI (R2)+
>>> Trap to 250 <<< ; SR0/100101
R2/000002
SP/066000
Program completed.
.
- - - Добавлено - - -
Добавил HALT чтобы посмотреть MMR1 - там как и положено 11026 (R2+=2, SP+=2).
Тест на ВМ3.
.T4REG5
Register Autoincrement TRAP4 test #5.
MOV #000001, @#177572
MOV #020340, @#177776
MOV #000000, R2
MOV #066000, SP
CLR -(SP)
SP/065776
MTPI (R2)+
>>> Trap to 250 <<< ; SR0/100101
R2/000000
SP/066000
Program completed.
.
Тест на ВМ3
Вот тут интресно вставить
New250:
HALT
и посмотреть содержимое 17777574. По идее должно быть либо 26 либо 1026...
Вот тут интресно вставить
Тест в студию.
По идее должно быть либо 26 либо 1026...
У меня 26 получается если заменить (R2)+ на (R2).
- - - Добавлено - - -
Тест в студию.
Ждем тестов с выводом MMR1 :)
Ну или как я написал сделать и вручную посмотреть.
- - - Добавлено - - -
Ждем тестов с выводом MMR1
И MMR2 до кучи (и адреса команды которая трапнулась)... А то было там среди списка глюков ВМ3 что-то по теме. На моем MMU тесте вроде не вылезало пока ни у кого.
и посмотреть содержимое 17777574. По идее должно быть либо 26 либо 1026...У ВМ3 регистр SR1 всегда читается нулями.
У ВМ3 регистр SR1 всегда читается нулями.
Всегда или когда нет операций автоинк(дек)рементных?
- - - Добавлено - - -
Если он всегда читается нулями, то глюка с MMR2 в принципе быть не может ибо значение его эффективно становится бесполезным... Равно как и MMR0 впрочем (кроме управляющих битов).
Всегда или когда нет операций автоинк(дек)рементных?Он не реализован - всегда читаются нули.
Он не реализован - всегда читаются нули.
Ну в тестах (коли они претендуют на универсальность) всеже стоит выводить...
Если не реализован - это по сути убивает базовый функционал MMU (который сам DEC впрочем даже в Ultrix наверное не использовал [про Ultrix - предположение]).
- - - Добавлено - - -
Посмотрел на ВМ3 - да, MMR1 просто нули. Тогда ошибка с MMR2 чисто символическая получается (впрочем с ней [как и со всеми остальными кроме битов в MMR3] пока столкнуться не удалось).
.
Новый тест: SR0.SAV (http://emulator.pdp-11.org.ru/misc/SR0.zip) - проверяет текущие значения SR0 и SR2 при выключенном и включённом MMU.
Запускать на машинах с диспетчером памяти.
проверяет текущие значения SR0 и SR2 при выключенном и включённом MMU
.RU SR0
Live SR0 & SR2 test.
MOV #0177572, R2
MOV #0177576, R4
CLR (R2)
010000/ MOV (R2), R3 ; R3/000000
010002/ MOV (R4), R5 ; R5/010002
MOV #1,(R2)
010000/ MOV (R2), R3 ; R3/000017
010002/ MOV (R4), R5 ; R5/010002
Program completed.
.BO RT11ZM
RT-11ZM (S) V05.07
?ETM-I-Date & time - 6-FEB-2016 23:58:34
?ETM-I-Time server - 70-71-BC-50-EB-D0, OpenBSD 5.8 amd64
.RU D10:SR0
Live SR0 & SR2 test.
MOV #0177572, R2
MOV #0177576, R4
CLR (R2)
010000/ MOV (R2), R3 ; R3/000000
010002/ MOV (R4), R5 ; R5/010002
MOV #1,(R2)
010000/ MOV (R2), R3 ; R3/000017
010002/ MOV (R4), R5 ; R5/010002
Program completed.
020524
@
- - - Добавлено - - -
Еще мысль для теста на закуску:
тот же тест что что выше, только вместо #1 записать что-нибудь вроде #100001
- - - Добавлено - - -
что-нибудь вроде #100001
Собственно вот на примере того же теста на 11/83:
.RU SR0
Live SR0 & SR2 test.
MOV #0177572, R2
MOV #0177576, R4
CLR (R2)
010000/ MOV (R2), R3 ; R3/000016
010002/ MOV (R4), R5 ; R5/010002
MOV #100001,(R2)
010000/ MOV (R2), R3 ; R3/100017
010002/ MOV (R4), R5 ; R5/001402
Program completed.
.
Интересно, можно ли при выключенном MMU увидеть в SR0 что-то кроме нуля ..
- - - Добавлено - - -
И кроме старших битов, которые и при выключенном MMU наверняка можно записать.
при выключенном MMU увидеть в SR0 что-то кроме нуля
В теории биты 1-12 R/O, все остальные R/W. Надо попробовать вызвать ошибку и выключить методом BIC #1 и CLR на все случаи.
Тест на ВМ3.
.SR0
Live SR0 & SR2 test.
MOV #0177572, R2
MOV #0177576, R4
CLR (R2)
010000/ MOV (R2), R3 ; R3/000000
010002/ MOV (R4), R5 ; R5/010004
MOV #1,(R2)
010000/ MOV (R2), R3 ; R3/000001
010002/ MOV (R4), R5 ; R5/010004
Program completed.
старших битов, которые и при выключенном MMU наверняка можно записать.
Биты 13-15 всегда по идее можно записать - они в принципе R/W, хотя как правило их выставляет сам MMU. Суть теста который я предлагал выше - проверить поведение: запись 1 в любой из этих битов (не важно вручную или самим MMU) вызывает заморозку MMR2, MMR1 (ну тут не актуально) и битов 1-6 в SR0.
- - - Добавлено - - -
Неправильно прочитал текст выше, но суть та же - попробовать заморозить значения, выключить и посмотреть. А с учетом специфики ВМ3 также из пульта посмотреть.
- - - Добавлено - - -
Интересно, можно ли при выключенном MMU увидеть в SR0 что-то кроме нуля ..
Хотя это я уже пьян - я же сам выложил выше результат где видно, что из SR0 после записи 0 в него читается ненулевое значение. Так что суть вопроса сводится в гарантированной установке битов на ВМ3, отключении, чтении и проверки из пульта на всякий случай...
.
Новая версия теста: SR0.SAV (http://emulator.pdp-11.org.ru/misc/SR0.zip) - проверяет текущие значения SR0 и SR2 при выключенном и включённом MMU, выполняя команды в двух страницах памяти.
Запускать на машинах с диспетчером памяти.
Новая версия теста
.RU SR0
Live SR0 & SR2 test.
MOV #0177572, R2
MOV #0177576, R4
CLR (R2)
010000/ MOV (R2), R3 ; R3/000016
010002/ MOV (R4), R5 ; R5/010002
MOV #1,(R2)
010000/ MOV (R2), R3 ; R3/000017
010002/ MOV (R4), R5 ; R5/010002
CLR (R2)
020000/ MOV (R2), R3 ; R3/000016
020002/ MOV (R4), R5 ; R5/020002
MOV #1,(R2)
020000/ MOV (R2), R3 ; R3/000017
020002/ MOV (R4), R5 ; R5/020002
Program completed.
.
Эх, еще бы эти тесты с XM не конфликтовали, а то сначала загрузись в ZM чтобы залить по FTP, потом в SB чтобы запустить итд... :)
Тест на ВМ3.
.SR0
Live SR0 & SR2 test.
MOV #0177572, R2
MOV #0177576, R4
CLR (R2)
010000/ MOV (R2), R3 ; R3/000000
010002/ MOV (R4), R5 ; R5/010004
MOV #1,(R2)
010000/ MOV (R2), R3 ; R3/000001
010002/ MOV (R4), R5 ; R5/010004
CLR (R2)
020000/ MOV (R2), R3 ; R3/000016
020002/ MOV (R4), R5 ; R5/020004
MOV #1,(R2)
020000/ MOV (R2), R3 ; R3/000003
020002/ MOV (R4), R5 ; R5/020004
Program completed.
выполняя команды в двух страницах памяти
Кстати по описанию KDJ11-B биты 1-6 в SR0 выставляются только при возникновении ошибки.
- - - Добавлено - - -
1.4.7.1 Memory Management Register 0 (17777572) - MMR0 provides control and records memory
management unit status. The register contains abort and status flags as shown in Figure 1-15 and described
in Table 1-10.
1.4.7.2 Memory Management Register 1 (17777574) - MMR1 records any autoincrement or
autodecrement of a general purpose register, including explicit references through the PC. The increment
or decrement amount by which the register was modified is stored in 2’s complement notation. The lower
byte is used for all source operand instructions and the destination operand may be stored in either byte,
dependiig on the mode and instruction type. The register is cleared at the beginning of each instruction
fetch. The register is defined in Figure 1-16.
1.4.7.3 Memory Management Register 2 (17 777 576) - MMR2 is loaded with the program counter of
the current instruction and is frozen when any abort condition is posted in MMR0.
На ВМ3 живое значение SR0 показывает номер страницы предыдущей операции, а живое значение SR2 превышает "стандартное" на 2.
CodeMaster
06.02.2016, 21:54
Тест на ВМ3.
Я пропустил или забыл с чего начиналось 100 страниц назад, но эти все тесты из-за отсутствия надежды, что Vslav сделает реверс ВМ3 или тут какая-та другая цель?
эти все тесты из-за отсутствия надежды, что Vslav сделает реверс ВМ3 или тут какая-та другая цель?Реверс сам ответы не даёт, например - реверс ВМ1 сам по себе не выявил мега-глюк, а запущенные на V-модели тесты - мега-глюк выявили.
или тут какая-та другая цель?
Ну тесты не ориентированны чисто на ВМ3. Да и ждать реверса неизвестно сколько. А мне бы помог даже очень приблизительный эмулятор ибо удаленно отлаживаться на ДВК фактически нереально - все-равно нужен кто-то кого пинать на той стороне :)
Хотя живое значение SR0 у ВМ3 "отстаёт на одно обращение" - при очищении SR0 там "замораживается" то же значение с номером страницы регистра SR0, что и у 11/83.
живое значение SR0
Только с чем его сравнивать?
010000/ MOV (R2), R3 ; R3/000001
В битах страница 0 - адрес команды
010000/ MOV (R2), R3 ; R3/000017
В битах страница 7 - адрес (R2)...
Поэтому наверное и написано в доке, что значения имеют смысл только на момент заморозки - тогда они точно соответствуют обращению которое вызвало сбой...
010002/ MOV (R4), R5 ; R5/010004
А тут видим то самое несоответствие MMR2 адресу инструкции. Но опять таки оно незаморожено установкой старших битов SR0... Да и значения особого не имеет без реализации MMR1 :)
Только с чем его сравнивать?11/83:
020000/ MOV (R2), R3 ; R3/000017
ВМ3:
020000/ MOV (R2), R3 ; R3/000003
11/83:
Код:
020000/ MOV (R2), R3 ; R3/000017
ВМ3:
Код:
020000/ MOV (R2), R3 ; R3/000003
Так опять таки - первое - страница (R2), второе - страница @PC.
Поэтому наверное и написано в доке, что значения имеют смысл только на момент заморозки - тогда они точно соответствуют обращению которое вызвало сбой...Да, без заморозки значения в SR0 и SR2 у ВМ3 "нетрадиционные".
Так что скорее разница в источнике информации, а это видимо зависит от реализации выборки команды и последующей ее обработки...
- - - Добавлено - - -
у ВМ3 "нетрадиционные"
Так традиционных и нету без заморозки - для 11/83 дока оговаривает только то, что заморожено - оба варианта правильные, один вы согласии с операндом, второй с PC. Все дело в алгоритме работы видимо - так же как с известным Rx,(Rx)+...
оба варианта правильныеДля SR2 живой вариант трудно назвать "правильным" - он весьма "нетрадиционный".
Для SR2 живой вариант трудно назвать "правильным" - он весьма "нетрадиционный".
А есть ли оно правильное? Ведь значение регистра интересно опять таки при заморозке в момент ошибки, а оно насколько я помню в точности совпадало по тому же MMU.SAV... Оговаривается ли его значение без заморозки на всез вариантах - надо смотреть - вроде где-то было написано про различия...
- - - Добавлено - - -
TST @#20000 ;
*** MMU FAULT AT 002312, MMR0=100143, MMR1=000000, MMR2=002306 ***
CLR @#20000 ;
*** MMU FAULT AT 002342, MMR0=100143, MMR1=000000, MMR2=002336 ***
Специально вернулся назад - результат совпадает на 11/83 и на ВМ3. При заморозке результата (что и является значимым).
- - - Добавлено - - -
Видимо ВМ3 так дергает регистр предвыборкой следующей команды, на 11/83 же предвыборка идет несколько иначе. Ради интереса можно конечно переткнуть проц в первый слот, а память на место проца в третий, но в теории это скорее должно дать тот результат который и так есть :)
Тест на плате М6.
.SR0
Live SR0 & SR2 test.
MOV #0177572, R2
MOV #0177576, R4
CLR (R2)
010000/ MOV (R2), R3 ; R3/000000
010002/ MOV (R4), R5 ; R5/010002
MOV #1,(R2)
010000/ MOV (R2), R3 ; R3/000017
010002/ MOV (R4), R5 ; R5/010002
CLR (R2)
020000/ MOV (R2), R3 ; R3/000016
020002/ MOV (R4), R5 ; R5/020002
MOV #1,(R2)
020000/ MOV (R2), R3 ; R3/000017
020002/ MOV (R4), R5 ; R5/020002
Program completed.
Тест на плате М6
Ну все также как у меня - MMR0 отражает операнд, MMR2 - PC команды. А MMU.SAV видимо совпадет (по значениям регистров) в момент ошибки.
- - - Добавлено - - -
MMU.SAV
К слову - прогнать бы раз пошла такая пьянка :)
К слову - прогнать бы раз пошла такая пьянка
Тест MMU на плате М6.
.MMU
MMU FEATURES: 22-BIT
MOV #-1,@#MMR0 ;MMR0 = 160001
CLR @#MMR0 ;MMR0 = 000000
MOV #-1,@#MMR3 ;MMR3 = 000060
CLR @#MMR3 ;MMR3 = 000000
MOV #-1,@#KISAR0 ;KISAR0 = 177777
CLR @#KISAR0 ;KISAR0 = 000000
MOV #-1,@#KISDR0 ;KISDR0 = 077416
CLR @#KISDR0 ;KISDR0 = 000000
BIS #140000,@#PSW ;SET USER MODE
HALT ;TRAP TO 10
MOV #123456,@#20000 ;
MFPD @#20000 ;
MOV (SP)+,R0 ;R0=123456
MOV #77404,@#UISDR1 ;ACF=10
TST @#20000 ;
*** MMU FAULT AT 002312, MMR0=100143, MMR1=000000, MMR2=002306 ***
CLR @#20000 ;
*** MMU FAULT AT 002342, MMR0=100143, MMR1=000000, MMR2=002336 ***
.
Новый тест: SR2.SAV (http://emulator.pdp-11.org.ru/misc/SR2.zip) - тестирует заморозку SR2 установкой старшего бита SR0.
Запускать на машинах с диспетчером памяти.
MMU FEATURES: 22-BIT
Занятно. Я думал только ВМ3 бывает без дополнитльных фич обычного 22-битного MMU.
MOV #-1,@#MMR3 ;MMR3 = 000060
CLR @#MMR3 ;MMR3 = 000000
Меняется также бит отвечающий за UNIBUS mapping - ну это и у меня также, но отрабатывает его в теории UBA. Интересно, что в доке по KDJ11-B написано, что бит UNIBUS mapping не интерпретируется, а в KDJ11-E написано для чего он.
- - - Добавлено - - -
HALT ;TRAP TO 10
Ну и классика для машин где нет CPUERR. А SH CONF тоже его как 11/34 опознает? RT-11 часы запускает? (если не запускать DAY при старте) - для ВМ3 подтверждаю - в RT-11 часы не идут. В RSX идут, но там и алгоритм определения другой.
Новый тест: SR2.SAV - тестирует заморозку SR2 установкой старшего бита SR0.
.RU D10:SR2
SR2 test.
MOV #177572, R2
MOV #100000, R3
MOV #177576, R4
CLR (R2)
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
MOV #1,(R2)
INC R3
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
Program completed.
.
Тест на ВМ3.
.SR2
SR2 test.
MOV #177572, R2
MOV #100000, R3
MOV #177576, R4
CLR (R2)
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
MOV #1,(R2)
INC R3
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
Program completed.
тестирует заморозку SR2 установкой старшего бита SR0
Ну и SR0 до кучи нужен.
А SH CONF тоже его как 11/34 опознает? Нет. PDP11/23.
RT-11 часы запускает? (если не запускать DAY при старте)Время стоит на месте (команда TIME).
PDP11/23
Об этом я не подумал. Классический 11/23 - 18 бит, но упградится до 11/23-PLUS - он 22 (причем если не ошибаюсь, пульт об этом так и не знает). Да и прошник 350 соответственно получается плюс - 22 бит и ничего больше.
Время стоит на месте
Это скорее всего таймер не включен переключателями БП. Для 11/23 неоднозначности нет - у него нету регистра состояния таймера. Когда есть неоднозначность на команду TIM KMON отвечает No clock. У меня так можно сделать если убрать CSR таймера с шины и включить принудительные прерывания. Надо кстати посмотреть как RSX на такую наглость отреагирует.
.
Новый вариант теста: SR2.SAV (http://emulator.pdp-11.org.ru/misc/SR2.zip) - выводит также SR0.
Запускать на машинах с диспетчером памяти.
Новый вариант теста: SR2.SAV - выводит также SR0
.RU SR2
SR2 test.
MOV #177572, R2
MOV #177576, R4
MOV #000000,(R2)
MOV #100000, R3
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
010004/ MOV (R2), R3 ; R3/100000
MOV #000001,(R2)
MOV #100001, R3
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
010004/ MOV (R2), R3 ; R3/100017
Program completed.
075122
@
Нельзя ли все-таки сделать сохранение статуса MMU и восстановление потом? :)
- - - Добавлено - - -
SB
.RU D10:SR2
SR2 test.
MOV #177572, R2
MOV #177576, R4
MOV #000000,(R2)
MOV #100000, R3
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
010004/ MOV (R2), R3 ; R3/100016
MOV #000001,(R2)
MOV #100001, R3
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
010004/ MOV (R2), R3 ; R3/100017
Program completed.
.
Тест на ВМ3.
.SR2
SR2 test.
MOV #177572, R2
MOV #177576, R4
MOV #000000,(R2)
MOV #100000, R3
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
010004/ MOV (R2), R3 ; R3/100000
MOV #000001,(R2)
MOV #100001, R3
010000/ MOV R3, (R2)
010002/ MOV (R4), R5 ; R5/010000
010004/ MOV (R2), R3 ; R3/100017
Program completed.
- - - Добавлено - - -
Запускать на машинах с диспетчером памяти.
Результат на М6 аналогичен.
Результат на М6 аналогичен.
В сущности везде совпало. В SB у меня первый пункт отличился, но это ничто иное как результат окончания этого же теста запущенного под ZM :)
Впрочем если второй раз подряд запустить под Sb/SJ - результат тот же будет.
- - - Добавлено - - -
По пьяни всякая хрень в голову лезет :)
1. тест SR0 тот самый который без заморозки, но команды записываются в UPAR0-UPAR7.
2. записать туда что-нибудь вроде CLR R0, COMB R0, RETURN и посмотреть что с R0 будет (при выключенном 22-BIT) :v2_dizzy_vodka:
Это касаемо конкретно ВМ3 :)
- - - Добавлено - - -
...и кстати раз дошло дело до PARов... Проверить читаются ли они полностью (при выключенном 22 бит) в режиме HALT или это пульт при чтении включает 22 бит... или читает через свой маппинг...
раз дошло дело до PARов... Проверить читаются ли они полностью (при выключенном 22 бит) в режиме HALT или это пульт при чтении включает 22 бит... или читает через свой маппинг...Насколько я понимаю - в режиме HALT всегда видны все биты, потому что HALT-мапинг - 22-битный. Поэтому, при просмотре значений PAR в пульте - содержимое видно целиком, независимо от бита в SR3.
в режиме HALT всегда видны все биты, потому что HALT-мапинг - 22-битный
Ну да, свой маппинг, а вот тест про выборку команд из PARов интересно посмотреть: всегда ли выборка режется или при выборке инструкции все получится полностью...
.
Новый тест: PDPT3B.SAV (http://emulator.pdp-11.org.ru/misc/PDPT3B.zip) - проверяет потерю вектора прерывания в последовательности команд BIS #100,@#TTPS, BIC #100,@#TTPS.
Можно запускать на любых машинах.
При вылете в пульт можно нажать P для завершения программы.
Новый тест: PDPT3B.SAV - проверяет потерю вектора прерывания в последовательности команд BIS #100,@#TTPS, BIC #100,@#TTPS.
Ну у меня уже пробовали такое - потерянный вектор просто игнорируется как и документировано. А на ВМ3 интересно посмотрть.
Тест на ВМ3.
.PDPT3B
PDP-11 Interrupts Test #3b
001100/ BIS #100,@#TTPS x6
001114/ >>> Interrupt <<< 064
001130/ >>> Interrupt <<< 064
001144/ >>> Interrupt <<< 064
001210/ BIS #100,@#TTPS
001216/ BIC #100,@#TTPS
001224/
@ 001224
@P
Program completed.
Тест на ВМ3.
А после вылета в пульт по команде M, в качестве причины всё равно показывает HALT INSTRUCTION?
А после вылета в пульт по команде M, в качестве причины всё равно показывает HALT INSTRUCTION?
Да.
.
При нажатии M прошивка 134 выполняет следующий код :
ROM:003632 loc_3632: ; CODE XREF: ROM:003552j
ROM:003632 Cmp R4, #115 ; 'M'
ROM:003636 BNE loc_3754
ROM:003640 Call loc_4642
ROM:003644 BiT #1, @#77026
ROM:003652 BEq loc_3662
ROM:003654 Mov #aDoubleBusError, R5 ; "\r\nDOUBLE BUS ERROR"
ROM:003660 Br loc_3712
ROM:003662 ; ---------------------------------------------------------------------------
ROM:003662
ROM:003662 loc_3662: ; CODE XREF: ROM:003652j
ROM:003662 BiT #2, @#77026
ROM:003670 BEq loc_3700
ROM:003672 Mov #aInterruptError, R5 ; "\r\nINTERRUPT ERROR "
ROM:003676 Br loc_3712
ROM:003700 ; ---------------------------------------------------------------------------
ROM:003700
ROM:003700 loc_3700: ; CODE XREF: ROM:003670j
ROM:003700 Mov #aHaltInstructio, R5 ; "\r\nHALT INSTRUCTION"
ROM:003704 Br loc_3712
Возможно, что с ранней версией ВМ3 это работало.
Возможно, что с ранней версией ВМ3 это работало.
Никогда ни с одной версией ВМ3 это не работало, в 134-й прошивке нет даже вызова подпрограммы, устанавливающей соответствующие значения в ячейке 77026.
Вопрос про выходные каскады шины адреса/данных 1801ВМ1, 1801ВМ2, 1806ВМ2, 1801ВМ3. Интересует, есть там верхний транзистор всё-таки (лог.1 активная) или нет (выход с ОК) или ещё какой вариант (слабая подтяжка с ограничением тока, мало ли ...).
Этот вопрос связан с основным вопросом - возможно ли подключать на ходу эти разряды к земле (цель - динамическое изменение выдаваемых ВМ адреса/данных внешней цепью) без какой-либо опасности сжечь выходные каскады, или схемотехника выходного каскада этого не позволяет?
Вопрос про выходные каскады шины адреса/данных 1801ВМ1, 1801ВМ2
В этих микросхемах верхний транзистор есть, но, поскольку это n-MOS с одним питанием, то они слабенькие, со встроенным каналом, по документации - выдают вытекающий ток примерно 200мкА при выходном напряжении не менее 2.4В. Топологически - они там большую площадь занимают, если закоротить на землю, то выделяемая мощность должна распределиться, что сгорит - маловероятно. Но не думаю что это штатный режим.
Хм, освежил в памяти схемотехнику n-MOS - если верхний транзистор выходного каскада не управляется внутренней логикой микросхемы, а всегда висит затвором на питание в качестве динамической нагрузки, значит он априори спроектирован на работу на замыкание на 0 нижнего транзистора при выдаче лог.0, а значит также штатно будет работать и при любом внешнем замыкании на 0. Какая там схемотехника выходного каскада в 1801ВМ1 и 1801ВМ2, такая или другая?
И остаётся вопрос про 1806, которые КМОП - что у них в выходном каскаде, и про 1801ВМ3 - которые, скорее всего, имеют такой же выход, как в 1801ВМ1 и 1801ВМ2, но интересно, есть ли точная инфа?
Хм, освежил в памяти схемотехнику n-MOS - если верхний транзистор выходного каскада не управляется внутренней логикой микросхемы, а всегда висит затвором на питание в качестве динамической нагрузки
В буферах внешних выводов это не так.
Схема 1801ВМ1А (http://u.zeptobars.ru/yuot/1801/VM1/CAD/vm1_ma.pdf) (буферы внешних выводов на странице 1)
Схема 1801ВМ2А (http://u.zeptobars.ru/yuot/1801/VM2/CAD/vm2_ra.pdf) (буферы внешних выводов на странице 1)
Те транзисторы, которые подключают выходы к питанию - они со встроенным каналом (в схеме слишком много транзисторов, поэтому я только один тип осилил, если применить несколько типов, то трудоемкость реверса возрастает, а смысла немного - обычно понятно где какой тип транзистора применен, из схемы) . Если на затворе высокое (напряжение питания), то канал транзистора открыт, и дает ток от 200мкА. Если выход снаружи закорочен, то мощность - 200мкА*5В - от 1мВт будет выделяться на этом транзисторе. Топологически он достаточно большой, но я не знаю, допустима ли такая мощность для него. Если на затворе напряжение низкого уровня, то встроенный канал закрывается.
Фрагмент схемы ВМ2, буфер вывода AD0:
http://s020.radikal.ru/i703/1602/ff/4d73224914e7t.jpg (http://s020.radikal.ru/i703/1602/ff/4d73224914e7.png)
T121 - драйвер высокого уровня, встроенный канал (от 200мкА) (топологически - большой, "многопальцевый")
T113 - драйвер низкого уровня, индуцированный канал (от 3,2мА) (топологически - большой, "многопальцевый")
T133 - защитный
T131/T132 - логика входного инвертора
T101 - ключ выдачи входных данных на внутренюю шину процессора
T56 - конденсатор бустера для T81, насколько я понял - мера для повышения быстродействия
"Многопальцевые" выходные транзисторы (T121/T113) выглядят так:
http://s016.radikal.ru/i337/1602/42/9978b915694ct.jpg (http://s016.radikal.ru/i337/1602/42/9978b915694c.jpg)
Они как бы скомбинированы вместе в единую структуру.
Реально при закоротке АД0 на общий 1801ВМ1 обеспечивает 1 ма ток КЗ на общий, или даже больше. При закоротке АД0 на питание - 15 ма или больше.
1806ВМ2 содержит встроенные 1564АП6 на линиях типа АД0 - т.е. ток КЗ выше в разы.
В буферах внешних выводов это не так.
Схема 1801ВМ1А (буферы внешних выводов на странице 1)
Схема 1801ВМ2А (буферы внешних выводов на странице 1)
Те транзисторы, которые подключают выходы к питанию - ... Если на затворе напряжение низкого уровня, то встроенный канал закрывается.
Фрагмент схемы ВМ2, буфер вывода AD0:
Ага, спасибо, пробежался по цепочке, действительно в противофазе работают плечи, и верхнее отключается при 0 на выходе. Тогда надо искать по каждому типу предельные токи по выходам.
Реально при закоротке АД0 на общий 1801ВМ1 обеспечивает 1 ма ток КЗ на общий, или даже больше.
Вопрос тут, безопасно ли это для кристалла или нет.
Поглядел, только для 1801ВМ2 нашёл в справочном листке (он же в справочнике Нефедова) в предельно допустимых режимах максимальный ток нуля 5 мА и максимальный ток единицы 0.5 мА. А у Шахнова для всей серии 1801 указан максимальный ток нуля 3.2 мА и максимальный ток единицы 1 мА. Кому верить, непонятно, разброс по интересующей величине в 2 раза.
Интересно тогда ещё, у 1801ВМ1 и 1801ВМ2 размер транзисторов в выходном каскаде одинаковый?
Интересно тогда ещё, у 1801ВМ1 и 1801ВМ2 размер транзисторов в выходном каскаде одинаковый?
Размеры примерно одинаковые, но это не показатель, важна еще куча параметров - степень легирования, толщина слоя оксида и прочее. Но рабочие токи, судя по документации, тоже примерно одинаковые. В своей конструкции я бы замыкать на землю выход не стал, нештатный это режим. Тем более, напряжение затвор-канал при заземлении канала растет, проводимость тоже растет, значит вырастет ток и выделяемая мощность, что приведет к локальному повышению температуры. А при разогреве полупроводника проводимость также растет, имеем положительную обратную связь. Кратковременное замыкание оно обычно выдерживает, а на постоянку - как повезет. Причем, если транзистор неудачно разрушится, то также может отказать и вход.
Фрагмент схемы ВМ2, буфер вывода AD0:Стой-стой! Это же про Т121, да? Так там истоковый повторитель, т.е. при высоком уровне на его затворе и попытке подать низкий уровень на его исток через выходную ногу, ток может многократно возрасти, то есть вместо 200 мкА запросто окажется и 2мА, а то и 20. То есть коротким импульсом подать ноль можно, а дать статический уровень - так скорее всего сдохнет!..
Стой-стой! Это же про Т121, да?
...
вместо 200 мкА запросто окажется и 2мА, а то и 20.
Именно так.
.
До сих пор неизвестно, в чём разница при делении нечётного регистра на процессорах ВМ2 и ВМ3.
Для прояснения ситуации - тест: TDIV10.SAV (http://emulator.pdp-11.org.ru/misc/TDIV10.zip)
Результат на эмулируемом процессоре ВМ2 такой:
.RUN TDIV10
PSW[000] ; R2[000000] ; R1[000000] >>> DIV R2,R1 >>> PSW[003] ; R1[000000]
PSW[000] ; R2[000000] ; R1[000001] >>> DIV R2,R1 >>> PSW[003] ; R1[000001]
PSW[000] ; R2[000000] ; R1[100000] >>> DIV R2,R1 >>> PSW[003] ; R1[100000]
PSW[000] ; R2[000000] ; R1[177777] >>> DIV R2,R1 >>> PSW[003] ; R1[177777]
PSW[000] ; R2[000001] ; R1[000000] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[000001] ; R1[000001] >>> DIV R2,R1 >>> PSW[002] ; R1[000001]
PSW[000] ; R2[000001] ; R1[100000] >>> DIV R2,R1 >>> PSW[002] ; R1[100000]
PSW[000] ; R2[000001] ; R1[177777] >>> DIV R2,R1 >>> PSW[010] ; R1[177777]
PSW[000] ; R2[100000] ; R1[000000] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[100000] ; R1[000001] >>> DIV R2,R1 >>> PSW[010] ; R1[177776]
PSW[000] ; R2[100000] ; R1[100000] >>> DIV R2,R1 >>> PSW[002] ; R1[100000]
PSW[000] ; R2[100000] ; R1[177777] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[177777] ; R1[000000] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[177777] ; R1[000001] >>> DIV R2,R1 >>> PSW[002] ; R1[000001]
PSW[000] ; R2[177777] ; R1[100000] >>> DIV R2,R1 >>> PSW[002] ; R1[100000]
PSW[000] ; R2[177777] ; R1[177777] >>> DIV R2,R1 >>> PSW[000] ; R1[000001]
.
- - - Добавлено - - -
Ещё один тест деления нечётного регистра: TDIV11.SAV (http://emulator.pdp-11.org.ru/misc/TDIV11.zip)
Результат на эмулируемом процессоре ВМ2 такой:
.RUN TDIV11
PSW[000] ; R2[000010] ; R1[000001] >>> DIV R2,R1 >>> PSW[000] ; R1[020000]
PSW[000] ; R2[000010] ; R1[000004] >>> DIV R2,R1 >>> PSW[002] ; R1[000004]
PSW[000] ; R2[000010] ; R1[000010] >>> DIV R2,R1 >>> PSW[002] ; R1[000010]
PSW[000] ; R2[000010] ; R1[000020] >>> DIV R2,R1 >>> PSW[002] ; R1[000020]
PSW[000] ; R2[000010] ; R1[000040] >>> DIV R2,R1 >>> PSW[002] ; R1[000040]
PSW[000] ; R2[000010] ; R1[177777] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[000010] ; R1[177774] >>> DIV R2,R1 >>> PSW[010] ; R1[120000]
PSW[000] ; R2[000010] ; R1[177770] >>> DIV R2,R1 >>> PSW[002] ; R1[177770]
PSW[000] ; R2[000010] ; R1[177760] >>> DIV R2,R1 >>> PSW[002] ; R1[177760]
PSW[000] ; R2[000010] ; R1[177740] >>> DIV R2,R1 >>> PSW[002] ; R1[177740]
PSW[000] ; R2[177770] ; R1[000001] >>> DIV R2,R1 >>> PSW[010] ; R1[160000]
PSW[000] ; R2[177770] ; R1[000004] >>> DIV R2,R1 >>> PSW[010] ; R1[100000]
PSW[000] ; R2[177770] ; R1[000010] >>> DIV R2,R1 >>> PSW[002] ; R1[000010]
PSW[000] ; R2[177770] ; R1[000020] >>> DIV R2,R1 >>> PSW[002] ; R1[000020]
PSW[000] ; R2[177770] ; R1[000040] >>> DIV R2,R1 >>> PSW[002] ; R1[000040]
PSW[000] ; R2[177770] ; R1[177777] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[177770] ; R1[177774] >>> DIV R2,R1 >>> PSW[000] ; R1[060000]
PSW[000] ; R2[177770] ; R1[177770] >>> DIV R2,R1 >>> PSW[002] ; R1[177770]
PSW[000] ; R2[177770] ; R1[177760] >>> DIV R2,R1 >>> PSW[002] ; R1[177760]
PSW[000] ; R2[177770] ; R1[177740] >>> DIV R2,R1 >>> PSW[002] ; R1[177740]
.
До сих пор неизвестно, в чём разница при делении нечётного регистра на процессорах ВМ2 и ВМ3.
Ну уж про ВМ2 давно известно. Выдержка из моего описания:
Алгоритм: tmp32[31:16] := R; tmp32[15:0] := R or 1; tmp32[частное, остаток] := tmp32 / (src); R or 1 := tmp32[15:0](остаток) ; R := tmp32[31:16](частное)
Описание: 32-разрядное слово в двоично-дополнительном коде, находящееся в регистрах R и R or 1, делится на операнд источника. Частное заносится в R, а остаток в R or 1. После выполнения операции деления знак остатка будет таким же, как и у делимого. Если в качестве R используется нечётный регистр, то старшая часть 32-разрядного делимого будет повторять его младшую часть, т.е. фактически выполняется операция ((R << 16) or R) и после завершения операции деления сохранится только частное. При арифметическом переполнении во время операции (частное не помещается в 16 разрядов) или делении на ноль выполнение операции прекращается, регистры не изменяются, очищаются признаки N и Z в PSW, устанавливается признак V.
Признаки: N – устанавливается, если частное меньше нуля, в противном случае (и в случае арифметического переполнения) очищается, Z – устанавливается, если частное равно нулю, в противном случае (и в случае арифметического переполнения) очищается, V – устанавливается при арифметическом переполнении и делении на ноль ((src)==0), в противном случае очищается, C – устанавливается, если осуществляется деление на ноль ((src)==0), в противном случае очищается.
TDIV10 аналогично на реальной УКНЦ и на эмуляторе UKNCBTL.
- - - Добавлено - - -
TDIV11 также аналогично на реальной УКНЦ и на эмуляторе UKNCBTL.
Ну уж про ВМ2 давно известно.Поэтому можно точно эмулировать результаты деления нечётного регистра на ВМ2.
А про деление нечётного регистра на ВМ3 пока известно только то, что его результаты как-то отличаются от результатов деления на ВМ2.
До кучи на 11/83:
.MOU LD TDIV10
.RU LD:TDIV10
PSW[000] ; R2[000000] ; R1[000000] >>> DIV R2,R1 >>> PSW[007] ; R1[000000]
PSW[000] ; R2[000000] ; R1[000001] >>> DIV R2,R1 >>> PSW[007] ; R1[000001]
PSW[000] ; R2[000000] ; R1[100000] >>> DIV R2,R1 >>> PSW[007] ; R1[100000]
PSW[000] ; R2[000000] ; R1[177777] >>> DIV R2,R1 >>> PSW[007] ; R1[177777]
PSW[000] ; R2[000001] ; R1[000000] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[000001] ; R1[000001] >>> DIV R2,R1 >>> PSW[002] ; R1[000001]
PSW[000] ; R2[000001] ; R1[100000] >>> DIV R2,R1 >>> PSW[012] ; R1[100000]
PSW[000] ; R2[000001] ; R1[177777] >>> DIV R2,R1 >>> PSW[010] ; R1[000000]
PSW[000] ; R2[100000] ; R1[000000] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[100000] ; R1[000001] >>> DIV R2,R1 >>> PSW[010] ; R1[000001]
PSW[000] ; R2[100000] ; R1[100000] >>> DIV R2,R1 >>> PSW[002] ; R1[100000]
PSW[000] ; R2[100000] ; R1[177777] >>> DIV R2,R1 >>> PSW[004] ; R1[177777]
PSW[000] ; R2[177777] ; R1[000000] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[177777] ; R1[000001] >>> DIV R2,R1 >>> PSW[012] ; R1[000001]
PSW[000] ; R2[177777] ; R1[100000] >>> DIV R2,R1 >>> PSW[002] ; R1[100000]
PSW[000] ; R2[177777] ; R1[177777] >>> DIV R2,R1 >>> PSW[000] ; R1[000000]
.MOU LD TDIV11
.RU LD:TDIV11
PSW[000] ; R2[000010] ; R1[000001] >>> DIV R2,R1 >>> PSW[000] ; R1[000001]
PSW[000] ; R2[000010] ; R1[000004] >>> DIV R2,R1 >>> PSW[002] ; R1[000004]
PSW[000] ; R2[000010] ; R1[000010] >>> DIV R2,R1 >>> PSW[002] ; R1[000010]
PSW[000] ; R2[000010] ; R1[000020] >>> DIV R2,R1 >>> PSW[002] ; R1[000020]
PSW[000] ; R2[000010] ; R1[000040] >>> DIV R2,R1 >>> PSW[002] ; R1[000040]
PSW[000] ; R2[000010] ; R1[177777] >>> DIV R2,R1 >>> PSW[004] ; R1[177777]
PSW[000] ; R2[000010] ; R1[177774] >>> DIV R2,R1 >>> PSW[010] ; R1[177774]
PSW[000] ; R2[000010] ; R1[177770] >>> DIV R2,R1 >>> PSW[012] ; R1[177770]
PSW[000] ; R2[000010] ; R1[177760] >>> DIV R2,R1 >>> PSW[012] ; R1[177760]
PSW[000] ; R2[000010] ; R1[177740] >>> DIV R2,R1 >>> PSW[012] ; R1[177740]
PSW[000] ; R2[177770] ; R1[000001] >>> DIV R2,R1 >>> PSW[010] ; R1[000001]
PSW[000] ; R2[177770] ; R1[000004] >>> DIV R2,R1 >>> PSW[010] ; R1[000004]
PSW[000] ; R2[177770] ; R1[000010] >>> DIV R2,R1 >>> PSW[012] ; R1[000010]
PSW[000] ; R2[177770] ; R1[000020] >>> DIV R2,R1 >>> PSW[012] ; R1[000020]
PSW[000] ; R2[177770] ; R1[000040] >>> DIV R2,R1 >>> PSW[012] ; R1[000040]
PSW[000] ; R2[177770] ; R1[177777] >>> DIV R2,R1 >>> PSW[004] ; R1[177777]
PSW[000] ; R2[177770] ; R1[177774] >>> DIV R2,R1 >>> PSW[000] ; R1[177774]
PSW[000] ; R2[177770] ; R1[177770] >>> DIV R2,R1 >>> PSW[002] ; R1[177770]
PSW[000] ; R2[177770] ; R1[177760] >>> DIV R2,R1 >>> PSW[002] ; R1[177760]
PSW[000] ; R2[177770] ; R1[177740] >>> DIV R2,R1 >>> PSW[002] ; R1[177740]
.
На ВМ3 результат будет такой:
.TDIV10
PSW[000] ; R2[000000] ; R1[000000] >>> DIV R2,R1 >>> PSW[003] ; R1[000000]
PSW[000] ; R2[000000] ; R1[000001] >>> DIV R2,R1 >>> PSW[003] ; R1[000001]
PSW[000] ; R2[000000] ; R1[100000] >>> DIV R2,R1 >>> PSW[003] ; R1[100000]
PSW[000] ; R2[000000] ; R1[177777] >>> DIV R2,R1 >>> PSW[003] ; R1[177777]
PSW[000] ; R2[000001] ; R1[000000] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[000001] ; R1[000001] >>> DIV R2,R1 >>> PSW[002] ; R1[000001]
PSW[000] ; R2[000001] ; R1[100000] >>> DIV R2,R1 >>> PSW[002] ; R1[100000]
PSW[000] ; R2[000001] ; R1[177777] >>> DIV R2,R1 >>> PSW[010] ; R1[177777]
PSW[000] ; R2[100000] ; R1[000000] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[100000] ; R1[000001] >>> DIV R2,R1 >>> PSW[010] ; R1[177776]
PSW[000] ; R2[100000] ; R1[100000] >>> DIV R2,R1 >>> PSW[002] ; R1[100000]
PSW[000] ; R2[100000] ; R1[177777] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[177777] ; R1[000000] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[177777] ; R1[000001] >>> DIV R2,R1 >>> PSW[002] ; R1[000001]
PSW[000] ; R2[177777] ; R1[100000] >>> DIV R2,R1 >>> PSW[002] ; R1[100000]
PSW[000] ; R2[177777] ; R1[177777] >>> DIV R2,R1 >>> PSW[000] ; R1[000001]
.TDIV11
PSW[000] ; R2[000010] ; R1[000001] >>> DIV R2,R1 >>> PSW[000] ; R1[020000]
PSW[000] ; R2[000010] ; R1[000004] >>> DIV R2,R1 >>> PSW[002] ; R1[000004]
PSW[000] ; R2[000010] ; R1[000010] >>> DIV R2,R1 >>> PSW[002] ; R1[000010]
PSW[000] ; R2[000010] ; R1[000020] >>> DIV R2,R1 >>> PSW[002] ; R1[000020]
PSW[000] ; R2[000010] ; R1[000040] >>> DIV R2,R1 >>> PSW[002] ; R1[000040]
PSW[000] ; R2[000010] ; R1[177777] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[000010] ; R1[177774] >>> DIV R2,R1 >>> PSW[010] ; R1[120000]
PSW[000] ; R2[000010] ; R1[177770] >>> DIV R2,R1 >>> PSW[002] ; R1[177770]
PSW[000] ; R2[000010] ; R1[177760] >>> DIV R2,R1 >>> PSW[002] ; R1[177760]
PSW[000] ; R2[000010] ; R1[177740] >>> DIV R2,R1 >>> PSW[002] ; R1[177740]
PSW[000] ; R2[177770] ; R1[000001] >>> DIV R2,R1 >>> PSW[010] ; R1[160000]
PSW[000] ; R2[177770] ; R1[000004] >>> DIV R2,R1 >>> PSW[010] ; R1[100000]
PSW[000] ; R2[177770] ; R1[000010] >>> DIV R2,R1 >>> PSW[002] ; R1[000010]
PSW[000] ; R2[177770] ; R1[000020] >>> DIV R2,R1 >>> PSW[002] ; R1[000020]
PSW[000] ; R2[177770] ; R1[000040] >>> DIV R2,R1 >>> PSW[002] ; R1[000040]
PSW[000] ; R2[177770] ; R1[177777] >>> DIV R2,R1 >>> PSW[004] ; R1[000000]
PSW[000] ; R2[177770] ; R1[177774] >>> DIV R2,R1 >>> PSW[000] ; R1[060000]
PSW[000] ; R2[177770] ; R1[177770] >>> DIV R2,R1 >>> PSW[002] ; R1[177770]
PSW[000] ; R2[177770] ; R1[177760] >>> DIV R2,R1 >>> PSW[002] ; R1[177760]
PSW[000] ; R2[177770] ; R1[177740] >>> DIV R2,R1 >>> PSW[002] ; R1[177740]
На ВМ3 результат такойЭтого я и боялся - разницы у протестированных команд с ВМ2 нет, но по результатам прогона (http://zx-pk.ru/showthread.php?t=18184&p=749373&viewfull=1#post749373) теста TSTVM2.SAV - у каких-то команд деления нечётного регистра разница между ВМ2 и ВМ3 должна быть.
1801ВМ2
Команда деления (частичный тест):
DIV (even) - OK
DIV (odd) - OK
1801ВМ3
Команда деления (частичный тест):
DIV (even) - ERROR: 0x9E4A / 0x920C
DIV (odd) - ERROR: 0x43D5 / 0x281D
Придётся сделать тест для пошагового сравнения контрольных сумм теста TSTVM2.SAV, полученных на ВМ2, при прогоне на ВМ3.
- - - Добавлено - - -
На первом этапе надо проверить, будет ли упрощённый вариант расчёта контрольных сумм давать разные результаты на ВМ2 и ВМ3.
Это делает тест: T2DIV.SAV (http://emulator.pdp-11.org.ru/misc/T2DIV.zip)
На эмулируемом ВМ2 рзультат такой:
.RUN T2DIV
Тестирование правильности выполнения команд процессора:
Команда деления (частичный тест):
DIV (even) - OK
DIV (odd) - OK
.
На ВМ3 результат такой:
.T2DIV
Тестирование правильности выполнения команд процессора:
Команда деления (частичный тест):
DIV (even) - ERROR: 0xC9A3 / 0x8921
DIV (odd) - ERROR: 0xD858 / 0xEBD8
.
На первом этапе надо проверить, будет ли упрощённый вариант расчёта контрольных сумм давать разные результаты на ВМ2 и ВМ3.
Это делает тест: T2DIV.SAV
На эмулируемом ВМ2 рзультат такой:
На реальном 1801ВМ2 также все OK.
.
Тест: T4DIV.SAV (http://emulator.pdp-11.org.ru/misc/T4DIV.zip) - считает не только общую контрольную сумму, но и отдельные контрольные суммы для R0, R1 и PSW.
На модели ВМ2 результат такой:
.RUN T4DIV
Тестирование правильности выполнения команд процессора:
Команда деления (частичный тест):
DIV R2,R1 - OK
.
На специально испорченной модели ВМ3 результат такой:
.RUN T4DIV
Тестирование правильности выполнения команд процессора:
Команда деления (частичный тест):
DIV R2,R1 - ERROR: 0x1B0B / 0x1B13
R0 - OK
R1 - ERROR: 0xFFC7 / 0xFFD7
PSW - ERROR: 0x1F44 / 0x1F3C
.
На ВМ3 результат такой:
.T4DIV
Тестирование правильности выполнения команд процессора:
Команда деления (частичный тест):
DIV R2,R1 - ERROR: 0x1B0B / 0x1C73
R0 - OK
R1 - OK
PSW - ERROR: 0x1F44 / 0x20AC
.
- - - Добавлено - - -
Patron, Желательно чтоб тест выводил данные в восьмеричной системе (так сказать, традиционно). :)
.
Тест: TDIV13.SAV (http://emulator.pdp-11.org.ru/misc/TDIV13.zip) - выводит все команды DIV R2,R1, после выполнения которых содержимое PSW отличается от результата на ВМ2.
Файлы: TDIV13.SAV и ODD.DAT должны находиться на устройстве DK:
На модели ВМ2 результат такой:
.ASS HD3 DK
.RUN TDIV13
Тестирование правильности выполнения команд процессора:
Команда деления (частичный тест):
DIV R2,R1
.
На специально испорченной модели ВМ3 результат такой:
.ASS HD3 DK
.RUN TDIV13
Тестирование правильности выполнения команд процессора:
Команда деления (частичный тест):
DIV R2,R1
R2/050000 ; R1/177777 >>> DIV R2,R1 >>> CPU PSW/000005 ; VM2 PSW/000004
R2/050000 ; R1/177776 >>> DIV R2,R1 >>> CPU PSW/000011 ; VM2 PSW/000010
R2/050000 ; R1/177775 >>> DIV R2,R1 >>> CPU PSW/000011 ; VM2 PSW/000010
R2/050000 ; R1/177774 >>> DIV R2,R1 >>> CPU PSW/000011 ; VM2 PSW/000010
R2/050000 ; R1/177773 >>> DIV R2,R1 >>> CPU PSW/000011 ; VM2 PSW/000010
R2/050000 ; R1/177772 >>> DIV R2,R1 >>> CPU PSW/000011 ; VM2 PSW/000010
R2/050000 ; R1/177771 >>> DIV R2,R1 >>> CPU PSW/000011 ; VM2 PSW/000010
R2/050000 ; R1/177770 >>> DIV R2,R1 >>> CPU PSW/000011 ; VM2 PSW/000010
R2/050000 ; R1/000007 >>> DIV R2,R1 >>> CPU PSW/000001 ; VM2 PSW/000000
R2/050000 ; R1/000006 >>> DIV R2,R1 >>> CPU PSW/000001 ; VM2 PSW/000000
R2/050000 ; R1/000005 >>> DIV R2,R1 >>> CPU PSW/000001 ; VM2 PSW/000000
R2/050000 ; R1/000004 >>> DIV R2,R1 >>> CPU PSW/000001 ; VM2 PSW/000000
R2/050000 ; R1/000003 >>> DIV R2,R1 >>> CPU PSW/000001 ; VM2 PSW/000000
R2/050000 ; R1/000002 >>> DIV R2,R1 >>> CPU PSW/000001 ; VM2 PSW/000000
R2/050000 ; R1/000001 >>> DIV R2,R1 >>> CPU PSW/000001 ; VM2 PSW/000000
R2/050000 ; R1/000000 >>> DIV R2,R1 >>> CPU PSW/000005 ; VM2 PSW/000004
.
На ВМ3 результат такой:
.RUN HX3:TDIV13
CSI Error
.AS HX3: DK:
.RUN HX3:TDIV13
Тестирование правильности выполнения команд процессора:
Команда деления (частичный тест):
DIV R2,R1
R2/177777 ; R1/177776 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177777 ; R1/177775 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177777 ; R1/177774 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177777 ; R1/177773 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177777 ; R1/177772 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177777 ; R1/177771 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177777 ; R1/177770 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177776 ; R1/177776 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177776 ; R1/177775 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177776 ; R1/177774 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177776 ; R1/177773 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177776 ; R1/177772 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177776 ; R1/177771 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177776 ; R1/177770 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177775 ; R1/177775 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177775 ; R1/177774 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177775 ; R1/177773 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177775 ; R1/177772 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177775 ; R1/177771 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177775 ; R1/177770 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177774 ; R1/177775 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177774 ; R1/177774 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177774 ; R1/177773 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177774 ; R1/177772 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177774 ; R1/177771 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/177774 ; R1/177770 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000003 ; R1/177775 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000003 ; R1/177774 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000003 ; R1/177773 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000003 ; R1/177772 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000003 ; R1/177771 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000003 ; R1/177770 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000002 ; R1/177776 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000002 ; R1/177775 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000002 ; R1/177774 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000002 ; R1/177773 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000002 ; R1/177772 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000002 ; R1/177771 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000002 ; R1/177770 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000001 ; R1/177776 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000001 ; R1/177775 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000001 ; R1/177774 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000001 ; R1/177773 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000001 ; R1/177772 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000001 ; R1/177771 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000001 ; R1/177770 >>> DIV R2,R1 >>> CPU PSW/000012 ; VM2 PSW/000002
R2/000000 ; R1/177777 >>> DIV R2,R1 >>> CPU PSW/000013 ; VM2 PSW/000003
R2/000000 ; R1/177776 >>> DIV R2,R1 >>> CPU PSW/000013 ; VM2 PSW/000003
R2/000000 ; R1/177775 >>> DIV R2,R1 >>> CPU PSW/000013 ; VM2 PSW/000003
R2/000000 ; R1/177774 >>> DIV R2,R1 >>> CPU PSW/000013 ; VM2 PSW/000003
R2/000000 ; R1/177773 >>> DIV R2,R1 >>> CPU PSW/000013 ; VM2 PSW/000003
R2/000000 ; R1/177772 >>> DIV R2,R1 >>> CPU PSW/000013 ; VM2 PSW/000003
R2/000000 ; R1/177771 >>> DIV R2,R1 >>> CPU PSW/000013 ; VM2 PSW/000003
R2/000000 ; R1/177770 >>> DIV R2,R1 >>> CPU PSW/000013 ; VM2 PSW/000003
R2/000000 ; R1/000000 >>> DIV R2,R1 >>> CPU PSW/000007 ; VM2 PSW/000003
.
На ВМ3 результат такой:
Странно, кстати, некоторые результаты в TDIV10 имели другой результат. Например при делении на ноль нуля и минус единицы флаги N и Z не устанавливались.
- - - Добавлено - - -
Вообще складывается впечатление, что при арифметическом переполнении (ну и делении на ноль, как частном случае) флаги N и Z вообще не трогаются. Надо в тест перед командой DIV поставить команду CCC, и посмотреть, что получиться.
Вообще складывается впечатление, что при арифметическом переполнении (ну и делении на ноль, как частном случае) флаги N и Z вообще не трогаются.Так и есть. Когда я изменил модель ВМ3 на такое поведение - контрольные суммы тестов деления нечётного регистра совпали.
Осталось разобраться с делением чётного регистра - там всё сложнее.
- - - Добавлено - - -
В итоге оказалось не слишком сложно.
Тест: TDIV14.SAV (http://emulator.pdp-11.org.ru/misc/TDIV14.zip) - позволит насладиться особенностями выполнения деления чётного регистра процессром 1801ВМ3.
Результат на эмулируемом ВМ3 такой:
.RUN TDIV14
PSW[017] ; R0[000000] ; R1[000000] ; R2[000000] >>> DIV R2,R0 >>>
PSW[017] ; R0[000000] ; R1[000000]
PSW[017] ; R0[100000] ; R1[000000] ; R2[000000] >>> DIV R2,R0 >>>
PSW[017] ; R0[100000] ; R1[000000]
PSW[017] ; R0[100000] ; R1[000000] ; R2[100000] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[100001] ; R1[000000] ; R2[100001] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[100001] ; R1[000000] ; R2[077777] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[177777] ; R1[000000] ; R2[000001] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[177777] ; R1[000000] ; R2[177777] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[177776] ; R1[000000] ; R2[000002] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[177776] ; R1[000000] ; R2[177776] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[133334] ; R1[000000] ; R2[044444] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[133334] ; R1[000000] ; R2[133334] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
- - - Добавлено - - -
Особенно вдохновляет деление на 1, дающее в результате 0.
Тест: TDIV14.SAV - позволит насладиться особенностями выполнения деления чётного регистра процессром 1801ВМ3.
А на реальном 1801ВМ2 такой:
.TDIV14
PSW[017] ; R0[000000] ; R1[000000] ; R2[000000] >>> DIV R2,R0 >>>
PSW[003] ; R0[000000] ; R1[000000]
PSW[017] ; R0[100000] ; R1[000000] ; R2[000000] >>> DIV R2,R0 >>>
PSW[003] ; R0[100000] ; R1[000000]
PSW[017] ; R0[100000] ; R1[000000] ; R2[100000] >>> DIV R2,R0 >>>
PSW[002] ; R0[100000] ; R1[000000]
PSW[017] ; R0[100001] ; R1[000000] ; R2[100001] >>> DIV R2,R0 >>>
PSW[002] ; R0[100001] ; R1[000000]
PSW[017] ; R0[100001] ; R1[000000] ; R2[077777] >>> DIV R2,R0 >>>
PSW[002] ; R0[100001] ; R1[000000]
PSW[017] ; R0[177777] ; R1[000000] ; R2[000001] >>> DIV R2,R0 >>>
PSW[002] ; R0[177777] ; R1[000000]
PSW[017] ; R0[177777] ; R1[000000] ; R2[177777] >>> DIV R2,R0 >>>
PSW[002] ; R0[177777] ; R1[000000]
PSW[017] ; R0[177776] ; R1[000000] ; R2[000002] >>> DIV R2,R0 >>>
PSW[002] ; R0[177776] ; R1[000000]
PSW[017] ; R0[177776] ; R1[000000] ; R2[177776] >>> DIV R2,R0 >>>
PSW[002] ; R0[177776] ; R1[000000]
PSW[017] ; R0[133334] ; R1[000000] ; R2[044444] >>> DIV R2,R0 >>>
PSW[002] ; R0[133334] ; R1[000000]
PSW[017] ; R0[133334] ; R1[000000] ; R2[133334] >>> DIV R2,R0 >>>
PSW[002] ; R0[133334] ; R1[000000]
На ВМ3 результат такой:
.RUN TDIV14
PSW[017] ; R0[000000] ; R1[000000] ; R2[000000] >>> DIV R2,R0 >>>
PSW[017] ; R0[000000] ; R1[000000]
PSW[017] ; R0[100000] ; R1[000000] ; R2[000000] >>> DIV R2,R0 >>>
PSW[017] ; R0[100000] ; R1[000000]
PSW[017] ; R0[100000] ; R1[000000] ; R2[100000] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[100001] ; R1[000000] ; R2[100001] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[100001] ; R1[000000] ; R2[077777] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[177777] ; R1[000000] ; R2[000001] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[177777] ; R1[000000] ; R2[177777] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[177776] ; R1[000000] ; R2[000002] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[177776] ; R1[000000] ; R2[177776] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[133334] ; R1[000000] ; R2[044444] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
PSW[017] ; R0[133334] ; R1[000000] ; R2[133334] >>> DIV R2,R0 >>>
PSW[004] ; R0[000000] ; R1[000000]
.
На ВМ3 результат такой:
Как я понял, ВМ3 неправильно выполняет деление, если в качестве частного получается 0x10000 или 0xFFFF0000?
Как я понял, ВМ3 неправильно выполняет деление, если в качестве частного получается 0x10000 или 0xFFFF0000?Если младшее слово делимого нулевое, а старшее отрицательное и по модулю равно делителю, то тогда деление вместо переполнения даёт нулевой результат.
Особенно вдохновляет деление на 1, дающее в результате 0.
А как еще -65536 представить в 16 битах? :)
- - - Добавлено - - -
.RU TDIV14
PSW[017] ; R0[000000] ; R1[000000] ; R2[000000] >>> DIV R2,R0 >>>
PSW[007] ; R0[000000] ; R1[000000]
PSW[017] ; R0[100000] ; R1[000000] ; R2[000000] >>> DIV R2,R0 >>>
PSW[007] ; R0[100000] ; R1[000000]
PSW[017] ; R0[100000] ; R1[000000] ; R2[100000] >>> DIV R2,R0 >>>
PSW[002] ; R0[100000] ; R1[000000]
PSW[017] ; R0[100001] ; R1[000000] ; R2[100001] >>> DIV R2,R0 >>>
PSW[002] ; R0[100001] ; R1[000000]
PSW[017] ; R0[100001] ; R1[000000] ; R2[077777] >>> DIV R2,R0 >>>
PSW[012] ; R0[100001] ; R1[000000]
PSW[017] ; R0[177777] ; R1[000000] ; R2[000001] >>> DIV R2,R0 >>>
PSW[012] ; R0[177777] ; R1[000000]
PSW[017] ; R0[177777] ; R1[000000] ; R2[177777] >>> DIV R2,R0 >>>
PSW[002] ; R0[177777] ; R1[000000]
PSW[017] ; R0[177776] ; R1[000000] ; R2[000002] >>> DIV R2,R0 >>>
PSW[012] ; R0[177776] ; R1[000000]
PSW[017] ; R0[177776] ; R1[000000] ; R2[177776] >>> DIV R2,R0 >>>
PSW[002] ; R0[177776] ; R1[000000]
PSW[017] ; R0[133334] ; R1[000000] ; R2[044444] >>> DIV R2,R0 >>>
PSW[012] ; R0[133334] ; R1[000000]
PSW[017] ; R0[133334] ; R1[000000] ; R2[133334] >>> DIV R2,R0 >>>
PSW[002] ; R0[133334] ; R1[000000]
.
Если младшее слово делимого нулевое, а старшее отрицательное и по модулю равно делителю, то тогда деление вместо переполнения даёт нулевой результат.
Ну в этом случае результат равен 65536 или -65536, а остаток нулевой.
Ну в этом случае результат равен 65536 или -65536, а остаток нулевой.Резуьтат 0x10000 можно получить с положительным делимым, а глючит ВМ3 только с отрицательным.
Резуьтат 0x10000 можно получить с положительным делимым, а глючит ВМ3 только с отрицательным.
Интересно, как же это так разработчики промахнулись, ведь 1801ВМ2 нормально работает.
А может кто-нибудь пояснить как выход ~SEL у 1801ВМ3 работает? А то ковыряю сейчас ВП1-119, там вход с 35-ой ноги явно обращение к DRAM запрещает. И при активном HLTM вроде некорректируемые ошибки памяти зависание не вызывают - игнорируются.
А может кто-нибудь пояснить как выход ~SEL у 1801ВМ3 работает?
Он, по идее, устанавливает активный низкий уровень при обращении к памяти пультового режима, т.е. к ПЗУ и СОЗУ. По диаграммам, я помню, он становился активным при переходе процессора в режим HALT и снимался только при обращении к основной памяти через "окно" и к странице ввода/вывода.
- - - Добавлено - - -
А HLTM - это индикатор режима HALT, он ещё на светодиодик на панели выводится.
- - - Добавлено - - -
И при активном HLTM вроде некорректируемые ошибки памяти зависание не вызывают - игнорируются
А что, если случается некорректируемая ошибка памяти, то 1801ВП1-119 не формирует RPLY?
- - - Добавлено - - -
А что, если случается некорректируемая ошибка памяти, то 1801ВП1-119 не формирует RPLY?
Почитал ТО, оказывается так это и делается.
Он, по идее, устанавливает активный низкий уровень при обращении к памяти пультового режима, т.е. к ПЗУ и СОЗУ. По диаграммам, я помню, он становился активным при переходе процессора в режим HALT и снимался только при обращении к основной памяти через "окно" и к странице ввода/вывода.
Да, потестил на реальном процессоре - если в пультовом режиме виртуальный адрес обращения <1000008, то SEL активный, если >=1000008 - то деактивируется. Причем валидное значение обеспечивается только во время выдачи адреса на момент активации SYNC. Вообще логично, позволяет выполнять внешним схемам дешифрацию физического адреса, и понять куда реально процессор обращается, например, по физическому 177768 - к пульту или основному DRAM. Что-то долго до меня доходит :)
А HLTM - это индикатор режима HALT, он ещё на светодиодик на панели выводится.
Меня удивило что детектор ошибок в этом режиме отключается. Впрочем, МС1201.03 вообще имеет режим работы с отключенной коррекцией.
Меня удивило что детектор ошибок в этом режиме отключается. Впрочем, МС1201.03 вообще имеет режим работы с отключенной коррекцией.
А это сделано скорее всего для теста памяти. Тут надо смотреть прошивку, как сделан тест памяти - в режиме HALT, или он копируется в ОЗУ и уже делается из защищенного режима. Хотя в том же ТО написано, что периодически надо отключать блок коррекции и проводить тест памяти для выявления сбойных микросхем.
А что, если случается некорректируемая ошибка памяти, то 1801ВП1-119 не формирует RPLY?
Угу, именно.
Эта 119-ая вообще полтора года отлеживалась в виде "нечеловеческой схемы", там было сотни полторы элементов 3ИЛИ-НЕ и 4ИЛИ-НЕ, которые были связаны между собой весьма неочевидным образом, и никак не получалось из них что-то вменяемое соорудить. Появился опыт с 1801ВМ3, стало чуть понятнее назначение сигналов, удалось выявить группы локальных связей между этими 3/4ИЛИ-НЕ и сформировать модули по 3 или 4 штуки таких элементов. Оказалось что это D-триггеры с синхронным тактом и асинхронным сбросом, в итоге вместо бессмысленной кучи получилось штук 30 триггеров, связей стало на порядок меньше, в итоге удалось нарисовать "человеческую схему".
Меня удивило что детектор ошибок в этом режиме отключается. Впрочем, МС1201.03 вообще имеет режим работы с отключенной коррекцией.
Так же прошивка в режиме HALT считает доступное ОЗУ. А так насчитает всего 8 Кбайт при сбое на следующей странице.
Так же прошивка в режиме HALT считает доступное ОЗУ. А так насчитает всего 8 Кбайт при сбое на следующей странице.
Запись слова при включенной коррекции ошибок не вызывает чтения DRAM, следовательно, при наличии памяти по требуемому адресу запись не вызывает ошибок памяти и проходит всегда. Этот момент можно было бы использовать для теста.
Но и так критичного ничего особо не случилось - в HALT будет отключено только оповещение о некорректируемых ошибках, сама коррекция же останется.
Запись слова при включенной коррекции ошибок не вызывает чтения DRAM, следовательно, при наличии памяти по треубемому адресу запись проходит всегда. Этот момент можно было бы использовать для теста.
Посмотрел в 134-й прошивке, как определяется объем ОЗУ, действительно делается очисткой ячейки памяти, так что да, ошибки не будет.
.
Тест: DBE1.SAV (http://emulator.pdp-11.org.ru/misc/DBE1.zip) - проверяет возникновение двойной ошибки шины при зависании вектора TRAP4.
В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G :
.RUN DBE1
Double Bus Error test #1
000004/160000
TST @#160000
@ 160000
@R6/000774
@1000G
Program completed.
.
На ВМ3.
.RUN DBE1
Double Bus Error test #1
000004/160000
TST @#160000
@ 160000
@R6/000774
@1000G
Program completed.
.
В случае вылета в пульт
У меня как и положено sunset loop и стек, упершийся в начало...
.RU DBE1
Double Bus Error test #1
000004/160000
TST @#160000
160000
@R6/000000
@0/160000
00000002/000340
00000004/160000
00000006/000340
00000010/160000
00000012/000340
00000014/160000
00000016/000340
00000020/160000
00000022/000340
.
Тест: DBE2.SAV (http://emulator.pdp-11.org.ru/misc/DBE2.zip) - проверяет возникновение двойной ошибки шины при зацикливании TRAP250.
В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G.
Если зацикливание TRAP250 не вызывает двойную ошибку шины - результат такой:
.RUN DBE2
Double Bus Error test #2
177642/177400
177606/000000
000250/060000
000252/140340
177776/140340
USP /060000
TST @#060000
>>> Trap to 004 <<<
Program completed.
.
На ВМ3.
.RUN DBE2
Double Bus Error test #2
177642/177400
177606/000000
000250/060000
000252/140340
177776/140340
USP /060000
TST @#060000
@ 060000
@R6/001000
@1000G
Program completed.
.
А если набрать R6G результат такой:
.RUN DBE2
Double Bus Error test #2
177642/177400
177606/000000
000250/060000
000252/140340
177776/140340
USP /060000
TST @#060000
@ 060000
@R6/001000
@R6G>>> Trap to 004 <<<
Program completed.
.
На ВМ3В пульт выносит или вложенное прерывание 250, или TRAP4 при обработке прерывания. В документации вообще написано, что двойную ошибку вызывает зависание при обработке любого прерывания.
...
Тест: DBE3.SAV (http://emulator.pdp-11.org.ru/misc/DBE3.zip) - проверяет возникновение двойной ошибки шины, если страница векторов замаплена в пустоту.
В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G.
.RUN DBE3
Double Bus Error test #3
172340/177400
172300/077406
KSP /040000
TST @#160000
@ 040004
@R6/040000
@1000G
Program completed.
.
Тест: DBE1.SAV - проверяет возникновение двойной ошибки шины при зависании вектора TRAP4.
В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G :
Ну вот, теперь без MMU никуда. Так набил в пульте. Итого по 1801ВМ2:
R6 = 000770 R7 = 160002
000770/160002
000772/000000
000774/001004
000776/000200
На ВМ3.
.RUN HX2:DBE3
Double Bus Error test #3
172340/177400
172300/077406
KSP /040000
TST @#160000
@ 040004
@R6/040000
@1000G
Program completed.
В документации вообще написано,
Я выкладывал описание команд процессора у10.305.301 ТО1 если что. Эта документация?
Так как набивал DBE1 в пульте, то после загрузки вектора 4 проскочило прерывание таймера, т.к. в УКНЦ он по умолчанию включен.
С отключенным таймером так:
R6 = 000774 R7 = 160002
000774/001004
000776/000200
Эта документация?Да - она наиболее точная.
...
Тест: DBE4.SAV (http://emulator.pdp-11.org.ru/misc/DBE4.zip) - проверяет возникновение двойной ошибки шины, если страница векторов даёт TRAP250.
В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G.
.RUN DBE4
Double Bus Error test #4
172340/000000
172300/000000
KSP /040000
TST @#160000
@ 040004
@R6/040000
@1000G
Program completed.
.
Да - она наиболее точная.
Эта документация первого варианта процессора, т.к. 87года.
.RUN DBE4
Double Bus Error test #4
172340/000000
172300/000000
KSP /040000
TST @#160000 И молчёк... после мигающий курсор и всё.
Нажал кнопку УСТ.
@ 173000
@R6/040000
@1000G
Program completed.
Эта документация первого варианта процессора, т.к. 87года.И там сказано, что из четырёх регистров PARH на шине виден только один - значит так было всегда.
...
Тест: DBE7.SAV (http://emulator.pdp-11.org.ru/misc/DBE7.zip) - проверяет возникновение двойной ошибки шины при зависании вектора TRAP10.
В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G :
На эмулируемом процессоре ВМ2 результат такой:
.RUN DBE7
Double Bus Error test #7
000010/160000
MFPT
>>> Trap to 004 <<<
Program completed.
.
На ВМ3.
.RUN DBE7
Double Bus Error test #7
000010/160000
MFPT
@ 160000
@R6/000774
@1000G
Program completed.
.
Тест: DBE7.SAV - проверяет возникновение двойной ошибки шины при зависании вектора TRAP10.
В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G :
На эмулируемом процессоре ВМ2 результат такой:
На реальном 1801ВМ2 аналогично.
- - - Добавлено - - -
Я выкладывал описание команд процессора у10.305.301 ТО1 если что. Эта документация?
Да - она наиболее точная.
Если это она http://www.emuverse.ru/downloads/computers/DVK/docs/MC1201/MC1201.03_TO_2.djvu, то особенно умиляет описание на листе 48 команды SXTB.
На ВМ3Документация не врёт - позже надо будет проверить зависание при обработке программного прерывания.
...
Тест: DBE5.SAV (http://emulator.pdp-11.org.ru/misc/DBE5.zip) - проверяет поведение процессора, если при обработке TRAP4 запись в стек вызывает TRAP250.
В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G.
.RUN DBE5
Double Bus Error test #5
177602/000000
000006/140340
177776/140340
USP /040002
TST @#160000
>>> Trap to 250 <<<
Program completed.
.
- - - Добавлено - - -
Если это онаРечь про ЭТО (http://archive.pdp-11.org.ru/BIBLIOTEKA/DVKTXT/MC1201_0x/).
На ВМ3
.RUN DBE5
Double Bus Error test #5
177602/000000
000006/140340
177776/140340
USP /040002
TST @#160000
>>> Trap to 250 <<<
Program completed.
.
Речь про ЭТО.
Так это одно и то же, там djvu, а здесь pdf.
Так это одно и то же, там djvu, а здесь pdf.Там, где 310M - должно быть совсем другое.
...
Тест: DBE8.SAV (http://emulator.pdp-11.org.ru/misc/DBE8.zip) - проверяет возникновение двойной ошибки шины при зависании вектора IOT.
В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G.
Тест: DBE8.SAV - проверяет возникновение двойной ошибки шины при зависании вектора IOT.
Результат на 1801ВМ2 аналогичен, как и на тесте DBE7.
На ВМ3
.RUN DBE8
Double Bus Error test #8
000020/160000
IOT
@ 160000
@R6/000774
@1000G
Program completed.
.
Там, где 310M - должно быть совсем другое.
А что это за 310М?
.
Тест: SR0T2.SAV (http://emulator.pdp-11.org.ru/misc/SR0T2.zip) - проверяет блокировку регистра SR0 битом ошибки.
Добавят последующие прерывания свои биты в блокированный SR0 или нет.
Если нет - результат будет таким:
.RUN SR0T2
SR0 Abort bits test #2
SR0/000001
RO Abort
>>> Trap to 250 <<<
SR0/020007
PLF Abort
>>> Trap to 250 <<<
SR0/020007
ACF Abort
>>> Trap to 250 <<<
SR0/020007
Program completed.
.
- - - Добавлено - - -
А что это за 310М?Размер файла: ms1201_03_opisanie.rar (http://archive.pdp-11.org.ru/BIBLIOTEKA/DVKTXT/MC1201_0x/ms1201_03_opisanie.rar)
Размер файла: ms1201_03_opisanie.rar
А я говорил про описание системы команд, это тоже самое У10.305.301 ТО, только часть вторая.
результат будет таким:
Аналогично.
.
Тест: SR0T3.SAV (http://emulator.pdp-11.org.ru/misc/SR0T3.zip) - проверяет установку битов ошибок при "групповых" ошибках MMU.
На ВМ3.
.RUN SR0T3
SR0 Abort bits test #3
MOV #1,@#SR0
MOV #0,@#172302
TST @#30000
>>> Trap to 250 <<<
SR0/140003
MOV #1,@#SR0
MOV #2,@#172302
MOV #0,@#30000
>>> Trap to 250 <<<
SR0/060003
Program completed.
...
только часть вторая.
И я про часть вторую имел ввиду.
И я про часть вторую имел ввиду.А я про первую - именно там самая точная информация.
...
Тест: VM3M1.SAV (http://emulator.pdp-11.org.ru/misc/VM3M1.zip) - проверяет "диагностический" режим MMU.
На ВМ3.
.RUN VM3M1
1801VM3 MMU M-mode test #1
MOV #020000,@#020000
MOV #060000,@#060000
MOV #000200,@#172346
MOV #000401,@#SR0
MOV @#60000,R1
R1/020000
MOV #000000,@#SR0
MOV #020000,@#020000
MOV #060000,@#060000
MOV #000401,@#SR0
MOV #111111,@#060000
CLR @#SR0
020000/111111
060000/060000
Program completed.
.
На ВМ3Диагностический режим MMU оказался полноценным гибридным режимом, при котором все обращения в память идут в режиме MMU16, кроме обращений к первому и второму операндам, которые идут в режиме MMU, выбранном в SR3.
...
Тест: VM3M2.SAV (http://emulator.pdp-11.org.ru/misc/VM3M2.zip) - мапит нулевую страницу на первую в M-режиме MMU и обрабатывает прерывание.
На ВМ3
.RUN VM3M2
1801VM3 MMU M-mode test #2
MOV #000200,@#172340
MOV #000401,@#SR0
CLR (PC)
@ 001336
@R6/001000
@1000G
Program completed.
.
.RUN VM3M2
1801VM3 MMU M-mode test #2
MOV #000200,@#172340
MOV #000401,@#SR0
CLR (PC)
@ 001336
@R6/001000
@R6G>>> Trap to 004 <<< ;
Program completed.
Может статься, что работа через MMU идёт только в двухоперандных командах ( или не идёт при адресации (PC) )..
Тест: VM3M2a.SAV (http://emulator.pdp-11.org.ru/misc/VM3M2a.zip) - мапит нулевую страницу на первую в M-режиме MMU и обрабатывает прерывание.
На ВМ3
.RUN VM3M2A
1801VM3 MMU M-mode test #2a
MOV #000200,@#172340
MOV #001000,SP
MOV #001111,@#000774
MOV #001111,@#020774
MOV #000401,@#SR0
MFPT
@ 001364
@R6/001000
@1000G
Program completed.
.RUN VM3M2A
1801VM3 MMU M-mode test #2a
MOV #000200,@#172340
MOV #001000,SP
MOV #001111,@#000774
MOV #001111,@#020774
MOV #000401,@#SR0
MFPT
@ 001364
@R6/001000
@R6G
@ 000300
@1000G
Program completed.
.
Уже понятно, что в М-режиме обработка прерывания идёт не без проблем, а где именно слабина - выясним позднее.
...
Тест: VM3M3.SAV (http://emulator.pdp-11.org.ru/misc/VM3M3.zip) - проверяет работу однооперандных команд в M-режиме MMU.
На ВМ3.
.RUN VM3M3
1801VM3 MMU M-mode test #3
MOV #000000,@#020000
MOV #177777,@#060000
MOV #000200,@#172346
MOV #000401,@#SR0
TST @#60000
PSW/000004
CLR @#SR0
MOV #000000,@#020000
MOV #177777,@#060000
MOV #000200,@#172346
MOV #000401,@#SR0
INC @#60000
CLR @#SR0
020000/000001
060000/177777
Program completed.
.
Однооперандные команды работают по тем же правилам, что и двухоперандные. Получается, что в тесте VM3M2 проблему вызвала адресация (PC) ( или для чистого M-режима не надо включать MMU нулевым битом ).
...
Тест: VM3M4.SAV (http://emulator.pdp-11.org.ru/misc/VM3M4.zip) - проверяет TRAP250 в M-режиме MMU.
- - - Добавлено - - -
Тест: VM3M1a.SAV (http://emulator.pdp-11.org.ru/misc/VM3M1a.zip) - проверяет, нужен ли нулевой бит SR0 для активации M-режима MMU.
На ВМ3
.RUN VM3M4
1801VM3 MMU M-mode test #4
ACF Abort
>>> Trap to 250 <<<
SR0/100403
PLF Abort
>>> Trap to 250 <<<
SR0/040405
RO Abort
>>> Trap to 250 <<<
SR0/020407
Program completed.
.RUN VM3M1A
1801VM3 MMU M-mode test #1a
MOV #020000,@#020000
MOV #060000,@#060000
MOV #000200,@#172346
MOV #000400,@#SR0
MOV @#60000,R1
R1/060000
MOV #000000,@#SR0
MOV #020000,@#020000
MOV #060000,@#060000
MOV #000400,@#SR0
MOV #111111,@#060000
CLR @#SR0
020000/111111
060000/060000
Program completed.
.
Ситуация прояснилась - M-режим возможен только при выключенном MMU, причём это не полноценный гибридный режим, так как нет возможности читать источник с использованием MMU, а можно только читать/писать приёмник.
Теперь придётся переписать все тесты M-режима без установки нулевого бита SR0.
...
Тест: VM3M3a.SAV (http://emulator.pdp-11.org.ru/misc/VM3M3a.zip) - проверяет работу однооперандных команд в M-режиме MMU.
- - - Добавлено - - -
Тест: VM3M4a.SAV (http://emulator.pdp-11.org.ru/misc/VM3M4a.zip) - проверяет TRAP250 в M-режиме MMU.
- - - Добавлено - - -
Тест: VM3M2b.SAV (http://emulator.pdp-11.org.ru/misc/VM3M2b.zip) - обрабатывает прерывание в M-режиме MMU.
На ВМ3
.RUN VM3M3A
1801VM3 MMU M-mode test #3a
MOV #000000,@#020000
MOV #177777,@#060000
MOV #000200,@#172346
MOV #000400,@#SR0
TST @#60000
PSW/000004
CLR @#SR0
MOV #000000,@#020000
MOV #177777,@#060000
MOV #000200,@#172346
MOV #000400,@#SR0
INC @#60000
CLR @#SR0
020000/000001
060000/177777
Program completed.
.RUN VM3M4A
1801VM3 MMU M-mode test #4a
ACF Abort
>>> Trap to 250 <<<
SR0/100402
PLF Abort
>>> Trap to 250 <<<
SR0/040404
RO Abort
>>> Trap to 250 <<<
SR0/020406
Program completed.
.RUN VM3M2B
1801VM3 MMU M-mode test #2b
MOV #000200,@#172340
MOV #001000,SP
MOV #001111,@#000774
MOV #001111,@#020774
MOV #000400,@#SR0
MFPT
>>> Trap to 010 <<<
NOP
CLR @#SR0
000774/001364
020774/001111
MOV #000200,@#172340
MOV #000400,@#SR0
CLR (PC)
NOP
CLR @#SR0
Program completed.
.
.
Тест: VM3M5.SAV (http://emulator.pdp-11.org.ru/misc/VM3M5.zip) - проверяет команду MFPI в M-режиме MMU.
Тест: VM3M6.SAV (http://emulator.pdp-11.org.ru/misc/VM3M6.zip) - проверяет команду MTPI в M-режиме MMU.
На ВМ3
.RUN VM3M5
1801VM3 MMU M-mode test #5
MOV #020000,@#020000
MOV #040000,@#040000
MOV #060000,@#060000
MOV #050000,SP
MOV #011111,@#027776
MOV #011111,@#047776
MOV #000200,@#172344
MOV #000400,@#172346
MOV #000200,@#177646
MOV #030340,@#177776
MOV #000400,@#SR0
MFPI @#60000
CLR @#SR0
027776/020000
047776/000000
Program completed.
.RUN VM3M6
1801VM3 MMU M-mode test #6
MOV #020000,@#020000
MOV #040000,@#040000
MOV #060000,@#060000
MOV #050000,SP
MOV #030000,@#030000
MOV #050000,@#050000
MOV #000200,@#172344
MOV #000400,@#172346
MOV #000200,@#177646
MOV #030340,@#177776
MOV #000400,@#SR0
MFPI @#60000
CLR @#SR0
020000/030000
060000/060000
Program completed.
.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot