TSconf: Tiles
Да, Мультиматограф близок, нужно поднажать!
Итак, тайлы.
Для построения тайлов нам необходимо сделать следующее:
— подготовить графику (разместить её в странице для графики тайлов)
— построить карту тайлов (с размещением в странице карты)
— запрограммировать порты (указать, какие страницы используются для графики, для карты, и включить отображение нужных слоёв)
Готовим графику:
Для подготовки графики нам необходимо учесть, что тайл представляет собою элемент 8х8 точек, выводящийся в режиме 16 цветов с прозрачностью, которая задаётся первым (0-м) цветом избранной для тайлов палитры.
Для использования в тайлах графика должна быть размещена в отдельных страницах, номер первой из которых обязан быть кратным 8 (0, 8, 192, 240 и т.д.)
Имеем графику размером 256*256 точек, 16 цветов, расположенную в странице glasspat_page с адреса #c000.
Копируем эту графику с помощью DMA в страницу, используемую для хранения подготовленной к выводу графики тайлов — Tile0_spr_page.
Графика скопирована с выравниванием по размещению в памяти приёмника. Исходное изображение лежит линейным образом.
Построение карты:
Теперь нужно создать карту расположения тайлов на экране. Для этого нужно в странице с тайловой картой разместить информацию о расположении тайлов в странице с графикой для них. Для этого воспользуемся следующей схемой номерации тайлов в графике:
Для заполнения карты данными давайте взглянём, какие биты используются в дескрипторе тайла:
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:
Карта построена.
Что бы включить отображение тайлов, необходимо указать в системе, где что находится, и какие именно слоя будут включены.
Программируем порты:
T0GPage (#17af) — номер 1й страницы битмапа (графики) для слоя Т0
T1GPage (#18af) — номер 1й страницы битмапа для слоя Т1
TMPage (#16af) — номер карты тайлов обоих слоёв
TSConfig (#06af) — порт управления отображением тайлов и спрайтов (1 — вкл, 0 — выкл):
Из этого всего великолепия нам нужно включить T0_EN и T0Z_EN, дабы первый тайл изображения был отображён.
Всё, тайлы на экране.
Вопросы и ответы:
? Почему на экране виден цветной шум помимо изображения?
! Шум связан с первоначальной общей инициализацией памяти в системе, и страниц Tile0_spr_page / Tile_page, при котором память имеет рандомное состояние.
Учтём, что карта была построена только для нашего изображения, соответственно остальные дескрипторы в карте тайлов имеют неизвестное рандомное состояние, что и видим на экране. Надобно очистить, указав там подходящий для этого тайл.
? Вродь всё вывел, визуально размер тот — а изображение не пойми какое
! Первый байт тайла всегда чётный- 0,2,4 и т.д. Т.е. что бы вывести с 8 тайла, начинаем формировать карту с адреса #c010.
Чтиво: F.A.Q.
Итак, тайлы.
Для построения тайлов нам необходимо сделать следующее:
— подготовить графику (разместить её в странице для графики тайлов)
— построить карту тайлов (с размещением в странице карты)
— запрограммировать порты (указать, какие страницы используются для графики, для карты, и включить отображение нужных слоёв)
Дао говорит: Тайлы представляют собой комбинацию из графики и карты её расположения на экране.
Всего есть два слоя тайлов, визуально расположенных друг над другом: 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 комментариев