СЕКРЕТЫ 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
Программа получилась довольно громоздкой, так как я решил ввести в нее немного сервиса.
Работать с 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).
Ниже приводится новый кодовый блок, который можно использовать в программе 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
Перед началои форматирования обнуляется содержииое ячейки #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
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