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

📄 m6845vga.c

📁 cpc-1631的BSP包for VxWorks操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:
		 continue;

            case 0x0f:		/* set the character set to normal text set */
		 pVgaConDv->charSet = vgaCharTable [TEXT_SET];
		 continue;

	    case 0x7f:		/* special character for del */
		 vgaDelLeftChar (pVgaConDv);
		 continue;
	  }

#ifdef INCLUDE_ANSI_ESC_SEQUENCE	
	switch (pVgaConDv->escFlags)
	    {
	    int 	ix;	/* to hold temp data */

	    case ESC_ESC:
	            pVgaConDv->escFlags = ESC_NORMAL;
		    switch (ch)
			{
			case '[':	/* escape brace */
				pVgaConDv->escFlags = ESC_BRACE;
				continue;

			case 'E':	/* cr lf */
				vgaCarriageReturn (pVgaConDv);
				vgaLineFeed (pVgaConDv);
				goto VGA_CHECK;

			case 'M':	/* cursor up */
				pVgaConDv->row --;
				vgaPutCursor (pVgaConDv);
				continue;
				
			case 'D':	/* generate a linefeed */
				vgaLineFeed (pVgaConDv);
				goto VGA_CHECK;

			case 'H':	/* give tab */
				vgaTab (pVgaConDv);
				continue;
				
			case 'Z':	/* get device attribute */
				vgaEscResponse (pPcCoDv,2);
				continue;
				
			case '7':	/* save current attributes */
				vgaSaveCurAttrib (pVgaConDv);
				continue;
				
			case '8':	/* restore current attributes */
				vgaRestAttrib (pVgaConDv);
				continue;
				
			case '(':	/* set character set to text */
				pVgaConDv->escFlags = ESC_SET_TEXT;
				continue;
				
			case ')':	/* set character set to grapics set */
				pVgaConDv->escFlags = ESC_SET_GPRAHICS;
				continue;
				
			case '#':	/* goto ESC_HASH state */
				pVgaConDv->escFlags = ESC_HASH;
				continue;
				
			case 'c':	/* reset display */
				pPcCoDv->ks->kbdHook (0);
				vgaStatInit ();
				vgaClear (pVgaConDv, 2, ' ');
				vgaCursorOn ();
				continue;

			case '>':	/* set numeric mode */
				pPcCoDv->ks->kbdFlags |= NUM;
				pPcCoDv->ks->kbdHook (1);
				continue;

			case '=':	/* set non numeric mode */
				pPcCoDv->ks->kbdFlags &= ~NUM;
				pPcCoDv->ks->kbdHook (1);
				continue;
           		}
		    continue;

	    case ESC_BRACE:	/* Got ESC [ */
	            for (ix = 0; ix < NPARS; ix++)
		        pVgaConDv->escPara [ix] = 0;
		    pVgaConDv->escParaCount = 0;
	            pVgaConDv->escFlags = ESC_GET_PARAMS;
		    if ( ch == '[')
			{
			pVgaConDv->escFlags = ESC_FUNC_KEY;
			continue;
			}

	            /* if received ? in the escape sequence */

		    if ( (pVgaConDv->escQuestion = (ch == '?')) )
		       continue;

	    case ESC_GET_PARAMS:	/* get parameters */
		    if ( (ch == ';') && (pVgaConDv->escParaCount < NPARS -1))
			{
			pVgaConDv->escParaCount++;
			continue;
			}
		    else if (ch >= '0' && ch <= '9')
			{
			pVgaConDv->escPara[pVgaConDv->escParaCount] *= 10;
			pVgaConDv->escPara[pVgaConDv->escParaCount] += ch -'0';
			continue;
			}
		    else
		        pVgaConDv->escFlags = ESC_GOT_PARAMS;

	    case ESC_GOT_PARAMS:
		    pVgaConDv->escFlags = ESC_NORMAL;
		    switch (ch)
			{
			case 'h':	/* set vga modes  ESC [ n h */
			        vgaSetMode (pPcCoDv, TRUE);
				continue;
				
			case 'l':	/* reset vga mode  ESC [ n l */
				vgaSetMode (pPcCoDv, FALSE);
				continue;

			case 'n':
				if (!pVgaConDv->escQuestion)
				    {
				    if (pVgaConDv->escPara [0] == 5)
					{ /* status report */
					vgaEscResponse (pPcCoDv,1);
					}
				    else if ( pVgaConDv->escPara [0] == 6)
					{ /* cursor position report */
					vgaEscResponse (pPcCoDv,0);
					}
				    continue;
				    }
			}
		    if (pVgaConDv->escQuestion) 
			{
			pVgaConDv->escQuestion = FALSE;
			continue;
			}
		    switch (ch)
			{
			case 'G':	/* ESC [ n G :move cursor by columns */
			        if (pVgaConDv->escPara [0] > 0)
				    pVgaConDv->escPara [0]--;

				pVgaConDv->col = pVgaConDv->escPara [0];
				vgaPutCursor (pVgaConDv);
				continue;

			case 'A':	/* ESC [ n A :cursor move up */
			        if (pVgaConDv->escPara [0] == 0)
				    pVgaConDv->escPara [0]++;

				pVgaConDv->row -= pVgaConDv->escPara [0];
				vgaPutCursor (pVgaConDv);
                                continue;

			case 'B':	/* ESC [ n B :cursor move down */
			        if (pVgaConDv->escPara [0] == 0)
				    pVgaConDv->escPara [0]++;

				pVgaConDv->row += pVgaConDv->escPara [0];
				vgaPutCursor (pVgaConDv);
				continue;
				
			case 'C':	/* ESC [ n C :cursor move right */
			        if (pVgaConDv->escPara [0] == 0)
				    pVgaConDv->escPara [0]++;

				pVgaConDv->col += pVgaConDv->escPara [0];
				vgaPutCursor (pVgaConDv);
				continue;

			case 'D':	/* ESC [ n D :cursor move left */
			        if (pVgaConDv->escPara [0] == 0)
				    pVgaConDv->escPara [0]++;

				pVgaConDv->col -= pVgaConDv->escPara [0];
				vgaPutCursor (pVgaConDv);
				continue;

			case 'E':	/* ESC [ n E :cursor move by n rows */
			        if (pVgaConDv->escPara [0] == 0)
				    pVgaConDv->escPara [0]++;

				pVgaConDv->row += pVgaConDv->escPara [0];
				pVgaConDv->col = 0;
				vgaPutCursor (pVgaConDv);
				continue;

			case 'F':	/* ESC [ n F :move cursor laterally */
			        if (pVgaConDv->escPara [0] == 0)
				    pVgaConDv->escPara [0]++;

				pVgaConDv->row -= pVgaConDv->escPara [0];
				pVgaConDv->col = 0;
				vgaPutCursor (pVgaConDv);
				continue;

			case 'd':	/* ESC [ n d :move cursor vertically */
			        if (pVgaConDv->escPara [0] > 0)
				    pVgaConDv->escPara [0]--;

				pVgaConDv->row = pVgaConDv->escPara [0];
				vgaPutCursor (pVgaConDv);
				continue;
				
			case 'H':	/* ESC [ n;n H :position the cursor */
                        case 'f':	/* ESC [ n;n f :position the cursor */
			        if (pVgaConDv->escPara [0] > 0)
				    pVgaConDv->escPara [0]--;

			        if (pVgaConDv->escPara [1] > 0)
				    pVgaConDv->escPara [1]--;

				pVgaConDv->row = pVgaConDv->escPara [0];
				pVgaConDv->col = pVgaConDv->escPara [1];
				vgaPutCursor (pVgaConDv);
				continue;

			case 'J':	/* ESC [ n J :clear display */
				vgaClear (pVgaConDv, pVgaConDv->escPara [0],
					  ' ');
				continue;
				
			case 'K':	/* ESC [ n K :clear Line */
				vgaClearLine (pVgaConDv);
				continue;
			   
			case 'L':	/* ESC [ n L :insert Lines */
				vgaInsertLine (pVgaConDv);
				continue;
				
			case 'M':	/* ESC [ n M :delete lines */
				vgaDelLines (pVgaConDv);
				continue;

			case 'P':	/* ESC [ n P :delete on right side */
				vgaDelRightChars (pVgaConDv, 
						  pVgaConDv->escPara [0]);
				continue;
				
			case 'c':	/* ESC [ n c :get response from term */
				if ( pVgaConDv->escPara [0] == 0 )
				    vgaEscResponse (pPcCoDv,2);

				continue;

			case 'g':	/* ESC [ n g :give tabs */
				if ( pVgaConDv->escPara [0] == 0 )
				    {
				    vgaTab (pVgaConDv);
				    }
				else if ( pVgaConDv->escPara [0] == 3)
				    {
				    pVgaConDv->tab_stop [0] = 0; 
				    pVgaConDv->tab_stop [1] = 0;
				    pVgaConDv->tab_stop [2] = 0;
				    pVgaConDv->tab_stop [3] = 0;
				    pVgaConDv->tab_stop [4] = 0;
				    }
				continue;
				
			case 'm':	/* ESC [ m :set the attributes */
				vgaSetAttrib (pVgaConDv);
				continue;

			case 'r':	/* ESC [ n;n r : set scroll limits */
				if (pVgaConDv->escPara [0] == 0)
				    pVgaConDv->escPara [0]++;

				if (pVgaConDv->escPara [1] == 0)
				    pVgaConDv->escPara[1] = pVgaConDv->ncol-1;

				if ((pVgaConDv->escPara [0] < 
				    pVgaConDv->escPara [1]) && 
				    (pVgaConDv->escPara [1] < pVgaConDv->ncol))
				    {
				    pVgaConDv->scst = pVgaConDv->escPara [0] -
				    		      1;
				    pVgaConDv->sced = pVgaConDv->escPara [1];
				    pVgaConDv->row = 0;
				    vgaPutCursor (pVgaConDv);
				    }
				continue;
				
			case 's':	/* ESC [ s :save attributes */
				vgaSaveCurAttrib (pVgaConDv);
				continue;

			case 'u':	/* ESC [ u :restore attributes */
				vgaRestAttrib (pVgaConDv);
				continue;

			case '@':	/* ESC [ n @ :insert n characters */
				vgaInsertChar (pVgaConDv, 
					       pVgaConDv->escPara [0]);
				continue;
			}
		    
		    continue;

	    case ESC_FUNC_KEY:
		    pVgaConDv->escFlags = ESC_NORMAL;
		    continue;

	    case ESC_HASH:
		    pVgaConDv->escFlags = ESC_NORMAL;
		    if ( ch == '8' )
		       vgaClear (pVgaConDv, 2, 'E');	/* erase char to 'E' */
		    continue;
		    
	    case ESC_SET_TEXT:
	    case ESC_SET_GPRAHICS:
		    if ( ch == 'O' )
		       pVgaConDv->charSet = vgaCharTable [GRAPHICS_VT100_SET];
		    else if ( ch == 'B')
			{
			pVgaConDv->charSet = vgaCharTable [TEXT_SET];
			pVgaConDv->escFlags = ESC_NORMAL;
			}
		    else if ( ch == 'U')
			{
			pVgaConDv->charSet = vgaCharTable [IBM_GRAPHICS_SET];
			pVgaConDv->escFlags = ESC_NORMAL;
			}
		    continue;

	    default:
		    pVgaConDv->escFlags = ESC_NORMAL;
	    }
