Из журнала 'Чёрная Ворона 5' Украина, Донецкая область, г.Дмитров-1, 01.2001 TR-DOS ----------------------------------------- Поводом для размещения этого материала в журнале послужило то, что я решил заме- нить в оболочке журнала turbo loader на стандартные досовские подпрограммы работы с диском. По многочисленным просьбам тру- дящихся, так сказать. Развелось сейчас по сцене Спектрума всяких там винчестеров, а также RAM-дисковщиков... Да и молодёжь не в состоянии иногда найти уже дефицитные в обиходе книги типа "ZX-Spectrum для поль- зователей и программистов" Николая Родио- нова, а по сему задают в письмах вопросы: что и как надо делать и как проверить ка- чество и т.д. и т.п. Да и сам я слегка запарился работать с tr-dos в её "чистом" виде: отвык, однако, за несколько лет... Короче, привожу почти полный сборник информации по системным и функциям tr-dos, а также об ошибках. Системные переменные TR-DOS 5.04T. +-----+---+--------------------------------------------------+ |Адрес|Дл.| Содержимое. | +-----+---+--------------------------------------------------+ |23734| 1 |Используется, если есть ИНТЕPФЕЙС-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 |Используется, если есть ИHТЕPФЕЙС-1. Если не 0, то| | | |меняются местами блоки памяти длиной 45 байтов по | | | |адресам 23747 и 23859. | |23833| 1 |Номер дисковода по умолчанию. | |23834| 2 |Адрес возврата из подпрограммы завеpшения. | |23836| 2 |Сохраняет SP для подпрограмм возвpата в бейсик. | |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 используются для размещения подпрограммы проверки наличия ИHТЕPФЕЙСа-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. Hапример: 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 включен, то определяется времЯ пеpеме-| | |щения головки и проверяется переменная с типом диско- | | |вода. Если она не равна 255 (ошибка), то будет опреде-| | |лено количество дорожек дисковода. При этом предпола- | | |гается, что дисковод односторонний (ошибка). Пpи воз- | | |врате определяется номеp дорожки, на которой стоит го-| | |ловка дисковода и заносится в регистр дорожки. | | 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 : | | | Пpи 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 Порты интерфейса BETA DISC. Для управления интерфейсом BETA DISC используются порты: 31 - вывод - регистр команд ВГ-93, ввод - регистр состояния ВГ-93. 63 - регистр дорожки ВГ-93. 95 - регистр сектора ВГ-93. 127 - регистр данных ВГ-93. 255 - вывод - системный регистр, ввод - сигналы DRQ и INTRQ. Порт 31. Регистр команд - самый важный. С помощью его программа от- дает контроллеру команды на проведение операций. Микросхема может выполнять 11 команд: BIN HEX 0000HVRR #00 - #0F Восстановление. 0001HVRR #10 - #1F Поиск. 001THVRR #20 - #3F Шаг в предыдущем направлении. 010THVRR #40 - #5F Шаг вперед. 011THVRR #60 - #7F Шаг назад. 100MSECA #80 - #9F Чтение сектора. 101MSEC0 #A0 - #BF Запись сектора. 11000E00 #C0, #C4 Чтение адреса. 11100E00 #E0, #E4 Чтение дорожки. 11110E00 #F0, #F4 Запись дорожки. 1101IIII #D0 - #DF Принудительное прерывание. Флаговые биты: RR - скорость позиционирования головки: +--+--+-----+ |R1|R0|T шаг| +--+--+-----+ | 0| 0| 6 мс| | 0| 1|12 мс| | 1| 0|20 мс| | 1| 1|30 мс| +--+--+-----+ Эта таблица справедлива при тактовой частоте 1 мГц. При сигна- ле TEST=0 период равен около 400 мс и не меняется. V - проверка номера дорожки после позиционирования. H - загрузка головки. T - изменение номера дорожки в регистре дорожки после каждого шага. A - тип адресной метки (0 - #FB, 1 - #F8). C - проверка номера стороны диска при идентификации индексной области. E - задержка после загрузки головки на 30 мс. S - сторона диска. M - мультисекторная операция. I - условие прерывания: I0 - по переходу привода в состояние "готов". I1 - по переходу привода в состояние "не готов". I2 - по индексному импульсу. I3 - немедленно. Команда "восстановление" осуществляет позиционирование на до- pожку 0. Если через 256 шагов сигнал TR00 не появится, то ко- манда прекращает работу. Всегда выполняется при сбросе конт- роллера независимо от готовности дисковода. Команда "поиск" - в регистре дорожки должен находиться теку- щий номер дорожки, а в регистре данных - требуемый. Перемеще- ние головки происходит до их совпадения. Команда "шаг" продвигает головку на 1 шаг. Направление уста- навливается командами "вперед" и "назад". Команда "чтение сектора" читает с текущей дорожки сектор, но- мер которого задан в регистре сектора. Сторона диска задается флагом S (0, 1). При установленном флаге M читаются все секто- ра до конца дорожки. Флаг A - тип адресной метки: при A=1 - #F8, стирание сектора разрешено; при A=0 - #FB, стирание зап- рещено. Вначале читается идентификатор сектора; если таковой не найден, то в регистре состояния устанавливается флаг "мас- сив не найден". Иначе если совпали номера дорожки, стороны, сектора и контрольная сумма, то то происходит чтение данных: очередной байт выдается в регистр данных и сопровождается сиг- налом DRQ. Байт должен быть считан из регистра данных до появ- ление следующего, иначе в регистре состояния устанавливается флаг "потеря данных". В конце чтения проверяется контрольная сумма и если она не совпадает, то в регистре состояния уста- навливается флаг "ошибка в контрольной сумме". При этом мультисекторная операция прекращается. Команда "запись сектора" в части идентификации сектора выпол- няется подобно предыдущей. Сигнал DRQ появляется при запросе первого байта данных. Затем вычисляются 22 байта для двойной плотности (для одинарной 11) - пробел между индексной областью и данными. После этого, если регистр данных получил байт, вы- дается строб записи и записываются данные, начиная с нулевых байтов и адресной метки. Регистр данных должен получать оче- редной байт в ответ на каждый сигнал DRQ со скоростью записи. Если байт не получен, то в регистре состояния устанавливается бит "потеря данных", а на диск записывается байт 0. После дан- ных записывается контрольная сумма и байт - пробел. Сигнал WSTB устанавливается в 0. Команда "чтение адреса" считывает 6 байтов первого попавшего- ся идентификатора сектора, включая контрольную сумму. Если контрольная сумма не совпадает, то устанавливается флаг "ошиб- ка в контрольной сумме" и чтение продолжается. При выполнении этой команды байт из регистра дорожки помещается в регистр сектора. По окончании как обычно вырабатывается сигнал INTRQ и в регистре состояния сбрасывается бит "занято". Команда "чтение дорожки" читает всю информацию с дорожки, включая служебную. При этом не выдается строб чтения и не про- веряются контрольные суммы. Команда "запись дорожки" предназначена для форматирования дисков. Вся информация, включая пробелы и поля индексов и дан- ных со всеми метками. Записываются все байты кроме #F5 - #FE, которые интерпретируются как управляющие адресные метки. Таким образом при форматировании эти байты не могут быть записаны. Список этих байтов вы видите в таблице: +-------+----------------------------------------------------+ | | Hазначение. | | Байт +--------------------------+-------------------------+ | | В режиме FM. | В режиме MFM. | +-------+--------------------------+-------------------------+ | #F5|Не допускается. |Запись метки #A1 в MFM. | | | |Вычис- | | | |ляется контрольная сумма.| | #F6|Не допускается. |Запись метки #C2 в MFM. | | #F7|Записывается вычисленная контрольная сумма. | |#F8-#FB|Запись #F8 - #FB с CLK=#C7|Запись #F8 - #FB в MFM. | | #FC|Запись #FC с CLK=#D7 |Запись #FC в MFM. | | |(индексная метка перед первым индексным массивом). | | #FD|Запись #FD с CLK=#FF. |Запись #FD в MFM. | | #FE|Запись #FE с CLK=#C7. Вы- |Запись #FE в MFM. | | |числяется контрольная сум-| | | |ма (индексная метка в начале индексного массива). | | #FF|Запись #FF с CLK=#FF. |Запись #FF в MFM. | +-------+--------------------------+-------------------------+ Команда "принудительное прерывание" задается для завершения любой выполняемой команды. В отличие от других команд она мо- жет выдаваться в любой момент времени. Условие прерывания за- висит от младших битов команды. Если они равны 0, то команда прерывается и INTRQ не вырабатывается. При I0=1 прерывание вы- полняется после перехода сигнала CPRDY из 0 в 1; при I1=1 - из 1 в 0. При I2= =1 - по поступлению индексного импульса. При I3=1 происходит немедленное прерывание команды. После выполне- ния этих условий выдается сигнал INTRQ. Регистр состояния 1818ВГ-93. После выполнения в регистре состояния будут находится флаги, показывающие результат выполнения команды: +---------------+---------------+ | |Разряд регистра| | Команда +-+-+-+-+-+-+-+-+ | |7|6|5|4|3|2|1|0| +---------------+-+-+-+-+-+-+-+-+ |Вспомогательная|R|P|H|F|C|T|I|Q| |Чтение адреса |R|0|0|N|C|W|D|Q| |Чтение сектора |R|0|A|N|C|W|D|Q| |Чтение дорожки |R|0|0|0|0|W|D|Q| |Запись сектора |R|P|E|N|C|W|D|Q| |Запись дорожки |R|P|E|0|0|W|D|Q| +---------------+-+-+-+-+-+-+-+-+ Значения флагов: R - готовность дисковода (1 - не готов). P - защита от записи. H - загрузка головки. E - ошибка записи. A - тип адресной метки. F - ошибка поиска. N - массив не найден. C - ошибка в контрольной сумме. T - головка на дорожке 0 (сигнал TR00 от дисковода). W - потеря данных. I - индексный импульс. D - запрос данных. Q - занято (идет выполнение команды). Порт 255. Системный регистр служит для выбора дисководов и выполнения других вспомогательных действий. Его структура: 7 6 5 4 3 2 1 0 | | | | +-+-Номер дисковода (0 - 3). | | | +-----Сброс ВГ-93, если 0. | | +-------Загрузка головки. | +---------Сторона диска (0 - нижняя). +-------------Метод записи (0 - FM, 1 - MFM). При вводе из этого порта читаются сигналы: бит 7 - INTRQ; бит 6 - DRQ. К сожалению, порты TR-DOS доступны только тогда, когда вклю- чено ПЗУ TR-DOS, что очень затрудняет доступ к ним. Но для за- писи в порты можно использовать следующие подпрограммы: 12227 OUT (31),A RET 7738 OUT (63),A RET 8179 OUT (255),A RET 12044 OUT (255),A RET 10835 OUT (C),A RET Для чтения из портов подобных подпрограмм, увы, нет. Коды ошибок: В TR-DOS обработка ошибок реализована весьма некорректно, но все же можно различить ошибки, если воспользоваться двумя пе- ременными: 23610 и 23823. +-------------------+----------------------------+-----+-----+ |Сообщение об ошибке|Значение. |23610|23823| +-------------------+----------------------------+-----+-----+ |O.K. |Нормальное завершение. | 255 | 0 | |No file(s) |Требуемый файл не найден. | 255 | 1 | |File exists |Файл уже существует. | 255 | 2 | |No space |Нет места на диске. | 255 | 3 | |Directory full |Нет места в каталоге диска. | 255 | 4 | |Rec O\F |Обращение к несуществующему | 255 | 5 | | |сектору файла. | | | |No disc |Нет диска в дисководе. | 26 | 6 | |Disc error |Дисковая ошибка. Есть 3 ва- | 26 | 7 | |Trk XX sec XX |рианта: R - еще раз попробо | | | |Retry,Abort,Ignore?|вать, I - продолжить со сле-| | | | |дующего сектора, A - отка- | | | | |заться от операции. | | | |Read only |Диск защищен от записи. Есть| 26 | 7 | |Trk XX sec XX |3 варианта ( смотрите выше).| | | |Retry,Abort,Ignore?| | | | |Stream opened |Открываемый поток уже занят.| 25 | 10 | |Not disk file |Закрываемый канал не принад-| 255 | 11 | | |лежит TR-DOS. | | | |Array not found |Требуемая переменная не най-| 255 | 14 | | |дена. | 1 | 1 | |*BREAK* |Нажата клавиша BREAK. | 20 | 20 | | | | 12 | 12 | |Out of RAM |Не хватает оперативной памяти 3 | 3 | |Disc error |Диск не принадлежит TR-DOS. | 255 | 0 | |Read only |Попытка записи на 40-дорожеч- 255 | * | | |ный диск на 80-дорожечном | | | | |дисководе. | | | |*ERROR* |Прочие ошибки, в основном | 11 | 12 | | |синтаксические. | X |X+1 | +-------------------+----------------------------+-----+-----+ * - копия переменной с типом дисковода, X - любое число. В случае вывода сообщения Retry,Abort,Ignore? коды ошибки ус- танавливаются при ответе A. Формат описателя файла. байты 0 - 7 - имя файла. байт 8 - расширение файла. байты 9 - 10 - для кодов и массивов - адрес загрузки, для программ на бейсике - длина файла, для файлов данных: байт 9 - номер блока в файле, байт 10 - любой, TR-DOS всегда установит 32. байты 11 - 12 - для массивов и кодов - длина файла, для прог- рамм на бейсике - длина программы, для файлов данных - длина записанной части блока. байт 13 - Длина файла в секторах. байт 14 - Номер первого сектора файла. байт 15 - номер первой дорожки файла. Формат описателя диска (сектор 8 трек 0) байты 0 - 224 - не используются. байт 225 - номер первого свободного сектора. байт 226 - номер первой свободной дорожки. байт 227 - тип диска: 22 - 80-дорожечный двухсторонний, 23 - 40-дорожечный двухсторонний, 24 - 80-дорожечный односторонний, 25 - 40-дорожечный односторонний. байт 228 - количество файлов на диске вместе со стер- тыми. байты 229 - 230 - количество свободных секторов. байт 231 - всегда 16 - признак принадлежности диска к TR-DOS. байты 232 - 243 - не используются. Байты 234 - 242 TR-DOS за- полняет байтом 32. байт 244 - количество стертых файлов. байты 245 - 252 - имя диска. байты 253 - 255 - не используются. Ошибки в подпрограммах TR-DOS. Фатальные ошибки: Ошибки PEEK \ POKE - невозможно работать с файлами с расшире- нием B и D. Также нельзя работать с последним сектором любого файла. Ошибка PEEK - после сектора дочитывается столько байтов из следующего, сколько указано в младшем байте длины файла. Эта ошибка обходится при использо- вании подпрограммы 15635. Ошибки MAGIC - портит адреса 23552 и 23553. Если по адресу 23304 будет 238, то в порт 32765 загрузится число из 23388. Делает 20 попыток записи на диск с заклеенной прорезью. Ошибка RUN - некорректно запускает кодовые файлы. Ошибка PRINT# - При создании нового блока файла портит буфер, из-за чего может не сработать CAT# или LIST#. Ошибка RESET - помещает по адресу 23746 команду RET без нали- чия системных переменных TR-DOS. Ошибка CAT - Если номера дисководов в 23801 и 23798 разные, то произойдет что угодно. Ошибка позиционирования - не учитывается скорость перемещения головки дисковода. Другие ошибки: Ошибка выбора дисковода - не проверяется тип дисковода, если в переменной 255, а если ее изменить, то тип дисковода будет все время переопреде- ляться. Ошибка чтения адресного маркера - флаг игнорирования ошибки берется из 23761, а не из 23831. Ошибка всех COPY - портится переменная 23840, а при COPY S - еще и 23839. Ошибки GO TO - цвет бордюра берется из 23624. Для сохранения длины имени файла используется экран, хо- тя в этом нет необходимости. При загрузке файлов страниц нажатие BREAK или ответ A на вопрос Retry,Abort,Ignore? Приведет к чему угодно. Ошибки PRINT# и INPUT# - после вопроса Retry,Abort,Ignore? или нажатия BREAK будет что угодно. Ошибка настройки на диск - не проверяется возможность ис- пользования дисковода в требуемом режиме. Совершенно неправильно обрабатывается DISC ERROR. Ошибка READ ONLY - при попытке записи на 40-дорожечный диск на 80-дорожечном дисководе сообщение выдает- ся правильно, но в переменной 23823 вмес- то кода ошибки будет копия переменной с типом дисковода. Ошибка BREAK - при нажатии BREAK выдается сообщение BREAK INTO PROGRAM вместо BREAK-CONT REPEATS. --------------------------------------------------------------