#name ^.Object.WindBack
#type &ffd

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


#set batcol=32
#set shift = 8
#set baseshift = 8
;on entry (R0,R1)=ball pos, (R2,R3)=ball velocity, both wrt bat.
;R4,R5= batsize 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 R1,R1,R3
STMFD R13!,{R0-R3}
SUB R7,R4,R5
ADD R8,R5,R6
MOV R7,R7,LSL #shift
MOV R8,R8,LSL #shift
;MOV R0,R0,ASR #baseshift-shift
;MOV R1,R1,ASR #baseshift-shift
STMFD R13!,{R0-R3}
MOV R9,#1<<(shift-1)
MOV R10,#0
.divloop
LDMFD R13,{R0-R3}; no writeback
ADD R4,R9,R10
MUL R2,R4,R2
MUL R3,R4,R3
MOV R2,R2,ASR #baseshift
MOV R3,R3,ASR #baseshift
ADD R0,R0,R2
ADD R1,R1,R3
CMP R0,R7,LSL #3
BGT onright
CMN R0,R7,LSL #3
BLT onleft
CMP R1,#0
RSBLT R1,R1,#0
CMP R1,R8,LSL #3
BGE yes
B no
.onright
SUB R0,R0,R7,LSL #3
MOV R0,R0,ASR #4
MOV R4,R0
MUL R0,R4,R0
MOV R1,R1,ASR #4
MOV R4,R1
MUL R1,R4,R1
ADD R4,R0,R1
CMP R4,#((batcol)*(batcol))<<16
BGE yes
B no
.onleft
ADD R0,R0,R7,LSL #3
MOV R0,R0,ASR #4
MOV R4,R0
MUL R0,R4,R0
MOV R1,R1,ASR #4
MOV R4,R1
MUL R1,R4,R1
ADD R4,R0,R1
CMP R4,#((batcol)*(batcol))<<16
BGE yes
B no
.yes
ORR R10,R10,R9
.no
MOVS R9,R9,LSR #1
BNE divloop
LDMFD R13!,{R0-R3}
LDMFD R13!,{R0-R3}
MUL R2,R10,R2
MOV R2,R2,ASR #shift
MUL R3,R10,R3
MOV R3,R3,ASR #shift
ADD R0,R0,R2
ADD R1,R1,R3
MOV R4,R10
LDMFD R13!,{R5-R10,PC}


