Из журнала ZX-Guide#3, Рязань, 03.12.2000 TR-DOS: Level 3.  Basil & AlCo ------------------------------------------ #3D13 с обработкой ошибок.  AlCo На этот раз я поведаю вам о некоторых тонкостях TR-DOS, связанных с написанием системных программ (в которых вроде как обязательно должна использоваться станда- ртная точка входа TR-DOS по адресу #3D13). А Basil напишет о тонкостях, связанных с написанием boot'ов. 1. Смена дисководов. Следует ориентироваться на версию 5.03 как на низшую из распространённых (сейчас у меня она прошита). Способ таков: записываем во все систем- ные переменные, связанные с номером диско- вода, нужное нам значение, и обнуляем для всех дисководов параметр"время перемещения головки"(в TR-DOS 5.03 этот параметр поче- му-то не инициализируется). Способ также хорош тем, что позволяет использовать 26 дисководов (от A до Z).Только я ещё не ви- дел версию TR-DOS, которая бы поддерживала более 4 дисководов... Короче,вот к чему я клоню (это подпрог- рамма из AC Edit v0.48): 2. Собственно драйвер #3D13 с обработкой ошибок. SYSBUF EQU #6000 ;килобайтный буфер INIT ... ;должно быть В САМОМ НАЧАЛЕ LD HL,ONERROR ;? LD (23747),HL ;? по адресу 23746 ... ?стояло RET, а мы ?ставим JP ONERROR EM15635 LD A,195 ;?(чтобы перехваты- LD (23746),A ;? вать ошибки) LD (EMSP+1),SP PUSH BC PUSH DE PUSH HL DRIVE LD A,"A" SUB 65 LD (23833),A ;"д-вод по умолчанию" LD (23798),A ;"д-вод для временной ;операции" OR #3C LD (23830),A ;"копия системного ;регистра" LD HL,#5C00 ;придётся запомнить LD DE,SYSBUF ;сис. переменные в LD BC,#400 ;буфере, иначе после ;No Disk будет облом DI LDIR LD H,L LD (23823),HL ;"код ошибки TR-DOS" ;- рекомендуют обнулять LD (23802),HL ;"время перемещения LD (23804),HL ;головок" POP HL POP DE POP BC LD SP,#5F00 CALL 15635 EMSP LD SP,0 EMQ LD HL,HL4 LD (23746),HL ;снова ставится RET RET ONERROR HL4 EQU $*256+201 LD (ERRDE+1),DE EX (SP),HL ;что это такое хотел LD DE,8020 ;вызвать TR-DOS? OR A SBC HL,DE JR NZ,ERRSP POP HL ;если это вызывалась ERRDE LD DE,0 ;проверка на BREAK, SCF ;то возвращаем ему, RET ;что BREAK не нажат ERRSP LD SP,0 ;это уже не BREAK, LD HL,SYSBUF ;а кое-что похлеще... LD DE,#5C00 LD BC,#400 DI LDIR EI CALL DEPKFNT ;производятся всякие LD HL,SAVERR ;действия,связанные с CALL WINDTXT ;обработкой ошибок CALL IYPWINQ ;(вывод окошка CALL EDUPAGE ;с ошибкой OR A ;и т.д.) RET Пользуются ею так же,как и обычным CALL 15635.Только в (ERRSP+1) перед вызовом ну- жно записать регистр SP.Или,возможно,SP+2. Или SP-2. Зависит от уровня вложенности и от того,куда вы хотите попасть после обра- ботки ошибки. 3. Командная строка. В журнале Adventurer #5 писали, что ко- мандную строку TR-DOS нельзя использовать, поскольку она затирается... TR-DOS при запуске BASIC-файла стирает первые 7 символов командной строки и заме- няет их на 0D,80,00,00,40,5D,00.(При запу- ске кодовых файлов она не затирается сов- сем). Для использования в программах я бы рекомендовал следующий формат командной строки: RUN "name",param После имени файла (кстати, не менее 3 букв) следует запятая - потому что так бу- дет больше похоже на формат остальных ко- манд TR-DOS, и,к тому же,системе наплевать на всё то,что написано после запятой. Опыт использования командной строки без разде- лителей был произведён Бобом Клубовым в программе "VIEW ZXW" (1996 г, приложение к журналу ZX-News #3). Это не есть рулез,так как, встретив после имени файла один из следующих символов: ", #, -, +, *, /, (, <, =, >, CODE, DATA, TR-DOS отказывается исполнять командную строку. Впервые командная строка использовалась вроде бы в Z00LOOK'овской версии ECHOLOGY. То,что сделано в INSULT,трудно назвать оп- росом командной строки. ------------------------------------------ Пишем boot...  Basil Как включить 48-ой Basic со 128-ой памятью? Это по правде делается очень просто: DI LD IY,23610 LD HL,4867 PUSH HL LD (23613),SP LD HL,(23631) LD DE,15 ADD HL,DE LD DE,5566 EX DE,HL LD BC,4 LDIR RES 4,(IY+1) LD HL,7030 PUSH HL IM 1 EI LD HL,10072 EXX RET Теперь смело можете выходить в Basic (род- ной - 48-ой) и радоваться 128-ой памяти. Выход в 128-меню Basic'а: XOR A LD BC,32765 OUT (C),A RST 0 Очистка 48-ой памяти и запуск boot'а: LD HL,71 PUSH HL LD H,L JP 15663 или LD HL,0 PUSH HL JP 15663 А теперь уникальная процедура, которые многие ищут,теряют,находят вновь...да нет, ребята, я не про любовь, а про процедуру запуска Basic файлов (для 48-128кб) из ма- шинных кодов: ORG #XXXX LD HL,#YYYY ;16 BYTES INFO LD DE,23773 ;ABOUT LD BC,16 ;BASIC FILE. LDIR LD A,#C9 LD (23746),A LD HL,RNBASIC PUSH HL LD DE,23448 LD BC,END_COD-RNBASIC LDIR LD HL,10072 ;ДЛЯ EXX ;ВЫХОДА LD IY,23610 ; В IM 1 ;BASIC. EI RET RNBASIC DISP 23448 LD HL,23867 LD DE,23868 LD (HL),0 LD BC,41668 LDIR ;ОЧИСТКА 48-Й ПАМЯТИ LD A,#38 ;PAPER 7 LD (23693),A ;& INK 0. LD (23624),A ;И ДВЕ НИЖНИЕ СТРОКИ ;ЭКРАНА ТАКИЕ ЖЕ. LD BC,65167 ;CLEAR 65167 ДЛЯ CALL 7863 ;МАКСИМАЛЬНО ДЛИННЫХ ;ФАЙЛОВ. LD HL,4867 ;ПОДКЛЮЧЕНИЕ PUSH HL ; LD (23613),SP ; LD HL,(23631) ;48-ГО LD DE,15 ; ADD HL,DE ; LD DE,5566 ;BASIC'А EX DE,HL ; LD BC,4 ; LDIR ;СО 128-ОЙ RES 4,(IY+1) ; LD HL,7030 ; PUSH HL ;ПАМЯТЬЮ. LD HL,RNBAS2 PUSH HL LD HL,10608 ; PUSH HL ; LD HL,10528 ; PUSH HL ;ЗАГРУЗКА. LD HL,10570 ; PUSH HL ; JP 15663 ; RNBAS2 LD HL,(23649) LD A,(HL) DEC HL LD L,(HL) LD H,A LD (23618),HL ;СТРОКА АВТОСТАРТА XOR A ;ВЫПОЛНЯЕТСЯ С LD (23620),A ;1-ОЙ КОМАНДЫ. RET ENT END_COD P.S. Эта процедура сама загрузит и запус- тит Basic файл. Для ускорения процесса нужно перед запуском этой проги передви- нуть головку на трек запускаемого Basic'а (через #3D2F). P.P.S. Эта процедура запустит любую 48-ю прогу, кроме той,которая проверяет наличие страниц памяти или защелку порта #7FFD и назло не запускается,или той,которая,непо- нятно для чего, использует порт #FD. Проверка диска в дисководе: DISK_CP LD A,#C3 LD (23746),A LD HL,DSK_CP2 LD (23747),HL LD HL,#2FC1 CALL DOS LD A,8 LD L,#C3 CALL DOS LD (STK),SP LD D,0 LD HL,#2740 CALL DOS DSK_CP2 LD SP,0 STK EQU $-2 LD HL,#1FF3 CALL DOS LD L,#EB CALL DOS LD HL,#2FBC CALL DOS LD A,(23757) AND 64 LD (VARPROT),A RET DOS PUSH HL JP #3D2F Объясняю: вообще-то проверка диска в дисководе - это проверка на наличие защиты у диска. (Ред: можно комбинировать с про- веркой индексного отверстия) Проверка для незащищенного диска проис- ходит так: 1) Диск в дисководе - защита отсутствует; 2) Диск вынимается (индикатор определяет) - диск защищен; 3) Диск вынут - диск не защищен; 4) Диск вставляется - диск защищен; 5) Диск вставлен - диск не защищен. У защищенного так: 1) Диск в дисководе и диск вынимается - определяется как одна фаза: диск защищен; 2) Диск вынут - диск не защищен; 3) Диск вставляется и диск вставлен - определяется как одна фаза: диск защищен. Сразу, как только загрузилась с диска ваша прога с этой проверкой, надо опреде- лить - сколько фаз требуется для этого ди- ска (диск может быть защищенным или неза- щищенным). Вообще-то, вы, наверное, и сами видели программы с некорректной проверкой диска в дисководе. По правде сказать, здесь есть только (только!!) два правильных варианта: 1) Считывание каталога с диска сразу при первом же изменении для защищенного и при втором для незащищенного диска (чтобы счи- тывание у обоих дисков происходило одина- ково - когда диск полностью отсутствует в дисководе); 2) Считывание каталога при втором измене- нии для защищенного или при третьем для незащищенного диска (каталог считывается, как только начинают вставлять новый диск). Вариант 1: ( вариант 2 - то же самое, только вместо "LD A,2" должно стоять "LD A,3" ) INIT CALL READING CAT. CALL DISK_CP LD A,(VARPROT) ;В СЛУЧАЕ ЗАЩИТЫ. LD (VARPROT+2),A AND A LD A,2 JR Z,NO_PROT ;Z - НЕ ЗАЩИЩЕН. DEC A NO_PROT LD (COLFAZ),A ;КОЛ-ВО ФАЗ. ZAMOK CALL DISK_CP VARPROT EQU $+1 LD A,0 CP 0 JR NZ,DALEE LD (VARPROT+2),A COLFAZ EQU $+1 LD A,0 DEC A LD (COLFAZ),A JR NZ,DALEE JP INIT DALEE Это может быть опрос клавиш или что-то еще, в конце переходит на "ZAMOK" ... ... ... JP ZAMOK TurboMonoLoader & Loader with Int. ORG 25000 DI LD B,160 LD HL,26000 R_FROM LD DE,0 NXT_TRA LD C,D LD A,(23833) AND 3 OR #2C SRL C JR C,$+4 OR 16 LD IX,8179 ;OUT (#FF),A CALL DOS LD A,C LD C,#7F LD IX,10835 ;OUT (C),A CALL DOS LD A,#18 LD C,#1F CALL DOS LD A,E INC A LD C,#5F CALL DOS PUSH BC PUSH DE READSEC PUSH HL LD A,#80 LD C,#1F LD IX,10835 ;OUT (C),A CALL DOS LD BC,#017F LD IX,16343 CALL DOS POP HL DJNZ READSEC POP DE INC H LD A,E INC A AND #0F LD E,A JR NZ,$+3 INC D POP BC DJNZ NXT_TRA LD (R_FROM+1),DE RET DOS PUSH IX JP 15663 В данном варианте этот loader будет ра- ботать как turbo, если диск форматирован с нужным для вашего дисковода смещением (у Teac - 02, у Robotron - 00, а у вашего ти- рана может быть до 04),а прерывания запре- щены.Но если разрешить прерывания - ничего страшного,эта прога будет и с ними коррек- тно работать,как и процедуры по прерывани- ям, только, правда,турбы вы не увидите,тем более, чем больше тактов занимает прерыва- ние, тем медленнее считывание. P.S. Если этой проге встретился ERROR'ис- тый сектор,то она будет его считывать,пока не считает. Если считать невозможно, то ее можно остановить сбросом компьютера с ка- кой-нибудь вышки или отключением электри- чества в вашем районе. ------------------------------------------