Я глядел на экран. Все равно что смотреть на египетские иероглифы. Никакого сходства с BASIC, который я к тому моменту уже отлично знал. В одной из книг кто-то написал: «Если ты знаком с одним языком программирования, то с остальными тоже разберешься ввиду лингвистических и логических схожестей». Однако провернуть такое с машинным языком казалось невозможным.
– Понятия не имею, что это, – ответил я. – Но если все этим занимаются, то и мне стоит браться за дело.
Роб напечатал «800L», после чего на экране появился код в формате языка ассемблера.
– Это язык ассемблера, – объяснил Лэвлок. – То, что написал программист.
Он объяснил, что программа с таким названием приняла код и пересобрала его в машинный язык.
Приближалось Рождество 1982 года, и я попросил у родителей две книги: Assembly Lines: The Book Роджера Вагнера, настоящую библию программиста, и Apple Graphics and Arcade Game Design Джеффри Стэнтона, повествующую о создании аркадных игр на ассемблере. Родители по-прежнему не догоняли происходящее, но уже куда меньше осуждали мое увлечение и продолжали надеяться, что я займусь разработкой «полезных» программ. 25 декабря книги уже лежали под елкой. Счастью не было предела.
– Наконец-то я смогу выучить ассемблер! – раздался мой возглас.
У меня уже имелось справочное руководство для Apple II, однако я не мог понять указанную там продвинутую информацию об ассемблере, потому что важнейшие начальные шаги авторы не описывали. Я будто смотрел на двадцатый этаж, стоя у лестницы, которой не хватало ступенек с первого по девятнадцатый пролеты. Все надежды возлагались на книгу Вагнера, которая открыла бы все тайны, а книге Стэнтона предстояло обучить меня фокусам разработчиков коммерческих видеоигр.
К тому моменту мой самодельный экспресс-курс обучения программированию вышел на запредельные скорости. Я твердо настроился зазубрить про ассемблер все. Почти сразу выяснилось, что машинный язык, показанный мне Робом, делал все то же, что и BASIC, и даже больше, но куда быстрее. Цифровая белиберда оказалась шестнадцатеричным кодом, серией шестнадцати цифр или символов в двадцати четырех рядах. Код ассемблера – это обычный текст, но обязательно нужна программа, которая превратит его в машинный код.
Первым делом требовалось выучить шестнадцатеричную систему счисления, потому что именно ее Apple II использовал для языка ассемблера. Изучаемая в начальной школе десятичная система состоит из десяти цифр от нуля до девяти. Шестнадцатеричная же использует шестнадцать цифр: от нуля до девяти и от A до F. Вот наглядный пример: число 11 из десятичной системы в шестнадцатеричной отображается как буква B. А число 94 обозначается в шестнадцатеричной системе как 5E[10]. Такие переводы я научился делать на автомате, как школьник, заучивающий, что 12×12 – это 144.
На первых порах Роб стал моим лучшим соратником и учителем. Когда дома появился Apple II+, я сразу же принялся за создание своей версии Crazy Climber, нашей любимой аркады, но ничего не получалось. Лэвлок взглянул на код и спросил, почему я не использовал переменные. Ответ звучал очень просто: я не знал, что это такое.
Роб объяснил, что переменные содержали в себе значения, которые могли меняться в ответ на действия геймера или на какие-либо внутриигровые события. Например, переменной «Жизнь» присваивалось значение 3. Если герой получал дополнительную жизнь, показатель увеличивался на один пункт. Переменные использовались для координат осей X и Y, количества патронов, а также всего остального, что не стоило упускать из виду. Это одна из самых базовых концепций программирования, и я ничего о ней не знал. Выражаясь совсем уж простым языком: представьте, что у вас на кухне стоит миска – это переменная. В ней может помещаться как триста горошин, так и десять. Миска не меняется, но ее содержимое переменно.
Я закончил свою версию Crazy Climber, но из-за дилетантства случайно ее удалил – моя первая игра для Apple II+ в истории попросту испарилась! Однако огорчения я не испытал, просто подумал, что следующие разработки будут лучше. Началась работа над Dodge ’Em, в которой кораблю играющего требовалось уворачиваться от выстрелов инопланетян.
Благодаря Робу, рассказавшему про машинный код и переменные, а также подаренным родителями книгам я узнал, как получить доступ к внутренним механизмам Apple II+. Неделя, в которую я получил книгу про ассемблер, стерлась из памяти. Мозг постоянно обрабатывал получаемую информацию об Apple II+, о коде, на котором она работает, и о том, что я могу запустить на этом компьютере. Apple II+ и другие первые домашние ЭВМ можно было изучить «от и до». У моей первой машины имелось 64 килобайта памяти – 65 536 байт. У меня появилось четкое желание знать, за что отвечает каждый байт. Верхние 25 % памяти отводились постоянному запоминающему устройству (ПЗУ), в котором хранились программы, определяющие, как работает Apple II+. Любому, кто писал программу для этого компьютера, требовалось знать точное расположение различных функций в ROM машины. Существовали книги, в которых расписывалась «географическая адресация» ПЗУ Apple II+. Для ускорения обучения я вел заметки, выписывал адреса и пользовался плакатами, на которых указывались важнейшие места памяти, – в частности листовкой Peeks, Pokes and Pointers от компании Beagle Bros. Я твердо вознамерился запомнить про компьютер все: как работает микропроцессор 6502, как устроен экран высокого разрешения с чересстрочной разверткой. Еще хотелось заучить все возможное про ПЗУ и нулевую страницу[11].
10
Понимание шестнадцатеричной системы счисления является неплохим подспорьем для нынешних программистов, но в 1980-х оно выступало ключевым моментом кодинга. Объяснение основ системы выходит за рамки нашей истории, но, если вы заинтересовались, обязательно почитайте об этом. –
11
Нулевой (или базовой) страницей называются первые 256 байт области памяти 8-битного компьютера. Это особенная штука, поскольку процессору 6502 давались особые указания использовать этот объем памяти на высокой скорости. –