#endif /* INCLUDE_ANSI_ESC_SEQUENCE */

	VGA_CHECK:	/* label for checking at the end of the loop */
	    {
	    if (pVgaConDv->scrollCheck && pVgaConDv->curChrPos >= 
		pVgaConDv->memBase + pVgaConDv->ncol * CHR * (pVgaConDv->sced 
							      + 1))
		{ 
		/* forward scroll check */
		
		pVgaConDv->row = pVgaConDv->sced;
		vgaScroll (pVgaConDv, pVgaConDv->row, pVgaConDv->scrollCheck,
			   FORWARD, pVgaConDv->defAttrib);
		while (pVgaConDv->curChrPos >= pVgaConDv->memBase + 
		       pVgaConDv->ncol * CHR * (pVgaConDv->sced + 1))
		pVgaConDv->curChrPos -= pVgaConDv->ncol * CHR;
		}
	    else if (pVgaConDv->scrollCheck && pVgaConDv->curChrPos < 
		     pVgaConDv->memBase + pVgaConDv->col * CHR * 
		     pVgaConDv->scst)
		{
		/* rearword scroll check */

		pVgaConDv->row = pVgaConDv->scst;
		vgaScroll (pVgaConDv, pVgaConDv->row, pVgaConDv->scrollCheck,
			   BACKWARD, pVgaConDv->defAttrib);
		while (pVgaConDv->curChrPos < pVgaConDv->memBase + 
		       pVgaConDv->col * CHR * pVgaConDv->scst)
		pVgaConDv->curChrPos += pVgaConDv->ncol * CHR;
		}
	    else if (pVgaConDv->curChrPos > pVgaConDv->memBase + 
		     pVgaConDv->ncol * CHR * pVgaConDv->nrow)
		{ 
		/* out of range check (over) */

		while (pVgaConDv->curChrPos > pVgaConDv->memBase + 
		       pVgaConDv->ncol * CHR * pVgaConDv->nrow)
		    {
		    pVgaConDv->curChrPos -= pVgaConDv->ncol * CHR;
		    pVgaConDv->row--;
		    }
		}
	    else if (pVgaConDv->curChrPos < pVgaConDv->memBase)
		{ 
		/* out of range check (under) */

		while (pVgaConDv->curChrPos < pVgaConDv->memBase)
		    {
		    pVgaConDv->curChrPos += pVgaConDv->ncol * CHR;
		    pVgaConDv->row++;
		    }
		}
	    }	/* VGA_CHECK: */

	/* this line prevents the workQ panic */

	if ((intContext()) && (nBytes >= jobaddThreshold))
	    {
	    excJobAdd ((VOIDFUNCPTR)vgaWriteString, (int)pPcCoDv, 0,0,0,0,0);
	    return (nBytes);
	    }
	}	/* end of the main for loop */

    vgaCursorPos ((pVgaConDv->curChrPos - pVgaConDv->memBase) / CHR );
    pPcCoDv->tyDev.wrtState.busy = FALSE;

    /* when we pass the write threshhold, give write synchonization
     * and release tasks pended in select */
    
    if (rngFreeBytes (ringId) >= tyWrtThreshold)
            {
            semGive (&pPcCoDv->tyDev.wrtSyncSem);
            if (_func_selWakeupAll != NULL)
                (* _func_selWakeupAll) (&pPcCoDv->tyDev.selWakeupList, 
					SELWRITE);
	    }
    return nBytes;	/* return the number of characters processed */
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -