Абзац
:: Поиск
:: Поддержка проекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №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).

    © 2004-2013 Perspective group