- PVSM.RU - https://www.pvsm.ru -

Добываем исходный код VM/370

Здравствуйте, уважаемые хабарчане!
Почти неделю назад я написал свой первый пост [1] о VM/370. Первым комментарием к нему было совершенно справедливое замечание [2]:

Весело, конечно, но «полотно» состоит в основном из выводов команд. Если честно, гораздо интереснее прочитать не только про саму установку системы, но и про её «кишки», как, что, да почему.
Исследовать исходники VM/370, к примеру.

Да, действительно, туториал по установке мягко говоря устаревшей ОС интересен только в общепознавательном плане как демонстрация ее возможностей. А вот описание принципов работы с цитатами из исходников — другое дело. Тем более, что исходники доступны. Проблема только в том, что подобное описание — дело серьезное.
Принципы работы VM/370 описаны в этом трехтомнике [3]. Сам исходный код — сравнительно небольшой, «всего» двести тысяч строк на ассемблере — CP и примерно столько же — CMS. Но работа все равно предстоит капитальная.
В этой статье я не ставлю перед собой задачу даже начать цикл о внутренностях VM/370. Я только объясню как я извлек исходный код VM/370 в читабельном формате. В процессе извлечения я узнал кое-что интересное про работу с VM/370.

Распаковка ленты в CMS

Объем ленты с исходниками — около тридцати мегабайт. Будучи совершенно уверенным что файлы хранятся на ленте в несжатом виде, я просто разделил этот объем на емкость цилиндра 3330 и вычислил, что для сохранения всех исходников мне понадобиться 130 цилиндров. Потом это конечно оказалось не так (видимо, какое-то сжатие все-таки происходит, размер распечаток — ок. 40 мегабайт), но к счастию лента состояла из нескольких томов, и я просто распечатал их один за другим.
Итак, добавим в каталог, в описание пользователя MAINT, строку:

 MDISK 192 3330 200 130 CPR6L0 WR READ * SOURCES

Примечание: весь процесс я выполнял под пользователем MAINT. Вообще говоря, это — злостное нарушение правила «не работай под рутом» и так делать нельзя.
Запустим VM, залогинимся как MAINT, запустим CMS. введем перфокарты с описанием каталога и обновим его командой «DIRECT MYVM». Перелогинимся (чтобы изменения учетной записи вступили в силу). Подключим диск 192 (командой «access 192 b») и ленту с исходниками. Загрузим первый том архива (исходники CP) командой «VMFPLC2 LOAD * * B».

Распечатка

Я долго не мог найти способ распечатать несколько файлов одной командой. Дело в том, что команды PRINT и PUNCH ругаются на звездочки в имени файла. А печатать пятьсот штук файлов вручную что-то не хотелось. В конце-концов я решил, что проще всего будет написать программу распечатки на ассемблере, но роясь в мануалах по ассемблеру, нашел более легкий способ.
У команды LISTFILE (аналог DIR/ls) есть опция (EXEC. Если запустить LISTFILE с этой опцией, LISTFILE создаст файл (файлы EXEC — это аналог bat/sh), со строками вида &1 &2 . &1 &2 — это параметры скрипта.
Теперь внимание! При запуске команды CMS PUNCH, в каждой строке файла CMS EXEC вместо &1 будет подставлен PUNCH, а затем строка выполнена. По-моему, это самое лучшее решение инженеров IBM в области пользовательского интерфейса (хотя и ненужное в Linux при наличии awk).
Я поэкспериментировал с различными распечатками и решил, что PUNCH лучше чем PRINT.
Примечание: геркулесовский вывод перфокарт настроен на формат EBCDIC. Чтобы получить читабельный код, надо перенастроить его на ASCII командой «ATTACH D ./sources/DMK.txt ascii».
Итак, создаем список файлов:

L * * B (EXEC

И выводим их:

CMS PUNCH
...длинный список файлов.

Уже когда все закончилось, я догадался, что имело смысл добавить в CMS EXEC первую строчку &CONTROL OFF (аналог echo off). Да, не застал я не то что VM/370, но даже и элементарный MS-DOS.

Разделение файлов

В результате предыдущих манипуляций, я получил файл DMK.txt со склеенными вместе исходниками. Теперь их надо разделить. Для этого я применил такой скрипт на awk:

/^MAINT    MAINT    MAINT    MMMM  AAAA  IIII  NNNN  TTTT$/ {next}
/^USERID/ {next}

$1==":READ"{
    MYFILE="./DMK/"$2 "_" $3
    next
  }

{
  print $0 > MYFILE
}

Прошу прощения за г-код, писалось на коленке и не с целью читабельности/эффективности.

Теперь таким же образом можно вывести исходники CMS (условный код DMS), RSCS (условный код DMT, название Remote Spooling Communication Subsystem немного путает, но это в каком-то смысле аналог fido) и IPCS (условный код DMM, системные тесты).

Ссылки

Автор: valplo

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/staroe-zhelezo/42265

Ссылки в тексте:

[1] свой первый пост: http://habrahabr.ru/post/191602/

[2] совершенно справедливое замечание: http://habrahabr.ru/post/191602/#comment_6655954

[3] этом трехтомнике: http://bitsavers.informatik.uni-stuttgart.de/pdf/ibm/370/VM_370/plm/

[4] Исходники (склеенные): http://gfile.ru/d/tf/0b0c7300e84747fc2707844fd667a204/13780314/a1Qtf/storage4-0-4-92540/VMREL6SRC-punch.zip

[5] Конечный продукт: http://gfile.ru/a1Yh7

[6] Принципы работы машины System/370: http://bitsavers.informatik.uni-stuttgart.de/pdf/ibm/370/princOps/GA22-7000-10_370_Principles_of_Operation_Sep87.pdf

[7] Источник: http://habrahabr.ru/post/192134/