Цитата Сообщение от апро Посмотреть сообщение
Может я что то недопонимаю, но насколько я понял из книг по ассемблеру, прерывание начинает обрабатывться после команды 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 до прихода прерывания, подменяющего адрес исполнения, а оригинал - нет.