26

Re: NMI, IRQ, развёртка и совмещение видеорежимов

avivanov76 пишет:

Вспомнился бородатый анекдот

:D

avivanov76 пишет:

продиктовано схемой семерки
было независимо измерено двумя человеками

Аргумент.

avivanov76 пишет:

1 такт ЦП это 1/14300000/14 = 0,979 мкс
Период IRQ 2048 мкс, это составляет 2048/0,979=2091,93 такта ЦП

Спасибо, не знал. Сейчас прерывания эмулируются исходя из одна строка развертки = 64 такта процессора.

Проблема в том, что эмулятор вызывает обработчик IRQ Рапиры чаще, чем надо. На реальном железе обработчик вызывается N раз (не знаю, сколько конкретно) между срабатыванием NMI и 204 строкой развёртки. В эмуляторе он вызывается эти же N раз уже к 164 строке. Если ускорить процессор относительно частоты IRQ, N вызовов будут происходить ещё быстрее.

Сейчас я эмулирую NMI в начале обратного хода луча. Это действительно так на семёрке? Возможно, если ускорить процессор и перенести NMI на начало кадра, получится ближе к правде.

27

Re: NMI, IRQ, развёртка и совмещение видеорежимов

На семерке NMI совпадает с кадровым гасящим импульсом. Гашение луча происходит после того, как отрисована последняя видимая строка. Луч при этом продолжает идти вперед. Обратный ход начинается в момент прихода кадрового синхроимпульса. Я к картинке Владимира пририсовал легенду, чтобы было понятнее.

SnakE пишет:

Проблема в том, что эмулятор вызывает обработчик IRQ Рапиры чаще, чем надо.

А есть возможность проверить, сколько всего вызовов обработчика IRQ происходит за кадр? И посмотреть, нет ли повторных вхождений в обработчик IRQ в пределах одного запроса?

Post's attachments

Attachment icon scr-ver7-legend.png 30.13 kb, 4 downloads since 2020-03-17 

28 Отредактировано Voldemar0 (17-03-2020 19:06)

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Тут бы, наверное, правильно говорить не о гашении луча, а о том, когда относительно NMI начинает рисоваться первая строка. Как бы тут не было так, что сперва гашение прекращается, а через время начинает изображаться первая строка.

Вообще, интересно было бы отловить вызовы обработчиков относительно прерываний.
Но не могу придумать как это сделать попроще.
Можно посадить один канал на КСИ и два канала на NMI/IRQ и ещё канал на F0. А остальные каналы зацепить на шину адреса.
Зная вектора NMI и IRQ попытаться выловить их из потока данных шины адреса во время перехода F0.
Но если придумаете способ попроще - это было бы полезно.
Можно ещё один канал ткнуть в регистр состояния ДК, чтобы видеть точки переключения его режима работы.

29

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Voldemar0 пишет:

Тут бы, наверное, правильно говорить не о гашении луча, а о том, когда относительно NMI начинает рисоваться первая строка. Как бы тут не было так, что сперва гашение прекращается, а через время начинает изображаться первая строка.

Насколько я понимаю, счетчик строк считает от 0 до 311. Пока он считает от 0 до 255 - это видимая часть кадра (256 телевизионных строк). Пока он считает от 256 до 311 - это невидимая часть (гашение). Вроде бы, никакого третьего состояния тут быть не должно.

Voldemar0 пишет:

Вообще, интересно было бы отловить вызовы обработчиков относительно прерываний.
Но не могу придумать как это сделать попроще.

По идее, можно выход SYNC процессора использовать. Первый переход SYNC в высокий уровень после установки сигнала IRQ - это начало обработки прерывания.

30

Re: NMI, IRQ, развёртка и совмещение видеорежимов

avivanov76 пишет:

А есть возможность проверить, сколько всего вызовов обработчика IRQ происходит за кадр? И посмотреть, нет ли повторных вхождений в обработчик IRQ в пределах одного запроса?

В эмуляторе вот так: во время первого интервала, когда IRQ активен, обработчик Рапиры вызывается 25 раз, потому что обработчик NMI занимает часть времени. В остальные интервалы активности обработчик IRQ успевает отработать 26 раз. Всего в кадре 10 активных интервалов IRQ, поэтому 26*9+25 = 259 раз за кадр.

Post's attachments

rapira_irq_first.png, 9.8 kb, 441 x 377
rapira_irq_first.png 9.8 kb, 15 downloads since 2020-03-17 

rapira_irq_rest.png, 9.48 kb, 449 x 386
rapira_irq_rest.png 9.48 kb, 19 downloads since 2020-03-17 

31

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Ух, ё-моё...
Спасибо за картинки, они кое-что проясняют.

Во-первых, видно, что разработчики Рапиры не разобрались с IRQ и заставили работать совмещение режимов методом "грубой силы" (потому что обработчик вызывается много раз). Это довольно стрёмно, потому что стек может легко закончиться.

Во-вторых, видно, что сам обработчик прерывания короткий, меньше 40 тактов. Я подозреваю, что он изменяет некий счётчик и при достижении, например, нуля происходит переключение видеорежимов. И поскольку обработчик успевает 25-26 раз вызваться за время одного запроса IRQ, то даже небольшая неточность с количеством выполняемых тактов в эмуляторе приведет к тому, что появится "лишнее" время и обработчик сработает лишний раз.

Поэтому есть предложение - проверить, правильно ли выполняется вызов прерывания. Нормальный порядок должен быть такой:
1) ставится запрос IRQ
2) процессор заканчивает ту инструкцию, которую выполняет сейчас
3) выполняется вызов обработчика. Вызов должен занимать 7 тактов (http://www.6502.org/tutorials/interrupts.html)
4) выполняется код обработчика
5) выход из обработчика происходит командой RTI, она должна выполняться 6 тактов

Ну и код обработчика было бы хорошо посмотреть, тогда можно было бы все такты подсчитать.

32

Re: NMI, IRQ, развёртка и совмещение видеорежимов

avivanov76 пишет:

стек может легко закончиться

Почему? Каждый обработчик отрабатывает до конца и освобождает стек. Размер стека должен оставаться постоянным независимо от того, как часто вызывается вектор IRQ.

avivanov76 пишет:

3) выполняется вызов обработчика. Вызов должен занимать 7 тактов

"А вот это попробуйте!" (ц)
Я действительно не помню, чтобы код эмуляции учитывал время, которое занимает обработка прерывания. Спасибо за идею. Остальные пункты вроде бы в порядке. За команду RTI я тоже не беспокоюсь, потому что она обрабатывается, как любая другая команда. Но я проверю её длительность.

avivanov76 пишет:

Ну и код обработчика было бы хорошо посмотреть, тогда можно было бы все такты подсчитать.

С этим кодом я не разобрался. Он довольно сложный. Сначала он делает какие-то проверки, не относящиеся к совмещению экранов, а потом делает несколько вызовов подпрограмм. Это надо на него дизассемблер натравливать.

33 Отредактировано Voldemar0 (19-03-2020 07:12)

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Обработчик IRQ РАПИРы должен делать несколько вещей:
- сохранить регистры
- проверить флаг B (?)
- в зависимости от флага:
- либо обработать ситуацию с программным прерыванием (по команде BRK): вывести что-то вроде "система в нестабильном состоянии, рекомендуется перезагрузка" и вернутся в командный режим.
- либо инкремент и проверка счётчика
- в зависимости от счётчика - переключение ДК
- восстановить регистры и сделать RTI

Так что код там может быть не маленьким.

А вот в бейсик-прогах и в бадеровских часах могут быть варианты: либо обработчик IRQ цепляется к цепочке обработчиков (вектора где-то в $3Fx) - тогда он будет заниматься только инкрементом счётчика. Либо он цепляется к векторам $FFFx и там тоже делает только инкремент (и тогда обработка BRK не работает).

Поэтому и проверять эмулятор надо на разных классах прог.

34

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Voldemar0 пишет:

Так что код там может быть не маленьким.

Это я ошибся. Я принял код обработки BRK за основной код обработчика. В реальности там вот это:

NMI:  $1803
1803: JMP $1B68
1B68: JMP $1D99
1D99: PHA
      LDA #$BD
      STA $1B7C
      LDA $C710
      PLA
      RTI
IRQ:  $1CCA
1CCA: STA $45
      PLA
      PHA
      ASL
      ASL
      ASL
      BMI $1CD8
      LDA $45
      JMP $1800
1800: JMP $1B73
1B73: DEC $1B7C
      BNE $1B7B
      STA $C70A
1B7B: RTI

35

Re: NMI, IRQ, развёртка и совмещение видеорежимов

LDA #$BD
STA $1B7C
LDA $C710
...
DEC $1B7C
BNE $1B7B
STA $C70A

Как-то $BD (=189) маловато для совмещённого режима (~3/4 экрана)... 189/500=37.8%, чуть больше трети...

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

36

Re: NMI, IRQ, развёртка и совмещение видеорежимов

LeoN пишет:

189/500=37.8%, чуть больше трети...

А откуда число 500? До исправления кода обработки прерываний в эмуляторе обработчик Рапиры вызывался 259 раз за *полный кадр* -- 312 строк развёртки. После исправления это число уменьшилось до 220 раз за полный кадр.

Рапира показывает 6 строк текста в нижней части экрана. Т.е. в идеале, переключение должно происходить на 208 строке развёртки от начала кадра, или на 264 строке развёртки от сигнала NMI.

37

Re: NMI, IRQ, развёртка и совмещение видеорежимов

SnakE пишет:
avivanov76 пишет:

стек может легко закончиться

Почему? Каждый обработчик отрабатывает до конца и освобождает стек. Размер стека должен оставаться постоянным независимо от того, как часто вызывается вектор IRQ.

В правильно написанном обработчике - да, так и будет. Но очень легко все испортить, добавив в обработчик команду CLI, поскольку после ее выполнения при активном сигнале IRQ произойдет повторный вызов обработчика внутри обработчика. Такой пример мне уже встречался, и я его даже сдуру скопипастил в свою тестовую программу проверки прерываний. Почему-то мне показалось, что она там нужна. Видимо, повлияло знакомство с прерываниями на 8080 и 8086 - там автоматом запрет прерываний не ставится и все надо ручками делать.

1CCA: STA $45     3
      PLA         4
      PHA         3
      ASL         2
      ASL         2
      ASL         2
      BMI $1CD8   2
      LDA $45     3
      JMP $1800   3   
1800: JMP $1B73   3
1B73: DEC $1B7C   6
      BNE $1B7B   2/3
      STA $C70A   4/0
1B7B: RTI         6

Если счетчик !=0, то 42 такта + 7 тактов на вызов прерывания. Если происходит 26 вызовов за один запрос, получается в сумме 49*26 = 1274 такта, при длительности запроса 1024 такта. То есть, уже что-то не то.

38

Re: NMI, IRQ, развёртка и совмещение видеорежимов

avivanov76 пишет:
1B73: DEC $1B7C   6

Ошибка в эмуляторе: команда DEC(ABS) занимает 4 такта. Это что мне, все команды перепроверять? %)

avivanov76 пишет:

49*26 = 1274 такта

Это было до исправления обработки прерываний. После исправления IRQ вызывается 22 раза на запрос. В эмуляторе DEC(ABS) исполняется 4 такта, поэтому весь обработчик 47 тактов, 47*22=1034.

39

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Да, теперь всё правильно: Рапира переключает режим на 207 строке развёртки, так что 208 уже полностью текстовая.

40

Re: NMI, IRQ, развёртка и совмещение видеорежимов

SnakE пишет:

Это что мне, все команды перепроверять? %)

Взялся за гуж, не говори, что не дюж :)

SnakE пишет:

Да, теперь всё правильно: Рапира переключает режим на 207 строке развёртки, так что 208 уже полностью текстовая.

Ура!

41

Re: NMI, IRQ, развёртка и совмещение видеорежимов

avivanov76 пишет:

Взялся за гуж, не говори, что не дюж :)

Я старый больной пью! К тому же, похоже, это была шальная ошибка: у INC, например, всё правильно.

avivanov76 пишет:

Ура!

Но развёртка всё ещё прибита гвоздями к тактам ЦПУ.

Кстати, а были в реальной жизни турбированные Агаты, у которых проц работал на сильно другой частоте? Нужно ли это уметь эмулировать?

42

Re: NMI, IRQ, развёртка и совмещение видеорежимов

SnakE пишет:

А откуда число 500?

SnakE, это я тупанул капитально... Сорри.

SnakE пишет:

Кстати, а были в реальной жизни турбированные Агаты, у которых проц работал на сильно другой частоте?

Ну, серийных-то точно не было. Где-то в году так 94-м я экспериментировал - работало, и сейчас экспериментирую, догнал до 3.5 Махов.

SnakE пишет:

Нужно ли это уметь эмулировать?

Однозначно нужно!

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

43

Re: NMI, IRQ, развёртка и совмещение видеорежимов

В книге Мымрина было написано что применяя 6502А и 6502В можно увеличить скорость работы Агата.

А модуль CPU с ошибкой это какой? Тот что предоставил Марат Файзулин?
https://fms.komkon.org/

Или модуль Олега?

44

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Ошибки были в коде Олега. Код Марата в эмуляторе тоже есть, но используется ли он, я не знаю.

45

Re: NMI, IRQ, развёртка и совмещение видеорежимов

SnakE пишет:

Кстати, а были в реальной жизни турбированные Агаты, у которых проц работал на сильно другой частоте? Нужно ли это уметь эмулировать?

Была плата высокоскоростного сопроцессора ( http://agatcomp.ru/Images/new_CPU/sp-1.jpg ). И вроде кто-то писал, что у нее была поддержка в НиппельОС. Но никаких подробностей про нее я не знаю.

Кстати, любопытно - на сайте написано, что процессор у нее питался от 12 вольт, но в обвязке все микросхемы стоят стандартные, 5-вольтовые. У процессора было отдельное питание ядра что-ли?

46 Отредактировано Voldemar0 (22-03-2020 14:15)

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Протрассировал вызовы на семёрке, в РАПИРе. Насчитал 188 срабатываний IRQ от переключения в NMI до обратного переключения в IRQ.
В аттаче файл rap.trace: в первой колонке 13 младших бит адресной шины, затем отметки о состоянии NMI, IRQ и счётчики событий в {}.
Состояние адресной шины и NMI/IRQ захватывалось по raise F0. Т.е. каждая строка - это такт F0.
Для адресной это точно правильный захват, а вот насчёт NMI/IRQ - не знаю, когда его парсит проц. Если знаете - напишите.

$x01F6::                                                                                                            
$x01F7:: NMI{0}  IRQ{0}                              Поднялись оба прерывания                                                          
$x1C94:: NMI{1}  IRQ{1}                                                                                             
$x1C95:: NMI{2}  IRQ{2}                                                                                             
$x1C95:: NMI{3}  IRQ{3}                              Закончили последнюю операцию                                                               
$x01F7:: NMI{4}  IRQ{4}                               Скидываем на стек слово состояния и PC                                                              
$x01F6:: NMI{5}  IRQ{5}                                                                                             
$x01F5:: NMI{6}  IRQ{6}                                                                                             
$x1FFA:: NMI{7}  IRQ{7}  NMI process{0}          Выбираем вектор обработчика                                                                   
$x1FFB:: NMI{8}  IRQ{8}                                                                                             
$x1803:: NMI{9}  IRQ{9}                                   Исполняем обработчик                                                          
$x1804:: NMI{10}  IRQ{10}                                                                                           
$x1805:: NMI{11}  IRQ{11}            ........ дальше смотрите аттач  

PS Оч надеюсь, что хоть один из имеющихся эмулей будет реально правильно работать с совмещением режимов. В своём я даже не хочу так заморачиваться :)))

