ZX-Ревю 1996 №4-5 1996 г.

TR-DOS для начинающих - продолжение (начало см. ZX РЕВЮ 96/1-2).


TR-DOS для начинающих

Продолжение (начало см. ZX РЕВЮ 96/1-2) © В. Сироткин, г. Краснокаменск.

ГЛАВА 2.

ВНУТРЕННЯЯ ОРГАНИЗАЦИЯ ДИСКА.

Как вы уже знаете, существует множество систем, форматов и способов записи на диски информации в разных компьютерах.

В системе TR-DOS Спектрума основной стандарт разметки дисков таков:

256 БАЙТОВ НА 1 СЕКТОР; 16 СЕКТОРОВ НА ДОРОЖКЕ.

Как уже было сказано, в TR-DOS используются диски DD/DS (2D/2S). Так вот, эти диски TR-DOS форматирует таким образом: 160 ДОРОЖЕК НА ВСЕМ ДИСКЕ, по 80 ДОРОЖЕК НА КАЖДОЙ СТОРОНЕ. Дорожки нумеруются от 0 до 159.

Нулевая дорожка расположена у внешнего края диска на верхней стороне поверхности 0. Далее - 1-я дорожка на нижней стороне диска.

Две дорожки, расположенные на разных поверхностях, но находящиеся одна над другой, называют ЦИЛИНДРОМ. На каждой дорожке расположено по 16 СЕКТОРОВ, которые нумеруются с 1 по 16.

Физически сектора на диске располагаются не по порядку возрастания номеров, а с пропуском в один сектор (см. рис.1).

рмг i сектора

Диск форматирован в TR-DOS командой "FORMAT"

Это было сделано, видимо, из опасения, что процессор, обработав один сектор, не успеет приготовиться и сразу считать следующий сектор. Пришлось бы ждать еще один оборот диска для того, чтобы попасть на следующий по порядку сектор.

А так, пока обрабатывается сектор номер 1, диск прокрутится, пройдет сектор 9, а когда будет все готово, головка дисковода как раз попадет на сектор 2.

Такая разметка диска присуща самой системе TR-DOS, но это не значит, что нельзя разметить по другому. Дело в том, что системе безразлично, вообще-то, как на диске располагаются сектора в дорожке. Самое главное, чтобы на данной дорожке были сектора с нужными номерами, нужной размерности и нужным числом.

Вот г-н Родионов подумал и написал программу DCU 2, где сектора расположены по порядку возрастания номеров, не побоялся, что система не успеет обработать два идущих подряд сектора - и не ошибся! Получился, так называемый, "быстрый FAST диск", где информация с диска обрабатывается чуть быстрее, чем на стандартно размеченном диске (см. рис. 2).

отверстие

Диск размечен программой Н. Родионова "D.C.U. 2"

Да, и самое главное г-н Родионов не побоялся разметить диск на число дорожек больше, чем 160, и тоже не прогадал, выжав из диска еще дополнительные килобайты.

Вообще-то можно разметить диск на еще большее число дорожек, но чем головка ближе к центру диска, тем больше риск ошибки при считывании информации. И уж совсем плохо будет, если Вам придет в голову разметить диск с двухсотой дорожкой. Ваш дисковод будет безуспешно долбиться головкой об ограничители, и Вам станет не по себе от дикого звука, который при этом будет раздаваться.

Это все хорошо, ну а как, все таки, система узнает, где и в каком месте диска она находится? Дело в том, что у каждого сектора находится служебная область, где записана вся необходимая информация.

В начале у сектора идет область синхронизации, состоящая из кодов #4Е и нулей - это, так называемая, область «пробела», нужная для синхронизации микросхемы ВГ93 на область данных (см. Рис.3). Далее идет индексная метка и область И.А.М. (индексная адресная метка). Вот в ней то и записана вся информация о данном секторе. И.А.М. начинается с байтов #А1, #FE. Далее следуют:

Синхро-байты

Метка

Трек

Сторона

Сектор

Длина сектора

Контрольная сумма

Поле синхронизации и идентификации

Метка адрес

ДАННЫЕ (256 байт)

Контроль

