diff options
Diffstat (limited to 'misc/dreamcast/DrawTexturedQuads.S')
-rw-r--r-- | misc/dreamcast/DrawTexturedQuads.S | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/misc/dreamcast/DrawTexturedQuads.S b/misc/dreamcast/DrawTexturedQuads.S new file mode 100644 index 0000000..5ce16bd --- /dev/null +++ b/misc/dreamcast/DrawTexturedQuads.S @@ -0,0 +1,63 @@ +#include "ViewportTransform.S" +.global _DrawTexturedQuads +.align 4 +.type _DrawTexturedQuads,%function + +_DrawTexturedQuads: +! Setup + mov r4,r3 ! r3 = src + add #-32, r5 ! r5 -= sizeof(VERTEX) + ViewportTransformSetup _VP_TEX_HWIDTH + +.TRANSFORM_QUAD: + mov.l CMD_TEX_VERT, r1 ! r1 = GPU VERT command + + LoadTexturedVertex + ProcessVertex1 + + LoadTexturedVertex + ProcessVertex2 + + LoadTexturedVertex + ProcessVertex3 + + LoadTexturedVertex + ProcessVertex4 CMD_TEX_EOS + +! CLIPFLAGS TESTING + cmp/eq #0,r0 ! T = r0 == 0 (all points invisible) + bt/s .NO_POINTS_VISIBLE ! if T goto NO_POINTS_VISIBLE + nop + bra .SOME_POINTS_VISIBLE + nop + +.NO_POINTS_VISIBLE: + bra .LOOP_END ! jump to loop end after executing instruction in delay slot + add #-128, r5 ! r5 -= 4 * sizeof(VERTEX), move back to prior quad, so that this invisible quad gets overwritten in next iteration + +.SOME_POINTS_VISIBLE: + +.LOOP_END: + dt r6 ! r6--; T = r6 == 0 + bf .TRANSFORM_QUAD ! if !T then goto TRANSFORM_QUAD + nop + + add #32, r5 ! r5 += sizeof(VERTEX) + rts ! return after executing instruction in delay slot + mov r5,r0 ! r0 = r5 + +.align 2 +CMD_TEX_VERT: .long 0xe0000000 +CMD_TEX_EOS: .long 0xf0000000 + +.global _VP_TEX_HWIDTH +_VP_TEX_HWIDTH: .long 0 + +.global _VP_TEX_HHEIGHT +_VP_TEX_HHEIGHT: .long 0 + +.global _VP_TEX_X_PLUS_HWIDTH +_VP_TEX_X_PLUS_HWIDTH: .long 0 + +.global _VP_TEX_Y_PLUS_HHEIGHT +_VP_TEX_Y_PLUS_HHEIGHT: .long 0 |