Помощь - Поиск - Пользователи - Календарь
Полная версия: Парковка
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Alexn
Можно ли на Паскале написать программу парковки головки диска перед выключением. И если можно то как (подскажите идею).
volvo
Alexn

blink.gif А зачем? Современные диски имеют автопарковку... Или это нужно для старых дисков?

А вообще-то это делается функцией 19h (прерывание BIOS - 13h).
На входе:
AH = 19h, DL = Адрес дисковода (80h, 81h, ...)
На выходе:
AH = Состояние дисковода после завершения последней операции
CF = 1, если произошла ошибка, 0, если ошибки нет

P.S. Windows не даст этого сделать - только в режиме эмуляции DOS sad.gif
Alexn
я собрал старый 286 (DOS 6.22, windows 2.03 и 1 версии :p13: )
выключаю просто выключателем, потому и спрашиваю.
Так шо виндовс нам не страшен, нам бы дос осилить быстро.
Altair
windows 1 версии?
Сколько весит?
Можно мне на мыло такой раритет?
volvo
Oleg_Z
Смотри здесь.
Win103.img_sfx.exe (Размер - 1,3М) :yes:
Altair
Спасибо. Посмотрю что это за зверюшка дяди Билли smile.gif :D
Alexn
Я на int21.narod.ru взял win1.
Там еще много раритетов.
И еще, я не настолько умудрен опытом чтобы понять, что мне объяснили на счет прерываний. Я конечно представляю, что это. Только я вот пару дней голову ломал как это запихнуть в Паскаль. Но все равно спасибо :thanks: .
volvo
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
Спасибо. Если не трудно, еще пару вопросов.
int 13h - это выполнить насколько я понимаю.
А вот что за функция 19h?
И как проверить припарковался ли диск.
Например, если нет ошибок then write('теперь питание можно выключить').
Как прочитать CF.
Цитата
AH = Состояние дисковода после завершения последней операции

В регистр AH что записывается иное значение после выполнения программы (мы ведь туда записали 19h, опять же если я правильно понял).
xds
Прерывание 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
Цитата
begin
{...}
if not ParkHDD($80) then
begin
  Writeln('Ошибка парковки');
  {...}
end;
{...}
end.


А чтобы припарковать я перед if not просто должен написать parkhdd($80), да?
volvo
Alexn
Ничего писать не нужно, при выполнении этой строчки:
if not ParkHDD($80) then

уже выполнится парковка, и будет анализироваться ее результат...
Alexn
Т.е., это законченная пргограмма парковки с проверкой, да?

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
От завершённости её отделяет отсутствие проверки на наличие нескольких устройств. Полнее будет так:

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;

{ Парковка HDD }
function ParkHDD(DriveId: Byte): Boolean; assembler;
asm
 mov ah,19h
 mov dl,DriveId
 int 13h
 mov al,0
 jc @Exit
 inc ax
@Exit:
end;

var
 Id: Byte;

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
Что может заставить головку сдвинуться?
Например если после выполнения park.exe я нажму esc чтобы посмотреть сообщение (убрать панели волков командер), или если я вставлю в конце программы readkey, в общем после нажатия клавиш она не дернется куда-нибудь, что-нибудь прочитать?
xds
Вставь ReadKey - гарантированно ничего не двинется (за исключением случая, когда установлен дисковый кэш и включена отложенная запись).
Alexn
Как я узнаю, установлен диковый кэш и отложенная запись или нет?
volvo
Alexn
Объясни мне, почему нельзя взять файл PARK.EXE и пользоваться им?
Alexn
Цитата
почему нельзя взять файл PARK.EXE и пользоваться им?


Чтобы знать, как все это работает.

Цитата
Полнее будет так:


У меня эта програма выдает HDD0: ошибка
HDD1: ошибка
Но у меня только 1 диск и в биосе 1 (173 Mb). Может он слишком большой для
ДОС 6.22.
Если не надоело помогать, подскажите в чем дело.
Alexn
Да, у меня 2 флопа 3.5 и 5.25. Может это тоже влияет.
В биосе можно выставить 4 флопа и 4 винта (но стоит только 1).
volvo
Цитата
Может он слишком большой для ДОС 6.22.

Нет, навряд ли он большой - дело скорее всего в другом.


Вот здесь есть список всех функций прерывания 13h, и для каждой функции - типы компьютеров, на которых данная функция работоспособна. Вот что там написано про функцию парковки:
Цитата
Парковка головок НМД
На входе:
  AH 19h
  DL Адрес НМД (80h, 81h, ...)
На выходе:
  AH Состояние устройства после завершения последней операции
  CF 1, если произошла ошибка; 0, если ошибки нет
Примечание:
  PS/2

То есть, функция не работает на PC, XT, AT...
Может в этом проблема?
xds
DOS тут ни при чём: int 13h - это функции BIOS. На 286-х BIOS может не поддерживать службу 19h. Во времена 286-х вместе с каждым винтом обычно поставлялась своя программа парковки, "заточенная" под конкретную модель. Так, в годы беззаботного детства, программу парковки для своей XT, укомплектованной "монстром" Seagate ST-225, я писал сам, основываясь на технической документации по винту. Парковка производилась с помощью службы 0Ch (поиск цилиндра) :D
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.