📄 sprite.s
字号:
@@ Copyright 2002 Kenneth Guy,
@@
.global PlotAsm__12TSprite32x24PCUs
PlotAsm__12TSprite32x24PCUs:
stmfd sp!, {r1-r12,lr}
@@ r0 TSprite32x24* this
@@ - offset 0 TUint16* iSpritePos;
@@ - offset 4 TUint16* iDrawEnd;
@@ - offset 8 TUint16 iBehindSprite[32*24];
@@ r1 const TUint16* aSpriteData;
ldmia r0, {r2,r3} @ iSpritePos,iDrawEnd
mov r4,r1 @ aSpriteData
add r1,r0,#8 @ iBehindSprite
mov r0,#0 @ store collision info in r0,
mov r14,#24 @ sprite is 24 lines
sub r3,r3,#64 @ handle end of map area
SpritePlotLoop:
cmp r2,r3
bge plotSpriteOverlap
@@ save background
ldmia r2,{r5-r8} @ map behind sprite
stmia r1!,{r5-r8} @ save map for removesprite
@@ plot sprite and store collision info if not black
ldmia r4!,{r9-r12} @ sprite
@ if sprite pixels are blank use map, and do not store collision info
cmp r9,#0; moveq r9,r5; orrne r0,r0,r5;
cmp r10,#0; moveq r10,r6; orrne r0,r0,r6;
cmp r11,#0; moveq r11,r7; orrne r0,r0,r7;
cmp r12,#0; moveq r12,r8; orrne r0,r0,r8;
@@ plot data
stmia r2!,{r9-r12}
@@ save background
ldmia r2,{r5-r8} @ map behind sprite
stmia r1!,{r5-r8} @ save map for removesprite
@@ plot sprite and store collision info if not black
ldmia r4!,{r9-r12} @ sprite
@ if sprite pixels are blank use map, and do not store collision info
cmp r9,#0; moveq r9,r5; orrne r0,r0,r5;
cmp r10,#0; moveq r10,r6; orrne r0,r0,r6;
cmp r11,#0; moveq r11,r7; orrne r0,r0,r7;
cmp r12,#0; moveq r12,r8; orrne r0,r0,r8;
@@ plot data
stmia r2!,{r9-r12}
@@ save background
ldmia r2,{r5-r8} @ map behind sprite
stmia r1!,{r5-r8} @ save map for removesprite
@@ plot sprite and store collision info if not black
ldmia r4!,{r9-r12} @ sprite
@ if sprite pixels are blank use map, and do not store collision info
cmp r9,#0; moveq r9,r5; orrne r0,r0,r5;
cmp r10,#0; moveq r10,r6; orrne r0,r0,r6;
cmp r11,#0; moveq r11,r7; orrne r0,r0,r7;
cmp r12,#0; moveq r12,r8; orrne r0,r0,r8;
@@ plot data
stmia r2!,{r9-r12}
@@ save background
ldmia r2,{r5-r8} @ map behind sprite
stmia r1!,{r5-r8} @ save map for removesprite
@@ plot sprite and store collision info if not black
ldmia r4!,{r9-r12} @ ship
@ if sprite pixels are blank use map, and do not store collision info
cmp r9,#0; moveq r9,r5; orrne r0,r0,r5;
cmp r10,#0; moveq r10,r6; orrne r0,r0,r6;
cmp r11,#0; moveq r11,r7; orrne r0,r0,r6;
cmp r12,#0; moveq r12,r8; orrne r0,r0,r8;
@@ plot data
stmia r2!,{r9-r12}
add r2,r2,#1344 @ next line
plotSpriteOverlapReturn:
subs r14,r14,#1
bne SpritePlotLoop @ loop 24 times (24 lines in a sprite)
ldmfd sp!, {r1-r12,lr}
@ handle returning to thumb code
bx lr
plotSpriteOverlap:
add r3,r3,#64
cmp r2,r3
subge r2,r2,#0x4D000 @ length of draw area
mov r10,#16
plotSpriteOverlapLoop:
ldr r5,[r2] @ map behind sprite
str r5,[r1],#4 @ save map for removesprite
ldr r9,[r4],#4 @ sprite
@ if sprite pixels are blank use map, and do not store collision info
cmp r9,#0; moveq r9,r5; orrne r0,r0,r5;
str r9,[r2],#4
cmp r2,r3
subge r2,r2,#0x4D000 @ length of draw area
subs r10,r10,#1
bne plotSpriteOverlapLoop
add r2,r2,#1344 @ next line
cmp r2,r3
subge r2,r2,#0x4D000 @ length of draw area
b plotSpriteOverlapReturn
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -