.vu

.include "vufont.i"

; WARNING - this is a wide file.  Edit with a wide window, and print in landscape mode...!

; Buffers are:
; TOP + 0   Input
; TOP + 256 Output
; ITOP -> Number of triangles to process
; Write address of output to high memory (gsCmdAddr)



; Data in High memory
.equ mat0, vuSDBlockHigh
.equ mat1, vuSDBlockHigh+1
.equ mat2, vuSDBlockHigh+2
.equ mat3, vuSDBlockHigh+3
.equ nearClip, vuSDBlockHigh+4
.equ farClip, vuSDBlockHigh+5
.equ xMaxyMax, vuSDBlockHigh+6
.equ camWcamHzScale, vuSDBlockHigh+7
.equ offXoffYzShift, vuSDBlockHigh+8
.equ realOffset, vuSDBlockHigh+9
.equ gifTag, vuSDBlockHigh+10
.equ colScale, vuSDBlockHigh+11
.equ surfProps, vuSDBlockHigh+12
.equ fogAddrGenTbl, vuSDBlockHigh+13
.equ fogAddrGenTbl1, vuSDBlockHigh+14
.equ gsCmdAddr, vuSDBlockHigh+15

.equ brCxt1, vuFontSymbStaticData

.equ topRGBA, vuFontSymbStaticData+1
.equ topDeltaRGBA, vuFontSymbStaticData+2

.equ botRGBA, vuFontSymbStaticData+3
.equ botDeltaRGBA, vuFontSymbStaticData+4

.equ fontCxt, vuFontSymbStaticData+5
.equ brGifTag, vuFontSymbStaticData+6

.equ vertexSize, 2
.equ outputVertexSize, 3

; These eventually get moved into registers
; vf01  transformation matrix row 1
; vf02  transformation matrix row 2
; vf03  transformation matrix row 3
; vf04  transformation matrix row 4
; vf05  camWcamHzScale
; vf06  offXoffYzShift+realOffset
; vf07  v.x * oobaseu(x), v.x(w)
; vf08  intergap(x), baseu(y), layerDepth(z), oobaseu(w)
; vf09

; vf10  bot v0 coordinate
; vf11  top v0 coordinate
; vf12  bot v1 coordinate
; vf13  top v1 coordinate

; vf14  bot uv0(xy)
; vf15  top uv0(xy)
; vf16  bot uv1(xy)
; vf17  top uv1(xy)

; vf18  bot rgba0
; vf19  top rgba0
; vf20  bot rgba1
; vf21  top rgba1

; vf22  brush bot rgba
; vf23  brush top rgba
; vf24
; vf25

; vf26
; vf27

; vf28         TEMPORARY REGISTER
; vf29         TEMPORARY REGISTER
; vf30         TEMPORARY REGISTER
; vf31         TEMPORARY REGISTER

; vi01  tmp
; vi02  tmp
; vi03  tmp
; vi04  tmp
; vi05  tmp
; vi06  tmp
; vi07  tmp
; vi08  tmp
; vi09  tmp
; vi10  input pointer
; vi11  output pointer
; vi12  count
; vi13  buffer 1
; vi14  buffer 2
; vi15  link
;   upper   lower

process:
; Load and adjust matrix into VF01->VF04
; Load 0x1 for fog address generation
        NOP                                     IADDIU  VI02, VI00, 0x8
        NOP                                     MFIR.x  VF31, VI02
        NOP                                     LQ.xyzw VF01, mat0(VI00)
        NOP                                     LQ.xyzw VF02, mat1(VI00)
        NOP                                     LQ.xyzw VF03, mat2(VI00)
        ITOF4.x VF31, VF31                      LQ.xyzw VF04, mat3(VI00)

; adjust and load other stuff

        MULz.x  VF28, VF31, VF01                IADDIU VI14, VI00, 0x1
        MULz.x  VF29, VF31, VF02                NOP
        MULz.x  VF30, VF31, VF03                NOP
        MULz.x  VF31, VF31, VF04                NOP

        SUBx.xy VF01, VF01, VF28                isw.w vi0, fogAddrGenTbl1(vi0)
        SUBx.xy VF02, VF02, VF29                isw.w vi0, fogAddrGenTbl(vi0)
        SUBx.xy VF03, VF03, VF30                iaddiu vi1, vi0, 512
        SUBx.xy VF04, VF04, VF31                isw.w vi1, fogAddrGenTbl1(vi0)

processLine:

; Convert int fields to floats (SCATTER builds) and do lighting and gif tag setup
        NOP                                     XTOP    VI10                                    ; Input buffer
        NOP                                     XITOP   VI12                                    ; Number of vertices

        NOP                                     IADD    VI11, VI12, VI12                        ; Output buffer
        NOP                                     IADD    VI11, VI11, VI10                        ; Output buffer

        NOP                                     ISUBIU  VI12, VI12, 2                           ; Ignore the last two verts.

        NOP                                     IBEQ    VI12, VI00, dispatchNOT                 ; No vertices to do, don't bother XGKICKing?
        NOP                                     ISW.w   VI11, gsCmdAddr(VI00)                   ; Store output buffer pointer

        NOP                                     IADD    VI09, VI12, VI12                        ; output = 6 * input.
        NOP                                     IADD    VI12, VI09, VI09                        ;
        NOP                                     IADD    VI12, VI09, VI12

; Do the lighting (and SCATTER data conversion)
; .include "light.vu"

; Do rest of setup

        NOP                                     LQ.w VF26, brCxt1(VI00)                         ; load the brush context

        NOP                                     IADDIU  VI06, VI00, 0x4000                      ; gifTag setup: VI06 = 0x4000
        NOP                                     IADD VI06, VI06, VI06                           ; gifTag setup: VI06 = 0x8000 (EOP)
        NOP                                     LQ.yzw  VF30, gifTag(VI00)                    ; Get rest of gifTag (render state bit)
        NOP                                     LQ.yzw  VF29, brGifTag(VI00)                    ; Get rest of gifTag (render state bit)

        NOP                                     LQ.xyzw VF06, offXoffYzShift(VI00)              ; Combine subraster and...

        NOP                                     DIV Q, VF00w, VF26w                             ; 1.0 / oobaseu

        NOP                                     LQ.xyzw VF31, realOffset(VI00)                  ;     ...GS offset together for faster transform
        NOP                                     IOR VI06, VI06, VI12                            ; gifTag setup: VI06 = 0x8000 (EOP) | numVerts
        NOP                                     ISW.x VI06, 0(VI11)                             ; Store gifTag
        NOP                                     SQI.yzw VF29, (VI11++)                          ; Store gifTag

        NOP                                     LQ.zw VF14, xMaxyMax(vi0)                       ; fog scale and clamp
        NOP                                     LQ.z VF21, farClip(vi0)                         ; far clip used by fogging

        ADD.xy VF06, VF06, VF31                 LQ.xyzw VF28, colScale(VI00)                    ; Set up for rest...
        NOP                                     LQ.xyzw VF05, camWcamHzScale(VI00)              ;     ...of transform


;       Clear some reg.

        MULx.xyzw VF10, VF00, VF00              NOP                                     ;
        MULx.xyzw VF11, VF00, VF00              NOP                                     ;

        MULx.xyzw VF12, VF00, VF00              NOP                                     ;
        MULx.xyzw VF13, VF00, VF00              NOP                                     ;

        NOP                                     IADDIU VI14, VI00, 0xff0                        ;               set up fog.
        NOP                                     MFIR.w VF10, VI14                               ;
        NOP                                     MFIR.w VF11, VI14                               ;
        NOP                                     MFIR.w VF12, VI14                               ;
        NOP                                     MFIR.w VF13, VI14                               ;


; Set VI13 to point to end of out put for loop exit testing

        NOP                                     IADD VI13, VI12, VI12
        NOP                                     IADD VI13, VI13, VI12

        NOP                                     IADD VI13, VI13, VI11

; Initial run up

        NOP                                     LQ.y VF10, fontCxt(VI00)                        ; load the start pos.
        NOP                                     LQ.y VF11, fontCxt(VI00)                        ; load the start pos.

        MULq.w VF08, VF00, Q                    LQ.xyzw VF22, botRGBA(VI00)                     ; load brush bot RGBA
        NOP                                     LQ.xyzw VF23, topRGBA(VI00)                     ; load brush top RGBA

        ADDy.x VF10, VF00, VF10                 NOP                                             ; mv y->x
        ADDy.x VF11, VF00, VF11                 NOP                                             ; mv y->x


        NOP                                     LQ.z VF08, brCxt1(VI00)                        ; load brCxt
        NOP                                     LQ.xy VF08, fontCxt(VI00)                      ; load fontCxt

        NOP                                     LQ.z VF12, 0(VI10)                      ;                       load cr.w
        NOP                                     LQ.z VF13, 0(VI10)                      ;                       load cr.w


;        NOP                                     LQ.xy VF14, 1(VI10)                     ;                       load bot uv0
;        NOP                                     LQ.xw VF15, 1(VI10)                     ;                       load top uv0

;        NOP                                     LQ.zy VF16, 1(VI10)                     ;                       load bot uv1
;        NOP                                     LQ.zw VF17, 1(VI10)                     ;                       load top uv1

; tmp work around to load the four uvs.

        ADDz.x VF12, VF00, VF12                 LQ.xy VF15, 0(VI10)                     ; mv z->x               load top uv0
        ADDz.x VF13, VF00, VF13                 LQ.x VF14, 0(VI10)                      ; mv z->x               load bot u0
        NOP                                     LQ.x VF17, 1(VI10)                      ;                       load top u0
        NOP                                     LQ.xy VF16, 1(VI10)                     ;                       load bot uv1
        NOP                                     LQ.y VF14, 1(VI10)                      ;                       load bot v0
        NOP                                     LQ.y VF17, 0(VI10)                      ;                       load top v1


        NOP                                     LQ.z VF10, brCxt1(VI00)                 ;                       load bot v0.z
        NOP                                     LQ.z VF11, brCxt1(VI00)                 ;                       load top v1.z
        NOP                                     LQ.z VF12, brCxt1(VI00)                 ;                       load bot v0.z
        NOP                                     LQ.z VF13, brCxt1(VI00)                 ;                       load top v1.z


        NOP                                     LQ.xyzw VF18, botDeltaRGBA(VI00)        ;                       load bot d-rgba0
        NOP                                     LQ.xyzw VF19, topDeltaRGBA(VI00)        ;                       load top d-rgba0
        NOP                                     LQ.xyzw VF20, botDeltaRGBA(VI00)        ;                       load bot d-rgba1
        NOP                                     LQ.xyzw VF21, topDeltaRGBA(VI00)        ;                       load top d-rgba1

        ADDy.y VF10, VF00, VF00                 NOP                                     ; bot v0.y = 0

;        ADDy.w VF15, VF00, VF15                 NOP                                     ; mv top uv0 w->y
;        ADDx.z VF16, VF00, VF16                 NOP                                     ; mv bot uv1 z->x

;        ADDx.z VF17, VF00, VF17                 NOP                                     ; mv top uv1 z->x

        ADDx.x VF12, VF10, VF12                  NOP                                     ; v1.x = v0.x + cr.w
        ADDx.x VF13, VF11, VF13                  NOP                                     ; v1.x = v0.x + cr.w

        MULw.x VF07, VF10, VF08                 NOP                                     ; dx = v0.x * oobaseu

;        ADDy.w VF17, VF00, VF17                 NOP                                     ; mv top uv1 w->y


        ADDw.y VF11, VF00, VF00                 NOP                                     ; top v0.y = 1

        MULAw.xyz ACC, VF04, VF00               NOP                                     ; bot v0 xform
        MADDAx.xyz ACC, VF01, VF10              NOP                                     ; bot v0 xform
        MADDAy.xyz ACC, VF02, VF10              NOP                                     ; bot v0 xform
        MADDz.xyz VF10, VF03, VF10              NOP                                     ; bot v0 xform

        MULx.w VF07, VF00, VF12                 NOP                                     ; save next pos

        MULx.xyzw VF18, VF18, VF07              NOP                                     ; bot d-rgba0 * dx
        MULx.xyzw VF19, VF19, VF07              NOP                                     ; top d-rgba0 * dx

        MULw.x VF07, VF12, VF08                 NOP                                     ; dx = v1.x * oobaseu

        NOP                                     DIV Q, VF00w, VF10z                     ;                       calc Q.

        MULAw.xyz ACC, VF04, VF00               NOP                                     ; top v0 xform
        MADDAx.xyz ACC, VF01, VF11              NOP                                     ; top v0 xform
        MADDAy.xyz ACC, VF02, VF11              NOP                                     ; top v0 xform
        MADDz.xyz VF11, VF03, VF11              NOP                                     ; top v0 xform

        MULx.xyzw VF20, VF20, VF07              NOP                                     ; bot d-rgba1 * dx
        MULx.xyzw VF21, VF21, VF07              NOP                                     ; top d-rgba1 * dx

        NOP                                     MR32.z VF10, VF00                       ;                       bot v0.z = 1

        MULAw.xyz ACC, VF04, VF00               NOP                                     ; top v0 xform
        MADDAx.xyz ACC, VF01, VF12              NOP                                     ; top v0 xform
        MADDAy.xyz ACC, VF02, VF12              NOP                                     ; top v0 xform
        MADDz.xyz VF12, VF03, VF12              NOP                                     ; top v0 xform

        ADDw.y VF13, VF00, VF00                 MR32.z VF11, VF00                       ; top v1.y = 1          top v0.z = 1
        MULq.xyz VF10, VF10, Q                  NOP                                     ; proj bot v0

        MULAw.xyz ACC, VF04, VF00               NOP                                     ; top v0 xform
        MADDAx.xyz ACC, VF01, VF13              NOP                                     ; top v0 xform
        MADDAy.xyz ACC, VF02, VF13              NOP                                     ; top v0 xform
        MADDz.xyz VF13, VF03, VF13              NOP                                     ; top v0 xform

        NOP                                     MR32.z VF12, VF00                       ;                       bot v1.z = 1
        MULq.xyz VF11, VF11, Q                  NOP                                     ; proj top v0
        MUL.xyz VF10, VF05, VF10                NOP                                     ; bot v0 *= res

        ADD.xyzw VF18, VF18, VF22               NOP                                     ; bot d-rgba0 + bot brush rgba0
        ADD.xyzw VF19, VF19, VF23               NOP                                     ; top d-rgba0 + top brush rgba0

        NOP                                     MR32.z VF13, VF00                       ;                       top v1.z = 1
        MULq.xyz VF12, VF12, Q                  NOP                                     ; proj bot v1
        MUL.xyz VF11, VF05, VF11                NOP                                     ; top v0 *= res
        ADD.xyz VF10, VF10, VF06                NOP                                     ; bot v0 += win offset

        ADD.xyzw VF20, VF20, VF22               NOP                                     ; bot d-rgba1 + bot brush rgba1
        ADD.xyzw VF21, VF21, VF23               NOP                                     ; top d-rgba1 + top brush rgba1

        MULq.xyz VF13, VF13, Q                  NOP                                     ; proj top v1
        MUL.xyz VF12, VF05, VF12                NOP                                     ; bot v0 *= res
        ADD.xyz VF11, VF11, VF06                NOP                                     ; top v0 += win offset
        FTOI4.xyz VF10, VF10                    NOP                                     ; int bot v0

        FTOI0.xyzw VF18, VF18                   NOP                                     ; int bot rgba0
        FTOI0.xyzw VF19, VF19                   NOP                                     ; int top rgba0
        FTOI0.xyzw VF20, VF20                   NOP                                     ; int bot rgba1
        FTOI0.xyzw VF21, VF21                   NOP                                     ; int top rgba1

        MUL.xyz VF13, VF05, VF13                NOP                                     ; top v0 *= res
        ADD.xyz VF12, VF12, VF06                NOP                                     ; top v0 += win offset
        FTOI4.xyz VF11, VF11                    NOP                                     ; int top v0

        ADDw.z VF14, VF00, VF00                 NOP                                     ; bot uv0.z = 1
        ADDw.z VF15, VF00, VF00                 NOP                                     ; top uv0.z = 1

        ADD.xyz VF13, VF13, VF06                NOP                                     ; top v0 += win offset
        FTOI4.xyz VF12, VF12                    NOP                                     ; int bot v1

        ADDw.z VF16, VF00, VF00                 NOP                                     ; bot uv1.z = 1
        ADDw.z VF17, VF00, VF00                 NOP                                     ; top uv1.z = 1

        FTOI4.xyz VF13, VF13                    NOP                                     ; int top v1

        NOP                                     SQI.xyz VF14, (VI11++)                  ;
        NOP                                     SQI.xyzw VF18, (VI11++)                 ;
        NOP                                     SQI.xyzw VF10, (VI11++)                 ;

        NOP                                     SQI.xyz VF15, (VI11++)                  ;
        NOP                                     SQI.xyzw VF19, (VI11++)                 ;
        NOP                                     SQI.xyzw VF11, (VI11++)                 ;

        NOP                                     SQI.xyz VF17, (VI11++)                  ;
        NOP                                     SQI.xyzw VF21, (VI11++)                 ;
        NOP                                     SQI.xyzw VF13, (VI11++)                 ;

        NOP                                     SQI.xyz VF14, (VI11++)                  ;
        NOP                                     SQI.xyzw VF18, (VI11++)                 ;
        NOP                                     SQI.xyzw VF10, (VI11++)                 ;

        NOP                                     SQI.xyz VF16, (VI11++)                  ;
        NOP                                     SQI.xyzw VF20, (VI11++)                 ;
        NOP                                     SQI.xyzw VF12, (VI11++)                 ;

        NOP                                     SQI.xyz VF17, (VI11++)                  ;
        NOP                                     SQI.xyzw VF21, (VI11++)                 ;
        NOP                                     SQI.xyzw VF13, (VI11++)                 ;

        ADDw.x VF10, VF08, VF07                 NOP                                     ; v0.x = v1.x + gap
        ADDw.x VF11, VF08, VF07                 NOP                                     ; v0.x = v1.x + gap

        NOP                                     IBEQ VI11, VI13, dispatch               ;

        NOP                                     IADDIU VI10, VI10, vertexSize           ;

;
; -----------------------
;

loop:

        NOP                                     LQ.z VF12, 0(VI10)                      ;                       load w
        NOP                                     LQ.z VF13, 0(VI10)                      ;                       load w

;        NOP                                     LQ.xy VF14, 1(VI10)                     ;                       load bot uv0
;        NOP                                     LQ.xw VF15, 1(VI10)                     ;                       load top uv0

;        NOP                                     LQ.zy VF16, 1(VI10)                     ;                       load bot uv1
;        NOP                                     LQ.zw VF17, 1(VI10)                     ;                       load top uv1

; tmp work around to load the four uvs.

        ADDz.x VF12, VF00, VF12                 LQ.xy VF15, 0(VI10)                     ; mv z->x               load top uv0
        ADDz.x VF13, VF00, VF13                 LQ.x VF14, 0(VI10)                      ; mv z->x               load bot u0
        NOP                                     LQ.x VF17, 1(VI10)                      ;                       load top u0
        NOP                                     LQ.xy VF16, 1(VI10)                     ;                       load bot uv1
        NOP                                     LQ.y VF14, 1(VI10)                      ;                       load bot v0
        NOP                                     LQ.y VF17, 0(VI10)                      ;                       load top v1

        NOP                                     LQ.z VF10, brCxt1(VI00)                 ;                       load bot v0.z
        NOP                                     LQ.z VF11, brCxt1(VI00)                 ;                       load top v1.z
        NOP                                     LQ.z VF12, brCxt1(VI00)                 ;                       load bot v0.z
        NOP                                     LQ.z VF13, brCxt1(VI00)                 ;                       load top v1.z

        NOP                                     LQ.xyzw VF18, botDeltaRGBA(VI00)        ;                       load bot d-rgba0
        NOP                                     LQ.xyzw VF19, topDeltaRGBA(VI00)        ;                       load top d-rgba0
        NOP                                     LQ.xyzw VF20, botDeltaRGBA(VI00)        ;                       load bot d-rgba1
        NOP                                     LQ.xyzw VF21, topDeltaRGBA(VI00)        ;                       load top d-rgba1

;        ADDy.w VF15, VF00, VF15                 NOP                                     ; mv top uv0 w->y
;        ADDx.z VF16, VF00, VF16                 NOP                                     ; mv bot uv1 z->x

;        ADDx.z VF17, VF00, VF17                 NOP                                     ; mv top uv1 z->x

        ADDx.x VF12, VF10, VF12                  NOP                                     ; calc x1
        ADDx.x VF13, VF11, VF13                  NOP                                     ; calc x1

        MULw.x VF07, VF10, VF08                 NOP                                     ; v0.x * oobaseu

;        ADDy.w VF17, VF00, VF17                 NOP                                     ; mv top uv1 w->y

        ADDw.y VF11, VF00, VF00                 NOP                                     ; top v0.y = 1

        MULAw.xyz ACC, VF04, VF00               NOP                                     ; bot v0 xform
        MADDAx.xyz ACC, VF01, VF10              NOP                                     ; bot v0 xform
        MADDAy.xyz ACC, VF02, VF10              NOP                                     ; bot v0 xform
        MADDz.xyz VF10, VF03, VF10              NOP                                     ; bot v0 xform

        MULx.w VF07, VF00, VF12                 NOP                                     ; save next pos

        MULx.xyzw VF18, VF18, VF07              NOP                                     ; bot d-rgba0 * dx
        MULx.xyzw VF19, VF19, VF07              NOP                                     ; top d-rgba0 * dx

        MULw.x VF07, VF12, VF08                 NOP                                     ; v1.x * oobaseu

        MULAw.xyz ACC, VF04, VF00               NOP                                     ; top v0 xform
        MADDAx.xyz ACC, VF01, VF11              NOP                                     ; top v0 xform
        MADDAy.xyz ACC, VF02, VF11              NOP                                     ; top v0 xform
        MADDz.xyz VF11, VF03, VF11              NOP                                     ; top v0 xform

        MULx.xyzw VF20, VF20, VF07              NOP                                     ; bot d-rgba1 * dx
        MULx.xyzw VF21, VF21, VF07              NOP                                     ; top d-rgba1 * dx

        ADDw.y VF13, VF00, VF00                 MR32.z VF10, VF00                       ; top v1.y = 1          bot v0.z = 1

        MULAw.xyz ACC, VF04, VF00               NOP                                     ; top v0 xform
        MADDAx.xyz ACC, VF01, VF12              NOP                                     ; top v0 xform
        MADDAy.xyz ACC, VF02, VF12              NOP                                     ; top v0 xform
        MADDz.xyz VF12, VF03, VF12              NOP                                     ; top v0 xform

        NOP                                     MR32.z VF11, VF00                       ;                       top v0.z = 1
        MULq.xyz VF10, VF10, Q                  NOP                                     ; proj bot v0

        MULAw.xyz ACC, VF04, VF00               NOP                                     ; top v0 xform
        MADDAx.xyz ACC, VF01, VF13              NOP                                     ; top v0 xform
        MADDAy.xyz ACC, VF02, VF13              NOP                                     ; top v0 xform
        MADDz.xyz VF13, VF03, VF13              NOP                                     ; top v0 xform

        NOP                                     MR32.z VF12, VF00                       ;                       bot v1.z = 1
        MULq.xyz VF11, VF11, Q                  NOP                                     ; proj top v0
        MUL.xyz VF10, VF05, VF10                NOP                                     ; bot v0 *= res

        ADD.xyzw VF18, VF18, VF22               NOP                                     ; bot d-rgba0 + bot brush rgba0
        ADD.xyzw VF19, VF19, VF23               NOP                                     ; top d-rgba0 + top brush rgba0

        NOP                                     MR32.z VF13, VF00                       ;                       top v1.z = 1
        MULq.xyz VF12, VF12, Q                  NOP                                     ; proj bot v1
        MUL.xyz VF11, VF05, VF11                NOP                                     ; top v0 *= res
        ADD.xyz VF10, VF10, VF06                NOP                                     ; bot v0 += win offset

        ADD.xyzw VF20, VF20, VF22               NOP                                     ; bot d-rgba1 + bot brush rgba1
        ADD.xyzw VF21, VF21, VF23               NOP                                     ; top d-rgba1 + top brush rgba1

        MULq.xyz VF13, VF13, Q                  NOP                                     ; proj top v1
        MUL.xyz VF12, VF05, VF12                NOP                                     ; bot v0 *= res
        ADD.xyz VF11, VF11, VF06                NOP                                     ; top v0 += win offset
        FTOI4.xyz VF10, VF10                    NOP                                     ; int bot v0

        FTOI0.xyzw VF18, VF18                   NOP                                     ; int bot rgba0
        FTOI0.xyzw VF19, VF19                   NOP                                     ; int top rgba0
        FTOI0.xyzw VF20, VF20                   NOP                                     ; int bot rgba1
        FTOI0.xyzw VF21, VF21                   NOP                                     ; int top rgba1

        MUL.xyz VF13, VF05, VF13                NOP                                     ; top v0 *= res
        ADD.xyz VF12, VF12, VF06                NOP                                     ; top v0 += win offset
        FTOI4.xyz VF11, VF11                    NOP                                     ; int top v0

        ADDw.z VF14, VF00, VF00                 NOP                                     ; bot uv0.z = 1
        ADDw.z VF15, VF00, VF00                 NOP                                     ; top uv0.z = 1

        ADD.xyz VF13, VF13, VF06                NOP                                     ; top v0 += win offset
        FTOI4.xyz VF12, VF12                    NOP                                     ; int bot v1

        ADDw.z VF16, VF00, VF00                 NOP                                     ; bot uv1.z = 1
        ADDw.z VF17, VF00, VF00                 NOP                                     ; top uv1.z = 1

        FTOI4.xyz VF13, VF13                    NOP                                     ; int top v1

        NOP                                     SQI.xyz VF14, (VI11++)                  ;
        NOP                                     SQI.xyzw VF18, (VI11++)                 ;
        NOP                                     SQI.xyzw VF10, (VI11++)                 ;

        NOP                                     SQI.xyz VF15, (VI11++)                  ;
        NOP                                     SQI.xyzw VF19, (VI11++)                 ;
        NOP                                     SQI.xyzw VF11, (VI11++)                 ;

        NOP                                     SQI.xyz VF17, (VI11++)                  ;
        NOP                                     SQI.xyzw VF21, (VI11++)                 ;
        NOP                                     SQI.xyzw VF13, (VI11++)                 ;

        NOP                                     SQI.xyz VF14, (VI11++)                  ;
        NOP                                     SQI.xyzw VF18, (VI11++)                 ;
        NOP                                     SQI.xyzw VF10, (VI11++)                 ;

        NOP                                     SQI.xyz VF16, (VI11++)                  ;
        NOP                                     SQI.xyzw VF20, (VI11++)                 ;
        NOP                                     SQI.xyzw VF12, (VI11++)                 ;

        NOP                                     SQI.xyz VF17, (VI11++)                  ;
        NOP                                     SQI.xyzw VF21, (VI11++)                 ;
        NOP                                     SQI.xyzw VF13, (VI11++)                 ;

        ADDw.x VF10, VF08, VF07                 NOP                                     ; v0.x = v1.x + gap
        ADDw.x VF11, VF08, VF07                 NOP                                     ; v0.x = v1.x + gap

        NOP                                     IBNE VI11, VI13, loop                   ;
        NOP                                     IADDIU VI10, VI10, vertexSize           ;

;
; -----------------------
;

dispatch:
        NOP                                     ILW.w   VI13, gsCmdAddr(VI00)
        NOP                                     XGKICK VI13

dispatchNOT:
        NOP[e]                                  NOP
        NOP                                     NOP

; Rerun (with continue)
        NOP                                     B processLine
        NOP                                     NOP
