Hacker
#07
10 марта 1997 |
|
И опять о ТR-D0Sе - СИСТEМНЫE ПEPEМEННЫE ТR-D0S.
И опять о TR-DOSe. .BIG BRAIN WARL0CK 1б.02.97 Это опять я со своей второй статьей о TR-DOS. Сегодня я расскажу о системных переменных TR-DOS (хотя при выполнении различных команд одни и те же переменные имеют различное значение) и др. ---------------------------------------------------------------- СИСТЕМНЫЕ ПЕРЕМЕННЫЕ TR-DOS. ПРИМЕЧАНИЕ: все числа в десятичной системе счисления. ЕЩЕ ОДНО ПРИМЕЧАНИЕ: в квадратных скобках даны значения при инициализации TR-DOS с диском в дисководе, через | без диска | во время работы. ═══════╦════════════════════════════════════════════════════════ адрес ║ назначение ═══════╬════════════════════════════════════════════════════════ 23734 ║ 15 байт область каналов CHANS ──────╫─────────────────────────────────────────────────────── 23734 ║ 2548,42б4. Канал К ──────╫─────────────────────────────────────────────────────── 23739 ║ 2548,5572. Канал S ──────╫─────────────────────────────────────────────────────── 23744 ║ 39б9,5577. Канал R ──────╫─────────────────────────────────────────────────────── 2374б ║ Байт-201 (код команды RET). Судя по всему используется ║ для вызова функций BASICa из TR-DOS. ──────╫─────────────────────────────────────────────────────── 23752 ║ Байт - режим работы дисковода А. [255|128|131] ║ 23753 ║ - " - " - " - В. ║ 23754 ║ - " - " - " - С. ║ 23755 ║ - " - " - " - D. ──────╫─────────────────────────────────────────────────────── 2375б ║ Номер сектора, выводимого командой САТ [13]. ──────╫─────────────────────────────────────────────────────── 23757 ║ Байт - готовность дисковода (рег.сост. ВГ93) [128,0]. ──────╫─────────────────────────────────────────────────────── 23758 ║ Байт, возможно флаг записи (255)/чтения (0) [0]. ──────╫─────────────────────────────────────────────────────── 23759 ║ 2 байта - адрес W0RKSP при M0VE, C0PY, LIST. ──────╫─────────────────────────────────────────────────────── 237б1 ║ 2 байта - номер строки афтостарта при SAVE BASIC. ──────╫─────────────────────────────────────────────────────── 237б4 ║ Байт - номер стертого файла при M0VE. ──────╫─────────────────────────────────────────────────────── 237б5 ║ Байт - номер сектора стертого файла при M0VE. ──────╫─────────────────────────────────────────────────────── 237бб ║ Байт - номер дорожки стертого файла при M0VE. Для фор- ║ матирования обнулить, по окончании будет число де- ║ фектных секторов (аналогично при проверке дорожки ко- ║ мандой #15). Способ загрузки для команды #0E (рег.А). ║ Если команда не выполнена 255. ──────╫─────────────────────────────────────────────────────── 237б7 ║ 2 байта - адрес. После инициализации указывает на ║ счетчик [23771], после записи C0DE - начальный адрес ║ в памяти. При вызове из BASICa содержит номер строки ║ вызова. При выполнении форматирования 237б7 содержит ║ число дорожек для форматирования, 237б8 флаг проверки, ║ если <> 0, то проверко не производится. ──────╫─────────────────────────────────────────────────────── 237б9 ║ 2 байта - адрес символа для интерпретации, аналогично ║ СН_ADD. После инициализации указывает на [238б9]. ║ После записи C0DE содержит длину записанного файла. ║ При форматировании 23770=128, если дискета двусторон- ║ няя, иначе форматируется только адна сторона. Для ко- ║ манды #0E адрес загрузки. ──────╫─────────────────────────────────────────────────────── 23771 ║ 2 байта - счетчик загрузки, после операций с файлами ║ содержит длину загруженной/записанной части файла. ║ При M0VE содержит текущие номера сектора и дорожки. ║ При LIST байт 23771 содержит текущий канал вывода. ──────╫─────────────────────────────────────────────────────── Дискриптор файла: 23773 ║ 8 байт - заголовок файла 23781 ║ Байт - тип файла 23782 ║ 2 байта - адрес старта для C0DE или полная длина BASIC 23784 ║ 2 байта - длина файла или программной части для BASIC 2378б ║ Байт - объем файла в секторах 23787 ║ Байт - номер начального сектора файла 23788 ║ Байт - номер начального трека файла ──────╫─────────────────────────────────────────────────────── Параметры для C0PY: 23789 ║ 2 байта - адрес 23791 ║ 2 байта - длина 23793 ║ Байт - объем в секторах 23794 ║ Байт - номер начального сектора 23795 ║ Байт - номер начального трека ──────╫─────────────────────────────────────────────────────── 2379б ║ Байт - счетчик загружаемых секторов. После операций ║ загрузки содержит номер следующего сектора. Исполь- ║ зуется для написания загрузчиков моноблоков. ──────╫─────────────────────────────────────────────────────── 23797 ║ Байт-счетчик загружаемых дорожек. После операций заг- ║ рузки содержит номер следующей дорожки. ──────╫─────────────────────────────────────────────────────── 23798 ║ Байт - дисковод для временной операции (0-3).[0]. ──────╫─────────────────────────────────────────────────────── 23799 ║ Байт - при возврате из TR-DOS (15б1б) обнуляется. ──────╫─────────────────────────────────────────────────────── 23800 ║ Байт-дисковод источник при работе с двумя дисководами ║ (0-3) [0]. ──────╫─────────────────────────────────────────────────────── 23801 ║ Байт - тип операции:0-L0AD, 255-VERIFY [0]. При работе ║ с двумя дисководами номер дисковода приемника (0-3). ──────╫─────────────────────────────────────────────────────── 23802 ║ Байт - время перемещения головки дисковода А 23803 ║ - " - " - В 23804 ║ - " - " - С 23805 ║ - " - " - D ║ Если 255 то дисковод не инициализирован, иначе 8. ──────╫─────────────────────────────────────────────────────── 2380б ║ Байт - команда ВГ93. 128 после чтения, 1б0 - записи. ──────╫─────────────────────────────────────────────────────── 23807 ║ Байт - номер сектора+1, задаваемый для ВГ93 DOS. ──────╫─────────────────────────────────────────────────────── 23808 ║ 2 байта - адрес буфера для DOS, в который грузится ║ сектор.Указывает на DOS-CHANS; эта область на время ║ загрузки временно сдвигается на 257 байт.[0|0|23845] ──────╫─────────────────────────────────────────────────────── 23810 ║ 2 байта - временно сохраняется регистровая пара HL. ──────╫─────────────────────────────────────────────────────── 23812 ║ 2 байта - временно сохраняется регистровая пара DE. ──────╫─────────────────────────────────────────────────────── 23814 ║ Байт - количество байт, по которым производится поиск ║ файла в каталоге [9]. ──────╫─────────────────────────────────────────────────────── 23815 ║ Байт - результат M0VE: 0-по files, <>0 - о.k. ──────╫─────────────────────────────────────────────────────── 2381б ║ Байт - первая буква имени файла при M0VE и ERASE. ──────╫─────────────────────────────────────────────────────── 23820 ║ Байт - признак выделения буфера ввода/вывода: 0 - да, ║ 255 - нет [255]. ──────╫─────────────────────────────────────────────────────── 23821 ║ Байт-номер файла при копировании с двумя дисководами. ──────╫─────────────────────────────────────────────────────── 23822 ║ Байт - при 254 сообщения DOS на экран не выводить. При ║ 255 - признак работы BASIC, др. - TR-DOS. ──────╫─────────────────────────────────────────────────────── 23823 ║ Байт - код ошибки TR-DOS при вызове из BASICa, а также ║ номер файла в каталоге при выполнении команды #0А [0]. ──────╫─────────────────────────────────────────────────────── 23824 ║ Старший байт ошибки при вызове 15б1б или 15б35. Необ- ║ ходимо перед чтением файлов записать 0 [0|255]. ──────╫─────────────────────────────────────────────────────── 23825 ║ 2 байта - адрес строки команды TR-DOS [238б8]. ──────╫─────────────────────────────────────────────────────── 23827 ║ 2 байта - адрес, указывает на старший адрес стека, ║ содержащий адрес процедуры обработки ошибок [б5ЗбЧ]. ║ Если старший байт=170, выполняется команда RUN "boot". ──────╫─────────────────────────────────────────────────────── 23829 ║ Байт - режим DOS, при 255 выполняется команда DOS из ║ BASICa, при 0 - работа DOS. ──────╫─────────────────────────────────────────────────────── 23830 ║ Байт - копия системного регистра контроллера (обычно ║ номер дисковода+б0) [б0/44]. ──────╫─────────────────────────────────────────────────────── 23831 ║ Байт - признак инициализации DOS: 0 - при входе в DOS ║ выводится заставка и выполняется команда RUN "boot", ║ 170 - нет (повторный вход) [0/170]. При 255 не дает ║ ошибку при чтении неверного адреса. ──────╫─────────────────────────────────────────────────────── 23832 ║ Байт - равен 255, если подключен Interface 1. ──────╫─────────────────────────────────────────────────────── 23833 ║ Номер дисковода по умолчанию (0-3) [0]. ──────╫─────────────────────────────────────────────────────── 23834 ║ 2 байта - адрес подпрограммы возврата из TR-DOS [710]. ──────╫─────────────────────────────────────────────────────── 2383б ║ 2 байта - сохраняется текущее значение SP. ──────╫─────────────────────────────────────────────────────── 23838 ║ Байт - номер файла в каталоге, если он найден [0]. ──────╫─────────────────────────────────────────────────────── 23840 ║ 3 начальных байта последней командной строки. ──────╫─────────────────────────────────────────────────────── 23843 ║ Байт - объем памяте для M0VE (в блоках, ЧкБ минимум). ──────╫─────────────────────────────────────────────────────── 23845 ║ Байт - начало временного буфера DOS [255]. ──────╫─────────────────────────────────────────────────────── 2384б ║ 20 байт - област каналов CHANS-DOS К,S,R,P;аналогичны ║ стандартным. ──────╫─────────────────────────────────────────────────────── 238бб ║ Байт - разделитель [128] ──────╫─────────────────────────────────────────────────────── 238б7 ║ Начало BASIC программы, если не открывались дисковые ║ файлы. ═══════╩════════════════════════════════════════════════════════ ОБЛАСТЬ СВЯЗИ С ДИСКОВЫМ ФАЙЛОМ Если открыт дисковый файл, то дополнительно выделяется следующая область: ═══════╦════════════════════════════════════════════════════════ адрес ║ назначение ═══════╬════════════════════════════════════════════════════════ 238бб ║ 292 байта - область канала связи с дисковым файлом: ║ 238бб ║ 2 байта - адрес процедуры записи в канал 238б8 ║ 2 байта - адрес процедуру чтения из канала 23870 ║ 1 байт - имя канала "D" 23871 ║ 8 байт - 253,50,5б,48,3б,1,0,84 (только не спрашивайте ║ меня, что это такое я сам не знаю). 23879 ║ 3 байта - 27,00,255 - песледовательный для записи ║ 00,00,00 - последовательный для чтения ║ 27,00,127 - с произвольным доступом 23882 ║ 1б байт - дискриптор файла 23898 ║ 4 байта - 234,58,211,52 (бог его знает,что это) 23902 ║ 25б байт - буфер связи с файлом;содержит текущий фраг- ║ мент 23158 ║ 1 байт - разделитель 128 23159 ║ Начало BASIC программы, если открыт один дисковый файл ═══════╩════════════════════════════════════════════════════════ Чтобы открыть дисковый файл нужно выполнить следующие команды: 10 CLEAR 24999 20 OPEN #4,"NAME",W:REM открыть последовательный файл для записи 10 CLEAR 24999 20 OPEN #4,"NAME",R:REM то же, но для чтения 10 CLEAR 24999 20 OPEN #4,"NAME",RND:REM открыть файл с произвольным доступом Обязательно (!) после работы закрыть файл: CL0SE #4 ---------------------------------------------------------------- И НА ПОСЛЕДОК 0 "MAGIC" "Magic" работает с использовением немаскируемых прерываний. Т.е. при нажатии на эту кнопку контроллер дисковода подменяет ПЗУ на ПЗУ TR-DOS и вырабатывает сигнал NMI. Процессор останавливает выполняемую программу и переходит по адресу #OOбб. Там находится обработчик немаскируемых прерываний. В ПЗУ BASIC допущена ошибка и немаскируемые прерывания там не используются. Обработчик нажатия "Magic" заносит на стек 42 байта (сохраняет значения регистров), и если программа не имеет достаточной глубины стека, то она "Magic"ом не сбросится (например: DCU, UFO2 и множество других, особенно это касается программ написанных в последнее время). Обработчик записывает в сектора 10 и 11 нулевой дорожки 512 байт экрана. В эту область экрана считывается системный сектор и туда же устанавливатся стек. Далее определяется начало свободного места на диске и выгружается все ОЗУ, начиная с экрана в файл с именем "@" и типом C0DE. В поле адреса указывается значение стека (SP). После записи программа восстанавливается так же, как при запуске "@" файла. Процедура обработки "Magic" записывает по адресу 23551 число 201 (скорее всого RET), а в ячейки 23552 и 23553 соответственно 22 и 1б. Некоторые программы через прерывания проверяют эти ячейки. Например "48 IRONS" обнаружив, что ее скинули "Magic"ом сразу начинает форматировать диск. Процедура востановления файла (для TR-DOS версии 5.04Т) выглядит следующим образом: POP AF ЕХ AF,AF' POP AF LD R,А POP AF LD I,А DI LD А,#FF JP P0,LL2ECC LD А,#00 LL2ECC LD (#5С00),А POP AF POP HL POP DE POP ВС EXX ЕХ AF,AF' POP IY POP IX POP HL POP DE POP ВС LD А,(#5С48) AND #38 RRCA RRCA RRCA 0UT (#FE),А LD А,(#5В08) СР #EE JR NZ,LL2EF7 PUSH ВС LD ВС,#7FFD LD А,(#SBSC) 0UT (С),А POP ВС LL2EF7 LD А,(#5С00) 0R А LD А,#С9 LD (#5С00),А JR NZ,LL2F03 EI LL2F03 POP AF JP #5С00 LD А,(#4011) 0R #3С 0UT (#FF),А RET Есть множество програм, которые переделывают "@" файлы в обычные. В них используется примерно такая же процедура востановления, только немного попроще, например так: POP AF LD R,А POP AF LD I,А ЕХ AF,AF' POP AF POP HL POP DE POP ВС EXX POP IY POP IX POP HL POP IX POP HL POP DE POP ВС ЕХ AF,AF' JP P0,LABEL EI LABEL POP AF RET "Magic" файлы запускаются через G0 Т0 "name" C0DE. Если файл не запускается, то попробуйте первую букву имени файла изменить на "$". Дело в том, что процедура "Magic" не может определить режим прерываний IM2 или IM1, и поэтому при загрузке она проверяет первую букву, и если она "$", то включает прерывания IM2. На этом я эту статью заканчиваю. Осталось разобрать форматирование диска и програмирование ВГ93, об этом в следующей статье. Счастливо! ****************************************************************
Другие статьи номера:
Похожие статьи:
В этот день... 10 ноября