ну тогда, наверное, нужно внести изменения в пост, потому что пример говорит другое.
и про цвета палитры -полный туман.
Вид для печати
denpopov, я не ставлю задачу расписать всё.
это вводный курс, как я его понимаю.
где пример говорит "другое"?
если есть обьяснение, как пользовать тайлы - welcome
http://zx-evo-fpga.googlecode.com/hg...les/example01/
вот смотри сколько тумана:
из примера куда понятнее.Цитата:
VCONFIG equ $00AF
LD BC,VCONFIG ; Включаем видеорежим: %10-320x240, %001-16 цветов %01 – 320x200
LD A,%01000010
OUT (C),A
bad try
Я для эмуляции много почерпнул отсюда - http://zx-evo-fpga.googlecode.com/hg...onf/TSconf.xls
Buyan, я прокомментирую, поправишь:
Код:start di
ld sp,49151
call init_gfx ;устанавливаем режимы
call init_zx_pal ;грузим палитру
call gfx_copy ;грузим графику для 0-го тайлового слоя
call fill_tiles ;заполняем карту тайлов
stop jp stop
Хорошо комментированный текст :) Смотрим екселевский файл, видим, что в TSConfig ложим %00100100, -Код:include dev\ts-ports.asm ; названия портов лежат здесь, в первом посте есть ссылка на подобный файл
init_gfx ld bc,VConfig ; 320x240
ld a,%10100001
out (c),a
ld bc,TSConfig ; 0й тайловый вкл., отображение тайлов с номером 0 - вкл.
ld a,%00100100
out (c),a
ld bc,PalSel
ld a,%00000000
out (c),a
ld bc,T0YOffsL ; смещения для 0-го тайлового слоя ставим по 0
out (c),a
ld bc,T0YOffsH
out (c),a
ld bc,T0XOffsL
out (c),a
ld bc,T0XOffsH
out (c),a
ld bc,T0GPage ; графика 0-го тайлового слоя
ld a,128
out (c),a
ld bc,TMPage ; страница карты тайлов
ld a,128+8
out (c),a
ret
Скрытый текст
T0_EN Tile Layer 0 Enable
T0Z_EN Tiles with number 0 display Enable
[свернуть]
0й тайловый вкл., отображение тайлов с номером 0 - вкл.
PalSel - Palette selection for 4 bit modes. выбор палитры в 0, в инициализации палитры ( init_zx_pal ) видим, что она начинается с адреса 0. палитра загружается стандартная спековская из файла.
для тайлов мы имеем 16 цветов онли. тут бы хотелось немного болше информации, по выбору палитры.
Дальше - указывается адрес отображения окна просмотра - х=0, y=0, выбирается страница с графикой тайлового слоя и выбирается страница карты тайлов, всё видно в комментариях.
пример знакомКод:;------------------------------------------------------------
init_zx_pal ld a,%00010000
ld bc,FMAddr
out (c),a
ld hl,zx_palette
ld de,0
ld bc,32
ldir
xor a
ld bc,FMAddr
out (c),a
ret
zx_palette include "dev\zx_palette.asm"
дальше интереснее. DMA
используется для переброски загруженной картинки в нужные страницы в нужном формате:
DMASххх - dma источник
DMADххх - dma приёмник
DMASAddrX - страница источника
DMASAddr - адрес откуда
DMALen - DMA Burst Length
Длина 1 бурста в словах минус 1. Т.е. 0 - 2 байта, 255 - 512 байт.
в данном случае - 160/2-1 - строками по 160 байт (320 точек 16С)
DMANum - колво строк
DMACtrl - %00010001. DMA Control / Start
включен бит D_ALGN, Destination Address Alignment.
"After each burst lower bits of address restored to their initial values before burst, upper bits increased by 1"
- выравнивание по 256b, т.е. каждая следующая строка будет загружена по адресу + 256
включенный бит 0 значит, что пишем из озу в озу: RAM (Src) is copied to RAM (Dst)
читаем статус (DMAStatus), пока операция не закончится.
дальше самое интересное.Код:
;------------------------------------------------
gfx_copy ld bc,DMASAddrX
ld a,100 ; из spg графика загружена начиная с 100-й страницы
out (c),a
ld hl,0
ld bc,DMASAddrH
out (c),h
ld bc,DMASAddrL
out (c),l
ld bc,DMADAddrX
ld a,128 ; перекидываем в 128 ( T0GPage )
out (c),a
ld hl,0
ld bc,DMADAddrH
out (c),h
ld bc,DMADAddrL
out (c),l
ld bc,DMALen
ld a,160/2-1 ; строками по 160 байт (320 точек 16С)
out (c),a
ld bc,DMANum
ld a,240-1 ; 240 строк
out (c),a
ld bc,DMACtrl
ld a,%00010001 ; с выравниванием по 256b, т.е. каждая следующая строка
out (c),a ; будет загружена по адресу + 256
ld bc,DMAStatus
nm1cl in a,(c)
or a
jr nz,nm1cl
ret
тайловая карта задаётся двумя байтами на каждый тайл. первый байт - номер, второй байт: 4 младших бита - номер тайла, а так-же выбор палитры и возможность переворота тайла:
Скрытый текст
TNUM Tile Number for upper left corner. Bits 0-5 are X Position in Graphics Bitmap, bits 6-11 - Y Position.
XF Horizontal Flip
YF Vertical Flip
TPAL Tile Palette Selector, bits 0-1. Bits 2-3 are taken from PalSel register bits 6-7 or 4-5, dependently on tiles layer 1 or 0.
[свернуть]
Тайловая карта генерится слева-направо, сверху-вниз. всего можем иметь 64*64
Скрытый текст
tpos_x tile X position on the plane 0-63
tpos_y tile Y position on the plane 0-63
[свернуть]
размер тайла имеем 8*8 точек. других размеров быть не может, так?
Тайловых карт всего две, и они находятся в одной странице вперемешку. тайлы0 - от 0до 127, тайлы1 - от 128-155
Сразу после вызова последнего сall видим девушку на экране.Код:
fill_tiles ld bc,Page3 ; включаем страницу тайлмапа с #C000
ld a,128+8
out (c),a
ld ix,#c000 ; адрес 0-го тайла 0-го слоя ( для слоя 1 соответственно #C000+128 )
ld de,64
ld hl,0 ; начальный номер тайла
ld b,30 ; тайлов по вертикали (240/8)
fill_y push bc
push ix
push hl
ld b,40 ; тайлов по горизонтали (320/8)
fill_x ld (ix+0),l
ld a,h
and %00001111 ; биты номера палитры тайла и инверсий XY по 0-м т.е палитра №0 и зеркалирование тайла выкл.
ld h,a
ld (ix+1),h
inc hl ; номер следующего тайла
inc ix ; адрес следующего тайла (+2 т.к описатель тайла 2 байта)
inc ix
djnz fill_x
pop hl
add hl,de ; первый тайл следующей строки ( номер + 64 т.к. слой 64х64 тайла )
pop ix
inc ixh ; адрес следующей строки слоя в тайлмапе ( + 256 )
pop bc
djnz fill_y
ret
нулевой цвет для тайлов должен обозначать прозрачность: 4 bits per pixel, transparent color is 0 from 16 (4'b0)
Buyan, и я пропустил, хоть в описании битов всё нашёл правильно)
поправил
В описателе тайла за выбор палитры отвечают только 2 бита TPAL (биты 1,0), биты (3,2) прописываются в регистре PalSel для каждого из слоев, эти биты в сумме и задают конечный 4х битный номер палитры конкретного тайла. Т.е. получается что в пределах одного тайлового слоя для каждого тайла можно использовать 1 из 4х смежных палитр.
Народ, интересно?
На очереди разбор MindWarp - офигезный эффект палитры)