:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №32 (10.10.2009) Просмотров: 4988
Автор: Олег Голенков / 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). |