Nicron #105
13 декабря 1998

Программирование - вспомогательные операции при выводе спрайтав область экранной памяти.

	Вспомогательные операции
	      при выводе спрайта
	в область экранной памяти

(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.

			*	*	*






Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
С миру по биту - письма читателей на тему игр.
Сегодня в номере - Привет всем! Итак, вы видите первый выпуск новой газеты под названием Proton.
Введение - Немножко новостей, правда не все они хорошие.

В этот день...   20 ноября