(С) Жерихов Руслан
г. Новочебоксарск, 1996
Операции со спрайтами.
1. Эта программа выводит на экран спрайт произвольной конфигурации, например
вот такой:
Ъ----ї Ъ-ї
А--ї А--Щ і
А------Щ
Формат спрайта: заголовок - 1 байт - количество знакомест в спрайте;
данные спрайта - 1 байт Y координата, 2 байт X координата (координаты
относительные от левого верхнего угла спрайта). Далее 8 байт шаблон
знакоместа.
Входные параметры: HL - адрес начала спрайта; DE - абсолютные X,Y
координаты левого верхнего угла спрайта; A - метод вывода спрайта ( с
уничтожением фона SP_PUT и с различными наложениями SP_OR, SP_XOR, SP_AND).
Если часть спрайта или весь спрайт выходит за пределы экрана, то он просто
не печатается.
SP_PUT EQU #00
SP_OR EQU #B6
SP_XOR EQU #AE
SP_AND EQU #A6
PTBL LD (MODE),A
LD A,(HL)
INC HL
PTBL_1 PUSH AF
PUSH DE
LD A,(HL)
ADD A,E
CP #18
JR NC,PTBL_4
LD E,A
INC HL
LD A,(HL)
ADD A,D
CP 32
JR NC,PTBL_5
LD D,A
INC HL
PUSH HL
LD A,E
AND #18
ADD A,#40
LD H,A
LD A,E
AND 7
RRCA
RRCA
RRCA
ADD A,D
LD L,A
POP DE
LD B,8
PTLB_2 LD A,(DE)
MODE NOP
LD (HL),A
INC H
INC DE
DJNZ PTBL_2
EX DE,HL
PTBL_3 POP DE
POP AF
DEC A
JR NZ,PTBL_1
RET
PTBL_4 INC HL
PTBL_5 LD DE,9
ADD HL,DE
JR PTBL_3
Скажу сразу - идею я подсмотрел в книге фирмы "Питер" <Как написать игру на
ассемблере>.
2. Если идея первой процедуры мною заимствованна, то вторая полностью моя.
Она предназначена для поворота спрайта вокруг своей вертикальной оси.
На входе в HL - адрес начала спрайта.
SP_MIRROR LD A,(HL)
MIR_1 INC HL
PUSH AF
INC HL
LD A,9 ; ширина спрайта
SUB (HL)
LD (HL),A
LD B,8
MIR_2 INC HL
LD A,(HL)
RLA
RR D
RLA
RR D
RLA
RR D
RLA
RR D
RLA
RR D
RLA
RR D
RLA
RR D
RLA
RR D
LD (HL),D
DJNZ MIR_2
POP AF
DEC A
JR NZ,MIR_1
RET