1 Отредактировано Voldemar0 (17-03-2018 20:53)

Тема: DOS File Manager

Привет!

Сегодня  попробовал копнуть самую тёмный и страшный подвал dos3.3: файловый менеджер или, говоря более современным языком, драйвер файловой системы.

Тут есть одна хитрая загогулина: если вызов RWTS - то есть драйвера дисковода - вполне описывался во всей агатовской документации, причем даже без ошибок, то про драйвер файловой системы как-то замалчивали. Вроде есть chr$(4) и нефиг тут сопеть.

Но chr$(4) открывает не все доступные операции. Он, в общем-то, позволяет только читать/писать B и A файлы, причем только целиком, а T-файлы - только побайтово.

А изюминка прямого доступа к драйверу ФС в том, что читать и писать можно любые типы файлов, причем блоками произвольного размера !
Этого нет даже в Школьнице.

В результате прикладные агат-программисты были вынуждены изобретать свой велосипед, основываясь на исходнике ДОС Школьницы или создавая что-то совсем своё.

Пожалуй, единственная прога на семёрке, которая работала с драйвером ФС напрямую - это всем семёрочникам известный FID. Но он тянут с эпла, поэтому не удивительно, что ему весь механизм был известен из эпловской документции. В 90-е я весьма интересовался этой темой (изучением FIDа), но понял только, что там всё страшно и никак не пересекается с агатовской документацией.

Сегодняшние ковыряния привели к любопытной находке: оказывается, в ИКП-ДОС тоже есть API файлового менеджера и, похоже, он почти точно соответствует менеджеру DOS3.3. Но, конечно, не всё так просто: перед обращением ко входным точкам в ИКП нужно сперва перенастроить контроллер памяти. Тут авторы ИКП как-то пропустили всю суть API, как стандарта, не требующего лишних движений и обеспечивающего переносимость программ.
Входных точек всего две: процедура получения вектора на дескриптор запроса и процедура вызова драйвера. Всё точно также как и при вызове RWTS (я думаю, все помнят мировую константу $3D9 ? Это несмещаемая процедура вызова RWTS).

Буду ковырять дальше, .... полагаю, рассчитывать на чью-то параллельную разработку этой темы смысла нет ?

2

Re: DOS File Manager

На Правце я все это копал и пытался пользоваться - у меня был такой "однопанельный" аналог Нортон-командера, правда так до конца и недописанный. Но сейчас я уже просто не помню, чего я там накопал. Помню только свое удивление, когда нашел подпрограмму умножения 8-битного числа на 16-битное, которую команда POSITION использует :) То есть, хотя диски имеют размер 140 КБайт, в ДОСе ограничение на максимальный размер файла около 16 МБайт.

3

Re: DOS File Manager

С правцем проще: там подходит эпловские доки. У нас есть книжка "под яблоней дос", там все описано. А задача в том, чтобы добраться именно до ИКП-шного драйвера.

4 Отредактировано Voldemar0 (18-03-2018 20:33)

Re: DOS File Manager

Всё страньше и страньше. Всё чудесатее и чудесатее.

Я когда-то видел эту ерунду, сейчас разглядел поподробнее.
Смотрите, примерно, по адресам $44a .. $476.

Там много однотипных команд: jsr $400.
Зачем?

Я так думал сперва, что, это специальные такие хитрые вектора для вызова разных функций.
Ну, типа, для переносимости. Т.е. ты в проге пишешь: JMP $45C и у тебя, в любой версии ИКП, вызывается какая-то определённая системная функция.

Примерно то же, что у Эпла было в регионе $3C0..$3FF.

Как бы, можно допустить, ненадолго, что авторы ИКП так как-то и думали. Но получилось как всегда.

1) Доков на эти входные адреса нет.
2) Они различаются : ИКП-7 : от $44A, ИКП-9 : от $476.

Перемещённые неперемещаемые точки входа. Или как бы ещё это вот назвать?

Правда, есть ещё второй такой же регион по адресу $1835. Это радует - он совпадает у семёрки и девятки. Но какие там функции ? Совпадают ли они с $4xx ? Копаем дальше.

-=-

Но этого мало: регион $3C0..$3FF у эпла указывал на адреса в основном ОЗУ либо на дополнительном, но, по дефолту, включенном в нужное состояние. Т.е. ваша прога могла обращаться к этим векторам и получать ответ. То же есть и в Бейсик-60.
В ИКП получилось как-то коряво, например: запрашиваем адрес таблицы параметров драйвера ФС. Нам возвращают, вроде бы, верный адрес, но в регионе памяти, который сейчас отключен. А подключен там другой банк. И значения совсем неверные.
А как включить нужный банк ? А нет такой функции в "стандарте". Т.е. если вызвать сам драйвер, то все переключения происходят, но пока не удалось найти единой функции переключения памяти для ИКП-7 и ИКП-9. Получается, что и пользы от адреса маловато...

-=-

Раскопал назначение части входов в таблицы:

ИКП-7, у ИКП-9 немного сдвинуты выше, но порядок, скорее всего, тот же.
Это досовские функции:

                         C0_FManager:             # Вызов драйвера файловой системы
044A -   20 00 04   "..."   JSR   Enter
                         C0_FManag2:              # Ещё один вход в него же
044D -   20 00 04   "..."   JSR   Enter
                         C0_CoutSCR:              # Вывод символа на экран
0450 -   20 00 04   "..."   JSR   Enter
                         C0_KeyInSCR:             # Ввод символа с клавиатуры
0453 -   20 00 04   "..."   JSR   Enter
                         C0_CallRWTS:             # Вызов драйвера дисковода
0456 -   20 00 04   "..."   JSR   Enter
                         C0_SetVect:              # Восстановление векторов COUT и KEYIN
0459 -   20 00 04   "..."   JSR   Enter
                         C0_qqq:
045C -   20 00 04   "..."   JSR   Enter
                         C0_Exit:                 # Типа как бы тёплый рестарт ДОС
045F -   20 00 04   "..."   JSR   Enter
                         C0_ColdStar:             # Полный перезапуск ДОС
0462 -   20 00 04   "..."   JSR   Enter
                         C0_qqq:
0465 -   20 00 04   "..."   JSR   Enter
                         C0_SysMon:               # Вход в системный монитор
0468 -   20 00 04   "..."   JSR   Enter      <==

А тут блок бейсик-функций (они совпадают между ИКП-7 и ИКП-9):

                         C1_qqq:
1835 -   20 00 04   "..."   JSR   Enter
                         C1_MemSet:
1838 -   20 00 04   "..."   JSR   Enter
                         C1_qqq:
183B -   20 00 04   "..."   JSR   Enter
                         C1_Run:                  # Запуск бейсик-программы?
183E -   20 00 04   "..."   JSR   Enter
                         C1_qqq:
1841 -   20 00 04   "..."   JSR   Enter
                         C1_OnErr:                # Обработчик ошибок (пользовательский или системный)
1844 -   20 00 04   "..."   JSR   Enter
                         C1_Reset:                # Обработчик УПР-СБР
1847 -   20 00 04   "..."   JSR   Enter      
                         C1_NextLine:             # Переход (исполнение?) к следующей строке программы
184A -   20 00 04   "..."   JSR   Enter
                         C1_HardRese:             # Сброс бейсика с очисткой программы ($E000)
184D -   20 00 04   "..."   JSR   Enter
                         C1_qqq:
1850 -   20 00 04   "..."   JSR   Enter
                         C1_qqq:
1853 -   20 00 04   "..."   JSR   Enter

5 Отредактировано Voldemar0 (19-03-2018 19:04)

Re: DOS File Manager

Сегодня подвёл первый итог, заодно сделал крайне неожиданное открытие.

1) Вызвать драйвер ФС можно, это происходит даже идентично в ИКП-7 и ИКП-9. Call $3D6, пока не пробовал, но препятствий в коде не видно.

2) Но добраться до таблицы параметров, которую нужно заполнить, довольно сложно и сделать это идентично для семёрки и девятки всё таки нельзя.
Да, есть процедуры переключения памяти, но в ИКП-7 они сидят по адресам $49A и $4A6 (включить/восстановить), а в ИКП-9 - $E601 и $E613 (Естесно, в банке ДОС, поэтому сперва надо ещё переключить его... Однозначной процедуры включения банка ДОС не нашлось).

В отличие от драйвера дисковода, которому адрес таблицы параметров задаётся извне, у драйвера ФС адрес таблицы прибит намертво гвоздями внутри. И, само собой, она находится в регионе ДопОЗУ, конечно, в банке, который обычно выключен.

И это плохо.

Это значит всё таки придётся делать определение архитектуры и изобретать костыли для каждой архитектуры.

-=-=

Теперь про открытие. Не, не так. ОТКРЫТИЕ!!!

Валялась у нас версия ИКП-бейсика для 140-ок, на семёрку. В общем-то ерунда, мало ли версий. Но я взялся перебирать разные версии ИКП-бейсика с тем, чтобы выяснить, кто как управляет памятью ДОСа и оказалось, что эта самая версия (когда-то она получила условную этикетку 7.3 alpha) имеет совершенно другой механизм управления памятью.

Так же как ИКП -версии она распихивает ДОС и бейсик по ЭмПЗУ, но при этом все таблицы данных ДОС лежат где-то  в самом начале ОЗУ. Т.е. она вообще не использует ДопОЗУ семёрки! Мало того, она ещё и умеет определять его наличие/отсутствие и соответственно корректирует значение HIMEM: бейсика !!!!

Это первая найденная версия ОС для семёрки, которая хоть чуть-чуть допускает мысль, что компу хватит и 64 кб озу! :)

Но и это ещё не всё. Оказалось, что эта версия ДОС-Бейсика почти 1:1 совпадает с той ДОС, которая используется в Системе Численного Моделирования семёрки!
Разница только в том, что в СЧМ есть только ДОС, здесь же есть и бейсик (в абсолютных дорожках).

Вероятно, мелкие отличия в коде как раз определяют объём загрузки - 3 или 6 треков.

И, конечно, возникает вопрос: если уже во времена семёрки была настолько хорошо проработанная версия ИКП-Бейсика (а был ли тогда ИКП?), то на самом ли деле более поздние версии стали лучше ?

Предполагаю только, что в этой версии бейсика строковые константы выводятся "как есть" и, таким образом, на полном знакогенераторе программы Бейсик-60 будут выводить текст строчными буквами (в привычных ИКП-версиях это было устранено).

6

Re: DOS File Manager

Нда. Похоже, что для разработки какого-то нового софта, способного работать и под семёркой и под девяткой, надо начинать с написания собственного ДОСа. Иначе можно будет погрязнуть, исследуя отличия и городя костыли.

7

Re: DOS File Manager

На агате часто так и делали. Но это порождает следующую проблему: как разобраться в различиях этих самых собственных дос...

8

Re: DOS File Manager

avivanov76 пишет:

Нда. Похоже, что для разработки какого-то нового софта, способного работать и под семёркой и под девяткой, надо начинать с написания собственного ДОСа. Иначе можно будет погрязнуть, исследуя отличия и городя костыли.

... собственного ДОСа и менеджера памяти в придачу.

Я в свое время плюнул на универсальность и делал программы отдельно для Агат-9 и отдельно для Агат-7.

9 Отредактировано Voldemar0 (20-03-2018 20:00)

Re: DOS File Manager

> Я в свое время плюнул на универсальность и делал программы отдельно для Агат-9 и отдельно для Агат-7.

А это никак не отменяет необходимости сперва разобраться в отличиях. Хоть агата-7 от 9 хоть специфики осей, разработанных для той или иной машины (коль скоро они отличаются). Именно в этом сложность. А уже допилить динамический выбор работы с аппаратурой или с другими прогами - легко.

Работает же Быстропускалка, две версии уже вышло. Она походу подстраивается под аппаратуру, там даже нет разных версий под 7 / 9. (Правда, поговаривают, что вторая версия не идёт на физической семёрке, только в эмуляторах... Но это я ещё решу, когда нибудь).

10 Отредактировано Voldemar0 (20-03-2018 20:12)

Re: DOS File Manager

Всё, дописал ТЗ для последнего шага в этой теме:


  ДОС в ИКП-версии находится в эмуляторе ПЗУ. В другом банке эмулятора ПЗУ находится Бейсик.
  Возможно, разные версии используют разные банки, особенно на девятке. Чаще встречается 8 и 9 (девятка).
  Указатель на таблицу параметров драйвера файловой системы хранится по адресу $D00E..F.
  Сама таблица находится по адресу $B823 (отличий между версиями не замечено, кроме "СЧМ-версии").
  Разные версии, во всяком случае на девятке, используют разные банки памяти. Чаще встречается C и D.
  Таким образом, при работе ДОС и доступной таблице, состояние банков ОЗУ (как правило):
  7: ДопОЗУ - 09, ЭмПЗУ - E1.
  9: 0 1 2 3 C D 8 9    Language Card: A.

  В Бейсик-60 и ИКП-СЧМ-Бейсике доступ происходит по трём простым шагам: jsr DOS_FMAN_STAB
  (получение адреса таблицы параметров), заполнение таблицы, jsr DOS_FMAN_CALL.

  Для выполнения первого шага в ИКП-ДОС сперва нужно переключить контроллер памяти.

  Семёрка:
  jsr $49a - переключить контроллер
    jsr DOS_FMAN_STAB
    ...      - заполняем таблицу
  jsr $4a6 - восстановить прежнее состояние

  Девятка:
  ldx $497
  sta $c100,x
  sta $c111,x - подключить сегмент с процедурами управления сегментами
  jsr $E601 - переключить контроллер
    jsr DOS_FMAN_STAB
    ...       - заполняем таблицу
  jsr $E613 - восстановить прежнее состояние
  sta $c166
  sta $c177 - возвращаем обратно


  Для того, чтобы определить вид ОС, нужно выполнить следующие проверки:

  Проверки на хорошо известные сигнатуры (допустимо до 2 различающихся байт):
  3F0-  43 FA 5F 04 A1 4C 58 FF  4C 65 FF 4C 65 FF 65 FF        - ИКП-7-СЧМ
  3F0-  48 FA 5F 04 A1 4C 58 FF  4C 65 FF 4C 65 FF 65 FF        - ИКП-7
  3F0-  48 FA 8B 04 A1 4C 58 FF  4C 65 FF 4C 65 FF 65 FF        - ИКП-9
  3F0-  3F FA BF 9D 38 4C 4A FF  4C 59 FF 4C 59 FF 65 FF        - DOS3.3 + Бейсик-60
  3F0-  5F AA 6E 9E 3B 14 9D 93  AA CA 10 FA 4C FB 9D FF        - ALV Super DOS + Бейсик-60

  При совпадении с одной из сигнатур ИКП нужно выполнить уточняющую проверку (требуется точное совпадение):
  Проверка на ИКП-7:
  регион $44a..$46a занят последовательностью 20 00 04
  Проверка на ИКП-9:
  регион $476..$496 занят последовательностью 20 00 04

  При совпадении с ИКП-7: для отличия от ИКП-7-СЧМ нужно проверить байты $49a, $4a6.
  Если они оба равны $48 - это обычный ИКП-7, иначе - ИКП-7-СЧМ.

  Бейсик Серкова проходит как ИКП-9, его можно отличить, но нет смысла, так как
  ДОС у него осталась без существенных изменений.

Теперь нужно ещё будет подобрать какую-то эвристику для того, чтобы отличить BTK от Бейсика и можно будет пилить демку. Ну, это самое простое.

И ещё проверить BioBasic и SubGraph, но они, скорее всего, не будут иметь отличий от ИКП-9.

11 Отредактировано Voldemar0 (07-04-2018 20:42)

Re: DOS File Manager

avivanov76 пишет:

Нда. Похоже, что для разработки какого-то нового софта, способного работать и под семёркой и под девяткой, надо начинать с написания собственного ДОСа. Иначе можно будет погрязнуть, исследуя отличия и городя костыли.

Up: самое главное: любой велосипед под конкретную задачу будет и проверен только с этой задачей. Всё таки когда один и тот же инструмент используют много людей, есть вероятность что рано или поздно баги не будут торчать всесторонне, словно ёжика колючки. Если, конечно, разработчики не будут выпускать ещё более инновационные версии (по просьбам трудящихся), а сосредоточатся только на исправлении ошибок.
Или колючки будут, хотя бы, известны.