Передовица » Макулатура » ИиО » Спасение файлов на Агате

Спасение файлов на Агате (N4/1990)

П. Ходаков. Разыскивается! Если вы автор или что-то знаете о нём, свяжитесь с нами! (ЗАЧЕМ ЭТО?)

Все работающие на "Агате" рано или поздно (обычно рано) сталкиваются с ошибкой I/O ERROR, являющейся бичом всех пользователей "Агата". Не было бы ничего страшного, если бы эта "фатальная" ошибка поражала только те файлы, у которых есть дубликат. Ну а если...?

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

Чтобы пользоваться приведёнными здесь рекомендациями, нужно:

  • иметь машину "Агат";
  • желательно две;
  • желательно ещё больше;
  • иметь программу "Агат-отладчик";
  • уметь работать с ней в режимах К и I;
  • иметь понятие о структуре (треках и секторах) диска;
  • знать шестнадцатеричную систему счисления;
  • иметь "штатную" (поставляемую с "Агатом") систему.

1. Что делать, если файл не читается? Прежде всего попробуйте прочитать его на той машине, где он был записан. В 50% случаев это даёт положительный эффект. Если такой возможности нет, всё равно попробуйте прочитать его на других машинах. Если это не помогло, придётся прибегнуть к "терапии".

"Жёсткая терапия" дозволительна в случае, когда не жалко ни дисковод, ни дискету, а жалко только свой файл (т.е. самого себя). Она заключается в так называемой подкачке дисковода: в момент потрескивания дисковода вы берётесь рукой за крышку, немного приоткрываете её и закрываете, снова приоткрываете и закрываете - и так до тех пор, пока не прочитаете файл или снова не получите I/O ERROR. Иногда помогает просто сильное надавливание на крышку. Успех "жёсткой терапии" в основном зависит от опыта "терапевта".

Для использования "мягкой терапии" прежде всего нужно установить характер ошибки.

Случай 1. При попытке чтения каталога на экран ничего не выдаётся, а сразу после потрескивания появляется I/O ERROR. Диагноз ясен, болезнь излечима в 90% случаев, но, увы, с побочными эффектами. Дефект притаился в секторе 0 трека 11. На нем находится основная информация о диске, использующаяся всеми командами ДОСа.

Лечение производится с помощью системной программы "Агат-отладчик" в режиме трек-секторного редактора. Необходимо взять "здоровый" диск (каталог которого читается) и считать с него сектор 0 трека 11. Затем вытащить этот диск, вставить "больной" и записать на него то, что вы считали со "здорового". Если запись прошла успешно, можете прыгать от счастья: всё, что было на вашем диске, будет читаться. Но будущее не совсем безоблачно: на этот диск нельзя больше писать. Запись будет проходить нормально, но в один прекрасный момент вы можете лишиться своих спасённых файлов. Чтобы этого не случилось, скопируйте все нужные вам файлы на другой диск, затем отформатируйте спасённый и после этого перепишите файлы обратно.

Если запись на сектор 0 трека 11 не прошла, можно попробовать скопировать весь диск целиком на другой и уже на дубликате произвести указанное выше вмешательство.

Случай 2. После команды CATALOG появилась надпись DISK VOLUME..., а возможно, и часть каталога (в которой вашего файла нет), и уже потом I/O ERROR. Время покажет, можно ли восстановить ваш файл. Диагноз же таков: запорчен один из блоков каталога, который располагается всё на том же треке 11, начиная с сектора F (имеется ввиду порядок вывода на экран) и далее E, D, C, B, A, 9, 8, 7, 6, 5, 4, 3, 2, 1. Какой-то из них не читается.

Опять прибегнем к трек-секторному редактору. Будем поочерёдно прочитывать все сектора каталога и в конце концов найдём повреждённый.

Теперь займёмся собственно "реанимацией". Вернёмся на один сектор назад, к началу каталога, т.е. передвинемся с плохого сектора на хороший. Не забудьте, что за начало считается не 0, a F! Поставим курсор так, чтобы "позиция в секторе" была 1. Там будет число 11. Передвинем курсор в позицию 2. Там будет число, обозначающее номер следующего (в нашем случае нечитаемого) сектора. Изменим это число на номер первого хорошего сектора, следующего за плохим (тем самым мы велим машине обойти плохой сектор). Затем записываем только что изменённый сектор на диск. Если на 11-м треке оказалось несколько плохих секторов, то поступаем с ними аналогично.

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

Особый случай - если на экран выводится только DISK VOLUME... и I/O ERROR. Значит, запортился начальный сектор каталога - F. Обходим его точно так же, только ставим номер следующего после F читаемого сектора в позицию 2 сектора 0 трека 11.

Случай 3. Каталог читается, ваш файл в нём присутствует. Но на команду чтения файла ответ- I/O ERROR. Следовательно, запортился один из блоков, на которых записан ваш файл. К сожалению, спасти его в первозданном виде не удастся, но большую часть файла, пожертвовав несколькими блоками, можно сохранить. Просмотрите в трек-секторном редакторе сектора каталога и найдите имя вашего вожделенного нечитаемого файла. В каждом секторе каталога умещается запись о семи файлах. Запомните, каким по очереди (сверху) стоит это имя, а затем поставьте курсор в соответствие с таблицей.

   Позиция         "Позиция
 имени файла	   в секторе" 

      1	               B
      2	              2E
      3	              51
      4	              74
      5	              97
      6	              BA
      7	

Запомните число, на котором находится курсор, а также число, стоящее правее. Первое - номер трека, второе - номер сектора "трек-секторного" списка, в котором хранится вся информация о местонахождении вашего файла на диске. Прочитав этот блок, вы увидите список блоков файла. Если длина файла больше 122 блоков, то у "трек-секторного" списка есть продолжение. Номера трека и сектора продолжения вы найдёте в позициях 1 и 2 соответственно.

Если вы не сможете прочитать этот блок - что ж, есть ещё "жёсткая терапия". В нормальной же ситуации поставьте курсор в позицию С. Спишите или запомните по парам все числа. Как вы уже догадались, первое - номер трека, второе - сектора каждого блока вашего файла. Вам предстоит большая работа. Просмотрев все блоки, найдите нечитаемые. Их может быть несколько. Запомните их, а затем возвратитесь в "трек-секторный" список. В нём, начиная с позиции C, найдите пару чисел, показывающих трек и сектор плохого блока. Замените их. На что? Да на трек и сектор блока, который стоит рядом - пусть считается два раза, а уже потом вы легко сможете удалить лишнее. Не забудьте записать изменённый список. Теперь осталось только загрузить ваш файл, удалить лишнее, добавить недостающее.

Теперь разберём ситуации, когда файл не удаётся записать. Проще всего тогда сменить диск. А если другого нет? Работать в этом случае придётся на двух машинах. Пока у одной в памяти находится ваш файл, на другой готовится диск.

Средство 1. Загрузить "Агат-отладчик" и в режиме копирования дисков скопировать диск сам на себя. Тут надо быть осторожным. Иногда некоторые треки читаются, а затем не пишутся - плохой дисковод. Да ещё впоследствии этот диск не форматируется. Но даже если перезапись прошла успешно, программы на Бейсике могут неузнаваемо искажаться. С текстовыми и бинарными файлами такого замечено не было, но надёжнее пользоваться другими средствами.

Средство 2. В трек-секторном редакторе читаете сектор 0 трека 11. Ставите курсор в 30-ю позицию. Число, на котором стоит курсор, - номер трека выделения: начиная с этого трека будет при записи выделяться место для хранения вашего файла. А раз ваш файл не пишется, то где-то на этом треке есть плохой блок, через который нужно "перепрыгнуть". Для этого поставьте в позицию 30 другой номер трека, например, на 1 больше, и запишите изменённый сектор. После этого можно снова попробовать записывать на этот диск.

Средство 3. Его хорошо использовать вместе со средством номер 2. Суть состоит в запрещении использования сбойного трека. С помощью режима копирования в "Агате-отладчике" (когда машина только читает диск) определите, какие треки плохие, и запишите их. Прочтите сектор 0 трека 11. Назначение этого блока - показывать, что на диске занято, а что свободно. В нём каждому треку отведено четыре числа. Два из них ничего не значат (в них всегда 0), а в двух других закодирована некая информация. Для запрещения записи на плохой трек достаточно поставить в эти две позиции нули. Выполнив это, не забудьте записать изменённый сектор. Теперь при записи машина будет обходить плохие треки. Определить, в какую позицию заносить нули, поможет вам таблица.

    Номер             Позиция
   плохого         для занесения
    трека	       нулей

      0	               38-39
      1	               3C-3D
      2	               40-41
      3	               44-45
      4	               48-49
      5	               4С-4D
      6	               50-51
      7	               54-55
      8	               58-59
      9	               5С-5D
      А	               60-61
      В	               64-65
      С	               68-69
      D	               6С-6D
      Е	               70-71
      F	               74-75
      10	       78-79
      11 	       7С-7D
      12	       80-81
      13	       84-85
      14	       88-89
      15	       8С-8D
      16	       90-91
      17	       94-95
      18	       98-99
      19	       9С-9D
      1А	       А0-А1
      1В	       А4-А5
      1С	       А8-А9
      1D	       AC-AD
      1Е	       В0-В1
      1F	       В4-В5
      20	       В8-В9
      21	       ВС-BD
      22	       С0-С1

