1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Fix mask calculation in SetOtherMode_L functions.

Need other corrections/optimizations. Functions inside switch look useless now.
This commit is contained in:
Sergey Lipskiy 2013-06-27 23:25:48 +07:00
parent b33f643905
commit 4fa08bd906
2 changed files with 26 additions and 20 deletions

24
F3D.cpp
View File

@ -258,7 +258,8 @@ void F3D_SetOtherMode_H( u32 w0, u32 w1 )
void F3D_SetOtherMode_L( u32 w0, u32 w1 )
{
switch (_SHIFTR( w0, 8, 8 ))
const u32 shift = _SHIFTR( w0, 8, 8 );
switch (shift)
{
case G_MDSFT_ALPHACOMPARE:
gDPSetAlphaCompare( w1 >> G_MDSFT_ALPHACOMPARE );
@ -269,17 +270,18 @@ void F3D_SetOtherMode_L( u32 w0, u32 w1 )
case G_MDSFT_RENDERMODE:
gDPSetRenderMode( w1 & 0xCCCCFFFF, w1 & 0x3333FFFF );
break;
default:
u32 shift = _SHIFTR( w0, 8, 8 );
u32 length = _SHIFTR( w0, 0, 8 );
u32 mask = ((1 << length) - 1) << shift;
gDP.otherMode.l &= ~mask;
gDP.otherMode.l |= w1 & mask;
gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE;
break;
}
const u32 length = _SHIFTR( w0, 0, 8 );
// u32 mask = ((1 << length) - 1) << shift;
u32 mask = 0;
for (int i = length; i > 0; i--)
mask = (mask << 1) | 1;
mask <<= shift;
gDP.otherMode.l &= ~mask;
gDP.otherMode.l |= w1 & mask;
gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE;
}
void F3D_EndDL( u32 w0, u32 w1 )

View File

@ -193,7 +193,9 @@ void F3DEX2_SetOtherMode_H( u32 w0, u32 w1 )
void F3DEX2_SetOtherMode_L( u32 w0, u32 w1 )
{
switch (32 - _SHIFTR( w0, 8, 8 ) - (_SHIFTR( w0, 0, 8 ) + 1))
const u32 length = _SHIFTR( w0, 0, 8 ) + 1;
const u32 shift = 32 - _SHIFTR( w0, 8, 8 ) - length;
switch (shift)
{
case G_MDSFT_ALPHACOMPARE:
gDPSetAlphaCompare( w1 >> G_MDSFT_ALPHACOMPARE );
@ -205,16 +207,18 @@ void F3DEX2_SetOtherMode_L( u32 w0, u32 w1 )
gDPSetRenderMode( w1 & 0xCCCCFFFF, w1 & 0x3333FFFF );
break;
default:
u32 length = _SHIFTR( w0, 0, 8 ) + 1;
u32 shift = 32 - _SHIFTR( w0, 8, 8 ) - length;
u32 mask = ((1 << length) - 1) << shift;
gDP.otherMode.l &= ~mask;
gDP.otherMode.l |= w1 & mask;
gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE;
break;
}
//u32 mask = ((1 << length) - 1) << shift;
u32 mask = 0;
for (int i = length; i > 0; i--)
mask = (mask << 1) | 1;
mask <<= shift;
gDP.otherMode.l &= ~mask;
gDP.otherMode.l |= w1 & mask;
gDP.changed |= CHANGED_RENDERMODE | CHANGED_ALPHACOMPARE;
}
void F3DEX2_GeometryMode( u32 w0, u32 w1 )