![]() |
|
:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №32 (10.10.2009) Просмотров: 5382
![]() Автор: Олег Голенков / breeze / ex-Minisoft. Рубрика: В помощь разработчику. Номер: №32 (10.10.2009). Вывод спрайтов в режиме 16 colorПояснения16 color - дополнительный видеорежим для компьютера Pentagon, позволяющий устанавливать свой цвет (из 15 стандартных, несмотря на название, т.к. ярко-черного нет) для каждой точки изображения. Автор доработки Дмитрий Быстров (Alone Coder). Организация экрана Используются четыре экранные области, каждая из которых имеет размер 6144 байт. Области для первого экрана расположены по адресам #4000, #6000 (или #C000, #E000 в 5-й странице), и #C000, #E000 (4-я страница). Второй экран располагается в 6-й и 7-й страницах таким же образом. Организация экрана аналогична стандартному видеорежиму, однако один байт одной области определяет цвета двух соседних пикселей. Переключение между экранами (видимый/невидимый) происходит стандартным способом - бит D3 порта #7ffd. Одна строка в каждом знакоместе составляется из байтов, находящихся в разных экранных областях с одинаковым смещением. Первые два пикселя в случае первого экрана находятся в области #C000 (4-я страница), следующие - в областях #4000, #E000 (4-я страница) и #6000 соответственно. Если учесть то, что области #C000 и #E000 пятой страницы дублируются в области #4000 и #6000 соответственно, то при работе с первым экраном нет необходимости переключаться между 4 и 5 страницами, а достаточно включить только четвертую. Со вторым экраном, к сожалению, так не получится и там, все же, нужно будет переключаться между двумя страницами. Каждый байт определяет цвета двух соседних по горизонтали пикселей следующим образом (аналогично EGA-режиму компьютера ATM Turbo): D7 D6 D5 D4 D3 D2 D1 D0 I i G R B g r b Где IGRB - цвет левого пикселя, igrb - правого (R, G, B - цветовые каналы; I - установка повышенной яркости). Включается данный режим установкой бита D0 порта #EFF7. Комментарии в исходном тексте на английском, но, думаю, трудностей возникнуть не должно. org #8000
ld sp,#5fff ;set top of stack
ld a,4
out (254),a ;set green (4) border color
ld bc,#7ffd
ld a,#14
out (c),a ;set 4 bank of ram for 16colors mode
;IiGRBgrb
ld a,%00100100 ;set green color (without bright) for filling
ld hl,#c000
ld de,#c001
ld bc,#17ff
ld (hl),a
ldir ;clear first part of 16c screen
ld hl,#4000
ld de,#4001
ld bc,#17ff
ld (hl),a
ldir ;clear second part of 16c screen
ld hl,#e000
ld de,#e001
ld bc,#17ff
ld (hl),a
ldir ;clear third part of 16c screen
ld hl,#6000
ld de,#6001
ld bc,#17ff
ld (hl),a
ldir ;clear fourth part of 16c screen
ld bc,#eff7
ld a,%00000001
out (c),a ;enable 16c mode
ld hl,sprite ;hl - address of sprite in 16c format
ld bc,#3808 ;bc - coords in pixels for place #yyxx ( eight-fold )
call showSpr ;call show sprite function
jr $ ;halt loop
;show sprite function
showSpr push hl ;calculate start of screens for place sprite
ld a,b ;coords into screen address
and a
rra
scf
rra
and a
rra
xor b
and #F8
xor b
and %10111111 ;- #40
ld h,a
ld a,c
rlca
rlca
rlca
xor b
and %11000111 ;%11000111 ;#C7
xor b
rlca
rlca
ld l,a
ld a,h
push af
or #c0
ld h,a
ld (addr1+1),hl
pop af
push af
or #40
ld h,a
ld (addr2+1),hl
pop af
push af
or #e0
ld h,a
ld (addr3+1),hl
pop af
or #60
ld h,a
ld (addr4+1),hl
pop hl
ld a,(hl)
ld c,a
inc hl
ld a,(hl)
ld b,a
inc hl
loop_1 push bc ;loop a place sprite line by line
addr1 ld de,#c000 ;first line
ld b,0
push de,bc
ldir
pop bc,de
call down_de
ld (addr1+1),de
addr2 ld de,#4000 ;second line
push de,bc
ldir
pop bc,de
call down_de
ld (addr2+1),de
addr3 ld de,#e000 ;third line
push de,bc
ldir
pop bc,de
call down_de
ld (addr3+1),de
addr4 ld de,#6000 ;fourth line
push de,bc
ldir
pop bc,de
call down_de
ld (addr4+1),de
pop bc
djnz loop_1
ret
down_de inc d ;get next address for screen line
ld a,d
and 7
ret nz
ld a,e
sub #e0
ld e,a
ret nc
ld a,d
sub 8
ld d,a
ret
sprite incbin «ready.spr» ;sprite bin in 16c formatСтоит отметить, что для правильной работы процедуры, требуется специально подготовленный спрайт в формате 16с. Подобный спрайт можно создать на платформе PC с помощью программы-конвертера – «bmp2color16_2». Спрайт получается путем конвертирования картинки из формата *.bmp в нужный формат. Конвертер можно скачать по ссылке: http://abzac.retropc.ru/files/bmp2color16_2.zip Автор конвертера Олег Голенков (breeze). |