Системные переменные TR-DOS 5.04T. ╔═════╤═══╤══════════════════════════════════════════════════╗ ║Адрес│Дл.│ Содержимое. ║ ╟─────┼───┼──────────────────────────────────────────────────╢ ║23734│ 1 │Используется, если есть ИНТЕРФЕЙС-1. Если равно ║ ║ │ │244, то область переменных не переносится, иначе ║ ║ │ │проверяется 23832. ║ ║23735│ 11│Не используется. ║ ║23746│ 1 │Содержит команду RET. Используется для переключе- ║ ║ │ │ния ПЗУ на бейсик. ║ ║23747│ 5 │Не используется. ║ ║23752│ 1 │Тип дисковода A: ║ ║ │ │ бит 7=0 - дисковод 40-дорожечный. ║ ║ │ │ 1 - дисковод 80-дорожечный. ║ ║ │ │ бит 1=0 - дисковод односторонний. ║ ║ │ │ 1 - дисковод двухсторонний. ║ ║ │ │ бит 0=0 - использовать 80-дорожечный дисковод как║ ║ │ │ 40-дорожечный. ║ ║23753│ 1 │Тип дисковода B. ║ ║23754│ 1 │Тип дисковода C. ║ ║23755│ 1 │Тип дисковода D. ║ ║23756│ 1 │Текущий сектор при работе с каталогом. ║ ║23757│ 1 │Если не 0, то после позиционирования будет задерж-║ ║ │ │ка. Регистр состояния ВГ-93 перед проверкой дорож-║ ║ │ │ки. Бит 7 регистра состояния ВГ-93 перед чтением ║ ║ │ │адресного маркера. ║ ║23758│ 1 │Флаг операции с секторами. При 0 -чтение секторов,║ ║ │ │при 255 - запись. ║ ║23759│ 2 │Адрес рабочей области памяти для MOVE, COPY, LIST.║ ║ │ │и при обработке номера записи при выводе в файл ║ ║ │ │данных прямого доступа. ║ ║23761│ 1 │Длина перемещаемого файла для MOVE. ║ ║23762│ 1 │Имя массива при записи / загрузке массива в виде: ║ ║ │ │биты 0 - 4 - имя массива ( от "A"=1 до "Z"=26), ║ ║ │ │бит 5 - если 0, то массив числовой, ║ ║ │ │бит 6 - если 1, то массив строковый, ║ ║ │ │бит 7 - всегда 1. ║ ║23761│ 2 │Номер строки автостарта при записи программы на ║ ║ │ │бейсике. ║ ║23763│ 2 │Счетчик секторов перемещаемого файла для MOVE. ║ ║23764│ 1 │Номер стираемого файла для MOVE. ║ ║23765│ 1 │Текущий сектор перемещаемого файла для MOVE. ║ ║23766│ 1 │Текущая дорожка перемещаемого файла для MOVE. Ко- ║ ║ │ │личество дефектных секторов при форматировании и ║ ║ │ │проверке диска. Для подпрограммы сжатия строки: ║ ║ │ │если 0, то команда находится в строке программы на║ ║ │ │бейсике, иначе в другом месте. Для подпрограммы ║ ║ │ │загрузки файла: если 0, то адрес загрузки и длина ║ ║ │ │берутся из описателя файла, если 3, то из 23769 и ║ ║ │ │23771 соответственно, иначе адрес загрузки берется║ ║ │ │из 23769, а длина - из описателя файла. ║ ║23767│ 1 │Текущий сектор стираемого файла при MOVE. Количес-║ ║ │ │тво дорожек при определении типа дисковода и фор- ║ ║ │ │матировании. ║ ║23768│ 1 │Текущая дорожка стираемого файла при MOVE. Если не║ ║ │ │0, то форматируемая дорожка не проверяется. ║ ║23767│ 2 │Сохраняет CH_ADD при обработке номера записи в ║ ║ │ │файле последовательного доступа. Адрес переменной ║ ║ │ │длины строки для подпрограммы сжатия строки. Адрес║ ║ │ │старого массива при загрузке массива. Адрес секто-║ ║ │ │ра для PEEK и POKE. ║ ║23769│ 1 │Относительный адрес записи при обработке номера ║ ║ │ │записи в файле последовательного доступа. ║ ║23770│ 1 │Номер открываемого блока файла произвольного дос- ║ ║ │ │тупа при обработке номера записи. Если равно 128, ║ ║ │ │то форматируются две стороны, иначе только одна. ║ ║23769│ 2 │Счетчик освобождающихся секторов для MOVE. Адрес ║ ║ │ │загрузки файла для LOAD, номер сектора для PEEK и ║ ║ │ │POKE. Адрес ключевого слова для подпрограммы сжа- ║ ║ │ │тия строки. Длина файла для записи при SAVE. ║ ║23771│ 1 │Номер загружаемого сектора блока файла произволь- ║ ║ │ │ного доступа при обработке номера записи. Номер ║ ║ │ │первого сектора перемещаемого файла для MOVE. ║ ║23772│ 1 │номер первой дорожки перемещаемого файла для MOVE.║ ║23771│ 2 │Длина файла для LOAD. Длина файла для указания в ║ ║ │ │каталоге при SAVE. Номер потока для CAT и LIST. ║ ║23773│ 8 │Имя файла или диска при форматировании. ║ ║23781│ 1 │Расширение файла. ║ ║23782│ 2 │Адрес загрузки файла. Адрес таблицы секторов для ║ ║ │ │форматирования. ║ ║23784│ 2 │Длина файла. Адрес таблицы секторов для проверки ║ ║ │ │дорожки. ║ ║23786│ 1 │Обьем файла в секторах. ║ ║23787│ 1 │Номер первого сектора файла. ║ ║23788│ 1 │Номер первой дорожки файла. ║ ║23789│ 2 │Адрес загрузки старого файла для COPY. ║ ║23791│ 2 │Длина старого файла в байтах для COPY. ║ ║23793│ 1 │Длина старого файла в секторах для COPY. ║ ║23794│ 1 │Номер первого сектора старого файла для COPY. ║ ║23795│ 1 │Номер первой дорожки старого файла для COPY. ║ ║23796│ 1 │Номер текущего сектора для подпрограммы ║ ║ │ │загрузки / записи секторов. ║ ║23797│ 1 │Номер текущей дорожки для подпрограммы ║ ║ │ │загрузки / записи секторов. ║ ║23798│ 2 │Номер дисковода для операции (0 - 3). ║ ║23800│ 1 │Дисковод-источник для COPY. Если равно 255, то при║ ║ │ │выводе в файл данных буфер не удаляется. ║ ║23801│ 1 │Дисковод-приемник для COPY. Номер дисковода при ║ ║ │ │выводе каталога. Признак операции с файлом: 0 - ║ ║ │ │- загрузка, 255 - верификация. ║ ║23802│ 1 │Время перемещения головки дисковода A: (8 - 11). ║ ║23803│ 1 │То же для дисковода B:. ║ ║23804│ 1 │То же для дисковода C:. ║ ║23805│ 1 │То же для дисковода D:. ║ ║23806│ 1 │Команда контроллера для подпрограммы чтения / за- ║ ║ │ │писи сектора. ║ ║23807│ 1 │Номер сектора для подпрограммы чтения / записи ║ ║ │ │сектора. ║ ║23808│ 2 │Адрес сектора для подпрограммы чтения / записи ║ ║ │ │сектора. ║ ║23810│ 2 │Сохраняет HL для подпрограммы вызова подпрограмм ║ ║ │ │из ПЗУ бейсика и 15635. ║ ║23812│ 2 │Сохраняет DE. ║ ║23814│ 1 │Число проверяемых байтов описателя файла при его ║ ║ │ │поиске. ║ ║23815│ 1 │Количество стертых файлов для подпрограммы стира- ║ ║ │ │ния файлов. ║ ║23816│ 1 │Первый символ имени файла для подпрограммы стира- ║ ║ │ │ния файлов. ║ ║23817│ 1 │тип файла данных для OPEN# ("R", "W" или "RND"). ║ ║23819│ 2 │Не используется. ║ ║23820│ 1 │Флаг наличия буфера: 0 - есть, иначе - нет. ║ ║23821│ 1 │Номер текущего файла при копировании всего диска с║ ║ │ │двумя дисководами. ║ ║23822│ 1 │Флаг состояния рабочей области памяти. Если равно ║ ║ │ │255, то рабочая область использовалась. Если равно║ ║ │ │254, то подпрограмма 963 игнорирует ошибки. ║ ║23823│ 1 │Код ошибки TR-DOS. При поиске файла подпрограммой ║ ║ │ │15635: 255 - файл не найден, иначе - номер файла. ║ ║23824│ 1 │Флаг операции для подпрограммы загрузки / верифи- ║ ║ │ │кации файла: 0 - операция с файлом, 255 - загруз- ║ ║ │ │ка / верификация сектора файла, иначе - запись ║ ║ │ │сектора файла. ║ ║23825│ 2 │Адрес командной строки. ║ ║23827│ 2 │Сохраняет содержимое ERR_SP для подпрограмм воз- ║ ║ │ │врата в бейсик. ║ ║23829│ 1 │Если 0, то на экран выводятся сообщения об ошиб- ║ ║ │ │ках, иначе не выводятся. ║ ║23830│ 1 │Копия системного регистра. ║ ║23831│ 1 │Если равно 170, то при вызове 15612 заставка не ║ ║ │ │выводится, иначе выводится заставка и проверяется ║ ║ │ │байт по адресу 23296. Если он равен 170, то проис-║ ║ │ │ходит запуск файла "boot". ║ ║23832│ 1 │Используется, если есть ИНТЕРФЕЙС-1. Если не 0, то║ ║ │ │меняются местами блоки памяти длиной 45 байтов по ║ ║ │ │адресам 23747 и 23859. ║ ║23833│ 1 │Номер дисковода по умолчанию. ║ ║23834│ 2 │Адрес возврата из подпрограммы завершения. ║ ║23836│ 2 │Сохраняет SP для подпрограмм возврата в бейсик. ║ ║23838│ 1 │Номер файла при его поиске. ║ ║23839│ 1 │Флаг способа вызова TR-DOS. Если 0, то вызов был ║ ║ │ │из машинного кода, иначе - из бейсика. Первый сек-║ ║ │ │тор файла на диске - приемнике для COPY S. ║ ║23840│ 1 │Первый сектор файла на диске-приемнике для COPY S.║ ║23840│ 3 │Сохраняет 3 первых символа командной строки. ║ ║23841│ 1 │Если не 0, то идет первый проход копирования, ина-║ ║ │ │че продолжение. ║ ║23843│ 1 │Размер доступной памяти в секторах для MOVE и ║ ║ │ │COPY. ║ ╚═════╧═══╧══════════════════════════════════════════════════╝ При инициализации системы используются следующие ячейки: ╔═════╤═══╤══════════════════════════════════════════════════╗ ║Адрес│Дл.│ Содержимое. ║ ╟─────┼───┼──────────────────────────────────────────────────╢ ║23746│ 1 │Команда RET. Используется для вызова подпрограмм ║ ║ │ │из ПЗУ бейсика. ║ ║24320│ 2 │Сохраняет HL для подпрограммы выполнения команды ║ ║ │ │процессора в ОЗУ. ║ ║24322│ 14│Не используется. ║ ║24336│ 3 │Подпрограмма перемещения блоков памяти LDIR или ║ ║ │ │LDDR. ║ ║24339│237│Временный стек. ║ ╚═════╧═══╧══════════════════════════════════════════════════╝ Также при инициализации системных переменных TR-DOS 20 бай- тов с адреса 23698 используются для размещения подпрограммы проверки наличия ИНТЕРФЕЙСа-1. Способы обращения к ПЗУ TR-DOS. ПЗУ TR-DOS является теневым, поэтому к нему нельзя обра- титься непосредственно при помощи CALL. Но для того, чтобы оно было доступно для использования, существуют адреса, при пере- ходе на которые включается ПЗУ TR-DOS. В ПЗУ бейсика-48 в этих адресах находится знакогенератор, следовательно обычно управ- ление туда никогда не передается. Внимание!!! В ПЗУ бейси- ка-128 в этих адресах находится программа, поэтому при вклю- ченном ПЗУ бейсика-128 ПЗУ TR-DOS блокируется полностью. Ниже вы видите список точек входа, переключающих ПЗУ. 15616 - вход в командный процессор TR-DOS. 15619 - выполнение команд TR-DOS из бейсика. 15622 - подпрограмма ввода из файла данных. 15629 - подпрограмма вывода в файл данных. 15632 - подпрограмма изменения памяти. 15635 - вызов подпрограмм TR-DOS из машинного кода. 15638 - подпрограмма обработки ошибок, поступающих из ПЗУ бей- сика. 15663 - переход на любой адрес в ПЗУ TR-DOS. Как пользоваться этими точками входа. 15616 - простой вызов. Можно установить переменные 23831 и 23296. 15619 - из бейсика: RANDOMIZE USR 15619:REM:<команда> из машинного кода: 1) разместить в памяти командную строку в ASCII виде с префиксом REM:. 2) поместить в CH_ADD адрес этой строки. 3) CALL 15619. Например: LD HL,LINE ;установка CH_ADD LD (23645),HL JP 15619 ;выполнение команды ;командная строка LINE DEFB 234 ;REM DEFB ":" ;: DEFB 239 ;HOAD DEFB 34 ;" DEFM "EXAMPLE";EXAMPLE DEFB 34 ;" DEFB 13 ;ENTER 15622 - открыть канал файла данных и вызвать. На выходе символ из файла будет в аккумуляторе. 15629 - открыть канал файла данных, поместить в A символ и вызвать. Внимание!!! Содержит ошибку. 15632 - просто вызвать. Проверяет 23734 и 23832 и меняет блоки памяти местами, если нужно. 15635 - Номер подпрограммы поместите в регистр C, остальное согласно таблице: ╔═════╤══════════════════════════════════════════════════════╗ ║ Ком.│ Функции ║ ╟─────┼──────────────────────────────────────────────────────╢ ║ 0 │Восстановление с ожиданием INTRQ. Воспринимает BREAK. ║ ║ 1 │Выбор дисковода. Номер дисковода поместите в регистр ║ ║ │A. Если в переменной с временем перемещения головки ║ ║ │дисковода бит 7 включен, то определяется времЯ nepeme-║ ║ │щения головки и проверяется переменная с типом диско- ║ ║ │вода. Если она не равна 255 (ошибка), то будет опреде-║ ║ │лено количество дорожек дисковода. При этом предпола- ║ ║ │гается, что дисковод односторонний (ошибка). При воз- ║ ║ │врате определяется номер дорожки, на которой стоит го-║ ║ │ловка дисковода и заносится в регистр дорожки. ║ ║ 2 │Позиционирование. Логический ноль дорожки поместите в║ ║ │A. Если по адресу 23757 не 0, то после позиционирова- ║ ║ │ния будет задержка. В программе есть ошибка. ║ ║ 3 │Помещает содержимое аккумулятора по адресу 23807. ║ ║ 4 │Помещает содержимое HL по адресу 23808. ║ ║ 5 │Чтение группы секторов. В HL поместите адрес в памяти,║ ║ │в D - номер первой дорожки, в E - номер первого секто-║ ║ │ра, в B - количество секторов. В программе есть ошиб- ║ ║ │ка. ║ ║ 6 │Запись группы секторов. Параметры и ошибка аналогично ║ ║ │команде 5. ║ ║ 7 │Вывод каталога. В аккумулятор поместите номер потока, ║ ║ │а в 23801 поместите номер дисковода из 23798. В прог- ║ ║ │рамме есть ошибка. ║ ║ 8 │Чтение описателя файла по адресу 23773. Номер файла ║ ║ │поместите в аккумулятор. ║ ║ 9 │Запись описателя файла. Описатель разместите по адре- ║ ║ │су 23773 и поместите номер файла в аккумулятор. ║ ║ 10 │Поиск файла. Проверяемую часть описателя разместите с ║ ║ │адреса 23773, а ее длину поместите в 23814. Если файл ║ ║ │найден, то в BC, 23823 и 23838 будет его номер, иначе ║ ║ │23838 не меняется, а в 23823 и BC будет 255. ║ ║ 11 │Запись файла. Имя и расширение поместите с 23773, на- ║ ║ │чало в памяти поместите в HL, а длину - в DE. ║ ║ 12 │Запись программы на бейсике. Имя и расширение помести-║ ║ │те с адреса 23773. Если расширение не "B", то файл за-║ ║ │писывается как кодовый. ║ ║ 13 │Не используется. ║ ║ 14 │Выполняет 5 функций: ║ ║ │ Загрузка файла: в 23801 и 23824 поместите 0, имя и ║ ║ │ расширение поместите с 23773, а также: ║ ║ │ Для бейсик - программ - больше ничего. ║ ║ │ Для файлов CODE : ║ ║ │ При A=0 - адрес загрузки и длина берутся из катало-║ ║ │ га. ║ ║ │ При A=3 - адрес загрузки берется из HL, длина - из ║ ║ │ DE. ║ ║ │ Иначе - адрес загрузки берется из HL, длина - из ║ ║ │ каталога. ║ ║ │ Для массивов - A<>0, в HL - длина тела старого мас- ║ ║ │ сива или 0, если такового нет; в 23767 - адрес тела ║ ║ │ старого массива в памяти, в 23762 - имя массива. ║ ║ │ Верификация файла - все как и для загрузки, только в ║ ║ │ 23801 поместите 255. ║ ║ │ Загрузка сектора файла - в 23801 поместите 0, в ║ ║ │ 23824 - 255, в 23767 - адрес загрузки, в HL - номер ║ ║ │ сектора, в A - 3, в DE - 0 (два последних действия - ║ ║ │ для обхода ошибки. Внимание!!! Не работает с файлами ║ ║ │ BASIC и DATA из-за ошибки. ║ ║ │ Верификация сектора файла - все как и при загрузке, ║ ║ │ только в 23801 поместите 255. ║ ║ │ Запись сектора файла - в 23801 поместите 255 (для об-║ ║ │ хода ошибки), в 23824 - не 0 и не 255, в A - не 0, в ║ ║ │ HL - номер сектора, в 23767 - адрес в памяти. ║ ║15-17│ Не используется. ║ ║ 18 │ Стирание файлов. Имя и расширение поместите с 23773, ║ ║ │ можно обнулить 23815, тогда по окончании там будет ║ ║ │ число стертых файлов. ║ ║ 19 │ Перенос 16 байтов с адреса в HL по адресу 23873. ║ ║ 20 │ Обратное 19. ║ ║ 21 │Проверка дорожки. Физический номер дорожки поместите в║ ║ │аккумулятор и выберите сторону диска. Если обнаружены ║ ║ │плохие сектора, то в 23823 и BC будет 7, а в 23766 бу-║ ║ │дет их количество. ║ ║ 22 │Выбирает верхнюю сторону диска. ║ ║ 23 │Выбирает нижнюю сторону диска. ║ ║ 24 │Проверяет принадлежность диска и настраивает систему ║ ║ │на его тип. Содержит ошибку. ║ ╚═════╧══════════════════════════════════════════════════════╝ 15638 - внутренняя точка входа. Как использовать, смотрите в дизассемблере. 15663 - поместите на стек нужный адрес, затем JP 15663. В ка- честве примера привожу подпрограммы выполнения двух команд TR-DOS, отсутствующих в 15635. Форматирование диска. Имя диска поместите в 23773. CAHL 15632 ;изменение памяти LD A,255 ;эта часть программы повторяет 15635 LD (23829),A ;сообщения не печатать LD (23839),A ;работает машинный код LD (23768),A ;дорожки не проверять LD (23761),A ;NO DISC при чтении адресного маркера ;игнорировать LD HL,513 ;после завершения возврат будет в бейсик LD (23834),HL LD (23836),SP;сохранение SP PUSH AF ;выделение места для адреса подпрограммы ;обработки ошибок LD HL,7901 ;адрес подпрограммы форматирования PUSH HL ;помещение его на стек LD HL,541 ;адрес подпрограммы установки адреса об- ;работки ошибок PUSH HL ;помещение его на стек JP 15663 ;вход в ПЗУ TR-DOS Упаковка пространства диска. CALL 15632 ;снова повторяем 15635 LD A,255 LD (23829),A LD (23839),A LD HL,513 LD (23834),HL LD (23836),SP PUSH AF LD HL,5806 ;адрес подпрограммы упаковки пространства ;диска PUSH HL ;помещение его на стек LD HL,541 ;дальше как в предыдущем примере PUSH HL JP 15663