Proton #18
27 января 1998

IS-DOS - Способ исправить глюк в терминалке под CDOS модем и способ сильно ускорить дисковые операции с дисководом.

╔══════════════════════════════════════════════════════════════╗
║            IS-DOS.             ║
╙──────────────────────────────────────────────────────────────╜
To   : All
From : Jason (500:95/462.18@ZXNet)
Cc   : всем, кто считает subj тормозом.
Subj : is'dos
─────────────────────────────────────────────────────────────

                Привет, All!
    После  долгого  и занудного ковыряния исдоса майден способ
исправить глюк в терминалке под CDOS модем.
    Напомню,  что  при попытке удалить нижний резидентный уро-
вень  zx_lpro, или при попытке добавить/удалить другие драйве-
ры/резиденты система висла (сбрасывалась).
    Попробуйте  сами: запустите терминалку, выберите скорость,
и  выйдите обратно в оболочку. А теперь удалите какой-нить ре-
зидент. Зависнет/не зависнет - вопрос случая.


    Под словом "резидент" далее понимается любой из файлов:
cdos1200.res
cdos900.res
cdos600.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
cdos600.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:MODEMCMODEM600.bat
┌───────────────────────────┐
Q:RESset Q:MODEMCMODEMcdos600.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:MODEMCMODEM600.bat
A Удалить резиденты
Hzx_lpro.res, trubka.res
CQ:SHELLexebat Q:MODEMCMODEMemodem.bat
A Повесить   трубку
H LD BC,#00EF : 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.  Cтруктура тела дискового драйвера     │
│                 (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  Rегистр состояния (см.ПРИЛОЖЕНИЕ 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)



Другие статьи номера:

Список BBS - Обзор сетевых новостей.

Астрология - Астрологический прогноз на предстоящую неделю.

Психология - Является ли число секретным кодом судьбы ?

IS-DOS - Способ исправить глюк в терминалке под CDOS модем и способ сильно ускорить дисковые операции с дисководом.

Кодинг - Разбор опечаток из предыдущей статьи...

Реклама - Реклама и объявления.

От авторов - Редакция.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Сайт - "Zемфиpа".
Проба пера - "Спайк в Тронсильвании" (новелла к игре).
Вокруг света - Intel: скептики опять ошиблись?

В этот день...   21 мая