╔══════════════════════════════════════════════════════════════╗
║ 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)
Other articles: