
Сообщение от
ZXMAK
А можно поподробнее как это обрабатывает реальная вг93? Зачем тут принудительное прерывание?
Итак, *****код процедуры торможения диска в лоадере Satisfaction находится по адресу #6084.
Код:
xor a
out (#1f),a
ld a,#d0
out (#1f),a
ret
Непосредственно после загрузки первой части мегадемо, до выполнения процедуры торможения диска, имеем следующую ситуацию в эмуляторе:

Далее выполняется код:
Код:
xor a - гасим лампочку, bit 3 загрузки головки h выставляем в 0
out (#1f),a
Здесь выполняется команда "Восстановление" 0000hvxx - обеспечивает переход МГ на нулевую дорожку ГМД. Команда имеет следующие параметры:
h - бит определяет положение магнитной головки дисковода во время выполнения команды. Если он обнулен, то головка поднята, если установлен - находится в рабочем положении (опущена на дискету). Следует учитывать, что при h=0, контроллер не выдает сигнал на включение двигателя дисковода. Выход на нулевую дорожку подтверждается состоянием входного сигнала TR00 который поступает с НГМД. Если сигнал TR00 = 0, это означает, что МГ находится в исходном состоянии. Если сигнал TR00 = 1 (наш случай) микроконтроллер генерирует не более 255 шаговых импульсов STEP. Если после генерации 255 импульсов устанавливается низкий уровень сигнала TR00, то в бит состояния "Ошибка поиска" в регистр состояния записывается единица. Другими словами, физический дисковод на реале никуда головку перемещать не будет, но ВГ-93 отработает 255 шаговых имульсов. А в эмуляторе это не учитывается. После этого:

Далее, чтобы прервать эти шаговые импульсы выполняется код:
Код:
ld a,%11010000 - принудительно прерываем выполнение команды
out (#1f),a
ret
Здесь выполняется команда "Принудительное прерывание" 1101i3i2i1i0 - задается для завершения какой-либо выполняемой команды. В отличии от других команд она может быть записана в регистр команд в любой момент. Однако, исполнение команды может определяться состоянием младших битов i0 - i3. Если биты i0 - i3 в состоянии "0" (наш случай), то немедленно прекращается выполнение текущей команды и сигнал подтверждения завершения команды INTRQ не вырабатывается. После этого:

Затем, когда загрузчик пытается загрузить новую часть демо, то turbo loader виснет в цикле при чтении сектора на ошибке "сектор не найден".
Обрати внимание на номер трека и статус на последнем скрине, по идее значения должны быть такими (если я правильно понимаю):
Код:
STATUS: #80
TRK: #03
beta: #00
Ну, в общем, как-то так.