Подпрограммы ПЗУ контроллера дисковода

В ПЗУ контроллера дисковода имеется ряд подпрограмм, служащих для работы с диском на уровне секторов. Все прочие программы, обеспечивающие чтение/запись файлов или форматирование дискет, обращаются к этим подпрограммам, и знания о них понадобятся вам, особенно если начать писать свои “спасающие” программы.

а) 160000 --- загрузка

@#160000 — подпрограмма-автозагрузчик операционной системы с загрузочной дискеты. Автоматически ищет загрузочный диск на всех имеющихся дисководах и найдя, загружает. Не требует параметров. Может быть вызвана командой БК-0010 ЕМТ52.

б) 160004 --- чтение/запись

@#160004 — подпрограмма чтения/записи секторов (ЕМТ54). Подпрограмме передаются параметры:

  • R0 — номер первого сектора из группы читаемых или записываемых.
  • R1 — длина массива информации (файла). Задается в двухбайтных машинных словах. Если длина больше нуля, это означает чтение, если меньше нуля (NEG R1), — запись.
  • R2 — начальный адрес массива информации в ОЗУ.
  • R3 — адрес размещения в ОЗУ рабочей области контроллера.

Подпрограмма читает или записывает указанное количество двухбайтных слов, начиная с заданных адреса в ОЗУ и сектора на диске. Количество читаемых или записываемых секторов зависит от длины файла (каждый сектор занимает 0.5 кб или в БКшечном восьмеричном представлении 1000). По результатам чтения устанавливается состояние бита С слова состояния процессора. Если чтение произведено без ошибок, С=0. Если возникла ошибка чтения/записи, С=1 и в ячейке ОЗУ по адресу @#52 находится байт — номер ошибки (коды ошибок восьмеричные):

Код Причина ошибки
1 Запись: диск заклеен; чтение: ошибка контрольной суммы в зоне данных
2 Ошибка в заголовке сектора
3 Нет выхода на 0 дорожку
4 Ошибка позиционирования
5 Не найден сектор
6 Нет диска или он не вращается
7 Прерывание по клавише СТОП
010 Не найден адресный маркер
011 Не найден маркер данных
012 Недопустимые параметры команды или формат диска

в) 160010 --- инициализация

@#160010 — подпрограмма создания в ОЗУ и заполнения служебной области для функционирования контроллера и дисковода (рабочей области). Подпрограмма может быть вызвана по ЕМТ56. Параметр: R3 — адрес начала рабочей области в ОЗУ.

В рабочей области записаны данные (указано смещение в байтах от начала, восьм.):

  • 2 — адрес текущей дорожки диска (2 байта);
  • 4 — таблица текущих дорожек (4 байта);
  • 010 — задержка на опускание головки (количество циклов SOB; 2 байта);
  • 012 — задержка перехода с дорожки на дорожку (2 байта);
  • 014 — номер дорожки, начиная с которой включается пред-компенсация (1 байт);
  • 015 — число повторных обращений при ошибке чтения/записи (1 байт);
  • 017 - код, которым заполняются сектора при форматировании (1 байт);
  • 020 — указатель на байт признаков (2 байта);
  • 022 — таблица признаков (4 байта);
  • 026 – адрес начала рабочей области (2 байта);
  • 030 — длина массива данных в двухбайтных машинных словах (2 байта);
  • 032 — номер стороны диска (0 - верхняя, 1 - нижняя; 1 байт);
  • 033 - номер дорожки, считая от 0 (1 байт);
  • 034 - номер дисковода (0 - А:, 1 - В: и т.д.; 1 байт);
  • 035 — номер сектора диска (1 байт);
  • 060 — число секторов на дорожке (2 байта).

Остальные участки рабочей области являются служебными.

Таблица признаков (смещение 022 от начала рабочей области) содержит четыре байта, соответствующие четырем дисководам. Для каждого из них биты байта таблицы имеют значения:

  • 0 - “пропуск дорожек” (0-нет, 1 - пропуск нечетных дорожек). Это позволяет обрабатывать 40-дорожечные дискеты на 80-дорожечном дисководе;
  • 1 - “односторонний/двухсторонний диск” (0 - двухсторонний, 1 - обращение только к нижней стороне);
  • 2 - “длина сектора” (0 - 512 байт, 1 - 1024 байт).

Остальные биты не используются.

г) 160012 --- форматирование

@#160012 — подпрограмма форматирования отдельной дорожки диска. В качестве параметра подпрограмме передается в R3 адрес размещения в ОЗУ рабочей области контроллера, в которой, в соответствии с вышеприведенным списком, должны быть указаны номер диска, номер стороны и номер форматируемой дорожки, а также записываемый при форматировании “нулевой код”.

Кроме того, имеются две дополнительные подпрограммы, используемые реже названных выше:

  • @#160002 — загрузка ОС с указанного дисковода (без поиска ее на остальных дисках);
  • @#160006 — чтение/запись секторов аналогично подпрограмме @#160004, но параметры передаются не через регистры, а непосредственно в ячейках рабочей области.

(Сведения о подпрограммах приведены для “326” прошивки ПЗУ контроллера.)

Кроме того, чтобы после выполнения операций чтения/записи остановить дисковод, нужно обнулить содержимое служебного регистра контроллера @#177130 (CLR @#177130).

 
proj/bk/bk-floppy-bios.txt · Последние изменения: 2008/04/14 13:15
 
Copyright (C) 1996-2009 Serge Vakulenko
serge@vak.ru