по выходу из call 3d13 прерывания разрешаются автоматом?
по выходу из call 3d13 прерывания разрешаются автоматом?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Прерывания разрешают функции чтения и записи сектора на диск в конце своего выполнения. Там на входе стоит 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 точно не знаю.
Огромное спасибо! Это отвечает на все мои вопросы. Жаль, что ни в одном из множества документов, которые я ранее читал, этой инфы не встретилось - это сэкономило бы массу времени на investigation.Сообщение от Sonic
а я лишь добавлю, что есть компы, в которых не будут читаться дискеты даже при IM1 если вектор I находится в медленной памяти (например #40-#7F)
http://www.zilog.com/docs/z80/um0080.pdfThe RETI instruction also facilitates the nesting of interrupts, allowing higher priority devices to temporarily suspend service of lower priority service routines. However, this instruction does not enable interrupts that were disabled when the interrupt routine was entered. Before doing the RETI instruction, the enable interrupt instruction (EI) should be executed to allow recognition of interrupts after completion of the current service routine.
о! спасибо!
Это написано в книге А.Ларченко и Н. Родионова "TR-DOS Для пользователей и программистов"Сообщение от moroz1999
так может стоит её выложить хотя бы на VT?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)