PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
Пультовый режим все равно организован своеобразно, вполне могли быть начальные варианты когда признак пульта размещался в битах psw[5] или psw[6].
В АЛУ имеется копия регистра инструкций, извлечение нужных полей из опкода выполняется мгновенно в блоке генератора констант. Флаг Т тоже очищается с использованием константы. Вот фрагмент выполнямой последовательности микрокода для clr R0 mtps R0
При этом 791401 тест mtps проходит нормально. Но надо все равно проверить на реальном ВМ1, вполне может быть что у меня где-то ошибка.Код:# plr(173777507057)->(176), op(10, y ), x(17), y(17)) # X=R0 (000000) # Y=000000 (const) # Read @ 000206, 106400 ; завершение чтения регистра опкода # R0=000000 ; окончание clr R0, назначение приемника # mj(1, 04, 176), ir(106400) # plm(014733122470) # # plr(014733122470)->(057), op(01, x+y ), x(01), y(03)) # X=R7 (000210) ; странный запуск чтения @PC, вместо PC результат попадает в R12 # Y=000002 (const) # mj(1, 04, 057), ir(106400) # QBUS=tplm(1), plrt(4), word read # ADR=000210 # plm(172630146035) # R12=000212 # # plr(172630146035)->(110), op(02, x&~y), x(17), y(13)) # X=R0 (000000) # Y=000020 (const) # mj(1, 04, 110), ir(106400) # plm(106674746035) # DAT=000000 (byte) ; новый PSW со сброшенным T # R12=000000 (byte) # # plr(106674746035)->(111), op(16, x&y ), x(10), y(13)) # Read @ 000210, 005001 # X=PSW (000344) # Y=000020 (const) # mj(1, 04, 111), ir(106400) # plm(100176542075) # PSW=000000 (byte) ; непонятки # # plr(100176542075)->(156), op(12, x|y ), x(10), y(00)) # Y=DAT (000400) # X=PSW (000000) # mj(1, 04, 156), ir(106400) # plm(010737123467) # PSW=000000 (byte) ; записали сохраненный в DAT PSW # # plr(010737123467)->(176), op(01, x+y ), x(01), y(03)) # X=R7 (000210) ; чтение кода инструкции (PC)+ # Y=000002 (const) # QBUS=tplm(4), plrt(4), word read # ADR=000210 # R7=000212 # Read @ 000210, 005001 # mj(1, 00, 176), ir(005001) # plm(010737122431)
После того как оперблок запросил у секвенсера Qbus транзакцию, она может закончится только двумя способами - успешное завершение по RPLY или наступление тайм-аута, при котором всегда безусловно фиксируется запрос на исключение и асинхронно абортируется микрокод - он принудительно переходит на микроадрес 176 - анализ прерываний и начало декодирования новой команды. То есть, на каком бы этапе выполнения команды не возник тайм-аут - исключение обязательно будет - триггер запроса установлен, и может быть сброшен только отработкой 4-го вектора.
Последний раз редактировалось Vslav; 30.01.2015 в 02:00.
Ну я отвечал на вопрос не наследство ли это от PDP-11 где возможна смена режима USER/KERNEL - я ответил что режим не может смениться после использования команды MTPS так как для этого требуется поменять два старших бита PSW. Именно поэтому на всех машинах с MMU PSW всегда есть в IOPAGE. А вот команд MTPS/MFPS может и не быть. Про пультовый режим я ничего не говорил
Использование битов 5 и 6 не по назначению может сделать процессор несовместимым со всеми операционными системами которые когда либо были для PDP-11 (включая советские), а также нарушает совместимость с тем же 1801ВМ3 к примеру.
PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
Сохранение состояния при входе в прерывание/исключение починилось - это был тот особый случай когда регистр данных записывался напрямую с шины Х, минуя АЛУ, инструкция iot нормально заработала, тест 791401 теперь проходит полностью.
Приступаем к тесту 791404 - тест прерываний и исключений, нет ли где-нибудь листинга и описания на этот тест?
Явное лишнее чтение происходит только при выполнении команд типа MTPS Rx, что добавляет к продолжительности команды кучу тактов.
При нахождении аргумента MTPS в памяти ситуация иная. Например - команда MTPS #0 выполняется всего на 6 тактов дольше, чем команда TST #0, поэтому лишнего чтения там может и не быть.
---------- Post added at 12:12 ---------- Previous post was at 11:54 ----------
Лог успешного прогона теста 791404 на процессоре 1801ВМ1 выглядит так:
791404.log
там и без описания вполне понятно, что и как проверяется.
Картинки снятые с реального ВМ1 при помощи логического анализатора.
Последовательность: mov #340, R0 / mtps R0:
Последовательность clr R0 / mtps @R0:
Как видно из картинок - mtps R0 реально читает код следующей инструкции дважды. mtps @R0 читает слово из памяти, код следующей инструкции читается один раз. Вот такая особенность, это не ошибка модели. Выполняемое действие над PSW (присваивается только младший байт):
То есть, как положено по документации, значение бита Т - сохраняется.Код:low byte PSW = (PSW & T_bit) | (new & ~T_BIT);
Действительно, слона-то я и не приметил
Update: там на картинках RPLY с левого места мониторился (совпадает с DIN), но для иллюстрации обсуждаемого вопроса это неважно.
Последний раз редактировалось Vslav; 30.01.2015 в 21:47.
Как там, дело подвигается к началу реверса ВМ2?
Ведь, по мотивам ВМ1 и имея ТО на ВМ2 это наверняка проще сделать?
Эту тему просматривают: 4 (пользователей: 0 , гостей: 4)