several warnings less

deleted redundant code --> some more FPS
This commit is contained in:
damdoum 2007-02-23 19:34:08 +00:00
parent a3e5dd1261
commit fc4a4e8cb5
7 changed files with 348 additions and 596 deletions

View File

@ -359,108 +359,6 @@ void GPU_addBack(GPU * gpu, u8 num)
GPU_resortBGs(gpu);
}
/*****************************************************************************/
// PARAMETERS OF BACKGROUNDS
/*****************************************************************************/
void GPU_scrollX(GPU * gpu, u8 num, u16 v)
{
gpu->BGSX[num] = v;
}
void GPU_scrollY(GPU * gpu, u8 num, u16 v)
{
gpu->BGSY[num] = v;
}
void GPU_scrollXY(GPU * gpu, u8 num, u32 v)
{
gpu->BGSX[num] = (v & 0xFFFF);
gpu->BGSY[num] = (v >> 16);
}
/*****************************************************************************/
// PARAMETERS OF EFFECTS
/*****************************************************************************/
void GPU_setBLDCNT(GPU *gpu, u16 v)
{
gpu->BLDCNT = v ;
}
void GPU_setBLDALPHA(GPU *gpu, u16 v)
{
gpu->BLDALPHA = v ;
}
void GPU_setBLDY(GPU *gpu, u16 v)
{
gpu->BLDY = v ;
}
void GPU_setMOSAIC(GPU *gpu, u16 v)
{
gpu->MOSAIC = v ;
}
/*****************************************************************************/
// PARAMETERS OF WINDOWS
/*****************************************************************************/
void GPU_setWINDOW_XDIM(GPU *gpu, u16 v, u8 num)
{
gpu->WINDOW_XDIM[num].val = v ;
}
void GPU_setWINDOW_XDIM_Component(GPU *gpu, u8 v, u8 num) /* write start/end seperately */
{
if (num & 1) {
gpu->WINDOW_XDIM[num >> 1].bits.start = v ;
} else {
gpu->WINDOW_XDIM[num >> 1].bits.end = v ;
}
}
void GPU_setWINDOW_YDIM(GPU *gpu, u16 v, u8 num)
{
gpu->WINDOW_YDIM[num].val = v ;
}
void GPU_setWINDOW_YDIM_Component(GPU *gpu, u8 v, u8 num) /* write start/end seperately */
{
if (num & 1) {
gpu->WINDOW_YDIM[num >> 1].bits.start = v ;
} else {
gpu->WINDOW_YDIM[num >> 1].bits.end = v ;
}
}
void GPU_setWINDOW_INCNT(GPU *gpu, u16 v)
{
gpu->WINDOW_INCNT.val = v ;
}
void GPU_setWINDOW_INCNT_Component(GPU *gpu, u8 v,u8 num)
{
switch (num)
{
case 0:
gpu->WINDOW_INCNT.bytes.low = v ;
break ;
case 1:
gpu->WINDOW_INCNT.bytes.high = v ;
break ;
}
}
void GPU_setWINDOW_OUTCNT(GPU *gpu, u16 v)
{
gpu->WINDOW_OUTCNT.val = v ;
}
void GPU_setWINDOW_OUTCNT_Component(GPU *gpu, u8 v,u8 num)
{
switch (num)
{
case 0:
gpu->WINDOW_OUTCNT.bytes.low = v ;
break ;
case 1:
gpu->WINDOW_OUTCNT.bytes.high = v ;
break ;
}
}
/*****************************************************************************/
// ROUTINES FOR INSIDE / OUTSIDE WINDOW CHECKS
@ -488,14 +386,15 @@ INLINE BOOL withinRect (u8 x,u8 y, u16 startX, u16 startY, u16 endX, u16 endY)
void renderline_checkWindows(GPU *gpu, u8 bgnum, u16 x, u16 y, BOOL *draw, BOOL *effect)
{
struct _DISPCNT * dispCnt = &(gpu->dispx_st)->dispx_DISPCNT.bits;
WINCNT * wcnt = &gpu->dispx_st->dispx_WINCNT;
BOOL wwin0=0, wwin1=0, wwobj=0, windows=0;
// Check if win0 if enabled, and only check if it is
if (dispCnt->Win0_Enable)
{
wwin0 = withinRect( x,y,
gpu->WINDOW_XDIM[0].bits.start,gpu->WINDOW_YDIM[0].bits.start,
gpu->WINDOW_XDIM[0].bits.end, gpu->WINDOW_YDIM[0].bits.end);
wcnt->WIN0H.bits.start,wcnt->WIN0V.bits.start,
wcnt->WIN0H.bits.end, wcnt->WIN0V.bits.end);
windows = 1;
}
@ -503,8 +402,8 @@ void renderline_checkWindows(GPU *gpu, u8 bgnum, u16 x, u16 y, BOOL *draw, BOOL
if (dispCnt->Win1_Enable)
{
wwin1 = withinRect( x,y,
gpu->WINDOW_XDIM[1].bits.start,gpu->WINDOW_YDIM[1].bits.start,
gpu->WINDOW_XDIM[1].bits.end, gpu->WINDOW_YDIM[1].bits.end);
wcnt->WIN1H.bits.start,wcnt->WIN1V.bits.start,
wcnt->WIN1H.bits.end, wcnt->WIN1V.bits.end);
windows = 1;
}
@ -515,39 +414,30 @@ void renderline_checkWindows(GPU *gpu, u8 bgnum, u16 x, u16 y, BOOL *draw, BOOL
}
if (windows) {
/*
// HOW THE HELL THIS DOES NOT WORK !!!
win0 = (gpu->WINDOW_INCNT.bytes.low & (1<<bgnum))&&1;
win1 = (gpu->WINDOW_INCNT.bytes.high & (1<<bgnum))&&1;
outwin = (gpu->WINDOW_OUTCNT.bytes.low & (1<<bgnum))&&1;
winOBJ = (gpu->WINDOW_OUTCNT.bytes.high & (1<<bgnum))&&1;
// CHECK THE FOLLOWING, SAME MEANING BUT IT WORKS
*/
// it is in win0, do we display ?
// high priority
if (wwin0) {
*draw = (gpu->WINDOW_INCNT.bytes.low >> bgnum)&1;
*effect = gpu->WINDOW_INCNT.bits.WIN0_Effect_Enable;
*draw = (wcnt->WININ.bytes.low >> bgnum)&1;
*effect = wcnt->WININ.bits.win0.WINx_Effect_Enable;
}
// it is in win1, do we display ?
// mid priority
else if (wwin1) {
*draw = (gpu->WINDOW_INCNT.bytes.high >> bgnum)&1;
*effect = gpu->WINDOW_INCNT.bits.WIN1_Effect_Enable;
*draw = (wcnt->WININ.bytes.high >> bgnum)&1;
*effect = wcnt->WININ.bits.win1.WINx_Effect_Enable;
}
// it is in winOBJ, do we display ?
// low priority
else if (wwobj) {
*draw = (gpu->WINDOW_OUTCNT.bytes.high>> bgnum)&1;
*effect = gpu->WINDOW_OUTCNT.bits.WIN1_Effect_Enable;
*draw = (wcnt->WINOUT.bytes.high>> bgnum)&1;
*effect = wcnt->WINOUT.bits.win1.WINx_Effect_Enable;
}
// it is outside of windows, do we display ?
// fallback
else if (!(wwin0||wwin1||wwobj)) {
*draw = (gpu->WINDOW_OUTCNT.bytes.low >> bgnum)&1;
*effect = gpu->WINDOW_OUTCNT.bits.WIN0_Effect_Enable;
*draw = (wcnt->WINOUT.bytes.low >> bgnum)&1;
*effect = wcnt->WINOUT.bits.win0.WINx_Effect_Enable;
}
}
}
@ -558,12 +448,13 @@ void renderline_checkWindows(GPU *gpu, u8 bgnum, u16 x, u16 y, BOOL *draw, BOOL
INLINE BOOL renderline_setFinalColor(GPU *gpu,u32 passing,u8 bgnum,u8 *dst,u16 color,u16 x, u16 y) {
BOOL windowDraw = TRUE, windowEffect = TRUE ;
MISCCNT * msccnt = &gpu->dispx_st->dispx_MISC;
/* window priority: insides, if no rule, check outside */
renderline_checkWindows(gpu,bgnum,x,y,&windowDraw,&windowEffect);
if (((gpu->BLDCNT>>bgnum)&1) && (windowEffect)) /* the bg to draw has a special color effect */
if (((msccnt->BLDCNT>>bgnum)&1) && (windowEffect)) /* the bg to draw has a special color effect */
{
switch (gpu->BLDCNT & 0xC0) /* type of special color effect */
switch (msccnt->BLDCNT & 0xC0) /* type of special color effect */
{
case 0x00: /* none (plain color passing) */
T2WriteWord(dst, passing, color) ;
@ -573,7 +464,7 @@ INLINE BOOL renderline_setFinalColor(GPU *gpu,u32 passing,u8 bgnum,u8 *dst,u16 c
//if (!(color & 0x8000)) return ;
/* we cant do alpha on an invisible pixel */
u16 sourceFraction = (gpu->BLDALPHA & 0x1F),
u16 sourceFraction = (msccnt->BLDALPHA & 0x1F),
sourceR, sourceG, sourceB,targetFraction;
if (!sourceFraction)
return 0;
@ -582,7 +473,7 @@ INLINE BOOL renderline_setFinalColor(GPU *gpu,u32 passing,u8 bgnum,u8 *dst,u16 c
/* weighted component from color to draw */
sourceG = (((color>>5) & 0x1F) * sourceFraction) >> 4 ;
sourceB = (((color>>10) & 0x1F) * sourceFraction) >> 4 ;
targetFraction = (gpu->BLDALPHA & 0x1F00) >> 8 ;
targetFraction = (msccnt->BLDALPHA & 0x1F00) >> 8 ;
if (targetFraction) {
/* when we dont take any fraction from existing pixel, we can just draw */
u16 targetR, targetG, targetB;
@ -604,8 +495,8 @@ INLINE BOOL renderline_setFinalColor(GPU *gpu,u32 passing,u8 bgnum,u8 *dst,u16 c
break ;
case 0x80: /* brightness increase */
{
if (gpu->BLDY != 0x0) { /* dont slow down if there is nothing to do */
u16 modFraction = (gpu->BLDY & 0x1F) ;
if (msccnt->BLDY != 0x0) { /* dont slow down if there is nothing to do */
u16 modFraction = (msccnt->BLDY & 0x1F) ;
u16 sourceR = (color & 0x1F) ;
u16 sourceG = ((color>>5) & 0x1F) ;
u16 sourceB = ((color>>10) & 0x1F) ;
@ -619,8 +510,8 @@ INLINE BOOL renderline_setFinalColor(GPU *gpu,u32 passing,u8 bgnum,u8 *dst,u16 c
break ;
case 0xC0: /* brightness decrease */
{
if (gpu->BLDY!=0) { /* dont slow down if there is nothing to do */
u16 modFraction = (gpu->BLDY & 0x1F) ;
if (msccnt->BLDY!=0) { /* dont slow down if there is nothing to do */
u16 modFraction = (msccnt->BLDY & 0x1F) ;
u16 sourceR = (color & 0x1F) ;
u16 sourceG = ((color>>5) & 0x1F) ;
u16 sourceB = ((color>>10) & 0x1F) ;
@ -635,7 +526,7 @@ INLINE BOOL renderline_setFinalColor(GPU *gpu,u32 passing,u8 bgnum,u8 *dst,u16 c
}
} else {
/* only draw when effect is enabled on this pixel as source, or drawing itself is enabled */
if (((windowEffect) && (gpu->BLDCNT & (0x100 << bgnum))) || (windowDraw))
if (((windowEffect) && (msccnt->BLDCNT & (0x100 << bgnum))) || (windowDraw))
T2WriteWord(dst, passing, color) ;
}
return windowDraw;
@ -663,6 +554,7 @@ INLINE void renderline_textBG(GPU * gpu, u8 num, u8 * dst, u32 Y, u16 XBG, u16 Y
u16 x = 0;
u16 xfin;
u16 palette_size;
u16 mosaic = gpu->dispx_st->dispx_MISC.MOSAIC;
s8 line_dir = 1;
u8 pt_xor = 0;
@ -685,8 +577,8 @@ INLINE void renderline_textBG(GPU * gpu, u8 num, u8 * dst, u32 Y, u16 XBG, u16 Y
/* test NDS: #2 of
http://desmume.sourceforge.net/forums/index.php?action=vthread&forum=2&topic=50&page=0#msg192 */
u8 mw = (gpu->MOSAIC & 0xF) +1 ; /* horizontal granularity of the mosaic */
u8 mh = ((gpu->MOSAIC>>4) & 0xF) +1 ; /* vertical granularity of the mosaic */
u8 mw = (mosaic & 0xF) +1 ; /* horizontal granularity of the mosaic */
u8 mh = ((mosaic>>4) & 0xF) +1 ; /* vertical granularity of the mosaic */
YBG = (YBG / mh) * mh ; /* align y by vertical granularity */
yoff = ((YBG&7)<<2);
@ -963,7 +855,8 @@ INLINE void extRotBG2(GPU * gpu, u8 num, u8 * dst, u16 H, s32 X, s32 Y, s16 PA,
void lineText(GPU * gpu, u8 num, u16 l, u8 * DST)
{
renderline_textBG(gpu, num, DST, l, gpu->BGSX[num], l + gpu->BGSY[num], 256);
BGxOFS * ofs = &gpu->dispx_st->dispx_BGxOFS[num];
renderline_textBG(gpu, num, DST, l, ofs->BGxHOFS, l + ofs->BGxVOFS, 256);
}
void lineRot(GPU * gpu, u8 num, u16 l, u8 * DST)

View File

@ -141,20 +141,65 @@ typedef struct {
/*******************************************************************************
this structure is for windows parameters
these structures are for window description,
windows are square regions and can "subclass"
background layers or object layers (i.e window controls the layers)
screen
|
+-- Window0/Window1/OBJwindow/OutOfWindows
|
+-- BG0/BG1/BG2/BG3/OBJ
*******************************************************************************/
typedef union {
struct {
u8 end:8;
u8 start:8;
} bits ;
u16 val;
} WINxDIM;
typedef struct {
u16 WIN0H;
u16 WIN1H;
u16 WIN0V;
u16 WIN1V;
u16 WININ;
u16 WINOUT;
/* 0*/ u8 WINx_BG0_Enable:1;
/* 1*/ u8 WINx_BG1_Enable:1;
/* 2*/ u8 WINx_BG2_Enable:1;
/* 3*/ u8 WINx_BG3_Enable:1;
/* 4*/ u8 WINx_OBJ_Enable:1;
/* 5*/ u8 WINx_Effect_Enable:1;
/* 6*/ u8 :2;
} WINxBIT;
typedef union {
struct {
WINxBIT win0;
WINxBIT win1;
} bits;
struct {
u8 win0_en:5;
u8 :3;
u8 win1_en:5;
u8 :3;
} packed_bits;
struct {
u8 low;
u8 high;
} bytes;
u16 val ;
} WINxCNT ;
typedef struct {
WINxDIM WIN0H;
WINxDIM WIN1H;
WINxDIM WIN0V;
WINxDIM WIN1V;
WINxCNT WININ;
WINxCNT WINOUT;
} WINCNT;
/*******************************************************************************
this structure is for miscellanous settings
//TODO: needs further description
*******************************************************************************/
typedef struct {
@ -438,62 +483,6 @@ typedef struct
} size;
/*
these structures are for window description,
windows are square regions and can "subclass"
background layers or object layers (i.e window controls the layers)
screen
|
+-- Window0/Window1/OBJwindow/OutOfWindows
|
+-- BG0/BG1/BG2/BG3/OBJ
*/
typedef union windowdim_t
{
struct
{
/* 0*/ unsigned end:8;
/* 8*/ unsigned start:8;
} bits ;
unsigned short val ;
} windowdim_t ;
typedef union windowcnt_t
{
struct
{
/* 0*/ unsigned WIN0_BG0_Enable:1;
/* 1*/ unsigned WIN0_BG1_Enable:1;
/* 2*/ unsigned WIN0_BG2_Enable:1;
/* 3*/ unsigned WIN0_BG3_Enable:1;
/* 4*/ unsigned WIN0_OBJ_Enable:1;
/* 5*/ unsigned WIN0_Effect_Enable:1;
/* 6*/ unsigned :2;
/* 8*/ unsigned WIN1_BG0_Enable:1;
/* 9*/ unsigned WIN1_BG1_Enable:1;
/*10*/ unsigned WIN1_BG2_Enable:1;
/*11*/ unsigned WIN1_BG3_Enable:1;
/*12*/ unsigned WIN1_OBJ_Enable:1;
/*13*/ unsigned WIN1_Effect_Enable:1;
/*14*/ unsigned :2;
} bits ;
struct
{
unsigned char low ;
unsigned char high ;
} bytes ;
struct
{
unsigned win0_en:5;
unsigned :3;
unsigned win1_en:5;
unsigned :3;
} windows ;
unsigned short val ;
} windowcnt_t ;
/*
@ -534,8 +523,6 @@ struct _GPU
u8 BGExtPalSlot[4];
u32 BGSize[4][2];
u16 BGSX[4];
u16 BGSY[4];
u8 lcd;
u8 core;
@ -553,16 +540,6 @@ struct _GPU
u8 sprBMPMode;
u32 sprEnable ;
u16 BLDCNT ;
u16 BLDALPHA ;
u16 BLDY ;
u16 MOSAIC ;
windowdim_t WINDOW_XDIM[2] ;
windowdim_t WINDOW_YDIM[2] ;
windowcnt_t WINDOW_INCNT ;
windowcnt_t WINDOW_OUTCNT ;
void (*spriteRender)(GPU * gpu, u16 l, u8 * dst, u8 * prioTab);
};
@ -642,25 +619,11 @@ extern GraphicsInterface_struct GFXDummy;
void GPU_setVideoProp(GPU *, u32 p);
void GPU_setBGProp(GPU *, u16 num, u16 p);
void GPU_scrollX(GPU *, u8 num, u16 v);
void GPU_scrollY(GPU *, u8 num, u16 v);
void GPU_scrollXY(GPU *, u8 num, u32 v);
void GPU_setBLDCNT(GPU *gpu, u16 v) ;
void GPU_setBLDALPHA(GPU *gpu, u16 v) ;
void GPU_setBLDY(GPU *gpu, u16 v) ;
void GPU_setMOSAIC(GPU *gpu, u16 v) ;
void GPU_setWINDOW_XDIM(GPU *gpu, u16 v, u8 num) ;
void GPU_setWINDOW_YDIM(GPU *gpu, u16 v, u8 num) ;
void GPU_setWINDOW_XDIM_Component(GPU *gpu, u8 v, u8 num) ;
void GPU_setWINDOW_YDIM_Component(GPU *gpu, u8 v, u8 num) ;
void GPU_setWINDOW_INCNT(GPU *gpu, u16 v) ;
void GPU_setWINDOW_OUTCNT(GPU *gpu, u16 v) ;
void GPU_setWINDOW_INCNT_Component(GPU *gpu, u8 v,u8 num) ;
void GPU_setWINDOW_OUTCNT_Component(GPU *gpu, u8 v,u8 num) ;
void GPU_remove(GPU *, u8 num);
void GPU_addBack(GPU *, u8 num);

View File

@ -990,78 +990,6 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val)
MMU_VRAMReloadFromLCD(adr-REG_VRAMCNTI,val) ;
}
break;
case REG_DISPA_WIN0H:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM_Component(MainScreen.gpu,val,0) ;
break ;
case REG_DISPA_WIN0H+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM_Component(MainScreen.gpu,val,1) ;
break ;
case REG_DISPA_WIN1H:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM_Component(MainScreen.gpu,val,2) ;
break ;
case REG_DISPA_WIN1H+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM_Component(MainScreen.gpu,val,3) ;
break ;
case REG_DISPB_WIN0H:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM_Component(SubScreen.gpu,val,0) ;
break ;
case REG_DISPB_WIN0H+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM_Component(SubScreen.gpu,val,1) ;
break ;
case REG_DISPB_WIN1H:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM_Component(SubScreen.gpu,val,2) ;
break ;
case REG_DISPB_WIN1H+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM_Component(SubScreen.gpu,val,3) ;
break ;
case REG_DISPA_WIN0V:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM_Component(MainScreen.gpu,val,0) ;
break ;
case REG_DISPA_WIN0V+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM_Component(MainScreen.gpu,val,1) ;
break ;
case REG_DISPA_WIN1V:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM_Component(MainScreen.gpu,val,2) ;
break ;
case REG_DISPA_WIN1V+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM_Component(MainScreen.gpu,val,3) ;
break ;
case REG_DISPB_WIN0V:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM_Component(SubScreen.gpu,val,0) ;
break ;
case REG_DISPB_WIN0V+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM_Component(SubScreen.gpu,val,1) ;
break ;
case REG_DISPB_WIN1V:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM_Component(SubScreen.gpu,val,2) ;
break ;
case REG_DISPB_WIN1V+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM_Component(SubScreen.gpu,val,3) ;
break ;
case REG_DISPA_WININ:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_INCNT_Component(MainScreen.gpu,val,0) ;
break ;
case REG_DISPA_WININ+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_INCNT_Component(MainScreen.gpu,val,1) ;
break ;
case REG_DISPA_WINOUT:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_OUTCNT_Component(MainScreen.gpu,val,0) ;
break ;
case REG_DISPA_WINOUT+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_OUTCNT_Component(MainScreen.gpu,val,1) ;
break ;
case REG_DISPB_WININ:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_INCNT_Component(SubScreen.gpu,val,0) ;
break ;
case REG_DISPB_WININ+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_INCNT_Component(SubScreen.gpu,val,1) ;
break ;
case REG_DISPB_WINOUT:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_OUTCNT_Component(SubScreen.gpu,val,0) ;
break ;
case REG_DISPB_WINOUT+1:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_OUTCNT_Component(SubScreen.gpu,val,1) ;
break ;
#ifdef LOG_CARD
case 0x040001A0 : /* TODO (clear): ??? */
@ -1303,54 +1231,6 @@ void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val)
/* NOTICE: Perhaps we have to use gbatek-like reg names instead of libnds-like ones ...*/
case REG_DISPA_BG0HOFS :
if(proc == ARMCPU_ARM9) GPU_scrollX(MainScreen.gpu, 0, val);
return;
case REG_DISPA_BG1HOFS :
if(proc == ARMCPU_ARM9) GPU_scrollX(MainScreen.gpu, 1, val);
return;
case REG_DISPA_BG2HOFS :
if(proc == ARMCPU_ARM9) GPU_scrollX(MainScreen.gpu, 2, val);
return;
case REG_DISPA_BG3HOFS :
if(proc == ARMCPU_ARM9) GPU_scrollX(MainScreen.gpu, 3, val);
return;
case REG_DISPB_BG0HOFS :
if(proc == ARMCPU_ARM9) GPU_scrollX(SubScreen.gpu, 0, val);
return;
case REG_DISPB_BG1HOFS :
if(proc == ARMCPU_ARM9) GPU_scrollX(SubScreen.gpu, 1, val);
return;
case REG_DISPB_BG2HOFS :
if(proc == ARMCPU_ARM9) GPU_scrollX(SubScreen.gpu, 2, val);
return;
case REG_DISPB_BG3HOFS :
if(proc == ARMCPU_ARM9) GPU_scrollX(SubScreen.gpu, 3, val);
return;
case REG_DISPA_BG0VOFS :
if(proc == ARMCPU_ARM9) GPU_scrollY(MainScreen.gpu, 0, val);
return;
case REG_DISPA_BG1VOFS :
if(proc == ARMCPU_ARM9) GPU_scrollY(MainScreen.gpu, 1, val);
return;
case REG_DISPA_BG2VOFS :
if(proc == ARMCPU_ARM9) GPU_scrollY(MainScreen.gpu, 2, val);
return;
case REG_DISPA_BG3VOFS :
if(proc == ARMCPU_ARM9) GPU_scrollY(MainScreen.gpu, 3, val);
return;
case REG_DISPB_BG0VOFS :
if(proc == ARMCPU_ARM9) GPU_scrollY(SubScreen.gpu, 0, val);
return;
case REG_DISPB_BG1VOFS :
if(proc == ARMCPU_ARM9) GPU_scrollY(SubScreen.gpu, 1, val);
return;
case REG_DISPB_BG2VOFS :
if(proc == ARMCPU_ARM9) GPU_scrollY(SubScreen.gpu, 2, val);
return;
case REG_DISPB_BG3VOFS :
if(proc == ARMCPU_ARM9) GPU_scrollY(SubScreen.gpu, 3, val);
return;
case REG_DISPA_BG0CNT :
//GPULOG("MAIN BG0 SETPROP 16B %08X\r\n", val);
if(proc == ARMCPU_ARM9) GPU_setBGProp(MainScreen.gpu, 0, val);
@ -1391,66 +1271,6 @@ void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val)
if(proc == ARMCPU_ARM9) GPU_setBGProp(SubScreen.gpu, 3, val);
T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x100E, val);
return;
case REG_DISPA_BLDCNT:
if(proc == ARMCPU_ARM9) GPU_setBLDCNT(MainScreen.gpu,val) ;
break ;
case REG_DISPB_BLDCNT:
if(proc == ARMCPU_ARM9) GPU_setBLDCNT(SubScreen.gpu,val) ;
break ;
case REG_DISPA_BLDALPHA:
if(proc == ARMCPU_ARM9) GPU_setBLDALPHA(MainScreen.gpu,val) ;
break ;
case REG_DISPB_BLDALPHA:
if(proc == ARMCPU_ARM9) GPU_setBLDALPHA(SubScreen.gpu,val) ;
break ;
case REG_DISPA_BLDY:
if(proc == ARMCPU_ARM9) GPU_setBLDY(MainScreen.gpu,val) ;
break ;
case REG_DISPB_BLDY:
if(proc == ARMCPU_ARM9) GPU_setBLDY(SubScreen.gpu,val) ;
break ;
case REG_DISPA_MOSAIC:
if(proc == ARMCPU_ARM9) GPU_setMOSAIC(MainScreen.gpu,val) ;
break ;
case REG_DISPB_MOSAIC:
if(proc == ARMCPU_ARM9) GPU_setMOSAIC(SubScreen.gpu,val) ;
break ;
case REG_DISPA_WIN0H:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM(MainScreen.gpu,val,0) ;
break ;
case REG_DISPA_WIN1H:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM(MainScreen.gpu,val,1) ;
break ;
case REG_DISPB_WIN0H:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM(SubScreen.gpu,val,0) ;
break ;
case REG_DISPB_WIN1H:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_XDIM(SubScreen.gpu,val,1) ;
break ;
case REG_DISPA_WIN0V:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM(MainScreen.gpu,val,0) ;
break ;
case REG_DISPA_WIN1V:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM(MainScreen.gpu,val,1) ;
break ;
case REG_DISPB_WIN0V:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM(SubScreen.gpu,val,0) ;
break ;
case REG_DISPB_WIN1V:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_YDIM(SubScreen.gpu,val,1) ;
break ;
case REG_DISPA_WININ:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_INCNT(MainScreen.gpu, val) ;
break ;
case REG_DISPA_WINOUT:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_OUTCNT(MainScreen.gpu, val) ;
break ;
case REG_DISPB_WININ:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_INCNT(SubScreen.gpu, val) ;
break ;
case REG_DISPB_WINOUT:
if(proc == ARMCPU_ARM9) GPU_setWINDOW_OUTCNT(SubScreen.gpu, val) ;
break ;
case REG_IME :
MMU.reg_IME[proc] = val&1;
T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x208, val);
@ -1818,30 +1638,6 @@ void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val)
if (proc == ARMCPU_ARM9) gl_print_cmd(adr);
return;
case REG_DISPA_BG0HOFS :
if (proc == ARMCPU_ARM9) GPU_scrollXY(MainScreen.gpu, 0, val);
return;
case REG_DISPA_BG1HOFS :
if (proc == ARMCPU_ARM9) GPU_scrollXY(MainScreen.gpu, 1, val);
return;
case REG_DISPA_BG2HOFS :
if (proc == ARMCPU_ARM9) GPU_scrollXY(MainScreen.gpu, 2, val);
return;
case REG_DISPA_BG3HOFS :
if (proc == ARMCPU_ARM9) GPU_scrollXY(MainScreen.gpu, 3, val);
return;
case REG_DISPB_BG0HOFS :
if (proc == ARMCPU_ARM9) GPU_scrollXY(SubScreen.gpu, 0, val);
return;
case REG_DISPB_BG1HOFS :
if (proc == ARMCPU_ARM9) GPU_scrollXY(SubScreen.gpu, 1, val);
return;
case REG_DISPB_BG2HOFS :
if (proc == ARMCPU_ARM9) GPU_scrollXY(SubScreen.gpu, 2, val);
return;
case REG_DISPB_BG3HOFS :
if (proc == ARMCPU_ARM9) GPU_scrollXY(SubScreen.gpu, 3, val);
return;
case REG_DISPA_DISPCNT :
if(proc == ARMCPU_ARM9) GPU_setVideoProp(MainScreen.gpu, val);
@ -1854,20 +1650,6 @@ void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val)
//GPULOG("SUB INIT 32B %08X\r\n", val);
T1WriteLong(MMU.MMU_MEM[proc][0x40], 0x1000, val);
return;
case REG_DISPA_WININ:
if(proc == ARMCPU_ARM9)
{
GPU_setWINDOW_INCNT(MainScreen.gpu, val & 0xFFFF) ;
GPU_setWINDOW_OUTCNT(MainScreen.gpu, (val >> 16) & 0xFFFF) ;
}
break ;
case REG_DISPB_WININ:
if(proc == ARMCPU_ARM9)
{
GPU_setWINDOW_INCNT(SubScreen.gpu, val & 0xFFFF) ;
GPU_setWINDOW_OUTCNT(SubScreen.gpu, (val >> 16) & 0xFFFF) ;
}
break ;
case REG_VRAMCNTA:
case REG_VRAMCNTE:
MMU_write8(proc,adr,val & 0xFF) ;
@ -2286,21 +2068,6 @@ void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val)
}
T1WriteLong(ARM9Mem.ARM9_REG, 0x100C, val);
return;
case REG_DISPA_BLDCNT:
if (proc == ARMCPU_ARM9)
{
GPU_setBLDCNT (MainScreen.gpu,val&0xffff);
GPU_setBLDALPHA (MainScreen.gpu,val>>16);
}
break;
case REG_DISPB_BLDCNT:
if (proc == ARMCPU_ARM9)
{
GPU_setBLDCNT (SubScreen.gpu,val&0xffff);
GPU_setBLDALPHA (SubScreen.gpu,val>>16);
}
break;
case REG_DISPA_DISPMMEMFIFO:
{
// NOTE: right now, the capture unit is not taken into account,

View File

@ -104,7 +104,7 @@ BOOL init_joy(u16 joyCfg[]) {
}
/* Set all buttons at once */
void set_joy_keys(u16 joyCfg[])
void set_joy_keys(const u16 joyCfg[])
{
memcpy(joypad_cfg, joyCfg, sizeof(joypad_cfg));
}

View File

@ -82,7 +82,7 @@ void set_mouse_coord(signed long x,signed long y);
void load_default_config();
BOOL init_joy();
void uninit_joy();
void set_joy_keys(u16 joyCfg[]);
void set_joy_keys(const u16 joyCfg[]);
void set_kb_keys(u16 kbCfg[]);
u16 get_set_joy_key(int index);
void get_set_joy_axis(int index, int index_opp);

View File

@ -124,21 +124,23 @@ void on_wtools_2_r32_toggled (GtkToggleButton *togglebutton, gpointer
/* which address */
#define RANGE_MIN 0
#define RANGE_MAX 0x100000000
#define ADDR_MASK 0xFFFFFFF0
#define STEP_ONE_LINE 0x10
#define STEP_ONE_PAGE 0x100
#define STEP_x10_PAGE 0x1000
#define RANGE_MAX 0x10000000
#define ADDR_MASK 0xFFFFFFF
#define STEP_ONE_LINE 0x1
#define STEP_ONE_PAGE 0x10
#define STEP_x10_PAGE 0x100
static void scroll_address(u32 addr) {
address = addr & ADDR_MASK;
address = (addr & ADDR_MASK);
refresh();
}
static void change_address(u32 addr) {
addr /= 0x10;
gtk_range_set_value(wRange, addr);
}
static void add_to_address(u32 inc) {
change_address(address+inc);
static void add_to_address(s32 inc) {
u32 addr = (address+inc) & ADDR_MASK;
gtk_range_set_value(wRange, addr);
}
void on_wtools_2_GotoAddress_activate (GtkEntry *entry, gpointer user_data) {
@ -240,8 +242,9 @@ static void refresh() {
if (!init) return;
addr=address * 0x10;
for (i=0; i<0x100; i++)
mem[i] = MMU_readByte(cpu, address+i);
mem[i] = MMU_readByte(cpu, addr+i);
dTools_display_clear(&dsp);
switch(packmode) {
@ -252,7 +255,6 @@ static void refresh() {
// draw memory content here
addr=address;
for (i=0; i<0x10; i++) {
ptxt = txt;
sprintf(ptxt, "%04X:%04X | ", (addr>>16)&0xFFFF, addr&0xFFFF); ptxt+=12;

View File

@ -1,127 +1,254 @@
/* -*- Mode: C; c-basic-offset: 4 -*-
* libglade - a library for building interfaces from XML files at runtime
* Copyright (C) 1998-2002 James Henstridge <james@daa.com.au>
*
* glade-xml.c: implementation of core public interface functions
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "globals.h"
#include <glade/glade-xml.h>
#include <glade/glade-init.h>
#include <glade/glade-build.h>
#include <gmodule.h>
typedef struct _GladeXMLPrivate nopriv_GladeXMLPrivate;
static struct _GladeXMLPrivate {
GladeInterface *tree; /* the tree for this GladeXML */
GtkTooltips *tooltips; /* if not NULL, holds all tooltip info */
GHashTable *name_hash;
GHashTable *signals;
GtkWindow *toplevel;
GtkAccelGroup *accel_group;
GtkWidget *focus_widget;
GtkWidget *default_widget;
GList *deferred_props;
};
typedef struct _GladeSignalData GladeSignalData;
struct _GladeSignalData {
GObject *signal_object;
char *signal_name;
char *connect_object; /* or NULL if there is none */
gboolean signal_after;
};
static void
autoconnect_foreach_StringObject(const char *signal_handler, GList *signals,
GModule *allsymbols)
{
GCallback func;
if (!g_module_symbol(allsymbols, signal_handler, (gpointer)&func))
g_warning("could not find signal handler '%s'.", signal_handler);
else
for (; signals != NULL; signals = signals->next) {
GladeSignalData *data = signals->data;
if (data->connect_object) {
GladeXML *self = glade_get_widget_tree(
GTK_WIDGET(data->signal_object));
char format[]="%_\0\0";
if (sscanf(data->connect_object,"%%%c:", &format[1])) {
// this should solve 64bit problems but now memory gets
// (it should get) deallocated when program is destroyed
gpointer argument = g_malloc(sizeof(callback_arg));
sscanf(data->connect_object+3,format, argument);
// printf ("%f \n",obj);
if (data->signal_after)
g_signal_connect_after(data->signal_object, data->signal_name,
func, argument);
else
g_signal_connect(data->signal_object, data->signal_name,
func, argument);
} else {
GObject *other = g_hash_table_lookup(self->priv->name_hash,
data->connect_object);
g_signal_connect_object(data->signal_object, data->signal_name,
func, other, (data->signal_after ? G_CONNECT_AFTER : 0)
| G_CONNECT_SWAPPED);
}
} else {
/* the signal_data argument is just a string, but may
* be helpful for someone */
if (data->signal_after)
g_signal_connect_after(data->signal_object,
data->signal_name, func, NULL);
else
g_signal_connect(data->signal_object, data->signal_name,
func, NULL);
}
}
}
/**
* glade_xml_signal_autoconnect_StringObject:
* @self: the GladeXML object.
*
* This function is a variation of glade_xml_signal_connect. It uses
* gmodule's introspective features (by openning the module %NULL) to
* look at the application's symbol table. From here it tries to match
* the signal handler names given in the interface description with
* symbols in the application and connects the signals.
*
* Note that this function will not work correctly if gmodule is not
* supported on the platform.
*/
void
glade_xml_signal_autoconnect_StringObject (GladeXML *self)
{
GModule *allsymbols;
nopriv_GladeXMLPrivate * priv;
g_return_if_fail(self != NULL);
if (!g_module_supported())
g_error("glade_xml_signal_autoconnect requires working gmodule");
/* get a handle on the main executable -- use this to find symbols */
allsymbols = g_module_open(NULL, 0);
priv = (nopriv_GladeXMLPrivate *)self->priv;
g_hash_table_foreach(priv->signals, (GHFunc)autoconnect_foreach_StringObject,
allsymbols);
}
/* -*- Mode: C; c-basic-offset: 4 -*-
* libglade - a library for building interfaces from XML files at runtime
* Copyright (C) 1998-2002 James Henstridge <james@daa.com.au>
*
* glade-xml.c: implementation of core public interface functions
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "globals.h"
#include <glade/glade-xml.h>
#include <glade/glade-init.h>
#include <glade/glade-build.h>
#include <gmodule.h>
typedef struct _GladeXMLPrivate nopriv_GladeXMLPrivate;
struct _GladeXMLPrivate {
GladeInterface *tree; /* the tree for this GladeXML */
GtkTooltips *tooltips; /* if not NULL, holds all tooltip info */
GHashTable *name_hash;
GHashTable *signals;
GtkWindow *toplevel;
GtkAccelGroup *accel_group;
GtkWidget *focus_widget;
GtkWidget *default_widget;
GList *deferred_props;
};
typedef struct _GladeSignalData GladeSignalData;
struct _GladeSignalData {
GObject *signal_object;
char *signal_name;
char *connect_object; /* or NULL if there is none */
gboolean signal_after;
};
static void
autoconnect_foreach_StringObject(const char *signal_handler, GList *signals,
GModule *allsymbols)
{
GCallback func;
if (!g_module_symbol(allsymbols, signal_handler, (gpointer)&func))
g_warning("could not find signal handler '%s'.", signal_handler);
else
for (; signals != NULL; signals = signals->next) {
GladeSignalData *data = signals->data;
if (data->connect_object) {
GladeXML *self = glade_get_widget_tree(
GTK_WIDGET(data->signal_object));
char format[]="%_\0\0";
if (sscanf(data->connect_object,"%%%c:", &format[1])) {
// this should solve 64bit problems but now memory gets
// (it should get) deallocated when program is destroyed
gpointer argument = g_malloc(sizeof(callback_arg));
sscanf(data->connect_object+3,format, argument);
// printf ("%f \n",obj);
if (data->signal_after)
g_signal_connect_after(data->signal_object, data->signal_name,
func, argument);
else
g_signal_connect(data->signal_object, data->signal_name,
func, argument);
} else {
GObject *other = g_hash_table_lookup(self->priv->name_hash,
data->connect_object);
g_signal_connect_object(data->signal_object, data->signal_name,
func, other, (data->signal_after ? G_CONNECT_AFTER : 0)
| G_CONNECT_SWAPPED);
}
} else {
/* the signal_data argument is just a string, but may
* be helpful for someone */
if (data->signal_after)
g_signal_connect_after(data->signal_object,
data->signal_name, func, NULL);
else
g_signal_connect(data->signal_object, data->signal_name,
func, NULL);
}
}
}
/**
* glade_xml_signal_autoconnect_StringObject:
* @self: the GladeXML object.
*
* This function is a variation of glade_xml_signal_connect. It uses
* gmodule's introspective features (by openning the module %NULL) to
* look at the application's symbol table. From here it tries to match
* the signal handler names given in the interface description with
* symbols in the application and connects the signals.
*
* Note that this function will not work correctly if gmodule is not
* supported on the platform.
*/
void
glade_xml_signal_autoconnect_StringObject (GladeXML *self)
{
GModule *allsymbols;
nopriv_GladeXMLPrivate * priv;
g_return_if_fail(self != NULL);
if (!g_module_supported())
g_error("glade_xml_signal_autoconnect requires working gmodule");
/* get a handle on the main executable -- use this to find symbols */
allsymbols = g_module_open(NULL, 0);
priv = (nopriv_GladeXMLPrivate *)self->priv;
g_hash_table_foreach(priv->signals, (GHFunc)autoconnect_foreach_StringObject,
allsymbols);
}