removesprite.s

来自「symbian 的一个 二维飞行游戏 源码 及相关技术文章」· S 代码 · 共 62 行

S
62
字号
@@  Copyright 2002 Kenneth Guy,
@@  
        	.global	RemoveAsm__12TSprite32x24
RemoveAsm__12TSprite32x24:
        stmfd sp!, {r0-r12,lr}

        @@  r0 TSprite32x24*
        @@     - offset 0   TUint16* iSpritePos;
        @@     - offset 4   TUint16* iDrawEnd;
        @@     - offset 8  TUint16 iBehindSprite[32*24]

        ldmia   r0, {r2,r3} @ iSpritePos,iDrawEnd
        add     r1,r0,#8        @ iBehindSprite
        
        mov     r14,#24         @ sprite is 24 lines
        sub     r3,r3,#64       @ handle end of map area
RemoveSpritePlotLoop:
        cmp     r2,r3
        bge     removeSpriteOverlap
        
        ldmia   r1!,{r5-r12}
        stmia   r2!,{r5-r12}
        ldmia   r1!,{r5-r12}
        stmia   r2!,{r5-r12}

        add     r2,r2,#1344     @ next line

removeSpriteOverlapReturn:                
        
        subs    r14,r14,#1
        bne     RemoveSpritePlotLoop     @ loop 24 times (24 lines in a sprite)

        	
	ldmfd sp!, {r0-r12,lr}
	@ handle returning to thumb code
	bx      lr

        
removeSpriteOverlap:      
        add     r3,r3,#64

        cmp     r2,r3
        subge   r2,r2,#0x4D000   @ length of draw area
        
        mov     r10,#16
removeSpriteOverlapLoop:
        ldr     r5,[r1],#4
        str     r5,[r2],#4
        
        cmp     r2,r3
        subge   r2,r2,#0x4D000   @ length of draw area

        subs    r10,r10,#1
        bne     removeSpriteOverlapLoop

                
        add     r2,r2,#1344     @ next line
        cmp     r2,r3
        subge   r2,r2,#0x4D000   @ length of draw area
        b       removeSpriteOverlapReturn

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?