![]() |
im2 и call 3d13
по выходу из call 3d13 прерывания разрешаются автоматом?
|
Прерывания разрешают функции чтения и записи сектора на диск в конце своего выполнения. Там на входе стоит DI, на выходе EI.
Функции обслуживания Magic прерываний не разрешают, но у них есть недостаток: при возникновении любой ошибки на диске они тупо делают 20 попыток затем зависают (HALT). Никаких запросов, ничего. Возможно забыл еще какие-то места, но вроде нет. Проблема решается просто: регистром I указываем на ПЗУ. Получаем два различных обработчика прерывания. Один из них вызывается из ПЗУ бейсика-48, второй из TR-DOS. Второй должен возвращаться по EI: JP #3D2F. На старых машинах с нестабильной шиной данных (на которой в пассивном состоянии не #FF) к сожалению это работать не будет. |
стоп, я не совсем понял - а если у меня уже оформлен IM2, с таблицей адресов для нестабильной шины, то мне его нужно запретить или разрешить при чтении с диска (c=#5)? На прерываниях при этом ничего не висит, там стоят только EI и RETI.
я тут просто пытаюсь понять, почему у меня при выставленном IM1 всё работает, а при выставленном, но запрещенном IM2 при обращении к 3D13 всё периодически падает. кстати, еще вопрос, немного оффтоповый - нужно ли делать EI перед RETI, вроде как читал что RETI сама по себе разрешает прерывания? |
Если ты используешь таблицу адресов из ОЗУ, то при обращении к TR-DOS ты совершенно закономерно получишь падение. Все дело в том, что после разрешения прерываний в ПЗУ TR-DOS выполняется еще куча действий (восстановление системной среды). В процессе этого работает код из ПЗУ TR-DOS. Первое же прерывание отключит его (ибо произойдет переход в ОЗУ на твой обработчик). Вернешься из прерывания ты уже не в то ПЗУ в которое нужно.
Проблема решения не имеет ибо внутри обработчика прерываний нельзя определить, из какого ПЗУ он был вызван. Если хочешь работоспособности на старых машинах - включай IM 1 перед обращением к TR-DOS. По поводу RETI точно не знаю. |
Quote:
|
а я лишь добавлю, что есть компы, в которых не будут читаться дискеты даже при IM1 если вектор I находится в медленной памяти (например #40-#7F)
|
Quote:
|
о! спасибо! :)
|
Quote:
|
так может стоит её выложить хотя бы на VT? :)
|
| All times are GMT +4. The time now is 13:39. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.