📄 m6845vga.c
字号:
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 + -