TSconf: Tiles

Да, Мультиматограф близок, нужно поднажать!
Итак, тайлы.


Для построения тайлов нам необходимо сделать следующее:
— подготовить графику (разместить её в странице для графики тайлов)
— построить карту тайлов (с размещением в странице карты)
— запрограммировать порты (указать, какие страницы используются для графики, для карты, и включить отображение нужных слоёв)

Дао говорит: Тайлы представляют собой комбинацию из графики и карты её расположения на экране.
Всего есть два слоя тайлов, визуально расположенных друг над другом: T0 (ниже) & T1 (выше).
Карта хранится в странице памяти, указанной портом TMPage (#16af) следующим образом: первая строка карты слоя Т0 расположена с #с000 по #с07f, первая строка карты слоя Т1 — с #с080 по #с0ff. Следующий ряд тайлов в обеих картах расположен ниже на #100.
Дескриптор тайла состоит из двух байт и указывает на номер элемента графики размером 8х8 точек, позволяя отображать его вертикально и/или горизонтально отражённым, в одной из 4х палитр.
Позиция окна отображения тайлов на экране задаётся четырьмя портами T0XOffs / T0YOffs (#40af-43af) для слоя 0, и T1XOffs / T1YOffs для слоя 1 (#44af-47af).

Готовим графику:
Для подготовки графики нам необходимо учесть, что тайл представляет собою элемент 8х8 точек, выводящийся в режиме 16 цветов с прозрачностью, которая задаётся первым (0-м) цветом избранной для тайлов палитры.
Для использования в тайлах графика должна быть размещена в отдельных страницах, номер первой из которых обязан быть кратным 8 (0, 8, 192, 240 и т.д.)

Имеем графику размером 256*256 точек, 16 цветов, расположенную в странице glasspat_page с адреса #c000.
Копируем эту графику с помощью DMA в страницу, используемую для хранения подготовленной к выводу графики тайлов — Tile0_spr_page.


glasspat_page	equ #22
Tile0_spr_page	equ #50

                ld hl,glasspat_copy
		call set_ports
                ret
 
glasspat_copy	db #1a,0
	        db #1b,0
		db #1c,glasspat_page
glasspat_copy_adr
	        db #1d,0
	        db #1e,0
	        db #1f,Tile0_spr_page
	        db #26,256/4-1
	        db #28,256-1
		db #27,DMA_RAM + DMA_DALGN
		db #ff

Графика скопирована с выравниванием по размещению в памяти приёмника. Исходное изображение лежит линейным образом.

Построение карты:
Теперь нужно создать карту расположения тайлов на экране. Для этого нужно в странице с тайловой картой разместить информацию о расположении тайлов в странице с графикой для них. Для этого воспользуемся следующей схемой номерации тайлов в графике:


Для заполнения карты данными давайте взглянём, какие биты используются в дескрипторе тайла:

TILE	Reg.16	7	6	5	4	3	2	1	0
0	R0L	TNUM[7:0]							
1	R0H	YF	XF	TPAL[5:4]		TNUM[11:8]			


TNUM — номер тайла в графике, занимает 12 бит (все 8 младшего и 4 старшего), что даёт нам возможность адресовать 4096 тайлов.
Бит YF отвечает за вертикальный flip (отражение) при отображении тайла, бит XF отвечает за горизонтальное отражение.

Биты TPAL отвечают за выбор палитры и указывают на два младших разряда её номера, старшие два бита указываются в порту PalSel.
Соответственно, для одного слоя может быть использовано всего 4 палитры из всех, расположенных последовательно и кратных 4: 0-3, 4-7, 8-11, 12-15.

Итак, примем, что изображение использует 0ю палитру, и будет располагаться с левого верхнего угла тайлового слоя Т0.
Соответственно, данные размещаем с #c000 слоя T0 (а для расположение в слое Т1 — с адреса #c080).

Начинаем заполнять данные карты, расположенные в странице Tile_page:

Tile_page       equ #c0

		ld hl,#c000
		ld de,#0000
		ld bc,#2020
		ld a,Tile_page
		call tile_filler
                ret 

tile_filler	exx
		ld bc,PAGE3   ;включаем страницу карты тайлов
		out (c),a
		exx
		ld a,l
		ld (rfil3+1),a    ; сохраняем начальное положение адреса в карте
		ld a,#40
		sub b
		ld (rfil4+1),a    ; вычисляем и сохраняем высоту
rfil1		push bc
rfil2		ld (hl),e    ; сохраняем номер тайла
		inc l
		ld (hl),d    ; сохраняем номер + аттрибуты
		inc l
		inc de        ; следующий номер тайла
		djnz rfil2
		inc h        ;
rfil3		ld l,0       ; переходим на новую строку в карте
		ex de,hl
rfil4		ld bc,0
		add hl,bc    ; вычисление следующей строки тайлов
		ex de,hl
		pop bc
		dec c
		jr nz,rfil1
		ret


Карта построена.

Что бы включить отображение тайлов, необходимо указать в системе, где что находится, и какие именно слоя будут включены.

Программируем порты:
T0GPage (#17af) — номер 1й страницы битмапа (графики) для слоя Т0
T1GPage (#18af) — номер 1й страницы битмапа для слоя Т1
TMPage (#16af) — номер карты тайлов обоих слоёв
TSConfig (#06af) — порт управления отображением тайлов и спрайтов (1 — вкл, 0 — выкл):


бит 7 S_EN - отображение спрайтов
бит 6 T1_EN - отображение тайлового слоя 1
бит 5 T0_EN - отображение тайлового слоя 0
бит 3 T1Z_EN - включение отображения тайла с номером 0 для слоя 1
бит 2 T0Z_EN - включение отображения тайла с номером 0 для слоя 0
биты 4,1,0 пока не используются.


Из этого всего великолепия нам нужно включить T0_EN и T0Z_EN, дабы первый тайл изображения был отображён.


                ld hl,t0init
                call set_ports
                ret

t0init		db high TSCONFIG,TSU_T0ZEN+TSU_T0EN
		db high TMPAGE, Tile_page
		db high T0GPAGE,Tile0_spr_page
		db high PALSEL,0
                db #ff


Всё, тайлы на экране.

Вопросы и ответы:
? Почему на экране виден цветной шум помимо изображения?
! Шум связан с первоначальной общей инициализацией памяти в системе, и страниц Tile0_spr_page / Tile_page, при котором память имеет рандомное состояние.
Учтём, что карта была построена только для нашего изображения, соответственно остальные дескрипторы в карте тайлов имеют неизвестное рандомное состояние, что и видим на экране. Надобно очистить, указав там подходящий для этого тайл.

? Вродь всё вывел, визуально размер тот — а изображение не пойми какое
! Первый байт тайла всегда чётный- 0,2,4 и т.д. Т.е. что бы вывести с 8 тайла, начинаем формировать карту с адреса #c010.

Чтиво: F.A.Q.

7 комментариев

avatar
Потом можно все эти статьи увидеть в каком-то pdf/doc'е?
avatar
point777 скорее — бумажная книга в твёрдом переплёте ;)
avatar
с аудиоверсией в приложении
avatar
читает alone coder
avatar
по ролям
avatar
Голосом Дроздова
avatar
добавил порты управления позицией отображения тайловых слоёв.
  • VBI
  • +2
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.