Абзац
:: Поиск
:: Поддержка проекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №9 (14.12.2001) Просмотров: 4641

    Автор: RageVorteX / #c5.

    Рубрика: Этюды.

    Номер: №9 (14.12.2001).



    Печать спрайта с маской

    В этой заметке я хотел бы осветить вопрос попиксельной печати спрайта 2х2 знакоместа с маской через стек. Ниже приведен текст моего варианта процедуры. Не исключено, что процедуру можно оптимизировать и ускорить.

    Формат спрайта должен быть следующим: байт маски, байт спрайта и т.д.

    ;На входе:

    ;A-номер спрайта

    ;B-Y координата в пикселях

    ;C-X координата в пикселях



        ORG 40000
    SPRITE  DI          @
        LD (S10+1),SP   @
        EX AF,AF'   !
        LD A,B      !
        RRA         !
        SCF         !
        RRA         !
        RRA         !
        AND #5F     !
        LD D,A      !
        XOR C       !
        AND 7       !
        XOR C       !
        RRCA        !
        RRCA        !
        RRCA        !
        LD E,A      !
        LD A,B      !
        XOR D       !
        AND 7       !
        XOR D       !
        LD D,A      !
        LD A,C      #
        AND 7       #
    S11 LD (S1+1),A #
        LD (S2+1),A #
        EX AF,AF'   $
        LD H,0      $
        LD L,A      $
        ADD HL,HL   $
        ADD HL,HL   $
        ADD HL,HL   $
        ADD HL,HL   $
        ADD HL,HL   $
        ADD HL,HL   $
        LD BC,S_ADR $
        ADD HL,BC   $
        LD SP,HL    $
        EX DE,HL    %
        LD A,16     %
    S3  EX AF,AF'   %
        LD A,H      ^
        CP #58      ^
        JR NC,S4    ^
        POP DE      &
        LD B,0      &
        LD C,255    &
    S1  LD A,0      &
        OR A        &
        JR Z,S5     &
        SRA E       &
        RR C        &
        SRA D       &
        RR B        &
        DEC A       &
        JR S1+2     &
    S5  LD A,(HL)   *
        AND E       *
        OR D        *
        LD (HL),A   *
        INC L       *
        LD A,(HL)   *
        AND C       *
        OR B        *
        LD (HL),A   *
        POP DE      &
        LD B,0      &
        LD C,255    &
    S2  LD A,0      &
        OR A        &
        JR Z,S52    &
        SCF         &
        RR E        &
        RR C        &
        SRL D       &
        RR B        &
        DEC A       &
        JR S2+2     &
    S52 LD A,(HL)   *
        AND E       *
        OR D        *
        LD (HL),A   *
        INC L       *
        LD A,(HL)   *
        AND C       *
        OR B        *
        LD (HL),A   *
        DEC L
        DEC L
        INC H       <
        LD A,H      <
        AND 7       <
        JR NZ,S4    <
        LD A,L      <
        ADD A,32    <
        LD L,A      <
        JR C,S4     <
        LD A,H      <
        SUB 8       <
        LD H,A      <
    S4  EX AF,AF'   [
        DEC A       [
        JR NZ,S3    [
    S10 LD SP,0     /
        EI          /
        RET
    
    S_ADR INCBIN "SPRITE" +

    @ - Запрещаем прерывания и сохраняем значение стека.

    ! - Определяем адрес в экранной области для вывода спрайта.

    # - Вычисляем смещение спрайта.

    $ - Вычисляем адрес спрайта.

    % - Начало цикла вывода спрайта.

    ^ - Проверка на выход за пределы экрана.

    & - Подготовка данных (ротация) выводимых

    на экран.

    * - Вывод спрайта на экран.

    < - Процедура перехода на одну пиксельную линию экрана ниже.

    [ - Продолжаем или заканчиваем цикл вывода спрайта.

    / - Восстанавливаем значение стека, включаем прерывания.

    + - Подгружаем свой спрайт-файл.


    От редакции: Предыдущий наш конкурс по процедуре прямоугольника выиграл Павел Стахов/Studio Stall. За что ему высылается бесплатный 9-й номер. Теперь же, нам хотелось бы объявить новый конкурс по сегодняшней процедуре. Входные параметры должны быть такими же, ну а процедура самой короткой.


    Ссылки по теме:

    Вывода спрайта размером 2 на 2 знакоместа [№10]
    Еще один метод вывода спрайта размером 2 на 2 знакоместа. [№11]


    © 2004-2013 Perspective group