PDA

Просмотр полной версии : Особенности процессоров и устройств архитектуры PDP-11. Тесты. Диагностика.



Страницы : 1 2 3 4 5 6 [7] 8 9 10

MiX
01.02.2016, 20:45
Для установления истины написан тест


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

Patron
01.02.2016, 21:22
.

Новый тест: TDW2.SAV (http://emulator.pdp-11.org.ru/misc/TDW2.zip) - делает то же самое, но с предварительным сбросом контроллера.

MiX
01.02.2016, 22:21
Новый тест

0
1
2

0
1
2

3
4
5

0
1
2

0
1
2Результаты 2го раза такие же.

Patron
01.02.2016, 22:26
.

Ситуация прояснилась - любое обращение к регистру 174006 обнуляет позицию чтения/записи в буфере DW ( это пока не эмулируется ), и только запись в регистр 174016 даёт такой же эффект ( это уже эмулируется ).

form
02.02.2016, 05:49
А кто-нибудь может в двух словах рассказать как выполнять I/O на DW? Причем интересует 22 bit.

AFZ
02.02.2016, 07:41
А кто-нибудь может в двух словах рассказать как выполнять 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 В принципе, почти логично - сектор изменили, значит позиция в старом секторе стала неактуальной. А то, что любое обращение, а не только запись - вероятно, или недоглядели, или были сложности в реализации. Да и нелогично делать чтение регистра служебной зоны формата посередине передачи блока...

Vamos
02.02.2016, 12:47
Тоже вопрос или где можно почитать (желательно на русском), как процессор узнает по какому адресу находится подпрограмма прерывания выставленного аппаратурой? Если еще точнее, то вот например, есть регистры внешнего устройства к примеру 176570 и 176574 откуда процессор узнает что нужно перейти по вектору 374? Как этот механизм на железе работает, что выставляется на шину А/Д и т.п.?

form
02.02.2016, 12:58
как процессор узнает по какому адресу находится подпрограмма прерывания выставленного аппаратурой?
Ответ просто - он этого не узнает в принципе. Ему выставили вектор, он по нему выполнил прерывание, а была там подпрограмма обработки или нет - его не волнует :)

- - - Добавлено - - -


Как этот механизм на железе работает, что выставляется на шину А/Д и т.п.?
Можно взять например users guide по KDJ11-B (первое что на память пришло), там подробно все это расписно.

- - - Добавлено - - -

Вот здесь (http://ftp.vim.org/NetBSD/misc/ross/qbus/) еще вроде было про это.

Vamos
02.02.2016, 13:14
Ему выставили вектор, он по нему выполнил прерывание
Т.е. аппаратура висящая на адресах 176570 - 176576 выставляет сигнал прерывания и на шину выставляется адрес вектора? или адрес вектор процессор читает из 176576 по сигналу прерывания? где, чем, определяется приоритет?

Можно взять например users guide по KDJ11-B (первое что на память пришло), там подробно все это расписно
Можно здесь, не очень подробно, сам механизм, мне пока не понятно.

AFZ
02.02.2016, 13:28
Т.е. аппаратура висящая на адресах 176570 - 176576 выставляет сигнал прерывания и на шину выставляется адрес вектора? или адрес вектор процессор читает из 176576 по сигналу прерывания? где, чем, определяется приоритет? Загляни в книжку "Центральный процессор М2", ссылку давали недавно в теме "ДВК-УКНЦ поиск файлов". Коротко - ВП1-065 по адресу 176560, допустим, выставляет К ТПР Н, в ответ сначала выдается К ВВОД Н, по которому все подключенные фиксируют состояние своего триггера запроса прерывания и, если он установлен, перекрывают дальнейшее прохождение К ППР Н. Через несколько сотен нс выдается сигнал К ППР Н, первый по корзине с включенным триггером запроса прерывания выдаст на К ДА02-15 Н код вектора прерывания (в нашем случае - 360) и К СИП Н. Процессор считывает этот код, интерпретирует его, как адрес вектора и достает оттуда PC, потом, прибавив к нему двойку, достает приоритет. И вперед.Остальные устройства (дальше по корзине) сигнал К ППР Н не получат - наш ВП1-065 его перекрыл.

form
02.02.2016, 13:43
Остальные устройства (дальше по корзине) сигнал К ППР Н не получат - наш ВП1-065 его перекрыл.
Добавлю также, что если никто не ответит вектором вовремя - это вполне штатная ситуация и проц просто посчитает, что прерывания не требуется, однако на некоторых процах (ВМ2 например) будет останов проца по ошибке.

Vamos
02.02.2016, 14:08
потом, прибавив к нему двойку, достает приоритет. И вперед.Остальные устройства (дальше по корзине) сигнал К ППР Н не получат - наш ВП1-065 его перекрыл.
А смысл в приоритете, если приоритет определяется расположением в корзине?
Если нет корзины должен быть арбитр приоритета или как это в "железе" сделано?

AFZ
02.02.2016, 14:08
Добавлю также, что если никто не ответит вектором вовремя - это вполне штатная ситуация и проц просто посчитает, что прерывания не требуется, однако на некоторых процах (ВМ2 например) будет останов проца по ошибке. Э-60 тоже остановится. По M выдаст единицу.

form
02.02.2016, 14:11
А смысл в приоритете, если приоритет определяется расположением в корзине?
Так он определяется только для старого железа, не знающего про приоритет. Для более нового есть правила позиционно-независимого реагирования.

AFZ
02.02.2016, 14:16
А смысл в приоритете, если приоритет определяется расположением в корзине?
Если нет корзины должен быть арбитр приоритета или как это в "железе" сделано? А у "больших" процессоров, включая ВМ3, не одна, а четыре линии запроса прерываний - К ТПР4 Н - К ТПР7 Н. Соответственно, если приоритет процессора, допустим, 5 (240), то запросы прерывания К ТПР4 Н и К ТПР5 Н будут ждать, а К ТПР6 Н или К ТПР7 Н будут приняты.

- - - Добавлено - - -

Правда, если начата обработка запроса К ТПР6 Н, а раньше по корзине окажется ожидающий обслуживания запроса К ТПР4 Н, то обработается он, но это уже издержки...

form
02.02.2016, 14:24
Правда, если начата обработка запроса К ТПР6 Н, а раньше по корзине окажется ожидающий обслуживания запроса К ТПР4 Н, то обработается он, но это уже издержки...
Тут уже вступит в силу реакция самих устройств. Устройство приоритета 4 не должно реагировать на ответ если выставлены IRQ5 или IRQ6, устройство 5 приоритета не должно реагировать на ответ если выставлен IRQ6; устройство 6 приоритета не должно реагировать если выставлен IRQ7.

AFZ
02.02.2016, 14:28
Тут уже вступит в силу реакция самих устройств. Устройство приоритета 4 не должно реагировать на ответ если выставлены IRQ5 или IRQ6 приоритета, устройство 5 приоритета не должно реагировать на ответ если выставлен IRQ6; устройство 6 приоритета не должно реагировать если выставлен IRQ7. Угу, только бывают устройства, которые ничего не зают об IRQ5-7. Та же плата В21 или И7. Кстати, у кого схемы 1201.03/04 под рукой, гляньте, как там с проверкой IRQ5-7 для набортного ВП1-065.

form
02.02.2016, 14:31
устройства, которые ничего не зают об IRQ5-7
Бывают. Их просто желательно ставить в конец цепочки.

Vamos
02.02.2016, 14:33
Не понимаю. Если нет корзины, два устройства с разным приоритетом выставили ТПР одновременно, то как процессор узнает у кого приоритет выше если ему надо сначала считать вектор? Или это уже зависит от скорости реакции на сигнал ППР, а если и здесь одновременно?

AFZ
02.02.2016, 14:33
Бывают. Их просто желательно ставить в конец цепочки. Это-то понятно. Только вот как там с набортным ВП1-065 ? Впрочем, штатных для ДВК устройств с 5-7-м приоритетами в природе не существует...

form
02.02.2016, 14:34
Правила позиционно-независимой работы:
Уровень Выставляется Мониторится
4 TIRQ4 RIRQ5, RIRQ6
5 TIRQ4, TIRQ5 RIRQ6
6 TIRQ4, TIRQ6 RIRQ7
7 TIRQ4, TIRQ6, TIRQ7

AFZ
02.02.2016, 15:19
Не понимаю. Если нет корзины, два устройства с разным приоритетом выставили ТПР одновременно, то как процессор узнает у кого приоритет выше если ему надо сначала считать вектор? Или это уже зависит от скорости реакции на сигнал ППР, а если и здесь одновременно? ППР идет через все устройства последовательно. То есть их два: IACKI и IACKO. Обычно, сигнал IACKI сразу транслируется на IACKO. Если требуется прерывание, то по сигналу К ВВОД Н запрос фиксируется в отдельном триггере, который запрещает дальнейшую трансляцию (отключает IACKO) и направляет его (IACKI) в схему выдачи вектора.

- - - Добавлено - - -


Не понимаю. Если нет корзины На каждой плате, если там несколько устройств, то у них прохождение сигнала ППР также должно идти последовательно. Цепочка начинается с выхода IACKO процессора, сигнал с которого идет на IACKI первого устройства, с его IACKO на IACKI второго, и т.д. Если цепочка кончилась, она выдается на контакт К ППР0 Н этой платы. Если плата не процессорная, то она начинается с контакта К ППРI Н. Поэтому из запросивших прерывание всегда сработает только одно устройство - ближайшее к процессору.

- - - Добавлено - - -


Правила позиционно-независимой работы: А для этого нужна логическая схемка, навскидку, не очень простая, одной 155ЛА3 не отделаешься. И я что-то не припомню таких в окрестностях набортного ВП1-065 на 1201.03/04. Сама же 065-я ничего подобного не умеет.

Patron
02.02.2016, 18:34
.

Новый тест: 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.

.

form
02.02.2016, 18:58
проверяет, как влияет зависание на выполнение автоинкремента регистра.
На 11/83 также. Согласно списка различий регистры не меняются только для 11/44, 11/04 и 11/34 (интересно как на ВМ3 и СМ1420).
Также полезно добавить тест когда PC содержит несуществующий адрес: здесь поведение отличается от обычных регистров: не меняется только для 11/35 и 11/40.

Vslav
02.02.2016, 19:00
Исключение по low SP в режиме пульта: [http://s020.radikal.ru/i702/1602/38/2bd071d16709t.jpg (http://s020.radikal.ru/i702/1602/38/2bd071d16709.png)]

form
02.02.2016, 19:00
И кстати тест словного обращения к нечетному адресу интересен - в таблице и такое есть.

Patron
02.02.2016, 19:19
тест словного обращения к нечетному адресу интересенНовые тесты: T4REG2.SAV (http://emulator.pdp-11.org.ru/misc/T4REG2.zip) и T4REG3.SAV (http://emulator.pdp-11.org.ru/misc/T4REG3.zip) - проверяют адресацию типа @(R2)+ и автоинкремент при словном обращении к нечётным адресам.

form
02.02.2016, 19:23
.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.

.

Patron
02.02.2016, 19:49
.

Новый тест: 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.

.

form
02.02.2016, 20:01
.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)
Хм... Это как? :)

Patron
02.02.2016, 20:17
Это как?Чтобы не рисовать там непонятные xxx - оставил то значение смещения, которое есть в тесте у оригинального кода команды до его копирования в R0.

- - - Добавлено - - -



Mov (PC)+, R0
Mov R0, 240(PC)
Mov R0, @#157776
Jmp @#157776

form
02.02.2016, 20:23
Чтобы не рисовать там непонятные xxx - оставил то значение смещения, которое есть в тесте у оригинального кода команды до его копирования в R0.
Так команда два слова занимает, а копируется одно причем в последнее слово памяти.

- - - Добавлено - - -

Или цель была как раз проверить команду которая частично не вместилась?

Patron
02.02.2016, 20:28
Или цель была как раз проверить команду которая частично не вместилась?Конечно. Ведь если PC инкрементится даже при невыборке смещения, то после успешной выборки смещения - PC по-любому уже будет инкрементирован.

form
02.02.2016, 20:34
На ВМ3:
55840 55841

Patron
02.02.2016, 20:39
На ВМ3А вот на ВМ3 - тест tipc.sav (http://pdp-11.org.ru/~form/files/pdp-11/tipc.sav) весьма актуален.

form
02.02.2016, 20:53
tipc сейчас проверим, а T4* на Э60 (M2) проверить не удалось - на имеющейся машине памяти 14KW, а тесты обращаются к памяти выше... Тамже:
TIPC
001036 TST @#160000 ;PC=001042
001134 MOV #160000,PC ;PC=160002

- - - Добавлено - - -

Позже соберусь с силами еще сделаю тест при обращении в память без доступа.

- - - Добавлено - - -

Еще ВМ3... TIPC: 1042, 160000
55843

Patron
02.02.2016, 21:01
Позже соберусь с силами еще сделаю тест при обращении в память без доступа.Зависание прерывает микропрограмму позже, чем ошибка MMU, поэтому результат для ВМ3 не должен отличаться.

form
02.02.2016, 21:07
Зависание прерывает микропрограмму позже, чем ошибка MMU, поэтому результат для ВМ3 не должен отличаться.
Ну мы уже знаем, что в принципе штатно бывает разное поведение при MMU fault, соответственно хочется проверить все...

MiX
02.02.2016, 23:16
Если ещё актуально, то вот:
На ВМ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

form
03.02.2016, 13:06
Кстати еще тест (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

.

Patron
03.02.2016, 15:12
.

Новый тест: 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.

.

form
03.02.2016, 15:29
на любых машинах
На некоторых (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)

Patron
03.02.2016, 17:21
.

Не так давно мы удивлялись, почему в 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.

.

form
03.02.2016, 17:55
.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 - какая реакция будет.

Patron
03.02.2016, 18:34
Инетерсно все варианты битов перебратьВ документации по ВМ3 написано, что моды определяются только битами 15 и 13, но если BIT_14 отличается от BIT_15, то при включённом MMU занесение такой комбинации вызовет TrapTo_250. Что будет, если в такой же ситуации только BIT_12 отличается от BIT_13 - неизвестно.

form
03.02.2016, 19:45
На эмулируемой ДВК-3 результат такой
Когда уже первая бета будет? :)

- - - Добавлено - - -

На ВМ3:
.RU MVPS
;PSW=170000, @#177776=123456
MFPS R1 ;R1=000056
MTPS #17 ;PSW=170001, @#177776=123417

.
Интересный результат получился. То есть получается, что бит C устанавливается в PSW всегда по MTPS, а потом команда уже выполняет байтовую запись по виртуальному 177776. Ну и читает опять таки с виртуального адреса (в данном случае 160000 отмаплен в физические 40000 для усер моды).

Patron
03.02.2016, 20:01
.

Новый тест: PSW1.SAV (http://emulator.pdp-11.org.ru/misc/PSW1.zip) - проверяет байтовую запись в PSW по адресу 177776.

Запускать на машинах с диспетчером памяти.

form
03.02.2016, 20:07
.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
Честно говоря навскидку даже не скажу что получится из этого :)

Patron
03.02.2016, 20:11
MOV #177777,@#177776
177776/001346
Это на ВМ3 такой результат ?

form
03.02.2016, 20:15
Честно говоря навскидку даже не скажу что получится из этого
Вот что я имею в виду:
.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 такого не будет.

Patron
03.02.2016, 20:25
На ВМ3 такого не будет.Перезалил на вариант без R5.

form
03.02.2016, 20:31
.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 бит.

MiX
04.02.2016, 01:17
Тесты на ВМ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.

Patron
04.02.2016, 15:49
.

Новый тест: 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.

.

form
04.02.2016, 15:56
.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.

.

Patron
04.02.2016, 16:16
CLR @#177776
BISB #000300, @#177777
177776/140000
Похоже, что хотя MOVB на 11/83 использует цикл DATOB и поэтому при обращении к старшему байту PSW не затирает изменения признаков в младшем байте PSW - модифицирующие байтовые команды ( типа BISB ) используют цикл DATIO и поэтому признаки в младшем байте PSW копируются из "прошлой версии" содержимого PSW.

form
04.02.2016, 16:21
.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

.

Patron
04.02.2016, 16:28
TEST.MACТочно. При операции BISB с младшим байтом - в старшем байте PSW ничего "по волшебству" не меняется, поэтому цикл DATIO не портит PSW, но при операции BISB со старшим байтом PSW - установившиеся по итогам операции признаки в младшем байте PSW затираются в фазе записи цикла DATIO.

form
04.02.2016, 16:34
DATIO
В таблице различий есть "MOV использует только DATO в последнем цикле" (23, 24, 34, 03, 35, 45, 70, 60, J11).
Для 04, 05, 10, 15, 20 - DATIP и DATO
(написал как в доке, видимо имеется в виду DATIO поскольку DATIP - цикл PMI).

Patron
04.02.2016, 16:39
В таблице различий есть "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

form
04.02.2016, 16:44
.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

.

Patron
04.02.2016, 17:01
Получается, что или 11/83 всегда эмулирует байтовые циклы через словные, или что цикл DATIO используется байтовыми командами только при работе с PSW ( специально - чтобы случайно не повлиять на содержимое соседнего байта ).

- - - Добавлено - - -

Интересно - учтена ли такая особенность 11/83 в SIMH и E11 ..

form
04.02.2016, 17:09
Получается, что или 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>

Patron
04.02.2016, 17:19
Надеюсь, что реальный ВМ3 так не мудрит, ведь иначе придётся при эмуляции всех циклов с записью байта - вылавливать обращение к физическим адресам PSW и устанавливать флаг запрета модификации признаков.

form
04.02.2016, 18:00
Надеюсь, что реальный ВМ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.

.

Patron
04.02.2016, 18:57
.

Новый тест: 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.

.

form
04.02.2016, 19:24
.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: не, видимо до него дело просто не доходит...

Patron
04.02.2016, 19:27
Висит. Останов с пульта.Обработчик TrapTo_4 вызывает подпрограмму, обращающуюся к странице I/O - и обращение вызывает новый TrapTo_4.

Но в векторе 06 записано 0340 - разве в обработчике страница I/O не должна мапиться куда надо..

- - - Добавлено - - -


Вобщем как раз в RESETе все дело видимоВсе предыдущие тесты тоже сбрасывают MMU через RESET.

form
04.02.2016, 19:42
Все предыдущие тесты тоже сбрасывают 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 проверить.

Patron
04.02.2016, 19:54
Перезалил исправленную версию: PSW3.SAV (http://emulator.pdp-11.org.ru/misc/PSW3.zip).

form
04.02.2016, 20:05
.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 видимо.

Patron
04.02.2016, 20:07
MTPS #000
>>> Trap to 004 <<<
177776/140345Значит - признаки устанавливаются по аргументу MTPS, а не по записываемому в PSW значению.

MiX
04.02.2016, 20:09
Тесты на ВМ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.

form
05.02.2016, 12:35
Значит - признаки устанавливаются по аргументу 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

.

Patron
05.02.2016, 16:34
.

Новый тест: 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.

.

form
05.02.2016, 16:55
.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...

Patron
05.02.2016, 17:05
.

Перезалил новую версию теста: 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.

.

form
05.02.2016, 17:11
.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.

.

Patron
05.02.2016, 18:47
.

Новый тест: PSW5.SAV (http://emulator.pdp-11.org.ru/misc/PSW5.zip) - выводит содержимое SR0 и SR2 после прерывания при неправильных комбинациях битов моды.

Запускать на машинах с диспетчером памяти.

form
05.02.2016, 18:55
На ВМ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.

.

Patron
05.02.2016, 19:01
На ВМ3:
MOV #-1,@#KISAR0 ;KISAR0 = 007777Это потому что обнулён флаг режима 22 бит.

Можно добавить в тест запись -1 в PAR как в режиме 18 бит, так и в режиме 22 бит.

form
05.02.2016, 19:08
MOV #-1,@#KISAR0 ;KISAR0 = 007777
А вот это интересный результат. Похоже пока 22 битный режим не включишь PARы не воспринимают значения за пределами 18 бит на ВМ3...

Patron
05.02.2016, 19:12
А вот это интересный результат. Похоже пока 22 битный режим не включишь PARы не воспринимают значения за пределами 18 бит на ВМ3...Такова сила эмуляции PDP-11/34.

Ещё можно проверить, обнуляются ли старшие биты в PAR при переходе в режим 18 бит - или только скрываются, а при возврате в режим 22 бита опять становятся видны.

form
05.02.2016, 19:51
Такова сила эмуляции 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
@

Patron
05.02.2016, 19:58
получается вот такая штукаТипа, в режимах HALT, MMU16 и MMU22 - доступны все биты PAR, а в режиме MMU18 - старшие биты PAR изолированы от шины.

form
05.02.2016, 20:37
а в режиме MMU18 - старшие биты PAR изолированы от шины
Я в MMU16 сейчас тестил - тоже читает младшие.

- - - Добавлено - - -


На эмулируемой ДВК-3
Эмулятор-то как-нибудь можно пощупать для ускорения процесса тестирования? :)

Patron
05.02.2016, 20:45
Эмулятор-то как-нибудь можно пощупать для ускорения процесса тестирования?Там щупать пока нечего.

form
05.02.2016, 21:10
ВМ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

.

Patron
05.02.2016, 21:26
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

form
05.02.2016, 21:32
Есть смысл ещё проверить, пишутся ли старшие биты в 18-битном режиме
Так проверено - пишутся. Сначала пишется в 18 (первая цифра), потом включается 22 и ничего не пишется (2 цифра), потом снова пишется (третья) и выключается 22 (4 цифра).
То есть при выключенной 22-битной адресации только чтение ограничивается.

Patron
05.02.2016, 21:46
при выключенной 22-битной адресации только чтение ограничиваетсяЭто заставляет иначе взглянуть на начальные значения PAR (http://zx-pk.ru/showthread.php?t=18184&p=853562&viewfull=1#post853562).

form
05.02.2016, 21:59
начальные значения PAR
Касаемо начальных значений MMU.
Про KDJ11-B написано, что при включении значение PARов неопределено, не сбрасывается ни по ресету ни по консольному старту. Если включиться с выпаданием в пульт там 177777 у меня. На ВМ3 довелось посмотреть только после включения и загрузки SJ (VM нету) - содержимое напоминало код программы, но сильно не приглядывался.

MiX
06.02.2016, 00:59
Тесты на ВМ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.

Patron
06.02.2016, 14:28
.

Новая версия теста: 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.

.

form
06.02.2016, 15:44
выводит значения 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 выводить

Patron
06.02.2016, 15:49
А тут получается за неимением вариантов пытается запихать в USP, а потом спохватывается и посреди процесса вылетает?В 1801ВМ3 мода выбирается только одним битом, но если соседний отличается - при мапинге происходит аборт.

Надо будет проверить, происходит ли у ВМ3 аборт при обращении к неправильной моде без мапинга :



Mov #020000, @#177776
MFPI R0
MFPI SP

form
06.02.2016, 15:58
В 1801ВМ3 мода выбирается только одним битом, но если соседний отличается - при мапинге происходит аборт.
Похоже второе мое предположение верно: SP выбирается по одному биту, делается запись в него и вызывает аборт - нет соответствующих PAR/PDR, но декремент сохраняется (хотя с MP STT наверное всегда так - не случайно в MMR1 возвращаются значения регистров и оффсетов для отката).

- - - Добавлено - - -


ВМ3 аборт при обращении к неправильной моде без мапинга
Похоже он и есть всегда без мапинга. То есть SP выбирается старшим битом, а пары PAR/PDR нету.

MiX
06.02.2016, 16:02
Новая версия теста
Результаты теста на ВМ3 аналогичны как у form.

form
06.02.2016, 16:02
Надо будет проверить
ДВК на той стороне ушла в неконтролируемый полет - пока пнуть ее некому...

MiX
06.02.2016, 16:11
ДВК на той стороне ушла в неконтролируемый полет - пока пнуть ее некому...
Ну так отправь команду 000005 или 000000.

form
06.02.2016, 16:13
Ну так отправь команду 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

.

Patron
06.02.2016, 16:17
.

Новый тест: 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.

.

form
06.02.2016, 16:25
.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...

MiX
06.02.2016, 16:30
Кому? Работающей и зависшей в Казахстане ДВК?
Да. ДВК/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.

form
06.02.2016, 16:48
ДВК/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...

MiX
06.02.2016, 16:48
Неправда. У большинства PDP-11 есть такое понятие как sunset loop - состояние из которого нельзя выйти никак кроме останова с консоли. К примеру в @#16 установлен бит T, в @#242 прописан приоритет ниже чем запрашивается в @#17777772 итд...
У ДВК - да - чаще выпадание в пульт.
Про PDP Вам виднее. Останов с консоли что подразумевается?

Выход из WAIT - только прерывание
Ну так если прерывание не приходит, значит будет ждать его вечно.

form
06.02.2016, 17:00
Про PDP Вам виднее. Останов с консоли что подразумевается?
Перкключателем ENABLE/HALT пульта или BREAK с консольного терминала для Q-Bus машин где такая возможность есть. Как уже написал, речь также о советских машинах...


Ну так если прерывание не приходит, значит будет ждать его вечно.
Именно так. Соответственно если приоритет процессора в 7 установлен (или просто установлен для ВМ2 к примеру), то WAIT ли там, бесконечный цикл ли, а выйти нельзя никак кроме останова машины... Или более прозаично: @#14 ссылается на команду RTI которая устанавливает бит T программе куда возвращается и даже приоритета 7 не нужно (подразумеваем что @#16 выставляет приоритет)...

- - - Добавлено - - -


000005
И на закуску способ завесить например из под SJ/SB/FB монитора (с оговорками): RESET, BR . :)
Всего же вариантов огромное количество - далеко не десятки...

Patron
06.02.2016, 17:04
.

Новый тест: 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.

.

form
06.02.2016, 17:11
проверяет автоинкремент регистра при зависании второго чтения косвенной адресации
Register Autoincrement TRAP4 test #4.

MOV #000000, R2
MOV #160020,(R2)
TST @(R2)+
>>> Trap to 004 <<< ; R2/000002

Program completed.

.

MiX
06.02.2016, 17:15
На эмулируемой ДВК-3 результат такой
Аналогично.

form
06.02.2016, 17:15
автоинкремент регистра при зависании
/44, /04, /34 по описанию не меняют регистр, правда написано только про mode 2.

Patron
06.02.2016, 17:17
/44, /04, /34 по описанию не меняют регистр, правда написано только про mode 2.ВМ3 по mode 2 тоже не меняет - вот и захотелось проверить mode 3.

form
06.02.2016, 17:24
ВМ3 по mode 2 тоже не меняет
Ну логично - видимо раз сама по себе выборка с автоинкрементом проблем не представляет, то и вопроса нет, но мало ли - с учетом того же ВМ3 я алгоритм проверки дополнительных фич MMU делал исходя из возможности поменять значение бита, а не из возможности установить его в MMR3...

- - - Добавлено - - -

Но кое-где mode 3 всеже может представлять сложность... Хотя и тут все логично ибо от mode 2 танцует...

Z 1 000000 010030 MOV R0,@(R0)+

form
06.02.2016, 19:16
T4REG5
Хм. Я где-то упустил этот тест, в теме не вижу...

- - - Добавлено - - -


Я где-то упустил этот тест
Но пока подтверждает предположение о том, что видимо при MMU failure всегда автоинк(дек)ремент выполняется. Иначе зачем огород с MMR1 городить... Хотя впрочем функционал MMR1 не исключает совместимости в случае если автоинк(дек)ремента не произошло...

UPD: расмотрел внимательнее - и так и так... Выходной инфы мало - нужен MMR1

Patron
06.02.2016, 19:23
Хм. Я где-то упустил этот тест, в теме не вижу...Там SP мапился неизвестно куда - пришлось тест удалить и начать дорабатывать.

form
06.02.2016, 19:26
и начать дорабатывать.
Ну как минимум вывод MMR1 полезен будет.

Patron
06.02.2016, 19:29
.

Новый тест: T4REG5.SAV (http://emulator.pdp-11.org.ru/misc/T4REG5.zip) - проверяет автоинкремент регистров в команде MTPI (R2)+ с неправильной предыдущей модой.

Запускать на машинах с диспетчером памяти.

form
06.02.2016, 19:38
.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).

MiX
06.02.2016, 19:39
Тест на ВМ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.

.

form
06.02.2016, 19:43
Тест на ВМ3
Вот тут интресно вставить
New250:
HALT

и посмотреть содержимое 17777574. По идее должно быть либо 26 либо 1026...

MiX
06.02.2016, 19:45
Вот тут интресно вставить
Тест в студию.

form
06.02.2016, 19:51
По идее должно быть либо 26 либо 1026...
У меня 26 получается если заменить (R2)+ на (R2).

- - - Добавлено - - -


Тест в студию.
Ждем тестов с выводом MMR1 :)
Ну или как я написал сделать и вручную посмотреть.

- - - Добавлено - - -


Ждем тестов с выводом MMR1
И MMR2 до кучи (и адреса команды которая трапнулась)... А то было там среди списка глюков ВМ3 что-то по теме. На моем MMU тесте вроде не вылезало пока ни у кого.

Patron
06.02.2016, 19:56
и посмотреть содержимое 17777574. По идее должно быть либо 26 либо 1026...У ВМ3 регистр SR1 всегда читается нулями.

form
06.02.2016, 19:59
У ВМ3 регистр SR1 всегда читается нулями.
Всегда или когда нет операций автоинк(дек)рементных?

- - - Добавлено - - -

Если он всегда читается нулями, то глюка с MMR2 в принципе быть не может ибо значение его эффективно становится бесполезным... Равно как и MMR0 впрочем (кроме управляющих битов).

Patron
06.02.2016, 19:59
Всегда или когда нет операций автоинк(дек)рементных?Он не реализован - всегда читаются нули.

form
06.02.2016, 20:49
Он не реализован - всегда читаются нули.
Ну в тестах (коли они претендуют на универсальность) всеже стоит выводить...
Если не реализован - это по сути убивает базовый функционал MMU (который сам DEC впрочем даже в Ultrix наверное не использовал [про Ultrix - предположение]).

- - - Добавлено - - -

Посмотрел на ВМ3 - да, MMR1 просто нули. Тогда ошибка с MMR2 чисто символическая получается (впрочем с ней [как и со всеми остальными кроме битов в MMR3] пока столкнуться не удалось).

Patron
06.02.2016, 20:50
.

Новый тест: SR0.SAV (http://emulator.pdp-11.org.ru/misc/SR0.zip) - проверяет текущие значения SR0 и SR2 при выключенном и включённом MMU.

Запускать на машинах с диспетчером памяти.

form
06.02.2016, 21:13
проверяет текущие значения 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.

.

Patron
06.02.2016, 21:24
Интересно, можно ли при выключенном MMU увидеть в SR0 что-то кроме нуля ..

- - - Добавлено - - -

И кроме старших битов, которые и при выключенном MMU наверняка можно записать.

form
06.02.2016, 21:27
при выключенном MMU увидеть в SR0 что-то кроме нуля
В теории биты 1-12 R/O, все остальные R/W. Надо попробовать вызвать ошибку и выключить методом BIC #1 и CLR на все случаи.

MiX
06.02.2016, 21:29
Тест на ВМ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.

form
06.02.2016, 21:34
старших битов, которые и при выключенном MMU наверняка можно записать.
Биты 13-15 всегда по идее можно записать - они в принципе R/W, хотя как правило их выставляет сам MMU. Суть теста который я предлагал выше - проверить поведение: запись 1 в любой из этих битов (не важно вручную или самим MMU) вызывает заморозку MMR2, MMR1 (ну тут не актуально) и битов 1-6 в SR0.

- - - Добавлено - - -

Неправильно прочитал текст выше, но суть та же - попробовать заморозить значения, выключить и посмотреть. А с учетом специфики ВМ3 также из пульта посмотреть.

- - - Добавлено - - -


Интересно, можно ли при выключенном MMU увидеть в SR0 что-то кроме нуля ..
Хотя это я уже пьян - я же сам выложил выше результат где видно, что из SR0 после записи 0 в него читается ненулевое значение. Так что суть вопроса сводится в гарантированной установке битов на ВМ3, отключении, чтении и проверки из пульта на всякий случай...

Patron
06.02.2016, 21:40
.

Новая версия теста: SR0.SAV (http://emulator.pdp-11.org.ru/misc/SR0.zip) - проверяет текущие значения SR0 и SR2 при выключенном и включённом MMU, выполняя команды в двух страницах памяти.

Запускать на машинах с диспетчером памяти.

form
06.02.2016, 21:42
Новая версия теста

.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 чтобы запустить итд... :)

MiX
06.02.2016, 21:47
Тест на ВМ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.

form
06.02.2016, 21:49
выполняя команды в двух страницах памяти
Кстати по описанию 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.

Patron
06.02.2016, 21:53
На ВМ3 живое значение SR0 показывает номер страницы предыдущей операции, а живое значение SR2 превышает "стандартное" на 2.

CodeMaster
06.02.2016, 21:54
Тест на ВМ3.

Я пропустил или забыл с чего начиналось 100 страниц назад, но эти все тесты из-за отсутствия надежды, что Vslav сделает реверс ВМ3 или тут какая-та другая цель?

Patron
06.02.2016, 21:59
эти все тесты из-за отсутствия надежды, что Vslav сделает реверс ВМ3 или тут какая-та другая цель?Реверс сам ответы не даёт, например - реверс ВМ1 сам по себе не выявил мега-глюк, а запущенные на V-модели тесты - мега-глюк выявили.

form
06.02.2016, 22:00
или тут какая-та другая цель?
Ну тесты не ориентированны чисто на ВМ3. Да и ждать реверса неизвестно сколько. А мне бы помог даже очень приблизительный эмулятор ибо удаленно отлаживаться на ДВК фактически нереально - все-равно нужен кто-то кого пинать на той стороне :)

Patron
06.02.2016, 22:07
Хотя живое значение SR0 у ВМ3 "отстаёт на одно обращение" - при очищении SR0 там "замораживается" то же значение с номером страницы регистра SR0, что и у 11/83.

form
06.02.2016, 22:22
живое значение 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 :)

Patron
06.02.2016, 22:25
Только с чем его сравнивать?11/83:

020000/ MOV (R2), R3 ; R3/000017

ВМ3:

020000/ MOV (R2), R3 ; R3/000003

form
06.02.2016, 22:28
11/83:
Код:
020000/ MOV (R2), R3 ; R3/000017
ВМ3:
Код:
020000/ MOV (R2), R3 ; R3/000003
Так опять таки - первое - страница (R2), второе - страница @PC.

Patron
06.02.2016, 22:28
Поэтому наверное и написано в доке, что значения имеют смысл только на момент заморозки - тогда они точно соответствуют обращению которое вызвало сбой...Да, без заморозки значения в SR0 и SR2 у ВМ3 "нетрадиционные".

form
06.02.2016, 22:30
Так что скорее разница в источнике информации, а это видимо зависит от реализации выборки команды и последующей ее обработки...

- - - Добавлено - - -


у ВМ3 "нетрадиционные"
Так традиционных и нету без заморозки - для 11/83 дока оговаривает только то, что заморожено - оба варианта правильные, один вы согласии с операндом, второй с PC. Все дело в алгоритме работы видимо - так же как с известным Rx,(Rx)+...

Patron
06.02.2016, 22:33
оба варианта правильныеДля SR2 живой вариант трудно назвать "правильным" - он весьма "нетрадиционный".

form
06.02.2016, 22:43
Для 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 же предвыборка идет несколько иначе. Ради интереса можно конечно переткнуть проц в первый слот, а память на место проца в третий, но в теории это скорее должно дать тот результат который и так есть :)

