Глава 39. Люба и Евгений

Глубокий вечер за окнами КБ-3 создавал то самое настроение, когда хочется либо писать стихи о безысходности, либо вылизать программу на автокоде до состояния звонкой, как натянутая струна, совершенности. Осенняя темнота изолировала лабораторию от внешнего мира, превращая её в одинокую подводную лодку.

Евгений Громов выбрал второе.

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

Ненормальные — то есть основной костяк команды «Сферы» — обычно тоже расползались по домам, но сегодня Громов остался. У него был личный счет к ЦУБу.

Эта кремниевая горсть транзисторов на плате издевалась над ним.

Громов сидел перед терминалом — своим собственным творением, собранным из телевизора «Юность» и клавиатуры с герконами, — и яростно тер переносицу. На экране мерцали колонки шестнадцатеричных кодов.

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

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

Для больших машин серии ЕС, на которых Громов привык работать, это была задача уровня «почесать за ухом». Там были каналы прямого доступа, сопроцессоры, тактовые частоты, от которых не вяли уши. Здесь же, в мире восьмибитного убожества, процессор должен был лично, своими маленькими цифровыми ручками, взять байт из ячейки А, перенести его в ячейку Б, и так две тысячи раз.

Это выглядело не как прокрутка. Это выглядело как медленный показ диапозитивов для пенсионеров. Строки ползли вверх с грацией парализованной улитки.

Евгений затянулся «Явой», выпустив струю дыма в потолок. Дым повис слоистым облаком, подсвеченным сероватым сиянием монитора.

В дальнем углу комнаты, за своим верстаком, сидела Люба Ветрова.

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

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

— Любовь Анатольевна, — позвал он, не оборачиваясь. Голос прозвучал хрипло от табака. — Вы домой не собираетесь? Трамваи скоро превратятся в тыквы.

Люба вздрогнула, словно её разбудили, и подняла голову. Очки блеснули.

— А? Нет, Евгений Александрович. Я тут… — она неопределенно махнула рукой в сторону чертежа. — У нас по питанию просадка на третьей гармонике. Если в школе включат сразу десять машин и кто-то решит еще и чайник в ту же розетку сунуть, будет фейерверк. Я пересчитываю фильтр.

— Фейерверк — это весело, — буркнул Громов, возвращаясь к коду. — Хоть какое-то развлечение. А у меня тут похороны. Похороны быстродействия.

ИЗ_ОЗУ Р1… ИНК_АДР… В_ОЗУ Р1… Скука смертная. Циклы, циклы, циклы.

— Не получается? — тихо спросила Люба.

Громов услышал шорох — она встала и подошла. Остановилась за спиной, соблюдая пионерскую дистанцию. От неё пахло канифолью и чем-то неуловимо цветочным, может быть, шампунем или духами, название которых Громов не знал. Этот запах странным образом диссонировал с прокуренной атмосферой лаборатории, но не раздражал. Наоборот, он вносил в хаос какую-то ноту упорядоченности.

— Всё получается, — огрызнулся Громов, но беззлобно. Это была его защитная реакция: программист никогда не признает поражение перед «железячником»

— Просто этот процессор проектировали садисты. Смотри.

Он нажал клавишу «Ввод». Экран заполнился текстом, который медленно, рывками пополз вверх.

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

Люба поправила очки, внимательно глядя на экран.

— А зачем вы двигаете память? — спросила она.

Вопрос был настолько наивным, что Громов даже перестал печатать. Он медленно повернулся к ней на вращающемся стуле (который скрипнул, как старая телега).

— Люба, душа моя, — начал он тоном терпеливого профессора, объясняющего первокурснику, почему дважды два четыре. — Чтобы текст на экране сдвинулся вверх, байты в видеопамяти должны физически переместиться. То, что было во второй строке, должно стать первой. То, что было в третьей, — второй. Это физика, Люба. Закон сохранения информации. Если я не перенесу байты, они сами не переползут. У них своя инерция, — закончил он и замолчал. Люба не обиделась. Она вообще редко обижалась на сарказм, словно у неё был встроенный фильтр низких частот, отсекающий эмоциональный шум и оставляющий только полезный сигнал.

— Я понимаю, как работает программа, Женя, — сказала она спокойно, и от ее неожиданно мягкого тона у Громова что-то екнуло. Отбросив шутливый официоз, она заговорила с ним предельно откровенно. — Я спрашиваю про железо. Зачем вы заставляете процессор заниматься работой грузчика?

— Потому что у нас нет канала прямого доступа к памяти, — развёл руками Громов. — Мы нищие, Люба. У нас «Сфера-80», а не IBM 360. У нас центральное процессорное устройство — и швец, и жнец, и на дуде игрец.

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

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

— Верно, — кивнул Громов, чувствуя, что начинает раздражаться. — И что?

— А если мы скажем ему начинать не с нуля? — Люба подняла на него глаза. За толстыми линзами её взгляд был ясным и пугающе конкретным. — Если мы скажем ему: «Начинай показывать картинку с сорокового байта»? Тогда вторая строка станет первой. Визуально.

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

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

Но Люба мыслила сигналами.

— Аппаратная прокрутка… — прошептал он. — Ты предлагаешь изменить начальный адрес выборки видеопамяти.

— Ну да, — Люба пожала плечами, словно предлагала просто добавить сахара в чай. — У нас же счетчики К155ИЕ5. У них есть входы предварительной установки. Но они сейчас на земле сидят.

Громов вскочил со стула. Усталость как рукой сняло. Он подлетел к схеме, едва не сбив Любу с ног.

— Покажи!

Люба не отшатнулась. Они склонились над ватманом, почти касаясь друг друга головами.

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

— Так… — мозг Громова заработал на форсаже. — Если мы вместо жесткого сброса подадим туда значение из регистра…

— Регистра у нас нет, — осадила его Люба. — Свободных микросхем на плате нет. Места тоже нет. Олег там всё своими проводами заплел.

Эйфория Громова слегка поутихла.

— Тогда как?

Люба закусила губу. Это была привычка, которую Громов замечал и раньше — когда она сталкивалась с

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

— Нам не нужно произвольное смещение, — сказала она медленно. — Нам нужно смещение ровно на одну строку. На 32 байта… или сколько у нас там ширина?

— 32 символа в строке, — задумчиво подтвердил Громов. — А с учётом невидимой области обратного хода луча — 64.

— Точно, 64! Это степень двойки. Это просто один бит, — глаза Любы загорелись тем самым фанатичным огнем, который Громов видел в зеркале, когда ему удавалось сэкономить байт памяти. — Женя, смотри. Если мы будем инвертировать старшие биты адреса… Нет, не так. Если мы просто добавим сумматор? Нет, сумматора нет.

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

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

— Адрес вывода… — она нахмурилась. — Ну, мы зарезервировали адрес `F0` для расширения. Там дешифратор стоит, но ничего не подключено.

— Отлично. Если я запишу в порт `F0` число, скажем, 1, это может переключить триггер?

— Может. ТМ2 у нас есть, половинка свободная болтается в узле синхронизации.

— Так вот. Если этот триггер переключит старший адрес видеопамяти… — Громов начал жестикулировать, рисуя в воздухе блоки. — Смотри. У нас 2 килобайта видеопамяти. А микросхемы памяти — РУ2, их там много.

— Их там шестнадцать штук, — вздохнула Люба. — Статика.

— Если мы поставим этот триггер в разрыв адресной шины… скажем, на адрес А10. То при записи единицы в порт, процессор будет видеть ту же память, но со сдвигом? Нет, бред.

Люба вдруг улыбнулась. Улыбка у неё была редкая, немного стеснительная, но преображающая лицо.

— Женя, ты усложняешь. Ты программист, ты мыслишь логикой. А тут надо мыслить

проводами.

Она взяла красный карандаш.

— Давай сделаем так. Мы не будем делать плавную прокрутку текста… Это слишком сложно для переделки готовой платы. Мы сделаем аппаратную подмену адреса начала строки.

— Как?

— Мы возьмём сигнал кадровой развёртки. И задержим его. Просто задержим сброс счётчиков узла вывода на экран на время длительности одной строки.

Громов уставился на неё.

— Задержать сброс… То есть контроллер начнет выдавать данные позже?

— Да. Верхняя строка экрана станет пустой. А то, что было первой строкой, нарисуется второй. Картинка съедет вниз.

— Нам надо вверх! — воскликнул Громов.

— Чтобы вверх — надо сбросить раньше, — парировала Люба. — Но раньше нельзя, там синхроимпульс. Значит, надо просто добавить смещение к счетчику.

Она отбросила карандаш и решительно направилась к своему столу, где стоял паяльник.

— Неси плату, — скомандовала она. В её голосе появились металлические нотки главного конструктора. — Тот макет, на котором ты мучаешься.

Громов послушно выдернул плату из разъема своего терминала. Она была горячей.

Люба включила паяльник. Пока он грелся, она рылась в своих коробочках с деталями.

— Так, мне нужен один триггер и кусочек провода, — пробормотала она. — Я вмешаюсь в цепь счетчиков.

— Что ты хочешь сделать? — Громов сел рядом, наблюдая за её руками.

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

Громов моргнул.

— Подожди. Если мы добавим импульс во время гашения… Счетчик подумает, что одна строка уже прошла?

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

— В двадцать пять раз быстрее, — подсчитал Громов. — Люба… ты гений. Но это же «костыль».

— В инженерном деле нет заплаток, — сказала она, беря плату и надевая на голову бинокулярные очки-лупу, что сделало её похожей на инопланетянина. — Есть нетиповые технические решения. Держи плату. Крепче.

Громов держал текстолит. Он ощущал тепло паяльника, поднесенного к плате, и тепло Любиного плеча, прижатого к его руке.

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

— Плевать на красоту, — выдохнул Громов. — Мне нужна скорость.

Люба работала быстро. Скальпель в её руке сверкнул, перерезая медную дорожку с противным хрустом. Громов поморщился — ему всегда было больно видеть, как режут живое железо. Но Люба тут же капнула флюсом, и запах сосновой смолы наполнил воздух, перебивая табак.

— ЛА3 приклеим пузом кверху на свободное место, — комментировала она свои действия. — Питание кинем перемычками.

Её пальцы ловко манипулировали тонкими проводками МГТФ во фторопластовой изоляции. Она зачищала концы зубами — варварство с точки зрения ТБ, но Громов нашел в этом что-то невероятно бунтарское.

— Ты зубы испортишь, — сказал он машинально.

— У меня крепкие, — отозвалась она, припаивая проводок к ножке микросхемы. — Не отвлекай.

Следующие двадцать минут прошли в тишине, нарушаемой только шипением припоя и короткими командами Любы: «Поверни», «Держи», «Пинцет».

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

— Всё, — Люба выпрямилась и сняла очки-лупу. На носу остались красные следы от оправы. — Должно работать. Я завела сигнал от неиспользуемого триггера на плате клавиатуры. Если подашь на порт клавиатуры определенный бит… в общем, разберешься. Бит 7. Если он ноль — смещения нет. Если единица — смещение на одну строку.

— Только на одну? — уточнил Громов.

— Ну, я могу сделать на две, но надо еще логику городить. Тебе же для прокрутки надо?

— Для прокрутки идеально, — кивнул он. — Сдвинул на строку, заполнил нижнюю, сбросил триггер, переписал память… Стоп. Если я сброшу триггер, картинка прыгнет обратно вниз.

— Значит, ты должен успеть переписать память, пока триггер держит смещение, — Люба устало потерла глаза. — Женя, я дала тебе аппаратную возможность видеть результат мгновенно. А уж подменить данные в памяти ты можешь в фоне. Пользователь не заметит подмены, если картинка уже сдвинулась.

Громов задумался. Это было хитро. Это была иллюзия. Обман зрения. Сначала сдвигаем картинку аппаратно (мгновенно), пользователь видит, что текст поехал вверх. А потом, покапользователь радуется скорости, процессор тихонько перелопачивает память, чтобы привести её в соответствие с новой реальностью, и возвращает смещение в ноль. — Это… — он подбирал слово. — Это элегантно. Чертовски элегантно.

Он воткнул плату обратно в разъем. Щелкнул тумблером. Экран засветился.

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

`ПОРТ_ЗАП F0, 80` — включить смещение.

`ВЫЗОВ ОЧИСТ_НИЗ` — очистить нижнюю строку.

`ВОЗВР` — вернуть управление.

А потом, в прерывании таймера, он будет потихоньку двигать основной массив.

Он запустил тест. Нажал кнопку, которая генерировала поток текста.

Раньше текст полз, как раненая гусеница. Теперь… Строки летели вверх. Это не было идеально плавно, как на демонстрациях экранов на ВДНХ или в кинотеатре Дворца культуры, но это было быстро. Текст просто возникал.

— Работает! — Громов повернулся к Любе. Его лицо расплылось в широкой, почти детской улыбке, совершенно не свойственной его циничной натуре. — Люба, ты волшебница!

Люба стояла, прислонившись бедром к столу, и устало улыбалась.

— Я не волшебница, Женя. Я просто знаю, как работает подпрограмма управления экраном.

В этот момент в лаборатории что-то изменилось. Словно исчезла невидимая стена между «элитой» (программистами) и «чернорабочими» (железячниками). Громов вдруг остро осознал, что без этой хрупкой женщины с паяльником его гениальный код — просто набор электрических импульсов в пустоте. А она, возможно, поняла, что её железо без его кода — просто груда кремния и меди.

— Чай будешь? — неожиданно для самого себя спросил Громов. — У меня есть заварка. Нормальная, не та пыль, что Пашка пьет. «Слона» достал.

Люба посмотрела на часы. Было уже за полночь. Трамваи точно превратились в тыквы.

— Буду, — просто сказала она. — Только у меня кружка грязная.

— Я отмою, — Громов вскочил. — Сиди. Ты сегодня работала скальпелем, тебе положен отдых.

Он схватил её кружку — простую, эмалированную, с отбитой эмалью на ручке, — и свою, керамическую, с надписью «Кисловодск».

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

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

— Знаешь, — сказала она, принимая кружку. Её пальцы коснулись его пальцев, и Громов снова ощутил это странное электричество. Не 220 вольт, не удар током, а мягкое, теплое статическое напряжение. — Если мы добавим еще один триггер… мы сможем сделать аппаратный курсор. Чтобы тебе не приходилось мигать им программно.

Громов сел на край стола, глядя на неё сверху вниз.

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

Она кивнула и подула на чай. Пар поднялся вверх, затуманивая её очки. Она сняла их, и Громов впервые увидел её глаза без стекол. Они были уставшими, с темными кругами, но очень красивыми. Карими, с золотистыми искорками.

— На будущее, — эхом повторила она.

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

И, кажется, они только что стали самой сильной парой в этом безумном КБ. Профессионально, конечно.

Хотя, глядя на то, как Люба уютно держит кружку двумя руками, Громов подумал, что слово «профессионально» может быть слишком узким термином. Но эту мысль он решил отложить в стек, как низкоприоритетную задачу. Сейчас надо было наслаждаться победой. И чаем.

Загрузка...