better frame advancing. debugger window no longer opens itsself.

This commit is contained in:
zeromus 2008-05-09 04:00:04 +00:00
parent 7720f71ffa
commit 84274fe6d6
8 changed files with 97 additions and 55 deletions

View File

@ -276,8 +276,12 @@ void FCEUI_FDSSelect(void);
int FCEUI_DatachSet(const uint8 *rcode);
///returns flags indicating whether emulation is paused (bit0) and whether it is single-stepping (bit1)
///returns a flag indicating whether emulation is paused
int FCEUI_EmulationPaused(void);
///returns a flag indicating whether a one frame step has been requested
int FCEUI_EmulationFrameStepped();
///clears the framestepped flag. use it after youve stepped your one frame
void FCEUI_ClearEmulationFrameStepped();
///sets the EmulationPaused flags
void FCEUI_SetEmulationPaused(int val);
///toggles the paused bit (bit0) for EmulationPaused. caused FCEUD_DebugUpdate() to fire if the emulation pauses

View File

@ -476,20 +476,19 @@ void UpdateRegs(HWND hwndDlg) {
///indicates whether we're under the control of the debugger
bool inDebugger = false;
void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count); //HACK
//this code enters the debugger.
void FCEUD_DebugBreakpoint() {
inDebugger = true;
DoDebug(1);
UpdateLogWindow();
if(hMemView)UpdateMemoryView(0);
//mbg merge 6/30/06 - this architecture has changed
FCEUD_Update(0,0,0);
//FCEUD_BlitScreen(XBuf+8); //this looks odd, I know. but the pause routine is in here!!
//if(logging)LogInstruction(); //logging might have been started while we were paused
inDebugger = false;
UpdateDebugger();
void win_debuggerLoop(); //HACK
win_debuggerLoop();
}
void UpdateDebugger() {
void UpdateDebugger()
{
//dont do anything if the debugger is not visible
if(!hDebug)
return;
char str[256]={0},chr[8];
int tmp,ret,i;

View File

@ -129,8 +129,8 @@ int NoWaiting=0;
bool turbo = false;
#include "keyscan.h"
static unsigned char *keys=0;
static unsigned char *keys_nr=0;
static unsigned int *keys=0;
static unsigned int *keys_nr=0;
static int DIPS=0;
//#define KEY(__a) keys_nr[MKK(__a)]
@ -1404,7 +1404,8 @@ int FCEUD_TestCommandState(int c)
// else
// keys_nr=GetKeyboard_nr();
}
else if(c != EMUCMD_SPEED_TURBO) // TODO: this should be made more general by detecting if the command has an "off" function, but right now Turbo is the only command that has it
else
if(c != EMUCMD_SPEED_TURBO) // TODO: this should be made more general by detecting if the command has an "off" function, but right now Turbo is the only command that has it
{
keys=GetKeyboard_jd();
keys_nr=GetKeyboard_nr();

View File

@ -34,14 +34,16 @@ void KeyboardClose(void)
lpdid=0;
}
static unsigned char keys[256] = {0,}; // with repeat
static unsigned char keys_nr[256] = {0,}; // non-repeating
static unsigned char keys_jd[256] = {0,}; // just-down
static unsigned char keys_jd_lock[256] = {0,}; // just-down released lock
static unsigned int keys[256] = {0,}; // with repeat
static unsigned int keys_nr[256] = {0,}; // non-repeating
static unsigned int keys_jd[256] = {0,}; // just-down
static unsigned int keys_jd_lock[256] = {0,}; // just-down released lock
int autoHoldKey = 0, autoHoldClearKey = 0;
int ctr=0;
void KeyboardUpdateState(void)
{
unsigned char tk[256];
printf("%d!!\n",ctr++);
ddrval=IDirectInputDevice7_GetDeviceState(lpdid,256,tk);
@ -49,6 +51,8 @@ void KeyboardUpdateState(void)
if(GetAsyncKeyState(VK_PAUSE)) // normally this should have & 0x8000, but apparently this key is too special for that to work
tk[0xC5] = 0x80;
DWORD time = timeGetTime();
switch(ddrval)
{
case DI_OK: //memcpy(keys,tk,256);break;
@ -64,16 +68,16 @@ void KeyboardUpdateState(void)
#define KEY_JUST_DOWN_DURATION (4) // must be >= 1 and <= 255
int i;
for(i = 0 ; i < 256 ; i++)
if(tk[i])
if(keys_nr[i] < 255)
keys_nr[i]++; // activate key, and count up for repeat
else
keys_nr[i] = 255 - KEY_REPEAT_REPEATING_DELAY; // oscillate for repeat
else
keys_nr[i] = 0; // deactivate key
memcpy(keys,keys_nr,256);
for(i = 0 ; i < 256 ; i++)
if(tk[i]) {
if(keys_nr[i] == 0)
keys_nr[i] = time;
}
else
keys_nr[i] = 0;
memcpy(keys,keys_nr,256*4);
// key-down detection
for(i = 0 ; i < 256 ; i++)
@ -87,18 +91,18 @@ void KeyboardUpdateState(void)
else if(keys_jd[i]
/*&& (i != 0x2A && i != 0x36 && i != 0x1D && i != 0x38)*/)
{
if(++keys_jd[i] > KEY_JUST_DOWN_DURATION)
if(time - keys_jd[i] > KEY_JUST_DOWN_DURATION)
{
keys_jd[i] = 0;
keys_jd_lock[i] = 1;
}
}
else
keys_jd[i] = 1;
keys_jd[i] = time;
// key repeat
for(i = 0 ; i < 256 ; i++)
if(keys[i] >= KEY_REPEAT_INITIAL_DELAY && !(keys[i]%KEY_REPEAT_REPEATING_DELAY))
if(time - keys[i] >= KEY_REPEAT_INITIAL_DELAY && !((time-keys[i])%KEY_REPEAT_REPEATING_DELAY))
keys[i] = 0;
}
break;
@ -106,7 +110,7 @@ void KeyboardUpdateState(void)
case DIERR_INPUTLOST:
case DIERR_NOTACQUIRED:
memset(keys,0,256);
memset(keys,0,256*4);
IDirectInputDevice7_Acquire(lpdid);
break;
}
@ -116,15 +120,15 @@ void KeyboardUpdateState(void)
autoHoldReset = autoHoldClearKey && keys[autoHoldClearKey] != 0;
}
unsigned char *GetKeyboard(void)
unsigned int *GetKeyboard(void)
{
return(keys);
}
unsigned char *GetKeyboard_nr(void)
unsigned int *GetKeyboard_nr(void)
{
return(keys_nr);
}
unsigned char *GetKeyboard_jd(void)
unsigned int *GetKeyboard_jd(void)
{
return(keys_jd);
}

View File

@ -1,7 +1,7 @@
void KeyboardClose(void);
int KeyboardInitialize(void);
void KeyboardUpdate(void);
unsigned char *GetKeyboard(void);
unsigned char *GetKeyboard_nr(void);
unsigned char *GetKeyboard_jd(void);
unsigned int *GetKeyboard(void);
unsigned int *GetKeyboard_nr(void);
unsigned int *GetKeyboard_jd(void);
int KeyboardSetBackgroundAccess(int on);

View File

@ -710,7 +710,6 @@ doloopy:
void _updateWindow()
{
UpdateFCEUWindow();
FCEUD_UpdateInput();
PPUViewDoBlit();
UpdateMemoryView(0);
UpdateCDLogger();
@ -921,9 +920,20 @@ void _updateWindow()
// } // end of !(old sound code) block
//}
/**
* Update the game and gamewindow with a new frame
**/
void win_debuggerLoop()
{
//delay until something causes us to unpause.
//either a hotkey or a debugger command
while(FCEUI_EmulationPaused() && !FCEUI_EmulationFrameStepped())
{
Sleep(50);
FCEUD_UpdateInput();
_updateWindow();
}
int zzz=9;
}
// Update the game and gamewindow with a new frame
void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count)
{
//mbg merge 7/19/06 - leaving this untouched but untested
@ -960,6 +970,7 @@ void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count)
//update debugging displays
_updateWindow();
//MBG TODO - think about this logic
//throttle
extern bool turbo; //needs to be declared better
if(!(eoptions&EO_NOTHROTTLE)) //if throttling is enabled..
@ -968,22 +979,32 @@ void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count)
//then throttle
win_Throttle();
//delay until we unpause. we will only stick here if we're paused by a breakpoint or debug command
while(FCEUI_EmulationPaused() && inDebugger)
{
//sleep just to be polite
if(FCEUI_EmulationPaused()) {
Sleep(50);
BlockingCheck();
FCEUD_UpdateInput(); //should this update the CONTROLS??? or only the hotkeys etc?
}
//something of a hack, but straightforward:
//if we were paused, but not in the debugger, then unpause ourselves and step.
//this is so that the cpu won't cut off execution due to being paused, but the debugger _will_
//cut off execution as soon as it makes it into the main cpu cycle loop
if(FCEUI_EmulationPaused() && !inDebugger) {
FCEUI_ToggleEmulationPause();
FCEUI_Debugger().step = 1;
}
//while(EmulationPaused==1 && inDebugger)
//{
// Sleep(50);
// BlockingCheck();
// FCEUD_UpdateInput(); //should this update the CONTROLS??? or only the hotkeys etc?
//}
////so, we're not paused anymore.
////something of a hack, but straightforward:
////if we were paused, but not in the debugger, then unpause ourselves and step.
////this is so that the cpu won't cut off execution due to being paused, but the debugger _will_
////cut off execution as soon as it makes it into the main cpu cycle loop
//if(FCEUI_EmulationPaused() && !inDebugger) {
// FCEUI_ToggleEmulationPause();
// FCEUI_Debugger().step = 1;
// FCEUD_DebugBreakpoint();
//}
//make sure to update the input once per frame
FCEUD_UpdateInput();
// if(soundo) //&& temp_fps_scale >= 64

View File

@ -85,7 +85,7 @@ static struct
#define NUM_DEFAULT_MAPPINGS (sizeof(DefaultCommandMapping)/sizeof(DefaultCommandMapping[0]))
static uint8 keyonce[MKK_COUNT];
static unsigned char *keys_nr = 0;
static unsigned int *keys_nr = 0;
static const char* ScanNames[256]=
{

View File

@ -263,6 +263,7 @@ static void CloseGame(void)
void ResetGameLoaded(void)
{
if(GameInfo) CloseGame();
EmulationPaused = 0; //mbg 5/8/08 - loading games while paused was bad news. maybe this fixes it
GameStateRestore=0;
PPU_hook=0;
GameHBIRQHook=0;
@ -510,6 +511,8 @@ void FCEUI_Emulate(uint8 **pXBuf, int32 **SoundBuf, int32 *SoundBufSize, int ski
*SoundBuf=WaveFinal;
*SoundBufSize=ssize;
//if we were asked to frame advance, then since we have just finished
//a frame, we should switch to regular pause
if(EmulationPaused&2)
{
EmulationPaused = 1; // restore paused flag
@ -735,7 +738,17 @@ int32 FCEUI_GetDesiredFPS(void)
int FCEUI_EmulationPaused(void)
{
return (EmulationPaused&1);
return (EmulationPaused&1);
}
int FCEUI_EmulationFrameStepped()
{
return (EmulationPaused&2);
}
void FCEUI_ClearEmulationFrameStepped()
{
EmulationPaused &=~2;
}
//mbg merge 7/18/06 added