Speccy - наш выбор!

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

Patron 8th October 2011 22:23

Quote:

Originally Posted by Alex_K (Post 422346)
у 1801ВМ2 дела обстоят именно так

Тогда это существенное отличие от ВМ1.

У 1801ВМ1 дела обстоят так:

Quote:

? Patron - 14 февраля 23:51
А что насчёт поведения 1801ВМ1 при обработке прерывания зависания в USER-моде с несуществующим адресом в ячейке 04 ?
Если при этом не произойдёт переход в HALT-моду, то процессор войдёт в цикл бесконечного зависания.

? anonymous - 15 февраля 00:05
Да, пока указатель стека не затрет всю память и не перейдет через 0, после чего возникнет двойная ошибка шины с выходом в пульт, но данные в памяти ниже первоначального значения указателя стека будут утрачены.

? anonymous - 15 февраля 00:18
@4/002016 177000
000006/000000 340
@R6/000416 4
@1000/001000 5737
001002/001002 177000
001004/001004 0
@1000G
177002
@M000013
@R6/177774
@0/001004
000002/000340
000004/177000
@
Коды команды M:
х0 - переключатель пульт, инструкция HALT
х1 - ошибка передачи вектора
х2 - ошибка регенерации озу, в ДВК не реализовано
х3 - двойное зависание
х4 - ошибка микрокода процессора, в ДВК не реализовано

Alex_K 8th October 2011 22:34

Quote:

Originally Posted by Patron (Post 422353)
Тогда это существенное отличие от ВМ1.

У 1801ВМ1 дела обстоят так:

По всей видимости у 1801ВМ1 двойное зависание происходит только если возникло зависание во время обработки 4-го вектора, т.е. не удалось положить в стек PC и PS прерываемого процесса. Удалось положить - сбрасываем флаг зависания.

Patron 8th October 2011 23:03

Quote:

Originally Posted by Alex_K (Post 422359)
По всей видимости у 1801ВМ1 двойное зависание происходит только если возникло зависание во время обработки 4-го вектора, т.е. не удалось положить в стек PC и PS прерываемого процесса. Удалось положить - сбрасываем флаг зависания.

Думаю, проверка номера вектора не входит в логику обработки двойного зависания ни в ВМ1, ни в ВМ2.

Судя по всему, в ВМ1 двойное зависание означает просто два таймаута шины подряд, а в ВМ2 использован более продвинутый алгоритм, дополнительно учитывающий последовательные зависания при выборке команд.

Alex_K 8th October 2011 23:23

Quote:

Originally Posted by Patron (Post 422384)
Думаю, проверка номера вектора не входит в логику обработки двойного зависания ни в ВМ1, ни в ВМ2.

Судя по всему, в ВМ1 двойное зависание означает просто два таймаута шины подряд, а в ВМ2 использован более продвинутый алгоритм, дополнительно учитывающий последовательные зависания при выборке команд.

А вот по всей видимости входит. Команды JMP Rx и JSR Rx также трапаются по 4-му вектору. Но алгоритм обработки на ситуацию двойного зависания другой.

Если в 4 и 6 занести 2000 и 200, в R6 - 170000. Сперва по адресу 1000 занесем команду TST @#160000. При исполнении R6 будет равен 167774. Т.е. при исполнении команды произошло зависание, произошло оно и при занесении параметров в стек. В итоге - двойное зависание. Кстати у ВМ2 указатель стека всегда уменьшается на 4. Если по адресу 1000 записать JMP R0 и исполнить, то будет двойное зависание и R6 уже будет равен 167770. Т.е. при исполнении команды произойдет прерывание по 4-му вектору, возникает зависание при заносе параметров в стек. Здесь снова прерывание по 4-му вектору, но при очередном занесении в стек - уже двойное зависание.
При этом между зависаниями было вполне успешное чтение 4-го вектора. Так что проще задействовать какой-нибудь триггер. Произошло зависание - установили. У ВМ2 прочли код команды успешно - сбросили.

Есть еще один тест - а если произошло зависание при чтении 4-го вектора? На МС1201.01 вроде можно отключать банки памяти, но если только плата запуститься с отключенным нулевым банком.

Patron 9th October 2011 04:26

Quote:

Originally Posted by Alex_K (Post 422396)
Если по адресу 1000 записать JMP R0 и исполнить, то будет двойное зависание и R6 уже будет равен 167770. Т.е. при исполнении команды произойдет прерывание по 4-му вектору, возникает зависание при заносе параметров в стек. Здесь снова прерывание по 4-му вектору, но при очередном занесении в стек - уже двойное зависание.
При этом между зависаниями было вполне успешное чтение 4-го вектора.

И аппаратное прерывание, и прерывание по резервному коду, и любое командное прерывание (типа EMT, IOT и т.п.) даст при плохом стеке точно такой же эффект даже на ВМ1. Чтение вектора ни на первом, ни на втором шаге процессор выполнить не успевает.

Но похоже, что действительно у ВМ2 за формирование признака двойного зависания отвечает не контроллер шины (как у ВМ1), а блок прерываний. Ведь контроллер шины не может отличить циклы DATI при чтении ячеек 04 и 06 от таких же циклов чтения при выборке команды.