Поле данных с метками и контрольной суммой

НОМЕР ЦИЛИНДРА (начало с 0)

СТОРОНА ДИСКА (0 верх, 1 низ)

НОМЕР СЕКТОРА (с 1 по 16)

ТИП СЕКТОРА 0 - сектор 128 БАЙТ (его длина)

1 - сектор 256 БАЙТ

2 - сектор 512 БАЙТ

3 - сектор 1024 БАЙТ КОНТРОЛЬНАЯ СУММА (циклическая сумма)

Если система не находит область И.А.М., или контрольная сумма не совпадает с просчитанной (а контрольная сумма просчитывается микросхемой каждый раз), то выдается код ОШИБКИ, и обработка или повторяется, или прекращается в зависимости от числа попыток, заложенных программистом в подпрограмму обработки ошибок.

Если все в порядке, то за областью И.А.М. следуют байты пробела, коды #4Е и нули. За ними идет АДРЕСНАЯ МЕТКА ДАННЫХ - коды #А1; #FB, и только тогда идут, собственно, те данные, которые считывают-ся или записываются на диск пользователем.

Эта область, когда данныхтам нет, содержит 256 нулей, (в случае TR-DOS). После области данных следует код КОНТРОЛЬНОЙ СУММЫ этой области. И вот так в каждом секторе.

Вся эта информация заносится в процессе форматирования диска и, в конечном итоге, зависит от программиста. Можно разметить по своему усмотрению все сектора на дорожке с одним номером, или дорожки с обратной нумерацией, или еще чего придумать, но тогда придется писать уж и программу, которая будет разбираться на диске со всей этой мешаниной, но это будет уже не TR-DOS, а что-то другое.

TR-DOS в этом не разберется и с пол-оборота выдаст: *DISK ERROR*!

Для примера приводим таблицу всех байтов, которые находятся в одном секторе, в служебной области (см. табл.1).

Таблица 1.

число байтов

код

назначение

10

#4E

Начальный пробел синхронизации

12

#00

1

#A1

Начало адресной метки индексного массива

1

#FE

1

#00

Цилиндр

1

#00

Сторона диска

1

#01

Номер сектора

1

#01

Длина сектора (256 байт)

2

#CRC

Контрольная сумма

22

#4E

Пробел перед областью данных

12

#00

1

#A1

Начало метки области данных

1

#FB

256

#DATA

Данные пользователя

2

#CRC

Контрольная сумма

50

#4E

Остаточный пробел

формат массива для диска двойной плотности (МЧМ)

Вся эта информация заносится за один проход, по всем секторам на одной дорожке во время форматирования.

Собственно, это и есть процесс форматирования. Из этого всего следует, что если у Вас возникнет желание отформатировать одну дорожку - на здоровье, но отдельно отформатировать или переформатировать один сектор нельзя! Только целиком дорожку!

Если мы внимательно подсчитаем, сколько все же килобайт помещается на одной дорожке со всеми метками, «пробелами», и т.д., то окажется - на дорожке приблизительно 6200 байтов:

• 4 килобайта информации, которой располагает пользователь;

• 2 килобайта всех служебных меток.

Да, за все надо платить. Без этих 2-х килобайт меток обмен с диском был бы крайне затруднителен, если возможен вообще!

Итак, у нас есть размеченный диск:

• 160 ДОРОЖЕК , 16СЕКТОРОВ В ДОРОЖКЕ;

• ВСЕ НЕЧЕТНЫЕ ДОРОЖКИРАСПОЛАГАЮТСЯ НАНИЖНЕЙ СТОРОНЕ;

• НУЛЕВАЯ И ВСЕ ЧЕТНЫЕ НА - ВЕРХНЕЙ СТОРОНЕ.

А что же дальше? Даже если у Вас есть размеченный диск, но не заполнен сектор номер 8, то TR-DOS все равно ответит Вам отказом, и диск рассмотрит как сбойный.

В ВОСЬМОМ ЛОГИЧЕСКОМ секторе располагается информация TR-DOS. Это тип диска, имя диска, количество дорожек и т.д. Ниже дана раскладка всех необходимых байтов сектора.

