Скачиваний:
38
Добавлен:
01.05.2014
Размер:
147.6 Кб
Скачать

Untitled Программы •Железо • Драйверы • Хостинг •Энциклопедия рекламы7. Приложения 7.1. Управляющие блоки MS-DOS 7.2. Контроллер прерываний 8259 7.3. Сегментная адресация памяти 7.4. Содержимое файла sysp.h 7.5 Содержимое файла sysp.inc 7.6. MS-DOS версии 5.0 7.1. Управляющие блоки MS-DOS 7.1.1. Векторная таблица связи MS-DOS 7.1.2. Блок управления памятью MCB 7.1.3. Префикс программного сегмента PSP 7.1.4. Формат блока DDCB 7.1.5. Формат таблицы файлов DFT 7.1.6. Заголовок драйвера 7.1.7. Формат элемента массива дисковой информации 7.1.8. Заголовок EXE-файла 7.1.9. Атрибуты драйвера 7.1.10. Заголовок запроса 7.1.11. Слово состояния устройства 7.1.12. Коды ошибок 7.1.13. Блок BPB 7.1.14. Форматы запросов для различных команд 7.1.15. Команды драйвера 7.1.16. Коды идентификации типа компьютера 7.1.17. Таблица параметров для жестких дисков 7.1.18. Параметры флоппи-дисков 7.1.19. Таблица параметров дискеты 7.1.20. Таблица параметров жесткого диска 7.1.21. Команды контроллера НГМД 7.1.22. Регистры состояния контроллера 7.1.23. Код ошибки при работе с диском на уровне BIOS 7.1.24. Формат первого сектора жесткого диска 7.1.25. Элементы таблицы разделов диска 7.1.26. Формат записи BOOT для DOS версий до 4.0 7.1.27. Формат BPB для DOS версий до 4.0 7.1.28. Формат BOOT-сектора для MS-DOS версии 4.0 7.1.29. Расширенный блок параметров BIOS 7.1.30. Байт-описатель среды media 7.1.31. Обозначение кластеров в FAT 7.1.32. Формат дескриптора файла 7.1.33. Байт атрибутов файла 7.1.34. Формат поля времени 7.1.35. Формат даты обновления файла 7.1.36. Формат блока DDCB для версий 2.х и 3.х 7.1.37. Формат блока DDCB для DOS версии 4.х 7.1.38. Идентификатор BIOS 7.1.1. Векторная таблица связи MS-DOS (-2) 2 mcb_seg сегмент первого управляющего блока памяти (MCB) (0) 4 dev_cb указатель на первый блок управления устройствами DOS (DOS Device Control Block) (+4) 4 file_tab указатель на таблицу файлов DOS (+8) 4clock_dr указатель на драйвер CLOCK$, установленный или резидентный (+12) 4con_dr указатель на актуальный драйвер CON, установленный или резидентный ----------- DOS 2.x ---------------- (+16) 1num_lgdr число логических драйверов в системе (+17) 2max_btbl максимальное число байтов/блоков любого блочного устройства (+19) 4disk_buf указатель на первый дисковый буфер (+23) -null_dr начало драйвера NUL - первого драйвера в списке драйверов DOS ----------- DOS 3.x, 4.x , 5.0----------- (+16) 2 max_btbl максимальное число байтов в блоке блочного устройства (+18) 4disk_buf указатель на первый дисковый буфер (+22) 4drv_info укзатель на массив информации об устройствах (+26) 4fcb_tabl указатель на таблицу FCB (+30) 2fcb_size размер таблицы FCB (+32) 1num_bdev число блочных устройств (+33) 1lastdriv значение LASTDRIVE в файле CONFIG.SYS (по умолчанию равно 5) (+34)null_dr начало драйвера NUL - первого драйвера в списке драйверов DOS 7.1.2. Блок управления памятью MCB (0) 1 type тип блока MCB (M или Z) (+1) 2owner параграф владельца блока (если 0, то блок описывает сам себя) (+3) 2size число параграфов в этом блоке (один параграф имеет размер 16 байт) (+5) 11reserve зарезервировано 7.1.3. Префикс программного сегмента PSP (0) 2 int20h двоичный код команды int 20h (программы могут использовать эту команду для завершения своей работы) (+2) 2mem_top нижняя граница доступной памяти в системе в параграфах (+4) 1reserv1 зарезервировано (+5) 5call_dsp команда вызова FAR CALL диспетчера MS-DOS (+10) 4term_adr адрес завершения (Terminate Address) (+14) 4cbrk_adr адрес обработчика Ctrl-Break (+18) 4crit_err адрес обработчика критической ошибки (+22) 2parn_psp сегмент PSP программы, запустившей данную программу (программы-родителя) (+24) 20file_tab таблица открытых файлов, если здесь находятся байты 0FFH, то таблица не используется (+44) 2env_seg сегмент блока памяти, содержащего переменные среды (+46) 4ss_sp адрес стека SS:SP программы (+50) 2max_open максимальное число открытых файлов (+52) 4file_tba адрес таблицы открытых файлов (+56) 24reserv2 зарезервировано (+80) 3disp диспетчер функций DOS (+83) 9reserv3 зарезервировано (+92) 16fcb1 форматируется как стандартный FCB, если первый аргумент командной строки содержит правильное имя файла (+108) 20fcb2 заполняется для второго аргумента командной строки аналогично fcb1 (+128) 1p_size число значащих символов в неформатированной области параметров, либо буфер обмена с диском DTA, назначенный по умолчанию (+129) 127 parm неформатированная область параметров, заполняется при запуске программы из командной строки 7.1.4. Формат блока DDCB для DOS версий 2.х и 3.х: (0) 1 drv_num номер устройства (0 соответствует устройству А:, 1 - В: и т.д.) (+1) 1drv_numd дополнительный номер устройства внутри драйвера (+2) 2sec_size размер сектора в байтах (+4) 1clu_size число, на единицу меньшее количества секторов в кластере (+5) 1clu_base число, являющееся степенью 2 числа секторов в кластере (+6) 2boot_siz количество зарезервированных секторов (boot-сектора, начало корневого каталога) (+8) 1fat_num количество копий FAT (+9) 2max_dir максимальное число дескрипторов файлов в корневом каталоге (т.е. максимальное число файлов, которое может содержать корневой каталог на этом устройстве) (+11) 2data_sec номер первого сектора данных на диске (номер сектора, соответствующего кластеру номер 2) (+13) 2hi_clust максимальное количество кластеров (равно увеличенному на 1 количеству кластерова данных) (+15) 1fat_size количество секторов, занимаемых одной копией FAT (+16) 2root_sec номер первого сектора корневого каталога (+18) 4drv_addr FAR-адрес заголовка драйвера, обслуживающего данное устройство (+22) 1media байт описания среды носителя данных (+23) 1acc_flag флаг доступа, 0 означает, что к устройству был доступ (+24) 4next адрес следующего блока DDCB, для последнего блока в поле смещения находится число FFFF ----------- только для DOS 2.x -------------- (+28) 2dir_clu номер начального кластера текущего каталога (0 для корневого каталога) (+30) 64dir_path строка в формате ASCIIZ, содержащая путь к текущему каталогу --------------- DOS 3.х ------------------------- (+28) 2reserv1 зарезервировано, обычно равно 0 (+30) 2built число FFFF в этом поле означает, что блок DDCB был построен для DOS версии 4.х : (0) 1 drv_num номер устройства (0 соответствует устройству А:, 1 - В: и т.д.) (+1) 1drv_numd дополнительный номер устройства внутри драйвера (+2) 2sec_size размер сектора в байтах (+4) 1clu_size число, на единицу меньшее количества секторов в кластере (+5) 1clu_base число, являющееся степенью 2 числа секторов в кластере (+6) 2boot_siz количество зарезервированных секторов (boot-сектора, начало корневого каталога) (+8) 1fat_num количество копий FAT (+9) 2max_dir максимальное число дескрипторов файлов в корневом каталоге (т.е. максимальное число файлов, которое может содержать корневой каталог на этом устройстве) (+11) 2data_sec номер первого сектора данных на диске (номер сектора, соответствующего кластеру номер 2) (+13) 2hi_clust максимальное количество кластеров (равно увеличенному на 1 количеству кластеров данных) (+15) 1fat_size количество секторов, занимаемых одной копией FAT (+16) 1reserv1 зарезервировано (+17) 2root_sec номер первого сектора корневого каталога (+19) 4drv_addr FAR-адрес заголовка драйвера, обслуживающего данное устройство (+23) 1media байт описания среды носителя данных (+24) 1acc_flag флаг доступа, 0 означает, что к устройству был доступ (+25) 4next адрес следующего блока DDCB, для последнего блока в поле смещения находится число FFFF (+29) 2reserv2 зарезервироано (+31) 2built число FFFF в этом поле означает, что блок DDCB был построен 7.1.5. Формат таблицы файлов DFT для DOS 3.х: (0) 4next указатель на следущую таблицу файлов (+4) 2file_count количество файлов в этой таблице ----- Дальше идут блоки DFCB в количестве file_count штук ----- (0) 2handl_num количество файловых чисел, связанных с данным файлом (file handle) (+2) 1access_mode режим доступа к файлу, заданный при открытии файла (+3) 2reserv1 зарезервировано (+5) 2dev_info информация IOCTL, полученная для устройства, на котором расположен этот файл (подробно формат и назначение этого поля будут расмотрены в главе, посвященной драйверам) (+7) 4driver указатель на драйвер, обслуживающий устройство, содержащее файл (+11) 2first_clu номер первого кластера, распределенного файлу (+13) 2time время последнего изменения файла в упакованном формате (+15) 2date дата последнего изменения файла в упакованном формате (+17) 4fl_size размер файла в байтах (+21) 4offset текущее смещение внутри файла в байтах (+25) 2reserv2 зарезервировано (+27) 2last_clu номер только что прочитанного кластера (+29) 3reserv3 зарезервировано (+32) 11filename имя файла в формате FCB (имя выравнено на левую границу поля, дополнено пробелами до 8 символов, справа к нему прилегает 3 символа расширения без точки) (+43) 2reserv4 зарезервировано (+45) 2ownr_psp PSP программы, открывшей файл (+47) 2reserv5 зарезервировано для DOS 4.х: (0) 4next указатель на следущую таблицу файлов (+4) 2file_count количество файлов в этой таблице -------- Дальше идут блоки DFCB в количестве file_count штук ------ (0) 2handl_num количество файловых чисел, связанных с данным файлом (file handle) (+2) 1access_mode режим доступа к файлу, заданный при открытии файла (+3) 2reserv1 зарезервировано (+5) 2dev_info информация IOCTL, полученная для устройства, на котором расположен этот файл (подробно формат и назначение этого поля будут расмотрены в главе, посвященной драйверам) (+7) 4driver указатель на драйвер, обслуживающий устройство, содержащее файл (+11) 2first_clu номер первого кластера, распределенного файлу (+13) 2time время последнего изменения файла в упакованном формате (+15) 2date дата последнего изменения файла в упакованном формате (+17) 4fl_size размер файла в байтах (+21) 4offset текущее смещение внутри файла в байтах (+25) 2reserv2 зарезервировано (+27) 2reserv7 зарезервировано (+29) 3reserv3 зарезервировано (+32) 1reserv4 зарезервировано (+33) 11filename имя файла в формате FCB (имя выравнено на левую границу поля, дополнено пробелами до 8 символов, справа к нему прилегает 3 символа расширения без точки) (+44) 2reserv5 зарезервировано (+46) 2ownr_psp PSP программы, открывшей файл (+48) 2reserv6 зарезервировано (+50) 2last_clu номер только что прочитанного кластера (+52) 4reserv8 зарезервировано 7.1.6. Заголовок драйвера (0) 4next указатель на заголовок следующего драйвера. Если смещение адреса следующего драйвера равно FFFF, это последний драйвер в цепочке (+4) 2attrib атрибуты драйвера (+6) 2strateg смещение программы стратегии драйвера (+8) 2interrupt смещение программы обработки прерывания для драйвера (+10) 8dev_name имя устройства для символьных устройств или количество обслуживаемых устройств для блочных устройств. 7.1.7. Формат элемента массива дисковой информации (0) 64path текущий путь доступа для диска (+64) 2reserv1 зарезервировано (+66) 2reserv2 зарезервировано (+68) 1reserv3 зарезервировано (+69) 4ddcb адрес соответствующего DDCB (+73) 2cdir_clu первый кластер текущего каталога на диске. 0 соответствует корневому каталогу, -1 - если к диску еще не обращались (+75) 2reserv4 зарезервировано (+77) 2reserv5 зарезервировано (+79) 2reserv6 зарезервировано ---------------- для DOS 4.х ----------------- (+81) 7reserv7 зарезервировано 7.1.8. Заголовок EXE-файла (0) 2 signature два байта 'MZ' (4Dh, 5Ah), индентифицирующие файл в формате EXE (+2) 2part_pag длина последней страницы программы в байтах (страница содержит 512 байт) (+4) 2file_size размер программы в страницах по 512 байт (+6) 2rel_item число элементов в таблице расположения сегментов (+8) 2hdr_size размер заголовка файла в параграфах (длина параграфа - 16 байт) (+10) 2min_mem минимальное количество памяти в параграфах, которое нужно зарезервировать в памяти за концом загруженной программы (+12) 2max_mem максимальное количество памяти в параграфах, которое нужно зарезервировать в памяти за концом загруженной программы (+14) 2ss_reg величина смещения от начала программы, которая используется для загрузки сегментного регистра стека SS (+16) 2sp_reg величина смещения от начала программы, которая используется для загрузки регистра SP (+18) 2chk_summ контрольная сумма всех слов в файле (+20) 2ip_reg значение для регистра IP, которое будет использовано при начальном запуске программы (+22) 2cs_reg смещение от начала программы для установки сегментного регистра кода CS (+24) 2relt_off смещение от начала файла таблицы расположения сегментов программы (+26) 2overlay номер оверлея, равен 0 для основного модуля 7.1.9. Атрибуты драйвера Символьное устройство БитНазначение 01 - драйвер обслуживает стандартное устройство ввода;

0 - этот драйвер не обслуживает стандартное устройство ввода 11 - драйвер обслуживает стандартное устройство вывода;

0 - драйвер не обслуживает стандартное устройство вывода 21 - это драйвер стандартного устройства NUL;

0 - драйвер не обслуживает устройство NUL 31 - драйвер обслуживает часы 4Зарезервировано, бит должен быть равен 0 5Зарезервировано, бит должен быть равен 0 61 - разрешено использование драйвером функций GENERIC IOCTL (для версий DOS, более поздних, чем 3.2);

0 - функции GENERIC IOCTL не поддерживаются 7-10Эти биты зарезервированы и должны быть равны 0 111 - поддерживаются функции открытия/закрытия устройства (OPEN/CLOSE) для символьных устройств;

0 - функции OPEN/CLOSE для символьных устройств не поддерживаются 12Зарезервировано, бит должен быть равен 0 131 - для символьных устройств поддерживается функция вывода до получения состояния занятости устройства;

0 - функция вывода до состояния занятости не поддерживается 141 - поддерживаются функции IOCTL;

0 - функции IOCTL не поддерживаются 151 - символьное устройство;

0 - блочное устройство Блочное устройство БитНазначение 0Зарезервировано, бит должен быть равен 0 11 - драйвер поддерживает 32-битовую адресацию сектора (для версий DOS, начиная с 4.00 и более поздних); если установлен этот бит, поле номера сектора всех запросов является двойным словом, добавляемым в конец заголовка запроса, старое поле номера сектора должно содержать -1);

0 - используется 16-битовая адресация сектора 2-5Эти биты зарезервированы и должны быть равны 0 61 - поддерживаются логические устройства (используется блочными драйверами для управления "виртуальными" флоппи-дисками, создаваемые драйвером DRIVER.SYS в DOS версии 3.2 и более поздних версиях);

0 - логические устройства для блочных драйверов не поддерживаются; 7-10Эти биты зарезервированы и должны быть равны 0 111 - единица в этом бите означает, что драйвер поддерживает функцию проверки замены носителя данных в устройстве (например, замены дискеты), используется для DOS версий 3.00 и более поздних;

0 - для блочных устройств функция проверки замены носителя данных не поддерживается 12Зарезервировано, бит должен быть равен 0 131 - драйвер не использует стандартное IBM-устройство, и необходимо выдать запрос на построение блока параметров BIOSBIOS BPB;

0 - используется IBM-устройство 141 - поддерживаются функции IOCTL;

0 - функции IOCTL не поддерживаются 151 - символьное устройство;

0 - блочное устройство 7.1.10. Заголовок запроса (0) 1size Длина запроса в байтах (длина заголовка запроса плюс длина переменной части запроса) (+1) 1unit Номер устройства (используется для блочных устройств, указывает, с каким именно устройством, обслуживаемым драйвером, будет работать операционная система) (+2) 1cmd Код команды, которую требуется выполнить (может иметь значение от 0 до 18h) (+3) 2status Слово состояния устройства, заполняется драйвером перед возвратом управления операционной системе (+5) 8reserved Зарезервировано 7.1.11. Слово состояния устройства БитНазначение 0-7Код ошибки устройства (если команда выполнилась с ошибкой и драйвер установил признак ошибки (бит 15) в единицу, то в это поле он должен записать код ошибки). 8Команда выполнена. Этот бит всегда устанавливается драйвером перед тем, как он возвращает управление операционной системе. 9Занято. Этот бит устанавливается обработчиком команды, когда физическое устройство занято выполнением предыдущей операции и поэтому не может выполнить требуемую команду. Этот бит используется также для передачи такой информации, как "буфер клавиатуры не пуст", "среда носителя данных заменяемая" (в команде проверки возможности замены среды носителя данных). 10-14Зарезервировано. 15Признак ошибки. Устанавливается драйвером, когда он не может обработать запрос или произошла физическая либо логическая ошибка при обработке правильного запроса. Биты 0-7 при этом должны содержать код ошибки. 7.1.12. Коды ошибок КодОписание 0Нарушение защиты от записи. Была предпринята попытка записи информации на защищенное от записи устройство. 1Неизвестное устройство. 2Устройство не готово. 3Неизвестная команда. Затребованная команда не поддерживается драйвером. 4Ошибка CRC. При выполнении команды обнаружена ошибка циклического кода проверки. 5Неправильная длина запроса. Поле длины в заголовке запроса содержит неверное значение. 6Ошибка при поиске дорожки (дорожка не найдена). 7Неизвестный носитель данных. 8Сектор не найден. 9Нет бумаги в принтере. 0AhОшибка записи. 0BhОшибка чтения. 0ChОбщая ошибка. 0DhЗарезервировано. 0EhЗарезервировано. 0FhНеразрешенная замена диска (только для DOS версии 3.0 и более поздних версий). 7.1.13. Блок BPB (0) 2sect_siz Количество байтов в одном секторе диска. (+2) 1clustsiz Количество секторов в одном кластере. (+3) 2res_sect Количество зарезервированных секторов. (+5) 1fat_cnt Количество таблиц FAT. (+6) 2root_siz Максимальное количество файловых дескрипторов, содержащихся в корневом каталоге диска. (+8) 2tot_sect Общее количество секторов на носителе данных (в разделе DOS). (+10) 1media Байт-описатель среды носителя данных. (+11) 2fat_size Количество секторов, занимаемых одной копией FAT. 7.1.14. Форматы запросов для различных команд 0 - Инициализация (0) 13header Заголовок запроса. (+13) 1n_units Количество устройств, обслуживаемых драйвером. Это поле заполняется только блочным драйвером. (+14) 4end_addr Конечный FAR-адрес резидентной части кода драйвера. В это поле драйвер записывает адрес байта памяти, следующего за той частью кода драйвера, которая должна стать резидентной. (+18) 4parm FAR-адрес строки параметров инициализации драйвера из файла CONFIG.SYS. Эта строка содержит все, что находится в строке файла после команды 'DEVICE=', она заканчивается символами перевода строки и возврата каретки 0Ah, 0Dh. При возврате драйвер блочного устройства должен записать в это поле адрес массива указателей на блоки параметров BIOSBIOS (BPB), по одному указателю на каждое устройство, обслуживаемое драйвером. (+22) 1drive Номер устройства. Для версии DOS 3.0 и более поздних версий в это поле при загрузке драйвера операционная система заносит номер, назначенный устройству, обслуживаемому драйвером. Например, для устройства А:это 0, для B: - 1 и т.д. 1 - Проверка замены носителя (0) 13header Заголовок запроса. (+13) 1media В этом поле драйверу передается байт-описатель среды носителя данных, с которым DOS работала раньше. (+14) 1reply В это поле драйвер должен поместить ответ о факте замены среды:

1 - диск не заменялся;

0 - неизвестно;

-1 - диск был заменен. (+15) 4vol_id Указатель на предыдущую метку тома (если установлен бит 11 слова атрибута устройства и диск был заменен) 2 - Построить блок BPB. (0) 13header Заголовок запроса. (+13) 1media В этом поле драйверу передается байт-описатель среды носителя данных, с которым DOS работала раньше. (+14) 4buf_adr Адрес буфера обмена. Содержимое этого буфера при вызове драйвера зависит от утановки бита 13 слова атрибутов устройства (IBM-формат). Если этот бит равен 0 (устройство формата IBM), буфер содержит первый сектор первой копии FAT. В противном случае указатель установлен на буфер свободного сектора. (+18) 4bpb_adr Указатель на новый BPB, записывается в это поле драйвером. 3, 4, 8, 9, 0Ch - Чтение/Запись. (0) 13header Заголовок запроса. (+13) 1media В этом поле драйверу передается байт-описатель среды носителя данных. (+14) 4buf_adr Адрес буфера для передачи данных. (+18) 2count Количество передаваемых байтов для символьных устройств или секторов для блочных устройств. (+20) 2sector Номер начального сектора, если драйвер использует 16-битовую адресацию секторов или -1 для 32-битовой адресации. Это поле не используется символьными драйверами. (+22) 4vol_id Указатель на метку тома в формате ASCIIZ. Возвращается блочным драйвером, если он выставляет ошибку 15 (неправильная смена диска). Это поле должно содержать ссылку на метку требуемого диска. (+26) 4sect32 Номер начального сектора, если содержимое поля sector равно -1. Первым идет старшее слово номера сектора. Если обнаружена ошибка с номером 15, в это поле записывается указатель на метку тома. 5 - Неразрушающий ввод. (0) 13header Заголовок запроса. (+13) 1byte В это поле драйвер записывает извлеченный из буфера байт, который будет считан по следующей команде ввода. 6, 0Ah - Проверит состояние ввода/вывода. Для команд проверки состояния запрос состоит только из заголовка, область переменного формата отсутствует. 7 - Сброс буфера устройства ввода. 11 - Сброс буфера устройства вывода. Запрос состоит только из заголовка. 0Dh, 0Eh - Открыть/Закрыть устройство. Запрос для этих команд состоит только из заголовка. 15 - Проверка сменяемости диска. Запрос состоит только из заголовка. 19 - Общее управление вводом/выводом (GENERIC_IOCTL). (0) 13header Заголовок запроса. (+13) 1funct Это поле содержит код функции команды общего IOCTL. (+14) 1subfunc Код подфункции для функции funct. (+15) 2si_reg Значение регистра SI при вызове функции 44h прерывания 21h. Эта функция DOS предназначена для управления вводом/выводом. (+17) 2di_reg Значение, передаваемое при вызове функции 44h прерывания 21h через регистр DI. (+19) 4buf Указатель на буфер данных, содержащий управляющую информацию для устройства или предназначенный для приема информации от устройства. 23 - Получить активное логическое устройство. 24 - Установить активное логическое устройство. (0) 13header Заголовок запроса. (+13) 1unit Код логического устройства, которое должно стать активным при использовании команды 24, или код активного устройства, помещаемый драйвером по команде 23. (+14) 1cmd Код команды. (+15) 4status Слово состояния. (+19) 4reserved Зарезервировано. 7.1.15. Команды драйвера 0 Инициализация 1 Проверка смены носителя данных 2 Построить блок BPB 3 Чтение IOCTL 4 Чтение 5 Неразрушающее чтение 6 Проверка состояния ввода 7 Сброс буферов ввода 8 Запись 9 Запись с проверкой 10 Проверка состояния вывода 11 Сброс буферов вывода 12 Запись IOCTL 13 Открыть устройство 14 Закрыть устройство 15 Проверка возможности смены носителя данных 16 Зарезервировано 17 Зарезервировано 18 Зарезервировано 19 Общее управление вводом/выводом (GENERIC IOCTL) 20 Получить текущее логическое устройство 21 Установить логическое устройство 7.1.16. Коды идентификации типа компьютера FFоригинальный IBM PC FEXT, Portable PC FDPCjr FCAT FBXT с памятью 640 К на материнской плате F9Convertible PC 7.1.17. Таблица параметров для жестких дисков +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ¦Тип ¦ Количество ¦ Количество ¦ Емкость диска ¦ ¦ цилиндров ¦ головок ¦ в байтах +­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­ ¦ 1 ¦ 306 ¦ 4 ¦ 10.653.696 ¦ 2 ¦ 615 ¦ 4 ¦ 21.411.840 ¦ 3 ¦ 615 ¦ 6 ¦ 32.117.760 ¦ 4 ¦ 940 ¦ 8 ¦ 65.454.080 ¦ 5 ¦ 940 ¦ 6 ¦ 49.090.560 ¦ 6 ¦ 615 ¦ 4 ¦ 21.411.840 ¦ 7 ¦ 462 ¦ 8 ¦ 32.169.984 ¦ 8 ¦ 733 ¦ 5 ¦ 31.900.160 ¦ 9 ¦ 900 ¦ 15 ¦ 117.504.000 ¦ 10 ¦ 820 ¦ 3 ¦ 21.411.840 ¦ 11 ¦ 855 ¦ 5 ¦ 37.209.600 ¦ 12 ¦ 855 ¦ 7 ¦ 52.093.440 ¦ 13 ¦ 306 ¦ 8 ¦ 21.307.392 ¦ 14 ¦ 733 ¦ 7 ¦ 44.660.224 ¦ 15 ¦ 0 ¦ 0 ¦ 0 ¦ 16 ¦ 612 ¦ 4 ¦ 21.307.392 ¦ 17 ¦ 977 ¦ 5 ¦ 42.519.040 ¦ 18 ¦ 977 ¦ 7 ¦ 59.526.656 ¦ 19 ¦ 1024 ¦ 7 ¦ 62.390.272 ¦ 20 ¦ 733 ¦ 5 ¦ 31.900.160 ¦ 21 ¦ 733 ¦ 7 ¦ 44.660.224 ¦ 22 ¦ 733 ¦ 5 ¦ 31.900.160 ¦ 23 ¦ 306 ¦ 4 ¦ 10.653.696 ¦ 24 ¦ 977 ¦ 5 ¦ 42.519.040 ¦ 25 ¦ 1024 ¦ 9 ¦ 80.216.064 ¦ 26 ¦ 1224 ¦ 7 ¦ 74.575.872 ¦ 27 ¦ 1224 ¦ 11 ¦ 117.190.656 ¦ 28 ¦ 1224 ¦ 15 ¦ 159.805.440 ¦ 29 ¦ 1024 ¦ 8 ¦ 71.303.168 ¦ 30 ¦ 1024 ¦ 11 ¦ 98.041.856 ¦ 31 ¦ 918 ¦ 11 ¦ 87.892.992 ¦ 32 ¦ 925 ¦ 9 ¦ 72.460.800 ¦ 33 ¦ 1024 ¦ 10 ¦ 89.128.960 ¦ 34 ¦ 1024 ¦ 12 ¦ 106.954.752 ¦ 35 ¦ 1024 ¦ 13 ¦ 115.867.648 ¦ 36 ¦ 1024 ¦ 14 ¦ 124.780.544 ¦ 37 ¦ 1024 ¦ 2 ¦ 17.825.792 ¦ 38 ¦ 1024 ¦ 16 ¦ 142.606.336 ¦ 39 ¦ 918 ¦ 15 ¦ 119.854.080 ¦ 40 ¦ 820 ¦ 6 ¦ 42.823.680 +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­---- 7.1.18. Параметры флоппи-дисков +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ ¦Тип¦Емкость,¦Диаметр,¦Количество секторов¦Количество¦ ¦ ¦Кбайтов ¦дюймы ¦на одну дорожку ¦цилиндров ¦ +­­­+­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­¦ ¦ 1 ¦ 360 ¦ 5 ¦ 9 ¦ 40 ¦ ¦ 2 ¦ 1200 ¦ 5 ¦ 15 ¦ 80 ¦ ¦ 3 ¦ 720 ¦ 3 ¦ 9 ¦ 40 ¦ ¦ 4 ¦ 1440 ¦ 3 ¦ 18 ¦ 80 ¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ 7.1.19. Таблица параметров дискеты 1 srt_hut Биты 0...3 - SRT (Step Rate Time) - задержка для переключения головок, лежит в пределах 1-16 мс и задается с интервалом 1 мс (0Fh - 1mc, 0Eh - 2 mc, 0Dh - 3 mc, ...); биты 4...7 - задержки разгрузки головки, лежит в пределах 16-240 мс и задается с интервалом 16 мс (1 - 16 mc, 2 - 32 mc, ..., 0Fh - 240 mc). (+1) 1 dma_hlt Бит 0 - значение этого бита, равное 1, говорит о том, что используется прямой доступ к памяти (DMA); биты 2...7 - время загрузки головок HLT_- интервал между сигналом загрузки головок и началом операции чтение/запись, лежит в пределах 2-254 мс и задается с интервалом 2 мс (1 - 2 mc, 2 - 4 mc, ..., 0FFh - 254 mc). (+2) 1 motor_w Задержка перед выключением двигателя. (+3) 1 sec_size Код размера сектора в байтах (0 - 128 байтов, 1 - 256, 2 - 512, 3 - 1024). (+4) 1 eot Номер последнего сектора на дорожке (+5) 1 gap_rw Длина межсекторного промежутка для чтения/записи. (+6) 1 dtl Максимальная длина передаваемых данных, используется когда не задана длина сектора. (+7) 1 gap_f Длина межсекторного промежутка для опрации форматирования. (+8) 1 fill_char Байт-заполнитель для форматирования (обычно используется F6h). (+9) 1 hst Время установки головки в миллисекундах. (+10) 1 mot_start Время запуска двигателя в 1/8 долях секунды. 7.1.20. Таблица параметров жесткого диска 2 max_cyl Максимальное количество цилиндров на диске. (+2) 1 max_head Максимальное количество магнитных головок. (+3) 2 srwcc Начальный цилиндр для предварительной записи (Starting reduced-write current cylinder). (+5) 2 swpc Начальный цилиндр для предварительной компенсации при записи (Starting write precompensation cylinder). (+7) 1 max_ecc Максимальная длина блока коррекции ошибок ECC (Maximum ECC data burst length). (+8) 1 dstopt Опции устройства: бит 7 - запрет восстановления; бит 6 - запрет восстановления по блоку коррекции ошибок ECC (Error Correction Code); биты 2-0 - опции устройства. (+9) 1 st_del Стандартная величина задержки. (+10) 1 fm_del Величина задержки для форматирования диска. (+11) 1 chk_del Величина задержки для проверки диска. (+12) 4 reserve Зарезервировано. 7.1.21. Команды контроллера НГМД Команда Байты команды Чтение +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ данных ¦MT ¦MFM¦SK ¦ 0 ¦ 0 ¦ 1 ¦ 1 ¦ 0 ¦ +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Чтение удаленных +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ данных ¦MT ¦MFM¦SK ¦ 0 ¦ 1 ¦ 1 ¦ 0 ¦ 0 ¦ +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Запись +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ данных ¦MT ¦MFM¦ 0 ¦ 0 ¦ 0 ¦ 1 ¦ 0 ¦ 0 ¦ +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Запись удаленных +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ данных ¦MT ¦MFM¦ 0 ¦ 0 ¦ 1 ¦ 0 ¦ 0 ¦ 1 ¦ +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Чтение данных +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ с дорожки ¦MT ¦MFM¦SK ¦ 0 ¦ 0 ¦ 0 ¦ 1 ¦ 0 ¦ +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Сканирование до +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ "равно" ¦MT ¦MFM¦SK ¦ 1 ¦ 0 ¦ 0 ¦ 0 ¦ 1 ¦ +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Сканирование до +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ "меньше" или ¦MT ¦MFM¦SK ¦ 1 ¦ 1 ¦ 0 ¦ 0 ¦ 1 ¦ "равно" +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Сканирование до +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ "больше" или ¦MT ¦MFM¦SK ¦ 1 ¦ 1 ¦ 1 ¦ 0 ¦ 1 ¦ "равно" +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Форматирование +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ дорожки ¦ 0 ¦MFM¦ 0 ¦ 0 ¦ 1 ¦ 1 ¦ 0 ¦ 1 ¦ +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Считывание +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ индексных ¦ 0 ¦MFM¦ 0 ¦ 0 ¦ 1 ¦ 0 ¦ 1 ¦ 1 ¦ данных +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Инициализация +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 1 ¦ 1 ¦ 1 ¦ +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 1 ¦ 0 ¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Чтение состояния +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ прерывания ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 1 ¦ 0 ¦ 0 ¦ 0 ¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Определить +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ параметры ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 1 ¦ 1 ¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Чтение +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ состояния ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 1 ¦ 0 ¦ 0 ¦ накопителя +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Поиск +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 1 ¦ 1 ¦ 1 ¦ 1 ¦ +­­­+­­­+­­­+­­­+­­­+­­­+­­­+­­­¦ ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦HDS¦DS1¦DS0¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ Байты параметров, которые должны следовать за командами и байты результата, которые процессор должен считать после выполнения команды: Команда Байты Байты параметров результата Чтение данных C, H, R, N, EOT, ST0, ST1, ST2, EOT, GPL, DTL C, H, R, N Чтение удаленных данных Запись данных Запись удаленных данных Чтение данных с дорожки Сканирование до "равно" Сканирование до "меньше" или "равно" Сканирование до "больше" или "равно" ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Форматирование N, SC, GPL, D ST0, ST1, ST2, дорожки C, H, R, N Чтение индексных отсутствуют ST0, ST1, ST2, данных C, H, R, N Инициализация отсутствуют отсутствуют Чтение состояния отсутствуют ST0, PCN прерывания Определить 1 байт: отсутствуют параметры мл. тетрада - HUT ст. тетрада - SRT 2 байт: бит 0 - ND биты 1-7 - HLT Чтение состояния отсутствуют ST3 накопителя Поиск C отсутствуют 7.1.22. Регистры состояния контроллера Формат регистра ST0: Биты Название Назначение 1, 0 US1, US2 Эти биты содержат код накопителя при прерывании. 2 HD Номер головки. 3 NC Накопитель не готов, устанавливается, если накопитель не готов выполнить команду чтения или записи. 4 EC Сбой оборудования 5 SE Завершена команда "Поиск" 7, 6 I, C Код прерывания: 00 - нормальное завершение; 01 - аварийное завершение; 10 - некорректная команда 11 - нет готовности дисковода. Формат регистра ST1:

Биты Название Назначение 0 MA Пропуск адресной метки. Этот бит устанавливается в 1, если контроллер не может найти адресную метку 1 NN Защита записи, устанавливается , если при выполнении операции контроллер получает от дисковода сигнал защиты записи. 2 ND Не найден сектор. 3 - Зарезервирован 4 OR Переполнение, процессор не успевает выполнять обмен данными с контроллером 5 DE Ошибка в данных при проверке контрольной суммы 6 - Зарезервирован. 7 EN Несуществующий сектор, устанавливается, когда контроллер пытается прочесть сектор с адресом, большим существующего. Формат регистра ST2:

Биты Название Назначение 0 MD Пропущен адресный маркер в поле данных. 1 BC Нечитающаяся дорожка. 2 SN Ошибка сканирования. Устанавливается, если при выполнении команды сканирования контроллер не может найти требуемую дорожку. 3 SH Сканирование выполнено, дорожка найдена. 4 WC Ошибка адреса дорожки. 5 DD Ошибка в поле данных. 6 CM Во время операции чтения или сканирования не обнаружен сектор с с маркером удаленных данных. 7 - Зарезервирован. Формат регистра ST3: Биты Название Назначение 1, 0 US1, US2 Код выбранного дисковода. 2 HD Номер выбранной головки. 3 TS Используется режим двухсторонней записи. 4 T0 Головка установлена на дорожку 0. 5 RDY Дисковод готов к работе. 6 WP Защита записи на диске. 7 FT Неисправность дисковода. В форматах команд и таблицах используются следующие обозначения: MT двухсторонняя операция MFM двойная/одинарная плотность записи SK пропуск удаленных данных HDS номер головки для двухстороннего накопителя DS1, DS0 номер выбираемого накопителя C номер цилиндра H номер головки для двухстороннего накопителя R номер сектора N число байтов в секторе EOT номер последнего сектора на дорожке GPL размер промежутка DTL число считываемых/записываемых байтов SC число секторов в цилиндре D данные PCN номер цилиндра после выполнения команды чтения состояния прерывания SRT время шага, мс HUT время разгрузки головки HLT время загрузки головки ND режим прерывания NCN номер цилиндра после поиска 7.1.23. Код ошибки при работе с диском на уровне BIOS 00hУспешное завершение операции 01hНеправильная команда 02hНе найдена адресная метка 03h Попытка записи на диск, защищенный от записи 04h Сектор не найден 05h Ошибка при сбросе (НМД) 06h Произошла замена дискеты 07h Неправильные параметры дисковода (НМД) 08h Переполнение канала ПДП (НГМД) 09h Переход за границу 64К при работе с ПДП 0AhОбнаружен плохой сектор (НМД) 0Bh Обнаружена плохая дорожка (НМД) 0Ch Неправильный номер дорожки 0Dh Неправильный номер сектора при форматировании (НМД) 0Eh Обнаружена адресная метка управляющих данных (НМД) 0Fh Ошибка ПДП (НМД) 10h Обнаружена ошибка в CRC/ECC 11h Данные скорректированы с использованием ECC (НМД) 20h Сбой контроллера 40h Сбой при поиске дорожки 80h Таймаут - программа не успевает обрабатывать данные AAh Дисковод не готов (НМД) BBh Неизвестная ошибка (НМД) CCh Сбой при записи (НМД) E0h Ошибка регистра состояния (НМД) FFh Ошибка операции считывания (НМД) 7.1.24. Формат первого сектора жесткого диска Смещение Размер Содержимое (+0) 1BEh Загрузочная запись - программа, которая загружается и выполняется во время начальной загрузки операционной системы (+1BEh) 10H Элемент таблицы разделов диска (+1CEh) 10H Элемент таблицы разделов диска (+1DEh) 10H Элемент таблицы разделов диска (+1EEh) 10H Элемент таблицы разделов диска (+1FEh) 2 Признак таблицы разделов - 55AAh 7.1.25. Элементы таблицы разделов диска Смещение Размер Содержимое (+0) 1 Признак активного раздела: 0 - раздел не активный; 80h - раздел активный. (+1) 1 Номер головки для начального сектора раздела. (+2) 2 Номер сектора и цилиндра для начального сектора раздела в формате функции чтения сектора INT_13h. (+4) 1 Код системы: 0 - неизвестная система; 1, 4 - DOS; 5 - расширенный раздел DOS. (+5) 1 Номер головки для последнего сектора раздела. (+6) 2 Номер сектора и цилиндра для последнего сектора раздела в формате функции чтения сектора INT_13h. (+8) 4 Относительный номер сектора начала раздела. (+12) 4 Размер раздела в секторах. 7.1.26. Формат записи BOOT для DOS версий до 4.0 Смещение Размер Содержимое (+0) 3 Команда JMP xxxx - переход типа NEAR на программу начальной загрузки (+3) 8 Название фирмы-производителя операционной системы и версия, например: "IBM 4.0" (+11) 13 BPB - блок параметров BIOS (+24) 2 Количество секторов на дорожке (+26) 2 Количество головок (поверхностей диска) (+28) 2 Количество скрытых секторов, эти сектора могут использоваться для схемы разбиения физического диска на разделы 7.1.27. Формат BPB Для DOS версий до 4.0 (0) 2 sect_siz Количество байтов в одном секторе диска. (+2) 1 clustsiz Количество секторов в одном кластере. (+3) 2 res_sect Количество зарезервированных секторов. (+5) 1 fat_cnt Количество таблиц FAT. (+6) 2 root_siz Максимальное количество дескрипторов файлов, содержащихся в корневом каталоге диска. (+8) 2 tot_sect Общее количество секторов на носителе данных (в разделе DOS). (+10) 1 media Байт-описатель среды носителя данных. (+11) 2 fat_size Количество секторов, занимаемых одной копией FAT. 7.1.28. Формат BOOT-сектора для MS-DOS версии 4.0 Смещение Размер Содержимое (+0) 3 Команда JMP xxxx - переход типа NEAR на программу начальной загрузки (+3) 8 Название фирмы-производителя операционной системы и версия, например: "IBM 4.0" (+11) 25 Extended BPB - расширенный блок параметров BIOS (+36) 1 Физический номер дисковода (0 -флоппи, 80h - жесткий диск) (+37) 1 Зарезервировано (+38) 1 Символ ')' - признак расширенной загрузочной записи DOS 4.0 (+39) 4 Серийный номер диска (Volume Serial Number), создается во время форматирования диска (+43) 11 Метка диска (Volume Label) (+54) 8 Зарезервировано, обычно содержит запись типа 'FAT12 ', которая идентифицирует формат таблицы размещения файлов FAT 7.1.29. Расширенный блок параметров BIOS 2 sect_siz Количество байтов в одном секторе диска. (+2) 1 clustsiz Количество секторов в одном кластере. (+3) 2 res_sect Количество зарезервированных секторов. (+5) 1 fat_cnt Количество таблиц FAT. (+6) 2 root_siz Максимальное количество дескрипторов файлов, содержащихся в корневом каталоге диска. (+8) 2 tot_sect Общее количество секторов на носителе данных (в разделе DOS). (+10) 1 media Байт-описатель среды носителя данных. (+11) 2 fat_size Количество секторов, занимаемых одной копией FAT. --------------- Расширение стандартного BPB -------------- (+13) 2 sectors Количество секторов на дорожке (+15) 2 heads Количество магнитных головок (+17) 2 hidden_l Количество скрытых секторов для раздела, который по размеру меньше 32 мегабайтов. (+19) 2 hidden_h Количество скрытых секторов для раздела, превышающего по размеру 32 мегабайта. (Только для DOS 4.0). (+21) 4 tot_secs Общее количество секторов на логическом диске для раздела, превышающего по размеру 32 мегабайта. 7.1.30. Байт-описатель среды media FFh - 2 стороны, 8 секторов на дорожке; FEh - 1 сторона, 8 секторов на дорожке; FDh - 2 стороны, 9 секторов на дорожке; FCh - 1 сторона, 9 секторов на дорожке; F9h - 2 стороны, 15 секторов на дорожке; F8h - жесткий диск. 7.1.31. Обозначение кластеров в FAT FAT12 FAT16 Что означает 000h 0000h Свободный кластер ff0h - ff6h fff0h - fff6h Зарезервированный кластер ff7h fff7h Плохой кластер ff8h - fffh fff8h - ffffh Последний кластер в списке 002h - fefh 0002h - ffefh Номер следующего кластера в списке 7.1.32. Формат дескриптора файла Смещение Размер Содержимое (+0) 8 Имя файла или каталога, выравненное на левую границу и дополненное пробелами. (+8) 3 Расширение имени файла, выравненное на левую границу и дополненное пробелами. (+11) 1 Атрибуты файла. (+12) 10 Зарезервировано. (+22) 2 Время создания файла или время его последней модификации. (+24) 2 Дата создания файла или дата его последней модификации. (+26) 2 Номер первого кластера, распределенного файлу. (+28) 4 Размер файла в байтах. 7.1.33. Байт атрибутов файла 0Файл предназначен только для чтения, в этот файл нельзя писать и его нельзя стирать. 1 Скрытый файл, этот файл не будет появляться в списке файлов, создаваемом командой операционной системы DIR. 2 Системный файл. Этот бит обычно установлен в файлах, являющихся составной частью операционной системы. 3 Данный дескриптор описывает метку диска. Для этого дескриптора поля имени файла и расширения имени файла должны рассматриваться как одно поле длиной 11 байт. Это поле содержит метку диска. 4 Дескриптор описывает файл, являющийся подкаталогом данного каталога. 5 Флаг архивации. Если этот бит установлен в 1, это означает, что данный файл не был выгружен утилитой архивации (например, программой BACKUP). 6-7 Зарезервированы. 7.1.34. Формат поля времени 15 11 10 5 4 0 +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ ¦ Часы (0...23) ¦ Минуты (0...59) ¦ Секунды/2 (0...29) ¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ 7.1.35. Формат даты обновления файла 15 9 8 5 4 0 +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ ¦ Год (0...119) ¦ Месяц (1...12) ¦ День (1...31) ¦ +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ 7.1.36. Формат блока DDCB для версий 2.х и 3.х 1 drv_num номер устройства (0 соответствует устройству А, 1 - В и т.д.) (+1) 1 drv_numd дополнительный номер устройства внутри драйвера (+2) 2 sec_size размер сектора в байтах (+4) 1 clu_size число, на единицу меньшее количества секторов в кластере (+5) 1 clu_base если содержимое этого поля не равно нулю, то для получения общего числа секторов в кластере надо возвести 2 в степень clu_base и получившееся число прибавить к clu_size (+6) 2 boot_siz количество зарезервированных секторов (boot-сектора, начало корневого каталога) (+8) 1 fat_num количество копий FAT (+9) 2 max_dir максимальное число дескрипторов файлов в корневом каталоге (т.е. максимальное число файлов, которое может содержать корневой каталог на этом устройстве) (+11) 2 data_sec номер первого сектора данных на диске (номер сектора, соответствующего кластеру номер 2) (+13) 2 hi_clust максимальное количество кластеров (равно увеличенному на 1 количеству кластеров данных) (+15) 1 fat_size количество секторов, занимаемых одной копией FAT (+16) 2 root_sec номер первого сектора корневого каталога (+18) 4 drv_addr FAR-адрес заголовка драйвера, обслуживающего данное устройство (+22) 1 media байт описания среды носителя данных (+23) 1 acc_flag флаг доступа, 0 означает, что к устройству был доступ (+24) 4 next адрес следующего блока DDCB, для последнего блока в поле смещения находится число FFFF --------------- только для DOS 2.x ----------------- (+28) 2 dir_clu номер начального кластера текущего каталога (0 для корневого каталога) (+30) 64 dir_path строка в формате ASCIIZ, содержащая путь к текущему каталогу --------------- DOS 3.х ---------------------------- (+28) 2 reserv1 зарезервироано, обычно равно 0 (+30) 2 built число FFFF в этом поле означает, что блок DDCB был построен 7.1.37. Формат блока DDCB для DOS версии 4.х 1 drv_num номер устройства (0 соответствует устройству А, 1 - В и т.д.) (+1) 1 drv_numd дополнительный номер устройства внутри драйвера (+2) 2 sec_size размер сектора в байтах (+4) 1 clu_size число, на единицу меньшее количества секторов в кластере (+5) 1 clu_base если содержимое этого поля не равно нулю, то для получения общего числа секторов в кластере надо возвести 2 в степень clu_base и получившееся число прибавить к clu_size (+6) 2 boot_siz количество зарезервированных секторов (boot-сектора, начало корневого каталога) (+8) 1 fat_num количество копий FAT (+9) 2 max_dir максимальное число дескрипторов файлов в корневом каталоге (т.е. максимальное число файлов, которое может содержать корневой каталог на этом устройстве) (+11) 2 data_sec номер первого сектора данных на диске (номер сектора, соответствующего кластеру номер 2) (+13) 2 hi_clust максимальное количество кластеров (равно увеличенному на 1 количеству кластеров данных) (+15) 1 fat_size количество секторов, занимаемых одной копией FAT (+16) 1 reserv1 зарезервировано (+17) 2 root_sec номер первого сектора корневого каталога (+19) 4 drv_addr FAR-адрес заголовка драйвера, обслуживающего данное устройство (+23) 1 media байт описания среды носителя данных (+24) 1 acc_flag флаг доступа, 0 означает, что к устройству был доступ (+25) 4 next адрес следующего блока DDCB, для последнего блока в поле смещения находится число FFFF (+29) 2 reserv2 зарезервироано (+31) 2 built число FFFF в этом поле означает, что блок DDCB был построен 7.1.38. Идентификатор BIOS F000:FFF5 (8) - дата изготовления BIOS; F000:FFFC (2) - не используется; F000:FFFE (1) - код типа компьютера. 7.2 Контроллер прерываний 8259 Программируемый контроллер прерываний 8259 (отечественный аналог - КР1810ВН59А) предназначен для обработки до восьми приоритетных уровней прерываний. Возможно каскадирование микросхем, при этом общее число уровней прерываний будет достигать 64. Контроллер 8259 имеет несколько режимов работы, которые устанавливаются программным путем. В персональных компьютерах XT и AT за первоначальную установку режимов работы микросхем 8259 отвечает BIOSBIOS. У программиста скорее всего не возникнет потребность перепрограммировать контроллер - это небезопасно, так как неправильное программирование контроллера приведет к нарушению логики работы всей системы. Однако часто возникает необходимость изменения текущего режима работы (запрет или разрешение прерываний определенного или всех уровней, обработка конца прерывания) или опроса состояния внутренних регистров контроллера. Для этого необходимо ознакомиться со справочными данными на микросхему 8259, где детально описано как первоначальное прогрммирование контроллера, так и управление им во время работы. Каждому приоритетному уровню прерывания микросхема ставит в соответствие определенный, задаваемый программно номер прерывания. В разделе книги, посвященном особенностям обработки аппаратных прерываний, приводится такое соответствие для машин типа XT и AT. Если контроллеры 8259 каскадированы, то ведомой микросхеме присваивается код (выдачей в микросхему соответствующего командного слова). Этот код равен номеру входа IRQ ведущей микросхемы, с которым соединен выход запроса прерывания INT ведомой микросхемы. Внутри микросхемы приоритет зависит от номера IRQ и задается программно. Для компьютеров XT и AT самым высоким приоритетом внутри группы, обслуживаемой каждым контроллером, является вход IRQ0. Однако возможно программное изменение приоритетов в рамках так называемого приоритетного кольца. При этом дно приоритетного кольца имеет самый низкий приоритет. Приведем возможные варианты задания приоритетов: ВходУровни приоритета IRQ07 6 5 4 3 2 1 0 IRQ10 7 6 5 4 3 2 1 IRQ21 0 7 6 5 4 3 2 IRQ32 1 0 7 6 5 4 3 IRQ43 2 1 0 7 6 5 4 IRQ54 3 2 1 0 7 6 5 IRQ65 4 3 2 1 0 7 6 IRQ76 5 4 3 2 1 0 7 Наиболее высокий приоритет у входа IRQ с обозначением 0 приоритетного кольца, наиболее низкий - с обозначением 7. Для обработки прерываний контроллер имеет несколько внутренних регистров. Это регистр запросов прерываний IRR, регистр обслуживания прерываний ISR, регистр маски прерываний IMR. В регистре IRR хранятся запросы на обслуживание прерываний от аппаратуры. После выработки сигнала прерывания центральному процессору соответствующий разряд регистра ISR устанавливается в единичное состояние, что блокирует обслуживание всех запросов с равным или более низким приоритетом. Устранить эту блокировку можно либо сбросом соответствующего бита в ISR, либо командой специального маскирования. Имеется два типа команд, посылемых программой в контроллер 8259 - команды инициализации и команды операции. Возможны следующие операции: индивидуальное маскирование запросов прерывания; специальное маскирование обслуженных запросов; установка статуса уровней приоритета (по установке исходного состояния, по обслуженному запросу, по указанию); операции конца прерывания (обычный конец прерывания, специальный конец прерывания, автоматический конец прерывания); чтение регистров IRR, ISR, IMR. Мы не будем подробно описывать команды инициализации контроллера 8259, так как программистам они скорее всего не понадобятся. Желающих разобраться во всех тонкостях задания начального режима работы контроллера прерываний мы отсылаем к справочной литературе по микросхеме 8259 или ее отечественному аналогу. Рассмотрим команды операций. Существуют три типа команд операций: Маскирование запросов прерывания. Команды обработки конца прерывания. Опрос регистров и специальное маскирование. Байты команды маскирования запросов прерывания выводятся соответственно в порты 21h и A1h для первого и второго контроллера 8259 компьютера AT. Команды операций второго и третьего типа используют порты с адресами 20h и A0h. Маскирование запросов прерываний мы уже описывали в главе, посвященной прерываниям. Для маскирования какого-либо уровня прерывания надо записать в регистр маски IMR по адресу 21h или A1h единицу в соответствующий разряд регистра. Команды обработки конца прерывания приведем в виде таблицы: Биты байта команды

D7 D6 D5 D4 D3 D2 D1 D0 Описание 0 0 1 0 0 0 0 0Обычный конец прерывания. 0 1 1 0 0 B2 B1 B0Специальный конец прерывания, B0...B2 - двоично-десятичный код сбрасываемого разряда в регистре обслуживания прерывания ISR. 1 0 1 0 0 X X XЦиклический сдвиг уровней приоритета с обычным концом прерывания. Дно приоритетного кольца устанавливается по обслуженному запросу. 1 1 1 0 0 B2 B1 B0Циклический сдвиг уровней приоритета со специальным концом прерывания, B0...B2 - двоично-десятичный код дна приоритетного кольца. 1 0 0 0 0 X X XРазрешение вращения уровней приоритета. 0 0 0 0 0 X X XСброс разрешения вращения уровней приоритета. 1 1 0 0 0 B2 B1 B0Циклический сдвиг уровней приоритета без завершения прерывания, B0...B2 - двоично-десятичный код дна приоритетного клоьца. Команды третьего типа выдаются также в порты с адресами 20h и A0h. Они имеют следующий формат: Биты байта команды

D7 D6 D5 D4 D3 D2 D1 D0 Описание 0 0 0 0 1 1 X XУстановка режима опроса. 0 0 0 0 1 0 1 1Разрешение чтения регистра ISR. 0 0 0 0 1 0 1 0Разрешение чтения регистра IRR. 0 1 1 0 1 0 0 0Разрешение триггера специального маскирования. 0 1 0 0 1 0 0 0Сброс триггера специального маскирования. По команде обычного конца прерывания устанавливается в нулевое состояние разряд ISR, соответствующий последнему обслуженному запросу. Команда специального конца прерывания устанавливает в нулевое состояние тот разряд ISR, номер которого указан в разрядах B0...B2 команды. Команда циклического сдвига уровней приоритета с обычным концом прерывания устаналивает в ноль разряд ISR, соответствующий последнему обслуженному запросу, и этому же номеру запроса присваивается низший уровень приоритета. Аналогично работает команда циклического сдвига уровней приоритета со специальным концом прерывания, только низший уровень приоритета присваивается тому входу IRQ, номер которого указан в разрядах B0...B2 команды. Команда циклического сдвига уровней приоритета устанавливает статус уровней приоритета без выполнения операции конца прерывания. Разряды B0...B2 указывают дно приоритетного кольца. После выполнения команд разрешения чтения регистров ISR или IRR при выполнении команды ввода из порта 20h и A0h считывается соответственно содержимое регистров ISR и IRR. Для получения содержимого регистра IMR необходимо выполнить чтение портов с адресами соответственно 21h и A1h. Команда разрешения триггера специального маскирования блокирует действие тех разрядов ISR, которые замаскированы командой типа 1 (маскирования индивидуальных приоритетных уровней запроса прерывания). Специальное маскирование используется для обслуживания такого запроса, который блокируется старшим или равным по уровню приоритета обслуженным запросом, хранящимся в ISR, не сбрасывая последний. Чтение регистров ISR и IRR может испльзоваться резидентными программами при проверке возможности своей активизации - можно проверить, не выполняется ли в настоящий момент обработка какого-нибудь прерывания, которая может конфликтовать с действиями резидентной программы. 7.3. Сегментная адресация памяти Особенностью архитектуры процессоров INTEL 8086, 80286, 80386, 80486 является использование механизма сегментации адресного пространства. Сегментация вызывает трудности у тех программистов, которые раньше работали на ЭВМ типов PDP, СМ ЭВМ, ЕС ЭВМ. В этих машинах программа имеет дело с логическими адресами, которые тем или иным способом отображаются на физические адреса. Программа может не знать подробностей отображения логических адресов на физические, она работает только с логическим адресом. Прообраз процессора 8086 - оригинальный микропроцессор INTEL 8080 - имел линейное адресное пространство размером 64 килобайта. В этом микропроцессоре логический и физический адреса совпадали - все 16 адресных линий (адресных шин) использовались непосредственно для адресации памяти, а программы оперировали абсолютными шестнадцатиразрядными адресами. Однако быстро растущие потребности программ в оперативной памяти привели к необходимости расширения адресного пространства. Следующий микропроцессор 8086 имел уже 20 адресных линий, что позволило непосредственно адресовать до мегабайта оперативной памяти. Архитектурное решение этого микропроцессора позволило легко адаптировать накопленное в большом количестве программное обеспечение для микропроцессора 8080. Микропроцессор 8086 является шестнадцатиразрядным, поэтому использование двадцатиразрядного адреса в 16-разрядных командах неэффективно. Вместо указания в командах полного 20-разрядного адреса используется двухкомпонентная адресация, причем каждая компонента использует только 16 разрядов. Эти компоненты называются сегментной компонентой адреса и компонентой смещения. Логический 20-разрядный адрес получается сложением двух компонент, причем сегментный адрес перед сложением умножается на 16 (сдвигается влево на 4 разряда). Сложение и сдвиг выполняется аппаратно, поэтому на формирование 20-разрядного адреса дополнительно время не затрачивается. На рисунке показано, как в процессоре 8086 происходит формирование 20-разрядного адреса из адреса сегмента и смещения: 19 4 3 0 +----------------------------------+ ¦ Сегментный адрес ¦ 0 0 0 0 ¦ +----------------------------------+ + 19 16 15 0 +----------------------------------+ ¦ 0 0 0 0 ¦ Смещение ¦ +----------------------------------+ = 19 0 +----------------------------------+ ¦ Полный 20-разрядный адрес ¦ +----------------------------------+ Адрес сегмента сдвигается влево на 4 бита с заполнением младших битов нулями, смещение расширяется до 20 битов и складывается со сдвинутым адресом сегмента. Например, если адрес сегмента равен 1234h, а смещение равно 1116h, то полный 20-разрядный адрес будет 12340h + 01116h = 13456h. Таким образом, оперируя 16-разрядными адресами сегмента и смещением, процессор может адресовать мегабайт памяти. Для хранения сегментных адресов и смещений процессор имеет специальные регистры. Каждая выполняющаяся программа в любой момент времени может адресоваться сразу к четырем сегментам памяти. Это сегмент кода, сегмент данных, дополнительный сегмент данных, сегмент стека. Сегмент кода содержит выполняющиеся машинные команды, сегменты данных и дополнительных данных используются для размещения используемых программой переменных, массивов и других структур данных, сегмент стека используется при вызове подпрограмм. Сегменты могут перекрываться или не перекрываться. Для хранения сегментных адресов процессор имеет 4 сегментных регистра: CS, DS, ES, SS. Эти регистры содержат соответственно адреса сегментов кода, данных, дополнительных данных и стека. При адресации выполняющегося кода вместе с регистром CS используется регистр смещения IP. Пара регистров CS:IP всегда указывает на текущую выполняющуюся команду. Адресация данных возможна относительно любого сегментного регистра. При этом смещение может указываться как непосредственно в команде, так и с помощью регистров. Программа должна сама следить за правильной загрузкой и использованием сегментных регистров. Мы приведем несколько примеров программ, составленных на языке ассемблера. Эти программы используют различное количество сегментов и могут служить шаблоном для составления ваших собственных программ. Первая программа использует всего один сегмент. В этом сегменте расположены выполняющиеся машинные команды и данные, используемые программой. Заметьте, что размер программы, состоящей из одного сегмента, не может превышать 64 килобайта. Текст программы: ; В этом месте расположен сегмент кода. Он содержит ; выполняющуюся программу. code segment ; Директива assume сообщает ассемблеру, как будут ; использоваться сегментные регистры. Эта директива ; не выполняет загрузку сегментных регистров, она ; нужна ассемблеру только для правильного вычисления ; смещений. assume cs:code, ds:code ; Эта строка нужна для создания com-программы. org 100h ; При запуске программы управление будет передано ; на оператор с меткой start. ; Первое, что должна сделать программа - правильно ; загрузить сегментные регистры. ; Регистр CS загружается операционной системой ; при запуске программы, поэтому его загружать не надо. ; Регистры DS и ES должны указывать на начало ; сегмента кода, так как программа состоит из одного ; сегмента. start: mov ax, cs mov ds, ax ; Выводим сообщение msg из сегмента данных mov ah, 9h mov dx, OFFSET msg int 21h ; Завершаем работу программы mov ax, 4C00h int 21h ; Строка, которую программа выведет на экран. msg db "Hello, world.", 13, 10, "$" code ends end start Если для размещения данных и буферов недостаточно одного сегмента, необходимо организовать отдельные сегменты для кода и данных, как это сделано в следующем примере: ; Создаем сегмент стека. Размер стека - 256 байт, ; стек выравнен на границу параграфа (para). stack segment para stack ; Резервируем 256 байт для стека. db 100h dup (?) stack ends ; Создаем сегмент данных. Этот сегмент выравнен на ; границу двухбайтового слова (word). data segment word ; Строка, которую программа выведет на экран. msg db "Hello, world.", 13, 10, "$" data ends ; В этом месте расположен сегмент кода. Он содержит ; выполняющуюся программу. code segment ; Директива assume сообщает ассемблеру, как будут ; использоваться сегментные регистры. Эта директива ; не выполняет загрузку сегментных регистров, она ; нужна ассемблеру только для правильного вычисления ; смещений. assume cs:code, ds:data, ss:stack ; При запуске программы управление будет передано ; на оператор с меткой start. ; Первое, что должна сделать программа - правильно ; загрузить сегментные регистры. ; ; Следующие два оператора инициализируют сегментный ; регистр данных DS. start: mov ax, data mov ds, ax ; Инициализируем сегментный регистр стека и ; указатель стека (регистры SS и SP). ; Эта операция должна выполняться в состоянии ; процессора с запрещенными прерываниями, иначе ; если регистр SS будет содержать уже новое значение, ; а SP - старое и если в этот момент произойдет ; прерывание, адрес возврата и значение регистра флагов ; будут записаны в не предназначенную для этого область. cli mov ss, ax mov sp, OFFSET stack sti ; Выводим сообщение msg из сегмента данных mov ah, 9h mov dx, OFFSET msg int 21h ; Завершаем работу программы mov ax, 4C00h int 21h code ends end start Макроассемблер MASM версии 5.0 и более поздних версий, а также Quick Assembler содержит директивы, упрощающие описание сегментов. Это такие директивы, как .CODE, .DATA, .MODEL и другие. Вы найдете подробное описание этих директив в соответствующей документации по ассемблеру. Остановимся подробнее на директиве .MODEL. Эта директива задает так называемую модель памяти, используемую программой. Что это такое? Мы уже говорили о том, что программа должна состоять из одного или нескольких сегментов, в зависимости от размера кода и данных, которыми она опериру

Соседние файлы в папке 3 Том