╔══════════════════════════════════════════════════════════════╗ ║ IS-DOS. ║ ╙──────────────────────────────────────────────────────────────╜ To : All From : Jason (500:95/462.18@ZXNet) Cc : всем, кто считает subj тормозом. Subj : is'dos ───────────────────────────────────────────────────────────── Привет, All! После долгого и занудного ковыряния исдоса майден способ исправить глюк в терминалке под CDOS модем. Напомню, что при попытке удалить нижний резидентный уро- вень zx_lpro, или при попытке добавить/удалить другие драйве- ры/резиденты система висла (сбрасывалась). Попробуйте сами: запустите терминалку, выберите скорость, и выйдите обратно в оболочку. А теперь удалите какой-нить ре- зидент. Зависнет/не зависнет - вопрос случая. Под словом "резидент" далее понимается любой из файлов: cdos1200.res cdos900.res cdosбO0.res Все сказанное в равной мере применимо к любому из них. Для начала немного теории: ────────────────────────────────────────────────────────────── Резидентная задача - программа, обращение к которой явно состоит из двух (трех) этапов: 1. Установка (загрузка) в память с диска, настройка на адрес и инициализация. 2. Основная работа 3. Удаление задачи из памяти 1-ый и 3-ий этапы осуществляются процедурой SET.com. Она же создает 18-байтовый канал, описывающий резидент. Структура резидентной задачи: ┌─────── смещение от начала │ ┌── длина │ │ 0 2 Адрес процедуры инициализации. Она вызывается при ее перемещении (A=#FF) или удалении (A=#FE) программой SET.com. Если #0000, то не вызывается. Эта программа должна подключать, если это необходимо, резидента к це- почке прерываний или к другой программе, перехватывать рестарты и восстанавливать их. 2 2 Адрес главного входа, т.е. процедуры запуска по имени /exebat(#44), run(#48)/ или по номеру канала /exe- res(#53)/. Если #0000, то запускается с 4-го байта. 4 R Тело задачи (структура произвольная). R+4 2 #FFFF - разделитель R+6 2n таблица настраиваемых адресов - 1. Смещения от начала вычисляются по LSA. Единица вычитается для пущей прос- тоты настраивания таких команд как: CALL, JP, LD HL, LD A,(nn), наиболее часто встречающихся в программе. ─────────────────────────────────────────────────────────────── Не стану объяснять про структуру резидента и механизм пе- ресчета адресов при установке/перемещении драйверов, но суть глюка в том, что в таблицу настраиваемых адресов затесался лишний адрес, из-за чего система пересчитывает адрес инсталля- ции, который изначально выключен (равен #0000). Таким образом он становится не равным #0000, и при последующих перемещениях резидента система делает CALL на этот самый не равный нулю ад- рес, значение которого труднопредсказуемо. K счастью, лишний настроечный адрес оказался в удобном месте, а именно в последних двух байтах резидента, поэтому ле- чится всё достаточно просто. Суть: надо укоротить резидент на 2 байта. 1-й способ: -перенести резидент в TRDOS и любым диск-доктором исправить длину (в каталоге на 0-й дорожке) с #058B (1419) на #0589 (1417) байт. -перенести резидент обратно в ISDOS, старый при этом удалить. 2-й способ (нужен диск-монитор demon.com): -поставив курсор на каталог CMODEM войти в монитор (по горя- чей клавише). -опять же, исправить длину файла с #058B на #0589. Все это проделать над каждым из трех резидентов: cdos1200.res cdos900.res cdosбO0.res Все они имеют одинаковую длину (1419 байт), и близки по структуре. ══════════════════════════════════════════════════════════════ (C) EVP-SOFT Всем привет. Сегодня я расскажу как сделать пакет IS-MODEM бо- лее удобным в использовании. Для начала укоротите на 2 байта длину резидентов скорости, как это сделал Jason (см. выше). А затем перепишите bat-файлы, они должны выглядеть вот так: Q:MODEMCMODEM1200.bat ┌───────────────────────────┐ Q:RESset Q:MODEMCMODEMcdos1200.res zx_lpro /r Q:RESset Q:MODEMCMODEMtrubka.res /r @trubka Q:MODEMmodem.com zx_lpro.res └───────────────────────────┘ Q:MODEMCMODEM900.bat ┌───────────────────────────┐ Q:RESset Q:MODEMCMODEMcdos900.res zx_lpro /r Q:RESset Q:MODEMCMODEMtrubka.res /r @trubka Q:MODEMmodem.com zx_lpro.res └───────────────────────────┘ Q:MODEMCMODEMбO0.bat ┌───────────────────────────┐ Q:RESset Q:MODEMCMODEMcdosбO0.res zx_lpro /r Q:RESset Q:MODEMCMODEMtrubka.res /r @trubka Q:MODEMmodem.com zx_lpro.res └───────────────────────────┘ Q:MODEMCMODEMemodem.bat - удаляет резиденты ┌───────────────────────────┐ Q:RESset trubka.res /e Q:RESset zx_lpro.res /e └───────────────────────────┘ и наконец стартовое меню - Q:MODEMCMODEMmodem.mnu ┌───────────────────────────┐ K/T0/A5/C38/B20/K%00101000/J%01001110 a ┌────────────┐ a │CDOS - модем│ a └────────────┘ a Port 239(#EF) A Продолжить связь H Если скорость уже выбрана. CQ:MODEMmodem.com zx_lpro.res A Скорость 1200 бод HСтандарт.При неудаче снизить скорость CQ:SHELLexebat Q:MODEMCMODEM1200.bat A Скорость 900 бод H Только для ZX при хорошей линии. CQ:SHELLexebat Q:MODEMCMODEM900.bat A Скорость 600 бод H Стандарт. CQ:SHELLexebat Q:MODEMCMODEMбO0.bat A Удалить резиденты Hzx_lpro.res, trubka.res CQ:SHELLexebat Q:MODEMCMODEMemodem.bat A Повесить трубку H LD BC,#OOEF : OUT (C),B : RET CQ:MODEMCMODEMtube_d.com A Выход H C └───────────────────────────┘ Отличия в том, что утилита set.com используется с ключом /r, за счёт этого она вызывается два раза вместо четырёх. Также не ис- пользуется rmodem.bat - теперь modem.com грузится напрямую, не вызывая лишний раз exebat.com, ну и memo_ips.com - набор номера - абсолютно ненужен, т.к. автодозвона в memo_ips нет, да и сер- вер в IS-MODEM'е отсутствует. Файл tube_d.com состоит всего из 6 байт: #01,#EF,#00,#ED,#41,#C9; start address: 26000. Если у вас есть кнопка "MODEM RESET", то строки загрузки и инициализации резидента trubka.res можно убрать, ведь он нужен только чтобы при трёхкратном нажатии клавиши "#" (SS+3) вешать трубку на мо- деме. ══════════════════════════════════════════════════════════════ (C) Jason Frost И еще вот такое интересное наблюдение: Subj: новый Floppy Disk driver необходим !!! Может у кого готовый есть? Найден способ сильно ускорить дисковые операции с дисково- дом в исдосе. Дисковый драйвер sys_driv.blk содержит немало тормозов и задержек. Кстати, под определение турбодрайвера он не подходит, т.к. работает не через порты ВГ, а использует подпрограммы TRDOS. Имеются и другие тормоза. Надо _обнулить_ байты +31 и +32, (см. приложение), которые их создают. Первый отвечает за задержку перед чтением сектора, а второй за часто- ту шаговых импульсов дисководу (т.е. за скорость перемещения головки), начальные значения 2 и 8, чем они больше, тем мед- леннее. Судя по всему, драйвер делался под старые дисководы, кото- рых сейчас почти не осталось. У меня дисковод (5313) летает как ласточка (или мне так кажется), и я вполне им доволен. Недостаток один: нули в этих ячейках держатся до первой инициализации :(. А значит - очень недолго. Надо новый драйвер клеить, однако. Дабы работал он по принципу турбодрайвера в TRDOS, т.е. напрямую через порты ВГ. Установить его вместо старого несколько проблематично, т.к. после удаления старого новый будет нечем ставить, но воз- можно. У меня подобный трабл был при установке драйвера винта вместо дисководного. Надо поставить в систему _второй_ диско- вый драйвер, (неважно какой, можно хоть с электронного диска переустановиться) и перевесить все устройства на него (через dev.com и менюшкой по кнопочке 9), потом отключить старый от всех устройств (программой dev.com), и старый удалить. Новый ставится в систему стандартными средствами, set sysdriv+.blk /r например. Тут самая главная тонкость: драйвер в канале #F8 является системным, и просто удалить его нельзя. Можно удалить только с одновременной заменой, на что и указывает ключик /r. Драйвер обязательно должен встать в канал #F8. Потом на вновь установленный надо перевесить все те устройства, что были на старом. Промежуточный драйвер можно удалить. Полученное ядро можно сохранить и подключить к загрузчику стандартными средствами, через sv.com (или syssave.com) и con.com. ┌──────────────────────────────────────────────────────┐ │ ПРИЛОЖЕНИЕ 4. Структура тела дискового драйвера │ │ (S:SYSTEMINIsys_driv.blk) │ │ │ │ смещ имя длина комментарии │ │ ение │ │ │ │ 0 INSTL 2 Адрес процедуры (АП) инсталляции │ │ (если 0, то не нужна) │ │ 2 BREAD 2 АП чтения / dread(#D)/ │ │ 4 BWRIT 2 АП записи / write(#E)/ │ │ 6 BINIT 2 АП инициализации / binit(#F)/ │ │ 8 SCCSR 1 Регистр состояния │ │ 9 DRCSR 1 Reructp состояния (см.ПРИЛОЖЕНИЕ 6.) │ │ 10 OFIM2 2 Смещение от начала драйвера до кода IM2│ │ (если 0, то при выходе IM 2 │ │ принудительно не устанавливается │ │ 12 TPSYS 1 тип TR-DOS'а (0/1) │ │ 13 QRDWR 1 Число попыток чтения/записи │ │ 14 TMBUF 2 Адрес буфера драйвера │ │ │ │ 20 2 Номер тек. сектора в буфере драйвера │ │ │ │ 30 1 Тип дисковода. Биты(0/1): │ │ 0 - 40/80 дорожек │ │ 1 - 1/2 стороны │ │ 31 TMWT 1 Задержка начала чтения сектора │ │ 32 HTIME 1 Время перемещения головок дисковода │ │ 33 1 Тип диска. Биты(0/1): │ │ 0 - 40/80 дорожек │ │ 1 - 1/2 стороны │ │ 34 1 Размер сектора: │ │ 1/2/4: 256/512/1024 байт │ │ 35 1 Количество секторов на дорожке │ │ 36 16 Таблица номеров секторов на дорожке │ │ │ │ Байты 8..15(8) хранятся в канале и в векторе бл. │ │устройства (см. ПРИЛОЖЕНИЯ 6,7) │ │ Байты 33..51 описывают диск и соответствуют байтам│ │23..25 и 64..79 в 0-ом блоке описателя устройства. │ │ binit(#F) сам настраивает драйвер на iSDOS-диск. │ │ Для настройки драйвера на нестандартную дискету │ │ (TR-DOS, MS-DOS и т.п.) проинициализируйте эти байты.│ └──────────────────────────────────────────────────────┘ Данные для точек входа: 13(0D):dread - Чтение с устройства. B - число бл. DE - номер бл. HL - адрес в памяти. 14(0E):write - Запись на устройство. B, DE, HL - аналогично dread. 15(0F):binit - Переход на процедуру инициализации драйвера блочного устройства. Необходима при первом обращении к новому блочному устройству ( например к каждой новой дискете ). Выход с обр. ош. Jason. --- is-edit 4.12 * Origin : ...Altering The Future... (500:95/462.18)