newemuloop: fix some timing regressions; win32: improve map view

This commit is contained in:
zeromus 2009-07-16 07:39:21 +00:00
parent 3c0646c423
commit 3f291c8e6a
5 changed files with 318 additions and 269 deletions

View File

@ -719,6 +719,8 @@ void GPU_setMasterBrightness (GPU *gpu, u16 val)
} }
gpu->MasterBrightFactor = (val & 0x1F); gpu->MasterBrightFactor = (val & 0x1F);
gpu->MasterBrightMode = (val>>14); gpu->MasterBrightMode = (val>>14);
//printf("MASTER BRIGHTNESS %d to %d at %d\n",gpu->core,gpu->MasterBrightFactor,nds.VCount);
} }
void SetupFinalPixelBlitter (GPU *gpu) void SetupFinalPixelBlitter (GPU *gpu)
@ -958,11 +960,11 @@ FORCEINLINE void GPU::renderline_checkWindows(u16 x, bool &draw, bool &effect) c
// PIXEL RENDERING - BGS // PIXEL RENDERING - BGS
/*****************************************************************************/ /*****************************************************************************/
template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialNone(u16 &color, const u8 x) template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialNone(u16 &color, const u32 x)
{ {
} }
template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialBlend(u16 &color, const u8 x) template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialBlend(u16 &color, const u32 x)
{ {
//blend backdrop with what?? this doesn't make sense //blend backdrop with what?? this doesn't make sense
if(BACKDROP) return; if(BACKDROP) return;
@ -975,7 +977,7 @@ template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialBlend(u16 &c
} }
} }
template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialIncrease (u16 &color, const u8 x) template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialIncrease (u16 &color, const u32 x)
{ {
if(blend1) // the bg to draw has a special color effect if(blend1) // the bg to draw has a special color effect
{ {
@ -983,7 +985,7 @@ template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialIncrease (u1
} }
} }
template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialDecrease(u16 &color, const u8 x) template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialDecrease(u16 &color, const u32 x)
{ {
if(blend1) // the bg to draw has a special color effect if(blend1) // the bg to draw has a special color effect
{ {
@ -991,7 +993,7 @@ template<bool BACKDROP> FORCEINLINE void GPU::setFinalBGColorSpecialDecrease(u16
} }
} }
template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialNoneWnd(u16 &color, const u8 x) template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialNoneWnd(u16 &color, const u32 x)
{ {
bool windowDraw = true, windowEffect = true; bool windowDraw = true, windowEffect = true;
@ -1013,7 +1015,7 @@ template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialNoneWnd(u16
return false; return false;
} }
template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialBlendWnd(u16 &color, const u8 x) template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialBlendWnd(u16 &color, const u32 x)
{ {
bool windowDraw = true, windowEffect = true; bool windowDraw = true, windowEffect = true;
@ -1036,7 +1038,7 @@ template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialBlendWnd(u16
return false; return false;
} }
template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialIncreaseWnd(u16 &color, const u8 x) template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialIncreaseWnd(u16 &color, const u32 x)
{ {
bool windowDraw = true, windowEffect = true; bool windowDraw = true, windowEffect = true;
@ -1055,7 +1057,7 @@ template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialIncreaseWnd(
return false; return false;
} }
template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialDecreaseWnd(u16 &color, const u8 x) template<bool BACKDROP> FORCEINLINE bool GPU::setFinalBGColorSpecialDecreaseWnd(u16 &color, const u32 x)
{ {
bool windowDraw = true, windowEffect = true; bool windowDraw = true, windowEffect = true;
@ -1125,7 +1127,7 @@ static void _master_setFinalOBJColor(GPU *gpu, u32 passing, u8 *dst, u16 color,
gpu->bgPixels[x] = 4; gpu->bgPixels[x] = 4;
} }
template<bool BACKDROP> FORCEINLINE void GPU::setFinalColorBG(u16 color, u8 x) template<bool BACKDROP> FORCEINLINE void GPU::setFinalColorBG(u16 color, const u32 x)
{ {
//It is not safe to assert this here. //It is not safe to assert this here.
//This is probably the best place to enforce it, since almost every single color that comes in here //This is probably the best place to enforce it, since almost every single color that comes in here
@ -1173,13 +1175,12 @@ FORCEINLINE void GPU::setFinalColor3d(int dstX, int srcX)
//this was forced inline because most of the time it just falls through to setFinalColorBck() and the function call //this was forced inline because most of the time it just falls through to setFinalColorBck() and the function call
//overhead was ridiculous and terrible //overhead was ridiculous and terrible
template<bool MOSAIC, bool BACKDROP> FORCEINLINE void GPU::__setFinalColorBck(u16 color, const u8 x, const bool opaque) template<bool MOSAIC, bool BACKDROP> FORCEINLINE void GPU::__setFinalColorBck(u16 color, const u32 x, const bool opaque)
{ {
//I commented out this line to make a point. //I commented out this line to make a point.
//indeed, since x is a u8 we cannot pass in anything >=256 //under ordinary circumstances, nobody should pass in something >=256
//but in fact, someone is going to try. specifically, that is the map viewer debug tools //but in fact, someone is going to try. specifically, that is the map viewer debug tools
//which try to render the enter BG. in cases where that is large, it could be up to 1024 wide. //which try to render the enter BG. in cases where that is large, it could be up to 1024 wide.
//I think it survives this truncation to 8bits.
//assert(x<256); //assert(x<256);
int x_int; int x_int;
@ -1582,7 +1583,20 @@ static void lineNull(GPU * gpu)
template<bool MOSAIC> void lineText(GPU * gpu) template<bool MOSAIC> void lineText(GPU * gpu)
{ {
BGxOFS * ofs = &gpu->dispx_st->dispx_BGxOFS[gpu->currBgNum]; BGxOFS * ofs = &gpu->dispx_st->dispx_BGxOFS[gpu->currBgNum];
renderline_textBG<MOSAIC>(gpu, T1ReadWord((u8 *)&ofs->BGxHOFS, 0), gpu->currLine + T1ReadWord((u8 *)&ofs->BGxVOFS, 0), 256);
if(gpu->debug)
{
const s32 wh = gpu->BGSize[gpu->currBgNum][0];
renderline_textBG<MOSAIC>(gpu, 0, gpu->currLine, wh);
}
else
{
const u16 vofs = T1ReadWord((u8 *)&ofs->BGxVOFS,0);
const u16 hofs = T1ReadWord((u8 *)&ofs->BGxHOFS,0);
renderline_textBG<MOSAIC>(gpu, hofs, gpu->currLine + vofs, 256);
}
} }
template<bool MOSAIC> void lineRot(GPU * gpu) template<bool MOSAIC> void lineRot(GPU * gpu)
@ -1593,8 +1607,12 @@ template<bool MOSAIC> void lineRot(GPU * gpu)
} else { } else {
parms = &(gpu->dispx_st)->dispx_BG3PARMS; parms = &(gpu->dispx_st)->dispx_BG3PARMS;
} }
if(gpu->debug) if(gpu->debug)
rotBG2<MOSAIC>(gpu, 0, (s16)gpu->currLine*256, 256,0, -1,-1, 256); {
s32 wh = gpu->BGSize[gpu->currBgNum][0];
rotBG2<MOSAIC>(gpu, 0, (s16)gpu->currLine*256, 256,0, 0,-77, wh);
}
else else
{ {
rotBG2<MOSAIC>(gpu, rotBG2<MOSAIC>(gpu,
@ -1620,7 +1638,10 @@ template<bool MOSAIC> void lineExtRot(GPU * gpu)
} }
if(gpu->debug) if(gpu->debug)
extRotBG2<MOSAIC>(gpu, 0, (s16)gpu->currLine*256, 256,0, -1,-1, 256); {
s32 wh = gpu->BGSize[gpu->currBgNum][0];
extRotBG2<MOSAIC>(gpu, 0, (s16)gpu->currLine*256, 256,0, 0,-77, wh);
}
else else
{ {
extRotBG2<MOSAIC>(gpu, extRotBG2<MOSAIC>(gpu,
@ -2468,7 +2489,7 @@ static void GPU_ligne_layer(NDS_Screen * screen, u16 l)
} }
//useful for debugging individual layers //useful for debugging individual layers
//if(gpu->core == 0 && i16 != 1) continue; //if(gpu->core == 1 || i16 != 2) continue;
if(gpu->curr_mosaic_enabled) if(gpu->curr_mosaic_enabled)
gpu->modeRender<true>(i16); gpu->modeRender<true>(i16);
@ -2804,6 +2825,9 @@ void GPU_ligne(NDS_Screen * screen, u16 l)
gpu->refreshAffineStartRegs(-1,-1); gpu->refreshAffineStartRegs(-1,-1);
} }
//if(gpu->core == 1)
// printf("%d\n",l);
//blacken the screen if it is turned off by the user //blacken the screen if it is turned off by the user
if(!CommonSettings.showGpu.screens[gpu->core]) if(!CommonSettings.showGpu.screens[gpu->core])
{ {
@ -2812,6 +2836,12 @@ void GPU_ligne(NDS_Screen * screen, u16 l)
return; return;
} }
//{
// extern int currFrameCounter;
// u8 * dst = GPU_screen + (screen->offset + l) * 512;
// memset(dst,currFrameCounter,512);
//}
//cache some parameters which are assumed to be stable throughout the rendering of the entire line //cache some parameters which are assumed to be stable throughout the rendering of the entire line
gpu->currLine = (u8)l; gpu->currLine = (u8)l;
u16 mosaic_control = T1ReadWord((u8 *)&gpu->dispx_st->dispx_MISC.MOSAIC, 0); u16 mosaic_control = T1ReadWord((u8 *)&gpu->dispx_st->dispx_MISC.MOSAIC, 0);
@ -2874,8 +2904,6 @@ void GPU_ligne(NDS_Screen * screen, u16 l)
break; break;
} }
GPU_ligne_MasterBrightness(screen, l); GPU_ligne_MasterBrightness(screen, l);
} }

View File

@ -728,9 +728,9 @@ struct GPU
u8 MasterBrightMode; u8 MasterBrightMode;
u32 MasterBrightFactor; u32 MasterBrightFactor;
u8 bgPixels[256]; u8 bgPixels[1024]; //yes indeed, this is oversized. map debug tools try to write to it
u8 currLine; u32 currLine;
u8 currBgNum; u8 currBgNum;
bool blend1; bool blend1;
u8* currDst; u8* currDst;
@ -779,17 +779,17 @@ struct GPU
void _spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); void _spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab);
void spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab); void spriteRender(u8 * dst, u8 * dst_alpha, u8 * typeTab, u8 * prioTab);
template<bool BACKDROP> void setFinalColorBG(u16 color, u8 x); template<bool BACKDROP> void setFinalColorBG(u16 color, const u32 x);
void setFinalColor3d(int dstX, int srcX); void setFinalColor3d(int dstX, int srcX);
template<bool BACKDROP> FORCEINLINE void setFinalBGColorSpecialNone(u16 &color, u8 x); template<bool BACKDROP> FORCEINLINE void setFinalBGColorSpecialNone(u16 &color, const u32 x);
template<bool BACKDROP> FORCEINLINE void setFinalBGColorSpecialBlend(u16 &color, u8 x); template<bool BACKDROP> FORCEINLINE void setFinalBGColorSpecialBlend(u16 &color, const u32 x);
template<bool BACKDROP> FORCEINLINE void setFinalBGColorSpecialIncrease(u16 &color, u8 x); template<bool BACKDROP> FORCEINLINE void setFinalBGColorSpecialIncrease(u16 &color, const u32 x);
template<bool BACKDROP> FORCEINLINE void setFinalBGColorSpecialDecrease(u16 &color, u8 x); template<bool BACKDROP> FORCEINLINE void setFinalBGColorSpecialDecrease(u16 &color, const u32 x);
template<bool BACKDROP> FORCEINLINE bool setFinalBGColorSpecialNoneWnd(u16 &color, u8 x); template<bool BACKDROP> FORCEINLINE bool setFinalBGColorSpecialNoneWnd(u16 &color, const u32 x);
template<bool BACKDROP> FORCEINLINE bool setFinalBGColorSpecialBlendWnd(u16 &color, u8 x); template<bool BACKDROP> FORCEINLINE bool setFinalBGColorSpecialBlendWnd(u16 &color, const u32 x);
template<bool BACKDROP> FORCEINLINE bool setFinalBGColorSpecialIncreaseWnd(u16 &color, u8 x); template<bool BACKDROP> FORCEINLINE bool setFinalBGColorSpecialIncreaseWnd(u16 &color, const u32 x);
template<bool BACKDROP> FORCEINLINE bool setFinalBGColorSpecialDecreaseWnd(u16 &color, u8 x); template<bool BACKDROP> FORCEINLINE bool setFinalBGColorSpecialDecreaseWnd(u16 &color, const u32 x);
FORCEINLINE void setFinal3DColorSpecialNone(int dstX, int srcX); FORCEINLINE void setFinal3DColorSpecialNone(int dstX, int srcX);
FORCEINLINE void setFinal3DColorSpecialBlend(int dstX, int srcX); FORCEINLINE void setFinal3DColorSpecialBlend(int dstX, int srcX);
@ -801,7 +801,7 @@ struct GPU
FORCEINLINE void setFinal3DColorSpecialDecreaseWnd(int dstX, int srcX); FORCEINLINE void setFinal3DColorSpecialDecreaseWnd(int dstX, int srcX);
template<bool MOSAIC, bool BACKDROP> void __setFinalColorBck(u16 color, const u8 x, const bool opaque); template<bool MOSAIC, bool BACKDROP> void __setFinalColorBck(u16 color, const u32 x, const bool opaque);
void setAffineStart(int layer, int xy, u32 val); void setAffineStart(int layer, int xy, u32 val);
void setAffineStartWord(int layer, int xy, u16 val, int word); void setAffineStartWord(int layer, int xy, u16 val, int word);
u32 getAffineStart(int layer, int xy); u32 getAffineStart(int layer, int xy);

View File

@ -1800,8 +1800,21 @@ void execHardware_hblank()
//this logic was formerly at hblank time. it was moved to the beginning of the scanline on a whim //this logic was formerly at hblank time. it was moved to the beginning of the scanline on a whim
if(nds.VCount<192) if(nds.VCount<192)
{ {
//trigger hblank dmas. //so, we have chosen to do the line drawing at hblank time.
//but should this happen for non-displayed scanlines??? not sure //this is the traditional time for it in desmume.
//while it may seem more ruthlessly accurate to do it at hstart,
//in practice we need to be more forgiving, in case things have overrun the scanline start.
//this should be safe since games cannot do anything timing dependent until this next
//scanline begins, anyway (as this scanline was in the middle of drawing)
if(!SkipCur2DFrame)
{
GPU_ligne(&MainScreen, nds.VCount);
GPU_ligne(&SubScreen, nds.VCount);
}
//trigger hblank dmas
//but notice, we do that just after we finished drawing the line
//(values copied by this hdma should not be used until the next scanline)
execHardware_doAllDma(EDMAMode_HBlank); execHardware_doAllDma(EDMAMode_HBlank);
} }
} }
@ -1889,23 +1902,14 @@ void execHardware_hstart()
//handle vcount status //handle vcount status
execHardware_hstart_vcount(); execHardware_hstart_vcount();
//this logic was formerly at hblank time. it was moved to the beginning of the scanline on a whim //trigger hstart dmas
execHardware_doAllDma(EDMAMode_HStart);
if(nds.VCount<192) if(nds.VCount<192)
{ {
//trigger hstart dmas
//in an effort to more accurately mimic what might happen in cases where these are used
//to adjust the scanline which is just about to render, the dma occurs before the scanline draw
execHardware_doAllDma(EDMAMode_HStart);
//this is hacky. //this is hacky.
//there is a corresponding hack in doDMA //there is a corresponding hack in doDMA
execHardware_doAllDma(EDMAMode_MemDisplay); execHardware_doAllDma(EDMAMode_MemDisplay);
if(!SkipCur2DFrame)
{
GPU_ligne(&MainScreen, nds.VCount);
GPU_ligne(&SubScreen, nds.VCount);
}
} }
//end of 3d vblank //end of 3d vblank

View File

@ -156,6 +156,7 @@ DWORD hKeyInputTimer;
extern LRESULT CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); extern LRESULT CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void InitRamSearch(); void InitRamSearch();
void FilterUpdate(HWND hwnd, bool user=true);
CRITICAL_SECTION win_sync; CRITICAL_SECTION win_sync;
@ -1620,8 +1621,7 @@ int _main()
CommonSettings.wifiBridgeAdapterNum = GetPrivateProfileInt("Wifi", "BridgeAdapter", 0, IniName); CommonSettings.wifiBridgeAdapterNum = GetPrivateProfileInt("Wifi", "BridgeAdapter", 0, IniName);
video.currentfilter = GetPrivateProfileInt("Video", "Filter", video.NONE, IniName); video.currentfilter = GetPrivateProfileInt("Video", "Filter", video.NONE, IniName);
void FilterUpdate(HWND hwnd); FilterUpdate(MainWindow->getHWnd(),false);
FilterUpdate(MainWindow->getHWnd());
/* Read the firmware settings from the init file */ /* Read the firmware settings from the init file */
win_fw_config.fav_colour = GetPrivateProfileInt("Firmware","favColor", 10, IniName); win_fw_config.fav_colour = GetPrivateProfileInt("Firmware","favColor", 10, IniName);
@ -2365,12 +2365,13 @@ void RunConfig(CONFIGSCREEN which)
NDS_UnPause(); NDS_UnPause();
} }
void FilterUpdate (HWND hwnd){ void FilterUpdate (HWND hwnd, bool user){
UpdateScreenRects(); UpdateScreenRects();
UpdateWndRects(hwnd); UpdateWndRects(hwnd);
SetScreenGap(video.screengap); SetScreenGap(video.screengap);
SetRotate(hwnd, video.rotation); SetRotate(hwnd, video.rotation);
ScaleScreen(windowSize); if(user && windowSize==0) {}
else ScaleScreen(windowSize);
WritePrivateProfileInt("Video", "Filter", video.currentfilter, IniName); WritePrivateProfileInt("Video", "Filter", video.currentfilter, IniName);
WritePrivateProfileInt("Video", "Width", video.width, IniName); WritePrivateProfileInt("Video", "Width", video.width, IniName);
WritePrivateProfileInt("Video", "Height", video.height, IniName); WritePrivateProfileInt("Video", "Height", video.height, IniName);

View File

@ -1,22 +1,22 @@
/* Copyright (C) 2006 yopyop /* Copyright (C) 2006 yopyop
yopyop156@ifrance.com yopyop156@ifrance.com
yopyop156.ifrance.com yopyop156.ifrance.com
This file is part of DeSmuME This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
DeSmuME is distributed in the hope that it will be useful, DeSmuME is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "mapView.h" #include "mapView.h"
@ -32,12 +32,13 @@ using namespace GPU_EXT;
struct mapview_struct struct mapview_struct
{ {
u32 autoup_secs; u32 autoup_secs;
bool autoup; bool autoup;
u16 map; u16 map;
u16 lcd; u16 lcd;
u16 bitmap[1024*1024]; u16 bitmap[1024*1024];
bool clear;
void render() void render()
{ {
@ -72,105 +73,118 @@ LRESULT MapView_OnPaint(mapview_struct * win, HWND hwnd, WPARAM wParam, LPARAM l
{ {
Lock lock; Lock lock;
HDC hdc; HDC hdc;
PAINTSTRUCT ps; PAINTSTRUCT ps;
char text[80]; char text[80];
u32 dispcnt = ((volatile u32 *)ARM9Mem.ARM9_REG)[(win->lcd*0x400)]; u32 dispcnt = ((volatile u32 *)ARM9Mem.ARM9_REG)[(win->lcd*0x400)];
u32 bgcnt = ((volatile u16 *)ARM9Mem.ARM9_REG)[(8 + (win->map<<1) + (win->lcd*0x1000))>>1]; u32 bgcnt = ((volatile u16 *)ARM9Mem.ARM9_REG)[(8 + (win->map<<1) + (win->lcd*0x1000))>>1];
BITMAPV4HEADER bmi; BITMAPV4HEADER bmi;
u16 lg; u16 lg;
u16 ht; u16 ht;
BGxPARMS * parms; BGxPARMS * parms;
//CreateBitmapIndirect(&bmi); //CreateBitmapIndirect(&bmi);
memset(&bmi, 0, sizeof(bmi)); memset(&bmi, 0, sizeof(bmi));
bmi.bV4Size = sizeof(bmi); bmi.bV4Size = sizeof(bmi);
bmi.bV4Planes = 1; bmi.bV4Planes = 1;
bmi.bV4BitCount = 16; bmi.bV4BitCount = 16;
bmi.bV4V4Compression = BI_RGB|BI_BITFIELDS; bmi.bV4V4Compression = BI_RGB|BI_BITFIELDS;
bmi.bV4RedMask = 0x001F; bmi.bV4RedMask = 0x001F;
bmi.bV4GreenMask = 0x03E0; bmi.bV4GreenMask = 0x03E0;
bmi.bV4BlueMask = 0x7C00; bmi.bV4BlueMask = 0x7C00;
if(win->lcd) if(win->lcd)
{ {
lg = SubScreen.gpu->BGSize[win->map][0]; lg = SubScreen.gpu->BGSize[win->map][0];
ht = SubScreen.gpu->BGSize[win->map][1]; ht = SubScreen.gpu->BGSize[win->map][1];
} }
else else
{ {
lg = MainScreen.gpu->BGSize[win->map][0]; lg = MainScreen.gpu->BGSize[win->map][0];
ht = MainScreen.gpu->BGSize[win->map][1]; ht = MainScreen.gpu->BGSize[win->map][1];
} }
bmi.bV4Width = lg; bmi.bV4Width = lg;
bmi.bV4Height = -ht; bmi.bV4Height = -ht;
hdc = BeginPaint(hwnd, &ps);
sprintf(text, "%d %08X, %08X", (int)(dispcnt&7), (int)dispcnt, (int)bgcnt);
SetWindowText(GetDlgItem(hwnd, IDC_MODE), text);
if(!(bgcnt&(1<<7)))
sprintf(text, "normal 16");
else
{
if(!(dispcnt&(1<<30)))
sprintf(text, "normal 256");
else
{
switch(win->map)
{
case 0 :
sprintf(text, "extended slot %d", (bgcnt&(1<<13))?2:0);
break;
case 1 :
sprintf(text, "extended slot %d", (bgcnt&(1<<13))?3:1);
break;
default :
sprintf(text, "extended slot %d", MainScreen.gpu->BGExtPalSlot[win->map]);
break;
}
}
}
SetWindowText(GetDlgItem(hwnd, IDC_PAL), text);
sprintf(text, "%d", (int)(bgcnt&3));
SetWindowText(GetDlgItem(hwnd, IDC_PRIO), text);
hdc = BeginPaint(hwnd, &ps);
if((dispcnt>>8>>win->map)&1)
SetWindowText(GetDlgItem(hwnd, IDC_VISIBLE), "true"); sprintf(text, "%d %08X, %08X", (int)(dispcnt&7), (int)dispcnt, (int)bgcnt);
SetWindowText(GetDlgItem(hwnd, IDC_MODE), text);
if(!(bgcnt&(1<<7)))
sprintf(text, "normal 16");
else
{
if(!(dispcnt&(1<<30)))
sprintf(text, "normal 256");
else else
SetWindowText(GetDlgItem(hwnd, IDC_VISIBLE), "false"); {
switch(win->map)
sprintf(text, "0x%08X", (int)(0x6000000 + ((bgcnt>>2)&0xF)*0x4000 + win->lcd*0x200000 +((dispcnt>>24)&7)*0x10000)); {
SetWindowText(GetDlgItem(hwnd, IDC_CHAR), text); case 0 :
sprintf(text, "extended slot %d", (bgcnt&(1<<13))?2:0);
sprintf(text, "0x%08X", (int)(0x6000000 + 0x800*((bgcnt>>8)&0x1F) + win->lcd*0x200000 + ((dispcnt>>27)&7)*0x10000)); break;
SetWindowText(GetDlgItem(hwnd, IDC_SCR), text); case 1 :
sprintf(text, "extended slot %d", (bgcnt&(1<<13))?3:1);
//sprintf(text, "%d x %d", MainScreen.gpu->BGPA[win->map], MainScreen.gpu->BGPB[win->map]); break;
sprintf(text, "%d x %d", (int)MainScreen.gpu->BGSize[win->map][0], (int)MainScreen.gpu->BGSize[win->map][1]); default :
SetWindowText(GetDlgItem(hwnd, IDC_MSIZE), text); sprintf(text, "extended slot %d", MainScreen.gpu->BGExtPalSlot[win->map]);
break;
if (win->map==2) { }
parms = &(MainScreen.gpu->dispx_st)->dispx_BG2PARMS;
} else {
parms = &(MainScreen.gpu->dispx_st)->dispx_BG3PARMS;
} }
sprintf(text, "%d x %d", parms->BGxPC, parms->BGxPD); }
SetWindowText(GetDlgItem(hwnd, IDC_SCROLL), text); SetWindowText(GetDlgItem(hwnd, IDC_PAL), text);
for(int i = 0; i < (1024*1024); i++)
win->bitmap[i] = 0x7C1F;
win->render(); sprintf(text, "%d", (int)(bgcnt&3));
SetWindowText(GetDlgItem(hwnd, IDC_PRIO), text);
SetDIBitsToDevice(hdc, 200, 4, lg, ht, 0, 0, 0, ht, win->bitmap, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
EndPaint(hwnd, &ps);
return 0; if((dispcnt>>8>>win->map)&1)
SetWindowText(GetDlgItem(hwnd, IDC_VISIBLE), "true");
else
SetWindowText(GetDlgItem(hwnd, IDC_VISIBLE), "false");
sprintf(text, "0x%08X", (int)(0x6000000 + ((bgcnt>>2)&0xF)*0x4000 + win->lcd*0x200000 +((dispcnt>>24)&7)*0x10000));
SetWindowText(GetDlgItem(hwnd, IDC_CHAR), text);
sprintf(text, "0x%08X", (int)(0x6000000 + 0x800*((bgcnt>>8)&0x1F) + win->lcd*0x200000 + ((dispcnt>>27)&7)*0x10000));
SetWindowText(GetDlgItem(hwnd, IDC_SCR), text);
//sprintf(text, "%d x %d", MainScreen.gpu->BGPA[win->map], MainScreen.gpu->BGPB[win->map]);
sprintf(text, "%d x %d", (int)MainScreen.gpu->BGSize[win->map][0], (int)MainScreen.gpu->BGSize[win->map][1]);
SetWindowText(GetDlgItem(hwnd, IDC_MSIZE), text);
if (win->map==2) {
parms = &(MainScreen.gpu->dispx_st)->dispx_BG2PARMS;
} else {
parms = &(MainScreen.gpu->dispx_st)->dispx_BG3PARMS;
}
sprintf(text, "%d x %d", parms->BGxPC, parms->BGxPD);
SetWindowText(GetDlgItem(hwnd, IDC_SCROLL), text);
for(int i = 0; i < ARRAY_SIZE(win->bitmap); i++)
win->bitmap[i] = 0x7C1F;
win->render();
if(win->clear)
{
RECT r;
r.left = 200;
r.top = 4;
r.right = 200 + 1024;
r.bottom = 200 + 1024;
HBRUSH brush = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
FillRect(hdc, &r, brush);
DeleteObject(brush);
win->clear = false;
}
SetDIBitsToDevice(hdc, 200, 4, lg, ht, 0, 0, 0, ht, win->bitmap, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
EndPaint(hwnd, &ps);
return 0;
} }
BOOL CALLBACK ViewMapsProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) BOOL CALLBACK ViewMapsProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
@ -180,119 +194,121 @@ BOOL CALLBACK ViewMapsProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara
return false; return false;
switch (message) switch (message)
{ {
case WM_INITDIALOG : case WM_INITDIALOG :
{ {
MapView = new mapview_struct; MapView = new mapview_struct;
memset(MapView, 0, sizeof(MapView)); memset(MapView, 0, sizeof(MapView));
MapView->autoup_secs = 1; MapView->clear = true;
SendMessage(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN), MapView->autoup_secs = 1;
UDM_SETRANGE, 0, MAKELONG(99, 1)); SendMessage(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN),
SendMessage(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN), UDM_SETRANGE, 0, MAKELONG(99, 1));
UDM_SETPOS32, 0, MapView->autoup_secs); SendMessage(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN),
HWND combo = GetDlgItem(hwnd, IDC_BG_SELECT); UDM_SETPOS32, 0, MapView->autoup_secs);
SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Main BackGround 0"); HWND combo = GetDlgItem(hwnd, IDC_BG_SELECT);
SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Main BackGround 1"); SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Main BackGround 0");
SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Main BackGround 2"); SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Main BackGround 1");
SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Main BackGround 3"); SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Main BackGround 2");
SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Sub BackGround 0"); SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Main BackGround 3");
SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Sub BackGround 1"); SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Sub BackGround 0");
SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Sub BackGround 2"); SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Sub BackGround 1");
SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Sub BackGround 3"); SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Sub BackGround 2");
SendMessage(combo, CB_SETCURSEL, 0, 0); SendMessage(combo, CB_ADDSTRING, 0,(LPARAM)"Sub BackGround 3");
} SendMessage(combo, CB_SETCURSEL, 0, 0);
return 1; }
case WM_CLOSE : return 1;
case WM_CLOSE :
{
if(MapView->autoup)
{ {
if(MapView->autoup) KillTimer(hwnd, IDT_VIEW_MAP);
{ MapView->autoup = false;
KillTimer(hwnd, IDT_VIEW_MAP);
MapView->autoup = false;
}
if (MapView!=NULL)
{
delete MapView;
MapView = NULL;
}
//INFO("Close Map view dialog\n");
PostQuitMessage(0);
return 0;
} }
case WM_PAINT: if (MapView!=NULL)
MapView_OnPaint(MapView, hwnd, wParam, lParam); {
return 1; delete MapView;
case WM_TIMER: MapView = NULL;
SendMessage(hwnd, WM_COMMAND, IDC_REFRESH, 0); }
//INFO("Close Map view dialog\n");
PostQuitMessage(0);
return 0;
}
case WM_PAINT:
MapView_OnPaint(MapView, hwnd, wParam, lParam);
return 1;
case WM_TIMER:
SendMessage(hwnd, WM_COMMAND, IDC_REFRESH, 0);
return 1;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDC_FERMER :
SendMessage(hwnd, WM_CLOSE, 0, 0);
return 1;
case IDC_AUTO_UPDATE :
if(MapView->autoup)
{
EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SECS), false);
EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN), false);
KillTimer(hwnd, IDT_VIEW_MAP);
MapView->autoup = FALSE;
return 1; return 1;
case WM_COMMAND : }
switch (LOWORD (wParam)) EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SECS), true);
{ EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN), true);
case IDC_FERMER : MapView->autoup = TRUE;
SendMessage(hwnd, WM_CLOSE, 0, 0); SetTimer(hwnd, IDT_VIEW_MAP, MapView->autoup_secs*20, (TIMERPROC) NULL);
return 1; return 1;
case IDC_AUTO_UPDATE : case IDC_AUTO_UPDATE_SECS:
if(MapView->autoup) {
{ int t = GetDlgItemInt(hwnd, IDC_AUTO_UPDATE_SECS, FALSE, TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SECS), false); if (!MapView)
EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN), false); {
KillTimer(hwnd, IDT_VIEW_MAP); SendMessage(hwnd, WM_INITDIALOG, 0, 0);
MapView->autoup = FALSE; }
return 1; if (t != MapView->autoup_secs)
} {
EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SECS), true); MapView->autoup_secs = t;
EnableWindow(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN), true); if (MapView->autoup)
MapView->autoup = TRUE; SetTimer(hwnd, IDT_VIEW_MAP,
SetTimer(hwnd, IDT_VIEW_MAP, MapView->autoup_secs*20, (TIMERPROC) NULL); MapView->autoup_secs*20, (TIMERPROC) NULL);
return 1; }
case IDC_AUTO_UPDATE_SECS: }
{ return 1;
int t = GetDlgItemInt(hwnd, IDC_AUTO_UPDATE_SECS, FALSE, TRUE); case IDC_REFRESH:
if (!MapView) InvalidateRect(hwnd, NULL, FALSE);
{ return 1;
SendMessage(hwnd, WM_INITDIALOG, 0, 0); case IDC_BG_SELECT :
} switch(HIWORD(wParam))
if (t != MapView->autoup_secs) {
{ case CBN_SELCHANGE :
MapView->autoup_secs = t; case CBN_CLOSEUP :
if (MapView->autoup) {
SetTimer(hwnd, IDT_VIEW_MAP, u32 sel= SendMessage(GetDlgItem(hwnd, IDC_BG_SELECT), CB_GETCURSEL, 0, 0);
MapView->autoup_secs*20, (TIMERPROC) NULL); switch(sel)
} {
} case 0 :
return 1; case 1 :
case IDC_REFRESH: case 2 :
InvalidateRect(hwnd, NULL, FALSE); case 3 :
return 1; MapView->map = sel;
case IDC_BG_SELECT : MapView->lcd = 0;
switch(HIWORD(wParam)) break;
{ case 4 :
case CBN_SELCHANGE : case 5 :
case CBN_CLOSEUP : case 6 :
{ case 7 :
u32 sel= SendMessage(GetDlgItem(hwnd, IDC_BG_SELECT), CB_GETCURSEL, 0, 0); MapView->map = sel-4;
switch(sel) MapView->lcd = 1;
{ break;
case 0 : }
case 1 : }
case 2 : MapView->clear = true;
case 3 : InvalidateRect(hwnd, NULL, FALSE);
MapView->map = sel; return 1;
MapView->lcd = 0; }//switch et case
break; }//switch
case 4 : return 1;
case 5 : }
case 6 :
case 7 :
MapView->map = sel-4;
MapView->lcd = 1;
break;
}
}
InvalidateRect(hwnd, NULL, FALSE);
return 1;
}//switch et case
}//switch
return 1;
}
return false; return false;
} }