📄 m6845vga.c
字号:
/******************************************************************************
*
* vgaScreenRev - Reverse Screen
*
* RETURNS: N/A
*/
LOCAL void vgaScreenRev
(
FAST VGA_CON_DEV * pVgaConDv /* pointer to the vga descriptor */
)
{
UCHAR * cp; /* to hold the current pointer */
UCHAR atr; /* to hold the attribute character */
for (cp = pVgaConDv->memBase; cp < pVgaConDv->memBase + 2000 * CHR;
cp += CHR)
{
atr = *(cp+1);
*(cp+1) = atr & INT_BLINK_MASK;
*(cp+1) |= (atr << 4) & BG_ATTR_MASK;
*(cp+1) |= (atr >> 4) & FG_ATTR_MASK;
}
}
/*******************************************************************************
*
* vgaScroll - Scroll Screen
*
* This function scrolls the screen according to the scroll direction.
* scroll direction FORWARD or BACKWARD
*
* RETURNS: N/A
*/
LOCAL void vgaScroll
(
FAST VGA_CON_DEV * pVgaConDv, /* pointer to the vga descriptor */
int pos, /* scroll start line position */
int lines, /* scroll line count */
BOOL upDn, /* scroll direction */
FAST UCHAR atr /* atrribute for char */
)
{
FAST UCHAR * dest; /* to hold the destination pointer */
FAST UCHAR * src; /* to hold the source pointer */
if (pos < pVgaConDv->scst || pos > pVgaConDv->sced)
return;
if (upDn)
{
/* scroll direction is forward */
if (pVgaConDv->scst + lines > pVgaConDv->sced + 1)
lines = pVgaConDv->sced - pVgaConDv->scst + 1;
for (dest = pVgaConDv->memBase + pVgaConDv->ncol * CHR *
pVgaConDv->scst, src = pVgaConDv->memBase + pVgaConDv->ncol *
CHR * (pVgaConDv->scst + lines); src < pVgaConDv->memBase +
pVgaConDv->ncol * CHR * (pos + 1); *dest++ = *src++ );
for (dest = pVgaConDv->memBase + pVgaConDv->ncol * CHR *
(pos - (lines - 1)); dest < pVgaConDv->memBase + pVgaConDv->ncol *
CHR * (pos + 1); dest += CHR )
{
*dest = ' ';
*(dest+1) = atr;
}
}
else
{
/* scroll direction is backward */
if (pVgaConDv->scst + lines > pVgaConDv->sced + 1)
lines = pVgaConDv->sced - pVgaConDv->scst + 1;
for (dest = pVgaConDv->memBase + pVgaConDv->ncol * CHR *
(pVgaConDv->sced + 1) - 1, src = pVgaConDv->memBase +
pVgaConDv->ncol * CHR * (pVgaConDv->sced - (lines - 1)) - 1;
src > pVgaConDv->memBase + pVgaConDv->ncol * CHR * pos - 1;
*dest-- = *src-- );
for (dest = pVgaConDv->memBase + pVgaConDv->ncol * CHR *
(pos + lines) - 1; dest > pVgaConDv->memBase + pVgaConDv->ncol *
CHR * pos - 1;
dest -= CHR )
{
*dest = atr;
*(dest-1) = ' ';
}
}
return;
}
/*****************************************************************************
*
* vgaInsertChar - insert the character at the current cursor location
*
* RETURNS: N/A
*/
LOCAL void vgaInsertChar
(
FAST VGA_CON_DEV * pVgaConDv, /* pointer to the vga descriptor */
FAST int nInsChar /* number of insert Characters */
)
{
FAST int xPos ; /* to hold the horizontal position */
FAST UINT16 erase; /* to hold erase character with attribute */
FAST UINT16 swap; /* to hold old x position */
FAST UINT16 * chrPos; /* to hold actual address of character */
if (nInsChar > pVgaConDv->ncol)
nInsChar = pVgaConDv->ncol;
else if (nInsChar == 0)
nInsChar = 1;
while (nInsChar-- != 0)
{
xPos = pVgaConDv->col;
chrPos = (UINT16 *) pVgaConDv->curChrPos;
erase = (pVgaConDv->defAttrib << 8) + ' ' ;
while (xPos++ < pVgaConDv->ncol)
{
/* make the current character as next erase */
swap = *chrPos;
*chrPos = erase ;
erase = swap;
chrPos++;
}
}
}
/*****************************************************************************
*
* vgaDelLeftChar - delete the character to the left side of the cursor
*
* RETURNS: N/A
*/
LOCAL void vgaDelLeftChar
(
FAST VGA_CON_DEV * pVgaConDv /* pointer to the vga descriptor */
)
{
FAST UINT16 erase; /* erase character with attributes */
erase = (pVgaConDv->defAttrib << 8) + ' ' ;
if (pVgaConDv->autoWrap || pVgaConDv->ncol > 0)
{
pVgaConDv->col--;
pVgaConDv->curChrPos -= CHR;
}
*(UINT16 *)pVgaConDv->curChrPos = erase;
}
/*****************************************************************************
*
* vgaCarriageReturn - do a carriage return on the monitor
*
* RETURNS: N/A
*/
LOCAL void vgaCarriageReturn
(
FAST VGA_CON_DEV * pVgaConDv /* pointer to the vga descriptor */
)
{
pVgaConDv->curChrPos -= pVgaConDv->col * CHR;
pVgaConDv->col = 0;
}
/*****************************************************************************
*
* vgaBackSpace - do a back space on the monitor
*
* RETURNS: N/A
*/
LOCAL void vgaBackSpace
(
FAST VGA_CON_DEV * pVgaConDv /* pointer to the vga descriptor */
)
{
if (pVgaConDv->autoWrap || pVgaConDv->ncol > 0)
{
pVgaConDv->col--;
pVgaConDv->curChrPos -= CHR;
}
if (pVgaConDv->col < 0)
{
pVgaConDv->col = pVgaConDv->ncol - 1;
pVgaConDv->row--;
pVgaConDv->scrollCheck = TRUE;
}
}
/*****************************************************************************
*
* vgaTab - do a tab on the monitor
*
* RETURNS: N/A
*/
LOCAL void vgaTab
(
FAST VGA_CON_DEV * pVgaConDv /* pointer to the vga descriptor */
)
{
int ix;
for (ix = pVgaConDv->col + 1; ix < 80; ix++)
{
if (pVgaConDv->tab_stop [ix])
{
pVgaConDv->col = ix;
break;
}
}
if (pVgaConDv->autoWrap && ix >= 80)
{
pVgaConDv->col = 0;
pVgaConDv->row++;
pVgaConDv->scrollCheck = TRUE;
}
pVgaConDv->curChrPos = ( pVgaConDv->memBase +
pVgaConDv->row * pVgaConDv->ncol * CHR +
pVgaConDv->col * CHR) ;
}
/******************************************************************************
*
* vgaLineFeed - do a line feed on the monitor
*
* RETURNS: N/A
*/
LOCAL void vgaLineFeed
(
FAST VGA_CON_DEV * pVgaConDv /* pointer to the vga descriptor */
)
{
pVgaConDv->curChrPos += pVgaConDv->ncol * CHR;
pVgaConDv->row++;
pVgaConDv->scrollCheck = TRUE;
}
/******************************************************************************
*
* vgaCursorPos - Put the cursor at a specified location
*
* RETURNS: N/A
*/
LOCAL void vgaCursorPos
(
FAST UINT16 pos /* position of the cursor */
)
{
sysOutByte ((int) CTRL_SEL_REG, 0x0e);
sysOutByte ((int) CTRL_VAL_REG, (pos >> 8) & 0xff);
sysOutByte ((int) CTRL_SEL_REG, 0x0f);
sysOutByte ((int) CTRL_VAL_REG, pos & 0xff);
return;
}
/******************************************************************************
*
* vgaCursorOn - switch the cursor on
*
* RETURNS: N/A
*/
LOCAL void vgaCursorOn (void)
{
sysOutByte ((int) CTRL_SEL_REG, 0x0a);
sysOutByte ((int) CTRL_VAL_REG, curSt & ~0x20);
sysOutByte ((int) CTRL_SEL_REG, 0x0b);
sysOutByte ((int) CTRL_VAL_REG, curEd);
return;
}
/******************************************************************************
*
* vgacursoroff - swith the cursor off
*
* RETURNS: N/A
*/
LOCAL void vgaCursorOff (void)
{
sysOutByte ((int) CTRL_SEL_REG, 0x0a);
sysOutByte ((int) CTRL_VAL_REG, 0x20);
sysOutByte ((int) CTRL_SEL_REG, 0x0b);
sysOutByte ((int) CTRL_VAL_REG, 0x00);
return;
}
/*******************************************************************************
*
* vgaWriteString - Write Character string to VGA Display
*
* This function does the write to the vga routine. This routine is provided as
* transmitter startup routine when tyDevInit is called.
*
* RETURNS: number of bytes written to the screen
*
* NOMANUAL
*/
int vgaWriteString
(
FAST PC_CON_DEV * pPcCoDv /* pointer to the console descriptor */
)
{
int dummy;
UCHAR ch;
FAST int nBytes;
FAST UCHAR atr;
FAST RING_ID ringId = pPcCoDv->tyDev.wrtBuf;
FAST VGA_CON_DEV * pVgaConDv = pPcCoDv->vs;
pPcCoDv->tyDev.wrtState.busy = TRUE;
atr = pVgaConDv->curAttrib;
nBytes = 0;
/* check if we need to output XON/XOFF for the read side */
if (pPcCoDv->tyDev.wrtState.xoff || pPcCoDv->tyDev.wrtState.flushingWrtBuf)
{
pPcCoDv->tyDev.wrtState.busy = FALSE;
return nBytes;
}
while (RNG_ELEM_GET (ringId,&ch,dummy) != 0)
{
nBytes++; /* increment the number of bytes */
/* If character is normal and printable */
if ( (pVgaConDv->escFlags == ESC_NORMAL) && (pVgaConDv->charSet [ch]
!= 0))
{
*(UINT16 *)pVgaConDv->curChrPos = (atr << 8) +
pVgaConDv->charSet [ch];
if (pVgaConDv->col == pVgaConDv->ncol - 1)
{
if (pVgaConDv->autoWrap)
{
vgaCarriageReturn (pVgaConDv); /* time to wrap */
vgaLineFeed (pVgaConDv);
goto VGA_CHECK; /* go do the wrap check */
}
}
else
{
pVgaConDv->col++;
pVgaConDv->curChrPos += CHR;
continue;
}
}
switch (ch)
{
case 0x07: /* BEL */
vgaConBeep (FALSE);
continue;
case 0x08: /* Back Space */
vgaBackSpace (pVgaConDv);
continue;
case '\t': /* TAB code */
vgaTab (pVgaConDv);
continue;
case '\n': /* LF code */
if ((pPcCoDv->tyDev.options & OPT_CRMOD) == OPT_CRMOD)
vgaCarriageReturn (pVgaConDv);
vgaLineFeed (pVgaConDv);
goto VGA_CHECK;
case 0x0b: /* VT code */
vgaLineFeed (pVgaConDv);
goto VGA_CHECK;
case 0x0c: /* Clear Screen code */
vgaClear (pVgaConDv, 2, ' ');
continue;
case 0x0d: /* CR code */
vgaCarriageReturn (pVgaConDv);
continue;
#ifdef INCLUDE_ANSI_ESC_SEQUENCE
case 0x1b: /* escape character */
pVgaConDv->escFlags = ESC_ESC;
continue;
case 0x9b: /* escape brace */
pVgaConDv->escFlags = ESC_BRACE;
continue;
#endif /* INCLUDE_ANSI_ESC_SEQUENCE */
case 0x0e: /* set the character set to VT100 graphics */
pVgaConDv->charSet = vgaCharTable [GRAPHICS_VT100_SET];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -