Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Эмуляторы отечественных компьютеров (http://zx-pk.ru/forumdisplay.php?f=61)
-   -   Эмулятор УКНЦ (http://zx-pk.ru/showthread.php?t=6257)

Titus 8th October 2011 19:02

Quote:

Originally Posted by Alex_K (Post 422251)
При адресном обмене на шине QBUS после выставления процессором сигналов DIN или DOUT внешнее устройство или контроллер памяти должны записать/выставить данные и ответить сигналом RPLY. Вот если этого сигнала не будет (обычно в течение 64T), то тогда процессор прерывается по зависанию.

Это понятно из описания процессора. Я имел ввиду, в каких случаях это произойдет на УКНЦ? При условии отсутствия глюков железа.

Alex_K 8th October 2011 19:07

Quote:

Originally Posted by Titus (Post 422254)
Это понятно из описания процессора. Я имел ввиду, в каких случаях это произойдет на УКНЦ? При условии отсутствия глюков железа.

Если программа обращается к несуществующей памяти. Для примера - написана программа для УКНЦ, она обращается к каналу 2. Попытались запустить ее на ДВК, там канала 2 нет, соответственно прерывание по вектору 4. Обычно это прерывание используется, чтобы узнать объем памяти (не всегда было 56К), присутствие регистров внешних устройств на магистрали.

Titus 8th October 2011 19:10

Понятно, значит обращение, скажем к памяти по адресу 160000 в режиме USER, должно вызвать зависание. А двойное зависание как устроить на УКНЦ?

Alex_K 8th October 2011 19:19

Quote:

Originally Posted by Titus (Post 422256)
Понятно, значит обращение, скажем к памяти по адресу 160000 в режиме USER, должно вызвать зависание. А двойное зависание как устроить на УКНЦ?

Правильно. А вот если перед этим в R6 загнать 170000, то тогда будет двойное зависание. Сперва произойдет зависание при обращении к 160000, ставится признак обработки зависания, соответственно текущие PC и SP должны положиться в стек, но при операции заноса в стек также происходит зависание. Но т.к. в данный момент происходит обработка зависания (стоит флаг), то уже произойдет двойное зависание.

Более сложный пример. SP будет нормальный, но по вектору 4 занесем 170000 (п/п обработки зависания находится в несуществующей памяти), в ячейке 6 должно быть 200 (запрет прерываний). При обращении к 160000 происходит зависание, ставится флаг обработки, сохраняются PC и SP в стеке (успешно). Из ячеек 4 и 6 читается вектор и начинает исполняться программа обработки прерывания. Т.к. еще не было успешного чтения кода команды, то флаг обработки прерывания не сброшен. Но чтение первой команды неуспешное, флаг стоит - в итоге двойное зависание.

Titus 8th October 2011 19:57

А как зависнуть в режиме HALT, если в этом режиме все 64кб - это память?

Alex_K 8th October 2011 20:00

Quote:

Originally Posted by Titus (Post 422276)
А как зависнуть в режиме HALT, если в этом режиме все 64кб - это память?

Очень просто - надо прочесть память режима USER. Есть спецкоманды, которые работают только в HALT-режиме (коды от 10 до 37), среди этих команд есть и команды чтения/записи памяти USER-режима. Эти команды использует пультовый отладчик для просмотра памяти.

Titus 8th October 2011 20:04

Quote:

Originally Posted by Alex_K (Post 422278)
Очень просто - надо прочесть память режима USER. Есть спецкоманды, которые работают только в HALT-режиме (коды от 10 до 37), среди этих команд есть и команды чтения/записи памяти USER-режима. Эти команды использует пультовый отладчик для просмотра памяти.

Т.е. читаем память по адресу 160000 и опять получаем зависание? А двойное зависание получится так устроить, или уже нет?

Alex_K 8th October 2011 20:09

Quote:

Originally Posted by Titus (Post 422285)
Т.е. читаем память по адресу 160000 и опять получаем зависание? А двойное зависание получится так устроить, или уже нет?

Все дело в том, что в режиме HALT PC и SP прерываемого процесса не сохраняются в стеке. Здесь только можно сделать так, чтобы вектор 160004 указывал на несуществующий адрес, но в режиме HALT в УКНЦ таких нет, так что - увы :(.

Patron 8th October 2011 21:54

Quote:

Originally Posted by Alex_K (Post 422257)
SP будет нормальный, но по вектору 4 занесем 170000 (п/п обработки зависания находится в несуществующей памяти), в ячейке 6 должно быть 200 (запрет прерываний). При обращении к 160000 происходит зависание, ставится флаг обработки, сохраняются PC и SP в стеке (успешно). Из ячеек 4 и 6 читается вектор и начинает исполняться программа обработки прерывания. Т.к. еще не было успешного чтения кода команды, то флаг обработки прерывания не сброшен. Но чтение первой команды неуспешное, флаг стоит - в итоге двойное зависание.

У процессора 1801ВМ1 (если не ошибаюсь) в этом случае произойдёт циклический вход в обработчик зависания, который будет заносить PC и SP в стек до тех пор, пока указатель стека не вылезет из границ ОЗУ и только тогда произойдёт "нормальное" двойное зависание.

Допускаю, что и у 1801ВМ2 дела обстоят так же, но при тестировании этот тонкий момент не был должным образом отслежен.

Alex_K 8th October 2011 22:10

Quote:

Originally Posted by Patron (Post 422338)
У процессора 1801ВМ1 (если не ошибаюсь) в этом случае произойдёт циклический вход в обработчик зависания, который будет заносить PC и SP в стек до тех пор, пока указатель стека не вылезет из границ ОЗУ и только тогда произойдёт "нормальное" двойное зависание.

Допускаю, что и у 1801ВМ2 дела обстоят так же, но при тестировании этот тонкий момент не был должным образом отслежен.

Насчет 1801ВМ1 не скажу, нет его у меня. Если его и тестировать, то только на МС1201.01, на БК этот тонкий момент не проловишь. А вот у 1801ВМ2 дела обстоят именно так, все тестировалось на реальной машине, чтобы узнать когда формируется двойное зависание. В эмуляторе этот момент учтен.
Проверка простая. В ячейки 4 и 6 занести 170000 и 200 соответственно. С адреса 1000 занести команду TST @#160000 (коды 005737 и 160000). Запустить обязательно с помощью ИСП. В итоге двойное зависание, R6 равен 774 (если до этого он был 1000), R7 равен 170002.


All times are GMT +4. The time now is 02:54.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.