PDA

Просмотр полной версии : Формат MAGIC-файлов



CityAceE
15.11.2006, 05:49
Возникла необходимость выяснить точный формат MAGIC-файла для 48K и 128K. Однако, вот так сходу найти не смог. Поможете?

P.S. Пока располагаю только такой информацией из книги Ю. Поморцева "TR-DOS для профессионалов и любителей", но её не достаточно:


З А П И С Ь П Р И П О М О Щ И "M A G I C K E Y"

При помощи кнопки 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 -загрузчиком для ленты или диска. В них для запуска
используется аналогичная процедура.

Jukov
15.11.2006, 14:55
Лучше возьми "Полный дизассемблер TR-DOS" Федина, там фсё подробно расписано.

spensor
15.11.2006, 15:55
Хорошая информация была в ZX-Revu за 96-97 годы (начало в печатных журналах, окончание в электронных)!

CityAceE
16.11.2006, 06:52
Да нет! Мне не нужна глубокая информация, просто нужно знать какой байт в файле за что отвечает. И всё! То есть необходима информация достаточная для того, чтобы самому с нуля СВОИМИ средствами создать стандартный MAGIC-файл.

Неужели ни у кого нет? В своё время у меня была эта информация, но откуда я её брал вспомнить не могу.

jtn
16.11.2006, 20:58
взять эмуляторный дебаггер да отладить трдос.
вообще непонятно зачем нужен именно магикфайл

CityAceE
17.11.2006, 08:29
взять эмуляторный дебаггер да отладить трдос.
Да это понятно. Просто хотелось пропустить этот этап и тем самым съэкономить себе время.

вообще непонятно зачем нужен именно магикфайл
Нужен! :)

psb
17.11.2006, 17:49
чтобы самому с нуля СВОИМИ средствами создать стандартный MAGIC-файл.
хм.. ну, с 48к все же понятно? или что? вроде там написано всё..

Sonic
20.11.2006, 10:09
То что сейчас помню навскидку:

1. Головной файл - "@"
2. Файлы страниц - "@n", где n - номер страницы.
3. Я не помню, где сохраняется текущая банка ОЗУ. Она определяется методом подсчета CRC текущей банки, затем перебором банок и сравнением CRC. Если банка содержит только 00, то она считается неиспользуемой и не сохраняется. Регистры сохраняются на стеке в определенном порядке. SP после этого пишется, кажется, в параметр Start файла. Есть некоторые грабли:
1. Цвет бордюра устанавливается равным содержимому системной переменной BORDER из бейсика (кажется так она называется).
2. Делается некая весьма условная проверка на валидность системных переменных, и при ее прохождении текущая банка также ставится из системной переменной бейсика-128.