Dreamcast: Unify assembly

This commit is contained in:
UnknownShadow200 2024-05-15 22:00:24 +10:00
parent 9a69e3fac6
commit 29859ca9ab
4 changed files with 58 additions and 120 deletions

View File

@ -38,56 +38,16 @@ _DrawColouredQuads:
.TRANSFORM_QUAD: .TRANSFORM_QUAD:
mov.l CMD_COL_VERT, r1 ! r1 = GPU VERT command mov.l CMD_COL_VERT, r1 ! r1 = GPU VERT command
! TRANSFORM VERTEX 1 LoadColouredVertex
add #16, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
fmov @r4+, fr4 ! fr4 = src->x
fmov @r4+, fr5 ! fr5 = src->y
fmov @r4+, fr6 ! fr6 = src->z
fldi1 fr7 ! fr7 = 1.0
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
fmov @r4+,fr3 ! C = src->color
ProcessVertex1 ProcessVertex1
! TRANSFORM VERTEX 2 LoadColouredVertex
add #16, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
fmov @r4+, fr4 ! fr4 = src->x
fmov @r4+, fr5 ! fr5 = src->y
fmov @r4+, fr6 ! fr6 = src->z
fldi1 fr7 ! fr7 = 1.0
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
fmov @r4+,fr3 ! C = src->color
ProcessVertex2 ProcessVertex2
! TRANSFORM VERTEX 3 LoadColouredVertex
add #16, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
fmov @r4+, fr4 ! fr4 = src->x
fmov @r4+, fr5 ! fr5 = src->y
fmov @r4+, fr6 ! fr6 = src->z
fldi1 fr7 ! fr7 = 1.0
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
fmov @r4+,fr3 ! C = src->color
ProcessVertex3 ProcessVertex3
! TRANSFORM VERTEX 4 LoadColouredVertex
add #16, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
fmov @r4+, fr4 ! fr4 = src->x
fmov @r4+, fr5 ! fr5 = src->y
fmov @r4+, fr6 ! fr6 = src->z
fldi1 fr7 ! fr7 = 1.0
ftrv xmtrx, fv4 ! TRANSFORM(fr4..fr7)
fmov @r4+,fr3 ! C = src->color
ProcessVertex4 CMD_COL_EOS ProcessVertex4 CMD_COL_EOS
! CLIPFLAGS TESTING ! CLIPFLAGS TESTING
@ -118,20 +78,16 @@ CMD_COL_EOS: .long 0xf0000000
.global _VP_COL_HWIDTH .global _VP_COL_HWIDTH
.type _VP_COL_HWIDTH,%object .type _VP_COL_HWIDTH,%object
.size _VP_COL_HWIDTH,4
_VP_COL_HWIDTH: .long 0 _VP_COL_HWIDTH: .long 0
.global _VP_COL_HHEIGHT .global _VP_COL_HHEIGHT
.type _VP_COL_HHEIGHT,%object .type _VP_COL_HHEIGHT,%object
.size _VP_COL_HHEIGHT,4
_VP_COL_HHEIGHT: .long 0 _VP_COL_HHEIGHT: .long 0
.global _VP_COL_X_PLUS_HWIDTH .global _VP_COL_X_PLUS_HWIDTH
.type _VP_COL_X_PLUS_HWIDTH,%object .type _VP_COL_X_PLUS_HWIDTH,%object
.size _VP_COL_X_PLUS_HWIDTH,4
_VP_COL_X_PLUS_HWIDTH: .long 0 _VP_COL_X_PLUS_HWIDTH: .long 0
.global _VP_COL_Y_PLUS_HHEIGHT .global _VP_COL_Y_PLUS_HHEIGHT
.type _VP_COL_Y_PLUS_HHEIGHT,%object .type _VP_COL_Y_PLUS_HHEIGHT,%object
.size _VP_COL_Y_PLUS_HHEIGHT,4
_VP_COL_Y_PLUS_HHEIGHT: .long 0 _VP_COL_Y_PLUS_HHEIGHT: .long 0

View File

