diff --git a/source/arm11/gpu_cmd_lists.c b/source/arm11/gpu_cmd_lists.c index a2f19b0..c79b7ee 100644 --- a/source/arm11/gpu_cmd_lists.c +++ b/source/arm11/gpu_cmd_lists.c @@ -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< 0 && i >= 0; --i ){ + o >>= 1; + if( d >= o ) { + r |= 1<> 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