⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m6845vga.c

📁 cpc-1631的BSP包for VxWorks操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:
/******************************************************************************
*
* 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 + -