▊I.2.1. Нулевой сектор Я хорошо понимаю, что читателю не очень нужно все это знать, но мне-то очень нужно рассказать об этом. Жан Жак Руссо Часть содержимого нулевого сектора занимает такая информация о дис﹣ кете, которая ▇не изменяется в процессе работы с дискетой. Содержимое нулевого сектора приведено на схеме: \/T0/1 ▁▊▊▊▊▊▊▊▊▊▊▊▊▊▚ 00h ▕ E9h или 0EBh▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ 01h - 09h▕ ▊Х▊Х▊Х▊Х▊Х▊ ▕ ◀▊▊▊ Служебная информация ⁃▊▊▊▊▊▊▏▊▊▊▊▊▊ 0Bh,0Ch ▕ ▧▧▧▧ ▕ ▧▧▧▧ ▕ ◀▊▊▊ Количество байтов в секторе ⁃▊▊▊▊▊▊▞▊▊▊▊▊▊ 0Dh ▕ ▕ ◀▊▊▊ Количество секторов в кластере ⁃▊▊▊▊▊▊▏▊▊▊▊▊▊ 0Eh,0Fh ▕ ▧▧▧▧ ▕ ▧▧▧▧ ▕ ◀▊▊▊ Количество неиспользованых секторов ⁃▊▊▊▊▊▊▞▊▊▊▊▊▊ 10h ▕ ▕ ◀▊▊▊ Количество Таблиц Расположения Файлов ⁃▊▊▊▊▊▊▏▊▊▊▊▊▊ 11h,12h ▕ ▧▧▧▧ ▕ ▧▧▧▧ ▕ ◀▊▊▊ Максимальное количество файлов ⁃▊▊▊▊▊▊▊▊▊▊▊▊ 13h,14h ▕ ▧▧▧▧ ▕ ▧▧▧▧ ▕ ◀▊▊▊ Количество секторов на дискете ⁃▊▊▊▊▊▊▞▊▊▊▊▊▊ 15h ▕ ▕ ◀▊▊▊ Идентификатор носителя ⁃▊▊▊▊▊▊▏▊▊▊▊▊▊ 16h,17h ▕ ▧▧▧▧ ▕ ▧▧▧▧ ▕ ◀▊▊▊ Количество секторов в FAT ⁃▊▊▊▊▊▊▊▊▊▊▊▊ ⁃▊▊▊▊▊▊▊▊▊▊▊▊ 18h,19h ▕ ▧▧▧▧ ▕ ▧▧▧▧ ▕ ◀▊▊▊ Количество секторов в треке ⁃▊▊▊▊▊▊▊▊▊▊▊▊ 1Ah,1Bh ▕ ▧▧▧▧ ▕ ▧▧▧▧ ▕ ◀▊▊▊ Количество сторон диска ⁃▊▊▊▊▊▊▊▊▊▊▊▊ 1Ch,1Dh ▕ ▧▧▧▧ ▕ ▧▧▧▧ ▕ ◀▊▊▊ Количество "спрятанных" секторов ⁃▊▊▊▊▊▊▞▊▊▊▊▊▊ (⁃для MS-DOS▁) 1Eh ▕ ▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ ▚ 1Fh - 22h▕ ED 53 59 C0 ▕ ◀▊▊▊ LD (C059),DE ▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ ▕ ... ▕ ... ▕ ... ▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ ▕ A9h ▕ 0A ▕ ◀▊▊▊ LD A,(BC) ⁃ Программа-загрузчик ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ ▕ системного Файла AAh ▕ 00 ▕ ◀▊▊▊ NOP ▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ ▕ ABh ▕ 00 ▕ ◀▊▊▊ NOP ▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ ▔ ACh - B6h▕ MSXDOS SYS ▕ ◀▊▊▊ Имя системного файла ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ (по умолчанию MSXDOS.SYS) ... ▕ Не ▕ ... ▕ используется▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ 1FFh ▕ 00 ▕ ▇▊▊▊▊▊▊▊▊▊▊▊▊▊▔ \/T1/1- Что может быть честнее и благороднее, как научить других тому, что сам наилуч﹣ шим образом знаешь. Квинтилиан Приведем пример использования дискового пространства в "личных" це﹣ лях. Программа-загрузчик MSX-DOS загружается в RАM с адреса C000h. Когда она "отработает" (система загрузится), в программе загрузки происходит переход по адресу 100h (здесь находится загруженная система). Если мы выполним в данном месте переход не по адресу 100h, а, например,по адре﹣ су C0D0h, где расположена первая половина нулевого сектора, Вы можете еще до запуска MSX-DOS "что-нибудь" сделать: отключиться от сети, зап﹣ ретить прерывания по таймеру, вывести какое-нибудь сообщение на экран, а потом выполнить переход по адресу 100h. Вторая половина нулевого сектора находится где-то в RАM. Так как в первой половине этого сектора мало места, то Вашу программу придется разместить и во второй половине. Поэтому проще в первой половине допи﹣ сать программу-загрузчик так, чтобы она загружала весь Boot sector по какому-либо известному адресу, а затем выполнить переход на адрес, по которому расположена вторая половина сектора. В ▊boot-секторе▁ байты с номерами 53h, 54h и 55h нужно изменить: C3h, 00h, 01h (JP 100h) на C3h, D0h, C0h (JP C0D0h), а с адреса D0h размес﹣ тить программу: \/T0/1 ▁▊▊▊▊▊▏▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▏▊▊▊▊▊▊▊▊▊▊▚ ▕Адрес▕ Программа на Ассемблере с комментариями ▕ Коды ▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ ▕0D0h:▕ LD DE,D000h ; Установка нового ▕ 11 00 D0 ▕ ▕ ▕ LD C,1Ah ; адреса передачи ▕ 0E 1A ▕ ▕ ▕ CALL F37Dh ; boot-сектора. ▕ CD 7D F3 ▕ ▕ ▕ LD HL,100h ; Загрузка одного сектора ▕ 21 00 01 ▕ ▕ ▕ LD DE,0 ; (с номером 0) с диска, ▕ 11 00 00 ▕ ▕ ▕ LD C,2Fh ; находящегося в дисководе "А". ▕ 0E 2F ▕ ▕ ▕ CALL F37Dh ; ▕ CD 7D F3 ▕ ▕ ▕ JP D100h ; Переход на адрес Вашей программы. ▕ C3 00 D1 ▕ ▕ ▕ ... ▕ ▕ ▕100h:▕ ; Здесь располагается Ваша программа.▕ ▕ ▕ ▕ ... ▕ ▕ ▕1FDh:▕ JP 100h ; Переход на адрес прогр. MSXDOS.SYS.▕ C3 00 01 ▕ ▇▊▊▊▊▊▞▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▞▊▊▊▊▊▊▊▊▊▊▔ \/T1/1- ▧Обратите внимание▁: ▇функции BDOS вызываются командой CALL F37Dh, т.к. ▇программа загрузки работает в рабочей области слота "BASIC" ▏(слот 0)▇. Примечание.▁ Как только Вы начинаете работать с дискетой в системную область слота 3-2 помещается информация о дискете, которая ▇может изме▁﹣ ▇няться в процессе работы с дискетой. \/T0/1 ▁▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▚ ▕ Эта информация называется DPB ▕ ▕ ("Drive Parameter Block"-"Блок Параметров Носителя") ▕ ▇▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▔ \/T1/1- Кратко опишем: α) ▇содержимое DPB (21 байт): \/T0/1 ▁▊▊▊▊▊▊▊▊▊▊▊▊▊▚ 00h ▕ 00 ▕ ◀▊▊▊ Номер дисковода ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ 01h ▕ F9 ▕ ◀▊▊▊ Идентификатор носителя ⁃▊▊▊▊▊▊▏▊▊▊▊▊▊ 02h,03h▕ 00 ▕ 02 ▕ ◀▊▊▊ Размер сектора ⁃▊▊▊▊▊▊▞▊▊▊▊▊▊ 04h ▕ 0F ▕ ◀▊▊▊ Маска каталога = Размер сектора/32-1 ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ 05h ▕ 04 ▕ ◀▊▊▊ Сдвиг каталога = Количество единичных ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ битов в Маске каталога 06h ▕ 01 ▕ ◀▊▊▊ Маска кластера = (Сектор/Кластер) - 1 ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ 07h ▕ 02 ▕ ◀▊▊▊ Сдвиг кластера = 1 + Количество единичных ⁃▊▊▊▊▊▊▏▊▊▊▊▊▊ битов в Маске кластера 08h,09h▕ 01 ▕ 00 ▕ ◀▊▊▊ Первый сектор FAT ⁃▊▊▊▊▊▊▞▊▊▊▊▊▊ 0Ah ▕ 02 ▕ ◀▊▊▊ Количество FAT ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊ 0Bh ▕ 70 ▕ ◀▊▊▊ Количество файлов (70h=112) ⁃▊▊▊▊▊▊▏▊▊▊▊▊▊ 0Ch,0Dh▕ 0E ▕ 00 ▕ ◀▊▊▊ Первый сектор Области данных (Data Area) ⁃▊▊▊▊▊▊▊▊▊▊▊▊ 0Eh,0Fh▕ CA ▕ 02 ▕ ◀▊▊▊ Количество кластеров + 1 ⁃▊▊▊▊▊▊▞▊▊▊▊▊▊ 10h ▕ 03 ▕ ◀▊▊▊ Количество секторов в FAT ⁃▊▊▊▊▊▊▏▊▊▊▊▊▊ 11h,12h▕ 07 ▕ 00 ▕ ◀▊▊▊ Первый сектор каталога ⁃▊▊▊▊▊▊▊▊▊▊▊▊ 13h,14h▕ 95 ▕ E5 ▕ ◀▊▊▊ Адрес FAT ⁃в памяти ▇▊▊▊▊▊▊▞▊▊▊▊▊▊▔ \/T1/1- β) ▇размещение DPB: \/T0/1 ▁▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▏▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▚ ▕ Адреса в рабочей▕ Назначение (или содержимое) ▕ ▕области слота 3-2▕ ▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ ▕ F195 ÷ F1A9 ▕ DPB дисковода "A" ▕ ▕ F1AA ÷ F1BE ▕ DPB дисковода "B" ▕ ▕ ▕ ▕ ▕ F1BF ▕ 0 ▕ ▕ F1C0 ▕ 0 ▕ ▕ F1C1 ▕ Текущий дисковод (0 соотв. "А") ▕ ▕ F1C2 ▕ Текущий трек (дисковод A) ▕ ▕ F1C3 ▕ Текущий трек (дисковод B) ▕ ▕ F1C4 ▕ Протокол текущего дисковода ▕ ▕ F1C5 ▕ Трек (разметка) ▕ ▕ F1C6 ▕ Тип носителя (форматирование) ▕ ▕ F1C7 ▕ Число дисководов в системе ▕ ▕ F1C8 ▕ 0 ▕ ▕ ▕ ▕ ▕ F161 ÷ F175 ▕ DPB дисковода "C" ▕ ▕ F176 ÷ F18A ▕ DPB дисковода "D" ▕ ▕ ▕ ▕ ▕ F18B ÷ F194 ▕ Аналогично байтам F1BF ÷ F1C8 ▕ ▕ ▕ ▕ ⁃▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊ ▕ ▕ ▕ ▕ E595 ÷ EB94 ▕ Копия Таблицы размещения файлов ▕ ▕ ▕ ▕ ▕ EB95 ÷ ED94 ▕ Копия сектора каталога, содер﹣ ▕ ▕ ▕ жащего последний упомянутый Ва﹣ ▕ ▕ ▕ ми файл ▕ ▕ ▕ ▕ ▇▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▞▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▊▔ \/T1/1-