MiX
06.02.2016, 22:45
Тест на плате М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.

form
06.02.2016, 22:48
Тест на плате М6
Ну все также как у меня - MMR0 отражает операнд, MMR2 - PC команды. А MMU.SAV видимо совпадет (по значениям регистров) в момент ошибки.

- - - Добавлено - - -


MMU.SAV
К слову - прогнать бы раз пошла такая пьянка :)

MiX
06.02.2016, 22:53
К слову - прогнать бы раз пошла такая пьянка
Тест 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 ***

Patron
06.02.2016, 23:02
.

Новый тест: SR2.SAV (http://emulator.pdp-11.org.ru/misc/SR2.zip) - тестирует заморозку SR2 установкой старшего бита SR0.

Запускать на машинах с диспетчером памяти.

form
06.02.2016, 23:04
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 идут, но там и алгоритм определения другой.

form
06.02.2016, 23:11
Новый тест: 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.

.

MiX
06.02.2016, 23:18
Тест на ВМ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.

form
06.02.2016, 23:22
тестирует заморозку SR2 установкой старшего бита SR0
Ну и SR0 до кучи нужен.

MiX
06.02.2016, 23:34
А SH CONF тоже его как 11/34 опознает? Нет. PDP11/23.

RT-11 часы запускает? (если не запускать DAY при старте)Время стоит на месте (команда TIME).

form
06.02.2016, 23:40
PDP11/23
Об этом я не подумал. Классический 11/23 - 18 бит, но упградится до 11/23-PLUS - он 22 (причем если не ошибаюсь, пульт об этом так и не знает). Да и прошник 350 соответственно получается плюс - 22 бит и ничего больше.

Время стоит на месте
Это скорее всего таймер не включен переключателями БП. Для 11/23 неоднозначности нет - у него нету регистра состояния таймера. Когда есть неоднозначность на команду TIM KMON отвечает No clock. У меня так можно сделать если убрать CSR таймера с шины и включить принудительные прерывания. Надо кстати посмотреть как RSX на такую наглость отреагирует.

Patron
06.02.2016, 23:45
.

Новый вариант теста: SR2.SAV (http://emulator.pdp-11.org.ru/misc/SR2.zip) - выводит также SR0.

Запускать на машинах с диспетчером памяти.

form
06.02.2016, 23:51
Новый вариант теста: 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.

.

MiX
07.02.2016, 00:03
Тест на ВМ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 аналогичен.

form
07.02.2016, 00:56
Результат на М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 бит... или читает через свой маппинг...

Patron
07.02.2016, 01:02
раз дошло дело до PARов... Проверить читаются ли они полностью (при выключенном 22 бит) в режиме HALT или это пульт при чтении включает 22 бит... или читает через свой маппинг...Насколько я понимаю - в режиме HALT всегда видны все биты, потому что HALT-мапинг - 22-битный. Поэтому, при просмотре значений PAR в пульте - содержимое видно целиком, независимо от бита в SR3.

form
07.02.2016, 01:17
в режиме HALT всегда видны все биты, потому что HALT-мапинг - 22-битный
Ну да, свой маппинг, а вот тест про выборку команд из PARов интересно посмотреть: всегда ли выборка режется или при выборке инструкции все получится полностью...

Patron
07.02.2016, 15:58
.

Новый тест: PDPT3B.SAV (http://emulator.pdp-11.org.ru/misc/PDPT3B.zip) - проверяет потерю вектора прерывания в последовательности команд BIS #100,@#TTPS, BIC #100,@#TTPS.

Можно запускать на любых машинах.

При вылете в пульт можно нажать P для завершения программы.

form
07.02.2016, 16:01
Новый тест: PDPT3B.SAV - проверяет потерю вектора прерывания в последовательности команд BIS #100,@#TTPS, BIC #100,@#TTPS.
Ну у меня уже пробовали такое - потерянный вектор просто игнорируется как и документировано. А на ВМ3 интересно посмотрть.

MiX
07.02.2016, 16:12
Тест на ВМ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.

Alex_K
07.02.2016, 16:56
Тест на ВМ3.
А после вылета в пульт по команде M​, в качестве причины всё равно показывает HALT INSTRUCTION?

MiX
07.02.2016, 17:01
А после вылета в пульт по команде M​, в качестве причины всё равно показывает HALT INSTRUCTION?
Да.

Patron
07.02.2016, 17:05
.

При нажатии 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 это работало.

Alex_K
07.02.2016, 17:10
Возможно, что с ранней версией ВМ3 это работало.
Никогда ни с одной версией ВМ3 это не работало, в 134-й прошивке нет даже вызова подпрограммы, устанавливающей соответствующие значения в ячейке 77026.

yursav
10.02.2016, 21:42
Вопрос про выходные каскады шины адреса/данных 1801ВМ1, 1801ВМ2, 1806ВМ2, 1801ВМ3. Интересует, есть там верхний транзистор всё-таки (лог.1 активная) или нет (выход с ОК) или ещё какой вариант (слабая подтяжка с ограничением тока, мало ли ...).
Этот вопрос связан с основным вопросом - возможно ли подключать на ходу эти разряды к земле (цель - динамическое изменение выдаваемых ВМ адреса/данных внешней цепью) без какой-либо опасности сжечь выходные каскады, или схемотехника выходного каскада этого не позволяет?

Vslav
10.02.2016, 21:53
Вопрос про выходные каскады шины адреса/данных 1801ВМ1, 1801ВМ2
В этих микросхемах верхний транзистор есть, но, поскольку это n-MOS с одним питанием, то они слабенькие, со встроенным каналом, по документации - выдают вытекающий ток примерно 200мкА при выходном напряжении не менее 2.4В. Топологически - они там большую площадь занимают, если закоротить на землю, то выделяемая мощность должна распределиться, что сгорит - маловероятно. Но не думаю что это штатный режим.

yursav
11.02.2016, 15:29
Хм, освежил в памяти схемотехнику n-MOS - если верхний транзистор выходного каскада не управляется внутренней логикой микросхемы, а всегда висит затвором на питание в качестве динамической нагрузки, значит он априори спроектирован на работу на замыкание на 0 нижнего транзистора при выдаче лог.0, а значит также штатно будет работать и при любом внешнем замыкании на 0. Какая там схемотехника выходного каскада в 1801ВМ1 и 1801ВМ2, такая или другая?

И остаётся вопрос про 1806, которые КМОП - что у них в выходном каскаде, и про 1801ВМ3 - которые, скорее всего, имеют такой же выход, как в 1801ВМ1 и 1801ВМ2, но интересно, есть ли точная инфа?

Vslav
11.02.2016, 16:46
Хм, освежил в памяти схемотехнику 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)
Они как бы скомбинированы вместе в единую структуру.

MM
11.02.2016, 18:07
Реально при закоротке АД0 на общий 1801ВМ1 обеспечивает 1 ма ток КЗ на общий, или даже больше. При закоротке АД0 на питание - 15 ма или больше.
1806ВМ2 содержит встроенные 1564АП6 на линиях типа АД0 - т.е. ток КЗ выше в разы.

yursav
11.02.2016, 19:55
В буферах внешних выводов это не так.
Схема 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 размер транзисторов в выходном каскаде одинаковый?

Vslav
11.02.2016, 20:40
Интересно тогда ещё, у 1801ВМ1 и 1801ВМ2 размер транзисторов в выходном каскаде одинаковый?
Размеры примерно одинаковые, но это не показатель, важна еще куча параметров - степень легирования, толщина слоя оксида и прочее. Но рабочие токи, судя по документации, тоже примерно одинаковые. В своей конструкции я бы замыкать на землю выход не стал, нештатный это режим. Тем более, напряжение затвор-канал при заземлении канала растет, проводимость тоже растет, значит вырастет ток и выделяемая мощность, что приведет к локальному повышению температуры. А при разогреве полупроводника проводимость также растет, имеем положительную обратную связь. Кратковременное замыкание оно обычно выдерживает, а на постоянку - как повезет. Причем, если транзистор неудачно разрушится, то также может отказать и вход.

AFZ
14.02.2016, 07:12
Фрагмент схемы ВМ2, буфер вывода AD0:Стой-стой! Это же про Т121, да? Так там истоковый повторитель, т.е. при высоком уровне на его затворе и попытке подать низкий уровень на его исток через выходную ногу, ток может многократно возрасти, то есть вместо 200 мкА запросто окажется и 2мА, а то и 20. То есть коротким импульсом подать ноль можно, а дать статический уровень - так скорее всего сдохнет!..

Vslav
14.02.2016, 14:06
Стой-стой! Это же про Т121, да?
...
вместо 200 мкА запросто окажется и 2мА, а то и 20.

Именно так.

Patron
25.02.2016, 16:43
.

До сих пор неизвестно, в чём разница при делении нечётного регистра на процессорах ВМ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]

.

Alex_K
25.02.2016, 16:52
До сих пор неизвестно, в чём разница при делении нечётного регистра на процессорах ВМ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.

Patron
25.02.2016, 16:52
Ну уж про ВМ2 давно известно.Поэтому можно точно эмулировать результаты деления нечётного регистра на ВМ2.

А про деление нечётного регистра на ВМ3 пока известно только то, что его результаты как-то отличаются от результатов деления на ВМ2.

form
25.02.2016, 18:01
До кучи на 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]

.

MiX
26.02.2016, 10:47
На ВМ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]

Patron
26.02.2016, 14:15
На ВМ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

.

MiX
26.02.2016, 16:07
На ВМ3 результат такой:

.T2DIV

Тестирование правильности выполнения команд процессора:

Команда деления (частичный тест):
DIV (even) - ERROR: 0xC9A3 / 0x8921
DIV (odd) - ERROR: 0xD858 / 0xEBD8

.

Alex_K
26.02.2016, 17:04
На первом этапе надо проверить, будет ли упрощённый вариант расчёта контрольных сумм давать разные результаты на ВМ2 и ВМ3.
Это делает тест: T2DIV.SAV

На эмулируемом ВМ2 рзультат такой:
На реальном 1801ВМ2 также все OK.

Patron
27.02.2016, 12:24
.

Тест: 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

.

MiX
27.02.2016, 12:42
На ВМ3 результат такой:

.T4DIV

Тестирование правильности выполнения команд процессора:

Команда деления (частичный тест):

DIV R2,R1 - ERROR: 0x1B0B / 0x1C73

R0 - OK
R1 - OK
PSW - ERROR: 0x1F44 / 0x20AC

.

- - - Добавлено - - -

Patron, Желательно чтоб тест выводил данные в восьмеричной системе (так сказать, традиционно). :)

Patron
27.02.2016, 14:41
.

Тест: 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

.

MiX
27.02.2016, 15:26
На ВМ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

.

Alex_K
27.02.2016, 15:40
На ВМ3 результат такой:
Странно, кстати, некоторые результаты в TDIV10 имели другой результат. Например при делении на ноль нуля и минус единицы флаги N и Z не устанавливались.

- - - Добавлено - - -

Вообще складывается впечатление, что при арифметическом переполнении (ну и делении на ноль, как частном случае) флаги N и Z вообще не трогаются. Надо в тест перед командой DIV поставить команду CCC, и посмотреть, что получиться.

Patron
27.02.2016, 17:23
Вообще складывается впечатление, что при арифметическом переполнении (ну и делении на ноль, как частном случае) флаги 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.

Alex_K
27.02.2016, 17:29
Тест: 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]

MiX
27.02.2016, 17:38
На ВМ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]


.

Alex_K
27.02.2016, 19:05
На ВМ3 результат такой:
Как я понял, ВМ3 неправильно выполняет деление, если в качестве частного получается 0x10000 или 0xFFFF0000?

Patron
27.02.2016, 19:23
Как я понял, ВМ3 неправильно выполняет деление, если в качестве частного получается 0x10000 или 0xFFFF0000?Если младшее слово делимого нулевое, а старшее отрицательное и по модулю равно делителю, то тогда деление вместо переполнения даёт нулевой результат.

form
27.02.2016, 19:29
Особенно вдохновляет деление на 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]


.

Alex_K
27.02.2016, 19:42
Если младшее слово делимого нулевое, а старшее отрицательное и по модулю равно делителю, то тогда деление вместо переполнения даёт нулевой результат.
Ну в этом случае результат равен 65536 или -65536, а остаток нулевой.

Patron
27.02.2016, 20:03
Ну в этом случае результат равен 65536 или -65536, а остаток нулевой.Резуьтат 0x10000 можно получить с положительным делимым, а глючит ВМ3 только с отрицательным.

Alex_K
27.02.2016, 20:05
Резуьтат 0x10000 можно получить с положительным делимым, а глючит ВМ3 только с отрицательным.
Интересно, как же это так разработчики промахнулись, ведь 1801ВМ2 нормально работает.

Vslav
28.02.2016, 21:20
А может кто-нибудь пояснить как выход ~SEL у 1801ВМ3 работает? А то ковыряю сейчас ВП1-119, там вход с 35-ой ноги явно обращение к DRAM запрещает. И при активном HLTM вроде некорректируемые ошибки памяти зависание не вызывают - игнорируются.

Alex_K
28.02.2016, 22:54
А может кто-нибудь пояснить как выход ~SEL у 1801ВМ3 работает?
Он, по идее, устанавливает активный низкий уровень при обращении к памяти пультового режима, т.е. к ПЗУ и СОЗУ. По диаграммам, я помню, он становился активным при переходе процессора в режим HALT и снимался только при обращении к основной памяти через "окно" и к странице ввода/вывода.

- - - Добавлено - - -

А HLTM - это индикатор режима HALT, он ещё на светодиодик на панели выводится.

- - - Добавлено - - -


И при активном HLTM вроде некорректируемые ошибки памяти зависание не вызывают - игнорируются
А что, если случается некорректируемая ошибка памяти, то 1801ВП1-119 не формирует RPLY?

- - - Добавлено - - -


А что, если случается некорректируемая ошибка памяти, то 1801ВП1-119 не формирует RPLY?
Почитал ТО, оказывается так это и делается.

Vslav
28.02.2016, 22:59
Он, по идее, устанавливает активный низкий уровень при обращении к памяти пультового режима, т.е. к ПЗУ и СОЗУ. По диаграммам, я помню, он становился активным при переходе процессора в режим HALT и снимался только при обращении к основной памяти через "окно" и к странице ввода/вывода.
Да, потестил на реальном процессоре - если в пультовом режиме виртуальный адрес обращения <1000008, то SEL активный, если >=1000008 - то деактивируется. Причем валидное значение обеспечивается только во время выдачи адреса на момент активации SYNC. Вообще логично, позволяет выполнять внешним схемам дешифрацию физического адреса, и понять куда реально процессор обращается, например, по физическому 177768 - к пульту или основному DRAM. Что-то долго до меня доходит :)



А HLTM - это индикатор режима HALT, он ещё на светодиодик на панели выводится.
Меня удивило что детектор ошибок в этом режиме отключается. Впрочем, МС1201.03 вообще имеет режим работы с отключенной коррекцией.

Alex_K
28.02.2016, 23:05
Меня удивило что детектор ошибок в этом режиме отключается. Впрочем, МС1201.03 вообще имеет режим работы с отключенной коррекцией.
А это сделано скорее всего для теста памяти. Тут надо смотреть прошивку, как сделан тест памяти - в режиме HALT, или он копируется в ОЗУ и уже делается из защищенного режима. Хотя в том же ТО написано, что периодически надо отключать блок коррекции и проводить тест памяти для выявления сбойных микросхем.

Vslav
28.02.2016, 23:08
А что, если случается некорректируемая ошибка памяти, то 1801ВП1-119 не формирует RPLY?

Угу, именно.
Эта 119-ая вообще полтора года отлеживалась в виде "нечеловеческой схемы", там было сотни полторы элементов 3ИЛИ-НЕ и 4ИЛИ-НЕ, которые были связаны между собой весьма неочевидным образом, и никак не получалось из них что-то вменяемое соорудить. Появился опыт с 1801ВМ3, стало чуть понятнее назначение сигналов, удалось выявить группы локальных связей между этими 3/4ИЛИ-НЕ и сформировать модули по 3 или 4 штуки таких элементов. Оказалось что это D-триггеры с синхронным тактом и асинхронным сбросом, в итоге вместо бессмысленной кучи получилось штук 30 триггеров, связей стало на порядок меньше, в итоге удалось нарисовать "человеческую схему".

Alex_K
28.02.2016, 23:16
Меня удивило что детектор ошибок в этом режиме отключается. Впрочем, МС1201.03 вообще имеет режим работы с отключенной коррекцией.
Так же прошивка в режиме HALT считает доступное ОЗУ. А так насчитает всего 8 Кбайт при сбое на следующей странице.

Vslav
28.02.2016, 23:21
Так же прошивка в режиме HALT считает доступное ОЗУ. А так насчитает всего 8 Кбайт при сбое на следующей странице.
Запись слова при включенной коррекции ошибок не вызывает чтения DRAM, следовательно, при наличии памяти по требуемому адресу запись не вызывает ошибок памяти и проходит всегда. Этот момент можно было бы использовать для теста.
Но и так критичного ничего особо не случилось - в HALT будет отключено только оповещение о некорректируемых ошибках, сама коррекция же останется.

Alex_K
28.02.2016, 23:29
Запись слова при включенной коррекции ошибок не вызывает чтения DRAM, следовательно, при наличии памяти по треубемому адресу запись проходит всегда. Этот момент можно было бы использовать для теста.
Посмотрел в 134-й прошивке, как определяется объем ОЗУ, действительно делается очисткой ячейки памяти, так что да, ошибки не будет.

Patron
01.03.2016, 15:55
.

Тест: 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.

.

MiX
01.03.2016, 16:06
На ВМ3.

.RUN DBE1
Double Bus Error test #1

000004/160000
TST @#160000

@ 160000
@R6/000774
@1000G

Program completed.

.

form
01.03.2016, 16:11
В случае вылета в пульт
У меня как и положено 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

Patron
01.03.2016, 16:25
.

Тест: 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.

.

MiX
01.03.2016, 16:37
На ВМ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.

.

Patron
01.03.2016, 16:58
На ВМ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.

.

Alex_K
01.03.2016, 17:00
Тест: DBE1.SAV - проверяет возникновение двойной ошибки шины при зависании вектора TRAP4.

В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G :
Ну вот, теперь без MMU никуда. Так набил в пульте. Итого по 1801ВМ2:

R6 = 000770 R7 = 160002
000770/160002
000772/000000
000774/001004
000776/000200

MiX
01.03.2016, 17:26
На ВМ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 если что. Эта документация?

Alex_K
01.03.2016, 17:32
Так как набивал DBE1 в пульте, то после загрузки вектора 4 проскочило прерывание таймера, т.к. в УКНЦ он по умолчанию включен.
С отключенным таймером так:

R6 = 000774 R7 = 160002
000774/001004
000776/000200

Patron
01.03.2016, 17:35
Эта документация?Да - она наиболее точная.

...

Тест: 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.

.

MiX
01.03.2016, 17:57
Да - она наиболее точная.
Эта документация первого варианта процессора, т.к. 87года.


.RUN DBE4
Double Bus Error test #4

172340/000000
172300/000000
KSP /040000

TST @#160000 И молчёк... после мигающий курсор и всё.
Нажал кнопку УСТ.

@ 173000
@R6/040000
@1000G

Program completed.

Patron
01.03.2016, 18:03
Эта документация первого варианта процессора, т.к. 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.

.

MiX
01.03.2016, 18:13
На ВМ3.

.RUN DBE7
Double Bus Error test #7

000010/160000
MFPT

@ 160000
@R6/000774
@1000G

Program completed.

.

Alex_K
01.03.2016, 18:26
Тест: 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.

Patron
01.03.2016, 18:30
На ВМ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/).

MiX
01.03.2016, 18:34
На ВМ3

.RUN DBE5
Double Bus Error test #5

177602/000000
000006/140340
177776/140340
USP /040002

TST @#160000
>>> Trap to 250 <<<

Program completed.

.

Alex_K
01.03.2016, 18:37
Речь про ЭТО.
Так это одно и то же, там djvu, а здесь pdf.

Patron
01.03.2016, 18:49
Так это одно и то же, там djvu, а здесь pdf.Там, где 310M - должно быть совсем другое.

...


Тест: DBE8.SAV (http://emulator.pdp-11.org.ru/misc/DBE8.zip) - проверяет возникновение двойной ошибки шины при зависании вектора IOT.

В случае вылета в пульт можно проверить значение R6 и завершить программу командой 1000G.

Alex_K
01.03.2016, 19:02
Тест: DBE8.SAV - проверяет возникновение двойной ошибки шины при зависании вектора IOT.
Результат на 1801ВМ2 аналогичен, как и на тесте DBE7.

MiX
01.03.2016, 19:06
На ВМ3

.RUN DBE8
Double Bus Error test #8

000020/160000
IOT

@ 160000
@R6/000774
@1000G

Program completed.

.

Alex_K
01.03.2016, 19:15
Там, где 310M - должно быть совсем другое.
А что это за 310М?

Patron
01.03.2016, 19:19
.

Тест: 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)

Alex_K
01.03.2016, 19:21
Размер файла: ms1201_03_opisanie.rar
А я говорил про описание системы команд, это тоже самое У10.305.301 ТО, только часть вторая.

MiX
01.03.2016, 19:24
результат будет таким:
Аналогично.

Patron
01.03.2016, 19:30
.

Тест: SR0T3.SAV (http://emulator.pdp-11.org.ru/misc/SR0T3.zip) - проверяет установку битов ошибок при "групповых" ошибках MMU.

MiX
01.03.2016, 19:51
На ВМ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.
...


только часть вторая.
И я про часть вторую имел ввиду.

Patron
01.03.2016, 20:03
И я про часть вторую имел ввиду.А я про первую - именно там самая точная информация.

...

Тест: VM3M1.SAV (http://emulator.pdp-11.org.ru/misc/VM3M1.zip) - проверяет "диагностический" режим MMU.

MiX
01.03.2016, 20:08
На ВМ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.

.

Patron
01.03.2016, 20:22
На ВМ3Диагностический режим MMU оказался полноценным гибридным режимом, при котором все обращения в память идут в режиме MMU16, кроме обращений к первому и второму операндам, которые идут в режиме MMU, выбранном в SR3.

...

Тест: VM3M2.SAV (http://emulator.pdp-11.org.ru/misc/VM3M2.zip) - мапит нулевую страницу на первую в M-режиме MMU и обрабатывает прерывание.

MiX
01.03.2016, 20:32
На ВМ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.

Patron
01.03.2016, 20:49
Может статься, что работа через MMU идёт только в двухоперандных командах ( или не идёт при адресации (PC) )..

Тест: VM3M2a.SAV (http://emulator.pdp-11.org.ru/misc/VM3M2a.zip) - мапит нулевую страницу на первую в M-режиме MMU и обрабатывает прерывание.

MiX
01.03.2016, 21:00
На ВМ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.

.

Patron
01.03.2016, 21:08
Уже понятно, что в М-режиме обработка прерывания идёт не без проблем, а где именно слабина - выясним позднее.

...

Тест: VM3M3.SAV (http://emulator.pdp-11.org.ru/misc/VM3M3.zip) - проверяет работу однооперандных команд в M-режиме MMU.

MiX
01.03.2016, 21:16
На ВМ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.

.

Patron
01.03.2016, 21:35
Однооперандные команды работают по тем же правилам, что и двухоперандные. Получается, что в тесте 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.

MiX
01.03.2016, 21:45
На ВМ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.

.

Patron
01.03.2016, 22:08
Ситуация прояснилась - 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.

MiX
01.03.2016, 22:19
На ВМ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.

.

Patron
01.03.2016, 22:22
.

Тест: 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.

MiX
01.03.2016, 22:30
На ВМ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.

.