summary refs log tree commit diff
path: root/misc/dreamcast/DrawColouredQuads.S
blob: 074605a1d34f743d4e68c6ecf7d67e38da5a54f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "ViewportTransform.S"
.global _DrawColouredQuads
.align 4
.type  _DrawColouredQuads,%function

_DrawColouredQuads:
! Setup
    fldi0 fr1     ! U = 0
    fldi0 fr2     ! V = 0
    mov r4,r3     ! r3  = src
    add #-32, r5  ! r5 -= sizeof(VERTEX)
    ViewportTransformSetup _VP_COL_HWIDTH

.TRANSFORM_QUAD:
    mov.l CMD_COL_VERT, r1 ! r1  = GPU VERT command

    LoadColouredVertex
    ProcessVertex1

    LoadColouredVertex
    ProcessVertex2

    LoadColouredVertex
    ProcessVertex3

    LoadColouredVertex
    ProcessVertex4 CMD_COL_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 1 vertex before start of quad

.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_COL_VERT: .long 0xe0000000
CMD_COL_EOS:  .long 0xf0000000

.global _VP_COL_HWIDTH
_VP_COL_HWIDTH:  .long 0

.global _VP_COL_HHEIGHT
_VP_COL_HHEIGHT: .long 0

.global _VP_COL_X_PLUS_HWIDTH
_VP_COL_X_PLUS_HWIDTH:  .long 0

.global _VP_COL_Y_PLUS_HHEIGHT
_VP_COL_Y_PLUS_HHEIGHT: .long 0