📄 hxfcliparm.s
字号:
rsblt r10, r10, #0
rsblt r11, r11, #0
sub r6, r10, r6 ; out.y - in.y
sub r7, r11, r7 ; out.z - in.z
; now, do a TMIA to scale the out-in results and stick it in wMMX space...
tmia wr4, r4, r8 ; x
; FIXME: Add ClipSegment offsets into HXFState.inc
ldr r4, [r3, #0] ; ClipSegment->pVtx
tmia wr5, r6, r8 ; y
tmia wr6, r7, r8 ; z
tmia wr7, r9, r8 ; w
tbcsth wr12, r8 ; set up register for alpha scale
mov r9, #4 ; FIXME Move to begining of proc
tmcr wcgr0, r9
wsrlhg wr12, wr12, wcgr0
; shift all the new wMMX bits right 16...
mov r10, #16
tinsrw wr9, r10, #0
wrord wr4, wr4, wr9
wrord wr5, wr5, wr9
wrord wr6, wr6, wr9
wrord wr7, wr7, wr9
; so now we can just add the stuff together!
waddw wr0, wr0, wr4
waddw wr1, wr1, wr5
waddw wr2, wr2, wr6
waddw wr3, wr3, wr7
; Store r5 as the newPos.v[index]
mov r12, r12, lsl #2 ; r12 should be index
; Store whole vector first, then overwrite with desired clamped value
wstrw wr0, [r4, #0]
wstrw wr1, [r4, #4]
wstrw wr2, [r4, #8]
wstrw wr3, [r4, #12]
;FIXME CLAMP GONE ARY str r5, [r4, r12]
; Compute clipflags here!!!
; ldrd r10, [r0, #HXFSTATE_OFFSET_VIEWPORT_X1]
textrmuw r6, wr0, #0
cmp r6, r10
orrlt r12, r12, #HXF_VTX_CLIP_FLAG_NEG_X
subgts r6, r6, r11
orrgt r12, r12, #HXF_VTX_CLIP_FLAG_POS_X
; ldrd r10, [r0, #HXFSTATE_OFFSET_VIEWPORT_Y1]
textrmuw r6, wr1, #0
cmp r6, r10
orrlt r12, r12, #HXF_VTX_CLIP_FLAG_NEG_Y
subgts r6, r6, r11
orrgt r12, r12, #HXF_VTX_CLIP_FLAG_POS_Y
; ldrd r10, [r0, #HXFSTATE_OFFSET_VIEWPORT_Z1]
textrmuw r6, wr2, #0
cmp r6, r10
orrlt r12, r12, #HXF_VTX_CLIP_FLAG_NEG_Z
subgts r6, r6, r11
orrgt r12, r12, #HXF_VTX_CLIP_FLAG_POS_Z
; flags in r12, now just stuff it in!
strb r12, [r3, #4]
; Load Output offsets
ldr r6, [r0, #HXFSTATE_OFFSET_OUTDIFFUSEOFFSET]
ldr r7, [r0, #HXFSTATE_OFFSET_OUTSPECULAROFFSET]
ldr r9, [r0, #HXFSTATE_OFFSET_OUTTEX1OFFSET]
ldr r10, [r0, #HXFSTATE_OFFSET_OUTTEX2OFFSET]
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = pState r4 = pNewVtx r8 = alpha r12 =
; r1 = pInPos r5 = r9 = Tex1 Off r13 = sp
; r2 = pOutPos r6 = Diff Off r10 = Tex2 Off r14 =
; r3 = pNewSeg r7 = Spec Off r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = inPos.x wr4 = OutPos.y wr8 = wr12 =
; wr1 = inPos.y wr5 = OutPos.x wr9 = wr13 = VP[boundary]
; wr2 = inPos.z wr6 = OutPos.z wr10 = wr14 = inPos[idx]
; wr3 = outPos.x wr7 = wr11 = wr15 = outPos.idx
; wcgr0 = wcgr1 = wcgr2 = wcgr3 =
; ---------------------------------------------------------------------- --
DiffuseInterp
cmp r6, #0
beq SpecularInterp
; Pull color from in & out, then unpack as 16 bit values into WMMX.
add r11, r1, r6
wldrw wr0, [r11] ; #0x10 = pState->OutDiffuseOffset
add r11, r2, r6
wldrw wr1, [r11]
wunpckelub wr4, wr0 ; all 4 color values of in now in wr4 as 8.8!
wunpckelub wr5, wr1 ; same for out
; load alpha into wMMX
; broadcast this value into 16 bits all over the place
; (already done)
wsubhss wr6, wr5, wr4 ; out - in
wsllhg wr6, wr6, wcgr0
wmulsm wr6, wr6, wr12 ; (out - in) * alpha
waddhss wr6, wr6, wr4 ; all that + in
wpackhus wr7, wr6, wr6 ; pack color into 8888
add r11, r4, r6
wstrw wr7, [r11]
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = pState r4 = pNewVtx r8 = alpha r12 =
; r1 = pInPos r5 = r9 = Tex1 Off r13 = sp
; r2 = pOutPos r6 = Diff Off r10 = Tex2 Off r14 =
; r3 = pNewSeg r7 = Spec Off r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = inPos.x wr4 = OutPos.y wr8 = wr12 =
; wr1 = inPos.y wr5 = OutPos.x wr9 = wr13 = VP[boundary]
; wr2 = inPos.z wr6 = OutPos.z wr10 = wr14 = inPos[idx]
; wr3 = outPos.x wr7 = wr11 = wr15 = outPos.idx
; wcgr0 = wcgr1 = wcgr2 = wcgr3 =
; ---------------------------------------------------------------------- --
SpecularInterp
cmp r7, #0
beq Texture1Interp
add r11, r1, r7
wldrw wr0, [r11]
add r11, r2, r7
wldrw wr1, [r11]
wunpckelub wr4, wr0 ; all 4 color values of in now in wr4 as 8.8!
wunpckelub wr5, wr1 ; same for out
; load alpha into wMMX
; broadcast this value into 16 bits all over the place
; (already done)
wsubhss wr6, wr5, wr4 ; out - in
wsllhg wr6, wr6, wcgr0
wmulsm wr6, wr6, wr12 ; (out - in) * alpha
waddhss wr6, wr6, wr4 ; all that + in
wpackhus wr7, wr6, wr6 ; pack color into 8888
add r11, r4, r7
wstrw wr7, [r11]
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = pState r4 = pNewVtx r8 = alpha r12 =
; r1 = pInPos r5 = r9 = Tex1 Off r13 = sp
; r2 = pOutPos r6 = Diff Off r10 = Tex2 Off r14 =
; r3 = pNewSeg r7 = Spec Off r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = inPos.x wr4 = OutPos.y wr8 = wr12 =
; wr1 = inPos.y wr5 = OutPos.x wr9 = wr13 = VP[boundary]
; wr2 = inPos.z wr6 = OutPos.z wr10 = wr14 = inPos[idx]
; wr3 = outPos.x wr7 = wr11 = wr15 = outPos.idx
; wcgr0 = wcgr1 = wcgr2 = wcgr3 =
; ---------------------------------------------------------------------- --
Texture1Interp
cmp r9, #0 ; TexCoord1 offset
beq Texture2Interp
add r1, r1, r9 ; Compute pInVtx.Tex Offset
add r2, r2, r9 ; Compute pOutVtx.Tex Offset
ldr r5, [r1, #0] ; in.u
ldr r6, [r1, #4] ; in.v
ldr r7, [r2, #0] ; out.u
ldr r9, [r2, #4] ; out.v
sub r7, r7, r5
sub r9, r9, r6
tinsrw wr0, r5, #0 ; insert "in" into wMMX unpacked!
tinsrw wr1, r6, #0
wzero wr4
wzero wr5
; now, do a TMIA to scale the out-in results and stick it in wMMX space...
tmia wr4, r7, r8 ; x
tmia wr5, r9, r8 ; y
; rotate over 16 bits...
wrord wr4, wr4, wr9
wrord wr5, wr5, wr9
; so now we can just add the stuff together!
waddw wr0, wr0, wr4
waddw wr1, wr1, wr5
; and store
add r1, r4, r9
wstrw wr0, [r1, #0]
wstrw wr1, [r1, #4]
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = pState r4 = pNewVtx r8 = alpha r12 =
; r1 = pInPos r5 = r9 = Tex1 Off r13 = sp
; r2 = pOutPos r6 = Diff Off r10 = Tex2 Off r14 =
; r3 = pNewSeg r7 = Spec Off r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = inPos.x wr4 = OutPos.y wr8 = wr12 =
; wr1 = inPos.y wr5 = OutPos.x wr9 = wr13 = VP[boundary]
; wr2 = inPos.z wr6 = OutPos.z wr10 = wr14 = inPos[idx]
; wr3 = outPos.x wr7 = wr11 = wr15 = outPos.idx
; wcgr0 = wcgr1 = wcgr2 = wcgr3 =
; ---------------------------------------------------------------------- --
Texture2Interp
cmp r10, #0
ldmfdeq sp!, { r4-r11, pc }
add r1, r1, r10
add r2, r2, r10
ldr r5, [r1, #0] ; in.u
ldr r6, [r1, #4] ; in.v
ldr r7, [r2, #0] ; out.u
ldr r9, [r2, #4] ; out.v
sub r7, r7, r5
sub r9, r9, r6
tinsrw wr0, r5, #0 ; insert "in" into wMMX unpacked!
tinsrw wr1, r6, #0
wzero wr4
wzero wr5
; now, do a TMIA to scale the out-in results and stick it in wMMX space...
tmia wr4, r7, r8 ; x
tmia wr5, r9, r8 ; y
; rotate over 16 bits...
wrord wr4, wr4, wr9
wrord wr5, wr5, wr9
; so now we can just add the stuff together!
waddw wr0, wr0, wr4
waddw wr1, wr1, wr5
; and store
add r1, r4, r10
wstrw wr0, [r1, #0]
wstrw wr1, [r1, #4]
ldmfd sp!, { r4-r11, pc }
ENDP
;** ************************************************************************ **
END
;/* ************************************************************************ *\
;** ************************************************************************ **
;** EOF
;** ************************************************************************ **
;\* ************************************************************************ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -