ZX-Ревю 1994 №4 1993 г.

Секреты TR-DOS - В РЕВЮ-94 № 2 на странице 36 мы приводили письмо Ильи Фомина из С.Петербурга, где он рассказывал о потрековой загрузке блоков кодов. Эта информация не прошла незамеченной нашими читателями.


СЕКРЕТЫ TR-DOS

В РЕВЮ-94 № 2 на странице 36 мы приводили письмо Ильи Фомина из С.Петербурга, где он рассказывал о потрековой загрузке блоков кодов. Эта информация не прошла незамеченной нашими читателями. Михаил Попов (MCS) из Мичуринска в дополнение к опубликованным материалам сообщает, что этим методом давно пользуется небезызвестный Васильев Антон (своего рода Bill Gilbert, но на дисках). Метод действительно очень хорош, но у начинающих программистов могут возникнуть проблемы. Например, при адаптации программ для 128К объединенный блок кодов получается больше, чем 255 секторов TR-DOS не позволяет записывать файлы такой длины. В этом случае Михаил рекомендует пользоваться следующим приемом. Допустим, что Бейсик и заставка будут в итоге скомпонованы в один файл, а два кодовых блока - в другой (при этом тип файла может быть любой, отличный от В). В Листинге_1 для примера приведена возможная процедура загрузки программы.

Таким образом, если суммарная длина всех кодовых блоков превышает 255 секторов и объединить их в один файл невозможно, то можно организовать два файла, каждый из которых будет состоять из нескольких фрагментов, которые, в свою очередь, загружаются потрековым способом. Обращение к нулевой дорожке при загрузке программы произойдет только два раза. В этой процедуре загрузки примечательно еще и то, что тип второго файла может быть задан любым произвольным символом, а не только B или C.

Листинг 1.

HL,16384 DE, (23796)

B, 27

C, 5 15635 HL,NAME 15635 A, 9

(23814),A

C, 10 15635

A, C 7, A NZ C,8 15635 HL,25000 DE, (23787)

B, 10

C,5 15635 HL,40000 DE, (23796)

B,2 0

C,5 15635 25000

"FILENAMEC"

LD LD LD LD

CALL LD

CALL

LD

LD

LD

CALL

LD

BIT

RET

LD

CALL

LD

LD

LD

LD

CALL

LD

LD

LD

LD

CALL JP

DEFM

загружаем заставку, коды которой расположены сразу же за Бейсик-файлом, аналогично тому, как это было показано в РЕВЮ № 2, стр.36.

Перебрасываем имя второго файла по адресу 23113. Заносим число байт для поиска (на случай, если оно было изменено). Выполняем процедуру поиска файла в каталоге диска. Заносим номер файла в A. Проверка наличия этого файла. Если нет, то возврат. Переписываем информацию о файле из каталога диска. Адрес загрузки первого блока. B DE - его нач. сектор и трек. Длина файла (10 секторов)г

Загружаем его.

Адрес загрузки второго блока. Его длина (20 секторов).

NAME

LD

B, NN

LD

C,5

LD

DE, (23796)

LD

HL, NN

CALL

LOADER

RET

DI

LD

IX,#2F 65

CALL

LABEL1

PUSH

BC

PUSH

DE

LD

A, D

OR

A

; Загружаем его. ; Запускаем программу. ; Задано имя (8 символов) и тип "C".

По поводу потрековой загрузки новое письмо прислал Илья Фомин. Он приводит аналогичный загрузчик, который выполняет те же функции, но работа с диском осуществляется без обращения к адресу 15635, а при помощи непосредственного управления контроллером. Преимущество этого способа в том, что его нельзя остановить при помощи BREAK.

количество секторов. команда чтения.

начальные трек и сектор файла. адрес загрузки.

LOADER

LABEL2

LABEL3 LABEL4

LABEL5

LABEL6

LABEL1

Ключевым моментом в этой программе является LABEL1. Это переход в ПЗУ TR-DOS, в любую его точку. Происходит это по следующей схеме. Вначале на стек заносится требуемый адрес (в данной программе это выполняется при помощи регистра IX). Затем следует переход на адрес 15663. При обращении к этому адресу селектор адреса контроллера дисковода подключает ПЗУ TR-DOS. По указанному адресу в этом ПЗУ находится всего одна команда RET. Отрабатывая ее, программа перейдет - на адрес, записанный на стеке (который был туда предварительно занесен). По такой схеме может быть вызвана любая подпрограмма непосредственно из ПЗУ TR-DOS.

В этой связи еще одна интересная деталь. Если в ходе работы ПЗУ TR-DOS потребуется вызвать процедуру из стандартного ПЗУ (СОС), то это происходит по аналогичной схеме: на стек заносится требуемый адрес СОС, а затем следует переход на адрес 23746 - в этой ячейке системных переменных TR-DOS находится число 201 - команда RET. При переходе в ОЗУ селектор адреса контроллера дисковода отключает ПЗУ TR-DOS, а выполняя RET" -программа переходит на заданный адрес ПЗУ СОС.

Защита от MAGIC.

Кроме интересной процедуры загрузки Илья предлагает обещанную в прошлом письме информацию по защите от кнопки MAGIC (также путем прямого программирования контроллера):

XOR А

LD HL,CONTINUE

PUSH HL LD HL,#1FF3

PUSH HL JP 15663

CONTINUE ...

Илья пишет, что после запуска этой программы происходит мгновенная остановка дисковода, а при нажатии кнопки MAGIC несколько секунд вообще ничего не происходит, а затем портится нулевая дорожка, после чего ласковое сообщение "Disk Error" не упустит своего шанса появиться на экране.

Интересную информацию сообщает Алексей Лязгин из г. Мурманск. Вот что он пишет.

Непосредственное программирование ВГ93.

Прочитал в ZX-РЕВЮ № 2 письмо, в котором Фомин Илья поднимает вопрос о программировании регистра команд ВГ93. Дело в том, что есть книга Д.В. Ильинца "Программы TR-DOS 5.03", где довольно подробно рассматриваются возможности при работе с TR-DOS на различных уровнях (в том числе и на уровне программирования ВГ93). Все листинги в этой книге получены при дисассемблировании ПЗУ TR-DOS. И еще, автор отмечает, что различные версии DOS несовместимы на уровне подпрограмм, как по их местонахождению, так и по выполняемым функциям (на этот момент надо обратить особое внимание тем, кто в своих программах использует метод непосредственного обращения в любую точку ПЗУ, о чем говорилось выше - прим. МФК). В книге рассматриваются программы форматирования трека, чтения-записи трека с контролем и без контроля ошибок и т.д. Если читателей это заинтересует, я могу привести их.

RRA

LD

C,A

OR

NC,LABEL3

LD

A, #2C

JR

LABEL4

LD

A, #3C

LD

IX,#2F4D

CALL

LABEL1

POP

DE

POP

BC

PUSH

BC

PUSH

DE

LD

IX,#2F1B

CALL

LABEL1

POP

DE

INC

H

INC

E

BIT

4,E

JR

Z,LABEL 6

LD

E, 0

INC

D

POP

BC

DJNZ

LABEL2

EI

RET

POP

BC

DJNZ

LABEL5

EI

RET

PUSH

IX

JP

15663

А для начала привожу две таблицы. Первая - адреса портов TR-DOS. Причем выборка этих портов возможна только при включенной ПЗУ DOS. Также следует отметить, что при этом блокируются стандартные порты ZX-Spectrum.

Таблица _1.

_Адреса портов TR-DOS._

Адрес

#1F (31) #3F (63) #5F (95) #7F (197) #FF (255)

Назначение

Регистр команд-состояния ВГ93.

Регистр дорожки.

Регистр сектора.

Регистр данных.

Для записи: системный регистр TR-DOS бит 6 - метод записи (1-MFM, 0-FM) бит 4 - номер стороны бит 3 - сброс ВГ93 бит 2 - готовность бит 1 и 0 - номер накопителя.

Для чтения DRQ и INTRQ.

Вторая таблица - раскладка содержимого дорожки на диске после форматирования.

Таблица 2.

Содержимое дорожки.

Значение

Количество

Назначение

Байта

байтов

#4Е

10

Пятый пробел от

#00

12

начала индекса.

#F5

3

Запись C2.

#FB

1

Индексная метка.

-

-

См. примечание.

#NN

1

Номер трека.

#NN

1

Номер стороны.

#NN

1

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

#01

1

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

#F7

1

Запись CRC.

#4Е

22

Второй пробел.

#00

10

#F5

3

Запись A1.

#FB

1

Метка данных.

#00

256

Содержимое сект.

#F7

1

Запись 2 байтов CRC.

#4Е

32

Третий пробел.

Продолжение записи (аналогично для остальных 15 секторов)

#4Е

NNN

Дописывается в конец дорожки до заполнения.

Примечание к Таблице_2: Сопоставляя с параметрами для дискеты IBM-PC из указанной книги, получается, что длина этой незначащей области составляет 66 байт.

Теперь о программировании дискового контроллера на 1818ВГ93. Эта микросхема позволяет автоматически проверять правильность чтения по контрольной сумме CRC. Запись на диск осуществляется с одинарной (FM) или двойной (MFM) плотностью. Максимальная скорость Обмена информацией с дискетой - 250 (FM) или 500 (MFM) Кбод. Микросхема обеспечивает прием и выполнение 11 команд, которые условно можно разделить на четыре типа: вспомогательные команды, команды чтения-записи информации, команды поиска-чтения индексного поля, команды принудительного прерывания.

Вспомогательные команды.

1. Восстановление - обеспечивает переход головки на нулевую дорожку. Если на выходе TR00 нет подтверждения о переходе на нулевую дорожку, то после выдачи 255импульсов шага, выполнение команды прекращается.

2. Поиск - выполняет перемещение головки на дорожку, номер которой указан в регистре данных. При этом регистр дорожки должен содержать информацию о текущем номере дорожки. Поиск может выполняться только с проверкой положения головки.

3. Шаг - обеспечивает перемещение головки на один шаг в текущем направлении.

4. Вперед (назад) - обеспечивает установку направления перемещения головки.

Команды чтения-записи.

1. Чтение сектора - выполняет чтение сектора с контролем правильности чтения при помощи CRC. Регистр сектора должен содержать номер читаемого сектора.

2. Запись сектора - выполняет поиск и перезапись с указанными в регистрах параметрами. Автоматически осуществляется формирование CRC для контроля чтения информации.

Команды поиска-чтения индексного поля.

1. Чтение адреса - читаются последовательно 6 байтов индексной области, включая CRC, и передаются на шину данных. При выполнении этой команды содержимое регистра дорожки пересылается в регистр сектора.

2. Чтение дорожки - обеспечивает чтение всего массива данных, включая индексный массив, коды пробелов и контрольные коды. В процессе чтения не вырабатываются стробы чтения и не выполняется проверка по CRC. Данная команда служит для диагностических целей.

3. Запись дорожки - предназначена для разметки диска (форматирования). Во время записи любая последовательность символов будет без проверки перенесена на дорожку. Во время форматирования записываемая информация должна содержать все необходимые коды, включая пробелы и индексные маркеры. Контрольный код CRC генерируется в момент передачи кодов #F8...#FE в режиме FM или в момент появления кода #F5 для MFM. При появлении кода #F7 контрольная сумма записывается двумя байтами.

Команда принудительного прерывания.

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

Коды команд контроллера приведены в Таблице_3, опции команды прерывания - в Таблице_4.

Скорость перемещения головки при выполнении вспомогательных команд задается в двух младших битах команды. Для дисководов 5,25" соответствие между кодом и временем перемещения с дорожки на дорожку приведены в Таблице_5 (TEST - сигнал на 22 выводе микросхемы 1818ВГ93).

Таблица_3

Команда

Ь7

Ь6

Ь5

Ь4

ЬЗ

Ь2

Ь1

Ь0

Восстановление

0

0

0

0

h

V

Ч1

Ч0

Поиск

0

0

0

1

h

V

Ч1

Ч0

Шаг

0

0

1

И

h

V

Ч1

Ч0

Вперед

0

1

0

И

h

V

Ч1

Ч0

Назад

0

1

1

И

h

V

Ч1

Ч0

Чтение сектора

1

0

0

m

s

E

C

0

Запись сектора

1

0

1

m

s

E

C

a0

Чтение адреса

1

1

0

0

0

E

0

0

Чтение дорожки

1

1

1

0

0

E

0

0

Запись дорожки

1

1

1

1

0

E

0

0

Прерывание

1

1

0

1

J3

J2

J1

J0

Примечание: H - 1 - головка в рабочем, состоянии;

0 - головка поднята. V - 1 - проверка положения головки;

0 - положение не проверяется. 41.40 - скорость позиционирования (Таблица_6). И - 1 - изменение регистра состояния дорожки при перемещении;

0 - регистр не изменяется. S - 1 - верхняя сторона диска;

0 - нижняя сторона. Е - 1 - задержка 15 мс после HLD,

0 - без задержки. С - 1 - проверка номера стороны;

0 - без проверки. a0 - 1 - запись байта #F8 (данные индекса могут стираться);

0 - запись байта #FB (данные защищены). M - 1 - операции с группой секторов; 0 - с одним сектором.

Таблица_4.

J0 J1 J2 J3

Опции команды прерывания

О О 0 о 0 О О 1 О 0 О О 0 О 0 О О 0 О 0

Команда прекращается, INTRQ не вырабатывается. Прерывание после 0/1 перепада CPRDY. Прерывание после 1/0 перепада CPRDY. Прерывание по индексному маркеру.

Немедленное прекращение команды, вырабатывается сигнал INTRQ.

Таблица_5.

TEST

41

40

Время перемещения на шаг

1

0

0

6 мс

1

0

1

12 мс

1

1

0

20 мс

1

1

1

30 мс

0

-

-

400 мс

Для контроля выполнения операции и проверки текущего состояния контроллера используется слово состояния, расположенное по тому же адресу, что и регистр команд. Биты регистра состояния диска для различных команд приведены в Таблице_6.

Таблица_6.

Бит

Команды

Вспомогательные

4тение адреса

4тение сектора

4тение дорожки

Запись сектора

Запись дорожки

7

Готовность накопителя

6

Защита записи

0

0

0

Защита записи

5

Загрузка головки

0

Запись со стиранием

0

Ошибка записи

4

Ошибка поиска

Массив не найден

0

Массив не найден

0

3

Ошибка в контрольном коде

0

Ошибка CRC

0

2

Головка в исходном состоянии

Потеря данных

1

Индексный импульс

Запрос данных

0

Занято (идет выполнение команды)

Вот и все, что я хотел сообщить. Сам же я использую подпрограммы TR-DOS пока только на уровне вызова подпрограммы CALL #3D13 с номером функции в регистре C. Но в самое ближайшее время хочу поэкспериментировать с непосредственным программированием ВГ93. Посмотрим, что получится.

Комментарий ИНФОРОКОМА.

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

Теперь непосредственно по цифрам. В частности о раскладке отформатированного трека. У нас имеются несколько отличающиеся данные, которые получены при анализе форматирующей процедуры ПЗУ TR-DOS 5.03s. Прежде всего, байт индексной метки равен не #FB, a #FE, а следом за ним сразу же идут номер трека, стороны и т.д. Отличается также число нулевых байтов после второго пробела - оно равно 12, а не 10. Может отличаться также число байтов #4Е в конце сектора. В процедуре ПЗУ их задается 50, однако нам попалась одна форматирующая программа, где это число было равно 41. Видимо, число этих байтов #4Е последней группы, вплотную примыкающих к начальным байтам #4Е следующего сектора и разделяющих сектора между собой, не критично. Теоретически можно уменьшать их число до некоторого минимального значения, при котором система еще будет работоспособна, а за счет этой экономии разместить в конце дорожки дополнительно один или даже несколько секторов - именно так и делают на IBM-PC, увеличивая емкость дискеты. Однако в системе TR-DOS это не имеет смысла, так как число секторов на дорожке раз и навсегда определено системой и равно 16. Дополнительные сектора не могут быть использованы системой (но все же иногда могут быть полезными - об этом чуть ниже).

А вот ещё одна интересная деталь. Значение байта "номер стороны" всегда равно 0, а нумерация секторов на обоих сторонах диска всегда от 1 до 16. То, с какой стороной диска работать, должно быть непосредственно указано контроллеру (это задается автоматически в процессе обработки группы секторов, например при C=5 или C=6, CALL #3D13).

Имеет значение и порядок следования секторов друг за другом. При форматировании процедурой ПЗУ сектора идут в следующем порядке: 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15, 8, 16 - то есть последовательное чтение всех 16 секторов дорожки происходит за два оборота диска. Практика показала, что компьютер успевает обрабатывать данные и в том случае, когда применяется последовательный порядок расположения секторов: 1, 2, 3, ... 15, 16. В этом состоит принцип того самого "Fast Format", выполняемого программами типа "DCU" или "ADS". Однако некоторые программы не успевают обрабатывать поступающие при "Fast Format" данные. К тому моменту, когда программой приняты и обработаны данные 1 -го сектора и приходит команда приема данных 2-го сектора, диск уже повернулся и начало этого 2-го сектора уже пропущено. Теперь придется ждать, пока диск сделает почти полный оборот, прежде чем начнется чтение 2-го сектора. И так все 16 секторов. Это в 16 раз замедляет чтение, так что практически работа такой программы становится немыслимо медленной и теряет смысл. Например, нет смысла пользоваться программой MOA-SERVICE (в общем-то неплохой) для копирования файлов с "быстрых" дискет.

Но это, так сказать, уже "пройденный этап". А вот еще один момент, насколько нам известно, до сих пор не воплощенный в жизнь на "Спектруме". Дело в том, что при чтении информации с диска, в тот момент, когда происходит шаг головки на следующую дорожку, происходит пауза в считывании, за это время диск успевает повернуться примерно на три сектора, так что до начала считывания следующих 32 секторов (с обоих сторон) приходится опять ждать почти целый оборот диска. Вот если бы сделать такую форматирующую программу, которая смещала бы на каждой следующей дорожке порядок следования секторов на три сектора, тогда можно было бы ещё выше поднять скорость считывания и записи. Например, на треках 0 и 1 -обычный порядок следования секторов: 1 2 3 4 ... 11 12 13 14 15 16

а на треках 2 и 3 - такой: 4 5 6 7 ... 14 15 16 1 2 3

И так далее. Конечно, величина смещения требует практической проверки для получения максимального выигрыша. Здесь мы вовсе не претендуем на авторство этого способа "дополнительного ускорения". Именно такой способ оптимизации расположения секторов на IBM-овской дискете использует в своей программе "FFORMAT" её автор, Шамароков Алексей, Москва.

Защита от копирования.

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

Байты, обозначающие номер сектора, могут быть не обязательно от 1 до 16. Например, на нулевой дорожке можно при форматировании оригинальной программой изменить номер, скажем, одного (или нескольких) не используемых системой TR-DOS секторов - с 10 по 16 и присвоить ему вообще произвольный номер, скажем, 100. При нормальной работе с такой дискетой Вы ничего не заметите, а при выполнении операции "Check Disk" программами типа "DCU" или "ADS", Вы заметите, что один сектор (или несколько секторов) нулевой дорожки "не читается". При попытке скопировать такой диск копировщиком типа "Диск в диск", Вы увидите обычное: "Retry, Abort, Ignore", а если выберете "Ignore", то программы на скопированном диске работать все равно не будут. Дело в том, что в этих программах есть фрагмент, выполняющий контрольное считывание информации с сектора, имеющего номер 100. Где-то в этом секторе записан пароль, кодовое слово или иная информация, являющаяся ключевой для работы программы, либо отсюда загружается целиком недостающий блок кодов. Процедура чтения такого сектора с нестандартным номером ничем не отличается от традиционной:

LD

HL,BUFF

- адрес в памяти

LD

D,0

- номер дорожки.

LD

Е, 100

- номер сектора.

LD

с,5

- команда чтения

LD

В, 1

- число секторов

CALL

#3D13

Для защиты от копирования может использоваться также свободное место в конце дорожки. Это делается примерно по следующей схеме. Выполняется нестандартное форматирование, при котором на недоиспользованном месте в конце дорожки организуется дополнительный сектор (длина его может быть равна, скажем, 128 байт, а номер обозначен любым числом, например, #AD). Использование записанной в него информации или даже просто контрольное считывание сектора с этим номером является ключом к запуску защищаемой программы.

Царев А.В. из Нижнего Новгорода уточняет, что при вызове подпрограммы #3D13 со значением C=21 (#15) -выполняется проверка дорожки. Регистр D при этом должен содержать номер проверяемого физического трека. Команда при C=24 (#18) - настройка на диск - проверяется тип диска (информация в 8-м секторе нулевой дорожки).

И в заключение, несколько слов о версиях ПЗУ из письма Вячеслава Толстого из Петрозаводска. Он сообщает, что версия ПЗУ TR-DOS 5.03T дает следующие дополнительные возможности по сравнению с TR-DOS 5.03:

■ ускоренное тестирование и выход в ДОС после тестирования;

■ выбор режима форматирования: стандартный или "турбо";

■ индикация позиционирования головок при форматировании.

* * *




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Системки - история операционной системы CP/M для Спектрума: ограничения (часть 2).
Новости - XTR-modem новая разработка от X-Trade.
NEW WAREZ - RecTime: Почему ни у кого еще не появились второй номер Element'а и адвентюрная игра "MonstrLand"?
Coder FX - реализация эффекта Moving Shit.
ENLIGHT RULEZ?! - ENLIGHT 1997 - к чему он прирулит? (день шестой).

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