Служба в «компьютерной роте»: ЭВМ, дедовщина и гостайна. (Очень длиннопост)

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

Сердцем особо секретного отдела радиоразведки была огромная советская ЭВМ в военном исполнении, с тщательно удаленными надписями и вообще без опознавательных признаков. Надо сказать, что с этим было очень сурово, все было сделано для того, чтоб ты не мог понять принципа работы, а если случайно узнал, то тебя следовало расстрелять. Шутка.


Хотя доля военной паранойи присутствовала, и майор Андрущенко, который убедил меня делать карьеру в «компьютерной роте», посулив спецпаек, шеврон с летучей мышью и звание лейтенанта по окончании службы, разрешал только смотреть, но руками не трогать. Впрочем, трогать там было нечего — ЭВМ работала полностью автономно, без участия человека. Насколько я понимаю, это была какая-то разработка ЕС ЭВМ для армии — как гражданский вариант, только более надежная и в бронебойном корпусе.


Суть службы в «компьютерной роте» заключалась в сканировании радиоэфира — поиск морзянки. А потом обработка записи найденного эфира, пропущенных через АЦП, в поисках заветных признаков букв, которые складывались в столь ценные слова. А дальше начиналось самое интересное, потому что дальше работа выполнялась на специализированных персональных военных компьютерах, к которым у меня был полный доступ.


Сам военный компьютер представлял собой переделанный гражданский компьютер ПК-01 «Львов», выполненный в виде сдвоенной платы в металлическом корпусе, блок питания и монохромный дисплей, который, как ошибочно считали, умеет показывать только буквы и цифры. ПК был основан на КР580ВМ80А, это была единственная причина, по которой меня и направили в «компьютерную роту» — я успел выучить ассемблер этого процессора в журналах «Радио». Выпущенный полностью на отечественной базе, с тридцатью двумя килобайтами ОЗУ, он подходил под суровые требования военных, но даже этого было мало. Каждый раз, когда со склада выдавали новый взамен сломанного, а запас их был там очень приличный, то карательная тройка вандалов выполняла одну и ту же экзекуцию — корпус вскрывался, микросхемы ПЗУ с заводской прошивкой выкусывались и уничтожались при помощи молотка, затем припаивались микросхемы с собственной прошивкой ПЗУ, после чего корпус собирали и пломбировали, вносили запись в журнал, потом в журнал учета записей и, наконец, записывали все в журнал учета журналов.


Гражданский компьютер ПК-01 «Львов» (Image source)


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


В рабочем режиме этот военный компьютер предназначался для расшифровки морзянки.


Чтоб его запустить, нужно было выбрать режим связи с ЭВМ, ввести пароль (одинаковый для всех, был в ПЗУ), далее шла утомительная загрузка данных от Ески, которая имитировала считывание записи с магнитофонной кассеты, потом проверялась контрольная сумма с эталонной, если все было ОК — нажималась клавиша ВВОД и эта программа запускалась.


Потом каждому бойцу из роты выставлялись данные по радиочастотам. Сигналы шли по той же паре проводов, что и загрузка с ленты, причем ЭВМ уже преобразовывала морзянку в бинарный формат: ноль — это пауза, а единичка — уже сигнал. Процесс преобразования морзянки в буквы и читабельный текст было уже задачей бойца.


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


Кстати, сразу (ну после дизассемблирования) было видно, что программу писали самые настоящие военные: точка, тире и пауза записывались в программе при помощи символов (целый байт, Карл) — «точки», «минус» и «пробел» соответственно.


Если удалось получить читабельный декодированный текст, то он передавался обратно в ЭВМ. Такой расход на хранение был оправдан тем, что не требовалось тратить время на упаковку данных, но зверски жрало память.


Как дедушка над духом шутил


В военном компьютере был еще и автономный режим. Там можно было вводить программу в шестнадцатеричном формате, байт за байтом, без права на ошибку, а пустой ввод выполнял запуск. Программа, кстати, записывалась по смещению 0×100, это я почему-то запомнил. Как запомнил и специфический порт C4.


А было дело так: однажды один старослужащий хитро прищурился и стал мне вопросы задавать:


— Эй, салага, а ты-то хоть ассемблер хорошо знаешь?


— Да.


— А машинный код можешь писать без ассемблера?


— Могу, но со справочником и тетрадкой.


— За сколько времени сможешь написать программу, которая пошлет в цикле 200 байт со значением 255 и паузой в 20-30 тактов на порт C4, а по окончании — нулевой байт?


— Ну, минут за пять. Надо просто код записи в порт посмотреть и такты в нопы перевести, а циклы я на память умею.


— Вот это да! А у нас никто меньше чем за полчаса не справлялся. Покажешь на автономке?


— Ладно...


И вот я ввел эти команды, запустил программу, и дальше, правильно — меня дернуло током. Не сильно, но ощутимо. И все вокруг засмеялись, а я заплакал.


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


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



А тайна дерганья была проста: когда военные делали заказ, то они хотели, чтоб по команде от центральной ЭВМ можно было сжечь все компьютеры, желательно с потенциальными захватчиками.


Завод реализовал это требование при помощи того самого порта, который подавал заряд на конденсатор, который разряжался на металлический корпус и бил довольно ощутимо. Ну, а для того, чтоб превратить мирный компьютер в машину-убийцу, завод прислал схему и инструкцию о том, как, правильно, все догадались — напаять последовательно много конденсаторов и бахнуть весь мир в труху. Управлялось это хозяйство с помощью того самого порта с номером C4.


В последствии, занимаясь более глубоким хакингом, мы обнаружили, что там еще был и компаратор, который выдавал бит состояния заряда на порт B2. Для полной зарядки конденсаторов требовалось больше времени, чем цикл из 200 записей.


Служба


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


Все данные о радиочастотах передаются от ЭВМ операторам устно, а это опасно — враги могут подслушать и гонять на частотах дезу. Это два.


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


Нужно ускорить загрузку и передачу данных. Но к ЭВМ и ее программе у меня доступа нет, если что — заявку на модификацию проведут через центр. Но это маловероятно, и надо придумать что-то другое. Это три.


Еще научится подтягиваться на турнике, стрелять и пить, не пьянея.


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


И вот я начал изучать доверенный мне компьютер. Так как автономный режим был убог и неправильно введенный символ нельзя было изменить, то, прежде всего, я стал изучать возможные варианты. Самым оптимальным было адаптировать готовый «Монитор» от РК-86.


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


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


Кроме того, наш майор еще и взял под личную ответственность компьютер с заводским ПЗУ, с которым мы занимались под его присмотром в кабинете, превратив в конце концов его в лабораторию совершенствования программ, куда были подключены еще люди, занимавшиеся аппаратным обеспечением, в частности, доработкой автономного режима с модификацией прошивки ПЗУ.


Мы добавили возможность редактирования кодов в пределах одного ввода, добавили редактор, которым можно было поправить код перед запуском и т. д.


Увы, но финансирование было резко приостановлено, завод перестал поставлять компьютеры. По сути, мы делали уникальную работу, которая в будущем не имела никаких шансов на выживание. Тем не менее мы ее делали. Потому что это было интересно, черт возьми!


На умняке


Насколько я понимаю, отделы радиоразведки работали практически без координации со своими нестандартными компьютерами. Основная причина была в том, что на самом высоком уровне было принято решение собрать IBM PC/XT на собственной базе и пользоваться широкими наработками из братских стран, которые уже давно перешли на этот стандарт. Все остальное отвергалось и, соответственно, не финансировалось.


IBM PC/XT (Image source)


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


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


В бой!


Когда я влез в компьютер с оригинальной прошивкой ПЗУ с головой, то понял, что без документации не обойтись. Обращения к заводу-производителю даже через начальника военчасти ничего не дало, кроме электрической схемы, которая и так была в комплекте. Пришлось заняться своей прямой деятельностью — разведкой, только не против потенциального противника, а против отечественного же завода.


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


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


Я сообщил об этом Андрущенко. Он внимательно на меня посмотрел и спросил:


— Кому ты еще рассказал об этом?


— Никому.


— Правильно. И мне ты тоже ничего не рассказал. Понимаешь, почему?


— Догадываюсь...


— Даже не догадывайся. Разведчик должен уметь все забывать. Повтори, что я сказал?


— Я не запомнил.


— Молодец!


Это был наш секрет Полишинеля. Разумеется, об этом давно знали те, кому было положено знать. С этого момента я понял, что основная задача разведчика — это не просто добыть информацию, а еще правильно ей распорядиться. И, конечно, такие тайны были у всех. Не то, чтобы кто-то жучил коды какой-то игрушки, нет, такими все делились. Но вот пример с мифами про дисплей и знакогенератор дал мне отлично понять, что надо держать язык за зубами.


Мифы о дисплее


Разумеется, что после сдампливания заводского ПЗУ, делом чести было сдампить и военное.


Дизассемблинг показал интересную штуку, помимо прошитого намертво пароля и способа связи с ЕС. Там была программа, которая принимала символы и затем считывала фрагмент памяти по смещению, играла с портами и записывала фрагмент по специальному смещению, которое хитро вычислялось.


Разумеется, что я тоже написал программу, где стал играть портами и писать последовательность чисел и смещением памяти, в которое они записываются.


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


Улучив момент, когда я остался наедине с одним из разработчиков военного ПЗУ, я спросил, под что, мол, расходуется такой большой кусок, где ни данных, ни кода. Разумеется, я знал, под что, просто хотел услышать его ответ:


— А это символы для знакогенератора.


— Это как?


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


— А все говорили, что можно только буквы на дисплее отображать...


— Я этого не говорил!


— И я тоже не буду.


— А ты молодец, хлопец, далеко пойдешь!


Фальшивая нота


Программа для загрузки и обмена информацией, которая была прошита в военном ПК для обмена информацией использовала три ноты, передаваемые через АЦП: нижняя нота — точка, верхняя — тире, а средняя — пауза. Для передачи морзянки от ЭВМ к компьютеру это был единственный вариант, но я не понимал, зачем в обратную сторону идет только одна нота, если при сбросе он высылал к ЭВМ восемь нот? Все это было давно изучено путем нехитрой прослушки, когда к проводам подсоединили пьезодинамик.


Естественно, что выдавать звук на динамик и считывать его с микрофона научились задолго до меня. Диапазон был широк и можно было считывать/записывать звук с дискретностью байт/нота, то есть — 256 нот! Но использовали всего три. Почему? Вопрос был без ответа.


При всем этом, никто не попытался написать программу, которая загрузит те самые коды, которые передает ЭВМ, и посмотреть, а что там происходит? Мне сказали, чтобы я не пытался, это безнадежное дело. Тем самым заставили меня на несколько месяцев покинуть нормальную жизнь и начать сражение с неизвестным гением отечественного программирования.


Прежде всего, я изучил программу в ПЗУ, которая занималась чтением/отправкой данных. Там было на вид все просто.


Первую проблему я получил тогда, когда набил в автономном режиме копию кодов режима связи ЭВМ и программы ПЗУ, которая считывала все это дело, но не запускала программы, а возвращала в режим автономной работы.


Программа загрузилась и запустилась в обычном режиме. Я не понял. Я точно проверил, что происходит возврат. Ошибки быть не могло. Черт, теперь опять все заново вводить, да еще мне говорят, что не я один такой умник, и до этого пытались — все бесполезно.


Ладно, тогда я решил подойти к проблеме иначе. Раз мне придется много раз вводить коды заново, то нужно ускорить этот процесс. А как?


Вывод напросился сам собой — раз там аналоговый сигнал, который можно прочитать и записать, то почему бы не сделать это с помощью магнитофона?


После многочисленных просьб «достать» магнитофон под предлогом, чтобы послушать музыку на день рождения, удалось получить магнитофон Маяк. С замиранием сердца я сделал копию сигналов с ЕС, потом подцепил микрофон к компьютеру — и загрузка прошла. Не всегда, иногда была ошибка контрольной суммы, а иногда и полный зависон, но тем не менее первый шаг был сделан.


Теперь я мог вбить небольшой код и читать/записывать данные. Я начал разбираться, почему так произошло, загрузив данные на компьютер с оригинальным ПЗУ, правда пришлось вбивать весь код загрузчика заново, но вот сейчас я запущу распечатку и все узнаю. Разумеется, что программа автоматически запустилась и на этом компьютере, перейдя в обычный режим.


Это могло означать только одно — несмотря на различие ПЗУ, в чем-то они совпадают. Но в чем? Наверное в регистрах, потому что больше не в чем. Я долго и безуспешно искал решение, пока не дошел до глубины глубин — подсчета контрольной суммы. И тут я нашел первую закладку безопасности в военном ПЗУ: если контрольная сумма была ошибочна, но при этом равнялась 01FF, то программа переходила по этому адресу.


Тогда я написал свою программу, в которой была копия программы загрузки кода ПЗУ за исключением обработки контрольной суммы, она загрузила код. И знаете, что? Правильно, он опять автоматически запустился в обычном режиме. Тут мне реально захотелось зарыдать, потому что у меня на поиск закладки ушли все силы, и я чувствовал, что не смогу повторить все во второй раз, спускаясь в глубины глубин.


И вот я просто сидел и втыкал в нотный перелив загрузки с магнитофона, когда один из из старослужащих вдруг сказал, что последняя нота фальшивая!


— Чего?


— Последняя нота — фальшивая, слишком высокая.


— Точно?


— Сделай громче, да сам послушай!


— Я не услышу — мне медведь оба уха оттоптал.


— Да ладно! Прислушайся лучше!


Да, фальшивая нота там определенно была, это я услышал, подключив наушники и врубив звук погромче. И это определенно давало мне однозначную точку отладки — преобразование потока бит из порта АЦП в байты кода. Именно там и оказалась последняя закладка. При проверке верного сигнала, которым являлось многократное повторение одного и того же байта-ноты, был обработчик ошибок. Если сигнал не соответствовал нужному, то возникало переполнение регистра, проверяющего вывод с порта, потом осуществлялся переход в ПЗУ на адрес сообщения об ошибке. Именно там и стояла закладка — если регистр переполняется, то есть нота выходит за размер байта, то происходит переход по адресу регистра переполнения и последнего кода ноты. Не сложно было понять, что значение переполненного регистра становилось 01, а последняя нота естественно была FF. Наш знаменитый 01FF. А по адресу 0100 была размещена та самая программа с сообщением об ошибке, которая при загрузке копировалась туда из ПЗУ.


Программу с ЭВМ я получил. Дальше уже было не сложно написать загрузчик версии оригинального ПЗУ, в формате которого я записал программу ЭВМ на магнитофон. Скорость загрузки увеличилась вдвое.


Я отрапортовал, что справился с первым боевым заданием, продемонстрировав свою чудо-систему. Майор посмотрел, молча забрал магнитофон с кассетой и компьютером и точно так молча же удалился.



Несколько дней я не знал, чего мне и ожидать — медали или трибунала. Получил я не то и не другое, а лист купонов на 50 купонокарбованцев и 65 рублей рублями. Премия!


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


Свой


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


По факту оказалось, что должен самолично сделать новую прошивку ПЗУ, причем за все косяки отвечаю я лично, а награда за успех — общая. Такой себе Ванька Жуков, только вместо дедушки полковник, который в курсе всего расклада и считает это нормой. Следует отдать должное, мой код никто не проверял и не капал на мозги, за исключением одного момента — процедуры первоначального тестирования — ППТ или, как я назвал, ПыПэТц.


При включении из ПЗУ все копировалось в память, тестировалось на идентичность, ну примитивная проверка битой памяти, потом код исполнялся уже в памяти, где сверялось все с ПЗУ, уже, наверное, на предмет того, чтобы схему не вынули. Все попытки убедить в том, что это излишняя процедура, которая еще к тому же откусывает память, были тщетны. В конце концов я сдался, но после ПэПэТца я передавал управление обратно в ПЗУ, освобождая ценную память.


Свое действие я мотивировал тем, что это гарантирует наличие ПЗУ во время работы — если его удалить, программа остановится. Что так даже безопаснее. Мужики переглянулись между собой, и мне было разрешено не покидать помещение после работы. Не то, чтобы я перестал быть мальчиком на побегушках, пусть и электронных, но я вроде стал как свой. По крайней мере, меня приглашали играть в карты-шашки-пиво-вино-домино и слушать про рыбалку-охоту, так как мне поведать им было нечего.


Пользуясь этим, я смог поговорить в нормальной обстановке простым языком о том, куда мне лезть позволено и куда меня не пустят. Все было очень просто: мне позволено делать с военными компьютерами в операторской все, что угодно, в комнату к ЭВМ меня не пустят. Доступ только по кабелю связи. Протокол мне дадут, да и я сам, наверное, давно его декодировал (это было правдой).


Кроме того, мне были даны мудрые советы, среди которых: правило указания срока. Например, если ты делаешь программу за неделю, ты ее удваиваешь и добавляешь еще одну. Получается — три. Затем командование тебе говорит, что это много и сроку тебе — десять дней. И у тебя еще остается немного времени, чтобы сдать досрочно, например, за девять дней, а запас по времени — делать все без напряга. Это был один из самых ценных советов.


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

2
Автор поста оценил этот комментарий

Духа заставили писать в машинных кодах. Блин, какая у вас там зверская дедовщина была!

2
Автор поста оценил этот комментарий
А какие игрухи вы там гоняли?
1
Автор поста оценил этот комментарий

Спасибо. Хорошо написано. Помню те журналы Радио.

Автор поста оценил этот комментарий
Нифига не понял, но очень захватывающе)
ещё комментарий