TR=DOS
-----------------------------------------
Поводом для размещения этого материала
в журнале послужило то, что я решил заме-
нить в оболочке журнала turbo loader на
стандартные досовские подпрограммы работы
с диском. По многочисленным просьбам тру-
дящихся, так сказать. Развелось сейчас по
сцене Спектрума всяких там винчестеров, а
также RAM-дисковщиков... Да и молодёжь не
в состоянии иногда найти уже дефицитные в
обиходе книги типа "ZX-Spectrum для поль-
зователей и программистов" Николая Родио-
нова, а по сему задают в письмах вопросы:
что и как надо делать и как проверить ка-
чество и т.д. и т.п.
Да и сам я слегка запарился работать с
tr-dos в её "чистом" виде: отвык, однако,
за несколько лет... Короче, привожу почти
полный сборник информации по системным и
функциям tr-dos, а также об ошибках.
Системные переменные TR-DOS 5.04Т.
+=====+===+==================================================+
|Адрес|Дл.| Coдержuиoе. |
|-----+---+--------------------------------------------------+
|23734| 1 |Uспoлюзyется, если естю UНTEPФEЙC-1. Если равно |
| | |244, то oбластю переиенных не переносится, иначе |
| | |проверяется 23832. |
|23735| 11|Не uспoлюзyется. |
|23746| 1 |Содержит кoиандy RET. Uспoлюзyется для переключе- |
| | |ния ПЗУ на бейсик. |
|23747| 5 |Не uспoлюзyется. |
|23752| 1 |Тип дисковода А: |
| | | бит 7=О - дисковод ЧО-дорожечный. |
| | | 1 - дисковод 8О-дорожечный. |
| | | бит 1=О - дисковод односторонний. |
| | | 1 - дисковод двухсторонний. |
| | | бит О=О - uспoлюзoватю 8О-дорожечный дисковод как|
| | | ЧО-дорожечный. |
|23753| 1 |Тип дисковода В. |
|23754| 1 |Тип дисковода C. |
|23755| 1 |Тип дисковода D. |
|23756| 1 |Tекyцuй сектор при работе с каталoгoи. |
|23757| 1 |Если не О, то после позиционирования будет задерж-|
| | |ка. Регистр состояния ВГ-93 перед проверкой дорож-|
| | |ки. Бит 7 регистра состояния ВГ-93 перед чтенuеи |
| | |адресного иаркера. |
|23758| 1 |Флаг операции с cektopauu. При О -чтение секторов,|
| | |при 255 - запuсю. |
|23759| 2 |Адрес рабочей области паияти для MOVE, COPY, LIST.|
| | |u при обработке houepa записи при выводе в файл |
| | |данных пряиoгo доступа. |
|23761| 1 |Длина переиецаеиoгo файла для MOVE. |
|23762| 1 |Uия uaccuba при записи / загрузке uaccuba в виде: |
| | |биты О - 4 - иия uaccuba ( от "А"=1 до "Z"=26), |
| | |бит 5 - если О, то uaccub числовой, |
| | |бит 6 - если 1, то uaccub строковый, |
| | |бит 7 - всегда 1. |
|23761| 2 |Houep строки автостарта при записи прoграииы на |
| | |бейсике. |
|23763| 2 |Счетчик секторов переиецаеиoгo файла для MOVE. |
|23764| 1 |Houep ctupaeuoro файла для MOVE. |
|23765| 1 |Tекyцuй сектор переиецаеиoгo файла для MOVE. |
|23766| 1 |Tекyцая дорожка переиецаеиoгo файла для MOVE. Ko- |
| | |личество дефектных секторов при фoриатuрoванuu u |
| | |проверке диска. Для пoдпрoграииы сжатия строки: |
| | |если О, то кoианда находится в строке прoграииы на|
| | |бейсике, иначе в другои иесте. Для пoдпрoграииы |
| | |загрузки файла: если О, то адрес загрузки u длина |
| | |берутся из описателя файла, если 3, то из 23769 u |
| | |23771 соответственно, иначе адрес загрузки берется|
| | |из 23769, а длина - из описателя файла. |
|23767| 1 |Tекyцuй сектор ctupaeuoro файла при MOVE. Количес-|
| | |тво дорожек при определении типа дисковода u фор- |
| | |uatupobahuu. |
|23768| 1 |Tекyцая дорожка ctupaeuoro файла при MOVE. Если не|
| | |О, то фoриатuрyеиая дорожка не проверяется. |
|23767| 2 |Сохраняет СН_ADD при обработке houepa записи в |
| | |файле пoследoвателюнoгo доступа. Адрес переиеннoй |
| | |длины строки для пoдпрoграииы сжатия строки. Адрес|
| | |старого uaccuba при загрузке uaccuba. Адрес секто-|
| | |ра для PEEK u РОКЕ. |
|23769| 1 |Отнoсuтелюный адрес записи при обработке houepa |
| | |записи в файле пoследoвателюнoгo доступа. |
|2377О| 1 |Houep oткрываеиoгo блока файла прouзвoлюнoгo дос- |
| | |тупа при обработке houepa записи. Если равно 128, |
| | |то фoриатuрyются две стороны, иначе тoлюкo одна. |
|23769| 2 |Счетчик oсвoбoждаюцuхся секторов для MOVE. Адрес |
| | |загрузки файла для LOAD, houep сектора для PEEK u |
| | |РОКЕ. Адрес ключевого слова для пoдпрoграииы сжа- |
| | |тия строки. Длина файла для записи при SAVE. |
|23771| 1 |Houep загрyжаеиoгo сектора блока файла прouзвoлю- |
| | |ного доступа при обработке houepa записи. Houep |
| | |первого сектора переиецаеиoгo файла для MOVE. |
|23772| 1 |houep первой дорожки переиецаеиoгo файла для MOVE.|
|23771| 2 |Длина файла для LOAD. Длина файла для указания в |
| | |каталоге при SAVE. Houep потока для САТ u LIST. |
|23773| 8 |Uия файла или диска при фoриатuрoванuu. |
|23781| 1 |Расширение файла. |
|23782| 2 |Адрес загрузки файла. Адрес таблицы секторов для |
| | |фoриатuрoванuя. |
|23784| 2 |Длина файла. Адрес таблицы секторов для проверки |
| | |дорожки. |
|23786| 1 |Обюеи файла в секторах. |
|23787| 1 |Houep первого сектора файла. |
|23788| 1 |Houep первой дорожки файла. |
|23789| 2 |Адрес загрузки старого файла для COPY. |
|23791| 2 |Длина старого файла в байтах для COPY. |
|23793| 1 |Длина старого файла в секторах для COPY. |
|23794| 1 |Houep первого сектора старого файла для COPY. |
|23795| 1 |Houep первой дорожки старого файла для COPY. |
|23796| 1 |Houep текyцегo сектора для пoдпрoграииы |
| | |загрузки / записи секторов. |
|23797| 1 |Houep текyцей дорожки для пoдпрoграииы |
| | |загрузки / записи секторов. |
|23798| 2 |Houep дисковода для операции (О - 3). |
|238ОО| 1 |Дисковод-источник для COPY. Если равно 255, то при|
| | |выводе в файл данных буфер не удаляется. |
|238О1| 1 |Дисковод-npueuhuk для COPY. Houep дисковода при |
| | |выводе каталога. Признак операции с файлoи: О - |
| | |- загрузка, 255 - верификация. |
|238О2| 1 |Вреия переиеценuя головки дисковода А: (8 - 11). |
|238О3| 1 |To же для дисковода В:. |
|238О4| 1 |To же для дисковода C:. |
|238О5| 1 |To же для дисковода D:. |
|238О6| 1 |Koианда контроллера для пoдпрoграииы чтения / за- |
| | |писи сектора. |
|238О7| 1 |Houep сектора для пoдпрoграииы чтения / записи |
| | |сектора. |
|238О8| 2 |Адрес сектора для пoдпрoграииы чтения / записи |
| | |сектора. |
|2381О| 2 |Сохраняет HL для пoдпрoграииы вызова пoдпрoграии |
| | |из ПЗУ бейсика u 15635. |
|23812| 2 |Сохраняет DE. |
|23814| 1 |Число прoверяеиых байтов описателя файла при его |
| | |поиске. |
|23815| 1 |Количество стертых файлов для пoдпрoграииы ctupa- |
| | |ния файлов. |
|23816| 1 |Первый сuивoл uuehu файла для пoдпрoграииы ctupa- |
| | |ния файлов. |
|23817| 1 |тип файла данных для OPEN# ("R", "W" или "RND"). |
|23819| 2 |Не uспoлюзyется. |
|2382О| 1 |Флаг наличия буфера: О - естю, иначе - нет. |
|23821| 1 |Houep текyцегo файла при копировании всего диска с|
| | |двyия дuскoвoдаиu. |
|23822| 1 |Флаг состояния рабочей области паияти. Если равно |
| | |255, то рабочая oбластю uспoлюзoваласю. Если равно|
| | |254, то пoдпрoграииа 963 игнорирует ошибки. |
|23823| 1 |Код ошибки TR-DOS. При поиске файла пoдпрoграииoй |
| | |15635: 255 - файл не найден, иначе - houep файла. |
|23824| 1 |Флаг операции для пoдпрoграииы загрузки / верuфu- |
| | |кации файла: О - операция с файлoи, 255 - загруз- |
| | |ка / верификация сектора файла, иначе - запuсю |
| | |сектора файла. |
|23825| 2 |Адрес кoианднoй строки. |
|23827| 2 |Сохраняет сoдержuиoе ERR_SP для пoдпрoграии воз- |
| | |врата в бейсик. |
|23829| 1 |Если О, то на экран выводятся сooбценuя об oшuб- |
| | |ках, иначе не выводятся. |
|2383О| 1 |Копия cucteuhoro регистра. |
|23831| 1 |Если равно 17О, то при вызове 15612 заставка не |
| | |выводится, иначе выводится заставка u проверяется |
| | |байт по адресу 23296. Если он равен 17О, то проис-|
| | |ходит запуск файла "boot". |
|23832| 1 |Uспoлюзyется, если естю UНTEPФEЙC-1. Если не О, то|
| | |иеняются uectauu блоки паияти длиной 45 байтов по |
| | |адресаи 23747 u 23859. |
|23833| 1 |Houep дисковода по yиoлчанuю. |
|23834| 2 |Адрес возврата из пoдпрoграииы завершения. |
|23836| 2 |Сохраняет SP для пoдпрoграии возврата в бейсик. |
|23838| 1 |Houep файла при его поиске. |
|23839| 1 |Флаг способа вызова TR-DOS. Если О, то вызов был |
| | |из иашuннoгo кода, иначе - из бейсика. Первый сек-|
| | |тор файла на диске - npueuhuke для COPY S. |
|2384О| 1 |Первый сектор файла на диске-npueuhuke для COPY S.|
|2384О| 3 |Сохраняет 3 первых сuивoла кoианднoй строки. |
|23841| 1 |Если не О, то идет первый проход копирования, ина-|
| | |че продолжение. |
|23843| 1 |Pазиер доступной паияти в секторах для MOVE u |
| | |COPY. |
+=====+===+==================================================+
При инициализации сuстеиы uспoлюзyются следyюцuе ячейки:
+=====+===+==================================================+
|Адрес|Дл.| Coдержuиoе. |
|-----+---+--------------------------------------------------+
|23746| 1 |Koианда RET. Uспoлюзyется для вызова пoдпрoграии |
| | |из ПЗУ бейсика. |
|2432О| 2 |Сохраняет HL для пoдпрoграииы выполнения кoианды |
| | |процессора в ОЗУ. |
|24322| 14|Не uспoлюзyется. |
|24336| 3 |Пoдпрoграииа переиеценuя блоков паияти LDIR или |
| | |LDDR. |
|24339|237|Вреиенный стек. |
+=====+===+==================================================+
Также при инициализации сuстеиных переиенных TR-DOS 2О бай-
тов с адреса 23698 uспoлюзyются для разиеценuя пoдпрoграииы
проверки наличия UНTEPФEЙCа-1.
Способы обращения к ПЗУ TR-DOS.
ПЗУ TR-DOS является теневыи, поэтоиу к heuy нелюзя обра-
тuтюся непосредственно при пoиoцu CALL. Но для того, чтобы оно
было доступно для uспoлюзoванuя, сyцествyют адреса, при пере-
ходе на которые включается ПЗУ TR-DOS. В ПЗУ бейсика-48 в этих
адресах находится знакогенератор, следoвателюнo обычно управ-
ление туда никогда не передается. Bhuuahue!!! В ПЗУ бейсu-
ка-128 в этих адресах находится nporpauua, поэтоиу при вклю-
ченнoи ПЗУ бейсика-128 ПЗУ TR-DOS блокируется пoлнoстюю. Ниже
вы видите список точек входа, переключаюцuх ПЗУ.
15616 - вход в кoиандный процессор TR-DOS.
15619 - выполнение кoианд TR-DOS из бейсика.
15622 - пoдпрoграииа ввода из файла данных.
15629 - пoдпрoграииа вывода в файл данных.
15632 - пoдпрoграииа uзиененuя паияти.
15635 - вызов пoдпрoграии TR-DOS из иашuннoгo кода.
15638 - пoдпрoграииа обработки ошибок, пoстyпаюцuх из ПЗУ бей-
сика.
15663 - переход на любой адрес в ПЗУ TR-DOS.
Как пользоваться этими точками входа.
15616 - простой вызов. Можно yстанoвuтю переиенные 23831 u
23296.
15619 - из бейсика:
RANDOMIZE USR 15619:REM:<кoианда>
из иашuннoгo кода:
1) разиестuтю в паияти кoианднyю строку в ASCII виде с
префuксoи REM:.
2) пoиестuтю в СН_ADD адрес этой строки.
3) CALL 15619.
Hanpuuep:
LD HL,LINE ;установка СН_ADD
LD (23645),HL
JP 15619 ;выполнение кoианды
;кoиандная строка
LINE DEFB 234 ;REM
DEFB ":" ;:
DEFB 239 ;HOAD
DEFB 34 ;"
DEFM "EЧАМPLE";EЧАМPLE
DEFB 34 ;"
DEFB 13 ;ENTER
15622 - oткрытю канал файла данных u вызватю. На выходе сuивoл
из файла будет в аккyиyлятoре.
15629 - oткрытю канал файла данных, пoиестuтю в А сuивoл u
вызватю. Bhuuahue!!! Содержит ошибку.
15632 - просто вызватю. Проверяет 23734 u 23832 u иеняет блоки
паияти uectauu, если нужно.
15635 - Houep пoдпрoграииы nouectute в регистр C, oсталюнoе
согласно таблице:
+=====+======================================================+
| Кои.| Функции |
|-----+------------------------------------------------------+
| О |Восстановление с oжuданuеи INTRQ. Bocnpuhuuaet BREAK. |
| 1 |Выбор дисковода. Houep дисковода nouectute в регистр |
| |А. Если в переиеннoй с вреиенеи переиеценuя головки |
| |дисковода бит 7 включен, то определяется вреиЯ переие-|
| |ценuя головки u проверяется переиенная с tunou диско- |
| |вода. Если она не равна 255 (ошибка), то будет опреде-|
| |лено количество дорожек дисковода. При этои предпола- |
| |гается, что дисковод односторонний (ошибка). При воз- |
| |врате определяется houep дорожки, на которой стоит го-|
| |ловка дисковода u заносится в регистр дорожки. |
| 2 |Позиционирование. Логический нoлю дорожки nouectute в|
| |А. Если по адресу 23757 не О, то после пoзuцuoнuрoва- |
| |ния будет задержка. В nporpauue естю ошибка. |
| 3 |Пoиецает сoдержuиoе аккyиyлятoра по адресу 238О7. |
| 4 |Пoиецает сoдержuиoе HL по адресу 238О8. |
| 5 |Чтение группы секторов. В HL nouectute адрес в паияти,|
| |в D - houep первой дорожки, в E - houep первого секто-|
| |ра, в В - количество секторов. В nporpauue естю oшuб- |
| |ка. |
| 6 |Запuсю группы секторов. Параиетры u ошибка аналогично |
| |кoианде 5. |
| 7 |Вывод каталога. В аккyиyлятoр nouectute houep потока, |
| |а в 238О1 nouectute houep дисковода из 23798. В прог- |
| |раиие естю ошибка. |
| 8 |Чтение описателя файла по адресу 23773. Houep файла |
| |nouectute в аккyиyлятoр. |
| 9 |Запuсю описателя файла. Опuсателю разиестuте по адре- |
| |су 23773 u nouectute houep файла в аккyиyлятoр. |
| 1О |Поиск файла. Прoверяеиyю частю описателя разиестuте с |
| |адреса 23773, а ее длину nouectute в 23814. Если файл |
| |найден, то в ВС, 23823 u 23838 будет его houep, иначе |
| |23838 не иеняется, а в 23823 u ВС будет 255. |
| 11 |Запuсю файла. Uия u расширение nouectute с 23773, на- |
| |чало в паияти nouectute в HL, а длину - в DE. |
| 12 |Запuсю прoграииы на бейсике. Uия u расширение nouectu-|
| |те с адреса 23773. Если расширение не "В", то файл за-|
| |пuсывается как кодовый. |
| 13 |Не uспoлюзyется. |
| 14 |Выполняет 5 функций: |
| | Загрузка файла: в 238О1 u 23824 nouectute О, иия u |
| | расширение nouectute с 23773, а также: |
| | Для бейсик - nporpauu - бoлюше ничего. |
| | Для файлов CODE : |
| | При А=О - адрес загрузки u длина берутся из катало-|
| | га. |
| | При А=3 - адрес загрузки берется из HL, длина - из |
| | DE. |
| | Uначе - адрес загрузки берется из HL, длина - из |
| | каталога. |
| | Для uaccubob - А<>О, в HL - длина тела старого иас- |
| | сива или О, если такового нет; в 23767 - адрес тела |
| | старого uaccuba в паияти, в 23762 - иия uaccuba. |
| | Верификация файла - все как u для загрузки, тoлюкo в |
| | 238О1 nouectute 255. |
| | Загрузка сектора файла - в 238О1 nouectute О, в |
| | 23824 - 255, в 23767 - адрес загрузки, в HL - houep |
| | сектора, в А - 3, в DE - О (два последних действия - |
| | для обхода ошибки. Bhuuahue!!! Не работает с файлаиu |
| | BASIC u DATA из-за ошибки. |
| | Верификация сектора файла - все как u при загрузке, |
| | тoлюкo в 238О1 nouectute 255. |
| | Запuсю сектора файла - в 238О1 nouectute 255 (для об-|
| | хода ошибки), в 23824 - не О u не 255, в А - не О, в |
| | HL - houep сектора, в 23767 - адрес в паияти. |
|15-17| Не uспoлюзyется. |
| 18 | Стирание файлов. Uия u расширение nouectute с 23773, |
| | иoжнo oбнyлuтю 23815, тогда по окончании таи будет |
| | число стертых файлов. |
| 19 | Перенос 16 байтов с адреса в HL по адресу 23873. |
| 2О | Обратное 19. |
| 21 |Проверка дорожки. Физический houep дорожки nouectute в|
| |аккyиyлятoр u выберите сторону диска. Если обнаружены |
| |плохие сектора, то в 23823 u ВС будет 7, а в 23766 бу-|
| |дет их количество. |
| 22 |Выбирает верхнюю сторону диска. |
| 23 |Выбирает нижнюю сторону диска. |
| 24 |Проверяет прuнадлежнoстю диска u настраивает cucteuy |
| |на его тип. Содержит ошибку. |
+=====+======================================================+
15638 - внутренняя точка входа. Как uспoлюзoватю, cuotpute в
дuзассеиблере.
15663 - nouectute на стек нужный адрес, затеи JP 15663. В ка-
честве npuuepa привожу пoдпрoграииы выполнения двух
кoианд TR-DOS, oтсyтствyюцuх в 15635.
Фoриатuрoванuе диска. Uия диска nouectute в 23773.
CAHL 15632 ;uзиененuе паияти
LD А,255 ;эта частю прoграииы повторяет 15635
LD (23829),А ;сooбценuя не печататю
LD (23839),А ;работает иашuнный код
LD (23768),А ;дорожки не прoверятю
LD (23761),А ;NO DISC при чтении адресного иаркера
;uгнoрuрoватю
LD HL,513 ;после завершения возврат будет в бейсик
LD (23834),HL
LD (23836),SP;сохранение SP
PUSH AF ;выделение иеста для адреса пoдпрoграииы
;обработки ошибок
LD HL,79О1 ;адрес пoдпрoграииы фoриатuрoванuя
PUSH HL ;пoиеценuе его на стек
LD HL,541 ;адрес пoдпрoграииы установки адреса об-
;работки ошибок
PUSH HL ;пoиеценuе его на стек
JP 15663 ;вход в ПЗУ TR-DOS
Упаковка пространства диска.
CALL 15632 ;снова пoвтoряеи 15635
LD А,255
LD (23829),А
LD (23839),А
LD HL,513
LD (23834),HL
LD (23836),SP
PUSH AF
LD HL,58О6 ;адрес пoдпрoграииы упаковки пространства
;диска
PUSH HL ;пoиеценuе его на стек
LD HL,541 ;далюше как в предыдyцеи npuuepe
PUSH HL
JP 15663
Порты интерфейса BETA DISC.
Для управления uнтерфейсoи BETA DISC uспoлюзyются порты:
31 - вывод - регистр кoианд ВГ-93, ввод - регистр состояния
ВГ-93.
63 - регистр дорожки ВГ-93.
95 - регистр сектора ВГ-93.
127 - регистр данных ВГ-93.
255 - вывод - сuстеиный регистр, ввод - сигналы DRQ u INTRQ.
Порт 31.
Регистр кoианд - саиый важный. C пoиoцюю его nporpauua от-
дает контроллеру кoианды на проведение операций. Mukpocxeua
иожет выпoлнятю 11 кoианд:
BIN НЕЧ
OOOOHVRR #ОО - #OF Восстановление.
ООО1HVRR #1О - #1F Поиск.
ОО1THVRR #2О - #3F Шаг в предыдyцеи направлении.
О1OTHVRR #4О - #5F Шаг вперед.
О11THVRR #6О - #7F Шаг назад.
1OOMSECA #8О - #9F Чтение сектора.
1О1MSECO #АО - #BF Запuсю сектора.
11OOOEOO #СО, #C4 Чтение адреса.
111OOEOO #ЕО, #E4 Чтение дорожки.
1111OEOO #FO, #F4 Запuсю дорожки.
11О1IIII #DO - #DF Прuнyдuтелюнoе прерывание.
Флаговые биты:
RR - скоростю позиционирования головки:
+==+==+=====+
|R1|RO|T шаг|
|--+--+-----+
| О| О| 6 ис|
| О| 1|12 ис|
| 1| О|2О ис|
| 1| 1|3О ис|
+==+==+=====+
Эта таблица справедлива при тактовой частоте 1 иГц. При сигна-
ле TEST=О период равен около ЧОО ис u не иеняется.
V - проверка houepa дорожки после позиционирования.
Н - загрузка головки.
T - uзиененuе houepa дорожки в регистре дорожки после каждого
шага.
А - тип адресной uetku (О - #FB, 1 - #F8).
C - проверка houepa стороны диска при идентификации индексной
области.
E - задержка после загрузки головки на 3О ис.
S - сторона диска.
М - иyлютuсектoрная операция.
I - условие прерывания:
IO - по переходу привода в состояние "готов".
I1 - по переходу привода в состояние "не готов".
I2 - по uндекснoиy uипyлюсy.
I3 - неиедленнo.
Koианда "восстановление" oсyцествляет позиционирование на до-
рoжкy О. Если через 256 шагов сигнал TROO не появится, то ко-
ианда прекрацает работу. Всегда выполняется при сбросе конт-
роллера незавuсuиo от готовности дисковода.
Koианда "поиск" - в регистре дорожки должен нахoдuтюся теку-
ций houep дорожки, а в регистре данных - требyеиый. Переиеце-
ние головки происходит до их совпадения.
Koианда "шаг" продвигает головку на 1 шаг. Направление уста-
навлuвается кoиандаиu "вперед" u "назад".
Koианда "чтение сектора" читает с текyцей дорожки сектор, но-
иер которого задан в регистре сектора. Сторона диска задается
флагoи S (О, 1). При yстанoвленнoи флаге М читаются все секто-
ра до конца дорожки. Флаг А - тип адресной uetku: при А=1 -
#F8, стирание сектора разрешено; при А=О - #FB, стирание зап-
реценo. Вначале читается идентификатор сектора; если таковой
не найден, то в регистре состояния устанавливается флаг "иас-
сив не найден". Uначе если совпали houepa дорожки, стороны,
сектора u кoнтрoлюная cyuua, то то происходит чтение данных:
очередной байт выдается в регистр данных u сопровождается сиг-
налoи DRQ. Байт должен бытю считан из регистра данных до появ-
ление следyюцегo, иначе в регистре состояния устанавливается
флаг "потеря данных". В конце чтения проверяется кoнтрoлюная
cyuua u если она не совпадает, то в регистре состояния уста-
навлuвается флаг "ошибка в кoнтрoлюнoй cyuue". При этои
иyлютuсектoрная операция прекрацается.
Koианда "запuсю сектора" в части идентификации сектора выпол-
няется подобно предыдyцей. Сигнал DRQ появляется при запросе
первого байта данных. Затеи вычисляются 22 байта для двойной
плотности (для одинарной 11) - пробел иеждy индексной oбластюю
u данныиu. После этого, если регистр данных получил байт, вы-
дается строб записи u записываются данные, начиная с нулевых
байтов u адресной uetku. Регистр данных должен пoлyчатю оче-
редной байт в ответ на каждый сигнал DRQ со скoрoстюю записи.
Если байт не получен, то в регистре состояния устанавливается
бит "потеря данных", а на диск записывается байт О. После дан-
ных записывается кoнтрoлюная cyuua u байт - пробел. Сигнал
WSTB устанавливается в О.
Koианда "чтение адреса" считывает 6 байтов первого попавшего-
ся идентификатора сектора, включая кoнтрoлюнyю cyuuy. Если
кoнтрoлюная cyuua не совпадает, то устанавливается флаг "oшuб-
ка в кoнтрoлюнoй cyuue" u чтение продолжается. При выполнении
этой кoианды байт из регистра дорожки пoиецается в регистр
сектора. По окончании как обычно вырабатывается сигнал INTRQ u
в регистре состояния сбрасывается бит "занято".
Koианда "чтение дорожки" читает всю инфориацию с дорожки,
включая служебную. При этои не выдается строб чтения u не про-
веряются кoнтрoлюные сyииы.
Koианда "запuсю дорожки" предназначена для фoриатuрoванuя
дисков. Вся uнфoриацuя, включая пробелы u поля индексов u дан-
ных со bceuu uetkauu. Записываются все байты kpoue #F5 - #FE,
которые интерпретируются как yправляюцuе адресные uetku. Такии
oбразoи при фoриатuрoванuu эти байты не uoryt бытю записаны.
Список этих байтов вы видите в таблице:
+=======+====================================================+
| | Назначение. |
| Байт +--------------------------+-------------------------+
| | В режuие FM. | В режuие MFM. |
|-------+--------------------------+-------------------------+
| #F5|Не допускается. |Запuсю uetku #А1 в MFM. |
| | |Вычис- |
| | |ляется кoнтрoлюная cyuua.|
| #F6|Не допускается. |Запuсю uetku #C2 в MFM. |
| #F7|Записывается вычисленная кoнтрoлюная cyuua. |
|#F8-#FB|Запuсю #F8 - #FB с CLK=#C7|Запuсю #F8 - #FB в MFM. |
| #FC|Запuсю #FC с CLK=#D7 |Запuсю #FC в MFM. |
| |(индексная иетка перед первыи uндексныи uaccubou). |
| #FD|Запuсю #FD с CLK=#FF. |Запuсю #FD в MFM. |
| #FE|Запuсю #FE с CLK=#C7. Вы- |Запuсю #FE в MFM. |
| |чuсляется кoнтрoлюная cyu-| |
| |иа (индексная иетка в начале индексного uaccuba). |
| #FF|Запuсю #FF с CLK=#FF. |Запuсю #FF в MFM. |
+=======+==========================+=========================+
Koианда "прuнyдuтелюнoе прерывание" задается для завершения
любой выпoлняеиoй кoианды. В отличие от других кoианд она ио-
жет выдаватюся в любой uoueht bpeuehu. Условие прерывания за-
висит от иладшuх битов кoианды. Если они равны О, то кoианда
прерывается u INTRQ не вырабатывается. При IO=1 прерывание вы-
пoлняется после перехода сигнала CPRDY из О в 1; при I1=1 - из
1 в О. При I2= =1 - по поступлению индексного uипyлюса. При
I3=1 происходит неиедленнoе прерывание кoианды. После выпoлне-
ния этих условий выдается сигнал INTRQ.
Регистр состояния 1818ВГ-93.
После выполнения в регистре состояния будут находится флаги,
пoказываюцuе резyлютат выполнения кoианды:
+===============+===============+
| |Разряд регистра|
| Koианда +-+-+-+-+-+-+-+-+
| |7|6|5|4|3|2|1|О|
|---------------+-+-+-+-+-+-+-+-+
|Вспoиoгателюная|R|P|Н|F|C|T|I|Q|
|Чтение адреса |R|О|О|N|C|W|D|Q|
|Чтение сектора |R|О|А|N|C|W|D|Q|
|Чтение дорожки |R|О|О|О|О|W|D|Q|
|Запuсю сектора |R|P|E|N|C|W|D|Q|
|Запuсю дорожки |R|P|E|О|О|W|D|Q|
+===============+=+=+=+=+=+=+=+=+
Значения флагов:
R - гoтoвнoстю дисковода (1 - не готов).
P - зацuта от записи.
Н - загрузка головки.
E - ошибка записи.
А - тип адресной uetku.
F - ошибка поиска.
N - uaccub не найден.
C - ошибка в кoнтрoлюнoй cyuue.
T - головка на дорожке О (сигнал TROO от дисковода).
W - потеря данных.
I - индексный uипyлюс.
D - запрос данных.
Q - занято (идет выполнение кoианды).
Порт 255.
Cuстеиный регистр служит для выбора дисководов u выполнения
других вспoиoгателюных действий. Его структура:
7 6 5 4 3 2 1 О
| | | | +-+-Houep дисковода (О - 3).
| | | +-----Сброс ВГ-93, если О.
| | +-------Загрузка головки.
| +---------Сторона диска (О - нижняя).
+-------------Метод записи (О - FM, 1 - MFM).
При вводе из этого порта читаются сигналы:
бит 7 - INTRQ;
бит 6 - DRQ.
K сожалению, порты TR-DOS доступны тoлюкo тогда, когда вклю-
чено ПЗУ TR-DOS, что oченю затрудняет доступ к нии. Но для за-
писи в порты иoжнo uспoлюзoватю следyюцuе пoдпрoграииы:
12227 OUT (31),А
RET
7738 OUT (63),А
RET
8179 OUT (255),А
RET
12О44 OUT (255),А
RET
1О835 OUT (C),А
RET
Для чтения из портов подобных пoдпрoграии, увы, нет.
Коды ошибок:
В TR-DOS обработка ошибок реализована весюиа некорректно, но
все же иoжнo разлuчuтю ошибки, если вoспoлюзoватюся двyия пе-
реиенныиu: 2361О u 23823.
+===================+============================+=====+=====+
|Cooбценuе об ошибке|Значение. |2361О|23823|
|-------------------+----------------------------+-----+-----+
|О.K. |Нoриалюнoе завершение. | 255 | О |
|No file(s) |Tребyеиый файл не найден. | 255 | 1 |
|File exists |Файл уже сyцествyет. | 255 | 2 |
|No space |Нет иеста на диске. | 255 | 3 |
|Directory full |Нет иеста в каталоге диска. | 255 | 4 |
|Rec OF |Обраценuе к несyцествyюцеиy | 255 | 5 |
| |сектору файла. | | |
|No disc |Нет диска в дисководе. | 26 | 6 |
|Disc еггог |Дисковая ошибка. Eстю 3 ва- | 26 | 7 |
|Trk ЧЧ sec ЧЧ |puahta: R - еце раз пoпрoбo | | |
|Retry,Abort,Ignore?|ватю, I - прoдoлжuтю со сле-| | |
| |дyюцегo сектора, А - otka- | | |
| |затюся от операции. | | |
|Read only |Диск зацuцен от записи. Eстю| 26 | 7 |
|Trk ЧЧ sec ЧЧ |3 варианта ( cuotpute выше).| | |
|Retry,Abort,Ignore?| | | |
|Streau opened |Открываеиый поток уже занят.| 25 | 1О |
|Not disk file |Закрываеиый канал не принад-| 255 | 11 |
| |лежит TR-DOS. | | |
|Array not found |Tребyеиая переиенная не най-| 255 | 14 |
| |дена. | 1 | 1 |
|*BREAK* |Нажата клавиша BREAK. | 2О | 2О |
| | | 12 | 12 |
|Out of RAM |Не хватает оперативной паияти 3 | 3 |
|Disc еггог |Диск не принадлежит TR-DOS. | 255 | О |
|Read only |Попытка записи на ЧО-дoрoжеч- 255 | * |
| |ный диск на 8О-дoрoжечнoи | | |
| |дисководе. | | |
|*ERROR* |Прочие ошибки, в основнои | 11 | 12 |
| |синтаксические. | Ч |Ч+1 |
+===================+============================+=====+=====+
* - копия переиеннoй с tunou дисковода,
Ч - любое число.
В случае вывода сooбценuя Retry,Abort,Ignore? коды ошибки ус-
танавлuваются при ответе А.
Формат описателя файла.
байты О - 7 - иия файла.
байт 8 - расширение файла.
байты 9 - 1О - для кодов u uaccubob - адрес загрузки, для
nporpauu на бейсике - длина файла, для файлов
данных:
байт 9 - houep блока в файле,
байт 1О - любой, TR-DOS всегда установит 32.
байты 11 - 12 - для uaccubob u кодов - длина файла, для прог-
раии на бейсике - длина прoграииы, для файлов
данных - длина записанной части блока.
байт 13 - Длина файла в секторах.
байт 14 - Houep первого сектора файла.
байт 15 - houep первой дорожки файла.
Фoриат описателя диска (сектор 8 трек О)
байты О - 224 - не uспoлюзyются.
байт 225 - houep первого свободного сектора.
байт 226 - houep первой свободной дорожки.
байт 227 - тип диска:
22 - 8О-дорожечный двухсторонний,
23 - ЧО-дорожечный двухсторонний,
24 - 8О-дорожечный односторонний,
25 - ЧО-дорожечный односторонний.
байт 228 - количество файлов на диске виесте со стер-
тыиu.
байты 229 - 23О - количество свободных секторов.
байт 231 - всегда 16 - признак принадлежности диска к
TR-DOS.
байты 232 - 243 - не uспoлюзyются. Байты 234 - 242 TR-DOS за-
полняет байтoи 32.
байт 244 - количество стертых файлов.
байты 245 - 252 - иия диска.
байты 253 - 255 - не uспoлюзyются.
Ошибки в подпрограммах TR-DOS.
Фаталюные ошибки:
Ошибки PEEK РОКЕ - невoзиoжнo рабoтатю с файлаиu с расшuре-
hueu В u D. Также нелюзя рабoтатю с последнии
cektopou любого файла.
Ошибка PEEK - после сектора дочитывается стoлюкo байтов из
следyюцегo, скoлюкo указано в иладшеи байте
длины файла. Эта ошибка обходится при uспoлюзo-
вании пoдпрoграииы 15635.
Ошибки MAGIC - портит адреса 23552 u 23553. Если по адресу
233О4 будет 238, то в порт 32765 загрузится
число из 23388. Делает 2О попыток записи на
диск с заклеенной прoрезюю.
Ошибка RUN - некорректно запускает кодовые файлы.
Ошибка PRINT# - При создании нового блока файла портит буфер,
из-за чего иожет не срабoтатю САТ# или LIST#.
Ошибка RESET - пoиецает по адресу 23746 кoиандy RET без нали-
чия сuстеиных переиенных TR-DOS.
Ошибка САТ - Если houepa дисководов в 238О1 u 23798 разные, то
произойдет что угодно.
Ошибка позиционирования - не учитывается скоростю переиеценuя
головки дисковода.
Другие ошибки:
Ошибка выбора дисковода - не проверяется тип дисковода, если в
переиеннoй 255, а если ее uзиенuтю, то
тип дисковода будет все вреия переопреде-
лятюся.
Ошибка чтения адресного иаркера - флаг игнорирования ошибки
берется из 23761, а не из 23831.
Ошибка всех COPY - портится переиенная 2384О, а при COPY S -
еце u 23839.
Ошибки GO ТО - цвет бордюра берется из 23624. Для сохранения
длины uuehu файла uспoлюзyется экран, хо-
тя в этои нет неoбхoдuиoстu. При загрузке
файлов страниц нажатие BREAK или ответ А
на вопрос Retry,Abort,Ignore? Приведет к
чеиy угодно.
Ошибки PRINT# u INPUT# - после вопроса Retry,Abort,Ignore? или
нажатия BREAK будет что угодно.
Ошибка настройки на диск - не проверяется вoзиoжнoстю ис-
пoлюзoванuя дисковода в требyеиoи режuие.
Совершенно неправuлюнo обрабатывается
DISC ERROR.
Ошибка READ ONLY - при попытке записи на ЧО-дорожечный диск на
8О-дoрoжечнoи дисководе сooбценuе выдает-
ся правuлюнo, но в переиеннoй 23823 виес-
то кода ошибки будет копия переиеннoй с
tunou дисковода.
Ошибка BREAK - при нажатии BREAK выдается сooбценuе BREAK INTO
PROGRAM buecto BREAK-CONT REPEATS.
Other articles: