Интерпретатор системных функций
Интерпретатор системных функций является ядром OCt и в первую
очередь он предназначен для обслуживания запросов интерпретатора ко-
манд TR-DOS. Однако некоторые функции могут представлять большой
интерес для программистов, пишущих на ассемблере. Используя их, можно
значительно расширить и дополнить средства, предоставляемые ОС.
Для вызова интерпретатора существует специальная точка входа,
расположенная по адресу 15635. Номер функции задается в регистре С, а
необходимые параметры — в других регистрах или в области системных
переменных TR-DOS. Область системных переменных обычно открывается
командами ОС, выполняющимися из Бейсика при загрузке программ, во
может по каким-либо причинам оказаться закрытой. Скажем, при выполне-
нии команды Бейсика NEW, и последующим запуском программы функцией
USR. В таком случае перед вызовом область необходимо предварительно
открыть, Сделать это можно вручную, войдя и тут же выйдя из ОС. Для
открытия области из программы необходимо воспользоваться точкой входа
по адресу 15649. Здесь расположена подпрограмма, которая проверяет
наличие области системных переменных TR-DOS и в случае отсутствия
устанавливает ее.
Качало работе»! с дискетой
Начальных функций в интерпретаторе три. Рассмотрим их в том
порядке, в котором они должны вызываться из пользовательских программ.
Программный сброс микроконтроллера. #00
Эта функция не имеет ни входных, ни выходных параметров и
предназначена скорее для «внутрисистемного» использования. Результатом
выполнения функции является программный сброс «сердца» интерфейса
Beta Disk — микроконтроллера КР1818ВГ93. Действия, производимые им в
этом случае (а точнее, при выполнении команды «Восстановление») будут
приведены ниже, в разделе, посвященном описанию этой микросхемы (см.
стр. 203).
Функцию #00 следует применять в самом начале работы с интерфей-
сом, а также после ошибок позиционирования для установки его в исходное
состояние.
LD С,0
CALL 15635
Настройка на дисковод. #01
Входным параметром этой функции служит номер дисковода, на
который необходимо настроиться. Номер помещается в аккумулятор, и для
дисковода А это 0, для В — 1, для С и D — соответственно 2 и 3. Настроила
на дисковод выполняется только один раз — при первом вызове этой
функции, дальнейшие обращения будут проигнорированы.
Для дисковода выполняются два теста: первым определяется количе-
ство дорожек, а вторым — скорость перемещения магнитной головки. Ре-
зультаты тестов помещаются в две системные переменные TR-DOS (см.
табл. 12). Если характеристики используемых дисководов заранее известны,
то настройку на дисковод можно не проводить, а просто записать соответст-
вующие значения в системные переменные. Настройка на указанный дис-
LD А,1 ;настройка на дисковод В
LD С,1
CALL 15635
ковод будет произведена
функций #01 только в
том случае, если значе-
ние системной перемен-
ной, хранящей время
перемещения головки,
равно #FF. Это значе-
ние записывается при
инициализации обла-
сти системных пере-
менных.
LD А,1 ;настройка на дисковод В
LD С,1
CALL 15635
Настройка на дискету. #18
' Эта функция считывает с дискеты служебный сектор и производит
настройку некоторых системных переменных TR-DOS. Она обязательно
должна вызываться перед началом работы с новой дискетой. Входных пара-
метров функция не имеет. Служебный сектор считывается в специально
открываемый для него буфер, располагающийся непосредственно за сис-
темными переменными TR-DOS. По окончании выполнения буфер закры-
вается.
LD С, #18
CALL 15635
Логический уровень
Логические функции интерпретатора предназначены в первую оче-
редь для обслуживания каталога, получить доступ к которому другими
путями затруднительно. Они позволяют считывать и записывать любой
сектор (группу секторов) на дискете.
Чтение группы секторов. #05
Функция считывает с дискеты в память группу секторов, последова-
тельно расположенных на дискете. Количество целых секторов задается в
регистре В, при нулевом значении чтения не происходит. Адрес размещения
первого сектора из группы задается в регистрах D и Е. Регистр D должен
содержать номер логической дорожки, а регистр Е — номер логического
сектора на ней. После считывания последнего (15-го) сектора на текущей
дорожке процесс продолжается с первого (0-го) сектора на следующей. Адрес
буфера в памяти, куда будет происходить считывание, задается в регистро-
вой паре HL.
LD В,8 ;считывани® 8 секторов области каталога дискеты
;в память с адреса 50000
LD DE,0
LD HL,50000
LD С,5
CALL 15635
Запись группы секторов. #06
Функция записывает информацию из области памяти в группу сек-
торов, последовательно расположенных на дискете. Количесгво целых сек-
торов задается в регистре В, при нулевом значении записи не происходит.
Адрес размещения первого сектора из группы задается в регистрах D и Б.
Регистр D должен содержать номер логической дорожки, а регистр Е —• номер
логического сектора на ней. После записи последнего (15-го) сектора на
текущей дорожке процесс продолжается с первого (0-го) сектора на следую-
щей. Адрес буфера в памяти, откуда будет происходить считывание инфор-
мации, задается в регистровой паре HL.
LD В,1 ;запись в служебный сектор информации, рас-
положенной в памяти начиная с адреса 50000
LD DE.8
LD HL,50000
LD С.6
CALL 15635
Файловый уровень
Функции этой группы предназначены для поддержки файловой сис-
темы TR-DOS. Все они используют рабочий буфер длиной в 257 байт,
располагающийся сразу за системными переменными TR-DOS.
Вывод каталога дискеты. #07
Функция используется командным процессором при выполнении
команды CAT. В аккумулятор помещается номер потока, куда необходимо
направить вывод каталога. При выводе во 2-й поток автоматически проис-
ходит Очистка экрана. Номер дисковода, для которого выводится каталог,
задается в системной переменной по адресу 23798, а для корректной работы
его необходимо продублировать в переменных по адресам 23800 и 23801.
Перед началом работы функция #07 автоматически выполняет настройку
на дискету (функция #18).
LD А,0 ; вывод каталога с дискеты, находящейся в
; дисководе А на дисплей
LD (23798),А
LD (23800),А
LD (23801), А
LD А,2
LD С,7
CALL 15635
Считывание элемента каталога. #08
Функция считывает с системной дорожки элемент каталога, номер
которого помещен в аккумулятор (начинается нумерация с нуля). Элемент
каталога помещается в дескриптор файла (см. «Системные переменные TR-
DOS»).
LD А,2 считывание в область дескриптора информации
;о третьем файле
LD С,8
CALL 15635
Запись дескрипт9ра файла. #09
Дескриптор файла записывается в элемент каталога, номер которого
задан в аккумуляторе (нумерация начинается с нуля). Этой функцией нужно
пользоваться с осторожностью, так как TR-DOS просто переписывает инфор-
мацию в область каталога, не делая никаких проверок корректности переда-
ваемых параметров.
LD А,1 ;запись дескриптора файла во второй элемент
; катало га
LD С,9
CALL 15635
Поиск элемента каталога, #0А
Эта функция используется командным процессором для нахождения
информации о файле в области каталога. Исходная информация задается в
дескрипторе, причем при поиске используются не все байты. Количество
байтов, на которые ведется поиск, задается в системной переменной TR -DOS
по адресу 23814. Обычно там записано число 9, и в каталоге производится
поиск только спецификации файла. Но для файлов прямого или последова-
тельно доступа задействуется еще один байт, и число увеличивается до 10.
Варьируя число байтов в переменной 23814, можно производить избира-
тельный поиск, например, для группы файлов.
Результаты поиска возвращаются в регистре С. Если информация
найдена, то регистр С содержит номер дервого совпадающего элемента
каталога, в противном случае — #FF.
Создание файла. #0В
Функция создания файла используется при записи на дискету обла-
сти оперативной памяти. Имя и тип создаваемого файла должны быть
помещены в дескриптор, адрес начала области передается через регистровую
пару HL, а длина —- через DE. Тип файла может быть <С>, <D> или <#>*.
Запись бейсик-лрограммы. #0С
Функция #0В «создание файла» не позволяет записать бейсик-про-
грамму**, для этого служит функция #0С. Входным параметром для нее
является только дескриптор файла, тип файла должен быть обязательно <В>.
Остальную информацию функция берет из системных переменных бейсик-
интерпретатора.
Чтение/проверка записи файла. #0Е
Поскольку алгоритмы работы команд чтения и проверки во многом
схожи, в интерпретаторе для них сделана одна функция. Имя и тип файла
должны быть помещены в дескриптор. Значение в системной переменной
TR-DOS по адресу 23801 задает вид операции: #00 —^ чтение, #FF —
проверка. Кроме этого, для «небейсик-файлов» необходимо указать их мес-
тоположение в оперативной памяти. Как и для функции создания файла,
адрес начала области передается через регистровую пару HL, а длина —
через DE, аккумулятор должен содержать число, отличное от 0 или 3.
Используя разные значения аккумулятора можно заставить интерп-
ретатор использовать параметры Start и Lenght, заданные при записи файла.
При Akk=0 и адрес загрузки, и длина области памяти будут соответствовать
*) Таким образом, можно сформировать в намята массив, а затем записать
его.
**) Строго говоря, это не совсем так, просто функцией #0С для этого гораздо
удобнее пользоваться, т. к, все необходимые расчеты и приготовления
производятся автоматически.
таким же, как и при записи, а при Akk=3 файл будет полностью считан в
область памяти, адресуемую регистровой парой HL.
Удаление файла. #12
Эта функция соответствует команде TR-DOS ERASE, она ищет на диске
элементы каталога, совпадающие с дескриптором, и удаляет их (физического
удаления, впрочем, не происходит).
Для демонстрации функций файловой системы приведем скелет
небольшой программы, сохраняющей область системных переменных TR-
DOS в файле, а затем восстанавливающую эту область с адреса 50000.
LD С,#13 ;создание дескриптора файла (см. ниже)
CALL 15635
LD А,9 ;число байтов поиска
LD (23814), А
LD С,#0А ;код функции #0А — поиск элемента каталога
CALL 15635
SLA С
CALL NC, DELETE ;если такой файл уже существует, удалим его
LD С,#0В ;запись файла
LD HL,23733 ;адрес начала области
LD DE.112 ;ее длина
CALL 15635
LD Cf#0E считывание в другое место
XOR А
LD (23801),А ;операция «чтения»
DEC А
LD HL,50000 ;адрес размещения информации
CALL 15635
RET
DELETE LD C,#12 .'удаление файла
JP 15635
FILENM DEFM "TestFileC"