В iS-DOS есть рестарт #1E, который позволяет добавлять в цепочку процедур, вызываемых при обработке прерывания IM2, свою процедуру (например для индикации часов и т.п.). В процессе работы я столкнулся с глюком (?). Проявляется он в том, что если в своей процедуре, подключаемой к обработчику IM2, менять стек (например вызывать подпрограммы), то получем гаранированный "вылет". К примеру, следующий код вешает систему:
ORG 25000
LD A,#FF ;добавляем свою процедуру IM2 в обработчик прерываний
DI
LD HL,IM2
LD C,#1E
RST 16
EI
LD C,7 ;этот рестарт ждёт нажатия Any Key
RST 16
DI ;убираем процедуру IM2 из обработчика прерываний
XOR A
LD HL,IM2
LD C,#1C
RST 16
EI
RET ;выходим в систему
AAA RET
;собственно сама процедура, которую я добавляю в обработчик прерываний
IM2 CALL AAA ;вызываю любую подпрограмму
RET ;и завершаю работу
Вот этот вызов CALL AAA вешает систему. Хотя не должен никаким образом.
Если убрать из процедуры IM2 команду CALL AAA, то всё работает.
Почему?
Я уже все мозги сломал, пытаясь понять![]()




Ответить с цитированием