Начало: Вехи
Если бы тогда у меня было в доступе то, что сейчас есть на Базисе1), всё бы, наверное, было по-другому. Но как говорится, история не знает сослагательного наклонения.
Моей настольной книгой по изучению бейсика было руководство, которое прилагалось к компьютеру. Я его начал штудировать ещё до того, как удалось подключить компьютер к телевизору.
Первым, что я попробовал, – нарисовать ослика из моей первой книжки по программированию. У меня ушло довольно много времени, пока я научился загружать с кассеты бейсик и пользоваться клавиатурой. В конце концов, я победил компьютер и свой тупизм – ослик получился :)
Цель была достигнута, но какой ценой? Это была «мегакрутая» программа, круче, наверное только «Hello, World!»2):
100 CLS:PRINT 110 PRINT " * *" 120 PRINT " ***" 130 PRINT " *****" 140 PRINT " *******" 150 PRINT " ** *****" 160 PRINT " ***************" 170 PRINT " ************* *" 180 PRINT " ************* **" 190 PRINT " ************* **" 200 PRINT " ** ** ** ** *" 210 PRINT " * * * *" 220 PRINT " * * * *" 230 PRINT " ** * * *" 240 PRINT " * ** ** **"
Результат на экране меня, конечно, удовлетворил. Но вот программа не очень – в ней вообще не было никакого «волшебства». И я стал пытаться сделать её наиболее похожей на фортрановский «оригинал».
Фортран в операторе FORMAT умел повторять пробелы и другие символы. Например 10Х делало 10 пробелов, а 15('*') – 15 звёздочек. Бейсик тоже умел делать пробелы в операторе PRINT, например SPC(10), а вот выводить сразу в принте нужное количество символов не умел.
Сперва я «перевёл» все пробелы. Кстати, заметил, что иногда 4 пробела писались как 4X, а иногда внутри строки '*⌴⌴⌴⌴*'.
Дальше решил как-то автоматизировать (тогда я ещё и слова-то такого не знал «автоматизировать») повторение звёздочки нужное число раз. Пытался понять, можно ли написать что-то типа STAR(15). Такое, конечно, не работало :)) Вычитал, что можно сделать свою функцию. Но написать при помощи DEF FN одну единственную функцию, возвращающую нужное число звёздочек, тоже не получалось. В результате просто немного «оптимизировал» программу.
Но всё равно что-то свербило. Стал думать о том, как написать подпрограмму, которая выдаёт строку с нужным количеством символов. Написал и использовал её для рисования рамочки вокруг ослика. А также добавил всяких отступов и название.
Получилась вот такая крутизна:
Теперь результат меня удовлетворил. Я научился писать подпрограммы, да и в самой программе появилось то самое отсутствующее в самом начале «волшебство», когда из каких-то непонятных символов получается картинка.
Более подробно изучать возможности бейсика я стал на рекламных программах3), которые шли в стандартной поставке на системной кассете. В этих программах всё было довольно «весело, двигалось и звучала неземная музыка»4). В первую очередь меня интересовало, как работать с цветом, как писать большие буквы, как рисовать не символами, а линиями, как делать музыку. И я стал ковырять эти программы, выдирать оттуда кусочки кода, вставлять в свои.
Вначале я стал играться с цветом, благо что Вектор-06Ц позволял насладиться этим в полной мере. Научился задавать требуемый цвет при помощи COLOR, а при помощи PLOT X,Y,2 устанавливать графический курсор в нужную точку. Оператором LINE STEP N,M,BF рисовал нужного размера закрашенные текущим цветом прямоугольники. Оказалось, что 256 цветов – это на самом деле 16 основных цветов * 16 цветов подложки. То есть рисовать графику можно одновременно только 16-ю основными цветами. А вот «цвет символа» – это комбинация цвета самого символа и его подложки. И таких комбинаций как раз 16*16=256. Какими будут эти самые 16 цветов, задаётся в палитре при помощи SCREEN 0. Здесь их уже можно выбрать из общей полной 256-тицветной палитры. При изменении палитры цвета на экране моментально меняются. Вот тут-то мне и попёрло :)
Получилось не только вырвиглазно, но ещё и динамично. Настоящая цветомузыка (только пока без музыки)!
Как я узнал уже намного позже, на ассемблере можно было добиться отображения вообще всех возможных 256-ти цветов одновременно5). Но мне тогда хватало и 16-ти.
Следующим этапом изучения возможностей бейсика стали символы. Во-первых, я сначала попробовал просто с клавиатуры ввести все возможные символы. Оказалось, что не так-то это и просто. Вычитал, что символ можно напечатать по его коду. Также выяснилось, что некоторые коды были служебными, и если попытаться комбинацией PRINT CHR¤(N) в цикле от 0 до 255 вывести все символы, то происходит что-то странное. То динамик бикает, то ничего не выводится, то экран пролистывается или вообще стирается. Оказалось, что первые 32 кода служебные, и не всегда попытка их напечатать приводит к успеху. Это получилось обойти, задействовав оператор LINE 1,1,BS, который реализовывал печать больших символов в графическом виде. Масштаб можно было задать 1, и получалось как будто обычный PRINT. Символы после этого печатались как надо, хоть и медленно.
Заодно я научился писать большими буквами с разными видами обводки и эмуляцией тени. А ещё делать комментарии!
На самом деле это уже было прям мегакруто. Я научился писать программы! Инициировать переменные, делать циклы и условные ветвления, использовать встроенные функции, писать подпрограммы, работать с цветом и с символами, даже линии рисовать. Теперь надо было приступать к рисованию примитивами. И я приступил :)
В рекламной программе, про которую я уже говорил, мне понравилось два момента – с закрашенными кружочками и дракончиком. Программировать заливку прямоугольников и больших символов я уже научился. Теперь предстояло овладеть рисованием линий, кругов и пользоваться заливкой произвольных областей.
Сам не стал ничего писать, а просто разобрал код, который это делает, и построчно его прокомментировал. Узнал как вычислять центр, задавать массивы, про оператор рисования окружности CIRCLE, вычисления цвета точки на экране POINT, про оператор заливки PAINT, как скрытно рисовать чёрным по чёрному. Когда знаешь, как всё сделано, всё стало казаться простым :)
Осталось разобраться с драконом.
Стал изучать, как это сделано. Оказалось, до банального просто.
Сначала идёт блок данных. За ним оператором RESTORE указывается строка с данными, с которой надо начинать чтение оператору READ. Далее очищается экран CLS и устанавливается белый цвет COLOR 15. В строках с оператором DATA записаны 286 пар координат. В цикле они вычитываются. Если обе координаты отрицательные, то по модулю этих координат устанавливается курсор PLOT ABS(x),ABS(y),1 , а если положительные – от текущего положения курсора до этих координат рисуется линия LINE X,Y. Далее идёт 54 тройки чисел: 2 координаты и цвет. Они точно так же считываются в цикле и в нужных местах «тыкается» PAINT X,Y,Z,15, который из точки X,Y делает заливку цветом Z до границы, нарисованной 15-м цветом. Элементарно, Ватсон!
Самым интересным было – как эти координаты придумали? Неужели рисовали наобум? В общем, я решил тоже нарисовать что-то своё :) Тогда я очень любил слушать музыку группы Мастер, поэтому и взялся рисовать их логотип.
Рисовать на миллиметровке, чтобы потом по сетке можно было в нужном масштабе увеличить рисунок – это я умел, не зря в школьной редколлегии состоял в качестве основного школьного оформителя. Взял миллиметровку 25×25 см, нарисовал на ней логотип и долго мучился, высчитывая координаты. Самое главное – это то, что я протупил, и считал от левого верхнего угла, а надо было от левого нижнего.
На бумажке всё было красиво, а вот на экране из-за двойной окантовки пришлось долго подгонять. Туго пришлось на молниях. Но оно того стоило. Мне кажется, что получилось очень симпатично :) Особенно если учесть, что отрисовывалось это красиво, с незаметным заполнением и внезапной раскраской. Помнится, я ещё хотел сделать, чтобы в процессе играла «неземная» музыка, а именно музыка группы Мастер. Но так как у меня музыкальной грамоты не было, то написать нотами нужную мелодию не получилось. Так программа и осталась беззвучная. В общем, это была моя первая (и наверное, последняя) попытка написать на бейсике демку. Я тогда и не знал, что существует целое направление – демосцена. Печально, но этот пласт прошёл мимо меня, хотя все предпосылки были.
Разные замкнутые области можно закрашивать цветом, причём не только сплошным, но и «выкладывать плиточкой», то есть применять для заливки специальный узор. Вооружившись инструкцией, я стал придумывать свои маски и применять их к закраске прямоугольников и больших символов.
Миллиметровка и тетрадка в клеточку – сильная вещь, скажу я вам, особенно для пиксельной графики и вышивания крестиком. Это сейчас можно легко в экселе накидать нужные битовые маски, а раньше сначала приходилось всё делать вручную на бумаге.
По черновикам я восстановил, какие маски делал, когда игрался с оператором «SCREEN3».
После таких героических тренировок на кошках можно было переходить к знакогенератору.
Продолжение: Как я учился программировать - 2