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


PeriodicalsAbzac2001 No. 9 → Печать спрайта с маской

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

В этой заметке я хотел бы осветить вопрос попиксельной печати спрайта 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-й номер. Теперь же, нам хотелось бы объявить новый конкурс по сегодняшней процедуре. Входные параметры должны быть такими же, ну а процедура самой короткой.