СОДЕРЖАНИЕ ВОСЬМОГО (лог.) СЕКТОРА С нулевого по 224 байт в секторе записаны нули.

номер байта

назначение

225

номер первого свободного сектора

226

номер первой свободной дорожки

227

диск двусторонний/односторонний

= #16 =/= #18 =

228

количество файлов на диске

229

количество свободных секторов МЛ. БАЙТ

230

СТ. БАЙТ

231

количество секторов в дорожке = #10

232

00

233

00

234 по 242

#20

243

00

244

количество удаленных файлов

245 по 252

ИМЯ ДИСКА (8 символов)

Самым главным байтом на секторе является байт с номером 231!

Можете стереть или изменить всю информацию на секторе - диск еще останется работоспособным, но если Вы измените этот байт - диск окажется сбойным, и прочитать его можно будет только каким-нибудь Диск-Доктором, загрузив в него целиком дорожку № 0._

вот тут необходимо' сделать отступление и договориться об одной вещи во избежание, путаницы! ! дело в том, что номера секторов реально на диске помечены номерами от 1 ДО 16!!! система TR dos на верхнем уровне использует нумерацию с о до 15, корректируя потом номера секторов до реальных. будем считать, что номера с 1 до 16 будут физическими номерами сектора, а номера с о до 15 - логическими. в каждом конкретном случае мы будем ука-_зывать, где логическая нумерация, а где физическая._

Восстановить же диск после таких манипуляций можно.,тем же самым «Доктором», записав на это место код #10.

Сектора с 0 по 7 (логические номера) занимает каталог диска.

пока на диске нет файлов, там записаны нули, но как только на диске появляются файлы, система автоматически создает на каждый файл нечто вроде описателя файла, т.е. создает каталог.

на каждый описатель - заголовок файла резервируется 16 байт. таким образом, на диске может быть записано не больше (256 байт сектора)/ (16 байт заголовка) * (8 секторов) = 128 ФАЙЛОВ!!! Лишние файлы будут просто не создаваться на диске.

Кстати, и название свое система tr-dos 128 получила именно в честь этого числа.

Каждый байт заголовка имеет свое значение для системы.

байты

назначение

0....7

ИМЯ ФАЙЛА (8 символов)

8

