Просмотр полной версии : БК-0010 и клавиша СТОП
BlaireCas
20.08.2023, 19:32
Вроде всегда думал что нажатие клавиши "СТОП" на БКшке (10-й) просто генерирует прерывание и как-бы да и пофиг с ним.
Но тут прочитал газету "САПОГ-3" и там мол такое...
https://i.imgur.com/r4ADvVF.png
А как-бы смущает то что вот ну зачем делать sub (PC),(SP) (это 161716), там что недостаточно просто поставить RTI?
Будто клавиша СТОП что-то на реальной БК заносит еще и в стек лишнее?
На эмуляторе от gid такое не прокатывает (вылет идет). Где тут вранье? В газете?
Прерывание по V4 - на стек кладется PSW и PC. Извлекается V4, адрес обработки (2) заносится в PC. По адресe 2 - команда SUB (PC),(SP). Начинаем выполнять (В PC 4, а по адресу 4 - 2) - вычитаем 2 из адреса возврата из прерывания. Переход к выполнения команды по адресу 4, а там - 2 (RTI). То есть мы вернемся на команду, предшествующую команде, на которой произошло прерывание по V4 прерыванию.
А вот дальше надо внимательно смотреть описание ВМ1 - чего там он делает, когда при выполнении команды происходит прерывание по V4 и как организовано прерывание по V4 от клавиши СТОП
- - - Добавлено - - -
Будто клавиша СТОП что-то на реальной БК заносит еще и в стек лишнее?
Он не из указателя стека вычитаем (и кстати - это как - положить что-то в стек) - он из содержмого на вершине стека вычитает
BlaireCas
20.08.2023, 19:46
Прерывание по V4 - на стек кладется PSW и PC
Либо в реальной БК добавляется +2 на адрес возврата, либо я ничего не понимаю.
Тут возможно действительно что-то связано с тем как БК обрабатывает СТОП и добавляет-ли оно туда +2 при заносе в стек адреса.
Банальный занос 2, 2 по адресам (2-4) в эмуляторе решает проблему СТОПа, но люди зачем-то вот это писали и кто-ж их знает-то. Одно дело эмуляция, а тут вон похоже подводные камни.
(это уже не говоря о том что я прочитал что на ВМ1 команда CLR зачем-то ЧИТАЕТ :)
Либо в реальной БК добавляется +2 на адрес возврата
Прерывание по V4 - это критические ошибки (наиболее распространённая - по таймауту), которые могут прерывать выполнение команды даже в середине (попытались извлечь содержимое источника, скажем, в двухоперандной команде - а адрес не откликается) (PC может указывать на второй операнд или след команду) и вот именно этот и кладётся в стек. Я, конечно, наверняка не скажу - но врят ли 1801ВМ1 СПЕЦИАЛЬНО добавляет +2 к адресу возврата - скорей он может положить уже увеличенный на 2 PC (типа подготовились дальше что то через PC извлекать). Но в целом - надо смотреть описание и экспериментировать на реальной БК
- - - Добавлено - - -
А насчёт поведение эмуляторов - я бы не стал сильно ориентироваться на их поведение - кто их знает, какие там ошибки есть. Единственный нереальный БК, который будет вести себя идентично - сделанный в FPGA на основе реверса Vslav-а - никакие другие для меня не показатель
ВМ1 - чего там он делает
Переходит в пультовый режим, записывает какой-то бит в 177716 - регистр-коммутатор банков памяти ВМ1, пытается записать в пультовые регистры 177670, 177672 ( уточнить адрес ) - но в заводской БКшке нет этих регистров и происходит прерывание по ошибке МПИ по 4 вектору.
В ТО 1801ВМ1А Вслав г. Киев писал, что есть возможность программно как-то заблочить кнопку Стоп, для некотрых программных ситуаций.
BlaireCas
20.08.2023, 19:59
он из содержмого на вершине стека вычитает
Сорри, ну смысл понятен - там -2 от содержимого стека. Зачем-то получается прибавляется +2. Вот зачем?
- - - Добавлено - - -
врят ли 1801ВМ1 СПЕЦИАЛЬНО добавляет +2 к адресу возврата
Это специфическое поведение кнопки СТОП похоже, процессор не причем
Нужен кто-то с реальной БК проверить вообщем.
Это специфическое поведение кнопки СТОП похоже, процессор не причем
Но для процессора это обычное прерывание по таймауту - кнопка СТОП в логику работы процессора не влезет
- - - Добавлено - - -
Зачем-то получается прибавляется +2. Вот зачем?
Это выглядит (выглядит!) как попытка организовать повторное выполнение прерванной команды - но фокус пройдет если только процессор прервался сразу после извлечения первого слова команды и ещё не начал её выполнять
Это выглядит (выглядит!) как попытка организовать повторное выполнение прерванной команды - но фокус пройдет если только процессор прервался сразу после извлечения первого слова команды и ещё не начал её выполнять
На самом деле там просто ошибка в микрокоде. В ситуации, когда прерывается вход в прерывание, вместо значения PC на момент начала исполнения команды сохраняется, действительно, значение, которое должно быть после выборки опкода.
Надо проверить, но вроде это должно и на EMT срабатывать, например.
BlaireCas
20.08.2023, 20:41
Начал гуглить что такое может быть не так с клавишей "СТОП". И нагуглил текст Зальцмана
https://i.imgur.com/5JN6nPm.png
Собственно вся книжка: https://gid.pdp-11.ru/books/Zaltsman.html
Вообщем БК это хитро, это странно :) Это даже интересно (радуют там слова "но не всё так просто!")
Сорри, ну смысл понятен - там -2 от содержимого стека. Зачем-то получается прибавляется +2. Вот зачем?
Для коррекции адреса возврата по сигналу HALT. Описание 1801ВМ1 на гитхабе Vslav - https://github.com/1801BM1/cpu11/blob/master/vm1/doc/1801vm1.pdf.
Исключения и прерывания пультового режима выполняются следующим образом:
• в начале обработки устанавливают бит 3 в регистре 1777168
• сохраняют PSW по адресу 1776768
• для исключений с кодом MCIR=0102 корректируют PС вычитая 2
• сохраняют PС по адресу 1776748
• читают новое значение PC по адресу вектор+0
• читают новое значение PSW по адресу вектор+2
Следующие прерывания и исключения будут обрабатываться процессором в пультовом режиме (с установкой бита 3 в регистре 1777168) по векторам:
Инструкция HALT
1600028
PC
Низкий уровень на входе nIRQ1
1600028
PC-2
Тайм-аут шины МПИ, PSW10=1 и PSW11=0
1600028
PC
Тайм-аут шины МПИ, К1801ВМ1А, PSW10=x и PSW11=1
1600028
PC-2
Тайм-аут шины МПИ, К1801ВМ1Г, PSW10=x и PSW11=1
1600028
PC
Двойной тайм-аут шины МПИ (повторный при попытке обработать первое исключение по зависанию)
1600068
PC
Тайм-аут шины МПИ при получении вектора прерывания (в цикле nIAKO)
1600128
PC
Нажатие СТОП - это низкий уровень на входе IRQ1. А так как ячеек с адресами 177674 и 177676 в БК нет, то возникает прерывание по вектору 4 и адрес ещё не успевает скорректироваться.
BlaireCas
20.08.2023, 20:54
Нажатие СТОП - это низкий уровень на входе IRQ1.
Алексей, эти железные штуки они ну для программиста как будто вот "на тебе припаяй атмегу.. ну.." :)
Мне-бы простое решение - хочется определить нажатие клавиши СТОП (поскольку на УКНЦ я ей останавливаю игру, и в порте это тоже хотелось-бы сделать). А тут такая засада непонятная.
Алексей, эти железные штуки они ну для программиста как будто вот "на тебе припаяй атмегу.. ну.." :)
Мне-бы простое решение - хочется определить нажатие клавиши СТОП (поскольку на УКНЦ я ей останавливаю игру, и в порте это тоже хотелось-бы сделать). А тут такая засада непонятная.
Проверяете разряд 2 в 177716, что это точно произошло исключение, в книге Зальцмана описано. Далее уже переходите на процедуру остановки, надо почистить стек, установить правильный указатель.
BlaireCas
20.08.2023, 21:03
Ладно, спасибо всем, но мое имхо в эмуляторе где-то косякс. Окей там рядом со СТОП есть кнопка СБРОС собственно почему-бы и не воспользоваться ей и не забивать себе голову с вектором 4
Вроде всегда думал что нажатие клавиши "СТОП" на БКшке (10-й) просто генерирует прерывание и как-бы да и пофиг с ним.
Но тут прочитал газету "САПОГ-3" и там мол такое...
А как-бы смущает то что вот ну зачем делать sub (PC),(SP) (это 161716), там что недостаточно просто поставить RTI?
Будто клавиша СТОП что-то на реальной БК заносит еще и в стек лишнее?
Давно интересовался темой блокировки СТОП в БК0010 (в БК0011 такой проблемы нет). С вашей помощью вроде стало примерно всё понятно. Получается что в Сапоге просто привели кратчайший способ, который работает во многих случаях. Впечатляет трюк, когда значение 2 по адресу 4 используется в трех ипостасях, как опкод, как адрес и как число! Однако, если прерываемая команда состоит из 4 или 6 байт, то подозреваю, что трюк иногда не сработает. Даже однословная команда со сложной адресацией возможно этим трюком не поймается без побочного эффекта. Полностью надёжен только способ, предложенный Зальцманом с рестартом. Можно, конечно, пробовать ещё писать код, где происходит анализ прерванной команды, но похоже бкашники этого уже не сделают никогда. :(
Пробовал с эмулятором BK2010 - трюк обычно работает, но иногда не совсем. Похоже, что BK2010 до сих пор самый точный эмулятор.
И вроде всё объясняется без премyдростей работы с пультом - или что-то не понял?
это уже не говоря о том что я прочитал что на ВМ1 команда CLR зачем-то ЧИТАЕТ :)
CLR читает и на 68000 и вероятно на многих фирменных процессорах для PDP-11 - можно подумать, что была какая-то общая база микрокодов. :)
И вроде всё объясняется без премyдростей работы с пультом - или что-то не понял?
Премудрости состоят в том, что в БК нет ячеек 176674 и 176676, в которых сохраняются PC и PSW при исключениях. При попытке сохранить PSW в 176676 срабатывает TRAP4 и процессор не успевает скорректировать PC. Смотрите алгоритм прерывания при исключениях.
На реальной БК0010-01 ввел FOR-NEXT цикл, заблокировал СТОП
POKE2,&He3ce
POKE4,2
и запустил программу цикла, потом жал на СТОП в течении нескольких минут. Блокировка работала абсолютно. У dim33 аналогичные результаты. Похоже, что инструкция прерывается всегда после захвата первого слова и увеличения R7, но до каких-то других изменений в регистрах или памяти. Нужно бы проверить кодом на ассемблере с длинными и сложными адресациями, но пока не получилось.
Премудрости состоят в том, что в БК нет ячеек 176674 и 176676, в которых сохраняются PC и PSW при исключениях. При попытке сохранить PSW в 176676 срабатывает TRAP4 и процессор не успевает скорректировать PC. Смотрите алгоритм прерывания при исключениях.
Вопрос скорее в том, чему может быть равно PC при прерывании команды? Верно ли, что это всегда адрес прерываемой инструкции + 2? Зальцман этого не знал.
Нужно бы проверить кодом на ассемблере с длинными и сложными адресациями, но пока не получилось.
Внешнее прерывание посреди команды не выполняется. Так что если команда из трёх слов, то все они будут выбраны из памяти. Посреди команды может прервать только внутреннее прерывание TRAP4.
Такая блокировка применялась во многих играх. И мне удавалось успешно привести БК к зависанию, если очень быстро долго долбить по клавише СТОП. Потому что подозреваю, что при такой блокировке однословные команды типа INC Rn, DEC (Rn) и т.п. выполнялись дважды, что приводило к неопределённому поведению.
Такая блокировка применялась во многих играх. И мне удавалось успешно привести БК к зависанию, если очень быстро долго долбить по клавише СТОП. Потому что подозреваю, что при такой блокировке однословные команды типа INC Rn, DEC (Rn) и т.п. выполнялись дважды, что приводило к неопределённому поведению.
Ну на реале это можно проверить длинной последовательностью команд, например INC R0. В начале последовательности R0 очищается, а в конце сравнивается с ожидаемым значением.
ячеек 176674 и 176676
Может таки 177674 и 177676 ?
ТО 1801ВМ1 :
https://forum.pk-fpga.ru/viewtopic.php?f=43&t=5553
- - - Добавлено - - -
если очень быстро долго
Вероятно, получился звон ( дребезг ) от кнопки и прерывание повторилось в момент его программной обработки.
Вероятно, получился звон ( дребезг ) от кнопки
Клавиатура была мембранная, мягкая.
И кстати, если вектор 4 был установлен таким образом:
BEGIN: mov #STOP,@#4
STOP: mov #BEGIN,SP
......
Как бы быстро и сколько бы ни долбил по кнопке СТОП, завесить БКшку не удавалось.
А если стек не инициализировать сразу, то при достаточной скорости долбления можно было добиться переполнения стека, если долго упорствовать.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot