📄 vga_gu1.c
字号:
/* SET PROPER COLOR DEPTH VALUE */
/* CRTC_EXTENDED_COLOR_CONTROL index is 0x46, so offset = 0x06 */
switch(bpp)
{
case 15:
vga->extCRTCregs[0x06] = CRTC_BIT_16BPP | CRTC_BIT_555;
break;
case 16:
vga->extCRTCregs[0x06] = CRTC_BIT_16BPP;
break;
default:
vga->extCRTCregs[0x06] = 0;
break;
}
return(GFX_STATUS_OK);
}
}
return(GFX_STATUS_UNSUPPORTED);
}
/*-----------------------------------------------------------------------------
* gfx_vga_pitch
*
* This routine updates the VGA regisers in the specified VGA structure for
* the specified pitch. It does not program the hardware.
*-----------------------------------------------------------------------------
*/
int gfx_vga_pitch(gfx_vga_struct *vga, unsigned short pitch)
{
pitch >>= 3;
vga->stdCRTCregs[0x13] = (unsigned char) pitch;
vga->extCRTCregs[0x05] = ((pitch >> 8) & 0x03);
return(0);
}
/*-----------------------------------------------------------------------------
* gfx_vga_save
*
* This routine saves the state of the VGA registers into the specified
* structure. Flags indicate what portions of the register state need to
* be saved.
*-----------------------------------------------------------------------------
*/
int gfx_vga_save(gfx_vga_struct *vga, int flags)
{
int i;
unsigned short crtcindex, crtcdata;
crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
crtcdata = crtcindex + 1;
/* CHECK MISCELLANEOUS OUTPUT FLAG */
if (flags & GFX_VGA_FLAG_MISC_OUTPUT)
{
/* SAVE MISCCELLANEOUS OUTPUT REGISTER */
vga->miscOutput = INB(0x3CC);
}
/* CHECK STANDARD CRTC FLAG */
if (flags & GFX_VGA_FLAG_STD_CRTC)
{
/* SAVE STANDARD CRTC REGISTERS */
for (i = 0; i < GFX_STD_CRTC_REGS; i++)
{
OUTB(crtcindex, (unsigned char) i);
vga->stdCRTCregs[i] = INB(crtcdata);
}
}
/* CHECK EXTENDED CRTC FLAG */
if (flags & GFX_VGA_FLAG_EXT_CRTC)
{
/* SAVE EXTENDED CRTC REGISTERS */
for (i = 0; i < GFX_EXT_CRTC_REGS; i++)
{
OUTB(crtcindex, (unsigned char) (0x40+i));
vga->extCRTCregs[i] = INB(crtcdata);
}
}
return(0);
}
/*-----------------------------------------------------------------------------
* gfx_vga_clear_extended
*
* This routine clears the extended SoftVGA register values to have SoftVGA
* behave like standard VGA.
*-----------------------------------------------------------------------------
*/
void gfx_vga_clear_extended(void)
{
int i;
unsigned short crtcindex, crtcdata;
crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
crtcdata = crtcindex + 1;
OUTB(crtcindex, 0x30);
OUTB(crtcdata, 0x57);
OUTB(crtcdata, 0x4C);
for (i = 0x40; i <= 0x4F; i++)
{
OUTB(crtcindex, (unsigned char) i);
OUTB(crtcdata, 0);
}
OUTB(crtcindex, 0x30);
OUTB(crtcdata, 0x00);
}
/*-----------------------------------------------------------------------------
* gfx_vga_restore
*
* This routine restores the state of the VGA registers from the specified
* structure. Flags indicate what portions of the register state need to
* be saved.
*-----------------------------------------------------------------------------
*/
int gfx_vga_restore(gfx_vga_struct *vga, int flags)
{
int i;
unsigned short crtcindex, crtcdata;
crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
crtcdata = crtcindex + 1;
/* CHECK MISCELLANEOUS OUTPUT FLAG */
if (flags & GFX_VGA_FLAG_MISC_OUTPUT)
{
/* RESTORE MISCELLANEOUS OUTPUT REGISTER VALUE */
OUTB(0x3C2, vga->miscOutput);
}
/* CHECK STANDARD CRTC FLAG */
if (flags & GFX_VGA_FLAG_STD_CRTC)
{
/* UNLOCK STANDARD CRTC REGISTERS */
OUTB(crtcindex, 0x11);
OUTB(crtcdata, 0);
/* RESTORE STANDARD CRTC REGISTERS */
for (i = 0; i < GFX_STD_CRTC_REGS; i++)
{
OUTB(crtcindex, (unsigned char) i);
OUTB(crtcdata, vga->stdCRTCregs[i]);
}
}
/* CHECK EXTENDED CRTC FLAG */
if (flags & GFX_VGA_FLAG_EXT_CRTC)
{
/* UNLOCK EXTENDED CRTC REGISTERS */
OUTB(crtcindex, 0x30);
OUTB(crtcdata, 0x57);
OUTB(crtcdata, 0x4C);
/* RESTORE EXTENDED CRTC REGISTERS */
for (i = 0; i < GFX_EXT_CRTC_REGS; i++)
{
OUTB(crtcindex, (unsigned char) (0x40+i));
OUTB(crtcdata, vga->extCRTCregs[i]);
}
/* LOCK EXTENDED CRTC REGISTERS */
OUTB(crtcindex, 0x30);
OUTB(crtcdata, 0x00);
/* CHECK IF DIRECT FRAME BUFFER MODE (VESA MODE) */
if (vga->extCRTCregs[0x03] & 1)
{
/* SET BORDER COLOR TO BLACK */
/* This really should be another thing saved/restored, but */
/* Durango currently doesn't do the attr controller registers. */
INB(0x3BA); /* Reset flip-flop */
INB(0x3DA);
OUTB(0x3C0, 0x31);
OUTB(0x3C0, 0x00);
}
}
return(0);
}
/*-----------------------------------------------------------------------------
* gfx_vga_mode_switch
*
* This routine programs the SoftVGA register to indicate that a mode switch
* is in progress. This results in a cleaner mode switch since SoftVGA will
* not validate the hardware with intermediate values.
*-----------------------------------------------------------------------------
*/
int gfx_vga_mode_switch(int active)
{
unsigned short crtcindex, crtcdata;
crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
crtcdata = crtcindex + 1;
/* UNLOCK EXTENDED CRTC REGISTERS */
OUTB(crtcindex, CRTC_EXTENDED_REGISTER_LOCK);
OUTB(crtcdata, 0x57);
OUTB(crtcdata, 0x4C);
/* SIGNAL THE BEGINNING OR END OF THE MODE SWITCH
/* SoftVGA will hold off validating the back end hardware. */
OUTB(crtcindex, CRTC_MODE_SWITCH_CONTROL);
active = active ? 1 : 0;
OUTB(crtcdata, (unsigned char) active);
/* WAIT UNTIL SOFTVGA HAS VALIDATED MODE IF ENDING MODE SWITCH */
/* This is for VSA1 only, where SoftVGA waits until the next */
/* vertical blank to validate the hardware state. */
if ((!active) && (!(gu1_detect_vsa2())))
{
OUTB(crtcindex, 0x33);
while(INB(crtcdata) & 0x80);
}
/* LOCK EXTENDED CRTC REGISTERS */
OUTB(crtcindex, CRTC_EXTENDED_REGISTER_LOCK);
OUTB(crtcdata, 0x00);
return(0);
}
/*-----------------------------------------------------------------------------
* gu1_detect_vsa2
*
* This routine detects if VSA2 is present. The interface to SoftVGA
* changed slightly.
*-----------------------------------------------------------------------------
*/
int gu1_detect_vsa2(void)
{
unsigned short crtcindex, crtcdata;
crtcindex = (INB(0x3CC) & 0x01) ? 0x3D4 : 0x3B4;
crtcdata = crtcindex + 1;
OUTB(crtcindex, 0x35);
if (INB(crtcdata) != 'C') return(0);
OUTB(crtcindex, 0x36);
if (INB(crtcdata) != 'X') return(0);
return(1);
}
/* END OF FILE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -