\title/FN ═__ Работа с файлами на дискете _________________________________─ ©©© ═__ ┬II. Работа с файлами на дискете Оставьте трудиться напрасно, стараясь из╨ влечь из одного разума всю мудрость; спраши╨ вайте природу, она хранит все истины и на во╨ просы ваши будет отвечать вам непременно и удовлетворительно. Р.Бэкон ┬II.1. Контрольный Буфер Файла Для работы с файлами Вам, безусловно, пригодится информация о Кон╨ трольном Буфере Файла ("File Control Block", FCB). FCB - это такое место в оперативной памяти компьютера (всего 25h=37 байтов), где хранится вся информация, необходимая MSX-DOS для работы с ┌одним файлом─, находящимся на диске. В буфере управления файлом (он же - FCB) есть все: от номера дисковода и имени файла до даты и времени его рождения. В некоторых случаях Контрольным Буфером Файла называют и не╨ полную информацию о файле - несколько первых байтов ... Предположим, что Вы программируете на языке MSX-BASIC. Тогда Вы мо╨ жете использовать в своих программах \/T0/1 ─┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ функцию ┴ VARPTR(#n) ┴ , ┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ \/T1/1- где: VARPTR ( "VARiable PoinTeR" - "указатель переменной" ) - служебное слово; n - арифметическое выражение, целая часть значения которого опре╨ деляет номер FCB (от 0 до значения выражения, стоящего в правой части оператора MAXFILES= ). Эта функция возвращает ┌адрес─ X байта, начиная с которого расположен в памяти FCBn. Взгляните на схему расположения информации в FCBn : \/T0/1 Управляющая информация ┬┬┬┬│ Данные ─┬┬┬├┬┬┬├┬█┬├┬┬┬├┬┬┬├┬┬┬├┬┬┬│ ┴▄▄▄┴▄▄▄┴╧╧╧┴▄▄▄┴⌡⌡⌡┴╧╧╧┴⌡⌡⌡┴ ┌┬┬┬┤┬┬┬┤┬┬┬┤┬┬┬┤┬┬┬┤┬┬┬┤┬┬┬┐ Адреса ┬┬▐ X X+1 X+8 X+9 X+264 ▌ ┴ \/T1/1- Байт, адрес которого возвращает функция VARPTR(#n) При открытии файла на языке ассемблера Вы должны создать FCB, в ко╨ тором должна быть записана следующая информация: \/T0/1 ─┬┬┬┬┬├┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴Номер┴ Содержимое байта ┴ ┴байта┴ ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ X ┴ Тип файла: ┴ ┴ ┴ 1 - OPEN FOR INPUT ┴ ┴ ┴ 2 - OPEN FOR OUTPUT ┴ ┴ ┴ или OPEN FOR APPEND (для диска) ┴ ┴ ┴ 4 - файл прямого доступа (для диска) ┴ ┴ ┴ или файл последовательного доступа, ┴ ┴ ┴ открытый и для чтения, и для записи. ┴ ┴ ┴ 8 - OPEN FOR APPEND ┴ ┴ ┴ (для устройства MEM:) ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ─┬┬┬┬┬┬┬┬┬┬┬ X+1 ┴ Ссылка на область памяти, в кото╨ ┴ ┴ ┴ X+2 ┴ рой хранится ┌спецификация─ файла ┴ ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ ┴ X+3 ┴ ? ┴ ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ ┴ X+4 ┴ Номер текущего устройства: ┴ ┴ ┴ ┴ 0 - активное устройство по умолчанию┴ ┴ ┴ ┴ 1 - дисковод A: ┴ ┴ ┴ ┴ 2 - дисковод B: , и т.д. ┴ ┴ ┴ ┴ FCh - устройство GRP: ┴ ┴ ┴ ┴ FDh - устройство CRT: ┴ ┴ ┴ ┴ FEh - устройство LPT: ┴ ┴ ┴ ┴ FFh - устройство CAS: ┴ ┴ ┴ ┴ Дополнительные устройства: ┴ ┴ ┴ ┴ D4h - устройство COM: ┴ ┴ ┴ ┴ (локальная сеть MSX-1) ┴ ┴ ┴ ┴ C0h - устройство MEM: ┴ ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ ┴ X+5 ┴ ? ┴ ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ ┴ ╧╧╧ ┴ ? ┴ ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ ┴ X+9 ┴ Содержимое записи файла (256 байт) ┴ ┴ ┌┬┬┬┬┬┤┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ ┴ ┴ юСпецификация файла ┴ ─┬┬┬┬┬├┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴ ┴Номер┴ Содержимое байта ┴ ┴ ┴байта┴ ┴ ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┌┬┬▐ +00 ┴ Номер дисковода (0 - по умолчанию, 1 - A:) ┴ ┴ +01 ┴ Имя файла ┴ ┴ +09 ┴ Расширение имени файла ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ +12 ┴ Номер текущего блока (или записи) ┴ ┴ +14 ┴ Текущий размер записи (по умолчанию равен 128) ┴ ┴ +16 ┴ Размер файла в байтах ┴ ┴ +20 ┴ Дата изменения файла ┴ ┴ +22 ┴ Время изменения файла ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ +24 ┴ Идентификатор устройства ("Device ID", см. табл. ниже) ┴ ┴ +25 ┴ Размещение директории ("Directory location") ┴ ┴ +26 ┴ Первый кластер файла ┴ ┴ +28 ┴ Последний кластер файла ┴ ┴ +30 ┴ Последний доступный кластер (относительно начала файла)┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ +32 ┴ Номер текущей записи файла последовательного доступа ┴ └┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ +33 ┴ Номер случайной записи для файла прямого доступа ┴ ┴ +34 ┴ (байты 33,34,35 - если размер записи больше 63 ┴ ┴ +35 ┴ байты 33,34,35,36 - если размер записи меньше 64) ┴ ┴ +36 ┴ ┴ ┌┬┬┬┬┬┤┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ \/T1/1- Следует отметить, что в системе MSX-BASIC значимыми являются все байты FCB, а в системе MSX-DOS при открытии файла используется только спецификация файла. ─┬┬┬┬┬┬┬┬┬├┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬│ ┴Device ID┴ Устройство ┴ T┬┬┬┬┬┬┬┬┬┼┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┘ ┴ 040h ┴ Диск ┴ ┴ 0FFh ┴ CON (консоль) ┴ ┴ 0FBh ┴ PRN (принтер) ┴ ┴ 0FCh ┴ LST (принтер) ┴ ┴ 0FEh ┴ AUX (вспомогательное) ┴ ┴ 0FDh ┴ NUL (нулевое) ┴ ┌┬┬┬┬┬┬┬┬┬┤┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