User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 37

Тема: im2 и call 3d13

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,517
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    39 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию im2 и call 3d13

    по выходу из call 3d13 прерывания разрешаются автоматом?

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    27.04.2005
    Адрес
    Москва
    Сообщений
    886
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Прерывания разрешают функции чтения и записи сектора на диск в конце своего выполнения. Там на входе стоит DI, на выходе EI.
    Функции обслуживания Magic прерываний не разрешают, но у них есть недостаток: при возникновении любой ошибки на диске они тупо делают 20 попыток затем зависают (HALT). Никаких запросов, ничего.
    Возможно забыл еще какие-то места, но вроде нет.
    Проблема решается просто: регистром I указываем на ПЗУ. Получаем два различных обработчика прерывания. Один из них вызывается из ПЗУ бейсика-48, второй из TR-DOS. Второй должен возвращаться по EI: JP #3D2F.
    На старых машинах с нестабильной шиной данных (на которой в пассивном состоянии не #FF) к сожалению это работать не будет.

  4. #3

    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,517
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    39 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    стоп, я не совсем понял - а если у меня уже оформлен IM2, с таблицей адресов для нестабильной шины, то мне его нужно запретить или разрешить при чтении с диска (c=#5)? На прерываниях при этом ничего не висит, там стоят только EI и RETI.

    я тут просто пытаюсь понять, почему у меня при выставленном IM1 всё работает, а при выставленном, но запрещенном IM2 при обращении к 3D13 всё периодически падает.


    кстати, еще вопрос, немного оффтоповый - нужно ли делать EI перед RETI, вроде как читал что RETI сама по себе разрешает прерывания?

  5. #4

    Регистрация
    27.04.2005
    Адрес
    Москва
    Сообщений
    886
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если ты используешь таблицу адресов из ОЗУ, то при обращении к TR-DOS ты совершенно закономерно получишь падение. Все дело в том, что после разрешения прерываний в ПЗУ TR-DOS выполняется еще куча действий (восстановление системной среды). В процессе этого работает код из ПЗУ TR-DOS. Первое же прерывание отключит его (ибо произойдет переход в ОЗУ на твой обработчик). Вернешься из прерывания ты уже не в то ПЗУ в которое нужно.
    Проблема решения не имеет ибо внутри обработчика прерываний нельзя определить, из какого ПЗУ он был вызван.
    Если хочешь работоспособности на старых машинах - включай IM 1 перед обращением к TR-DOS.
    По поводу RETI точно не знаю.

  6. #5

    Регистрация
    17.01.2005
    Адрес
    Tallinn
    Сообщений
    2,517
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    86
    Поблагодарили
    39 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sonic
    Если ты используешь таблицу адресов из ОЗУ, то при обращении к TR-DOS ты совершенно закономерно получишь падение. Все дело в том, что после разрешения прерываний в ПЗУ TR-DOS выполняется еще куча действий (восстановление системной среды). В процессе этого работает код из ПЗУ TR-DOS. Первое же прерывание отключит его (ибо произойдет переход в ОЗУ на твой обработчик). Вернешься из прерывания ты уже не в то ПЗУ в которое нужно.
    Огромное спасибо! Это отвечает на все мои вопросы. Жаль, что ни в одном из множества документов, которые я ранее читал, этой инфы не встретилось - это сэкономило бы массу времени на investigation.

  7. #6

    Регистрация
    15.01.2005
    Адрес
    Kievska Rus
    Сообщений
    1,149
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а я лишь добавлю, что есть компы, в которых не будут читаться дискеты даже при IM1 если вектор I находится в медленной памяти (например #40-#7F)

  8. #7

    Регистрация
    23.05.2005
    Адрес
    Санкт-Петербург
    Сообщений
    367
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от moroz1999
    Жаль, что ни в одном из множества документов, которые я ранее читал, этой инфы не встретилось - это сэкономило бы массу времени на investigation.
    Это написано в книге А.Ларченко и Н. Родионова "TR-DOS Для пользователей и программистов"

  9. #8

    Регистрация
    08.02.2006
    Адрес
    Москва
    Сообщений
    30
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sonic
    Проблема решения не имеет ибо внутри обработчика прерываний нельзя определить, из какого ПЗУ он был вызван.
    Если хочешь работоспособности на старых машинах - включай IM 1 перед обращением к TR-DOS.
    По поводу RETI точно не знаю.
    Как это не имеет?
    Кто то использует процедуры ПЗУ??

    Проверяешь стек, если адрес возврата - ПЗУ, возвращаешь в TR-DOS.

  10. #9

    Регистрация
    16.11.2005
    Адрес
    Санкт-Петербург
    Сообщений
    2,925
    Спасибо Благодарностей отдано 
    1,168
    Спасибо Благодарностей получено 
    362
    Поблагодарили
    198 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от klondike
    Проверяешь стек, если адрес возврата - ПЗУ, возвращаешь в TR-DOS.
    Браво! Простенько и со вкусом!

  11. #10

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от klondike
    Проверяешь стек, если адрес возврата - ПЗУ, возвращаешь в TR-DOS.
    кажись, не факт, что так будет работать. делали проще, в прерывании ставили ei:jp #3d2f. тогда если был вызов из пзу тр-дос, он туда и возвращается и все работает. если вызов из озу, то он просто по RET(#3d30) вернется в озу. НО(!), если был вызов из пзу бейсика, то облом. для турболоадеров это прокатывало, потому что они пзу бейсика не юзали, а вот для #3d13 точно не прокатит.

    как вариант - ставить перехватчик на #5cc2 что ли, или где там находится RET, чтоб он щучил переключения между пзу и менял jp #3d2f на RET в обработчике прерывания.

    вот

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. TR-Dos #3D13 с отключенной обработкой ошибок
    от Sinus в разделе Программирование
    Ответов: 1
    Последнее: 17.08.2011, 09:51
  2. Функция #0a процедуры #3d13
    от axor в разделе Программирование
    Ответов: 3
    Последнее: 12.10.2006, 16:31
  3. call#3d13 = call#3d14
    от rasmer в разделе Программирование
    Ответов: 4
    Последнее: 22.06.2005, 17:05

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •