TR-DOS для профессионалов и любителей 1993 г.

Файлы - запись при помощи "Magic Key". Особенности форматирования.


ОБЛАСТЬ СВЯЗИ С ДИСКОВЫМ ФАЙЛОМ

Если открыт дисковый файл, дополнительно выделяется следующая область:

DEC

HEX

ЗНАЧЕНИЯ

23866

#5D3A

292 байта - область канала связи с дисковым файлом:

23866

#5D3A

2 байга - адрес процедуры записи в канал [15630 (#3D0E)]

23868

#5D3C

2 байга - адрес процедуры чтения из канала [15622 (#3D06)]

23870

#5D3E

1 байт - имя канала - "D"

23871

#5D3F

8 байт - #F4, #32, #33, #38, #24, #01, #00, #4C (поврежденная строка POKE 238??,76 (?))

23879

#5D47

3 байта - тип файла:

1B, 00, FF - последовательный, для записи; 00, 00, 00 - последовательный, для чтения; 1B, 00, 7F - с произвольным доступом

23882

#5D4A

16 байт - параметры файла из каталога (см. #5CDD: имя, тип, адрес, длина, количество секторов, местоположение на диске)

23898

#5D5A

4 байта - #3A, #EC, #36, #34 или #11, #00, #00, #00 (?)

23902

#5D5E

256 байт - буфер связи с файлом; содержит текущий фрагмент текста

24158

#5E5E

байт-разделитель [#80]

24159

#5E5F

Начало BASIC-программы, если был открыт один дисковый файл

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

10 CLEAR 28000

20 RANDOMIZE USR 15619: REM: OPEN #4,"printer",W 30 POKE 23580, PEEK 23582 : POKE 23581, PEEK 23583 40 RANDOMIZE USR 15619: REM: LOAD "mons3" CODE 40000 50 RANDOMIZE USR 40000

Естественно, на дискете должны присутствовать загружаемые коды и достаточное свободное пространство для открытия дискового файла. После запуска MONS^ введите команду "T", на вопрос "Printer?" ответьте "?", и Вы получите на дискете некоторое число 16-секторных блоков "printer #", содержащих дизассемблированный текст в ASCII формате (подчеркну, в отличие от записи в формате GENS, непригодном для распечатки). Некоторое неудобство представляет необходимость после окончания вывода выйти из программы и закрыть дискрвый файл (CLOSE #4), чтобы записался остаток информации из буфера. Однако, без этого можно обойтись, если допечатать в конце порядка 255 лишних байт.

Данный метод использует переключение потоков в поле STRMS, с канала принтера #3 ("P") на открытый канал дискового файла, в нашем примере #4. Аналогичным образом можно переключить большинство программ, осуществляющих печать через канал #3. Для графики, естественно, программа должна быть сконфигурирована под нужный тип принтера. Затем остается только скопировать полученные файлы на IBM PC (как это сделать, рассмотрим позже), где их можно объединить, с удобствами отредактировать и распечатать.

ЗАПИСЬ ПРИ ПОМОЩИ "MAGIC KEY"

При помощи кнопки MAGIC практически любая программа может быть записана на дискету в любой момент времени, и затем запущена с того же места. Неважно, как она загружалась первоначально - с магнитной ленты или дисковода. На диск записывается полностью все ОЗУ, а также содержимое регистров процессора. Естественно, что дисковое пространство при этом расходуется не самым экономным образом, хотя для многих игрушек со сложными загрузчиками или кодовыми блоками длиной более 41 KB, использование MAGIC вполне оправдано (тем более, что существуют программы для приведения MAGIC-файлов в нормальный вид).

Работа процедуры MAGIC основана на немаскируемом прерывании, которое в основном ПЗУ не используется из-за ошибки. В контроллере BETA нажатие кнопки MAGIC переключает ПЗУ на DOS и вырабатывает импульс немаскируемого прерывания. Получив сигнал NMI, процессор немедленно откладывает все остальные дела, заносит на стек адрес следующей команды (для возврата) и переходит на адрес #0066, и далее на подпрограмму обработки (см. адреса ПЗУ).

Чтобы сохранить значение регистров (AF, ВС, DE, HL, IX, IY, ВС', DE', HL', AF', I, R), их заносят в стек. Значение триггера прерывания IFF запоминается вместе с регистром I как флаг P/V. Глубина стека составляет 13 слов, а с учетом работы самой процедуры записи - 21 слово (от значения SP в момент нажатия MAGIC). Запись начинается с сохранения первых 512 байт экранной области в 2-х секторах нулевой дорожки (#0A, #0B). Затем в эту область экрана считывается системный сектор дискеты и организуется рабочая область DOS (стек). Далее определяется начало свободной области на диске и происходит запись всего ОЗУ, начиная с экрана; наличие свободного места на диске не проверяется. В каталоге записывается файл с именем "@", типом "С"; в поле адреса указывается адрес стека (значение SP). После записи (если она прошла успешно, и если был включен режим DOS), состояние программы восстанавливается так же, как при запуске MAGIC-файла. Процедура MAGIC записывает в последнюю ячейку буфера принтера 23551 (#5BFF) - #C9 (RET), а в системные ячейки сканирования клавиатуры 23552 (#5C00) и 23553 (#5C01) соответственно #16 и #10.

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

Для записи при помощи MAGIC желательно использовать чистый диск, так как в случае аппаратного сбоя или особенностей программы, диск может быть испорчен. Некоторые программы не имеют стека достаточной глубины (42 байта), и при записи стек затирает саму программу. Иногда успешная запись зависит от момента нажатия MAGIC, ведь при работе программы глубина стека меняется; так что при неудаче стоит попробовать повторно. Проверку области стека или появления байта #C9 по адресу #5BFF можно использовать специально для защиты от применения MAGIC (попробуйте, например, записать MAGICом программу DCU 2.02).

При загрузке MAGIC-файла на экране так же, как при записи, организуется рабочая область для DOS. Из каталога диска считываются параметры файла. Значение из поля адреса (байты #09,#0A) заносится в регистр SP. В зависимости от первого байта имени устанавливается тип прерываний IM1 или IM2, если имя начинается с "$" (прерывания пока запрещены). Далее из стека восстанавливаются значения регистров в порядке, обратном записи (см. выше). Упрощенно процедура восстановления выглядит следующим образом:

POP AF

LD R, A

POP AF ; вектор прерываний I и триггер прерывания

LD I, А

EX AF,AF' ; IFF (как значение флага P/V) сохраняется в AF'

POP AF ; восстановление альтернативных регистров

POP HL

POP DE

POP BC

EXX

POP IY ; восстановление основных регистров

POP IX

POP HL

POP DE

POP BC

EX AF,AF' ; восстановление флага P/V, содержащего

; значение IFF

JP PO,ADR

EI ; разрешить прерывания, если P/V=1

POP AF

RET ; переход по адресу, который был в момент NMI

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

ОСОБЕННОСТИ ФОРМАТИРОВАНИЯ TR-DOS

Форматирование, осуществляемое TR-DOS, является упрощенным вариантом описанного в приложении стандартного. Основным отличием является полное отсутствие индексного поля, т.е. дорожка начинается сразу с первого пробела (12 байт) и идентификатора 1-го сектора. Кроме того, в идентификаторе сектора не устанавливается байт стороны диска - он всегда равен #00, а сторона определяется аппаратно. Отсутствие индексного поля - основная причина, по которой диск со SPECTRUMa невозможно прочитать на других ЭВМ, например, IBM PC. Существующие на IBM программы для форматирования дискет в формате TR-DOS (например, HOFORMAT) создают индексное поле, которое никак не влияет на работу с диском на SPECTRUM, но позволяет читать и записывать их на IBM (при помощи известной программы НОВЕТА). На SPECTRUMe определить, что диск отформатирован при помощи HOFORMAT, можно по тому, что чистые сектора заполнены не нулевым байтом, а #F6.

Чередование секторов как правило стандартное (2:1), т.е. расположение секторов на дорожке 1-9-2-10-.-16, однако при помощи программы DCU можно отформатировать диск в режиме "fast", когда сектора следуют по порядку. При мультисекторных операциях это ускоряет работу с диском, но если программа обрабатывает сектора по одному, может существенно её замедлить.

Особенности форматирования могут использоваться для создания защищенных от копирования дискет. Например, DISTRIBUTOR переформатирует 159-ю дорожку, создавая в начале сектор под номером #06 длиной 128 байт и с номером головки равным 1; затем остальные сектора без чередования (1,2,3.), для 16-го сектора также задан номер головки равный 1. Программа DCU 2.12 подобным образом переформатирует нулевую дорожку, создавая в начале сектор с номером #AD, длиной 128 байт, а длину последнего (16-го) уменьшает также до 128.

Стандартным образом любая дорожка может быть отформатирована при помощи процедур из DOS ПЗУ, например, так:

XOR A

LD (#5CD8),A ; для проверки дорожки после форматирования

LD (#5CDA),A ; для одностороннего форматирования

LD (#5CD6),A ; обнулить число дефектных секторов

LD E,NTRK ; номер дорожки-1 (для нулевой NTRK=#FF)

LD B, 1 ; число форматируемых дорожек

LD HL,#208A ; адрес процедуры форматирования

CALL DOS

LD A,(#5CD6) ; В регистре A - число дефектных секторов

DOS PUSH HL ; обращение к DOS ПЗУ

JP #3D2F

Данная процедура, для выборочного форматирования, может быть использована в программе, например, для восстановления дефектных дискет (естественно, что до форматирования дорожки нужно считать с неё всю доступную информацию, а после - записать ее обратно). Представляет интерес также форматирование дополнительных дорожек за пределами обычных 80-ти (как правило, удается отформатировать еще 2-3 дорожки).

Нестандартное форматирование осуществить значительно сложнее. Для этого используются процедуры #2F79 (выдача команды на ВГ93) и #3FB0 (блочная запись). На контроллер дается команда "запись дорожки", однако дополнительно потребуется ещё ряд процедур по проверке готовности диска, контроль результатов и др. Вся записываемая информация для целой дорожки, включая индексы, пробелы, области данных, должна быть предварительно сформирована в памяти (о структуре служебной информации - см. приложение).

Дорожка может быть считана при помощи процедуры #3F09 (также требуется ряд предварительных операций). В память кроме данных считывается вся служебная информация, которая подробно описана в приложении; метод форматирования не играет роли, поэтому можно прочитать не только TR-DOS, но и любые дискеты, в т.ч. защищённые от копирования. В принципе, с использованием команд "чтение дорожки" и "запись дорожки" возможно, создать универсальный копировщик.

При чтении дорожки необходимо учесть следующее:

•S при выполнении команды "чтение дорожки" БИС ВГ93 не проверяет контрольные суммы, поэтому дискеты, которые в нормальном режиме читаются не с первого раза, могут быть считаны неправильно;

•S пробелы между полями не синхронизируются, поэтому могут читаться каждый раз по-разному, но все равно в виде последовательности одинаковых байт; число байт в пробелах может также незначительно отличаться;

•S синхроимпульс записан специфическим образом, поэтому первый байт может читаться по-разному (#14, #C2), но два последующих - всегда #A1, #A1; поэтому идентификатор легко обнаружить по последовательности #A1, #A1, #FE, а данные - по #A1, #A1, FBh;

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




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Системки - Оберон для ZX Spectrum: Тонкости при разработке на Обероне в среде ZXDev (часть 1).
СС'99 - интервью: Dude/Diogen (авторы журнала Voyager).
Футбол - Все О фУтбОлисТах ДинаМо КиЕв.
How it was in Leningrad - Year 1996
LAMER`99 - чисто наш, спековый, пожизняк...

В этот день...   21 ноября