#name ^.Object.BlockWind
#type &ffd

;R0-R1 = ball pos
;R2-R3 = ballvec


;on entry (R0,R1)=ball pos, (R2,R3)=ball velocity, both wrt block.
;R4,R5= block size in pixels
;R6 = ballsize


; on exit (R0,R1)=contact ball pos, (R2,R3)=reduced velocity
; R4 = 0 -> could not move out of contact
; R4 = 255 -> could not move into contact


.start

STMFD R13!,{R5-R10,R14}
SUB R0,R0,R2
SUB R0,R0,R2,ASR #2; move back by 1 1/4 velocity
SUB R1,R1,R3
SUB R1,R1,R3,ASR #2
STMFD R13!,{R0-R3}

MOV R7,R6
MUL R6,R7,R6
MOV R6,R6,LSL #14 ;(ballsize/2)^2  bp 16
MOV R2,R2,ASR #8
MOV R3,R3,ASR #8
STMFD R13!,{R0-R3}
MOV R9,#1<<8
MOV R10,#0
.divloop
LDMFD R13,{R0-R3}; no writeback
ADD R7,R9,R10
MUL R2,R7,R2
MUL R3,R7,R3
ADD R0,R0,R2
ADD R1,R1,R3
MOV R2,#0
MOV R3,#0
CMP R0,R4,ASL #11
SUBGE R2,R0,R4,ASL #11
CMN R0,R4,ASL #11
ADDLT R2,R0,R4,ASL #11
CMP R1,R5,ASL #11
SUBGE R3,R1,R5,ASL #11
CMN R1,R5,ASL #11
ADDLT R3,R1,R5,ASL #11
MOV R2,R2,ASR #4
MOV R3,R3,ASR #4
MOV R7,R2
MUL R2,R7,R2
MOV R7,R3
MUL R3,R7,R3
ADD R7,R2,R3
CMP R7,R6
ORRGE R10,R10,R9
MOVS R9,R9,LSR #1
BNE divloop

LDMFD R13!,{R0-R3}
LDMFD R13!,{R0-R3}
MOV R2,R2,ASR #8
MUL R2,R10,R2
MOV R3,R3,ASR #8
MUL R3,R10,R3
ADD R0,R0,R2
ADD R1,R1,R3
MOV R4,R10
LDMFD R13!,{R5-R10,PC}


