И проблема даже не в 128 байтах оперативной памяти. Тетрис влезает в них с небольшим запасом, если массивы игрового поля и фигур делать чисто булевскими, из нулей и единичек, не пытаясь хранить для ячеек еще и цвет.
Вся проблема в видеопамяти. Если кратко — её нет. Ну, не то, чтобы совсем нет — три регистра, суммарным объемом в двадцать байт при ширине игрового поля в сорок символов. Хватает на одну строку половины экрана. Но все, что рисуется слева — тут же повторяется в правой части дисплея в зеркальном отражении.
То есть Макаронный монстр или Омниссия посылали мне намёки на грядущие кошмары, отзеркалив мой фингал на лице Монтгомери Синклера. Вот и не верь после такого в предсказания. То-то экран в Питфоле, в который я чуточку погонял, дабы немного понять консоль, подозрительно симметричный.
И как же этот кошмар обходят? Оказывается, нужно поймать ту самую наносекунду, когда луч находится четко посередине экрана и сменить в нее содержимое всех трех регистров видеопамяти.
Просчитать математику тетриса тут не сложнее, чем для любой другой консоли. А вот вывести игровое поле на дисплей — задача не то, что со звездочкой, а и целого звездного неба будет мало. Сэкономили, блин, пару баксов на чипах памяти! Да роскошная отделка консоли под дерево и хром стоят дороже, чем эта их экономия, приди к ним во сны великий Ктулху! Какая-то Тардис наоборот! Снаружи красиво, дорого-богато, а внутри подлинные тлен и отчаяние.
В нормальных железках ты кладешь кадры в видеопамять и аппаратная часть всё сама нарисует. Тут же натуральная порнография! Приходится разбираться в физике работы электронно-лучевой трубки!
Естественно, поток исполнения кода единственный и синхронный, то есть посылать команды на отрисовку нужно в промежутках между выполнением остальной программы? Семьдесят шесть тактов процессора на каждую строку развертки кинескопа! Верните мне рваную видеопамять Эппл 2! Там она хотя бы в принципе есть! Я всё понял и осознал!
— Наверняка эту миерду придумал какой-нибудь Стив! — раздраженно бросил я, когда при помощи Джона и документации осознал, как глубока кроличья нора. В шутку, естественно, нет у меня никакой стивофобии.
— Стив Майер, — флегматично подтвердил мою шуточную версию Джон, — один из трех разработчиков видеочипа. И еще Стив Джобс в Атари также работал с железом. И Стив Возняк. Но не уверен, занимались ли они домашними консолями или только аркадными автоматами.
Теперь понятно стало, почему несложные казуальные игры под старые консоли писались годы и месяцы. Я, помнится, вспоминал производственный ад, в который угодил разработчик ET, создавший забагованное чудовище. Я попал туда же. И нафиг я вообще под это подвязался? Мог бы оставаться в зоне комфорта, вместе с адекватным железом. VVVVVV писать бы начал. Но нет, купила баба порося, то есть приставку.
Ладно-ладно. Если есть ад, то нам необходим крутой парень с дробовиком и бензопилой, который вынесет всех демонов, раздавая им пинками чингасос. Не на того напали! Кажется, я уже придумал, как выйду из ситуации.
Глава 22
— Джон, я не рассказывал тебе, что такое безумие? Безумие — это повторение одного и того же действия раз разом в надежде на изменение. Разработка под Атари 2600 — вот что есть безумие, — обратился я к молчаливому программеру, пришедшему с распечаткой своего порта Тетриса под Атари 800 и начавшего карандашиком проставлять такты процессора в листинге, прикидывая, как уместить нехитрую логику в концепцию «нарисовать половину экрана за заданное число команд».
Веселья добавляло то, что действия стоимостью в один такт у процессора MOS6507, слегка урезанной версии 6502, как, собственно, и у изначального предка, нет. Минимум два. То есть нам надо нарисовать половину стакана за действия, оцененные четко в 38 попугаев, и добить остальные за оставшуюся длину удава, чтобы в итоге получилось заветное 76.
— Да, очень сложная платформа, я потому и вызвался помогать, так как это вызов, интересная задача, — подтвердил юноша, — мистер Уильямс был против, но я его убедил.
— И решать ее при помощи карандаша и бумаги — истинное безумие.
— Так делали разработчики, которых Кен нанял для переноса моей Зубодробилки. Да, он занял полгода, но получилось хорошо. Не представляю, как ты собираешься справиться за два месяца.
— Мы же программисты, подобную муторную миерду нам сам великий Ктулху велел автоматизировать. Написать утилиту, которая будет считать такты вместо нас.
Идея моя оказалась проста, как двадцать пять центов — запилить анализатор синтаксиса, который подсчитает такты вместо меня. Пройдется по коду модуля, проставит накладные затраты на каждое действие и подобьет итог. Линтер — так подобные скрипты называют в светлом айтишном будущем. Но, кажется, в нынешние лохматые времена хотя бы сам термин уже придумали. Скармливаем ему ассемблерный код и видим прогноз, сколько процессорных действий он займет. Пожалуй, я преуменьшил, когда говорил про дробовик. У нас выйдет если и не БФГ, то, по крайней мере, ракетная установка.
Обстоятельно изложил Джону концепцию.
— Но у тебя ведь очень сжатые сроки, — напомнил коллега, — разумно ли тратить время на инструмент, который не факт, что поможет?
— Лучше день потерять, затем за пять минут долететь, — цитату из советского мультфильма собеседник понять шансов не имел даже теоретически, так как на экранах знаменитое «Главное — хвост!» появится только через несколько лет. — Распиши мне количество процессорных тактов в каждой ассемблерной команде, я их наизусть не помню.
Да вообще не помню, кроме того, что взятая как из лексикона Трейси команда NOP, то есть «ничего не делать», стоит два такта, а однотактовых совсем нет, что очень усложняет жизнь и заставляет ненавидеть саму математическую концепцию четности и нечетности!
Ночь — она звала меня. И Джона вместе со мной. Справились ли мы с задуманным к утру? Решительное нет. Я, может быть, благословлен Омниссией и вообще инженер, но если бы подобные в чем-то революционные штуки писались за одну ночь, то их бы уже кто-нибудь создал. Нельзя просто так взять и написать парсер до рассвета.
Я почти уверен, что нечто подобное уже существует и активно используется разрабами, находящимися в рабстве у Атари и прикованных кандалами на корпоративной галере. Наверняка есть тот же инструмент и у беглых рабов, ныне основавших Активижн.
Джон реально умный парень, быстро понял мою идею и, притащив из дома свой собственный Эппл 2, начал помогать: сначала заполнять таблицу со стоимостью действий в виде структуры на Паскале, а затем еще и отдельные процедуры писать.
Именно Паскаль я выбрал в качестве инструмента для реализации идеи. Во-первых, идеальный компромисс между быстродействием и легкостью кодинга. Во-вторых — удобный доступ к файлам. Читаем листинг построчно, выделяем ключевые слова, оцениваем их стоимость. Материмся на ветвлениях, которые стоят разное число действий, если условие выполнилось или нет.
У нас ушли две недели практически безостановочной разработки с редкими перерывами на сон и еду. Есть такая шутка, что если один программист напишет программу за неделю, то два — за две! Не наш случай. Помощь Джона на самом деле бесценной оказалась, главным образом за счет досконального знания ассемблера под процессоры семейства 6502. Я, со своей стороны, вкладывался знанием приемов командной разработки и общим пониманием принципов устройства линтеров. Мои навыки из будущего и его из прошлого, которое для меня настоящее, отлично друг друга дополнили.
Вообще, групповая разработка на технологиях 1982 — та еще боль, сопоставимая с фрустрацией от столкновения с недоконсолью. Джон с ухмылкой назвал её «Сникернет». То есть кроссовочная сеть. Ты записываешь код на дискету и несешь ее к соседнему столу ножками, после чего другой программер наполовину вручную объединяет ваши листинги.
Банальный копипаст «выделить-скопировать-вставить» в эпоху ретро-компьютеров выглядит, как тот еще цирк с конями. Нельзя просто так взять, открыть файл, скопировать кусок текста и вставить в другой файл. Не умеют так редакторы, в том числе самый продвинутый из имеющихся, включенный в среду UCSD Pascal.