1 Отредактировано Voldemar0 (01-04-2018 15:32)

Тема: The Best Tool Kit и все, все, все...

Привет!

На сегодня у нас на рассмотрении весьма занимательная операционка - Best Tool Kit.
И всё, что с ней связано.

Это не совсем обычная операционка. Она возникла как каркас или небольшая прослойка для  компилятора ассемблера, но затем долго и хитро развивалась разными авторами. Не подковыривалась и подпиливалсь, а, порой, существенно переписывалась. У неё было довольно необычное назначение: переделка эпловских программ под Агат. В общем, этакий развитый отладчик. Но затем она развилась до вполне себе самостоятельной ОС (по агатовским меркам).

Во времена реального Агата мне почему-то так и не довелось встретится с ней. Так же как и с ИКП. Я не знал об их существовании, а те, с кем я обменивался программами, видимо, считали эти пакеты абсолютно доступными всем и как-то не упоминали даже на сессиях обмена дискетами. Поэтому сейчас я, хоть немного, хотел поковыряться в ней. Результаты изложу в виде истории развития этой системы.

-=-=

Началось всё, как это было нередко на Агате, с группы Виталия Цикозы. Он включил в ОС Школьница Диалоговый Отладочный Комплекс, который состоял из:
1) компилятора ассемблера,
2) текстового редактора,
3) небольшой дисковой ос (я бы сказал - это был, практически, чистый драйвер файловой системы, без излишеств),
4) драйвер дисковода 140-ки,
5) немного расширенного сисмона.

ДОК работал на семёрке, развивался примерно с 86 по 88 год.
Что там дополнялось/исправлялось - никто не знает.
Я видел примерно такие версии Школьница (и ДОК - у них был общий указатель версий):

"Версия 2, 1985 год",
"20.08.86" - отсюда начинаются Версии 3, похоже, эта версия под какую-то нестандартную семёрку,
"24.08.86" - возможно, то же самое,
"17.10.86" - весьма популярная версия,
"08.03.88" - похоже, последняя для 140ок.
"ИHЖEHEPHЫЙ BAPИAHT  BEPCИЯ 1.3.2" - подозреваю, что это чья-то частная переделка.
В чём разница между версиями системы - неизвестно.
Однако документированный программный интерфейс, насколько мне доводилось им пользоваться, совпадает между 86 и 88 годами.

Дальше РАПИРА и ДОК развивались отдельно. А может РАПИРА и совсем не развивалась - не знаю.


ДОК в составе Школьницы попал из Новосибирска в Москву и там А. Голов, по просьбам программистов Агата, взялся вытащить из него Отладочной комплекс в виде отдельной программы (без Школьницы). Это было необходимо по двум причинам: убрать паузу меню загрузки и освободить значительную часть диска - Школьница занимает на 140ке чуть меньше половины объёма. Отдельно взятый ДОК - меньше 20%.
А. Голов выпустил свою работу под названием "Агат-Ассемблер". Существует две его версии:
87 и 88 года.
Дополнений у Агат-Ассемблера, по сравнению с ДОК, не много, но они существенны:
1) макросы клавиатуры,
2) поддержка принтера в отладчике,
3) доработанный компилятор ассемблера, позволяющий компилировать бинарники гораздо большего объёма, чем ДОК.


Существенной проблемой ДОК была не совсем удачная организация памяти (она диктовалась РАПИРой) и довольно слабый драйвер файловой системы (ДОС), который поддерживал только К- файлы (по командам отладчика [RUN / [LOAD / [SAVE ) и ... Ну он ещё мог работать с произвольными файлами (загрузить / сохранить), но команд отладчика для вызова этих функций не было.


Тогда А. Голов взялся за разработку собственной системы. Он практически отказался от кода ДОК и переписал всё с нуля. В то же время сохранив синтаксис командной строки и логику работы отладчика. Новая система называлась (пока что) "Агат-Отладчик". Дело происходило на семёрке, примерно в конце 1987 года.

Агат-Отладчик поддерживал чтение/запись B-файлов, практически весь свой код хранил в эмуляторе ПЗУ, таким образом оставляя свободным регион почти от начала базового ОЗУ ($1800) до $BFFF - тем самым делая достаточно лёгким чтение, модификацию/адаптацию и запись здоровых эпловских игр.

Также в Агат-Отладчик были встроены ряд новых средств: посекторный копировщик дисков, быстрый просмотрщик ОЗУ и посекторный редактор диска.

Где-то в районе 1989 года у А. Голова появился свежий 840кб дисковод и контроллер к нему. Это было здорово и возникла идея, а может даже потребность, поддержать его в Агат-Отладчике. Но к тому моменту в этой программе накопилось уже много проблем архитектурного порядка и поэтому было решено писать всё почти с нуля.

Так возникла Best Tool Kit. Она существовала примерно в 3-4 версиях, все они датировались 89 годом (Я видел 89.0, 89.2, 89.3. Наверное, где-то есть ещё 89.1).

Кроме прочего в BTK появилась такое понятие как "резидент" - это программа, записанная в специальном формате, которая загружается в ОЗУ и может быть в любой момент вызвана. Можно многократно переходить между отладчиком BTK и резидентом. Но одновременно можно было держать в ОЗУ только один резидент.

Немаловажно, что А.Голов снабжал BTK очень хорошей документацией, описывающей не только работу в комстроке отладчика, но и архитектуру системы: программный API, структуру загрузочного диска, карту ОЗУ и даже объяснял, как можно скопировать BTK.

BTK была мощной и весьма распространённой системой: практически невозможно встретить коллекцию дисков (кроме моей, ага), не включающую в себя ту или иную версию Best Tool Kit.

Однако у А.Голова были дальнейшие планы по её развитию. Следующая версия системы - The Revolution. Мне не удалсь найти точных данных о причинах её появления и отличиях, документации к ней не существует. Известно только, что она не была закончена, а основными (или одной из значимых) целями её разработки была динамическая поддержка больших объёмов ОЗУ (включая нестандартные модули ДопОЗУ семёрки - такие были у ключевых разработчиков Агата) и поддержка подкаталогов. Наши раскопки показали, что существовало минимум две "режиссёрских" версии этой системы: "01.0" и "90.0".

Мне точно неизвестно, почему А.Голов ушёл от дальнейшего развития этого направления. Предполагаю, что он увлёкся разработкой полноценных ОС и/или счёл, что необходимые возможности достигнуты или - вообще - необходимость в них уже исчезла (хватить адаптировать эпловские проги, пора писать свои !).

Так или иначе, но дальнейшее развитие BTK перешло к другим людям.

Первое, существеннейшее, что нужно было сделать - перенести BTK на девятку.

Здесь начинается странная суета. Судя по всему, переделку выполнили некто  "Master&Forward". Дисков с их подписью встречается довольно немало. Но так же встрачались диски с подписью "Petruhin". Сложнее то, что эти версии имели номера, что были у А.Голова, причем иногда можно было встретить диск, по содержимому соответствующий одной версии, но маркированный другим номером версии.

Судя по шедшей на дисках документации, этими именами себя обозначили
А.Кобозев и Н.Николаичев. Хотя, вероятно, в работе участвовало большее число людей.

BTK для девятки попадалась мне в следующих вариантах: 89.2, 89.3, 92.9, 92.10, 92.11 и 93.5 (посекторно почти совпадает с 89.2).

Насколько я понимаю, 89.x - это только адаптация под девятку, в то время как 92.x - это несколько доработанные версии. Доработки мигрировали также и обратно на семёрку в виде версии, подписанной "Мастер &", причем в заставке указаны одновременно "1992" и версия "90.08".

В документации встречается странный "баг": в заголовке указано: "ВЕРСИЯ 89.2", в то время как в первом же абзаце: "В данном документе описывается версия системы 92.9". При загрузке с этого диска выводится номер версии "92.10". Та же комбинаторика встречается и на диске с версией "92.9": тут в первом абзаце упоминается версия "92.8".

Судя по шедшей на дисках документации, версии 9x.xx отличались следующим : поддержкой подкаталогов и виртуального диска. Т.е. направление развития было то же, что и The Revolution. Однако если Revolution адаптировалась под различные объёмы дополнительного ОЗУ (как по количеству модулей так и по их объёму), то BTK-9 работала только с ДопОЗУ девятки, причем только с одним экземпляром.

Затем, как это обычно бывает, система очередной раз переросла саму себя. Авторы доработок сочли, что будет проще все переписать, чем продолжать пилить существующую версию. Переписанную версию назвали "The BEST".

Сложно сказать, сколько было переписано с нуля, а сколько взято от BTK, но если взглянуть, например, на какой нибудь регион в ЭмПЗУ, то видно, что код 89.0/7, 89.2/9 и 92.9/9 почти не отличается один от другого (может чуть-чуть сдвинут между /7 и /9, в то время как в The BEST 5.4/9 он совсем другой.

"The BEST" встречалась только для девятки, в следующих версиях: 93.0, 5.x "Мастер & Кo", 5.0, 5.3, 5.4. В версии 5.x номер версии изображён в виде ascii-art, поэтому я не вполне уверен, что именно там написано, хотя это похоже на 5.0. Но есть и версия 5.0, где цифры написаны обычным текстом, ... так что я опять не знаю - чей это мод и какая версия всё таки скрывается под 5.x. Посекторно она больше похожа на 93.0, чем на 5.0.

Но было ещё одно изменение в The BEST, да и в переделках на девятку, о котором как-то особо не писали в документации: существенно увеличилось количество документированных входных точек. Т.е. расширялся API. Я даже себе табличку небольшую слепил:

23b     26b     s16     AO  xx.x       - Агат-Отладчик
23b     26b     s16     AO  88.0
23b     27d     s22     AO  89.1

271     2e9     s40
7: BTK 89.0, 89.3, 89.2, 90.8           - BTK
9: BTK 89.2, 89.3, 92.9, 92.10, 92.11


27a     30d     s49     Rev 01.0        - The Revolution
27a     30d     s49     Rev 90.0


265     301     s52     The BEST 5.?, 93.0
25f     301     s54     The BEST 5.0, 5.3, 5.4
268     304     s52     BTK.FIL         - The BEST в виде файла, версия неизвестна.

Первые две колонки можно не смотреть, самая интересная 3 и 4: после буквы s число векторов т.н. "второй таблицы".

Т.е. если в Агат-Отладчике было около 20 функций (в  основном, обмен с терминалом, посекторный доступ к диску и ещё кой что), BTK - около 40 (причем документированы были только около 20), то в BTK-9 были сперва документированы оставшиейся 20 (включая, например, доступ к драйверу ФС), а затем, в The BEST дописано ещё около 10.



Но мы забыли об исходном ДОК. А между тем он продолжал развиваться, хотя и без авторства и документации. К сожалению, в его развитии не было принято указывать ни отличий, ни авторства, ни версий. Между тем явно видно, что в ИКП-90 у него было изменено меню, а в ИКП-Локальная Сеть и ИКП-Кермит - изменено ещё раз. Изменился набор: теперь без РЕГ печатаются маленькие буквы, добавлена команда REV - это аналог DCI, но заполняющий память в обратном порядке...... Возможно, изменилось что-то ещё. Стал ли он, по совокупности изменений, лучше - не знаю. Наверное, иначе бы авторы вряд ли стали его выпускать :)


Ещё одна ветка: это ассемблер Громова - развитие ассемблера ДОК, переделанного для работы в среде BTK. Но про него я уже писал тут, на форуме:
http://forum.agatcomp.ru//viewtopic.php?pid=796#p796

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

Re: The Best Tool Kit и все, все, все...

Теперь ковырнём BTK поглубже, применительно к изучаемому мной сейчас предмету:
разработки библиотеки-обёртки, унифицирующей базовые операции ввода-вывода между разными ОС.

На мой первый взгляд, поддерка в BTK чтения-записи файлов произвольного типа не должна была встретить особых сложностей. Я знал, что BTK легко поддерживает чтение/запись таких файлов по командам пользователя. Также я знал, что BTK имеет вполне богатый, унифицированный между версиями, интерфейс между пользовательскими программами и ядром системы (API).

Однако всё оказалось заметно сложнее. И, кой где, даже неожиданнее.

1) Оказалось, что в документации к оригинальным версиях А. Голова (т.е. семёрочным) просто не описывается доступ к файловому драйверу ОС.

2) В доках к адаптированной BTK-9 царит порядочный хаос. И если кое где файловые операции упомянуты, кой где не упомянуты, а кой где на этих же векторах указаны совсем другие операции.

:((

3) В The BEST упомянуто аж три варианта доступа к драйверу ФС, но только ... но довольно путанно и невнятно. В разных версиях описания и его частях упоминались то одни аргументы операций, то другие. В общем, пришлось проверять, разбирать и учиться.

4) Интерфейс оказался то ли неоправданно усложнённым, то ли недодокументированным.
В частности, чтобы прочитать файл, нужно указать едва ли не десяток параметров, некоторые из которых никак не описаны. Просто говорится, что такая-то ячейка должна содержать 0. А почему её не может очистить сам драйвер ?

Фактически, только в версих The BEST всё заработало сразу и с полпинка.
Хотя я и не до конца понял - почему :) Потому что потом обнаружилось, что:

1) В доках ссылаются на таблицу номеров функций (1-catalog, 2-...). Но таблица, приводимая в описании команд отладчика, пронумерована от 1. А фактически, в API эти же номера идут от нуля. Косяк-с.

2) Доступность операций в разных версиях системы менялась примерно так:

Изначально было две операции:
PAR - разбирает аргументы командной строки, при этом сама команда уже должна быть проанализирована (это делает синтаксический анализатор отладчика);
COM - исполняет заданную номером команду, имея на входе уже разобранные в PAR аргументы.

Но как их вызвать?

BTK/7 - нет документированного способа. Но есть процедура, адрес которой совпадает между BTK/7 и BTK/9. Она содержит вызовы двух ключевых процедур драйвера ФС: подготовку параметров (PAR) и исполнение операции (COM). Процедура находится по адресу $E7B4.

BTK/9, версии 89.x - всё ещё не имеет документированного способа вызова. Но всё та же процедура по тем же адресам присутствует. Её нельзя вызывать напрямую, но если скопировать в свой код первые 6 байт - это и будут два искомых JSR (подготовка и исполнение).

BTK/9, версии 90.x - тут уже всё работает через массив векторов. $29B (GOTOPAR) готовит параметры и $2A1 (GOTOCOM) выполняет команду. Интересно (и глупо!) что в старых версиях системы, на $29B висел вызов процедуры задержки в 1 секунду, а на $2A1 - ещё что-то такое же, не относящееся к делу. Вот вам и универсальное API :((

The BEST, проверил на версии 5.4 - тут всё работает через массив векторов, причем добавлено
ещё два вызова: исполнение с полным синтаксическим разбором команды (т.е. можно указать операцию в виде текстовой строки, включая название команды) и исполнить PAR+COM за один вызов.
Кроме того, тут вроде как упоминается, что теперь нужно анализировать флаг C после вызова PAR (В более ранних версиях не было указания делать это...... Хотя не ясно, что будет делать
PAR, если обнаружит синтаксическую ошибку.....). Впрочем, последние две процедуры я не проверял, меня вполне устраивают PAR и COM.

А вот код в ДопОЗУ был заметно переписан, так что найти аналог процедуры $E7B4 мне не удалось.

Что же делать?

Решение оказалось не очень сложным:

1) Сперва пытаемся работать честно: вызываем PAR по документированному вектору (GOTOPAR), но предварительно обнуляем ячейки $68..$69 (ReadDataBuffer?). Так как мне нужно читать текстовый файл в заданный мной буфер, после выполнения PAR в эти ячейки должен попасть указанный мной вектор. Если же их значение не изменилось, значит API cтарой версии и вместо PAR сработала процедура задержки в 1 секунду.

2) В этом случае копируем 6 байт из $E7B4 в своё тело и вызываем получившийся код.

