HOW TO WRITE A CRAP DEMO - PART 2
BY THE SLIGHTLY DELICIOUS PANDAGIRL
В первом выпуске я кое-как объяснила, как собрать демку, состоящую из экрана (висящего в памяти), музыки (которую вы наверняка откуда-то сперли) и текстового скролла (читать который, скорее всего, не стоило). Но не отчаивайтесь: в этом номере я расскажу, как слегка приукрасить всё это безобразие, чтобы оно хотя бы не выглядело так, будто его состряпала я! Само собой, вам понадобятся листинг из прошлого номера, карманный калькулятор и внушительный член (впрочем, не расстраивайтесь: два из трех — тоже неплохо).
Чем мы обычно занимаемся, пока грузится кассета? Ну, при желании можно успеть раз двадцать, как все вы прекрасно знаете, но разглядывание загрузочной картинки — тоже вполне продуктивное времяпрепровождение. Большинство программ выдают вам хоть что-то на экран, пока заталкивают в память остальной хлам, так почему вы должны сачковать? Да, это еще один экран, который придется нарисовать в арт-редакторе и пожать экранным упаковщиком, но какого черта — неужели у вас есть дела поважнее, а?
Итак, вот ваш загрузочный экран: на нем красуются аккуратное название и скромный копирайт в вашу честь. Выглядит он, конечно, паршивенько, но для вашей первой демки сойдет — не берите в голову. Все чинно запаковано, с пылу с жару из компрессора Mikropol, и, поскольку вы просто фонтанируете оригинальностью, файл назван «LOADSCR» и весит худенькие 3000 байт (к примеру).
Я уже не помню, какая строчка за что отвечала в прошлом листинге... э-э-э, просто добавьте вот эту строку где-нибудь под номером 5:
5 LOAD "LOADSCR" CODE 27000: RANDOMIZE USR 27000
Я выбрала адрес 27000 для распаковщика экрана просто так, по настроению (к тому же 27-й — один из моих любимых автобусных маршрутов в старом добром Лондоне). Разумеется, загрузочный экран делать НЕ обязательно, но теперь, когда я показала, как чертовски просто его прикрутить, без него вы будете выглядеть полным мудаком.
Что такое шрифт? Это набор мелких пикселей, которые напоминают буквы... обычно. Посмотрим правде в глаза, ребятки: стандартный спековский шрифт хлипковат. Функциональный — да, но сексуальный ли? Определенно нет. У нас здесь, в штаб-квартире Fountain, шрифтов навалом, потому что мы форменные шрифтовые маньяки. В вашем местном PD-ларьке на вас вывалят целый самосвал шрифтов, если вам в лом рисовать свой собственный. И вот этот шрифт, выбранный с такой заботой и трепетом, будет представлять собой файл кода длиной ровно 768 байт. Возможно, он даже будет называться как-то чрезвычайно информативно, вроде «SANSERIF».
Строка 60 из листинга сообщает процедуре Uniscroll, где искать начало набора шрифта. Исходно там стоят значения 0 и 60, так как они указывают на стандартную спековскую символьную фигню.
Теперь перейдем к самому трудному — ну, или к тому, что кажется самым муторным: нам нужно (или можно) слепить все наши кусочки CODE воедино, чтобы демка не грузилась сотней мелких файлов! Начнем с кода Uniscroll, который лежит по адресу 33280 — вполне симпатичное число для старта. Если мне не изменяет память, его длина 907 байт. ИТАК, на «чистом» Speccy сделайте LOAD для кода Uniscroll по адресу 33280. Доставайте калькулятор и считайте, куда положить следующий кусок CODE (сжатый главный экран):
33280 + 907 = 34187
Поскольку я девушка, число 34187 мне не кажется красивым, так что я округлю его до чего-нибудь более симпатичного — например, до 34190! Кстати, полезный совет: оставляйте пару байт между блоками на случай, если вы не умеете считать! Теперь грузите сохраненный CODE основного экрана по адресу 34190 (я уже забыла, какую длину называла в прошлый раз, так что давайте не усложнять и возьмем 2500 байт):
34190 + 2500 = 36690
И так далее: набиваете память кусочками кода, словно машинами в пробке, прибавляя длину каждого следующего куска. Главная проблема теперь в том, что все POKE и адреса RAND USR из прошлого листинга полетели к чертям. Вызвать распаковку экрана просто: берите новый адрес из примера. Было бы, блин, форменной чертовщиной, если бы адреса в вашей демке сошлись с моими цифрами один в один! В общем, строка 150 превратится в RANDOMIZE USR 34190 вместо 40000, которые мы использовали в первом выпуске.
Музыка, изначально сидевшая на адресе 60000, теперь может переехать на 45000 или около того. Придется снова загрузить исходный трек в компилятор ST и пересохранить его под нужный адрес. Текстовый файл теперь может оказаться на 38000 (помните, до того как мы решили выпендриться, он был на 50000). Строка 70 листинга указывает Uniscroll, откуда брать текст для скролла. Спасибо Энди «Большие Яйца» Дэвису (Andy 'Big Balls' Davis) — у меня тут есть чудесный листинг, который наглядно покажет, какие значения нужно POKE-ать, если ваш текст или шрифт заброшен бог знает куда в памяти:
10 INPUT "Address:";a
20 LET h=INT (a/256)
30 LET l=(a-(h*256))
35 LET b=h-1
40 PRINT "LOW byte :";l
50 PRINT "HI byte :";h
60 PRINT "If POKEing a FONT:"'
70 PRINT "23606,";l
80 PRINT "23607,";b
Ну вот, теперь всё сбито в одну кучу: у вас в памяти лежит увесистый кусок кода, который буквально молит, чтобы его сбросили на ленту единым монолитным куском байт. Осталось только посчитать длину: от начального адреса 33280 до самого конца ваших данных. Предположим, последним загруженным блоком был шрифт по адресу 52846. Прибавляем 768 к 52846, получаем 53614. Теперь вычитаем 33280 из 53614 — и выходит (звуки блондинки, считающей на калькуляторе) 20334. Набираем:
SAVE "CODE" CODE 33280,20334
Закуривайте, работа сделана. Теперь у вас есть корявенькая демка — но уже куда менее отстойная, чем первый черновик. Не забудьте подправить мелочи вроде адресов инициализации (INIT) и проигрывания (PLAY) в строках 170 и 180, если вы переместили и пересохранили музыку в другое место. Если что-то виснет — значит, вы просто не умеете считать, так что начинайте сначала... А если повиснет снова, запустите какую-нибудь демку от Theo Devil и хорошенько поплачьте в подушку.
А вообще советую почитать статьи L.A. по машинному коду, если вам хочется делать вещи посерьезнее. Я уж точно почитаю.
Поделитесь вашим мнением о статье