ТИП ФАЙЛА (b,c,d,#)

9

НАЧАЛО ФАЙЛА (мл. байт) В ОЗУ

10

НАЧАЛО ФАЙЛА ( ст. байт) В ОЗУ

11

ДЛИНА ФАЙЛА (мл. байт)

12

ДЛИНА ФАЙЛА (ст. байт)

13

число занимаемых секторов

14

номер первого сектора файла

15

номер дорожки начала файла

Имя файла

может состоять, вообще-то, из любых символов, стрингов, но рекомендуется давать имена, состоящие из кодов не меньше 30 и не больше 127.

Можно, конечно, составить имя и из кодов, не входящих в данный диапазон, но вероятность того, что Вы нарветесь на такую ситуацию, когда после команды "CAT" Ваш компьютер напишет - INVALID COLOR, DISK ERROR и т.д. и т.п. - ОЧЕНЬ ВЕЛИКА!

Так что, не искушайте судьбу, да и работать с простыми именами проще. Тип файла.

Системой воспринимаются только файлы с типом В.

В - файл БЕЙСИКА

С - файл кодов

D - файл типа ДАННЫ1Е

# - файл произвольно-последовательного типа.

Но это не значит, что нельзя работать с другими типами файлов.

Например, Вам захотелось, чтобы программа в процессе работы загружала или сохраняла файлы состояния ситуации с типом, отличным от системных. Отчего же нельзя, например, дать при выгрузке тип файла < Z >? Можно, но только нужно помнить, что работать с этим файлом из системы TR-DOS стандартными командами Вы не сможете! Это можно сделать только АССЕМБЛЕРОМ. Начало файла в ОЗУ (СТАРТ).

Это справедливо только по отношению к файлам типа КОДЫ , файл БЕЙСИКА имеет в этих байтах параметр 'ДЛИНА ПРОГРАММЫ'.

Вообще-то, этот параметр нужен только в том случае, когда Вы даете команду: LOAD "filename" CODE без указания - КУДА загружать коды, по какому адресу. Но если Вы даете полное указание, куда загрузить файл с диска, то этот параметр становится не очень то и нужным. Длина файла в байтах.

Реальная длина файла, то есть, сколько байтов он занимает в ОЗУ. Так как перекачка файла с диска происходит через специальный системный буфер TR-DOS, то эта величина указывает TR-DOS сколько, конкретно, байтов из сектора будет пересылаться по нужному адресу через буфер в ОЗУ. Количество занимаемых секторов.

Важная величина, по которой и происходит, в конечном итоге, считывание / запись файла целиком. Даже если реальная длина файла составляет 1 байт, все равно на диске он будет занимать целый сектор в 256 БАЙТ.

ОТСЮДА ВЫВОД: желательно, чтобы реальная длина файла при записи, была кратна 256 - тем самым Вы сохраните место на диске, так как сектора будут заняты полностью.

С файлами БЕЙСИКА чуть сложнее, но о них немного позже... Номер первого сектора файла.

Тут все ясно - номер сектора на дорожке, с которого начинается кодовая последовательность файла. Может принимать значения от 0 до 15 (логический номер). Номер первого трека файла.

Номер дорожки, на которой находится начальный сектор кодовой последовательности файла. Может иметь номера от 1 до 159.

Файлы записываются на диск в виде кодовой последовательности, сектор за сектором. Если на дорожке не хватает секторов, запись переходит на следующую по порядку номеров, дорожку. И так продолжается, пока вся кодовая последовательность не будет записана на диск.

После записи система обновляет, сектор номер 8 и записывает туда первый свободный трек, сектор, количество свободных оставшихся секторов.

Если Вы внимательно прочитали до этого места, то без труда увидите, что длина файла жестко регламентирована объемом в 255 секторов (#FF), т.е. 255*256=65280 БАЙТОВ.

Реально, если не пользоваться "переменными" TR-DOS, то можно соорудить файл хоть на весь диск. Естественно, создав такого монстра, Вам потребуется создать и свою программу для его считывания и записи.

Если происходит стирание файла, то, первым делом, в каталоге вместо первого символа имени файла записывается код 01.

В восьмом секторе увеличивается байт "количество стертых файлов".

Реально, после стирания, объем свободных секторов на диске не увеличивается (если, конечно, Вы не стираете самый последний файл в списке - тогда можно не беспокоиться - место освободится).

Чтобы освободить сектора от "стертого файла", необходимо перезаписать все файлы, расположенные после стертого файла, на его место, что и делает команда MOVE. После этой команды происходит перезапись всех файлов, записанных после стертого файла, обновляется информация в секторе номер 8, и у Вас появляется на диске ровно столько свободных секторов, сколько занимал Ваш файл. И расположены эти освобожденные сектора сразу после всех файлов.

В этом одно из неудобств системы TR-DOS: чтобы освободить сектора стертого файла, записанного в начале диска, Вам приходится перезаписывать всю информацию на диске, "сдвигая ее вниз".

Например, в IBM система MS-DOS отслеживает все сектора, и при стирании файлов сектора освобождаются сразу, так что один файл может быть расположен в различных секторах, на различных дорожках и необязательно в упорядоченном виде.

При загрузке такого файла (его еще называют сильно сегментированным), затрачивается немного больше времени, но система находит по всему диску именно те сектора, на которых записан загружаемый файл.

Но зато у TR-DOS преимущества: ее файлы всегда составляют единое целое и записаны всегда последовательно по возрастанию секторов и треков.

Восстановить файл после процедуры стирания легко - надо найти в секторах каталога Ваш файл с 01 вместо первой буквы и записать вместо 01 какой-нибудь удобоваримый символ, и все!

Да, еще не забудьте уменьшить байт стертых файлов в секторе номер 8 и увеличить байт "количество файлов" на диске.

Но!!! Бели Вы дали команду MOVE, можете не сомневаться - на месте вашего стертого файла будет какой-нибудь другой. И в секторах каталога Вы, скорее всего, не обнаружите даже воспоминания об имени Вашего файла.

Так что НЕ бойтесь стирать, а БОЙТЕСЬ команды: MOVE.

На рисунке 4 представлен дамп первых байтов области каталога диска. Слева представление в шестнадцатиричных кодах справа - в символах. На рисунке 5 дан дамп программы типа 'КОДЫ' в таком виде, в каком он лежит на диске в секторе. _

00h..8C6C69732E726F82 08h..43008B0001010001 10h..524F424F54524F4E 18h..420F010F01020101 20h..828F8F7420202020 26h . .4-25528552829030 1 30h..544C572E52425420 38h..42RE029202030C03 40h..748C332B2B202020 4Sh . .4366BE7R444-50F03 50h..748C332B20202020 5Bh . .4366BE7R44450408 50h . .77737475706C3020 56h . .438657E8090R090C 70h..7773747570202020 7Bh . .438657E8090R030D

L L i S . Г О 111 С

ROBOTRON Б

boot EU (U О TLU.RET Б

t L3 + + С Z DE t L3 + С Z DE listup L 0 С g w s t и p С g

Дор о m к a

0

Сек mop

0

Рис. 4 Дамп сектора-каталога диска имя ВДШЙ,тип codefiLeД0Р0ККЙ Tract. lfl

СЕКТОР Sect. 4

I 0

PI*

_________@....

mm

p

15 15

CF

Рис. 5

Давайте теперь посмотрим, как лежит на диске в секторе блок файла, написанного на БЕЙСИКЕ. Составим простую программу: 10 PRINT "ROGRAMM NO AUTO RUN"

Запишем ее на диск командой: RANDOMIZE USR 15619: REM: SAVE "PROG1"

В каком-нибудь ДИСК-ДОКТОРЕ найдем тело самой программы на диске. Найти очень просто: смотрим сначала область каталога, находим имя нашего файла, находим в заголовке номер первого сектора файла и номер дорожки. Затем Вам нужно будет только ввести эти данные в ДИСК-ДОКТОР, а он уж сам найдет данный сектор на данной дорожке.

Но вот файл на секторе найден, и что же мы видим? (см. рис. 6).

Т г а с К

25

Ба s е :

5D3B

to 5D57

00

0R

1S

00

F5

22

50

52

4-F

4-7

52

4-1

4-D

4-D

20

4-Е

OGRRMM N

4-F

20

4-1

55

54-

4-F

20

52

О RUTО R

55

4-Е

22

RR

00

00

UN "" ======== -эе- =5=5=5=5

35

35

3 1

лч

00

00

03

3D

00

3R

ER

3R

FS

22

50

= !!;!: j : X

52

4-F

4-7

3 1

22

0D

30

0D

ROGl"5. .5. .5.=

05

00

00

00

00

00

5D3B 00

Рис. 6 Дамп программы бейсика без автостарта.

С первыми четырьмя байтами понятно: это номер строки БЕЙСИКА - 2 байта и длина всей строки - 2 байта. Следом идет текст нашей строки, оканчивающийся кодом #0D. Следом идет байт #80, сигнализатор конца всей программы. (На рисунке эти байты выделены инверсией). А дальше идет какой-то довесок. Мы видим справа в символьном представлении и имя нашей программы и, вроде бы, число 15619, и многое другое.

Все правильно! Вся эта информация была необходима TR-DOS на этапе работы, когда Вы давали команду на сохранение Вашей Бейсик-программы. (Если бы Вы сохраняли коды, то такой же довесок был бы в самом последнем секторе файла <CODE>.)

Ведь это просто-напросто область ОЗУ, где набиралась Ваша командная строка, сохраненная вместе с Вашим файлом.

Вспомним, если Вы попытаетесь записать на диск всего один байт, то файл будет длиной в 1 сектор -256 байт. Вот и в нашем случае программа была не кратна длине 256 и поэтому в файл записалась область, граничащая с нашей программой, а это как раз область редактора командной строки или EDIT SPACE.

Для эксперимента можете стереть всю область после байта #80 и, записав на диск, загрузить снова, дав команду LOAD.

Файл загрузится и никаких изменений в работе не произойдет. Получается, что этот довесок сектора пропадает?! Да, пропадает, и Вы можете использовать его по своему усмотрению - записав туда какую-нибудь информацию, (свое имя, например), а можете поместить там подпрограмму, например, дешифрации.

Правда, загружать эту подпрограмму из этого довеска Вам придется специальным загрузчиком. Команды TR-DOS этого сделать не смогут!

Правда, есть еще два байта в этом "довеске" (будем называть его потерянной областью файла), которые нужны системе - это байты АВТОЗАПУСКА Бейсика.

На рисунке 7 представлен дамп сектора этой же самой программы, но записанной с Функцией LINE 10, т.е. запуск со строки 10.

Рис. 7 Дамп сектора программы бейсика с автостартом На рисунке мы видим, что в системной области файла после кодовой последовательности #0D, #80, #AA, изменился 1 байт - вместо 00 стало #0А. Это и есть сигнал операционной системе, что после загрузки файл надо сразу запустить со строки 10. (Следующий байт тоже входит в сигнализатор запуска). Можете стереть (забить 00), все байты "довеска". Программа по команде LOAD самозапускаться не будет.

Инверсией в символьной части дампа показан "хвостик" командной строки, где видно, что после имени программы идет функция LINE 10; коды #СА, #31, 30.

Все вышеизложенное справедливо и для файлов типа < DATA >, с той лишь только разницей, что вместо тела программы будет находиться содержимое массива переменной (см. рис.8)

.D Rdd Г

DRTR

0

О f

4-5 4-9 4-С 4-5

39 0Е 00 00

ER 3R FS 22

33 имиа!

Е4- 5В БЕ 0400 00 00 00 6В БЕ 05 00 05 00 00 00

4-1 5436 3 1 00 3R 54- 4-1 0D 80 00 00 00 00 6В 5Е 00 00

FILE DRT

R*i**:R56 1 9=" ■:■■ = :■■ j : X "DRTR "da t ( ) d :t

К t

!k t

Рис. 8 Дамп сектора файла типа DATA

Для полноты изложения рассмотрим файлы с последовательным и параллельным доступом, тип #. При открытии файла и его записи на диск образуется файл длиной в 16 секторов, т.е. в 1 дорожку - независимо от того, ввели Вы в запись 1 байт информации или больше.

Правда, в заголовке файла, в каталоге, указывается величина в байтах, сколько Вы туда записали, но от этого не легче дорожка на диске уже занята. Оба типа файла записываются на диск одинаково, и если Вам придёт в голову последовательный файл открыть для чтения, как произвольный и наоборот - пожалуйста, система не обидится, но разбираться, какие записи, в каком порядке считывать, в этом случае, придется Вам самому.

С точки зрения программиста, который пишет программы на Ассемблере, все эти "довески" и нюансы не столь важны. В конечном итоге, ему нужно считать / записать информацию СЕКТОРА, (секторов), файла, а все остальное - дело техники.

Есть еще один вид файла, о котором пока не упоминалось в этой книге. Это, так называемые, "МАГИК ФАЙЛЫ", т.е. файлы, сброшенные ВОЛШЕБНОЙ КНОПКОЙ.

Но, поскольку этим файлам будет посвящена целая глава, то останавливаться здесь на этой теме мы не будем. Единственное, укажем, что эти файлы имеют тип<CODE> и всегда имеют длину файла, равную объему ОЗУ с адреса 16384 до 65535. Это слепок всего ОЗУ в файле, с сохраненными значениями всех регистров процессора.

Теперь, когда у нас есть все необходимые сведения о файлах, нам необходимо подробнее рассмотреть ту область ОЗУ, которую использует TR-DOS в своей работе, а именно, область системных переменных TR-DOS.

(Продолжение следует)




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Твой сервер - О плохих пользователях BBS.
Part 16 - Past, present and future.
Кoмпьютеpные пиpaты - Окoнчaние, нaчaлo в 4 и 5 нoмеpaх.
BBS - список станций BBS ZXNet.
Grееtinx - Ебливые приветы.

В этот день...   24 апреля