Quote:

Есть еще один тест - а если произошло зависание при чтении 4-го вектора? На МС1201.01 вроде можно отключать банки памяти, но если только плата запустится с отключенным нулевым банком.
Мне такой тест организовать пока не удалось. Было бы весьма интересно, если бы кто-то такое осуществил.

Alex_K 9th October 2011 10:29

Quote:

Originally Posted by Patron (Post 422477)
Но похоже, что действительно у ВМ2 за формирование признака двойного зависания отвечает не контроллер шины (как у ВМ1), а блок прерываний. Ведь контроллер шины не может отличить циклы DATI при чтении ячеек 04 и 06 от таких же циклов чтения при выборке команды.

Тут уж сложно сказать, кто за что отвечает. Возможно в ВМ1 при обращении к шине имеется счетчик зависаний, и если два зависания подряд - то тогда двойное зависание. В ВМ2 это не так, при хорошем стеке двойное зависание может быть и при неуспешном чтении команды.
У ВМ2 есть еще особенность - при заносе в стек PC и PS указатель стека всегда уменьшается на 4, независимо от того, удалось занести параметры в стек или нет. Делал даже опыты со сначением R6, равным 160002. Естественно в 160000 занести не удалось, прерывание по зависанию. Но после успешного прерывания по вектору 4 указатель стека был равен 157772. Т.е. данные прерванного процесса по зависанию были успешно занесены в ячейки 157772 и 157774. Ячейка 157776 оставалась нетронутой. Как с этим обстоят дела на ВМ1?

Patron 9th October 2011 15:05

1 Attachment(s)
Quote:

Originally Posted by Alex_K (Post 422495)
Как с этим обстоят дела на ВМ1?

Так же, при любой причине прерывания.

Quote:

Interrupts Test #1

BIS #100,@#TTPS
MOV #160004,SP
>>> Trap to 004 <<<
SP/157774

MOV #160004,SP
IOT
>>> Trap to 004 <<<
SP/157774

MOV #160004,SP
MFPT
>>> Trap to 004 <<<
SP/157774

Program completed.
Кстати, в начале теста любопытно, что при установке бита разрешения прерываний в регистре статуса любого готового устройства - прерывание происходит строго через одну команду при любом значении тактовой частоты процессора.

Исходник теста прилагается.

Если в конфигурации тестируемого компьютера нет порта терминала или его адрес отличается от используемого в тесте - нужно:

1. Изменить в исходнике константу TTPS (при отсутствии порта терминала - на адрес регистра статуса любого устройства, в котором после включения питания устанавливается бит готовности 0200 ):
Code:

;
;        INTT1.MAC  -  Interrupts Test #1
;
;===============================================

        .MCall        .Exit

        TTKS  =:  0177560
        TTKB  =:  0177562
        TTPS  =:  0177564
        TTPB  =:  0177566

2. При отсутствии порта терминала - скорректировать подпрограмму StrOut ( вывод строки ASCIZ с адресом в R0 без использования прерываний ):
Code:

StrOut:
        TstB        @#TTPS              ; Ждать готовности терминала.
        BPl        .-4.
        MovB        (R0)+,R1
        BEq        1$
        BMi        2$
        MovB        R1, @#TTPB          ; Вывести байт.
        Br        StrOut
1$:
        MovB        #015,@#TTPB        ; Вывести <CR>
        TstB        @#TTPS
        BPl        .-4.
        MovB        #012,@#TTPB        ; Вывести <LF>
        TstB        @#TTPS
        BPl        .-4.
2$:
        Return


Alex_K 9th October 2011 15:33

1 Attachment(s)
Quote:

Originally Posted by Patron (Post 422566)
Кстати, в начале теста любопытно, что при установке бита разрешения прерываний в регистре статуса любого готового устройства - прерывание происходит строго через одну команду при любом значении тактовой частоты процессора.

Да, да! Замечал такое. Из-за этого можно схватить зависание при приеме АВП. Тестировал, добился. Скриншот прилагается.

Titus 9th October 2011 16:05

Quote:

Originally Posted by Alex_K (Post 422495)
У ВМ2 есть еще особенность - при заносе в стек PC и PS указатель стека всегда уменьшается на 4, независимо от того, удалось занести параметры в стек или нет.

Это говорит о том, что прерывание происходит только в конце последовательности сохранения регистров в стек. Т.е. занесли первое слово, установился флажок зависания, потом занесли второе слово, и только в конце этой последовательности может произойти прерывание.

Alex_K 9th October 2011 16:11

Quote:

Originally Posted by Titus (Post 422585)
Это говорит о том, что прерывание происходит только в конце последовательности сохранения регистров в стек. Т.е. занесли первое слово, установился флажок зависания, потом занесли второе слово, и только в конце этой последовательности может произойти прерывание.

Titus, внимательно почитайте мой пост. Там говориться о том, что второе слово не заносится. Т.е. сначала SP=160002, уменьшается на 2, заносится в стек первое слово (в 160000). Здесь происходит зависание. Несмотря на это, SP еще уменьшается на 2, и хотя в 157776 уже можно занести, но второе слово не заносится в стек.


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

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