AdjustBgMosaic Documentation

This commit is contained in:
jiangzhengwenjz 2019-06-28 14:41:29 +08:00
parent 3f43150b5a
commit c994998aad
2 changed files with 57 additions and 70 deletions

View File

@ -71,7 +71,7 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op);
u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op);
u32 GetBgY(u8 bg);
void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle);
u8 AdjustBgMosaic(u8 a1, u8 a2);
u8 AdjustBgMosaic(u8 value, u8 mode);
void SetBgTilemapBuffer(u8 bg, void *tilemap);
void UnsetBgTilemapBuffer(u8 bg);
void* GetBgTilemapBuffer(u8 bg);

125
src/bg.c
View File

@ -865,79 +865,66 @@ void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dis
SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle);
}
u8 AdjustBgMosaic(u8 a1, u8 a2)
#define BG_MOSAIC_SET 0
#define BG_MOSAIC_SET_H 1
#define BG_MOSAIC_INC_H 2
#define BG_MOSAIC_DEC_H 3
#define BG_MOSAIC_SET_V 4
#define BG_MOSAIC_INC_V 5
#define BG_MOSAIC_DEC_V 6
u8 AdjustBgMosaic(u8 value, u8 mode)
{
u16 result;
s16 test1;
s16 test2;
u16 mosaicSize;
s16 bgMosaicH;
s16 bgMosaicV;
mosaicSize = GetGpuReg(REG_OFFSET_MOSAIC);
bgMosaicH = mosaicSize & 0xF;
bgMosaicV = (mosaicSize >> 4) & 0xF;
mosaicSize &= 0xFF00;
result = GetGpuReg(REG_OFFSET_MOSAIC);
test1 = result & 0xF;
test2 = (result >> 4) & 0xF;
result &= 0xFF00;
switch (a2)
switch (mode)
{
case 0:
default:
test1 = a1 & 0xF;
test2 = a1 >> 0x4;
break;
case 1:
test1 = a1 & 0xF;
break;
case 2:
if ((test1 + a1) > 0xF)
{
test1 = 0xF;
}
else
{
test1 += a1;
}
break;
case 3:
if ((test1 - a1) < 0)
{
test1 = 0x0;
}
else
{
test1 -= a1;
}
break;
case 4:
test2 = a1 & 0xF;
break;
case 5:
if ((test2 + a1) > 0xF)
{
test2 = 0xF;
}
else
{
test2 += a1;
}
break;
case 6:
if ((test2 - a1) < 0)
{
test2 = 0x0;
}
else
{
test2 -= a1;
}
break;
case BG_MOSAIC_SET:
default:
bgMosaicH = value & 0xF;
bgMosaicV = value >> 0x4;
break;
case BG_MOSAIC_SET_H:
bgMosaicH = value & 0xF;
break;
case BG_MOSAIC_INC_H:
if ((bgMosaicH + value) > 0xF)
bgMosaicH = 0xF;
else
bgMosaicH += value;
break;
case BG_MOSAIC_DEC_H:
if ((bgMosaicH - value) < 0)
bgMosaicH = 0x0;
else
bgMosaicH -= value;
break;
case BG_MOSAIC_SET_V:
bgMosaicV = value & 0xF;
break;
case BG_MOSAIC_INC_V:
if ((bgMosaicV + value) > 0xF)
bgMosaicV = 0xF;
else
bgMosaicV += value;
break;
case BG_MOSAIC_DEC_V:
if ((bgMosaicV - value) < 0)
bgMosaicV = 0x0;
else
bgMosaicV -= value;
break;
}
result |= ((test2 << 0x4) & 0xF0);
result |= (test1 & 0xF);
SetGpuReg(REG_OFFSET_MOSAIC, result);
return result;
mosaicSize |= ((bgMosaicV << 0x4) & 0xF0);
mosaicSize |= (bgMosaicH & 0xF);
SetGpuReg(REG_OFFSET_MOSAIC, mosaicSize);
return mosaicSize;
}
void SetBgTilemapBuffer(u8 bg, void *tilemap)