明文改cmdlist太晦涩了,变成计算后更改

This commit is contained in:
root 2023-10-17 21:00:35 +08:00
parent 32c763d8b7
commit 4d9d006bf7

View File

@ -19,7 +19,6 @@
#include "types.h"
#include "drivers/cache.h"
// 360x240 without scaling, no filter.
alignas(16) u8 gbaGpuInitList[1136] =
{
@ -803,33 +802,64 @@ alignas(16) u8 gbaGpuList2[448] =
0x10, 0x00, 0x0f, 0x00
};
#define LB_INDEX1 (944/4)
#define RB_INDEX1 (976/4)
#define LT_INDEX1 (1008/4)
#define RT_INDEX1 (1040/4)
#define LB_INDEX1 (944)
#define RB_INDEX1 (976)
#define LT_INDEX1 (1008)
#define RT_INDEX1 (1040)
#define LB_INDEX2 (256/4)
#define RB_INDEX2 (288/4)
#define LT_INDEX2 (320/4)
#define RT_INDEX2 (352/4)
#define LB_INDEX2 (256)
#define RB_INDEX2 (288)
#define LT_INDEX2 (320)
#define RT_INDEX2 (352)
static void patchCoord( u32 *initarr, u32 *updatearr )
static u32 tof24( u32 d )
{
initarr[LB_INDEX1] = updatearr[LB_INDEX2] = 0x3f00003e;
initarr[LB_INDEX1+2] = updatearr[LB_INDEX2+2] = 0x4440;
initarr[LB_INDEX1+3] = updatearr[LB_INDEX2+3] = 0;
if( d == 0 ) return 0;
initarr[RB_INDEX1] = updatearr[RB_INDEX2] = 0x3f00003e;
initarr[RB_INDEX1+2] = updatearr[RB_INDEX2+2] = 0x4440;
initarr[RB_INDEX1+3] = updatearr[RB_INDEX2+3] = 0x46e000;
u32 c = 0, o = 1, r = 0;
// exp
for( ; 2*o <= d; o <<= 1 ) ++c;
o = 1<<c;
d -= o;
c += 63;//0b111111
initarr[LT_INDEX1] = updatearr[LT_INDEX2] = 0x3f00003e;
initarr[LT_INDEX1+2] = updatearr[LT_INDEX2+2] = 0x4690;
initarr[LT_INDEX1+3] = updatearr[LT_INDEX2+3] = 0;
// decimals
for(int i=15; d > 0 && i >= 0; --i ){
o >>= 1;
if( d >= o ) {
r |= 1<<i;
d -= o;
}
}
return c<<16 | r;
}
initarr[RT_INDEX1] = updatearr[RT_INDEX2] = 0x3f00003e;
initarr[RT_INDEX1+2] = updatearr[RT_INDEX2+2] = 0x4690;
initarr[RT_INDEX1+3] = updatearr[RT_INDEX2+3] = 0x46e000;
static void xyToWzyx( u16 x, u16 y, u32 *p )
{
u32 f24x = tof24(x);
u32 f24y = tof24(y);
p[0] = 0x3f00003e;
// p[1] 是GPU的寄存器
p[2] = f24y >> 8;
p[3] = f24y<<24 | f24x;
}
static void setQuadRect( u16 left, u16 right, u16 top, u16 bottom )
{
if( left >= right || right > 400u ) return;
if( bottom >= top || top > 240u ) return;
xyToWzyx(left, bottom, (u32*)&gbaGpuInitList[LB_INDEX1]);
xyToWzyx(left, bottom, (u32*)&gbaGpuList2[LB_INDEX2]);
xyToWzyx(right, bottom, (u32*)&gbaGpuInitList[RB_INDEX1]);
xyToWzyx(right, bottom, (u32*)&gbaGpuList2[RB_INDEX2]);
xyToWzyx(left, top, (u32*)&gbaGpuInitList[LT_INDEX1]);
xyToWzyx(left, top, (u32*)&gbaGpuList2[LT_INDEX2]);
xyToWzyx(right, top, (u32*)&gbaGpuInitList[RT_INDEX1]);
xyToWzyx(right, top, (u32*)&gbaGpuList2[RT_INDEX2]);
}
void patchGbaGpuCmdList(u8 scaleType)
@ -853,7 +883,7 @@ void patchGbaGpuCmdList(u8 scaleType)
gbaGpuList2[360] = 0x40u; // 25
gbaGpuList2[365] = 0x40u; // 25
*/
patchCoord( gbaGpuInitList, gbaGpuList2 );
setQuadRect( 0, 240, 200, 40 );
// 以下8行代码修正纹理坐标
gbaGpuInitList[968] = 0x60u; // 74