Simulate the VGA vertical refresh.
This commit is contained in:
parent
5e144868d7
commit
194cfed110
|
@ -21,7 +21,7 @@ static IDirectDrawPalette *lpddpal;
|
||||||
static DDSURFACEDESC sdesc;
|
static DDSURFACEDESC sdesc;
|
||||||
static WORD poll_timer;
|
static WORD poll_timer;
|
||||||
static CRITICAL_SECTION vga_crit;
|
static CRITICAL_SECTION vga_crit;
|
||||||
static int vga_polling;
|
static int vga_polling,vga_refresh;
|
||||||
|
|
||||||
int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth)
|
int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth)
|
||||||
{
|
{
|
||||||
|
@ -47,6 +47,7 @@ int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth)
|
||||||
lpddraw=NULL;
|
lpddraw=NULL;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
vga_refresh=0;
|
||||||
InitializeCriticalSection(&vga_crit);
|
InitializeCriticalSection(&vga_crit);
|
||||||
/* poll every 20ms (50fps should provide adequate responsiveness) */
|
/* poll every 20ms (50fps should provide adequate responsiveness) */
|
||||||
poll_timer = CreateSystemTimer( 20, (FARPROC16)VGA_Poll );
|
poll_timer = CreateSystemTimer( 20, (FARPROC16)VGA_Poll );
|
||||||
|
@ -141,6 +142,7 @@ void VGA_Poll(void)
|
||||||
for (X=0; X<Width; X++) if (dat[X]) TRACE(ddraw,"data(%d) at (%d,%d)\n",dat[X],X,Y);
|
for (X=0; X<Width; X++) if (dat[X]) TRACE(ddraw,"data(%d) at (%d,%d)\n",dat[X],X,Y);
|
||||||
}
|
}
|
||||||
VGA_Unlock();
|
VGA_Unlock();
|
||||||
|
vga_refresh=1;
|
||||||
EnterCriticalSection(&vga_crit);
|
EnterCriticalSection(&vga_crit);
|
||||||
vga_polling--;
|
vga_polling--;
|
||||||
}
|
}
|
||||||
|
@ -161,5 +163,25 @@ void VGA_ioport_out( WORD port, BYTE val )
|
||||||
VGA_SetPalette(&paldat,palreg,1);
|
VGA_SetPalette(&paldat,palreg,1);
|
||||||
palreg++;
|
palreg++;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BYTE VGA_ioport_in( WORD port )
|
||||||
|
{
|
||||||
|
BYTE ret;
|
||||||
|
|
||||||
|
switch (port) {
|
||||||
|
case 0x3da:
|
||||||
|
/* since we don't (yet?) serve DOS VM requests while VGA_Poll is running,
|
||||||
|
we need to fake the occurrence of the vertical refresh */
|
||||||
|
if (lpddraw) {
|
||||||
|
ret=vga_refresh?0x00:0x08;
|
||||||
|
vga_refresh=0;
|
||||||
|
} else ret=0x08;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret=0xff;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -19,5 +19,6 @@ LPSTR VGA_Lock(unsigned*Pitch,unsigned*Height,unsigned*Width,unsigned*Depth);
|
||||||
void VGA_Unlock(void);
|
void VGA_Unlock(void);
|
||||||
void VGA_Poll(void);
|
void VGA_Poll(void);
|
||||||
void VGA_ioport_out(WORD port, BYTE val);
|
void VGA_ioport_out(WORD port, BYTE val);
|
||||||
|
BYTE VGA_ioport_in(WORD port);
|
||||||
|
|
||||||
#endif /* __WINE_VGA_H */
|
#endif /* __WINE_VGA_H */
|
||||||
|
|
|
@ -239,6 +239,9 @@ DWORD IO_inport( int port, int count )
|
||||||
case 0x201:
|
case 0x201:
|
||||||
b = 0xff; /* no joystick */
|
b = 0xff; /* no joystick */
|
||||||
break;
|
break;
|
||||||
|
case 0x3da:
|
||||||
|
b = VGA_ioport_in( port );
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
WARN( int, "Direct I/O read attempted from port %x\n", port);
|
WARN( int, "Direct I/O read attempted from port %x\n", port);
|
||||||
b = 0xff;
|
b = 0xff;
|
||||||
|
|
Loading…
Reference in New Issue