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 9th October 2011 16:35

Quote:

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

А... интересно.

Patron 9th October 2011 16:37

Quote:

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

Чтобы точно определить, заказывает ли блок прерываний второй цикл DATO ( для записи в стек содержимого PC ) сразу после неудачи записи в стек содержимого PSW или просто уменьшает SP ещё на 2 - можно осуществить следующий тест:
Code:

        Mov        #160002,SP
        CLR        @#157776
        MFPT

Если по завершении теста в ячейке 0157776 окажется записан не 0, а PC из первого прерывания - значит при входе в прерывание блок прерываний выполняет два последовательных цикла DATO без реакции на возможное зависание в первом из этих двух циклов.

Причём, если это окажется справедливо не только для ВМ2, но и для ВМ1 - то это будет означать, что два последовательных зависания при входе в прерывание с плохим стеком не формируют признака двойного зависания ( как если бы блок прерываний не заказывал второй цикл DATO и вместо попытки записи PC в стек после неудачи записи PSW - просто уменьшал SP ещё на 2).

Quote:

Originally Posted by Alex_K (Post 422588)
Несмотря на это, SP еще уменьшается на 2, и хотя в 157776 уже можно занести, но второе слово не заносится в стек.

Т.е. в предлагаемом тесте в ячейке 0157776 так и останется ноль..

Alex_K 9th October 2011 16:44

1 Attachment(s)
Quote:

Originally Posted by Patron (Post 422604)
Т.е. в предлагаемом тесте в ячейке 0157776 так и останется ноль..

Да, останется. Скриншот прилагается.

Patron 9th October 2011 17:26

Quote:

Originally Posted by Alex_K (Post 422610)
Да, останется.

Иначе и быть не могло - ведь тогда контроллер шины ВМ1 не мог бы формировать признак двойного зависания.

Кстати, в моей модели ВМ1 релизация блока прерываний USER-моды выглядит так:
Code:

        try
        {   
                SP -= 2;
                word wSP = SP;
                SP -= 2;

                CheckAddrWrite(wSP);
                WORD( wSP &(~1) ) = PSW;

                CheckAddrWrite(SP);
                WORD( SP &(~1) ) = PC;
        }
        catch(int)
        {
                return TrapTo_4();
        }

        PC  = WORD( wVector    );
        PSW = BYTE( wVector +2 );

Любопытно, что у 1801ВМ1 чтение нового значения PSW из вектора прерывания происходит с копированием младшего байта и обнулением старшего, что является очевидной ошибкой.

Из-за этого процессор 1801ВМ1 вываливается из HALT-моды каждый раз, когда срабатывает блок прерываний USER-моды. Поэтому в HALT-моде процессора 1801ВМ1 допустимы только два прерывания: HALT (после команды HALT или сигнала IRQ1) и ЗАВИСАНИЕ, тогда как и любое аппаратное прерывание, и T-Trap, и Tpap_To_010 (например, после MFPT), и Trap_To_04 (например, после JSR R0) и любое программное прерывание типа EMT, IOT и т.п. - моментально выносят ВМ1 из HALT-моды.

Alex_K 9th October 2011 17:59

Quote:

Originally Posted by Patron (Post 422626)
Иначе и быть не могло - ведь тогда контроллер шины ВМ1 не мог бы формировать признак двойного зависания.

Ну скриншоты с УКНЦ, там ВМ2.

---------- Post added at 16:59 ---------- Previous post was at 16:40 ----------

Quote:

Originally Posted by Patron (Post 422626)
Любопытно, что у 1801ВМ1 чтение нового значения PSW из вектора прерывания происходит с копированием младшего байта и обнулением старшего, что является очевидной ошибкой.

Из-за этого процессор 1801ВМ1 вываливается из HALT-моды каждый раз, когда срабатывает блок прерываний USER-моды. Поэтому в HALT-моде процессора 1801ВМ1 допустимы только два прерывания: HALT (после команды HALT или сигнала IRQ1) и ЗАВИСАНИЕ, тогда как и любое аппаратное прерывание, и T-Trap, и Tpap_To_010 (например, после MFPT), и Trap_To_04 (например, после JSR R0) и любое программное прерывание типа EMT, IOT и т.п. - моментально выносят ВМ1 из HALT-моды.

Кстати в ВМ2 точно также. Так как процессор имеет полноценное разделение на режимы HALT и USER (в отличии от ВМ1), то каждый режим имеет свое адресное пространство. Соответственно вектора для каждого режима находятся в своем адресном пространстве. В ВМ2 также введены регистры копии счетчика команд (CPC) и состояния процессора (CPSW). Эти регистры-копии повторяют значения PC и PSW, только когда в PSW не установлены одновременно два бита - 7 (запрет прерываний) и 8 (HALT), изменяются CPC и CPSW при изменении PC и младшего байта PSW. При установке этих двух битов CPC и CPSW "замораживаются". Соответственно, если из HALT-режима возникает прерывание USER-режима, то процессор переключается в USER-режим сбросом бита 8 в PSW, т.к. этот бит находится в старшем байте, то CPSW не изменяется. Далее уже в стек ложаться CPSW и CPC (да, у ВМ2 так, в любом режиме), читается вектор USER-режима (здесь в PSW копируется только младший байт, бит 8 уже сброшен), ну и обрабатывается прерывание. Здесь есть одно но! Прерывание USER-режима должно происходить при разрешенных прерываниях (бит 7=0), иначе CPC и CPSW будут "замороженными" и возвратиться назад не удасться. Также из USER-режима возможен возврат в HALT-режим, если адрес возврата равен или больше 160000. При адресе >=160000 в PSW копируются все 9 бит, а иначе только 8, восьмой бит остается неизменным.

Alex_K 9th October 2011 18:03

1 Attachment(s)
Когда-то я делал описание ВМ2, выложу еще раз.

Patron 9th October 2011 18:06

Quote:

Originally Posted by Alex_K (Post 422632)
Ну скриншоты с УКНЦ, там ВМ2.

Это понятно. Просто для ВМ1 такой алгоритм - единственно возможный, тогда как для ВМ2 - лишь наиболее рациональный. Поэтому, из положительного результата теста ВМ2 автоматически следует, что и у ВМ1 - всё точно так же.

Alex_K 9th October 2011 18:11

Quote:

Originally Posted by Patron (Post 422642)
Это понятно. Просто для ВМ1 такой алгоритм - единственно возможный, тогда как для ВМ2 - лишь наиболее рациональный. Поэтому, из положительного результата теста ВМ2 автоматически следует, что и у ВМ1 - всё точно так же.

Это лучше проверить на реальной машине. Все-таки 1801ВМ1 переделывался из 1801ВЕ1 переписыванием микрокода, а 1801ВМ2 делался уже с нуля. Так что внутри они могут быть построены по разному.

Titus 9th October 2011 18:16

Quote:

Originally Posted by Alex_K (Post 422640)
Когда-то я делал описание ВМ2, выложу еще раз.

Монстр - такое описание составить.

А разве RSEL не имеет одинаковые коды 000020 и 000030? У тебя под 000030 значится неизвестная команда.

Alex_K 9th October 2011 18:30

Quote:

Originally Posted by Titus (Post 422644)
Монстр - такое описание составить.

А разве RSEL не имеет одинаковые коды 000020 и 000030? У тебя под 000030 значится неизвестная команда.

Все проверено на практике.
Кстати небольшое уточнение - CPSW изменяется только при изменении младшего байта PSW. Сам PSW состоит как бы из двух частей - младшего байта и отдельного бита 8. Просто это в этом описании не отразилось.


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

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