Важная информация

User Tag List

Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 16 из 16

Тема: Перестали работать тестовые программы btime, minfo, ulatest3.

  1. #11
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,640
    Спасибо Благодарностей отдано 
    241
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Когда отрабатывают 69888 тактов, происходит обработка прерывания. А обработчик прерывания меняет адрес возврата, и этим обходит rst 0.

  2. #12
    Member
    Регистрация
    08.05.2016
    Адрес
    г. Южа, Ивановская обл.
    Сообщений
    33
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Может я что то недопонимаю, но насколько я понял из книг по ассемблеру, прерывание начинает обрабатывться после команды IM 2, а закончится обработка должна командой RET. После команды IM 2 обработчик начинает считать такты в своих мудрёных счётчиках, и если результат счёта соответствует расчётному то программа работает , а если нет то доходит до команды RST 0. Но я не врублюсь , что заставляет программу доходить до какого то места и неожиданно начинать с другого.
    Вот к примеру код трасировал в спектакуляторе. До команд с точками остановки программа не доходит никогда. А до команд которые стоят перед ними доходит. Как так? Что заставляет процессор бросить выполнять пограмму на пол пути? Красными стрелками я отметил где программа ещё вы полняется, а до отмеченых точек остановки не доходит. Я понимаю если бы там были команды переходов, но там INC E несколько штук. А в следующм месте POP DE.
    Нажмите на изображение для увеличения. 

Название:	2017-04-01_003901.jpg 
Просмотров:	224 
Размер:	35.2 Кб 
ID:	60418


    А в моём реальном клоне программа отрабатывает до RST 0 в обоих местах, и не бросает выполняться на пол пути. В чём фокус?

    Я могу предположить, что в отмеченных местах на картинке приходит следующий сигнал INT и каким то чудом прерывает выполнение программы в нескольких тактах от команды RST 0. Но я нигде не читал про такую фишку. Везде описаны прерывания только по команде IM.
    И тут назревает следующий вопрос. Если поцессор бросает выпонять программу в этих местах, то откуда начинает дальше? Могу предположить с адреса на вершине стёка.
    Последний раз редактировалось апро; 01.04.2017 в 01:57.

  3. #13
    Guru Аватар для null_device
    Регистрация
    26.09.2009
    Адрес
    г. Красноярск
    Сообщений
    3,090
    Спасибо Благодарностей отдано 
    20
    Спасибо Благодарностей получено 
    83
    Поблагодарили
    67 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от апро Посмотреть сообщение
    каким то чудом прерывает выполнение программы в нескольких тактах от команды RST 0. Но я нигде не читал про такую фишку. Везде описаны прерывания только по команде IM.
    Немаскируемые прерывания NMI - нет?!
    Когда есть, но не знаешь где - это все равно, что нету.

  4. #14
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,908
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    89
    Поблагодарили
    31 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от апро Посмотреть сообщение
    Может я что то недопонимаю, но насколько я понял из книг по ассемблеру, прерывание начинает обрабатывться после команды IM 2
    Цитата Сообщение от апро Посмотреть сообщение
    Что заставляет процессор бросить выполнять пограмму на пол пути?
    Процедура обработки прерывания начинает работать в момент прихода импульса на вход /INT процессора. В Spectrum'е импульсы на этот вход поступают примерно 50 раз в секунду, а точнее с частотой обновления экрана. У разных клонов чуть разная частота обновления и геометрия экрана и скорость работы процессора.
    Цитата Сообщение от апро Посмотреть сообщение
    Если процессор бросает выпонять программу в этих местах, то откуда начинает дальше? Могу предположить с адреса на вершине стёка.
    Это правильное предположение. В момент прихода импульса прерывания как будто бы выполняется команда call, при этом на стек попадает адрес возврата. Обработчик прерывания завергается командой RET, адрес возвра снимается о стека и выполнение продолжается со следующей команды - как бы происходит аппаратный вызов подпрограммы. обработчику прерывания ничего не мешает подменить адрес возврата на стеке и "продолжить" выполнять программу с любого места.

    Цитата Сообщение от апро Посмотреть сообщение
    А в моём реальном клоне программа отрабатывает до RST 0 в обоих местах, и не бросает выполняться на пол пути. В чём фокус?
    На 100% не подскажу, потому что, повторюсь, я не дебажил этот код. Если обработчик подменяет адрес возврата, то достиженеи команды RST 0 зависит от того, успело ли прийти прерывание до этой самой RST 0. Если успело, то обработчик подменяет адрес, и выполнение обходит RST 0. Если не успело - RST 0 выполняется и сбрасывает машину.

    От чего зависит успело или не успело? Скорее всего от модели эмулируемой машины. У ориигнального ZX Spectrum и, например, у ZS Scorpion за время между импульсами прерывания "тикает" 69888 тактов, у Pentagon128 - 71680 тактов. Соответственно, между прерываниями успевает выполниться и разное количество команд, Пентагон может "успеть" выполнить RST 0 до прихода прерывания, подменяющего адрес исполнения, а оригинал - нет.
    ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.

  5. #15
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,640
    Спасибо Благодарностей отдано 
    241
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от апро Посмотреть сообщение
    Может я что то недопонимаю, но насколько я понял из книг по ассемблеру, прерывание начинает обрабатывться после команды IM 2,
    Команда IM 2 не начинает обработку прерывания, она задает режим обработки прерывания.

    а закончится обработка должна командой RET.
    Обработка прерывания также может завершиться командой RETI или RETN. А может вообще не заканчиваться, можно на прерываниях построить и главный программный цикл, но так делают редко.

    После команды IM 2 обработчик начинает считать такты в своих мудрёных счётчиках, и если результат счёта соответствует расчётному то программа работает , а если нет то доходит до команды RST 0.
    Нет никаких счетчиков в обработчике прерываний, здесь, по крайней мере. Счетчики есть в основной программе. Вот например цепочка INC E в листинге - кусок такого счетчика.

    Но я не врублюсь , что заставляет программу доходить до какого то места и неожиданно начинать с другого.
    Прерывание и заставляет. По сигналу INT делается подтверждение прерывания, и переход на обработчик прерывания (команды перехода НЕТ, это делается аппаратно, но есть адрес перехода, для режима IM 2 на спеке он хранится в памяти по адресу: (старший байт=регистру I, младший=$FF). А обработчик прерывания уже меняет адрес возврата, обходя этим команду RST 0.

    А в моём реальном клоне программа отрабатывает до RST 0 в обоих местах, и не бросает выполняться на пол пути. В чём фокус?
    Фокус в нестабильном времени кадра между прерываниями. Из-за вайтовых задержек программа не может точно вычислить время кадра в тактах, и прерывание должно произойти позже расчетного момента перед командой RST 0. То есть RST 0 отрабатывает, и идет сброс.

    Я могу предположить, что в отмеченных местах на картинке приходит следующий сигнал INT и каким то чудом прерывает выполнение программы в нескольких тактах от команды RST 0. Но я нигде не читал про такую фишку. Везде описаны прерывания только по команде IM.
    Вы неправильно представляете работу системы прерываний. По команде IM задается _режим_обработки_прерывани� �, а не происходит само прерывание. Сам прерывание происходит по приходу сигнала INT. Этот сигнал приходит со строгой периодичностью, с длиной периода, равной времени кадра между прерываниями (69888 тактов на фирменных 48 к, но с другой длиной на других машинах. Проблема в том, что точно вычислить эту длину на некоторых машинах программно можно, а на некоторых - нельзя (или можно, но используя другие приемы, не такие, как в данной программе)).

    И тут назревает следующий вопрос. Если поцессор бросает выпонять программу в этих местах, то откуда начинает дальше? Могу предположить с адреса на вершине стёка.
    Во время прихода сигнала прерывания на стек кладется адрес возврата - место, на котором программа была прервана. Команда RET в обработчике прерывания делает переход на это место, считывая его адрес со стека. НО - можно программно в обработчике прерывания изменить этот адрес перехода. В данной программе он просто пропускается на стеке ($FEFE INC SP:INC SP), а переход происходит на следующий адрес, хранящийся на стеке (EI: RET). EI (разрешение прерываний) нужно, т.к. при переходе в обработчик прерывания запрещаются аппаратно.
    Последний раз редактировалось Spectramine; 01.04.2017 в 12:23.

  6. #16
    Member
    Регистрация
    08.05.2016
    Адрес
    г. Южа, Ивановская обл.
    Сообщений
    33
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я не правильно представлял процес работы прерывания. Спасибо за разъяснения, я всё понял.
    Последний раз редактировалось апро; 02.04.2017 в 01:58.

  7. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

Страница 2 из 2 ПерваяПервая 12

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Программы для Феникса умеющие работать с kempston Mouse
    от VETER в разделе Программирование
    Ответов: 5
    Последнее: 11.01.2015, 21:47
  2. Ответов: 55
    Последнее: 25.08.2013, 23:24
  3. W29EE011-не желает работать
    от Ranson в разделе Память
    Ответов: 5
    Последнее: 07.12.2010, 22:41
  4. Композитик отказывается работать
    от REMR в разделе Ленинград
    Ответов: 8
    Последнее: 13.01.2010, 20:54
  5. Как работать с CF?
    от Максагор в разделе Внешние накопители
    Ответов: 3
    Последнее: 05.03.2007, 12:12

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •