Можно ли на Паскале написать программу парковки головки диска перед выключением. И если можно то как (подскажите идею).
volvo
19.11.2004 16:04
Alexn
А зачем? Современные диски имеют автопарковку... Или это нужно для старых дисков?
А вообще-то это делается функцией 19h (прерывание BIOS - 13h). На входе: AH = 19h, DL = Адрес дисковода (80h, 81h, ...) На выходе: AH = Состояние дисковода после завершения последней операции CF = 1, если произошла ошибка, 0, если ошибки нет
P.S. Windows не даст этого сделать - только в режиме эмуляции DOS
Alexn
23.11.2004 11:24
я собрал старый 286 (DOS 6.22, windows 2.03 и 1 версии :p13: ) выключаю просто выключателем, потому и спрашиваю. Так шо виндовс нам не страшен, нам бы дос осилить быстро.
Altair
23.11.2004 18:56
windows 1 версии? Сколько весит? Можно мне на мыло такой раритет?
Спасибо. Посмотрю что это за зверюшка дяди Билли :D
Alexn
24.11.2004 16:31
Я на int21.narod.ru взял win1. Там еще много раритетов. И еще, я не настолько умудрен опытом чтобы понять, что мне объяснили на счет прерываний. Я конечно представляю, что это. Только я вот пару дней голову ломал как это запихнуть в Паскаль. Но все равно спасибо :thanks: .
volvo
24.11.2004 16:48
Alexn Если нужно, чтобы программа только парковала диски - то это будет выглядеть вот так:
Procedure Park; Assembler; Asm mov ah,19h mov dl,80h int 13h End; Begin Park End.
Хотя было бы гораздо проще написать ее на чистом ассемблере (создается COM файл...)
.model tiny .code org 100h begin: mov ah,19h mov dl,80h int 13h ret end begin
Alexn
25.11.2004 12:15
Спасибо. Если не трудно, еще пару вопросов. int 13h - это выполнить насколько я понимаю. А вот что за функция 19h? И как проверить припарковался ли диск. Например, если нет ошибок then write('теперь питание можно выключить'). Как прочитать CF.
Цитата
AH = Состояние дисковода после завершения последней операции
В регистр AH что записывается иное значение после выполнения программы (мы ведь туда записали 19h, опять же если я правильно понял).
xds
25.11.2004 15:17
Прерывание int 13h - дисковые службы BIOS. Служба 19h предназначена для парковки головок жесткого диска. В DL она принимает идентификатор устройства (80h - первый жесткий диск, 81h - второй (если есть) и т. д.). В случае возникновения ошибки она, как и прочие дисковые службы, устанавливает флаг переноса (CF), возвращая в AH код состояния (номер ошибки).
Пример:
program SomeApp;
{...}
function ParkHDD(DriveId: Byte): Boolean; assembler; asm mov ah,19h mov dl,DriveId int 13h mov al,0 jc @Exit inc ax @Exit: end;
{...}
begin {...} if not ParkHDD($80) then begin Writeln('Ошибка парковки'); {...} end; {...} end.
Alexn
25.11.2004 16:34
Цитата
begin {...} if not ParkHDD($80) then begin Writeln('Ошибка парковки'); {...} end; {...} end.
А чтобы припарковать я перед if not просто должен написать parkhdd($80), да?
volvo
25.11.2004 17:05
Alexn Ничего писать не нужно, при выполнении этой строчки:
if not ParkHDD($80) then
уже выполнится парковка, и будет анализироваться ее результат...
Alexn
26.11.2004 13:54
Т.е., это законченная пргограмма парковки с проверкой, да?
program Park;
function ParkHDD(DriveId: Byte): Boolean; assembler; asm mov ah,19h mov dl,DriveId int 13h mov al,0 jc @Exit inc ax @Exit: end;
begin if not ParkHDD($80) then Writeln('Ошибка парковки'); end.
(программа xds)
xds
26.11.2004 15:36
От завершённости её отделяет отсутствие проверки на наличие нескольких устройств. Полнее будет так:
program Park;
{ Типы дисководов } const dtNone = 0; { нет устройства с указанным идентификатором } dtNonSenseFDD = 1; { FDD, не чувствительный к смене носителя } dtSenseFDD = 2; { FDD, чувствительный к смене носителя } dtHDD = 3; { HDD }
{ Определение типа дисковода } function GetDriveType(DriveId: Byte): Byte; assembler; asm mov ah,15h mov dl,DriveId int 13h mov al,ah end;
begin for Id := $80 to $83 do if GetDriveType(Id) = dtHDD then begin Write('HDD', Id - $80, ': '); if ParkHDD(Id) then Writeln('парковка головок выполнена успешно.') else Writeln('ошибка парковки головок.'); end; end.
Alexn
26.11.2004 15:54
Что может заставить головку сдвинуться? Например если после выполнения park.exe я нажму esc чтобы посмотреть сообщение (убрать панели волков командер), или если я вставлю в конце программы readkey, в общем после нажатия клавиш она не дернется куда-нибудь, что-нибудь прочитать?
xds
27.11.2004 7:14
Вставь ReadKey - гарантированно ничего не двинется (за исключением случая, когда установлен дисковый кэш и включена отложенная запись).
Alexn
27.11.2004 15:21
Как я узнаю, установлен диковый кэш и отложенная запись или нет?
volvo
27.11.2004 15:36
Alexn Объясни мне, почему нельзя взять файл PARK.EXE и пользоваться им?
Alexn
30.11.2004 16:32
Цитата
почему нельзя взять файл PARK.EXE и пользоваться им?
Чтобы знать, как все это работает.
Цитата
Полнее будет так:
У меня эта програма выдает HDD0: ошибка HDD1: ошибка Но у меня только 1 диск и в биосе 1 (173 Mb). Может он слишком большой для ДОС 6.22. Если не надоело помогать, подскажите в чем дело.
Alexn
30.11.2004 16:35
Да, у меня 2 флопа 3.5 и 5.25. Может это тоже влияет. В биосе можно выставить 4 флопа и 4 винта (но стоит только 1).
volvo
30.11.2004 16:51
Цитата
Может он слишком большой для ДОС 6.22.
Нет, навряд ли он большой - дело скорее всего в другом.
Вот здесь есть список всех функций прерывания 13h, и для каждой функции - типы компьютеров, на которых данная функция работоспособна. Вот что там написано про функцию парковки:
Цитата
Парковка головок НМД На входе: AH 19h DL Адрес НМД (80h, 81h, ...) На выходе: AH Состояние устройства после завершения последней операции CF 1, если произошла ошибка; 0, если ошибки нет Примечание: PS/2
То есть, функция не работает на PC, XT, AT... Может в этом проблема?
xds
1.12.2004 5:58
DOS тут ни при чём: int 13h - это функции BIOS. На 286-х BIOS может не поддерживать службу 19h. Во времена 286-х вместе с каждым винтом обычно поставлялась своя программа парковки, "заточенная" под конкретную модель. Так, в годы беззаботного детства, программу парковки для своей XT, укомплектованной "монстром" Seagate ST-225, я писал сам, основываясь на технической документации по винту. Парковка производилась с помощью службы 0Ch (поиск цилиндра) :D
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.