@ -36,64 +36,16 @@ _DrawTexturedQuads:
.TRANSFORM_QUAD: .TRANSFORM_QUAD:
mov.l CMD_TEX_VERT, r1 ! r1 = GPU VERT command mov.l CMD_TEX_VERT, r1 ! r1 = GPU VERT command
! TRANSFORM VERTEX 1 LoadTexturedVertex
add #24, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
fmov @r4+, fr4 ! X = src->x
fmov @r4+, fr5 ! Y = src->y
fmov @r4+, fr6 ! Z = src->z
fldi1 fr7 ! W = 1.0
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
! OUTPUT + CLIPFLAGS VERTEX 1
fmov @r4+,fr3 ! C = src->color
fmov @r4+,fr1 ! U = src->u
fmov @r4+,fr2 ! V = src->v
ProcessVertex1 ProcessVertex1
! TRANSFORM VERTEX 2 LoadTexturedVertex
add #24, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
fmov @r4+, fr4 ! X = src->x
fmov @r4+, fr5 ! Y = src->y
fmov @r4+, fr6 ! Z = src->z
fldi1 fr7 ! W = 1.0
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
! OUTPUT + CLIPFLAGS VERTEX 2
fmov @r4+,fr3 ! C = src->color
fmov @r4+,fr1 ! U = src->u
fmov @r4+,fr2 ! V = src->v
ProcessVertex2 ProcessVertex2
! TRANSFORM VERTEX 3 LoadTexturedVertex
add #24, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
fmov @r4+, fr4 ! X = src->x
fmov @r4+, fr5 ! Y = src->y
fmov @r4+, fr6 ! Z = src->z
fldi1 fr7 ! W = 1.0
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
! OUTPUT + CLIPFLAGS VERTEX 3
fmov @r4+,fr3 ! C = src->color
fmov @r4+,fr1 ! U = src->u
fmov @r4+,fr2 ! V = src->v
ProcessVertex3 ProcessVertex3
! TRANSFORM VERTEX 4 LoadTexturedVertex
add #24, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
fmov @r4+, fr4 ! X = src->x
fmov @r4+, fr5 ! Y = src->y
fmov @r4+, fr6 ! Z = src->z
fldi1 fr7 ! W = 1.0
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
! OUTPUT + CLIPFLAGS VERTEX 4
fmov @r4+,fr3 ! C = src->color
fmov @r4+,fr1 ! U = src->u
fmov @r4+,fr2 ! V = src->v
ProcessVertex4 CMD_TEX_EOS ProcessVertex4 CMD_TEX_EOS
! CLIPFLAGS TESTING ! CLIPFLAGS TESTING
@ -124,20 +76,16 @@ CMD_TEX_EOS: .long 0xf0000000
.global _VP_TEX_HWIDTH .global _VP_TEX_HWIDTH
.type _VP_TEX_HWIDTH,%object .type _VP_TEX_HWIDTH,%object
.size _VP_TEX_HWIDTH,4
_VP_TEX_HWIDTH: .long 0 _VP_TEX_HWIDTH: .long 0
.global _VP_TEX_HHEIGHT .global _VP_TEX_HHEIGHT
.type _VP_TEX_HHEIGHT,%object .type _VP_TEX_HHEIGHT,%object
.size _VP_TEX_HHEIGHT,4
_VP_TEX_HHEIGHT: .long 0 _VP_TEX_HHEIGHT: .long 0
.global _VP_TEX_X_PLUS_HWIDTH .global _VP_TEX_X_PLUS_HWIDTH
.type _VP_TEX_X_PLUS_HWIDTH,%object .type _VP_TEX_X_PLUS_HWIDTH,%object
.size _VP_TEX_X_PLUS_HWIDTH,4
_VP_TEX_X_PLUS_HWIDTH: .long 0 _VP_TEX_X_PLUS_HWIDTH: .long 0
.global _VP_TEX_Y_PLUS_HHEIGHT .global _VP_TEX_Y_PLUS_HHEIGHT
.type _VP_TEX_Y_PLUS_HHEIGHT,%object .type _VP_TEX_Y_PLUS_HHEIGHT,%object
.size _VP_TEX_Y_PLUS_HHEIGHT,4
_VP_TEX_Y_PLUS_HHEIGHT: .long 0 _VP_TEX_Y_PLUS_HHEIGHT: .long 0

View File

@ -1,3 +1,40 @@
! =========================================================
! ========================= VERTEX LOADING ================
! =========================================================
.macro LoadColouredVertex
! PREPARE NEXT VERTEX
add #16, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
! LOAD XYZ
fmov @r4+, fr4 ! X = src->x
fmov @r4+, fr5 ! Y = src->y
fmov @r4+, fr6 ! Z = src->z
fldi1 fr7 ! W = 1.0
! TRANSFORM VERTEX
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
! LOAD ATTRIBUTES
fmov @r4+,fr3 ! C = src->color
.endm
.macro LoadTexturedVertex
! PREPARE NEXT VERTEX
add #24, r3 ! r3 += VERTEX_STRIDE
pref @r3 ! PREFETCH r3 (next vertex)
add #64, r5 ! r5 += 2 * sizeof(VERTEX)
! LOAD XYZ
fmov @r4+, fr4 ! X = src->x
fmov @r4+, fr5 ! Y = src->y
fmov @r4+, fr6 ! Z = src->z
fldi1 fr7 ! W = 1.0
! TRANSFORM VERTEX
ftrv xmtrx, fv4 ! TRANSFORM(XYZW)
! LOAD ATTRIBUTES
fmov @r4+,fr3 ! C = src->color
fmov @r4+,fr1 ! U = src->u
fmov @r4+,fr2 ! V = src->v
.endm
! ========================================================= ! =========================================================
! ========================= VERTEX OUTPUT ================= ! ========================= VERTEX OUTPUT =================
! ========================================================= ! =========================================================
@ -96,10 +133,10 @@
.macro ViewportTransformVertex .macro ViewportTransformVertex
! INVERSE W CALCULATION ! INVERSE W CALCULATION
add #28, r5 ! r5 = &vertex[0].w add #28, r5 ! r5 = &vertex->w
fmov.s @r5+,fr0 ! fr0 = vertex->w fmov.s @r5,fr0 ! fr0 = vertex->w
fmul fr0,fr0 ! fr0 = fr0 * fr0 fmul fr0,fr0 ! fr0 = fr0 * fr0
add #-32, r5 ! r5 -= sizeof(VERTEX) add #-24, r5 ! r5 = &vertex->x
fsrra fr0 ! fr0 = 1 / sqrt(fr0) -> 1 / vertex->w fsrra fr0 ! fr0 = 1 / sqrt(fr0) -> 1 / vertex->w
! TRANSFORM X ! TRANSFORM X
@ -107,22 +144,18 @@
fmov fr10,fr5 ! fr5 = VIEWPORT_X_PLUS_HWIDTH fmov fr10,fr5 ! fr5 = VIEWPORT_X_PLUS_HWIDTH
fmul fr8,fr4 ! fr4 = VIEWPORT_HWIDTH * vertex->x fmul fr8,fr4 ! fr4 = VIEWPORT_HWIDTH * vertex->x
fmac fr0,fr4,fr5 ! fr5 = fr0 * fr4 + fr5 -- (X * F * hwidth) + x_plus_hwidth fmac fr0,fr4,fr5 ! fr5 = fr0 * fr4 + fr5 -- (X * F * hwidth) + x_plus_hwidth
fmov.s fr9,@r5 ! vertex->x = fr9 fmov.s fr5,@r5 ! vertex->x = fr5
add #4, r5 ! r5 += 4 (points to vertex->y) add #4, r5 ! r5 = &vertex->y
! TRANSFORM Y ! TRANSFORM Y
fmov.s @r5,fr3 ! fr4 = vertex->y fmov.s @r5,fr4 ! fr4 = vertex->y
fmov fr11,fr5 ! fr4 = VIEWPORT_Y_PLUS_HHEIGHT fmov fr11,fr5 ! fr5 = VIEWPORT_Y_PLUS_HHEIGHT
fmul fr9,fr4 ! fr4 = VIEWPORT_HHEIGHT * vertex->y fmul fr9,fr4 ! fr4 = VIEWPORT_HHEIGHT * vertex->y
fmac fr0,fr4,fr5 ! fr5 = fr0 * fr4 + fr5 -- (Y * F * hheight) + y_plus_hheight fmac fr0,fr4,fr5 ! fr5 = fr0 * fr4 + fr5 -- (Y * F * hheight) + y_plus_hheight
fmov.s fr9,@r5 ! vertex->y = fr9 fmov.s fr5,@r5 ! vertex->y = fr5
add #4, r5 ! r5 += 4 (points to vertex->z) add #4, r5 ! r5 = &vertex->z
! ASSIGN Z ! ASSIGN Z
! fmov.s @r5,fr0 ! vertex->z = fr0 fmov.s fr0,@r5 ! vertex->z = fr0
! add #24, r5 ! r5 += 24 (points to next vertex) add #20, r5 ! r5 += 20 (points to start of next vertex)
.endm .endm
VP_ZSHIFT:
.float 1.0001

View File

@ -31,6 +31,7 @@ static void InitGLState(void) {
void Gfx_Create(void) { void Gfx_Create(void) {
if (!Gfx.Created) glKosInit(); if (!Gfx.Created) glKosInit();
Gfx_SetViewport(0, 0, Game.Width, Game.Height); Gfx_SetViewport(0, 0, Game.Width, Game.Height);
InitGLState(); InitGLState();