┬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-