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

Секреты TR-DOS - некоторые вопросы, связанные с автостартом Бейсик-программы.


Некоторые вопросы, связанные с автостартом Бейсик-программы

Наш постоянный читатель и корреспондент Камразе Тимофей Михайлович пишет о том, что, программируя на ассемблере, задумал сделать дисковый загрузчик - программу-оболочку типа "boot". Вот что он в связи с этим сообщает.

Все шло отлично, пока не пришла пора заняться запуском BASIC-программ из кода. Пойдя по проторенному пути (засылая в системные переменные TR-DOS нужное имя, а в регистр "С"-#0Е), удалось только считать BASIC, но запустить его не вышло. Перекопав кучу системной литературы, я нашел адрес пакета подпрограмм в ПЗУ, метки которых начинались с буквы "Р" (PROGRAMMS?). Например: P_RUN (#1AAB). Программы начинаются с адреса #1A7A и заканчиваются адресом #1B14. Но, не зная, какие данные требуются этим программам, пользоваться ими нельзя.

Потерпев неудачу с ПЗУ, я решил поучиться у профессионалов, и потратил неделю на взлом чужих BOOT-ов. Вскрыв три программы, содержание которых я был еще в состоянии понять, с удивлением обнаружил, что все они используют "обходной маневр".

Например: Существует некоторая программа-оболочка "boot" с автостартом в строке 2 и кодовым блоком с адреса 50000:

1 RANDOMIZE USR 15 619: REM : SAVE " " CODE

2 RANDOMIZE USR 15619: REM : LOAD "boot" CODE

3 RANDOMIZE USR 50000

После того, как Вы, находясь в программе-оболочке, выбрали нужный Вам файл, кодовая программа оболочки делает следующее: обнуляет ячейки системных переменных 23618 и 23620 - это задает номер строки и оператора в Бейсике, на которые должен быть сделан возврат. Затем заменяет в первой Бейсик-строке код "SAVE" на код "RUN", после этого заносит имя файла вместо пробелов в кавычках и подставляет код ":" вместо "CODE". Затем делает RET, после которого попадаем на начальную строку Бейсик-программы. Но в итоге проведенных преобразований получаем в начальной строке, например:

1 RUNDOMIZE USR 15619: REM : RUN "ELITE ":

Теперь программа спокойно выполняет свое прямое назначение.

К сожалению, ни в одной книге я так и не нашел способа запустить BASIC только с помощью машинного кода. Как это сделать?

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

Итак, как корректно запустить Бейсик-программу из машинного кода? Кстати, ответ уже содержится в действиях описываемой программы-оболочки: ведь выполняя RET, машиннокодовая программа как раз запускает Бейсик с начальной строки из машинного кода.

Однажды мы затрагивали похожую тему на страницах "РЕВЮ". Это материал Андрея Алексеева по машиннокодовому блоку ON ERROR GO TO из пакета процедур "SUPERCODE" (ZX-PEBI0-92, № 5-6, стр.113). Тогда речь шла о предотвращении остановки Бейсик-программы, а если более точно, то об обработке ошибок в Бейсике, а если еще более точно, о том, как заставить Бейсик-программу при ошибке попадать на заранее заданную строку опять же Бейсика. Вы спросите, а какая же связь этих проблем с вопросом, заданным Тимофеем Камразе? А связь самая непосредственная. Все эти проблемы, в конечном счете, сводятся к запуску интерпретатора Бейсика с заданной Бейсик-строки из машинного кода. Блок кодов ON ERROR GO TO с блеском выполняет эту задачу. Тем, кто интересуется точками входа в интерпретатор Бейсика, рекомендуем разобраться с работой этого блока кодов. А теперь аналогичная процедура, предназначенная для той же цели - запуска Бейсик-программы: LD HL,#nnnn (1)

LD IY,#5C3A (2)

LD (IY+0),#FF (3)

LD (#5C42) , HL (4)

XOR A

LD (#5C44),A (5)

SET 7,(IY+1) (6)

JP #1B7D (7)

Начальная команда - это загрузка в регистр HL номера Бейсик-строки с которой должна стартовать Бейсик-программа (1). Теперь следует вспомнить, что при работе интерпретатора Бейсика в "Спектруме" в регистровой паре IY находится число #5C3A (23610) адрес системной переменной ERR NR. И если при работе машиннокодовых процедур значение регистра IY было изменено, необходимо прежде вернуть ему это значение (2). В ячейку, отведенную для системной переменной ERR NR, заносится число #FF, имитируя отсутствие ошибки (3) .

Далее в два байта системной переменной NEW PPC (её адрес - #5C42 или 23618) записывается номер Бейсик-строки (хранящийся в HL), на которую должен быть сделан переход (4).

Затем обнуляется ячейка системной переменной NS РРС - это номер оператора в строке, на которую будет сделан переход. Сначала обнуляется аккумулятор A и затем содержимое A пересылается (5) в NS РРС - ячейку #5C44 (23620).

Теперь надо установить флаг синтаксиса: 7-й разряд системной переменной FLAGS - управляющие флаги Бейсика, имитируя положительный результат проверки Бейсик-строки на синтаксис (6). Адрес FLAGS - #5C3B (23611) или IY+1.

Теперь подготовка Бейсик-системы закончена и можно запускать интерпретатор Бейсика (7) с точкой входа #1B7D (07037). Таким образом, Бейсик-программа будет запущена со строки, номер которой задан в регистре HL.

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

Итак, номер стартовой Бейсик-строки должен быть задан в регистре HL. Вспомним теперь о том, с чего начал свое письмо Тимофей Камразе - он делает процедуру-оболочку для диска. Поэтому в связи с этим еще один вопрос: как и где, записаны на диске данные об автостарте Бейсик-программы. Если Вы даже внимательно читали опубликованные на страницах РЕВЮ материалы по TR-DOS, то Вы все же нигде не встречали этого. Восполняя этот пробел, приводим более подробные данные по Бейсик-файлам.

Вы, наверное, обратили внимание, что при выполнении команды CAT, с диска считывается только область каталога диска - нулевая дорожка, а при выполнении команды LIST - головка как бы пробегает по всему диску. Это свидетельствует о том, что дополнительная информация о строке автостарта скрыта где-то в глубинах диска.

Еще одно наблюдение, на которое многие, возможно обратили внимание. Если длина кодового блока равна 256 байт, то файл займет ровно один сектор, но никак не больше. Если же длина Бейсик-программы равна 256 байт, то длина файла составит уже 2 сектора. Это наводит на мысль о том, что следом за Бейсик-файлом содержится некоторая дополнительная информация.

Это действительно так. В 16-байтовом заголовке файла, записываемом в каталоге диска, после 8 байтов имени файла следует его тип (B, C, D, или #), затем следует двухбайтовый параметр START. Следующие два байта -параметр LENGTH - длина файла или Бейсик-программы. Что касается блоков кодов, то параметры START и LENGTH не вызывают каких либо вопросов. Теперь о Бейсик-файлах. Если при записи Бейсик-программы не было определено никаких переменных, то параметры START и LENGTH равны между собой. Это мы можем видеть для большинства Бейсик-программ. Если эти параметры различаются между собой, то значит в Бейсик-программе определены какие-то переменные. Естественно, значение START для Бейсик-файла не может быть меньше LENGTH.

START - это полная длина Бейсик-программы вместе с областью переменных. Если мы от начала Бейсик-файла отсчитаем его полную длину (START), то после нее на диске найдем четыре дополнительных байта. Сначала идет маркер конца #80, затем маркер автостарта: код #AA, а после него два байта - номер строки автостарта Бейсик-программы в обычном двухбайтовом виде: сначала младший, затем - старший байты. Команда TR-DOS LIST считывает с диска именно эту информацию.

Итак, всего следом за Бейсик-программой записано четыре байта, вот почему Бейсик-файл, имеющий полную длину 252 байта, занимает один сектор, а имеющий длину 253 байта - уже два сектора. Следует также заметить, что в отличие от магнитофона, где возможен автостарт с нулевой строки, в системе TR-DOS это невозможно. Если пара байтов, следующих после #AA, равна нулю, автостарт отсутствует. Кстати, самый простой способ для диска лишить

программу автостарта - это при помощи ДИСК-ДОКТОРА обнулить эту пару байтов.

* * *




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Обратная связь - контакты редакции.
Реклама - Реклама и объявления.
Вступление - Вы 4итaете гродненскую гaзету SPITE.
Новости - Firestarter. Spriter by StАLL. Last Demо оf АwaКen. И нaступилa тьмa. Мagiс Eye. МineSweeper Prо. Cетевые новости.
Чёртова дюжина неудобных вопросов членам жюри - Эдуард Говоркян.

В этот день...   28 марта