Buzz
#17
10 апреля 1999 |
|
Hard Life - О создании новой DOS для Speccy.
(C) Alex Kerman/Global Corp. Hard Life Project В последнее время я все чаще и чаще сталкиваюсь с пробле- мой, которая наверняка знакома всем синклеристам: куда перепи- сать новые программы? Можно конечно, стереть какие-нибудь старые игрушки или системки с диска, чтобы затем переписать туда новье, можно также купить еще одну коробку дисков и на месяц забыть о такого рода проблемах. Но гораздо лучше было-бы, если бы на ста- рый добрый SPECCY можно было бы поставить винчестер. Преиму- щества жесткого диска перед дискетами очевидны: намного меньше стоимость одного мегабайта (и с увеличением емкости HDD эта раз- ница растет), более быстрый доступ к информации, да и в конце концов можно отсортировать файлы по темам и держать их в разных каталогах. К тому же, имея винчестер, больше не придется рыться в дискетах, чтобы найти нужный файл. Если приходит новье,то дос- таточно просто скопировать его на винчестер, при этом не задумы- ваясь, где взять диски или на каком диске есть еще свободные сектора. Но, как оказалось, одного желания иметь винчестер мало. Нужна еще хорошая дисковая операционная система, которая могла бы работать с винчестером. Есть два решения этой проблемы. Пер- вое решение заключается в том, чтобы эмулировать TR-DOS диски на винчестере, в таком случае около половины (а может быть и больше) программ будут запускаться с HDD. В принципе, так сдела- но на SCORPION'е, но мне такое решение не нравится по нескольким причинам: во-первых, очень глупо эмулировать TR-DOS, которая, фактически сама является эмуляцией ленты, во-вторых, можно сразу забыть про подкаталоги, в-третьих, имеет большие ограничения на размер файла, размер диска, количество файлов на диске, в-чет- вертых, для переключения дисков нужно выходить в теневой мони- тор, что мне кажется очень неудобным. Можно назвать еще много недостатков такого решения, но мне кажется, что хватит и этих, чтобы понять, что запуск программ с винчестера без переделки не стоит таких жертв. Итак, вариант второй: раз уж мы решили, что программы с винчестера запускаться не будут, то можно отойти от всех ограни- чений TR-DOS и сделать принципиально новую DOS, "заточенную" под SPECTRUM. Конечно, можно сделать DOS совместимой с MS-DOS, кое- какие преимущества это дает, но MS-DOS очень медленна, чтобы, например, создать файл, придется прошарить весь FAT в поисках свободного кластера, а 16-битный FAT занимает на диске ни много ни мало - 128 килобайт. К тому же при загрузке файла тоже необ- ходимо постоянно обращаться к FAT, чтобы загрузить файл по ку- сочкам, раскиданным по всему диску (кстати, это тоже резко сни- жает скорость работы, в ходе экспериментов выяснилось, что неп- рерывное пространство мой 126-мегабайтный Maxtor читает со ско- ростью 104 кб/с, а выбранные случайным образом сектора со ско- ростью 26.8 кб/с. Эксперимент проводился на Profi 5.03 с вклю- ченным турбо. Сейчас я работаю над созданием DOS, которая ориентирована на максимальную скорость работы с файлами и наилучшее удобство в работе. Постараюсь поподробнее рассказать о своей задумке, может быть это Вас заинтересует. Я решил сделать файлы непрерывными, чтобы ускорить их загрузку/выгрузку а также с целью упрощения файловой системы на диске. Главной особенеостью DOS является таблица свободного пространства, которая содержит данные о том какие сектора диска заняты, а какие свободны. В чем же преимущества таблицы свобод- ного пространства (ТСП) перед, например, bitmap свободных секто- ров? Во-первых размером. ТСП - это массив описателей свободного пространства, т.е. содержит описатели, которые указывают, откуда начинается свободное пространство, и какой имеет размер. Если половина диска забита вплотную, без промежутков, файлами, то тогда ТСП имеет всего лишь одну пометку, которая указывает на свободное пространство, начинающееся после последнего файла, и имеющего длину, равную объему диска минус суммарный объем всех файлов и каталогов на диске. Длина описателя свободного пространства равна семи байтам, значит в одном секторе 512 байт помещается 73 таких описателя, что как мне кажется вполне доста- точно (у меня на IS-DOS диске никогда не бывает больше шести непрерывных участков свободного пространства). Допустим, что у меня на 120-мегабайтном винчестере скопилось две тысячи файлов так, что между каждыми двумя соседними файлами есть свободное пространство, тогда нам потребуется ТСП размером 2000/73=28 сек- торов, т.е. 14 килобайт. Осталось только придумать как запихать таким образом две тысячи файлов на винт. Впрочем выход есть: нужно переписать на винчестер четыре тысячи файлов и удалить каждый второй файл... Есть и другие преимущества ТСП перед другими файловыми системами, как напшимер, отсутствие необходимости разбивать диск на кластеры и возможность работы с физическими координатами. Размер же табгицы в DOS считается по формуле один сектор на че- тыре мегабайта пространства, но не менее 16 секторов. Для гибко- го диска 800 килобайт (10 секторов на дорожке по 512 байт), таб- лица всегда равна четырем секторам. Вообще-то размер таблицы для быстродействия никакого значения не имеет, т.к. работа ведется только с теми секторами ТСП, в которых есть описатели свободного пространства, т.е. если на диске пятьдесят непрерывных свободных участков, то DOS работает только с одним сектором ТСП не зависи- мо от размера таблицы. Если размер таблицы в конце концов сильно вырос, тогда можно диск уплотнить. В таком случае ТСП будет со- держать один-единственный описатель сколь угодно долгое время, пока не будет удален какой-нибудь файл на диске. ТСП также поз- воляет обходить плохие сектора на диске. При работе DOS использует только физические координаты на диске (cylinder, head, sector), что также увеличивает скорость работы с файлами за счет отсутствия подпрограммы, переводящей логические координаты в физические. Физические координаты (ФК) везде представлены в виде четырех байт (первые два байта - номер дорожки, сначала младший байт, затем старший, третий байт - но- мер головки, четвертый - номер сектора). Внутри DOS для задания ФК используются регистры DE:BC, где DE - дорожка, C - головка, B - сектор. Описатель свободного пространства состоит из четырех байт ФК и трехбайтной длины свободного пространства, значит свободное пространство, а также и объем винчестера может быть равен макси- мум 16777216 секторам или восьми гигабайтам. Разумеется DOS будет иметь систему подкаталогов, т.к. я думаю, что нельзя считать полноценной файловую систему не имею- щую подкаталогов. Решено было ограничить количество файлов в ка- талоге до 512. Это ограничение введено для программ, работающих с каталогом, чтобы можно было отвести под каталог буфер опреде- ленного размера. Ограничение количества файлов, точнее описате- лей файлов и каталогов не связано с ограничениями файловой сис- темы, с таким же успехом можно было бы ограничить их числом 1024 или 65536. Описатель файла состоит из двадцати четырех байт, куда входит восьмисимвольное имя и трехсимвольное расширение, данные о длине файла в секторах и отдельно в байтах, ФК файла и данные, необходимые для архивного хранения TR-DOS программ на винчесте- ре. Описатель каталога также имеет длину 24 байта и начинается с идентификатора #FF, чтобы легче было его отличить от описателя файла. После идентификатора идет имя каталога, состоящее из 12 символов. Почему из двенадцати? Потому что при выводе на экран каталога имя файла тоже имеет 12 символов (8 символов имени, точка и три символа расширения). В имени/расширении файла/каталога запрещены символы с ко- дом меньше 32 или равным 255, а также пробел и символы "*","?","\","/",".". Остальные символы разрешены,включая русские буквы по стандарту альтернативного ASCII. Размер файла ограничен шестнадцатибитной длиной в секто- рах, это значит, что максимальная длина файла равна 32 мегабай- та. Если описатель файла/подкаталога занимает 24 байта, то в одном секторе каталога помещается 21 описатель, а чтобы размес- тить 512 описателей, необходим каталог размером 25 секторов, т.е. 12.5 кБ! По-моему, слишком расточительно выделять по 12 ки- лобайт на каждый каталог, особенно на гибком диске. Чтобы потери были не такими большими, я ввел такую систему каталогов: при создании каталога под него отводится четыре сектора (на 84 опи- сателя), а при переполнении к каталогу добавляются еще четыре сектора продолжения, причем продолжение каталога может нахо- диться где угодно, вне зависимости от расположения каталога. Та- ким образом, если действительно ограничение на 512 описателей, то каталог может состоять из семи частей. Получается, что ката- логи имеют сегментированную структуру, но на практике количество описателей очень редко больше 84, поэтому подавляющее большинство каталогов все-таки непрерывно. Следует отметить, что координаты продолжения каталога размещаются в предыдущей части каталога, значит какой-либо дополнительной таблицы расположения частей каталога не существует. При выделении дискового пространства (создание файла/ка- талога, продолжение каталога), в ТСП ищется первый подходящий описатель свободного пространства, если описатель найден, то DOS все равно просматривает до конца данный сектор ТСП с целью на- хождения меньшего по объему требуемого свободного пространства. Если найденное свободное пространство равно по длине требуемому объему, то описатель удаляется, сектор сдвигается, а затем сдви- гается и вся остальная часть ТСП, где есть описатели. Сдвигать таблицу приходится и при освобождении дискового пространства (у- даление файла/каталога), чтобы сохранить порядок описателей, ко- торые должны обязательно должны быть отсортированы в порядке возрастания их ФК. DOS будет располагаться в ПЗУ вместо BASIC 128. При стар- те компьютера на экран будет выводиться меню содержащее следую- щие пункты: TR-DOS, COMMAND LINE, BASIC 48, BASIC 48+128K. Воз- можно, удастся вставить в 16 килобайт кроме DOS еще и тест компьютера, тогда к меню добавится еще один пункт. Одновременно с появлением меню происходит опрос винчестера на готовность, ес- ли не была нажата какая-либо клавиша. Если винчестер готов к ра- боте, тогда считывается первый сектор нулевой головки нулевой дорожки, из которого копируются в системные переменные необходи- мые данные (ФК ТСП, ФК корневого каталога, количество дорожек, головок и секторов винчестера, длина ТСП в секторах). Если на этом секторе нет идентификатора DOS или байт разрешения автос- тарта равен нулю, тогда автостарта не происходит. Сам процесс автостарта еще не до конца продуман - может быть будет грузиться и обрабатываться autoexec.bat, а может будет запускаться start.exe или gc.com. Конечно, немаловажным моментом является переделка су- ществующих программ под DOS. С обыкновенными загрузчиками дело обстоит просто: в DOS для этой цели предусмотрено посекторное чтение файла, установка смещения в файле, открытие нового файла. Если не хочется писать .exe загрузчик в ассемблере, можно напи- сать текстовый bat-файл, который можно будет скомпилировать вместе со всеми указанными в bat'нике файлами в один exe-файл. Если программа работает с файлами на диске, тогда пере- делки могут быть весьма значительными. Для работы с каталогом предусмотрены посекторное чтение каталога и поиск описателя по маске. Например, ассемблер задает маску "*.asm", затем вызывает функцию DOS "поиск файла с начала каталога", копирует имя фай- ла/каталога, затем вызывает функцию "поиск следующего файла", снова копирует себе в буфер имя, и так далее до ошибки "файл не найден" (#0F). При создании файла, если встретился файл с таким же именем, DOS стирает существующий файл и создает новый. Если у создающегося файла и у существующего одинаковая длина в секто- рах, то просто открывается существующий файл и корректируется длина в байтах. При создании загрузчиков и программ под DOS необходимо учитывать, что в памяти по адресу #5B00 находятся системные пе- ременные DOS. Сейчас переменные занимают около 70 байт, но когда DOS будет готова, они будут занимать порядка 100 байт. Следом за переменными обычно располагается буфер для дисковых операций длиной 512 байт, который при надобности можно расположить по лю- бому адресу в ОЗУ, причем совсем даже не обязательно кратному 256. Впрочем для посекторной загрузки этот буфер не требуется. Функции DOS будут вызываться командой RST, а в аккумуля- торе (или в другом каком-либо регистре - пока еще не совсем яс- но) должен находиться номер вызываемой подфункции. При операциях с именем файла/каталога вызывающая программа должна указывать адрес имени в HL, причем имя может находиться даже в буфере для дисковых операций. Все функции DOS возвращают в аккумуляторе код ошибки (если A=0 то ошибки нет). Возможно, потом я предусмотрю одновременную работу с двумя файлами, но можно обойтись и без этого, если иметь две копии переменных. При обращении к первому файлу предварительно скопировать на место первый блок перемен- ных, а при обращении ко второму - второй. Таким образом можно открыть неограниченное количество файлов и работать с ними. В ПЗУ по адресу #3800 будет зашит шрифт 4x8 в экранном формате, стандарт - альтернативный ASCII. Этим шрифтом будет пользоваться DOS при работе с командной строкой и при выводе на- чального меню. Также в ПЗУ будут находиться набор подпрограмм для печати строк, символов и чисел. Вот вроде бы я и закончил краткое описание DOS. Если Вас заинтересовал этот проект и Вы готовы поддержать его или Вам что-либо не понравилось или Вы хотите что-нибудь дополнить Вы можете напасать мне письмо по нижеприведенному адресу или позво- нить по телефону. Если же никого не заинтересует этот проект, то продолжать мне работу не имеет смысла, так что пишите - судьба проекта в ВАШИХ руках. 309530 г.Старый Оскол м-он "Юность" д.5 кв.12 Косареву Андрею т. (0725) 25-54-43
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября