TR-DOS ДЛЯ НАЧИНАЮЩИХ
Подолжение (начало см. ZX РЕВЮ 96/1-2, 4-5) (c) В.Сироткин, г.Краснокаменск.
ГЛАВА 3
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ ТР ДОС
По анлогии с БЕЙСИКОМ, во время своей работы ТР ДОС создает в ОЗУ область системных переменных, в которых хранятся параметры настройки диска, команды, точки вызовов подпрограмм, флаги состояний и т.д. Единственное различие области ТРДОС от системной области БЕЙСИКА заключается в том, что системные переменные SOS привязаны к регистру IY процессора. У системных переменных ТР ДОС такой привязки нет, как нет и своих имен, как это сделано в системных переменных БЕЙСИКА.
Область системных ТР ДОС занимает всего 112 байт в области ОЗУ с адреса #5ССВ по адрес #5D3B.
Область инициализируется при первом же обращении к ТР ДОС (т.е. при любой команде, обращенной к диску) и сдвигает область начала БЕЙСИК - программы на адрес 23867, оставляя этот адрес активным до сброса компьютера!
При первом включении компьютера, если он выходит в SOS, область системных ТР ДОС не определена, и программа БЕЙСИКА начинается, как обычно, с адреса 23755, но при любой команде, обращенной к ТР ДОС, происходит настройка адресов системной области ТР ДОС, сдвиг начала программы БЕЙСИКА и инсталирование значений переменных операционной системы.
Во время своей работы, система ТР ДОС может резервировать дополнительный буфер для своих нужд размером 257 байт с адреса 23846. Этот буфер является динамическим, т.е. создается только на время операций считывания/записи, сдвигая программу Бейсика вверх по адресам. После операции буфер уничтожается, программа Бейсика возвращается на свое место, и все встает на свои места. Эта операция происходит незаметно для пользователя и независимо от него, если, конечно, он работает стандартным набором команд ТР ДОС.
Если буфер не может образоваться из-за низкого RAMTOP (а такая ситуация встречается очень часто), то возникает надпись, которая вывела из себя многих, кто занимается адаптацией кассетных версий программ на диск, а именно : " OUT OF MEMORY".
В дальнейшем будет показано как решить эту проблему и обходиться без этого буфера. Еще больше места требуют для себя команды 'LIST' и 'MOVE'; командe 'MOVE' необходимо аж 4 килобайта, но я думаю, что эта команда должна интересовать Вас в последнюю очередь.
На Рис. 9 показан дамп ОЗУ системных переменных ТР ДОС после инициализации.
Подробное описание переменных представленно в таблице 2.
Если Вы в своих разработках будете использовать переменные ТР ДОС, то нужно понять одну вещь: если Вы работаете с программой, которая не будет своими рабочими кодами затирать эту область, то система сама позаботится обо всех переменных сама. Вы, конечно, можете изменять некоторые из переменных или использовать их значения, но, в данном случае, это не слишком и нужно. Работая в такой программе на макроуровне (см. главу "Функции ТР ДОС"), Вы не будете испытывать никаких трудностей.
Но если коды Вашей программы затерли область системных переменных, то работать в этой ситуации становится затруднительно, и Вам потребуется инициализировать несколько переменных ТР ДОС, чтобы система сработала правильно.
Вам будет необходимо инсталировать 2-3 переменные + область описателя файла.
Если Вы попытаетесь инициализировать все переменные и работать всеми функциями ТР ДОС, то, скорее всего, у Вас ничего не получится из-за отсутствия свободного места ОЗУ в Вашей программе.
Если Вам все же удался этот трюк, то что же Вам мешает пойти дальше и, инициализировав переменные БЕЙСИКА, работать в нем, используя стандартные команды ТР ДОС ??.
Короче говоря, если это так, то у Вас достаточно свободного места в ОЗУ, и не занимайте, просто-напросто, область системных переменных.
Хотя некоторые программы составляются именно этим путем, т.е. сохраняют всю область переменных ТР ДОС в свободном месте, а во время работы с диском пересылают ее на родное место.
Конечно, можно наворочать в программе ( ради ее секретности и трудности "взлома") все ,что угодно, но поверьте - что все тайное всегда становится явным, а простота - залог успеха !!
В главе "Функции ТРДОС" мы рассмотрим вопрос о том, какие именно переменные необходимо вводить, чтобы при затертой области системных ТР ДОС нормально исполнялись команды чтения/записи на диск. В конечном итоге, ведь это нам и надо.
Забегая вперед, скажу, что составляя программы на самом низком уровне, используя отдельные подпрограммы ТР ДОС ПЗУ, можно вообще избавиться от такой проблемы, как 112 байт системной области.
ТАБЛИЦА 2 . СИСТЕМНЫЕ ПЕРЕМЕННЫЕ ТР ДОС.
АДР16 ! АДР10 ! ДЛИНА ! НАЗНАЧЕНИЕ
#5СВ6 ! 23734 ! 1* ! Если = #F4 то INTERFACE 1 ! ! ! не подключен. ! ! ! Если =00,то область пере! ! ! менных сдвигается для под! ! ! ключения ИНТЕРФЕЙСА 1 ! ! ! и проверяется адрес 23832
#5СС2 ! 23746 ! 1* ! Содержит код #С9 . При вы! ! ! зове подпрограмм ПЗУ SOS! ! ! из ТР ДОС
#5СС8 ! 23752 ! 1 ! Содержит код #83 дла диско! ! !вода 'А'
#5СС9 ! 23753 ! 1 ! Тоже самое для диска В
#5ССА ! 23754 ! 1 ! Тоже самое для диска С
#5ССВ ! 23755 ! 1 ! Тоже самое для диска D
#5ССС ! 23756 ! 1* ! Текущий сектор при чтении ! ! ! каталога
#5CCD ! 23757 ! 1* ! При готовности дисковода ! ! ! = #80
#5ССЕ ! 23758 ! 1* ! При 0 - чтение ,при # FF
запись СЕКТОРА
#5CD6 ! 23766 ! 1* ! = #FF если комманда ! ! ! не выполнена
#5CD7 ! 23767 ! 2* ! 1.После проверки диска ! ! ! содержит ! ! ! количество цилиндров. ! ! ! 2.Промежуточный адрес в ! ! ! озу, файлов типа <В и С>
#5CD9 ! 23769 ! 2* ! 1.Адрес обрабатываемого ! ! ! символа команды ДОС ! ! ! 2.Промежуточная длина ! ! ! в ОЗУ файла типа <В и С>
#5CDB ! 23771 ! 2* ! Промежуточная длина прог-! ! ! раммы
Область заголовка (индификатора) файла
#5CDD ! 23773 ! 8 ! Имя файла , 8 знаков
#5СЕ5 ! 23781 ! 1 ! Тип файла < B,C,D,# >
#5СЕ6 ! 23782 ! 2 ! При <С> типе - начало файла ! ! ! в озу.
! ! ! При <В> типе - длина прог-! ! ! раммы.
#5СЕ8 ! ------!--- |
23783 ! ----!----- |
2 ! Рабочая длина файла --!--------------------------- |
#5СЕА ------!--- |
! 23786 ----!----- |
! 1 ! Объем файла в секторах --!--------------------------- |
#5СЕВ |
! 23787 |
! 1 ! Номер первого сектора файла |
!
------!--- |
! ! ----!----- |
(0-15)
—1........................... |
#5СЕС ! 23788 ! 1 ! Номер первой дорожки файла
#5CEF ! 23791 ! 1* ! = 1 если подключен ! ! ! ИНТЕРФЕЙС 1
#5CF4 1 . |
! 23796 i |
! 1* ---!-- |
! Номер сектора в текущий момент |
#5CF5 !23797
! ! ! 1 1 |
! 1* i . |
! Номер дорожки в текущий момент |
#5CF6 ! ! |
! 23798 ! ! ! ! |
! 1 ! Номер активного дисковода, (0-3),
для временной операции |
#5CF7 !
------!-- |
! 23799
! ! -----!---- |
! 2 ---!-- |
! При выходе из 15616 содержит 0000 |
#5CF8 l 23800 l 1 l Номер дисковода при l l l операции с 2_мя файлами. l l l Равен #FF, если канал l l l открыт.
#5CF9 l 23801 l 1 l 1 .Номер дисковода при
l l l работе с 2мя файлами
l l l (0-3)
l l l 2.Признак операции = #00
l l l LOAD FILE
l l l VERIFY = #FF
l l l З.Номер канала в который
l l l подается листинг каталога
l l l (экран=2 ,принтер=3)
#5CFA l
------l--- |
l23802 l l ----l---- |
l 1 l Время перемещения головки дисковода 'А' = #08 ---l--------------------------- |
#5CFB ------l--- |
23803 ----l---- |
l 1 l То же самое для диска В: ---l--------------------------- |
#5CFC ------l--- |
23804 ----l---- |
l 1 l То же самое для диска С: ---l--------------------------- |
#5CFD ------l--- |
l 23805 ----l---- |
l 1 l То же самое для диска D: ---l--------------------------- |
#5CFE l
------l--- |
23806 l l ----l---- |
l 1* l Текущая команда для
1818ВГ93 ---l--------------------------- |
#5CFF l l
------l--- |
23807 l l l l ----l---- |
l 1* l Номер сектора для подпрограммы чтение / запись секторов ---l--------------------------- |
#5D00 l l
------l--- |
23808 l l ----l---- |
2* l Текущий адрес буфера = ( #5D25 ) ---l--------------------------- |
#5D02 l ------l--- |
23810 ----l---- |
2* l Сохранение регистра HL ---l--------------------------- |
#5D04 l |
23812 |
2* l Сохранение регистра DE |
#5D06 l l l l
------l--- |
23814 l l l l l l ----l---- |
1 1 l Количество знаков на поиск
файла изначально = 09 ; имя файла + тип ---l--------------------------- |
#5D07 l ------l--- |
23815 ----l---- |
1 1* l Счетчик удаленных файлов ---l--------------------------- |
#5D08 l ------l--- |
23816 ----l---- |
1 1* l Первый символ в имени ---l--------------------------- |
#5D0C l 23820 l 2* l Состояние буфера ТРДОС l l l для перекачки информации. l l l (257 байт с адреса 23846 ) l l l 1. #FF - Буфера нет l l l 2. #00 - Буфер включен
#5D0E l 23822 l 1* l Принадлежность комманды.
! ! ! #FF - BASIC ! ! ! ИНАЧЕ - ТРДОС
#5D0F ! 23823 ! 1* ! Код ошибки ТРДОС ! ! ! 1. #00 - вводит пустую ! ! ! строку ! ! ! ИНАЧЕ - RETURN
#5D10 ! 23824 ! 1* ! Старший байт кода ошибки ! ! ! при вызове п/п 15616 ! ! ! Обнулять принудительно ! ! ! при вызове п/п 15616 !!
#5D11 ! 23825 ! 2* ! Адрес командной строки
! ! ! ТРДОС.
! ! ! При вызове 15616 повторяет
! ! ! адрес командной строки SOS
! ! ! (23641)
! ! ! При вызове по 15619 равен
! ! ! 23645
#5D13 ! 23827 ! 2* ! Копия стека ошибок.
! ! ! При равенстве старшего
! ! ! байта #АА -
! ! ! происходит запуск 'boot'
! ! ! файла,
! ! ! а в 23833 записывается
! ! ! код #FE
#5D15 ! 23829 ! 1* ! При равенстве 0 печатает ! ! ! сообщения ТРДОС . ! ! ! Иначе не печатает.
#5D16 ! 23830 ! 1 ! Копия системного регистра ! ! ! ВГ-93 - порт #FF TRDOS
#5D17 ! 23831 ! 1 ! Вспомогательный байт.
! ! ! Если при вызове 15616
! ! ! байт НЕ РАВЕН #АА,
! ! ! то рисуется заставка ТРДОС
! ! ! и запускается файл 'воот'.
! ! ! Если байт равен #FF ,
! ! ! то система не попадает на
! ! ! подпрограмму'ОШИБКА' при
! ! ! чтении неверного АДРЕСНОГО
! ! ! МАРКЕРА. ------!-------!-------!---------------------------
#5D18 ! 23832 ! 1* ! Если байт равен #FF , ! ! ! то подключается ! ! ! ИНТЕРФЕЙС 1
#5D19 ! 23833 ! 1 ! Дисковод для работы ! ! ! (0-3)
#5D1A ! 23834 ! 2* ! Внутренний адрес окончания
l подпрограмм ТРДОС .
#5D1C l 23836 l 2* l Сохраняется SP
#5D1E l 23838 l 1 l Системный номер файла в l l l каталоге диска . l l l ЕСЛИ ФАЙЛ ОБНАРУЖЕН!
#5D20 l 23840 l 3 l Первые три символа введен-l l l ной коммандной строки.
ВНИМАНИЕ! СИМВОЛОМ '*' В ТАБЛИЦЕ ОТМЕЧЕНЫ БАЙТЫ, КОТОРЫЕ НЕ РЕКОМЕНДУЕТСЯ
МЕНЯТЬ В ПРОЦЕССЕ СТАНДАРТНОЙ РАБОТЫ С КОМАНДАМИ ТР ДОС l