Станислав Миков – Проект «Сфера-80»: в поисках юности (страница 71)
Громов замер. Сигарета в его руке дотлела до фильтра и обожгла пальцы, но он даже не дернулся, просто машинально раздавил бычок в переполненной пепельнице.
В его голове, привыкшей мыслить алгоритмами, произошел сбой. Он думал в рамках линейного пространства памяти. Массив есть массив. Чтобы изменить массив, надо перезаписать ячейки.
Но Люба мыслила сигналами.
— Аппаратная прокрутка… — прошептал он. — Ты предлагаешь изменить начальный адрес выборки видеопамяти.
— Ну да, — Люба пожала плечами, словно предлагала просто добавить сахара в чай. — У нас же счетчики К155ИЕ5. У них есть входы предварительной установки. Но они сейчас на земле сидят.
Громов вскочил со стула. Усталость как рукой сняло. Он подлетел к схеме, едва не сбив Любу с ног.
— Покажи!
Люба не отшатнулась. Они склонились над ватманом, почти касаясь друг друга головами.
— Вот, — её карандаш указал на каскад микросхем. — Счетчики адреса. Они сбрасываются в ноль кадровым синхроимпульсом. Каждый раз, когда луч возвращается вверх, счетчик обнуляется.
— Так… — мозг Громова заработал на форсаже. — Если мы вместо жесткого сброса подадим туда значение из регистра…
— Регистра у нас нет, — осадила его Люба. — Свободных микросхем на плате нет. Места тоже нет. Олег там всё своими проводами заплел.
Эйфория Громова слегка поутихла.
— Тогда как?
Люба закусила губу. Это была привычка, которую Громов замечал и раньше — когда она сталкивалась с
неразрешимой задачей, она начинала грызть нижнюю губу, и это выглядело… трогательно.
— Нам не нужно произвольное смещение, — сказала она медленно. — Нам нужно смещение ровно на одну строку. На 32 байта… или сколько у нас там ширина?
— 32 символа в строке, — задумчиво подтвердил Громов. — А с учётом невидимой области обратного хода луча — 64.
— Точно, 64! Это степень двойки. Это просто один бит, — глаза Любы загорелись тем самым фанатичным огнем, который Громов видел в зеркале, когда ему удавалось сэкономить байт памяти. — Женя, смотри. Если мы будем инвертировать старшие биты адреса… Нет, не так. Если мы просто добавим сумматор? Нет, сумматора нет.
Она замолчала, её карандаш начал выписывать на полях ватмана какие-то логические уравнения. Громов смотрел на эти каракули с благоговением. Он понимал булеву алгебру, но то, как она применяла её к живым микросхемам, было магией.
— Подожди, — вдруг сказал он. — А если проще? Нам не нужен настоящий аппаратный сдвиг экрана, как на больших терминалах. Нам нужно просто быстро сдвинуть его. Люба, — он резко сменил тон на очень серьезный. — У нас есть свободный порт вывода?
— Адрес вывода… — она нахмурилась. — Ну, мы зарезервировали адрес `F0` для расширения. Там дешифратор стоит, но ничего не подключено.
— Отлично. Если я запишу в порт `F0` число, скажем, 1, это может переключить триггер?
— Может. ТМ2 у нас есть, половинка свободная болтается в узле синхронизации.
— Так вот. Если этот триггер переключит старший адрес видеопамяти… — Громов начал жестикулировать, рисуя в воздухе блоки. — Смотри. У нас 2 килобайта видеопамяти. А микросхемы памяти — РУ2, их там много.
— Их там шестнадцать штук, — вздохнула Люба. — Статика.
— Если мы поставим этот триггер в разрыв адресной шины… скажем, на адрес А10. То при записи единицы в порт, процессор будет видеть ту же память, но со сдвигом? Нет, бред.
Люба вдруг улыбнулась. Улыбка у неё была редкая, немного стеснительная, но преображающая лицо.
— Женя, ты усложняешь. Ты программист, ты мыслишь логикой. А тут надо мыслить
проводами.
Она взяла красный карандаш.
— Давай сделаем так. Мы не будем делать плавную прокрутку текста… Это слишком сложно для переделки готовой платы. Мы сделаем аппаратную
— Как?
— Мы возьмём сигнал кадровой развёртки. И задержим его. Просто задержим сброс счётчиков узла вывода на экран на время длительности одной строки.
Громов уставился на неё.
— Задержать сброс… То есть контроллер начнет выдавать данные позже?
— Да. Верхняя строка экрана станет пустой. А то, что было первой строкой, нарисуется второй. Картинка съедет вниз.
— Нам надо вверх! — воскликнул Громов.
— Чтобы вверх — надо сбросить
Она отбросила карандаш и решительно направилась к своему столу, где стоял паяльник.
— Неси плату, — скомандовала она. В её голосе появились металлические нотки главного конструктора. — Тот макет, на котором ты мучаешься.
Громов послушно выдернул плату из разъема своего терминала. Она была горячей.
Люба включила паяльник. Пока он грелся, она рылась в своих коробочках с деталями.
— Так, мне нужен один триггер и кусочек провода, — пробормотала она. — Я вмешаюсь в цепь счетчиков.
— Что ты хочешь сделать? — Громов сел рядом, наблюдая за её руками.
— Я сделаю так, чтобы по команде из порта — твоего `F0` — мы добавляли лишний импульс на счетный вход счетчика строк
Громов моргнул.
— Подожди. Если мы добавим импульс во время гашения… Счетчик подумает, что одна строка уже прошла?
— Именно! — Люба сияла. — Он начнет отрисовку кадра не с нулевой строки, а с первой. Визуально весь текст прыгнет вверх на одну позицию. А нижняя строка заполнится мусором, который был за пределами экрана, но это ты уже своим кодом зачистишь. Одну строку зачистить быстрее, чем двигать двадцать пять.
— В двадцать пять раз быстрее, — подсчитал Громов. — Люба… ты гений. Но это же «костыль».
— В инженерном деле нет заплаток, — сказала она, беря плату и надевая на голову бинокулярные очки-лупу, что сделало её похожей на инопланетянина. — Есть нетиповые технические решения. Держи плату. Крепче.
Громов держал текстолит. Он ощущал тепло паяльника, поднесенного к плате, и тепло Любиного плеча, прижатого к его руке.
— Мне придется перерезать дорожку сброса, — предупредила она. — И напаять логику навесом. Будет некрасиво.
— Плевать на красоту, — выдохнул Громов. — Мне нужна скорость.
Люба работала быстро. Скальпель в её руке сверкнул, перерезая медную дорожку с противным хрустом. Громов поморщился — ему всегда было больно видеть, как режут живое железо. Но Люба тут же капнула флюсом, и запах сосновой смолы наполнил воздух, перебивая табак.
— ЛА3 приклеим пузом кверху на свободное место, — комментировала она свои действия. — Питание кинем перемычками.
Её пальцы ловко манипулировали тонкими проводками МГТФ во фторопластовой изоляции. Она зачищала концы зубами — варварство с точки зрения ТБ, но Громов нашел в этом что-то невероятно бунтарское.
— Ты зубы испортишь, — сказал он машинально.
— У меня крепкие, — отозвалась она, припаивая проводок к ножке микросхемы. — Не отвлекай.
Следующие двадцать минут прошли в тишине, нарушаемой только шипением припоя и короткими командами Любы: «Поверни», «Держи», «Пинцет».
Они работали как единый механизм. Громов, человек абстракций, вдруг ощутил физическую радость от созидания материи. Он был ассистентом хирурга, который проводит операцию на открытом сердце.
— Всё, — Люба выпрямилась и сняла очки-лупу. На носу остались красные следы от оправы. — Должно работать. Я завела сигнал от неиспользуемого триггера на плате клавиатуры. Если подашь на порт клавиатуры определенный бит… в общем, разберешься. Бит 7. Если он ноль — смещения нет. Если единица — смещение на одну строку.
— Только на одну? — уточнил Громов.
— Ну, я могу сделать на две, но надо еще логику городить. Тебе же для прокрутки надо?
— Для прокрутки идеально, — кивнул он. — Сдвинул на строку, заполнил нижнюю, сбросил триггер, переписал память… Стоп. Если я сброшу триггер, картинка прыгнет обратно вниз.
— Значит, ты должен успеть переписать память, пока триггер держит смещение, — Люба устало потерла глаза. — Женя, я дала тебе аппаратную возможность