From 81577594850b9186f86bdb0aeaa74826ed011a32 Mon Sep 17 00:00:00 2001 From: shashclp Date: Tue, 9 Jan 2007 22:38:23 +0000 Subject: [PATCH] - Added support for MASTER_BRIGHT - Changed a few things to get VisualC to compile GPU.c --- desmume/src/GPU.c | 21 +++++++++------ desmume/src/GPU.h | 68 +++++++++++++++++++++++++++++++++++++++++++++++ desmume/src/MMU.c | 6 +++++ 3 files changed, 87 insertions(+), 8 deletions(-) diff --git a/desmume/src/GPU.c b/desmume/src/GPU.c index 835095726..1fca45e5f 100644 --- a/desmume/src/GPU.c +++ b/desmume/src/GPU.c @@ -126,11 +126,12 @@ void GPU_DeInit(GPU * gpu) /* Sets up LCD control variables for Display Engines A and B for quick reading */ void GPU_setVideoProp(GPU * gpu, u32 p) { - gpu->dispCnt.integer = p; struct _DISPCNT * cnt = &gpu->dispCnt.bitfield; -// gpu->dispMode = DISPCNT_DISPLAY_MODE(p,gpu->lcd) ; - gpu->dispMode = cnt->DisplayMode & ((gpu->lcd)?1:3); + gpu->dispCnt.integer = p; + +// gpu->dispMode = DISPCNT_DISPLAY_MODE(p,gpu->lcd) ; + gpu->dispMode = cnt->DisplayMode & ((gpu->lcd)?1:3); switch (gpu->dispMode) { @@ -307,7 +308,7 @@ void GPU_setBGProp(GPU * gpu, u16 num, u16 p) { u8 index = gpu->BGIndex[num]; struct _BGxCNT * cnt = &(gpu->bgCnt[num].bitfield), *cnt2; - int lastPriority = cnt->Priority; + int lastPriority = cnt->Priority, mode; gpu->bgCnt[num].integer = p; if((gpu->nbBGActif != 0) && (index != 0)) @@ -384,10 +385,9 @@ void GPU_setBGProp(GPU * gpu, u16 num, u16 p) return; }*/ - int mode = mode2type[gpu->dispCnt.bitfield.BG_Mode][num]; - gpu->BGSize[num][0] = sizeTab[mode][cnt->ScreenSize][0]; - gpu->BGSize[num][1] = sizeTab[mode][cnt->ScreenSize][1]; - + mode = mode2type[gpu->dispCnt.bitfield.BG_Mode][num]; + gpu->BGSize[num][0] = sizeTab[mode][cnt->ScreenSize][0]; + gpu->BGSize[num][1] = sizeTab[mode][cnt->ScreenSize][1]; } void GPU_remove(GPU * gpu, u8 num) @@ -547,6 +547,11 @@ void GPU_setWINDOW_OUTCNT(GPU *gpu, u16 v) gpu->WINDOW_OUTCNT.val = v ; } +void GPU_setMASTER_BRIGHT (GPU *gpu, u16 v) +{ + gpu->MASTER_BRIGHT = v; +} + #ifndef min #define min(a,b) (((a)<(b))?(a):(b)) #endif diff --git a/desmume/src/GPU.h b/desmume/src/GPU.h index 5096c81db..ac169507f 100644 --- a/desmume/src/GPU.h +++ b/desmume/src/GPU.h @@ -230,6 +230,7 @@ struct _GPU u16 BLDALPHA ; u16 BLDY ; u16 MOSAIC ; + u16 MASTER_BRIGHT; u16 WINDOW_XDIM[2] ; u16 WINDOW_YDIM[2] ; @@ -359,6 +360,71 @@ static INLINE void GPU_ligne(Screen * screen, u16 l) T2WriteWord(dst, i16 << 1, T2ReadWord(spr, i16 << 1)); } } + + // Apply final brightness adjust (MASTER_BRIGHT) + // Reference: http://nocash.emubase.de/gbatek.htm#dsvideo (Under MASTER_BRIGHTNESS) + switch ((gpu->MASTER_BRIGHT>>14)&3) + { + // Disabled + case 0: + break; + + // Bright up + case 1: + { + unsigned int masterBrightFactor = gpu->MASTER_BRIGHT&31; + masterBrightFactor = masterBrightFactor > 16 ? 16 : masterBrightFactor; + + for(i16 = 0; i16 < 256; ++i16) + { + unsigned int dstColor = T1ReadWord(dst, i16 << 1); + unsigned int r = (dstColor>>10)&31, // Get the components, 5bit each + g = (dstColor>> 5)&31, + b = (dstColor )&31; + + r = (r + (r*masterBrightFactor)/16)&31; // Bright up and clamp to 5bit + g = (g + (g*masterBrightFactor)/16)&31; + b = (b + (b*masterBrightFactor)/16)&31; + + T2WriteWord (dst, i16 << 1, (r<<10) | (g<<5) | b); + } + + break; + } + + // Bright down + case 2: + { + unsigned int masterBrightFactor = gpu->MASTER_BRIGHT&31; + masterBrightFactor = masterBrightFactor > 16 ? 16 : masterBrightFactor; + + for(i16 = 0; i16 < 256; ++i16) + { + unsigned int dstColor = T1ReadWord(dst, i16 << 1); + unsigned int r = (dstColor>>10)&31, // Get the components, 5bit each + g = (dstColor>> 5)&31, + b = (dstColor )&31; + + /* + NOTE: gbatek (in the reference above) seems to expect 6bit values + per component, but as desmume works with 5bit per component, + we use 31 as top, instead of 63. Testing it on a few games, + using 63 seems to give severe color wraping, and 31 works + nicely, so for now we'll just that, until proven wrong. + */ + r = (r + ((31-r)*masterBrightFactor)/16)&31; // Bright down and clamp to 5bit + g = (g + ((31-g)*masterBrightFactor)/16)&31; + b = (b + ((31-b)*masterBrightFactor)/16)&31; + + T2WriteWord (dst, i16 << 1, (r<<10) | (g<<5) | b); + } + break; + } + + // Reserved + case 3: + break; + } } void GPU_setVideoProp(GPU *, u32 p); @@ -390,6 +456,8 @@ void GPU_setWINDOW_YDIM(GPU *gpu, u16 v, u8 num) ; void GPU_setWINDOW_INCNT(GPU *gpu, u16 v) ; void GPU_setWINDOW_INCNT(GPU *gpu, u16 v) ; +void GPU_setMASTER_BRIGHT (GPU *gpu, u16 v); + void GPU_remove(GPU *, u8 num); void GPU_addBack(GPU *, u8 num); diff --git a/desmume/src/MMU.c b/desmume/src/MMU.c index 7d6b54156..191a8f4b3 100644 --- a/desmume/src/MMU.c +++ b/desmume/src/MMU.c @@ -1190,6 +1190,12 @@ void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val) case REG_DISPB_MOSAIC: GPU_setMOSAIC(SubScreen.gpu,val) ; break ; + case REG_DISPA_MASTERBRIGHT: + GPU_setMASTER_BRIGHT (MainScreen.gpu, val); + break; + case REG_DISPB_MASTERBRIGHT: + GPU_setMASTER_BRIGHT (SubScreen.gpu, val); + break; case REG_IME : MMU.reg_IME[proc] = val&1; T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x208, val);