here is my main.cpp from my direct x project. moving the bitmap left and right works good, but it still doesn't move up and down. someone look at this and tell me whats wrong? (i only included the important parts.

Code:
enum Actions 
{
	ACTIONS_LEFTRIGHT,
	ACTIONS_UPDOWN,
	ACTIONS_LEFT,
	ACTIONS_RIGHT,
	ACTIONS_UP,
	ACTIONS_DOWN,
	ACTIONS_QUIT,
	ACTIONS_HELP,
	ACTIONS_CONFIGURE,
	ACTIONS_MUSIC,
	ACTIONS_PAUSE,
	ACTIONS_NONE
};

bool	g_bQuit, g_bShowHelp, g_bPaused, g_bDoConfig;
bool	g_bLeft, g_bRight, g_bUp, g_bDown;

DIACTION g_rgActions[] =
{
	// Genre-defined virtual axes
	{ ACTIONS_LEFTRIGHT,	DIAXIS_ARCADES_LATERAL,				0,	"Left/Right" },
	{ ACTIONS_UPDOWN,		DIAXIS_ARCADES_MOVE,				0,	"Up/Down" },

	// Genre-defined virtual buttons
	{ ACTIONS_LEFT,			DIBUTTON_ARCADES_LEFT_LINK,			0,	"Left" },
	{ ACTIONS_RIGHT,		DIBUTTON_ARCADES_RIGHT_LINK,		0,	"Right" },
	{ ACTIONS_UP,			DIBUTTON_ARCADES_FORWARD_LINK,		0,	"Up" },
	{ ACTIONS_DOWN,			DIBUTTON_ARCADES_BACK_LINK,			0,	"Down" },
	{ ACTIONS_PAUSE,		DIBUTTON_ARCADES_PAUSE,				0,	"Pause" },

	// Keys
	{ ACTIONS_LEFT,			DIKEYBOARD_LEFT,					0,	"Left" },
	{ ACTIONS_LEFT,			DIKEYBOARD_NUMPAD4,					0,	"Left" },
	{ ACTIONS_RIGHT,		DIKEYBOARD_RIGHT,					0,	"Right" },
	{ ACTIONS_RIGHT,		DIKEYBOARD_NUMPAD6,					0,	"Right" },
	{ ACTIONS_UP,			DIKEYBOARD_UP,						0,	"Up" },
	{ ACTIONS_UP,			DIKEYBOARD_NUMPAD8,					0,	"Up" },
	{ ACTIONS_DOWN,			DIKEYBOARD_DOWN,					0,	"Down" },
	{ ACTIONS_DOWN,			DIKEYBOARD_NUMPAD2,					0,	"Down" },
	{ ACTIONS_PAUSE,		DIKEYBOARD_P,			DIA_APPFIXED,	"Pause" },
	{ ACTIONS_MUSIC,		DIKEYBOARD_M,			DIA_APPFIXED,	"Music on/off" },
	{ ACTIONS_HELP,			DIKEYBOARD_F1,			DIA_APPFIXED,	"Help" },
	{ ACTIONS_CONFIGURE,	DIKEYBOARD_F2,			DIA_APPFIXED,	"Configure" },
	{ ACTIONS_QUIT,			DIKEYBOARD_ESCAPE,		DIA_APPFIXED,	"Quit" },
};

//skip all this blah blah

void HandleAction(UINT nAction, DWORD dwData)
{
	int	nAxisPos = (int)dwData;

	switch (nAction)
	{
	case ACTIONS_LEFTRIGHT:
		if (nAxisPos < -AXIS_THRESHOLD)
		{
			g_bLeft = true;
			g_bRight = false;
		}
		else if (nAxisPos > AXIS_THRESHOLD)
		{
			g_bRight = true;
			g_bLeft = false;
		}
		else
		{
			g_bLeft = g_bRight = false;
		}
		break;

	case ACTIONS_UPDOWN:
		if (nAxisPos < -AXIS_THRESHOLD)
		{
			g_bUp = true;
			g_bDown = false;
		}
		else if (nAxisPos > AXIS_THRESHOLD)
		{
			g_bDown = true;
			g_bUp = false;
		}
		else
		{
			g_bUp = g_bDown = false;
		}
		break;
	
	case ACTIONS_LEFT:
		g_bLeft = (dwData != 0);
		break;

	case ACTIONS_RIGHT:
		g_bRight = (dwData != 0);
		break;

	case ACTIONS_UP:
		g_bUp = (dwData != 0);
		break;

	case ACTIONS_DOWN:
		g_bDown = (dwData != 0);
		break;

	case ACTIONS_PAUSE:
		if(dwData != 0)
			g_bPaused = !g_bPaused;
		break;

	case ACTIONS_QUIT:
		g_bQuit = true;
		break;
	
	default:
		break;
	}
}

////////////////////////////////////////////////////////////////////////////////
// Idle-time processing function.

void OnIdle(void)
{
    if (g_lpPrimary == NULL)
        return;

    if (!g_bActive)
        return;

    CheckInput();

    if (g_bQuit)
    {
        PostMessage(hWndMain, WM_CLOSE, 0, 0);
        return;
    }

    RECT    r;
    
    // Draw the background to the screen.
    r.left = 0;
    r.top = 0;
    r.right = 640;
    r.bottom = 480;
    BackBlt(0, 0, lpA, &r, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);

    // Move a sprite around with the input.
    static int xSprite;
	static int ySprite;

	if(!g_bPaused)
	{
        if (g_bLeft)
            xSprite--;
        if (g_bRight)
            xSprite++;
	    if (g_bUp)
		    ySprite--;
	    if(g_bDown)
		    ySprite++;

        r.left = 64;
        r.right = 128;
        r.top = 0;
        r.bottom = 64;

        BackBlt(288 + xSprite, 150 + ySprite, lpSprites, &r, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT); 

        g_lpPrimary->Flip(NULL, DDFLIP_WAIT);
	}
}