Вход

Просмотр полной версии : переход по прерыванию



jerri
20.10.2017, 21:50
никогда не обращал внимания но вот есть такой вопрос

как работает переход по прерыванию

срабатывает так сказать прерывание
запрещаются прерывания
происходит прерывание

штатная процедура по адресу #0038




;сохраняет регистры

sub_38: ; CODE XREF: RAM:0493p
RAM:0038 ; RAM:EB12p
RAM:0038 push af
RAM:0039 push hl

;выполняет то что там надо

RAM:003A ld hl, (FRAMES)
RAM:003D inc hl
RAM:003E ld (FRAMES), hl
RAM:0041 ld a, h
RAM:0042 or l
RAM:0043 jr nz, loc_48
RAM:0045 inc (iy+40h)
RAM:0048
RAM:0048 loc_48: ; CODE XREF: sub_38+Bj
RAM:0048 push bc
RAM:0049 push de

RAM:004A call sub_386E

;восстанавливает всякое

RAM:004D pop de
RAM:004E pop bc
RAM:004F pop hl
RAM:0050 pop af

;разрешает прерывания и выходит

RAM:0051 ei
RAM:0052 ret

но в большинстве фирменных программ программа обработки прерывания начинается с "DI"

почему?
чего я такого не знаю?

Spectramine
20.10.2017, 22:03
Проверил навскидку несколько фирменных игр - нигде обработчик прерывания не начинался с DI. Она там и не нужна, прерывания запрещаются автоматически.

jerri
20.10.2017, 22:54
Проверил навскидку несколько фирменных игр - нигде обработчик прерывания не начинался с DI. Она там и не нужна, прерывания запрещаются автоматически.

проверь еще несколько игр
Kong Strikes Back (http://www.worldofspectrum.org/infoseekid.cgi?id=0002742)
Kongs Revenge (http://www.worldofspectrum.org/infoseekid.cgi?id=0002745&loadpics=3)

я так то в курсе, но запрещал потому, как делали отдельные товарищи

Evgeny Muchkin
20.10.2017, 22:54
Для меня тоже является загадкой нафига DI, и еще нафига RETI :)

jerri
20.10.2017, 23:08
Для меня тоже является загадкой нафига DI, и еще нафига RETI :)

по идее с reti ei не надо

NEO SPECTRUMAN
21.10.2017, 00:23
по идее с reti ei не надо
по моему нифига
еи всегда нужен

очень долго не мог завести свою первую программу с прерываниями
оказалось что инт их запрещает (о чем я тогда не знал)
пока не поставил еи ничего не заработало...

по моему reti влеплен для несрабатывания одного прерывания во время выполнения другого в некоторых машинах

- - - Добавлено - - -


но в большинстве фирменных программ программа обработки прерывания начинается с "DI"

почему?

Для меня тоже является загадкой нафига DI,
для подстраховки
боялись что может сработать другой инт во время первого
это щас у нас любой недокументированый з80 мануал под рукой
а тогда когда это писали интернетов небыло...

я тоже ставлю местами nop-ы с єтой целью
на случай если схема железного компа не успеет полностью "переключится" до момента выполнения следующей команды или на оборот(вспоминаем статью про щелканье страницами видео памяти и как видео контролер случайно берет пиксели и атрибуты из разных страниц)

а в некоторых машинах это актуально

по моему нгс требует программных задержек
тк у него нету вайтов

shurik-ua
21.10.2017, 00:53
Кажется RETI используется контроллером прерываний семейства Z80 - то есть он следит за шиной и когда проц выполняет RETI, то он точно знает что обработка прерываний завершена, чтобы приоритет там сдвинуть или ещё для чего.

Titus
21.10.2017, 03:35
но в большинстве фирменных программ программа обработки прерывания начинается с "DI"

почему?
чего я такого не знаю?

Очевидно, для подстраховки. Т.е. на всякий случай, как бы чего не случилось)
Иного обьяснения нет)

drbars
21.10.2017, 08:12
Кажется RETI используется контроллером прерываний семейства Z80 - то есть он следит за шиной и когда проц выполняет RETI, то он точно знает что обработка прерываний завершена, чтобы приоритет там сдвинуть или ещё для чего.
С DMA используется.

Alex Rider
22.10.2017, 21:04
Очевидно, для подстраховки. Т.е. на всякий случай, как бы чего не случилось)
Иного обьяснения нет)
Ну может быть редкий умный случай - когда ISR зовется по call, не по прерыванию, и пришедшее в этот момент прерывание может сделать больно.

TomaTLAB
22.10.2017, 21:38
Ну может быть редкий умный случай -
Не такой уж и редкий. За спек не скажу - не копенгаген, а вообще типа "правило хорошего тона".
Да и вообще, прямой запрет прерывания много где нужен, по хорошему, когда требуется "атомарность" процедуры.
Да тот же мапер перещелкнуть и т.п.

null_device
22.10.2017, 21:41
в большинстве фирменных программ программа обработки прерывания начинается с "DI"

почему?


ЕМНИП, в толмуде первого тома комплекта чипов серии Зю80 (http://trd.speccy.cz/book/Z80CPU.ZIP), выходит, что это как-то связано с режимами отличными от IM0, когда в момент операции с режимом прерывания, возможен его "повторный захват" (мера, схожая с таблицей вектора, для машин с "нестабильной" шиной).

jerri
22.10.2017, 21:52
null_device, однако в ПЗУ этого нет Di отсутсвует
и в поздних играх, Joffa например, тоже экономит байт от DI
или даже сразу делает EI

Titus
23.10.2017, 17:26
Ну может быть редкий умный случай - когда ISR зовется по call, не по прерыванию, и пришедшее в этот момент прерывание может сделать больно.
Только в этом случае)
Но вряд ли в тех примерах, на которые ссылается автор, такой вызов использовался.

- - - Добавлено - - -


Не такой уж и редкий. За спек не скажу - не копенгаген, а вообще типа "правило хорошего тона".
Да и вообще, прямой запрет прерывания много где нужен, по хорошему, когда требуется "атомарность" процедуры.
Да тот же мапер перещелкнуть и т.п.
Мы говорим именно 'за спек'.
На спектруме этого делать не нужно. Прерывания запрещаются автоматически.
Возможно, люди, которые так делают, просто не читали подробно документацию, вот и перестраховываются)

Spectramine
23.10.2017, 17:43
Этого делать не нужно на любом компе на Z80, не только на спеке. Интересно, существуют ли процессоры, в которых нет автоматического запрещения прерываний при подтверждении прерывания и переходе к обработчику?

goodboy
23.10.2017, 18:22
На спектруме этого делать не нужно. Прерывания запрещаются автоматически.
Возможно, люди, которые так делают, просто не читали подробно документацию, вот и перестраховываются

в нашей юности был только трёхтомник инфоркома по ассемблеру
и так как раз советовали первым делом запрещать прерывания (дабы не случился повторный захват)

Titus
23.10.2017, 21:10
в нашей юности был только трёхтомник инфоркома по ассемблеру
и так как раз советовали первым делом запрещать прерывания (дабы не случился повторный захват)
Я его не читал, т.к. выписал себе в самом начале 90-х (вроде бы в 91 году) книженцию по Z80 - Микропроцессорный комплект Z80, книга 1. И там все шикарно было описано.

Barmaley_m
26.10.2017, 00:29
Интересно, существуют ли процессоры, в которых нет автоматического запрещения прерываний при подтверждении прерывания и переходе к обработчику?
Во многих микроконтроллерах обработчик может быть прерван другим прерыванием с более высоким приоритетом. Но прерывания от того же источника обычно все-таки запрещаются. А еще бывает NMI, Даже на Z80. Правда, в современных системах NMI от внешнего устройства (т.е. прерывание, а не исключение) обычно не используются, т.к. вложенность обработчика может привести к сбою, а пользы от "истинного" NMI не просматривается. С одной стороны, хорошо иметь такое прерывание, которое сработает в случае любого сбоя программы; с другой стороны, обработчик такого прерывания ничего не сможет сделать для восстановления. С тем же успехом можно просто осуществить сброс. Ну и еще есть вариант использования NMI для отладки и/или сохранения краш-дампа. Сброс - он всё-таки затирает состояние процессора, а при NMI состояние сохраняется.