Пиксели и код
В подъезде Волковых Сашка поднялся на нужный этаж, чувствуя, как немного ноют икры после беготни по городу. Он остановился перед массивной дверью, обитой темно-коричневым дерматином.
Он нажал на белую кнопку звонка. За дверью раздалась не пронзительная советская трель, а мелодичный перезвон, похожий на пение электронных птиц.
Шаги послышались не сразу. Замок сухо щелкнул, и дверь приоткрылась. Максим выглядел получше, чем в их прошлую встречу, но всё еще помятым.
— А, пришел, — буркнул Максим, нарушая тишину. В его голосе смешались раздражение и скрытое облегчение. — Ну, заходи, раз приперся. Матери еще нет, отец в командировке. Так что никто над душой стоять не будет.
Сашка молча перешагнул порог и стянул стоптанные кроссовки. Ноги утонули в мягком, густом ворсе дорогого импортного ковра.
Они прошли в комнату Максима.
Там, на широком полированном столе, как алтарь в храме, возвышался он — «Правец-16». Кремовый системный блок, громоздкий ЭЛТ-монитор, широкая клавиатура с высокими механическими клавишами. Для Максима это была просто дорогая статусная игрушка. Для Сашки — вычислительная мощь, о которой он мечтал последние недели. Он посмотрел на компьютер с профессиональным, почти плотоядным вожделением.
Сашка пододвинул стул и сел за клавиатуру. Пластик клавиш был приятным, чуть шершавым. Он достал из кармана куртки тот самый черный квадрат пятидюймовой дискеты.
— Значит, достал свои программы? — Максим присел на край дивана, вытягивая ноги. Он знал, что Сашке нужен был какой-то специфический софт для работы.
— Достал, — Сашка вставил дискету в верхний дисковод и опустил пластиковый флажок. Дисковод утробно крякнул и замигал красным диодом.
Он быстро пробежался пальцами по клавиатуре, создавая на диске «С» папку WORK. Клавиши отзывались гулким, солидным стуком. Скопировав нужные файлы, Сашка вытащил дискету и бережно убрал обратно в конверт.
— Ну и чего дальше? — Максим смотрел на экран, где ничего принципиально не поменялось. Те же строчки, те же буквы. — Игру делать будем?
— Будем, — Сашка откинулся на спинку стула и повернулся к однокласснику. — Только ты не думай, что мы сейчас кнопку нажмем, и у нас на экране игра появится. Твой «Правец» и моя плата в гараже — это как два иностранца. Если я сейчас начну писать код для своей приставки прямо в лоб, этот компьютер просто не поймет, что я от него хочу, и выдаст ошибку.
— Логично, — кивнул Максим. До него доходило туго, но техническая смекалка у парня всё-таки была. — И как их подружить?
— Мне нужно написать переводчик. Транслятор. Программу, которая будет читать мой текст и переводить его в нули и единицы, понятные процессору приставки. И вот эту штуку я буду писать не один день. Сегодня только каркас набросаю. Базовую структуру, чтобы он хотя бы начал файлы читать.
Максим уныло вздохнул.
— То есть ты будешь сейчас часа два пялиться в строчки, а я должен рядом сидеть и смотреть? Захватывающе. Прямо чувствую, как мы покоряем мир.
Сашка усмехнулся.
— А кто сказал, что ты будешь сидеть без дела? У нас разделение труда. Я пишу логику, ты делаешь графику. У тебя тетрадь в клетку есть?
Максим неохотно поднялся, порылся в нижнем ящике стола и кинул перед Сашкой толстую общую тетрадь и заточенный простой карандаш.
Сашка открыл чистый разворот.
— Смотри сюда, Волков. Наша приставка строит картинку из кусочков. Тайлов. Каждый кусочек — это квадрат восемь на восемь или шестнадцать на шестнадцать пикселей. Пиксель — это одна тетрадная клетка.
Сашка быстро расчертил на бумаге жирный квадрат шестнадцать на шестнадцать клеток.
— Понял? — спросил он. — Теперь слушай задачу. Нам нужен главный герой. Динозавр.
— Динозавр? — Максим искренне удивился. — Почему не солдат? Или ниндзя какой-нибудь?
— Потому что ниндзя надо анимировать: руки, ноги, повязка на голове, меч. Это сложно для первого теста. А динозавр — он монолитный. У него только ноги переставляются. Бежит себе по пустыне слева направо. Ему навстречу кактусы едут. Нужно будет перепрыгивать. Игра на рефлексы. Скорость постоянно растет. Проще некуда, но затягивает намертво.
Сашка придвинул тетрадь к Максиму.
— Рисуй динозавра. Вид сбоку. Две картинки рядом: на одной ноги вместе, на другой врозь. Это будет анимация бега. Клетка закрашена — значит, точка на экране горит. Клетка пустая — фона нет. Имей в виду, никаких кривых линий тут не получится. Только ступеньки.
Максим взял карандаш, повертел его в руках, глядя на пустую клетчатую сетку.
— Детский сад какой-то... — пробормотал он, но стул пододвинул.
Сашка отвернулся к монитору. Он запустил редактор кода. Черный экран, мигающий курсор. Пора было закладывать фундамент. Он начал набивать первые строки, определяя переменные и массивы, которые будут хранить инструкции чужого ассемблера. Работа требовала сосредоточенности: нужно было держать в голове архитектуру КР580ВМ80А, все его регистры и коды команд.
В комнате повисла тишина, прерываемая только ритмичным клацаньем клавиатуры да легким шуршанием грифеля по бумаге за спиной.
Минут через двадцать Максим шумно выдохнул и отбросил карандаш.
— На, принимай работу.
Сашка нажал сочетание клавиш, сохраняя файл, и развернулся на стуле. Максим протягивал ему тетрадь с видом оскорбленного художника, которого заставили красить заборы.
В расчерченном квадрате красовалось нечто шипастое. Максим явно старался нарисовать тираннозавра. Огромная пасть, усеянная торчащими во все стороны одиночными пикселями-зубами, узкие злые глаза-щелки, чешуя на спине, переданная хаотичной штриховкой отдельных клеток. Существо выглядело так, будто болело бешенством и собиралось кого-то сожрать.
Сашка потер переносицу.
— Макс... это что за Годзилла на минималках?
— Нормальный тираннозавр, — насупился Волков. — Я старался. Попробуй сам этими квадратами рисовать, это вообще неудобно.
— Я понимаю, что неудобно, — Сашка постучал пальцем по бумаге. — Но ты подумай, кто в это играть будет. Школьники. Дети. А у тебя тут монстр из фильма ужасов. Если мы выведем это на экран, оно будет смотреться как грязная клякса с шипами. Слишком много мелких деталей.
— И что делать? — огрызнулся Максим.
— Упрощать. Убирай злость. Нам нужен не маньяк, а персонаж. Символ. Сделай его... ну, более мультяшным, что ли. Голова побольше, глазик — просто один белый квадрат в черной морде. Чтобы он вызывал симпатию, а не желание позвать милицию. И вот эту чешую на спине убери. Просто ровный контур.
Максим раздраженно выхватил тетрадь обратно.
— Мультяшного ему подавай... Ладно.
Он взял ластик и начал яростно стирать своего монстра, едва не прорывая бумагу. Сашка вернулся к коду. Парня нужно было немного позлить, чтобы включилось упрямство. Иначе быстро перегорит.
Прошло еще минут сорок. Компилятор обретал черты. Сашка уже написал блок, отвечающий за чтение исходного файла построчно, и теперь прописывал логику обработки пробелов и табуляций — самую нудную часть.
— А теперь?
Голос Максима звучал уже без прежней агрессии, скорее с оттенком усталой гордости.
Сашка снова посмотрел в тетрадь.
На этот раз было гораздо лучше. Динозаврик получился компактным, с узнаваемой туповатой мордой и короткими передними лапками. Силуэт читался отлично даже в виде грубых квадратов. Но глаз Сашки, наметанный на технические ограничения 8-битного железа, сразу зацепился за проблему.
Максим, пытаясь придать плоскому рисунку объем, начал штриховать клетки внутри контура. На брюхе динозавра карандаш был еле заметен, на спине — нажат чуть сильнее, а контур обведен жирно. Получился плавный, красивый переход тени. Градиент.
— Слушай, нарисовано реально круто, — честно признал Сашка. — Форма — то что надо. Прямо в точку.
Максим самодовольно хмыкнул.
— Но есть одна проблема, — добавил Сашка, и лицо Волкова снова вытянулось. — Твои тени.
— А что с ними не так? Я объем дал, чтобы плоским не смотрелся.
— Объем отличный. Только железо его не поймет. У моего видеочипа нет палитры на сотни цветов. У нас на всё про всё четыре градации. Черный, темно-серый, светло-серый и прозрачный. Всё. Жесткие цвета. Твои плавные переходы карандашом компьютер просто не переварит.
Максим растерянно посмотрел на свой рисунок.
— И как тогда? Вообще без теней делать? Одним цветом заливать?
— Стиль, Макс. Ищи стиль в ограничениях. Убирай полутона. Делай резкий контур. Черное тело, белый глаз, светло-серое брюхо. Используй ограничения железа как художественную фишку. Сделай его минималистичным, как дорожный знак. Понятно?
Волков почесал затылок карандашом. Кажется, до него начало доходить. Ограничения превращали глупое раскрашивание в настоящую головоломку.
Внезапно в коридоре громко щелкнул замок. Дверь скрипнула, послышался звук опускаемых на линолеум тяжелых сумок и усталый женский вздох.
Максим мгновенно подобрался, спина выпрямилась.
— Мать пришла, — быстро зашептал он, бросая взгляд на дверь комнаты.
Он вскочил и шагнул в коридор. Сашка остался сидеть за столом, положив руки на колени.
Из прихожей донесся голос Риммы Эдуардовны. В нем слышалась та специфическая властность, которая бывает у людей, привыкших руководить на работе.
— Максим, ты опять весь день дома просидел? В квартире духота. И почему обувь чужая в коридоре? Кто у тебя?
Сашка услышал, как голос Максима неуловимо изменился — стал мягче, покладистее.
— Мам, привет. Да, у меня одноклассник. Мы тут занимаемся.
Шаги приблизились. Дверь в комнату открылась шире, и на пороге появилась мама Максима. Элегантная женщина лет сорока пяти, с идеальной укладкой, несмотря на жару, в строгом легком костюме.
Ее взгляд скользнул по Сашке, затем задержался на зеленом экране компьютера, по которому бежали бесконечные строки кода, и остановился на тетради с расчерченными клетками.
— Здравствуйте, — вежливо сказала она. — Максим, ты не представишь друга?
Сашка встал со стула, чуть склонив голову.
Максим заговорил ровно, словно репетировал эту речь заранее:
— Мам, это Саша Петров. Мы вместе учились. Он у нас гений по математике и компьютерам. Я попросил его помочь мне информатику подтянуть для вступительных, а то я в алгоритмах плаваю немного. Вот, сидим, готовимся.
Сашка мысленно поаплодировал. Легенда была железобетонной.
Римма Эдуардовна перевела взгляд на Сашку. Словосочетание «лучший по математике» сработало как пароль. Подозрительность на её лице сменилась одобрительным, почти теплым выражением.
— Вот как? Информатика... Это дело хорошее, нужное, — она улыбнулась. — Здравствуйте, Саша. А то я всё ругаюсь на него, что он за этой импортной машиной только зрение портит да игрушки гоняет. А вы, значит, делом заняты.
— Здравствуйте, Римма Эдуардовна, — Сашка постарался придать голосу максимум скромности и интеллигентности. — Максим зря скромничает. Он материал схватывает на лету. Мы сейчас основы программирования разбираем, логику построения структур.
— Ну и слава богу, — вздохнула она, явно успокоенная тем, что сын в надежной компании, а не шатается по подворотням. — Вы сидите, занимайтесь. Я сейчас на кухне разберусь, чайник поставлю. У меня конфеты есть. Максим, через пятнадцать минут приходите пить чай.
Когда дверь за ней прикрылась, Максим выдохнул так громко, словно до этого не дышал вовсе. Он показал Сашке большой палец.
— Прокатило, — шепнул он. — Батя бы больше вопросов задавал, но с матерью эта тема про учебу работает безотказно. Теперь у нас официальное алиби на все вечера.
Сашка сел обратно за клавиатуру и нажал комбинацию для сохранения файла. На зеленом фоне мелькнуло слово "Saving...".
— На сегодня всё, — сказал Сашка, глядя на часы в углу экрана. Половина десятого. — Базу я заложил. Завтра продолжу.
Он начал собирать свои вещи, укладывая дискету в конверт. Максим взял тетрадь с динозавром и покрутил её в руках.
— Слушай, Петров... А когда эта штука... — он кивнул на экран, — когда она реально заработает? Ну, чтобы игру можно было запустить?
— Недели через две, если не будем тупить, — Сашка закинул рюкзак на плечо. — Сначала допишу компилятор. Потом напишу эмулятор, чтобы мы могли видеть на твоем мониторе, как динозавр прыгает, не бегая каждый раз в мой гараж. А потом уже перенесем всё на чип.
Максим покачал головой.
— Жесть. Столько мороки ради одного пиксельного крокодила.
— Мы не крокодила делаем, Макс. Мы создаем инструмент. Когда всё заработает, мы сможем клепать такие игры одну за другой.
Они выпили чаю с конфетами на безупречно чистой кухне под одобрительными взглядами Риммы Эдуардовны, после чего Сашка попрощался и вышел в душный летний вечер.
Спускаясь по ступеням, он чувствовал, как гудят уставшие глаза. День был долгим. Но начало было положено. Враг стал соучастником, инструменты куплены, а дома его ждал гараж, где из кучи советского текстолита постепенно рождалась машина, способная переписать будущее.