Вспомогательные операции при выводе спрайта в область экранной памяти (c) Spencer Winset/Diamond group/Moscow Предисловие Как и вы, читая заголовок этой статьи, спрашиваю себя: Госпо- ди, ну что еще можно придумать такого-этакого в области, где не валялся конь с 1982 года. Даже не уговаривайте меня рассказать вам об устройстве адресного пространства на Спектруме - это и так всем известно, что пространство не совсем сплошное, то есть оно совсем не сплошное, а вернее нам так иногда кажется... Мы подошли к предмету разговора - расчет экранного адреса ни- жележащей линии. Существует около пяти общепринятых способов, которые заставляют ужаснуться спектрумистов своим временем ис- полнения задачи. Далее приведу их по мере повышения производи- тельности: 1.Подборка методом тыка. Hичего смешного - когда сидишь в STS'е, ничего более оперативного не придумаешь. 2.Расчет на калькуляторе или на Бейсике по незамысловатой форму- ле 16384+2048*i+32*j+256*k+x где i=[0-2] номер трети экрана; j=[0-7] номер строки символов; k=[0-7] номер линии в символе; x=[0-31] номер символа в строке. Это для тех, кто любит подольше, но зато один раз и точно. ;) 3.Крутая процедурка для тех, кто только изучает действия логи- ческих команд над аккумулятором и их влияние на флаги. Итого по тактам: на каждую "обыкновенную" линию = 27 тактов, а на каждую восьмую = 60 тактов. LOGDW_HL INC H LD A,L AND #07 JR NZ,$+12 LD A,L ADD A,#20 LD L,A CCF SBC A,A AND #F8 ADD A,H LD H,A 4.Этот алгоритм "DOWN HL" знают многие, и некоторые уже забыли, как он работает, ну да не беда. Я думаю, что это второй из са- мых часто используемых алгоритмов, после очистки экрана по LDIR'у. По тактам: на каждую "обыкновенную" линию = 27 тактов, на каждую восьмую = 59 тактов и на каждую 64-ю линию (из тре- ти в треть) = 49 тактов. Пройдя весь экран - в среднем 30.84 тактов на каждую линию. DOWN_HL INC H LD A,H AND #07 JR NZ,$+12 LD A,L ADD A,#20 LD L,A JR C,$+6 LD A,H SUB #08 LD H,A 5.По табличке (192*2=384 байт), содержащей по два байта, означа- ющих начало каждой следующей линии. В глубоком детстве мне ка- залось, что это очень расточительно для памяти. :/ POP DE LD A,E ADD A,C LD E,A Итого по тактам: на каждую следующую линию = 22 такта. Господа, это совсем не плохо. Можно и еще быстрее (10 тактов), но тогда табличку придется расписать под все адреса экрана, а это 12 Кб - вот это уже действительно расточительство, но зато в два раза быстрей. Что ни говори, а количество памяти в компьютере (поч- ти линейно) связано с качеством программ, и не за горами новый стандарт - Pentagon 512K. 6.Как всегда, на этом месте у пессимистов возникает оптимисти- ческий вопрос: а можно еще быстрее??? "Да!" - отвечаю я с гор- достью за ГОМОСАПИЕHСА. Алгоритм Down Micro Dab (DMD), позво- ляющий вплотную приблизиться к максимально возможной скорости 4 такта на линию. Сущность метода хорошо описывает следующая схема: L0 ╒───────╖ │ 1 ║ ;вывод первой линии спрайта └───────╜ INC H L1 ╒───────╖ │ 2 ║ ;вывод второй линии спрайта └───────╜ INC H ....... L7 ╒───────╖ │ 8 ║ ;вывод восьмой линии спрайта └───────╜ LD A,L ADD A,#20 LD L,A JR C,NPOS LD A,H SUB #07 LD H,A DJNZ L0 NPOS INC H DJNZ L0 Теперь объясню на пальцах. Вывод спрайта расписывается под символьную позицию, т.е восемь линий (а каждая линия расписана под ширину спрайта). Для работы алгоритма достаточно даже 286-го процессора ;). Вернее, надо взять Y-координату, сделать AND #7 и прыгнуть на получившийся номер линии (L0-L7), также в регистрe "B" количество символьных позиций в спрайте (высота). Это почти все; осталось исключить выброс лишних линий при печа- ти последней позиции (здесь аналогично действию в начале с Y-ко- ординатой). Это также просто, как отнять карманные деньги у пер- вокласника ;+) . Итого по тактам: на каждую "обыкновенную" линию = 4 такта, на каждую восьмую = 37 тактов и на каждую 64-ю линию (из трети треть) = 31 тактов. Пройдя весь экран - в среднем 8,03 тактов на каждую линию. Если вы скачали приложения: dmd.H и activisn.C , у вас не должно возникнуть лишних вопросов, просто заводите ALASM, и впе- ред к новым победам! Это еще не все: при желании, основываясь на принципе дейст- вия алгоритма Down Micro Dab (DMD), средние затраты на каждую линию можно уменьшить почти в два раза. Теперь в завершении ликбеза хочу дать полезный совет, особен- но касающийся gаme-мейкеров: не следует выбирать размер спрай- тов, по высоте кратный восьми (например 3*3 симв.поз), как это обычно принято, т.к. это ворует у вас и у юзера 59/10/37 тактов в зависимости от используемого метода расчета. Оптимальный фор- мат спрайта по высоте - это кратное восьми количество линий ми- нус один! Можете теперь умножить количество спрайтов на 59/10/37 и узнаете, сколько сэкономили на пустячке. Date: 22 November 1998 Goljakov Evgeny aka Spencer Winset/Diamond group ZXNet: 500:95/550.8 т редакции Уважаемые читатели! Ваши отзывы по теме данной статьи вы мо- жете присылать на ZXNet-адрес автора и на адрес газеты Nicron. * * *