БК: Флоппи-диски 800 килобайт

Материал из Emuverse
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: Сергей Вакуленко

Источник: http://vak.ru/doku.php/proj/bk/bk-floppy

Для компьютеров БК-0010 используются флоппи-диски объемом 800 килобайт. Их формат отличается от стандартных IBM-PC-AT совместимых флопиков:

800k (БК) 360k (PC-AT) 720k (PC-AT) 1200k (PC-AT)
Кол-во дорожек 80 40 80 80
Кол-во головок 2 2 2 2
Кол-во секторов 10 9 9 15


Флопик 3.5" 800к под Windows

Установите драйвер fdrawcmd.sys. Для форматирования, записи и чтения образов диска используйте утилиту bkdisk.exe.

Флопик 3.5" 800к в Линуксе

Такой формат поддерживается стандартным драйвером. Используйте устройство /dev/fd0u800.

Флопик 5" 800к в Линуксе

В обычном Линуксе такой формат флоппи дисков не поддерживается. На самом деле драйвер это позволяет, но надо установить ему нужные параметры. Это делается утилитой setfdprm, которая содержится в пакете fdutils.

Для создания файла устройства и установки формата 800k выполните следующие команды:

mknod /dev/fd0h800 b 2 80
setfdprm /dev/fd0h800 1600 10 2 80 0 0x25 0x01 0xDF 0x2E

Для сравнения приведена таблица параметров стандартных форматов флоппи-диска 5.25”:

Формат Файл устройства Параметры
360k (PC-XT) /dev/fd0d360 720 9 2 40 0 0x2A 0×02 0xDF 0×50
360k (PC-AT) /dev/fd0h360 720 9 2 40 1 0×23 0×01 0xDF 0×50
410k /dev/fd0h410 820 10 2 41 1 0×25 0×01 0xDF 0x2E
420k /dev/fd0h420 840 10 2 42 1 0×25 0×01 0xDF 0x2E
720k /dev/fd0h720 1440 9 2 80 0 0×23 0×01 0xDF 0×50
800k (БК)/dev/fd0h8001600 10 2 80 0 0×25 0×01 0xDF 0x2E
880k /dev/fd0h880 1760 11 2 80 0 0x1C 0×09 0xCF 0×00
1200k /dev/fd0h1200 2400 15 2 80 0 0x1B 0×00 0xDF 0×54
1440k /dev/fd0h1440 2880 18 2 80 0 0×25 0×00 0xDF 0×02
1480k /dev/fd0h1476 2952 18 2 82 0 0×25 0×00 0xDF 0×02
1490k /dev/fd0h1494 2988 18 2 83 0 0×25 0×00 0xDF 0×02
1600k /dev/fd0h1600 3200 20 2 80 0 0x1C 0×20 0xCF 0x2C


Шлейф для БК-0010

На флоповоде Шлейф Альтек Шлейф FFC (slim)
2: /REDWC — Density Select
4:
6:
8: /Index — 0=Index 1: ИНД — Индексный маркер 2: INDEX
10: 3: ВН0 — Выбор накопителя 0
12: /DRVS — Drive Select 5: ВН1 — Выбор накопителя 1 4: DRV
14: 7: ВН2 — Выбор накопителя 2
16: /MOTE — 0=Motor Enable 9: МВК — Включение двигателя 10: MTR
18: /DIR — 0=Direction Select 11: НПШ — Направление шага 12: DIR
20: /STEP — 0=Head Step 13: ШАГ — Шаг 14: STEP
22: /WDATA — Write Data 15: ЗПД — Данные записи 16: WRITE DATA
24: /WGATE — Floppy Write Enable 17: РЗП — Разрешение записи 18: WRITE GATE
26: /TRK00 — 0=Track 00 19: Д00 — Нулевая дорожка 20: TRACK 00
28: /WPT — 0=Write Protect 21: ЗЗП — Запрет записи 22: WRPTR
30: /RDATA — Read Data 23: ДЧТ — Данные чтения 24: RDATA
32: /SIDE1 — 0=Head Select 25: ВП0 — Выбор поверхности 26: SEL
34: /DSKCHG — 1=Disk Change/0=Ready 26 или 27: ГОТ — Готовность 6: DSKCH
8: READY
1, 3… 33 — общий 2, 4… 24 — общий 15,17,19,23,25 — общий
1,3,5 — +5V


Описание интейфейса стандартного флоппи-диска можно посмотреть здесь.

Описание флоповода и интерфейса стандарта slim можно посмотреть в спецификации TEAC FD-05HF-8630 Micro Floppy Disk Drive или Y-E DATA YD-702J-6637J Super Slim 3.5 Floppy Disk Drive ( (англ.)).

Шлейфы контроллера Альтек бывают 27- и 26-проводные. В 26-проводном пропущен сигнал, соответствующий контакту 33 флоповода. Мне достался вариант контроллера, где 27-проводный шлейф распаян как 26-проводный.

Контакт флоповода 27-проводный 26-проводный Мой шлейф
8, 10… 32 1, 3… 25 1, 3… 25 2, 4… 26
34 27 26 27
9, 11… 31 — общий 2, 4… 24 — общий 2, 4… 24 — общий 1, 3, 5… 25 — общий
33 — общий 26 — общий отсутствует отсутствует


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

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

а) 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).