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


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

Вывода спрайта размером 2 на 2 знакоместа

Предлагаю доработанную мною процедуру вывода спрайта размером 2 на 2 знакоместа. С целью уменьшения размера (теперь 120 байт против 149 у RageVorteX/#c5), да и некоторого увеличения скорости работы был изменен алгоритм сдвига и вывода спрайта, поэтому формат спрайта теперь немного изменился: сначала идет слово (два байта - младший, затем старший) маски, потом слово спрайта, и так 16 раз. Формат немного неудобен т.к. придется писать свой конвертер, но результат того стоит! И еще. Если скорость процедуры не так важна, как ее обьем, то строки, помеченные звездочкой можно заменить на

        ;...

        LD C,A

        CALL 8880

        ;...

таким образом процедура сократится еще на 21 байт и составит 99 байтов! Отмечу лишь, что процедура по адресу 8880 занимается расчетом координат на экране с точностью до пикселя, на входе у нее C=X, B=Y, на выходе будет HL=адрес на экране, A=смещение в пикселях относительно начала знакоместа.


;B=Y, C=X
;A=НОМЕР СПРАЙТА
SPRITE1 DI
       LD (WSP1+1),SP 
       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 DE,S_ADR
       ADD HL,DE 
       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   ;* 
       NEG
       ADD A,8
       LD (LSB+2),A 
       LD SP,HL 
       LD A,16
S15    EX AF,AF’
       LD A,D
       CP #58
       JR NC,WSP1
       POP HL
       POP IX
       XOR A
LSB    LD BC,#00FF
S_LP1  ADD HL,HL
       SET 0,L
       RL C 
       ADD IX,IX
       RLA
       DJNZ S_LP1
       LD B,A 
       LD A,(DE)
       AND C
       OR B
       LD (DE),A
       INC E
       LD A,(DE)
       AND H
       OR HX
       LD (DE),A
       INC E
       LD A,(DE)
       AND L
       OR LX
       LD (DE),A
       DEC E
       DEC E 
       INC D
       LD A,D
       AND 7
       JR NZ,S14
       LD A,E
       ADD A,#20
       LD E,A
       JR C,S14
       LD A,D
       SUB 8
       LD D,A 
S14    EX AF,AF’
       DEC A
       JR NZ,S15
WSP1   LD SP,0
       EI
       RET 
S_ADR  ЗАГРУЖАЕМ СПРАЙТ...