Код:
; ПП проверки готовности НЖМД
L_D9D9: PUSH D
PUSH B
MVI D, 005h ; пять раз...
L_D9DD: IN 057h ; Регистр данных. Чтение данных в буфер сектора контроллера
ANI 0C0h ; 1100 0000
CPI 040h ; 0100 0000 устройство готово к операции
JZ L_D9F2 ; >> выход из цикла, при выходе A=40h
DCX B
MOV A, B
ORA C
JNZ L_D9DD ; цикл на 65536 попыток
DCR D
JNZ L_D9DD ; цикл на 5*65536 попыток, при выходе A,B,C,D=0
L_D9F2: ANA A ; устанавливаем признаки по А
POP B
POP D
JZ L_D9F8 ; получение кода ошибки и RET
IN 057h ; Регистр данных. Чтение данных в буфер сектора контроллера
RET
;
; ПП чтения ошибки
L_D9F8: POP PSW ; чистка стека
L_D9F9: IN 057h ; Регистр данных. Чтение данных в буфер сектора контроллера
RRC ; сдвиг вправо, бит 0 заносится в признак С.
IN 051h ; Чтение: Регистр ошибок. Содержит признаки последней ошибки.
JC L_DA02 ; если предыдущая команда закончилась с ошибкой
XRA A ; ошибки нет
L_DA02: MOV B, A ; В = код ошибки
IN 057h ; Регистр данных. Чтение данных в буфер сектора контроллера
MOV C, A ; сохраняем результат
ANI 020h ; выделяем ошибку "сбой записи"
ORA B
MOV B, A ; дополняем код ошибки в В
MOV A, C ; восст. Регистр данных.
ANI 0C0h ; выделение сигналов "устройство готово" и "занято"
CPI 040h ; уст.Z если "готово"
MOV A, B ; код ошибки в А
JZ L_E6AB ; переход, если сигнал "готово" (?было на L_DA15)
MVI A, 010h ; 1xH = сброс на цилиндр 0 (x = step rate) (?было ORI)
xxDA15: OUT 05Fh ; Системный сброс (лучше не пользоваться, сходство с 57Н без обнуления микросхем жесткого диска).
L_E6AB: STA L_E873 ; сохраняем код ошибки
ANA A ; устанавливаем признаки по ошибке
RET