Post's attachments

Attachment icon rap-trace.zip 303.76 kb, 25 downloads since 2020-03-22 

47

Re: NMI, IRQ, развёртка и совмещение видеорежимов

PPS Вопрос на подумать: что будет, если в начале NMI-обработчика выключить таймер, а в конце, перед RTI - включить ?

NMI:
      STA $C050
....
      STA $C040
      RTI

Сразу скажу: аппаратура таймера отрабатывает с точностью до такта ЦП.
Т.е. !NMI уже к следующей, после "STA $C050", команде будет в высоком уровне.

У меня получилось следующее:

$x08A5:: 
$x08A6:: 
$x08A7:: 
$x0040::                         C040
$x08A8:: NMI{0}  включили NMI , выполняем команду RTI
$x08A9:: NMI{1}  этот байт запрошен, но не используется ЦП
$x01EB:: NMI{2}  это обращение к стеку не используется никак, реально всё сохранено со следующего байта
$x01EC:: NMI{3}  выгребаем из стека адрес возврата и слово состояния
$x01ED:: NMI{4}  
$x01EE:: NMI{5}  
$x0CAB:: NMI{6}  пытались сделать выборку очередной команды, но так и не стали её выполнять
$x0CAB:: NMI{7}  
$x01EE:: NMI{8}   опять всё на стек
$x01ED:: NMI{9}  
$x01EC:: NMI{10}  
$x1FFA:: NMI{11}  NMI process{0}  
$x1FFB:: NMI{12}  

48

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Voldemar0 пишет:

Оч надеюсь, что хоть один из имеющихся эмулей будет реально правильно работать с совмещением режимов

Оч надеюсь, что я уже очень к этому близок. Пару дней назад я научил свою экспериментальную графику переключаться между любыми режимами с точностью до строки развёртки. Рапира теперь эмулируется правильно. Правда, вылез интересный дефект с Фантавижном: мерцают объекты, двигающиеся на статичном фоне. Попробую это тоже побороть.

Voldemar0 пишет:

PPS Вопрос на подумать: что будет, если в начале NMI-обработчика выключить таймер, а в конце, перед RTI - включить?

Если при отключении прерываний NMI всегда устанавливается в высокий уровень, а при включении -- обратно в низкий, процессор регистрирует ещё один запрос на NMI прерывание и отрабатывает его, как только заканчивается текущая инструкция. Главный вопрос -- какая инструкция будет текущей на момент падения NMI. Я бы ожидал, что RTI не выполнится, но судя по трейсам, она всё-таки исполняется.

49 Отредактировано avivanov76 (23-03-2020 02:12)

Re: NMI, IRQ, развёртка и совмещение видеорежимов

Voldemar0 пишет:

PPS Вопрос на подумать: что будет, если в начале NMI-обработчика выключить таймер, а в конце, перед RTI - включить ?

Нашел тут обсуждение ситуации, когда выполняющийся относительный переход приводит к задержке обработки прерывания (https://atariage.com/forums/topic/16855 … struction/). Может, с RTI что-то похожее?

SnakE пишет:

Главный вопрос -- какая инструкция будет текущей на момент падения NMI.

Если я правильно понял, у семерки разрешение прерываний должно происходить по нарастающему фронту φ0. То есть, к следующей инструкции за STA $C040, процессор уже должен прерывание распознать.

50

Re: NMI, IRQ, развёртка и совмещение видеорежимов

http://agatcomp.ru/Apps/Ssystem.shtml

http://agatcomp.ru/Apps/KVTgred.shtml