Еще один метод вывода спрайта размером 2 на 2 знакоместа. — Абзац


Бумажные газеты и журналыАбзац2002 №11 → Еще один метод вывода спрайта размером 2 на 2 знакоместа.

Еще один метод вывода спрайта размером 2 на 2 знакоместа.

В 10-м номере «Абзаца» я прочитал статью в разделе «Этюды» о процедуре попиксельного вывода спрайта 2x2 знакоместа. Предлагаю свой вариант - он более короткий и занимает 88 байт, в отличие от упомянутой процедуры Павла Стахова. Я не использовал альтернативные регистры, но идет работа с половинками регистра IY, кроме того все работает быстрее. Формат хранения одной линии спрайта так же изменен. Теперь он таков: байт маски, байт спрайта, байт маски байт спрайта, пустой байт маски, пустой байт спрайта. Пустой байт нужен для того, чтобы создать 8 сдвинутых вправо спрайтов с маской.


HIG     EQU 16
LEGHT   EQU 2+1
_LGHT   EQU LEGHT*HIG
CRD_Y   EQU 10 ;Y
CRD_X   EQU 7  ;X
        ORG #6000
        LD (STEK+1),SP
        LD HL,SPRITE
        LD D,CRD_Y
        LD A,CRD_X
        LD (NEWCRD+1),A
        AND 7
        JR Z,MIMO
;SCROLL
ZANOWO  PUSH HL
        LD E,2  
;СНАЧАЛА СКРОЛИРУЕТСЯ МАСКА
SUDA    PUSH HL 
;ПОТОМ САМ СПРАЙТ
        LD B,_LGHT
CIKL    RR (HL)
        INC HL
        INC HL
        DJNZ CIKL
        CCF
        POP HL
        INC HL
        DEC E
        JR NZ,SUDA
        POP HL
        DEC A
        JR NZ,ZANOWO
MIMO    LD SP,HL
        LD YL,HIG   ;GET_ADR_P
NEWCRD  LD A,0
        RLCA
        RLCA
        RLCA
        XOR D
        AND %11000111
        XOR D
        RLCA
        RLCA
        LD L,A
        LD A,D
        RRA
        SCF
        RRA
        RRA
        AND %01011000
        XOR D
        AND %11111000
        XOR D
        LD H,A
;
        LD E,LEGHT
MASKA   LD A,(HL)
        POP BC
        AND C 
;БАЙТ МАСКИ
        OR B 
;БАЙТ СПРАЙТА
        LD (HL),A
        INC L
        DEC E
        JR NZ,MASKA
        INC D
        DEC YL ;DEC LY
        JR NZ,NEWCRD
STEK    LD SP,0
        RET ;END
SPRITE  INSERT "SPR" ;ПОДГРУЗКА СПРАЙТА

От редакции: В принципе идея не плоха, но все же процедура не совсем универсальна, т.к. происходит смещение спрайта в памяти, т.е. еще раз вывести спрайт с одинаковыми координатами уже не удастся. Длина процедуры сократилась, а вот длина спрайта увеличилась. Таким обоазом, суммарная длина процедуры и спрайта получается точно такой же как и процедуры прошлого номера - 184 байта. Таким образом можно считать, что это еще один вариант вывода спрайта 2x2 с маской. Основная же задача сделать это как можно короче. По-пержнему ждем ваши варианты. Интересно, можно ли еще что-то сократить?