ZX-Ревю 1995 №3 1994 г.

Секреты TR-DOS - track keeper, о сохранении системного трека.


СЕКРЕТЫ TR-DOS

TRACK KEEPER

(С) Вадим Бодров, г.Уфа,1995.

В ZX-PEBI0-94, N6, в разделе ФОРУМ на стр.53 Мажников Д.В. поделился с нами своими проблемами

в работе с TR-DOS: "Есть ли способ восстановить диски с ошибкой в 9-м секторе 0-й дорожки?".

Для этого существует единственный и надежный способ, заключающийся в резервном сохранении системной дорожки. Эту нехитрую операцию позволяют делать многие программы, специально предназначенные для этой цели, а также и другие, имеющие такую функцию, например, ZX Tools Deluxe", написанная мной и распространяемая ИНФОРКОМом.

Большинство, но не каждый пользователь Speccy имеет подобную программу у себя под рукой. Этот факт показался мне очень досадным. Так что я постараюсь дать экспресс-решение этой проблемы при помощи конкретной программы, назовем ее TRACK KEEPER. Вот ее текст:

1 DATA 33,64,156,17,0,0,6,16, 14,5,205,19,61,201

2 CLEAR 38999: PLOT 0,16: DRA W 255,0: PLOT 0,136: DRAW 255,0:

FOR i-39000 TO 39013: READ a: P ОКЕ i,a: NEXT i

3 PRINT TAB 10; FLASH 1;"TRAC К KEEPER": PRINT '"WRITTEN BY VA DIM BODROV 2.04.95": PRINT TAB 4;"SPECIAL FOR 'ZX-REVIEW'"

4 PRINT ""0- VIEW CATALOGUE OF DISK"1f"1- SAVE SYSTEM TRACK TO RESCUE DISK" ""2- RESTORE

SYSTEM TRACK FROM'"" RESCUE D ISK"""3- COPY SYSTEM TRACK TO L AST" 1 " TRACK OF THIS DISK"" "4 - RESTORE SYSTEM TRACK FROM'"" LAST TRACK OF THIS DISK"

5 PRINT #1;TAB 4;"PRESS KEY 0 -4 PLEASE..."

6 LET a$sINKEY$: IF a$<"0" OR a$>"4" THEN GO TO 6

7 GO SUB 36

8 IF a$<>"0" THEN GO TO 11

9 RANDOMIZE USR 15619: REM :

CAT

10 PAUSE 0: RUN

11 IF a$o"l" THEN GO TO 19

12 PRINT #1;"INSERT DISK TO RE

AD SYSTEM"'"TRACK AND PRESS KEY. и

13 PAUSE 0: GO SUB 36: RANDOMI ZE USR 39000

14 PRINT #1;"INSERT RESCUE DIS К TO SAVE" "'SYSTEM TRACK TO FILE "'"AND PRESS ANY KEY..."

15 PAUSE 0: GO SUB 36

16 LET n$="": FOR i=42293 TO 4 2300: LET n$=n$+CHR$ PEEK i: NEX T i

17 LET a=USR 15619: REM : SAVE n$CODE 40000,4096

18 GO SUB 37: RUN

СЕКРЕТЫ

19 IF a$<>"2" THEN GO TO 28

20 INPUT "INPUT DISKNAME? ";n$ : IF n$="" THEN RUN

21 PRINT #1;"INSERT RESCUE DIS К TO READ"'"SYSTEM TRACK FROM FI LE"'"AND PRESS ANY KEY..."

22 PAUSE 0: GO SUB 36

23 LET a=USR 15619: REM : LOAD n$C0DE 40000,4096

24 GO SUB 37

25 IF a<>0 THEN RUN

26 PRINT #1;"INSERT DISK TO RE STORE SYSTEM"'"TRACK AND PRESS A NY KEY..."

27 PAUSE 0: GO SUB 36: POKE 39 009,6: RANDOMIZE USR 39000: RUN

28 IF a$<>"3" THEN GO TO 33

29 PRINT #1;"INSERT DISK TO CO PY SYSTEM"'"TRACK TO LAST TRACK OF THIS DISK"'"AND PRESS ANY KEY ..."

30 PAUSE 0: GO SUB 36

31 RANDOMIZE USR Э9000: IF PEE К 42273+16*PEEK 42274>2544 THEN

GO TO 48

32 POKE 39005,159: POKE 39009, 6: RANDOMIZE USR 39000: RUN

33 PRINT #1;"INSERT DISK TO RE STORE SYSTEM"'"TRACK FROM LAST T RACK"'"AND PRESS ANY KEY...и: PA USE 0: GO SUB 36

34 POKE 39005,159: RANDOMIZE U SR 39000: POKE 39005,0: POKE 390 09,6: RANDOMIZE USR 39000: RUN

35 RUN

36 BEEP .01,10: RANDOMIZE USR 3438: RETURN

37 IF a«0 THEN RETURN

38 IF a>l THEN GO TO 40

39 PRINT #1;"FILE IS NOT FOUND !": PAUSE 0: GO SUB 56: RETURN

40 IF A>2 THEN GO TO 48

41 PRINT #1;"FILE ALREADY EXIS TS!"'"OVERWRITE (Y/N)?"

42 LET a$sINKEY$: IF a$="" THE N GO TO 42

43 GO SUB 36: IF a$="n" OR a$« "N" THEN RETURN

44 IF a$o"y" AND a$o"Y" THEN

GO TO 41

45 RANDOMIZE USR 15619: REM : ERASE n$CODE

46 RANDOMIZE USR 15619: REM : SAVE n$CODE 40000,4096

47 RETURN

48 PRINT #l;"NO SPACE ON DISK! ": PAUSE 0: GO SUB 36: RETURN

TR-DOS

Программа получилась довольно громоздкой, так как я решил ввести в нее немного сервиса.

Работать с TRACK KEEPER очень просто. Клавиши "Iй и "2" позволяют сохранять системный трек на отдельной, "спасительном" диске (или "спасательной", если Вам так больше нравится - RESCUE DISK) в виде файлов. Клавиши "3м и "4" делают почти то же саное, но системный трек сохраняется на своей "родной" диске, на последней его дорожке, которая, как правило, всегда свободна (если, конечно, диск не "забит под завязку"). Ёс-ли же на диске иенее 16 свободных секторов, то запись произведена не будет (эту проверку выполняет строка 31).

О сохранении системного трека

(С) Андрей Алексеев, 1995.

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

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

Так как операции с системный треком - операции очень ответственные, то рекоиендуется дополнить программу строками, выполняющими верификацию при сохранении и восстановлении. И, если при записи каталога в виде файла на RESCUE DISK, верификацию можно выполнить на уровне Бейсика, то при сохранении/восстановлении с использованием последнего трека, можно дополнить программу машин-нокодовой процедурой сравнения двух иассивов кодов: считанных с нулевого и последнего треков.

Другая опасность, которая может подстерегать Вас, это попытка "восстановить" системный трек с последнего трека этого диска, если он предварительно не был сохранен. В этой случае Вы навсегда утратите даже "остатки" запорченного каталога, который, возиожно, еще можно было спасти, хотя бы вручную (DISK-DOCTOR1 ом).

СЕКРЕТЫ

Поэтому можно порекомендовать ввести в программу такую проверку. Ее можно сделать очень просто, используя ключевые байты 9-го служебного сектора, наприиер, тип дискеты (байт #ЕЗ), идентификационный код TR-DOS - #10 (байт #Е7), неиспользуеиая область, заполненная кодой #20 (9 байтов, начиная с #ЕА), и т.д. Если группа этих байтов присутствует йа последнем треке, значит с большой долей вероятности иожно утверждать, что это - сохраненный системный трек. Если нет - операция восстановления блокируется.

Возиожно использование любого другого алгоритиа "распознавания" систеиного трека. Неплохо было бы даже ввести режии полного просмотра каталога, сохраненного на последнем треке или в файле на RESCUE DISK. Это удобно, ведь Вы не всегда поините, когда и при каких обстоятельствах последний раз сохраняли системный трек. Имея такую возможность, всегда можно будет предварительно прикинуть, что получится после восстановления. Просиотр каталога иожно выполнить хотя бы простейшии способом, аналогично тому, как это делается в программе DIR (см. ZX-PEBI0-93, N1-2, стр.26).

И коль уж разговор идет о программе для восстановления, то еще один немаловажный момент. Дело в том, что, как правило, при порче систеиного трека портится и его формат. Для восстановления фориата приходится пользоваться операцией RESTORE програнн DCU или ADS, что очень неудобно. Гораздо приятнее было бы, если бы программа TRACK KEEPER сама перед восстановлениеи выполняла форна-тирование систеиного трека.

Вот тут мы касаемся новой темы, еще не освещенной на страницах РЕВЮ, поскольку этот режим недоступен для наиболее "употребимой" точки входа #3D13 ПЗУ TR-DOS. Форматирование можно выполнить, воспользовавшись подпрограммой форматирования из ПЗУ. Для этого придется использовать точку входа #3D2F (15663).

TR-DOS

Ниже приводится новый кодовый блок, который можно использовать в программе TRACK KEEPER. Он состоит из двух частей: первая, обозначенная меткой READ (она полностью соответствует авторской) предназначена для чтения или записи каталога в виде блока секторов. Вторая часть, отмеченная меткой FORMAT (ее адрес - 39014), предназначена для форматирования одного логического трека, номер которого (0...160) задан в ячейке TRK (она имеет адрес 39057).

подпрограмма READ должна быть хорошо знакома читателям» а вот на подпрограмме FORMAT стоит остановиться подробнее. Сначала надо вспомнить о "правилах пользования" точкой входа #3D2F в ПЗУ TR-D0S - там находятся команды NOP и RET. Для того, чтобы по-пасть в любую точку ПЗУ TR-DOS, необходимо на стек занести интересующий адрес в этом ПЗУ, а затем командой JP #3D2F активизировать контроллер, переключить ПЗУ и перейти на заданный адрес. После отработки подпрограммы в ПЗУ TR-DOS, последует команда RET, так что еще раньше на стек должен быть занесен адрес продолжения программы в ОЗУ - это происходит при вызове подпрограммы CALL DOS. Весь этот механизм реализован в строках 200-210 (для точки входа #2А53 ПЗУ TR-DOS), 250-260 (для точки #2005) и 280-300 (подпрограммы DOS) .

По адресу #2А53 находится подпрограмма, состоящая всего из двух команд:

OUT (С),А

RET

в строках 170-210 включается двигатель дисковода.

СЕКРЕТЫ

Подпрограмма по адресу #2005 выполняет форматирование трека со следующими входными данными: в HL - начало таблицы расположения секторов (метка TABL); в регистре Е задается физический (0...80) номер форматируемого трека. Кроме того, перед запуском этой подпрограммы головка дисковода должна уже находиться на заданном логическом треке - позиционирование происходит в строках 140-160.

(С) ALANSOFT, 1995.

TR-DOS 5.03

READ

TRK TABL

ORG

39000

ENT

LD

HL,40000

LD

DE,0

LD

B,16

LD

C,5

CALL

#3D13

RET

ENT

XOR

A

LD

(#5CD6),A

LD

A,(TRK)

LD

C,2

CALL

#3D13

DI

LD

C,#1F

LD

A,#F4

LD

HL,#2A53

CALL

DOS

LD

A,(TRK)

LD

E,A

SRL

E

LD

HL,#2005

CALL

DOS

RET

PUSH

HL

LD

HL,TABL

JP

#3D2F

DEFB

160

DEFB

1, 2, 3,

DEFB

5, 6, 7,

DEFB

9,10,11,1

DEFB

13,14,15,3

Start of object: #9858 (39000) Length : #004A (00074)

Executes : #9866 (39014)

Несколько "странное" впечатление может произвести конструкция в строках 260-270. Ведь CALL DOS и RET проще заменить одной командой OR DOS, а, следовательно, в конкретном случае выкинуть совсем. Однако это не так. Строки 260-270 обеспечивают корректное завершение работы ПЗУ TR-DOS (отключение его) и возврат в Бейсик.

00010 00020 00030 00040 00050 00060 00070 00080 00090 00100 00110 00120 00130 00140 00150 00160 00170 00180 00190 00200 00210 00220 00230 00240 00250 00260 00270 00280 00290 00300 00310 00320 00330 00340 00350

DOS

Т R - D О

Перед началои форматирования обнуляется содержииое ячейки #5CD6, которая используется при проверке качества форматирования дорожки. Каждый непрочитанный после фориатирования сектор увеличивает содержииое ячейки на единицу. Вы можете самостоятельно ввести в программу строки, которые по ненулевоиу значению ячейки #5CD6 (23766) будут выводить сообщение о том, что данный трек диска не форматируется и дальнейшая работа с этим дискои невозможна .

Таблица расположения секторов TABL соответствует варианту "быстрый формат". Вы по желанию можете изменить ее для "стандартного формата":

00320 TABL DEFB 1, 9, 2,10

00330 DEFB 3,11, 4,12

00340 DEFB 5,13, 6,14

00350 DEFB 7,15, 8,16

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

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

Рекомендуемые изменения в Бейсик -программе TRACK KEEPER (при записи необходимо задать автостарт со 2-й строки):

1 PLOT 0,16: DRAW 255,0: PLOT 0,136: DRAW 255,0: GO TO 3

2 CLEAR 38999: FOR 1=39000 TO 39073: READ a: POKE i,a: NEXT i

: RUN

4 PRINT ,M,0- VIEW CATALOGUE OF DISK"'•"1- SAVE SYSTEM TRACK TO RESCUE DISK"''"2- RESTORE SYSTEM TRACK FROM"1" RESCUE D ISK",,M3- COPY SYSTEM TRACK TO 1 60"'" TRACK OF THIS DISK"" "4-

RESTORE SYSTEM TRACK FROM"»" 160 TRACK OF THIS DISK"

14 LET n$«"": FOR is42293 TO 4 2300: LET n$=n$+CHR$ PEEK i: NEX T i

15 PRINT #1;"INSERT RESCUE DIS К TO SAVE"'"SYSTEM TRACK TO FILE :"""; INVERSE l;n$; INVERSE 0;"" ""'"AND PRESS ANY KEY..."

16 PAUSE 0: GO SUB 36

17 PRINT #0''AT 0,0;"DISKNAME: """; INVERSE l;n$; INVERSE 0;""

"": LET a=USR 15619: REM : SAVE n$CODE 40000,4096

21 PRINT #1;"INSERT RESCUE DIS К TO READ"•"SYSTEM TRACK FROM FI LE:"; INVERSE l;n$; INVERSE 0•"A ND PRESS ANY KEY..."

27 PAUSE 0: GO SUB 36: POKE 39 057,0: RANDOMIZE USR 39014: POKE 39009,6: RANDOMIZE USR 39000: R UN

29 PRINT #1;"INSERT DISK TO CO PY SYSTEM"'"TRACK TO 160 TRACK О F THIS DISK"'"AND PRESS ANY KEY.

31 RANDOMIZE USR 39000: POKE 3 9057,160: RANDOMIZE USR 39014

32 POKE 39005,160: POKE 39009, 6: RANDOMIZE USR 39000: RUN

33 PRINT #1;"INSERT DISK TO RE STORE SYSTEM"'"TRACK FROM 160 TR ACK OF THIS DISK"'"AND PRESS ANY

KEY...": PAUSE 0: GO SUB 36

СЕКРЕТЫ TR-DOS

34 POKE 39005,160: POKE 39009, 5: RANDOMIZE USR 39000: POKE 390 57,0: RANDOMIZE USR 39014: POKE 39005,0: POKE 39009,6: RANDOMIZE USR 39000: RUN

100 DATA

033,064,156,017,000,000,006,016, 014,005,205,019,061,201,175,050, 214,092,058,145,152,014,002,205, 019,061,243,014,031,062,244,033 110 DATA

СЕКРЕТЫ

083,042,205,138,152,058,145,152, 095,203,059,033,005,032,205,138, 152,201,229,033,146,152,195,047, 061,160,001,002,003,004,005,006 120 DATA

007,008,009,010,011,012,013,014, 015,016

TR-DOS




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Графика - ANSI графика.
Новости - новости от Ковровских спектрумистов.
Путеводитель - игра Lords of Midnights (Повелители Полуночи)
Что? Где? Почем - ZX-FORMAT #8, IS-DOS, ЗЕPКАЛО.
Введение - первая Чайковская газета для Спектрума!

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