Станислав Миков – Проект «Сфера-80»: в поисках юности (страница 77)
В коде Пети больше не было формул. Вместо этого шел исполняемый машинный код, написанный прямо в шестнадцатеричных числах.
C000: 3E 20 (загрузить код «пробел»)
C002: 32 FA F0 (записать пробел в ячейку глаза)
C005: 01 FF FF (загрузить в регистр число для задержки)
C008: 0B (уменьшить счетчик)
C009: 78 B1 C2 08 C0 (крутиться в пустом цикле)
C00E: 3E 2A (загрузить код «звездочка»)
C010: 32 FA F0 (записать звездочку обратно)
Я замер, ощущая, как по спине пробежал холодок профессионального восторга. Число 61690. В шестнадцатеричной системе это 0xF0FA. Я прекрасно знал, что находится по этому адресу. Это был не кусок оперативной памяти для пользовательских переменных. Это была середина видеобуфера. Та самая область памяти, которая аппаратно напрямую считывалась видеоконтроллером и выплевывалась на экран телевизора «Юность» в виде светящихся символов.
Ребенок не стал перерисовывать кота формулами. Он не стал использовать штатные подпрограммы системного монитора, которые мы с Громовым вылизывали неделями. Он открыл карту распределения памяти, высчитал на бумажке точный байт, отвечающий за физическое расположение «глаза» своего нарисованного кота, и записал туда код пробела. Звездочка исчезла — кот «закрыл» глаз.
Затем он написал машинный цикл, чтобы ЦУБ потратил такты впустую — это была примитивная, но абсолютно рабочая задержка.
А затем засунул в тот же байт шестнадцатеричный код 2A. Звездочка загорелась снова.
И замкнул это в бесконечный цикл.
Он сделал аппаратный хак. Семиклассник, в тысяча девятьсот семьдесят восьмом году, имея в распоряжении только рыхлый мануал и скрипучую клавиатуру, догадался, как обойти абстракции языка и обратиться к «голому железу».
Это был не просто код. Это был манифест.
Тем временем в лабораторию ввалился Евгений Громов. Он выглядел так, словно его переехал асфальтоукладчик, а потом сдал назад. Свитер крупной вязки съехал на одно плечо, волосы торчали во все стороны, а в зубах дымилась неизменная, прилипшая к нижней губе сигарета.
— Леша, это звездец, — мрачно возвестил он, плюхаясь на стул напротив меня и стряхивая пепел прямо в пустую банку из-под майонеза, заменявшую нам пепельницу. — Эти дуболомы из первого отдела завернули нам алгоритм контрольной суммы на перфоленте. Говорят, не соответствует отраслевому стандарту. Какой, к черту, стандарт? Мы его сами придумали позавчера! Я сейчас убью кого-нибудь. Дай спирту.
— Спирт у Липатова в сейфе, а Липатов в цеху, — спокойно ответил я. — Жень, иди сюда. Посмотри на это.
Я подвинул к нему тетрадный листок.
Громов сфокусировал мутный взгляд на бумажке. Вытащил сигарету изо рта.
— Что это? Очередная кляуза? Седых требует, чтобы мы комментарии к коду писали по-русски, а не транслитом?
— Это письмо от пользователя, — я с удовольствием произнес это слово, которое здесь, в этом времени, звучало почти как неологизм. В СССР были «потребители», были «эксплуатанты», но «пользователь» — это из другой, моей эры. — Из тринадцатой школы. Пацан, седьмой класс. Написал программу.
Громов фыркнул, выпуская струю сизого дыма.
— Ой, да ладно. Ну заполнил ячейки символами по координатам. Молодец, возьми с полки пирожок, положи на место.
Он пододвинул листок ближе. Его глаза, красные от недосыпа, пробежали по строчкам с координатами. Губы презрительно кривились.
А затем он дошел до пятисотой строки.
Я наблюдал за ним с почти садистским удовольствием. Я видел, как остановился его взгляд. Как медленно, словно у робота, у которого заело сервопривод, приоткрылся рот. Как сигарета в его руке замерла в миллиметре от майонезной банки.
Громов был гениальным системным программистом. Он мыслил адресами и прерываниями. Ему не нужно было переводить `61690` в шестнадцатеричный код — он знал эту область памяти наизусть, он сам ее размечал.
— Погоди-ка, — хрипло произнес Евгений. Он бросил сигарету в банку (раздалось тихое шипение) и схватил листок двумя руками. Наклонился так низко, что чуть не коснулся бумаги носом. — Прямая запись? Машинным кодом в буфер видеоконтроллера?
— Ага, — я кивнул, не скрывая улыбки.
— Он… он не использовал подпрограмму отрисовки. Он просто сунул байт прямо в память, — Громов поднял на меня ошарашенный взгляд. — Минуя прерывания. Минуя проверки границ экрана.
— И сделал задержку пустым циклом, чтобы получить эффект движения, — добавил я. — Котик моргает, Жень.
— Котик моргает, — эхом отозвался Громов. Он вдруг нервно рассмеялся, откинувшись на спинку стула и хлопнув себя ладонью по колену. — Ты понимаешь, что этот мелкий пионер сделал? Я специально спрятал адреса видеопамяти в конец руководства, чтобы туда никто не лез, чтобы систему не повесили! А он прочитал, посчитал смещение для конкретных знакомест на экране и вкорячил туда данные напрямую!
Громов вскочил со стула. Сонливость и похмелье сняло как рукой. Он начал мерить шагами тесное пространство лаборатории, лавируя между кульманом и верстаком.
— Леша, это же… это же охренеть можно! Ему тринадцать лет! У нас инженеры в вычислительном центре полгода не могут понять, как стек работает, а этот пацан сидит с тетрадкой в клеточку и высчитывает физические адреса видеобуфера!
— И жалуется, что клавиша «Ввод» заедает, если жать сбоку, — заметил я, подкидывая дровишек.
— Да хрен с ней, с клавишей! Пусть Липатов сам свои железки облизывает! — Громов остановился напротив меня, его глаза горели тем самым сумасшедшим огнем, который я видел, когда он переписывал загрузчик. — Ты понимаешь, что это значит? Мы дали им инструмент. Не игрушку. Не учебное пособие по вычислению синусов для уроков алгебры. Мы дали им микроскоп, которым можно забивать гвозди, и они уже поняли, как им забивать гвозди!
Он подошел к столу, снова посмотрел на листок, словно проверяя, не привиделось ли ему это.
— Я хочу к ним поехать, — вдруг совершенно серьезно сказал Евгений. — Серьезно, Морозов. Я хочу поехать в эту тринадцатую школу. Я готов лично учить таких малолетних гениев. Если им показать ассемблер… Господи, если этому Пете показать, как работают индексные регистры, он через год нам весь системный монитор перепишет так, что код будет просто летать.
Я смотрел на Громова и чувствовал, как внутри меня разжимается какая-то тугая, ледяная пружина, которая держала меня в напряжении все эти месяцы.
Ради чего мы всё это делали?
Ради премий? Смешно. Ради того, чтобы утереть нос бюрократам вроде Седых? Это было приятно, но мелко. Ради того, чтобы спасти советскую микроэлектронику? Я был реалистом. Я знал историю. Я знал, что произойдет с этой страной в девяносто первом году, и никакая «Сфера-80», даже выпущенная тиражом в миллион экземпляров, не остановит падение цен на нефть и паралич плановой экономики.
Но история — это не только макроэкономика. Это люди.
В моем, 2026 году, ИТ-индустрия стояла на плечах гигантов. На плечах тех, кто в гаражах собирал первые Apple, тех, кто писал ядро Linux, тех, кто создавал культуру хакеров — в исконном, светлом значении этого слова. Людей, которым было интересно, как устроена система, и которые хотели заставить ее делать то, для чего она не предназначалась.
Здесь, в Советском Союзе образца 1978 года, мы только что посадили семя этой культуры. Петя Снегирев, семиклассник, который хотел заставить кота моргать, не побоялся сломать систему. У него было незашоренное мышление. Он не знал, что «так не принято». Он просто видел задачу и нашел изящное, грязное, хакерское решение.
Вот он. Смысл.
Появился первый «юзер-креатор». Первый человек извне, который взял наше творение и сделал его своим.
Я улыбнулся. Широко, искренне, не пытаясь скрыть эту улыбку за привычной маской циничного профессионала.
Я встал из-за стола. Подошел к своему системному блоку «Сферы-80», стоявшему на краю, включил его и ВКУ. Раздался знакомый, успокаивающий писк строчного трансформатора. На темно-сером экране появилась белая надпись ГОТОВ.
Я быстро, вслепую настучал на клавиатуре код из письма. Все строки с координатами я, конечно, вводить не стал — нарисовал квадратный контур головы кота, но машинный код с циклами задержки вбил в точности так, как написал Петя.
Громов стоял за моим плечом, шумно дыша.
Я нажал пресловутую клавишу ввода.
Экран мигнул. В центре появилась угловатая белая физиономия. А через секунду внутри этой физиономии погасли и снова загорелись две точки.
Кот моргал.
Аппаратный хак работал безупречно. Задержка была подобрана идеально — цикл на нашем слабеньком ЦУБе выполнялся как раз около доли секунды, создавая иллюзию живого движения.
Мы с Громовым стояли в душной, пропахшей канифолью лаборатории, смотрели на примитивную анимацию на экране изпотрошенного телевизора «Юность», и оба понимали: мир только что необратимо изменился.
Это стоило всего. Стоило бессонных ночей в прокуренном вагоне электрички на Москву. Стоило унизительных разговоров с чиновниками. Стоило выклянчивания деталей на складах. Стоило моих фантомных болей по интернету и смартфону.
Я выключил компьютер. Экран погас, оставив лишь медленно тающую белую точку в центре кинескопа.
Затем я взял со стола листок с кодом Пети Снегирева. Оглянулся. На стене, рядом с доской, висел кусок пробкового покрытия, куда Липатов педантично прикалывал графики усадки пластика и таблицы допусков. На столе у Липатова, в пластиковом органайзере, лежали канцелярские кнопки — ровно, одна к одной, отсортированные по цветам. Сергей Дмитриевич ненавидел, когда кто-то брал его вещи.