Последняя тема статьи - нештатные ситуации при создании программ на Бейсике. Общеизвестно, что "Агат" - машина загадочная и капризная. Не нужно долго работать на ней, чтобы попасть в ситуацию, когда программа почему-то не записывается. Для этого случая несколько советов.

Совет 1. Никогда не создавайте программы в SUPER DOS, поскольку это очень капризная система.

Совет 2. Если на команду CATALOG, а также на все остальные команды ДОСа система выдаёт SYNTAX ERROR, попробуйте набрать: CALL ¤ 9DBF "ВВОД". Снова наберите CATALOG. Если дисковод заработал, смело записывайте программу, но не нажимайте СБР-УПР: снова произойдёт сбой.

Совет 3. Нередки случаи, когда между номерами строк забивается какой-то номер и никакими командами стирания (DEL) его не удаётся уничтожить. В Бейсике для таких ситуаций есть специальная функция FRE(X) (набирается ?FRE(0)), но она малоэффективна. Если она вам не поможет, попробуйте превратить бейсиковый файл в текстовый. Это делается при помощи небольшой программки, которая располагается так, чтобы не забивать вашу основную программу. Пример: пусть ваша программа занимает номера с 1 по 40000. Добавляете к ней такие строки:

60000 INPUT "ВВЕДИТЕ ИМЯ ФАЙЛА":N¤
60010 ?:?CHR¤(4): "OPEN": N¤
60020 ?CHR¤(4): "WRITE": N¤
60030 LIST 1. 40000
60040 ?CHR¤(4): "CLOSE": N¤
60050 END

Ha RUN 60000 машина запрашивает имя файла. После ввода имени диск закрутится, и после окончания его работы в каталоге вы найдёте текстовый файл с введённым вами именем. Это текстовый вариант основной программы. С помощью "Школьницы" или "Агат-ассемблера" считайте этот файл и в редакторе удалите строптивый номер. Записав файл на место, загрузите Бейсик и дайте команду EXEC "имя файла", а затем LIST. Перед вами программа без противного номера.

Вот и всё. В заключение - пара полезных истин.

Истина 1. На каждом диске 35=0-¤22 трека, а в каждом треке 16=0-F секторов.

Истина 2. То, что написано в данной статье, конечно же, неполно. Существует ещё много способов восстановления файлов, но, чтобы ими пользоваться, необходимо иметь специальную подготовку.

Эта статья - ответ на вопрос "что делать, если файл не читается ?". Тут описываются как операции вроде "прижмите крышку дисковода", так и более глубокие, по восстановлению служебных областей диска. Речь идёт о дисководах 140 кб. Также в статье даётся несколько советов по Агату, однако совет 3 мне кажется хотя и правильным (в смысле результата), но: 1) Оператор fre() выполняет очистку мусора в динамической памяти, а вовсе не управляет текстом программы. Странно, откуда у автора взялась эта ошибка ? 2) Для удаления строк-призраков часто помогал более простой способ: команда del, в качестве аргументов которой указывались предшествующая призраку и последующая за ним строки. Можно было вывести их предварительно на экран и после выполнения команды заного ввести в память, пробежав курсором. Желательно также было после del и до возврата строк выполнить последовательность: save/fp/load.

Строка-призрак - один из видов сбоя агатовского бейсика, проявлявшаяся в том, что при выводе листинга появлялась пустая строка (т.е. только номер), причем стоящий не по порядку:

5000 PRINT "TEST"
10923
5010 RETURN

Строка 10923 в этом примере и есть призрак. Его нельзя было удалить обычным вводом номера и даже команда del 10923,10923 не помогала удалить такую строку. Но команда del 5000,5010 могла решить проблему. Автор статьи же предлагает более сложный и долгий метод: перенаправив STDOUT в файл выполнить команду LIST, таким образом получив в текстовом файле листинг программы. Вернуть его после редакторования во внутреннее представление и формат Бейсика можно было командой EXEC - это перенаправление STDIN из файла, но не закрывающее поток даже при появлении приглашения операционной системы и, следовательно, его можно было выполнить в непосредственном режиме. Этот способ, однако, был плох тем, что любое редактирование разрушенной программы чревато зависанием ОС или ещё большим разрушением текста программы.

* * *

Использование материалов проекта agatcomp без получения предварительного письменного разрешения agatcomp запрещено.


Почта для обратной связи: mail@agatcomp.ru


Живое общение по теме Агата: Telegram группа Agatcomp.


Накопленные знания и проекты: тематический ФОРУМ.


© 2004-2024 agatcomp.su / agatcomp.ru

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *