ZX EVO: Выводим графику средствами DMA
DMA (англ. direct memory access) кидает данные со скоростью 7мб/c.
Запустить исходник процедуры в XAS можно тут.
LTEXT "TSCONFI2"; грузим данные портов
ORG 32768
LCODE "src"; грузим нашу картинку
ORG 26000
LD BC,DMASADH; указываем откуда брать нашу картинку, старший байт
LD A,#80
OUT (C),A
LD BC,DMASADL; указываем откуда брать нашу картинку, младший байт
LD A,#00
OUT (C),A
LD BC,DMASADX; с какой страницы памяти брать картинку
LD A,#02
OUT (C),A
LD BC,DMADADH; указываем куда отправляем нашу картинку, старший байт
LD A,#40
OUT (C),A
LD BC,DMADADL; указываем куда отправляем нашу картинку, младший байт
LD A,#00
OUT (C),A
LD BC,DMADADX; в какую страницу отправляем
LD A,#05
OUT (C),A
LD BC,DMALEN; размер блока памяти который кидаем
LD A,#7F
OUT (C),A
LD BC,DMANUM; кол-во блоков
LD A,#1A
OUT (C),A
LD BC,DMACTR; собственно кидаем картинку на экран
LD A,%00000001
OUT (C),A
RET
Размер блока может быть 512 байт, число в регистре "А" на самом деле удваивается. У меня там стоит число #7F, которое на самом деле задает блок в 256 байт.
Как задать выравнивание для блоков?
Например: LD A,%00011001 - будет кидать данные не построчно, а квадратами, размер которых указан в в портах DMALEN х DMANUM. Каждая последующая линия автоматически будет делать + 512 байт, что составляет одну строчку экрана при режиме 256 color. LD A,%00010001 при режиме 16 color.
Ммм. Работает!
ОтветитьУдалить