Итак, я потратил на Sinclair QL почти две тысячи долларов. И писал для него одну программу за другой. Я все время искал всякие интересные задачи. У меня был компилятор и интерпретатор языка Форт, с которыми я и возился. Форт — это очень странный язык; сейчас им уже никто не пользуется. Эта игрушка, рассчитанная на определенную рыночную нишу, в 80-е годы довольно широко использовалась для разных целей, но по-настоящему популярной так и не стала, потому что оказалась слишком сложной для непрофессионалов. Особой пользы от Форта не было.
Программный инструментарий я писал себе сам. Одной из моих первых покупок для Sinclair был модуль расширения с картой EEPROM (электрически стираемым программируемым постоянным запоминающим устройством). Туда можно было записывать информацию самостоятельно, пользуясь специальными модулями, и эта информация сохранялась при выключенном питании. Так я мог держать свои инструменты всегда под рукой, не тратя на их хранение драгоценное ОЗУ (оперативное запоминающее устройство), а ОЗУ целиком использовать под программы.
Операционками я заинтересовался так: купил флоппи-контроллер, чтобы не пользоваться микроприводами, но к нему прилагался такой поганый драйвер, что пришлось написать новый. Пока писал — обнаружил проколы в самой операционной системе или по крайней мере несоответствие между тем, что обещала документация, и тем, что реально происходило. Я с этим столкнулся, когда моя программа отказалась работать.
Поскольку мои-то программы — ясное дело — всегда идеальны, я понял, что тут дело в другом. Пришлось пойти дальше и дизассемблировать операционную систему.
Можно накупить книг с частичными листингами операционной системы. Большое подспорье. Еще нужен дизассемблер — программа перевода машинного кода на язык ассемблера. Это важно, потому что по машинному коду очень трудно отслеживать работу алгоритма. Вдруг натыкаешься на переход к числовому адресу — читать невозможно. Хороший дизассемблер заменяет номера именами и при этом позволяет выбирать эти имена. А еще он помогает найти определенную цепочку команд. У меня был собственный дизассемблер, который давал довольно симпатичные листинги. Когда что-то не работало, я мог потребовать листинг, начиная с определенного места, и увидеть все, что собиралась делать операционная система. Иногда я использовал дизассемблер не потому, что что-то сбоило, а просто чтобы узнать, как оно должно работать.
Меня бесило, что операционная система QL предназначалась только для чтения. Там ничего нельзя было изменить. Нет, там были выходы, где можно было передать управление какими-то функциями собственным программам, но только в определенных местах. Гораздо лучше, если в операционной системе можно заменять все. Дурацкая идея — записывать операционку в ПЗУ (постоянное запоминающее устройство).
Хоть я и сказал, что в Финляндии полно фанатов новых технологий, Sinclair QL не завоевал в этой седьмой по размерам стране Европы сколько-нибудь значительных позиций. И поскольку рынок был так мал, всякую обновку для этой революционной суперсовременной машины приходилось заказывать в Англии и получать по почте. Для этого надо было сначала прочесать каталоги в поисках продавца нужной штуки. Потом — добыть удостоверенный чек и неделями ждать доставки (это было до эры Amazon.com и кредитных карточек). Через все это мне пришлось пройти, когда я надумал увеличить ОЗУ со 128 до 640 килобайт. И мытарства повторились снова, когда я покупал новый ассемблер для перевода ассемблерных программ в машинный код (нули и единицы) и редактор связей, который по существу является текстовым процессором для программирования.
Новый ассемблер и редактор работали прекрасно, но они были на микроприводах и их нельзя было перенести на EEPROM. Поэтому я написал собственный редактор и ассемблер и дальше использовал только их. Обе программы были написаны на ассемблере, что кажется невероятно глупо по нынешним меркам. Это очень сложный и нудный процесс: решение задачи на ассемблере занимает раз в сто больше времени, чем, например, на Си (который тогда уже был).
Я добавил несколько команд к интерпретатору, который прилагался к машине. В результате, если я хотел что-то отредактировать, я автоматически запускал свой редактор — он всегда был под рукой. Мой редактор был быстрее входившего в комплект машины. Особенно я гордился скоростью вывода символов на экран. Обычно для машин такого класса экран заполняется символами так медленно, что видно, как прокручивается текст. А мой редактор выстреливал текст с такой скоростью, что при быстрой прокрутке экрана все сливалось. Для меня это было важно. Машина стала гораздо проворнее, и я знал, что вложил в это много труда.
В то время мало кто из моих знакомых так же увлекался компьютерами, как я. В школе был компьютерный клуб, но я там редко бывал. Туда ходили желающие познакомиться с компьютерами. Во всей моей гимназии было человек 250, не больше, и вряд ли кто-нибудь еще пользовался компьютером с десяти лет.
Мне очень нравилось программировать игры для Sinclair QL. Я переписывал для него свои любимые игры с VIC-20, иногда что-то добавляя. Но они редко становились лучше: машина была круче, идея же игры оставалась неизменной.
А вот свою, пожалуй, самую любимую игру — «Астероиды» — я так и не смог как следует скопировать. А все потому, что в то время во всех аркадных играх вроде «Астероидов» использовалась настоящая векторная графика. При этом вместо отдельных точек — пикселов — в основу графики клали принцип кинескопа, когда позади него помещают пушку, стреляющую электронами, которые отклоняются магнитами. При этом разрешение графики значительно повышается, но повторить ее очень трудно. Запрограммировать игру можно, но если делать это на компьютере, у которого нет специальных графических возможностей, то смотрится она убого.
Помню, как я программировал «Пакмана» на ассемблере. Прежде всего пришлось вспомнить, как: именно выглядят персонажи. Потом постараться нарисовать их в цвете на листке с сеткой 16 на 16. Если есть талант художника, то может выйти неплохо. Но у такого маляра, как я, получились лишь жалкие карикатуры на персонажей «Пакмана».
Так что мой клон был не фонтан. Но я им все равно гордился. Играть в него было можно, и я послал клон в один из журналов, печатавших компьютерные программы. Я уже продал некоторые свои программы другим журналам и думал, что и эта пойдет.
Но ошибся.
Прежде всего программа была написана на ассемблере. А это значит, что, если при набивке напечатанного в журнале текста сделать хоть малюсенькую ошибку, она не заработает.
Писал я и собственные игры. Но тут нужен особый склад ума. Для игр настолько важна производительность, что приходится залезать очень глубоко в аппаратное нутро компьютера. Это я мог, но мозги у меня не игрового плана. Сама по себе большая скорость или крутая графика еще не делают игру классной. Тут важнее всего какая-то зацепка — то, что заставляет в нее играть. Это как с кино. Спецэффекты — это вещь, но нужен еще и сюжет. А у моих игр сюжет всегда хромал. В игре важно развитие событий, идея. Часто развитие заключается в простом ускорении действия. Как, например, в «Пакмане». Иногда сменяется лабиринт или чудовища начинают все искуснее тебя ловить.
При программировании «Пакмана» меня увлекла такая задача: как сделать, чтобы картинка не мерцала. В старых компьютерных играх это был типичный дефект, потому что без специального оборудования персонажи непременно мерцают. Для того чтобы переместить героя, нужно убрать его старое изображение и нарисовать новое. При плохой синхронизации момент, когда изображения нет, становится заметен и картинка мигает. От этого можно избавляться разными путями. Например, вначале нарисовать нового персонажа, а потом убрать старого. Тут нужна осторожность: важно не стереть ту часть старой картинки, которая перекрывается новой. При этом вместо неприятного мерцания иногда возникает эффект тени персонажа на экране. Это гораздо лучше для восприятия: вместо мерцания появляется легкая размытость, которая создает иллюзию движения. Однако такое решение требует множества ресурсов, и пишутся такие программы медленно.