3) Иначе (если $68..$69 оказались заполнены) можем спокойно вызвать COM по документированному вектору (GOTOCOM).

4) И проверить результат по коду возврата (флаг C + ячейка $28 (OTZV)).


Этот алгоритм чтения файла был проверен в 4-х версиях системы: BTK 89.0/7, 89.2/9, 92.9/9 и The BEST 5.4.
Ещё надо будет сделать запись файла, но, полагаю, ничего особенного уже найдено не будет.

3 Отредактировано Voldemar0 (01-04-2018 14:18)

Re: The Best Tool Kit и все, все, все...

Мелочь небольшая: ДОК в разных версиях в части документированных процедур обычно весьма хорош в плане совместимости. Достигалось это довольно жутким способом: адреса процедур типа чтения/записи файлов, вывода каталога - всё подгонялось в версии 840кб к тем же смещениям, как было в 140кб (и между версиями для 140ки вроде бы также делалось). Но это работает. И файловые операции и драйвер дисковода. Но вот с драйвером вышел небольшой косяк: там номер операции (1 - чтение, 2 - запись и т.д.) зачем-то сдвинули на бит влево, в младший бит запихнув бит признака отложенной операции. Получилось не смертельно, но очень плохо: теперь операция записи (код 2) соответствует операции не отложенного чтения.

Для себя составил такое описание этого несоответствия:

  В составе Школьницы и Агат-Отладчик (т.е. RWTS только для 140ки) используется три кода:
  0 - подвод головки только, 1 - чтение, 2 - запись.
  Фактически, здесь точный только 0, если байт != 0, то учитывается только младший бит.

  В поздних (ИКП-версиях) есть отложенные операции и коды сменились:
  0-1 - завершение (закрытие очереди, аргументы не важны),
  2 - не отложенное чтение, 3 - отложенное чтение,
  4 - не отложенная запись, 5 - отложенная запись,
  коды 6 и выше даёт ошибку N 2 (I/O Error ?).

Любопытно, что код RWTS в ИКП-7-ДОК заметно отличается от ИКП-9.
Такое впечатление, что ИКП-9-ДОК более ранний.
Также замечено, что обращение с не отложенными операциями в ИКП-9 не выключает дисковод, в то время как в ИКП-7-ДОК дисковод останавливается.

Проще всего определить тип системы по сигнатуре B2FD:20 6F 1B.
Она есть на всех версиях "Школьницы"/"Агат-Ассемблер" и отсутствует в ИКП.
В совсем старых версиях (2) есть вариант B2FD:20 4C 1B.

Занятно, что это всё - ссылка на процедуру выключения таймера.
Она есть в ИКП-ДОК, но, похоже, её вызов сочли ненужным.

Возможно, это было связано с тем, что в Школьнице драйвер использовался и в РАПИРе, а там есть поддержка режимов совмещения видеостраниц, так что даже в детской программе мог быть включен таймер.

4 Отредактировано Voldemar0 (19-04-2018 20:38)

Re: The Best Tool Kit и все, все, все...

А я думал уже и не найду больше ошибок в осях, в ближайшее время...

Суть простая: BTK не понимает в комстроке (а, стало быть, почти нигде) имена файлов больше 29 символов. Причем не важно каких именно: хоть бы даже 30й символ был пробелом (как это, обычно и бывает) - всё равно.

E85B -   D0 0D ..   "P."    BNE   FirstCh
                         Loop0:
E85D -   20 32 E8   "..Х"   JSR   GetChar
E860 -   F0 DA ..   "ПZ"    BEQ   E83C
E862 -   C9 BC ..   "I<"    CMP   #BC
E864 -   F0 0F ..   "П."    BEQ   E875
E866 -   C9 BE ..   "I>"    CMP   #BE
E868 -   F0 0E ..   "П."    BEQ   E878
                         FirstCh:
E86A -   9D 29 04   "..."   STA   0429, X
E86D -   E8 .. ..   "Х"     INX   
E86E -   E0 1E ..   "Ю."    CPX   #1E
E870 -   90 EB ..   ".К"    BCC   Loop0
                         SysMon2:
E872 -   4C 52 DD   "lr]"   JMP   SysMon

Такой вот код используется в 89.0/7 и почти такой же в The BEST 5.4/9:

E9A9 -   D0 0D ..   "P."    BNE   FirstCh
                         Loop0:
E9AB -   20 79 E9   ".ыИ"   JSR   E979
E9AE -   F0 D7 ..   "ПW"    BEQ   E987
E9B0 -   C9 BC ..   "I<"    CMP   #BC
E9B2 -   F0 10 ..   "П."    BEQ   E9C4
E9B4 -   C9 BE ..   "I>"    CMP   #BE
E9B6 -   F0 0F ..   "П."    BEQ   E9C7
                         FirstCh:
E9B8 -   9D 29 04   "..."   STA   0429, X
E9BB -   E8 .. ..   "Х"     INX   
E9BC -   E0 1E ..   "Ю."    CPX   #1E
E9BE -   90 EB ..   ".К"    BCC   Loop0

Это код анализа комстроки: тут самое забавное в последнем CPX #1E. В общем-то, вроде как всё верно, на первый взгляд: если указатель на буфер имени (429) вышел за пределы 29 (т.е. =30) то вроде как надо с недовольным пищанием выпасть в комстроку.
Но проблемка-то в том, что если имя как раз 30 знаков, то указатель может стать числом 30 (он бежит от 0 до 29 включительно) и это не есть сбой. Просто в этом случае следующим валидным символом может быть только либо CR либо запятая.

Ну с клавиатуры вряд ли кто будет набирать такое длинное имя, но ведь этот же интерфейс используется программами, а им без разницы сколько символов: сколько надо, столько могут и передать.

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