2c2bb10f49
therefore can never be compiled if NVT == 0. config(8) guarantees this.
2156 lines
51 KiB
C
2156 lines
51 KiB
C
/*
|
|
* Copyright (c) 1999, 2000 Hellmuth Michaelis
|
|
*
|
|
* Copyright (c) 1992, 1995 Hellmuth Michaelis and Joerg Wunsch.
|
|
*
|
|
* Copyright (c) 1992, 1993 Brian Dunford-Shore.
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* This code is derived from software contributed to Berkeley by
|
|
* William Jolitz and Don Ahn.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
* must display the following acknowledgement:
|
|
* This product includes software developed by Hellmuth Michaelis,
|
|
* Brian Dunford-Shore and Joerg Wunsch.
|
|
* 4. The name authors may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
*
|
|
* pcvt_vtf.c VT220 Terminal Emulator Functions
|
|
* -------------------------------------------------
|
|
*
|
|
* Last Edit-Date: [Sun Mar 26 10:38:52 2000]
|
|
*
|
|
* $FreeBSD$
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
#define PCVT_INCLUDE_VT_SELATTR /* get inline function from pcvt_hdr.h */
|
|
|
|
#include <i386/isa/pcvt/pcvt_hdr.h> /* global include */
|
|
#include <i386/isa/pcvt/pcvt_tbl.h> /* character set conversion tables */
|
|
|
|
static void clear_dld ( struct video_state *svsp );
|
|
static void init_dld ( struct video_state *svsp );
|
|
static void init_udk ( struct video_state *svsp );
|
|
static void respond ( struct video_state *svsp );
|
|
static void roll_down ( struct video_state *svsp, int n );
|
|
static void selective_erase ( struct video_state *svsp, u_short *pcrtat,
|
|
int length );
|
|
static void swcsp ( struct video_state *svsp, u_short *ctp );
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* DECSTBM - set top and bottom margins
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_stbm(struct video_state *svsp)
|
|
{
|
|
/* both 0 => scrolling region = entire screen */
|
|
|
|
if((svsp->parms[0] == 0) && (svsp->parms[1] == 0))
|
|
{
|
|
svsp->cur_offset = 0;
|
|
svsp->scrr_beg = 0;
|
|
svsp->scrr_len = svsp->screen_rows;
|
|
svsp->scrr_end = svsp->scrr_len - 1;
|
|
svsp->col = 0;
|
|
return;
|
|
}
|
|
|
|
if(svsp->parms[1] <= svsp->parms[0])
|
|
return;
|
|
|
|
/* range parm 1 */
|
|
|
|
if(svsp->parms[0] < 1)
|
|
svsp->parms[0] = 1;
|
|
else if(svsp->parms[0] > svsp->screen_rows-1)
|
|
svsp->parms[0] = svsp->screen_rows-1;
|
|
|
|
/* range parm 2 */
|
|
|
|
if(svsp->parms[1] < 2)
|
|
svsp->parms[1] = 2;
|
|
else if(svsp->parms[1] > svsp->screen_rows)
|
|
svsp->parms[1] = svsp->screen_rows;
|
|
|
|
svsp->scrr_beg = svsp->parms[0]-1; /* begin of scrolling region */
|
|
svsp->scrr_len = svsp->parms[1] - svsp->parms[0] + 1; /* no of lines */
|
|
svsp->scrr_end = svsp->parms[1]-1;
|
|
|
|
/* cursor to first pos */
|
|
if(svsp->m_om)
|
|
svsp->cur_offset = svsp->scrr_beg * svsp->maxcol;
|
|
else
|
|
svsp->cur_offset = 0;
|
|
|
|
svsp->col = 0;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* SGR - set graphic rendition
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_sgr(struct video_state *svsp)
|
|
{
|
|
register int i = 0;
|
|
u_short setcolor = 0;
|
|
char colortouched = 0;
|
|
|
|
do
|
|
{
|
|
switch(svsp->parms[i++])
|
|
{
|
|
case 0: /* reset to normal attributes */
|
|
svsp->vtsgr = VT_NORMAL;
|
|
break;
|
|
|
|
case 1: /* bold */
|
|
svsp->vtsgr |= VT_BOLD;
|
|
break;
|
|
|
|
case 4: /* underline */
|
|
svsp->vtsgr |= VT_UNDER;
|
|
break;
|
|
|
|
case 5: /* blinking */
|
|
svsp->vtsgr |= VT_BLINK;
|
|
break;
|
|
|
|
case 7: /* reverse */
|
|
svsp->vtsgr |= VT_INVERSE;
|
|
break;
|
|
|
|
case 22: /* not bold */
|
|
svsp->vtsgr &= ~VT_BOLD;
|
|
break;
|
|
|
|
case 24: /* not underlined */
|
|
svsp->vtsgr &= ~VT_UNDER;
|
|
break;
|
|
|
|
case 25: /* not blinking */
|
|
svsp->vtsgr &= ~VT_BLINK;
|
|
break;
|
|
|
|
case 27: /* not reverse */
|
|
svsp->vtsgr &= ~VT_INVERSE;
|
|
break;
|
|
|
|
case 30: /* foreground colors */
|
|
case 31:
|
|
case 32:
|
|
case 33:
|
|
case 34:
|
|
case 35:
|
|
case 36:
|
|
case 37:
|
|
if(color)
|
|
{
|
|
colortouched = 1;
|
|
setcolor |= ((fgansitopc[(svsp->parms[i-1]-30) & 7]) << 8);
|
|
}
|
|
break;
|
|
|
|
case 40: /* background colors */
|
|
case 41:
|
|
case 42:
|
|
case 43:
|
|
case 44:
|
|
case 45:
|
|
case 46:
|
|
case 47:
|
|
if(color)
|
|
{
|
|
colortouched = 1;
|
|
setcolor |= ((bgansitopc[(svsp->parms[i-1]-40) & 7]) << 8);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
while(i <= svsp->parmi);
|
|
if(color)
|
|
{
|
|
if(colortouched)
|
|
svsp->c_attr = setcolor;
|
|
else
|
|
svsp->c_attr = ((sgr_tab_color[svsp->vtsgr]) << 8);
|
|
}
|
|
else
|
|
{
|
|
if(adaptor_type == MDA_ADAPTOR)
|
|
svsp->c_attr = ((sgr_tab_imono[svsp->vtsgr]) << 8);
|
|
else
|
|
svsp->c_attr = ((sgr_tab_mono[svsp->vtsgr]) << 8);
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* CUU - cursor up
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_cuu(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if (p <= 0) /* parameter min */
|
|
p = 1;
|
|
|
|
p = min(p, svsp->row - svsp->scrr_beg);
|
|
|
|
if (p <= 0)
|
|
return;
|
|
|
|
svsp->cur_offset -= (svsp->maxcol * p);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* CUD - cursor down
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_cud(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if (p <= 0)
|
|
p = 1;
|
|
|
|
p = min(p, svsp->scrr_end - svsp->row);
|
|
|
|
if (p <= 0)
|
|
return;
|
|
|
|
svsp->cur_offset += (svsp->maxcol * p);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* CUF - cursor forward
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_cuf(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if(svsp->col == ((svsp->maxcol)-1)) /* already at right margin */
|
|
return;
|
|
|
|
if(p <= 0) /* parameter min = 1 */
|
|
p = 1;
|
|
else if(p > ((svsp->maxcol)-1)) /* parameter max = 79 */
|
|
p = ((svsp->maxcol)-1);
|
|
|
|
if((svsp->col + p) > ((svsp->maxcol)-1))/* not more than right margin */
|
|
p = ((svsp->maxcol)-1) - svsp->col;
|
|
|
|
svsp->cur_offset += p;
|
|
svsp->col += p;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* CUB - cursor backward
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_cub(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if(svsp->col == 0) /* already at left margin ? */
|
|
return;
|
|
|
|
if(p <= 0) /* parameter min = 1 */
|
|
p = 1;
|
|
else if(p > ((svsp->maxcol)-1)) /* parameter max = 79 */
|
|
p = ((svsp->maxcol)-1);
|
|
|
|
if((svsp->col - p) <= 0) /* not more than left margin */
|
|
p = svsp->col;
|
|
|
|
svsp->cur_offset -= p;
|
|
svsp->col -= p;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* ED - erase in display
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_clreos(struct video_state *svsp)
|
|
{
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 0:
|
|
fillw(user_attr | ' ', svsp->Crtat + svsp->cur_offset,
|
|
svsp->Crtat +
|
|
(svsp->maxcol * svsp->screen_rows) -
|
|
(svsp->Crtat + svsp->cur_offset));
|
|
break;
|
|
|
|
case 1:
|
|
fillw(user_attr | ' ', svsp->Crtat,
|
|
svsp->Crtat + svsp->cur_offset -
|
|
svsp->Crtat + 1 );
|
|
break;
|
|
|
|
case 2:
|
|
fillw(user_attr | ' ', svsp->Crtat,
|
|
svsp->maxcol * svsp->screen_rows);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* EL - erase in line
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_clreol(struct video_state *svsp)
|
|
{
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 0:
|
|
fillw(user_attr | ' ',
|
|
svsp->Crtat + svsp->cur_offset,
|
|
svsp->maxcol-svsp->col);
|
|
break;
|
|
|
|
case 1:
|
|
fillw(user_attr | ' ',
|
|
svsp->Crtat + svsp->cur_offset - svsp->col,
|
|
svsp->col + 1);
|
|
break;
|
|
|
|
case 2:
|
|
fillw(user_attr | ' ',
|
|
svsp->Crtat + svsp->cur_offset - svsp->col,
|
|
svsp->maxcol);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* CUP - cursor position / HVP - horizontal & vertical position
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_curadr(struct video_state *svsp)
|
|
{
|
|
if(svsp->m_om) /* relative to scrolling region */
|
|
{
|
|
if((svsp->parms[0] == 0) && (svsp->parms[1] == 0))
|
|
{
|
|
svsp->cur_offset = svsp->scrr_beg * svsp->maxcol;
|
|
svsp->col = 0;
|
|
svsp->abs_write = 0;
|
|
return;
|
|
}
|
|
|
|
if(svsp->parms[0] <= 0)
|
|
svsp->parms[0] = 1;
|
|
else if(svsp->parms[0] > svsp->scrr_len)
|
|
svsp->parms[0] = svsp->scrr_len;
|
|
|
|
if(svsp->parms[1] <= 0 )
|
|
svsp->parms[1] = 1;
|
|
if(svsp->parms[1] > svsp->maxcol)
|
|
svsp->parms[1] = svsp->maxcol;
|
|
|
|
svsp->cur_offset = (svsp->scrr_beg * svsp->maxcol) +
|
|
((svsp->parms[0] - 1) * svsp->maxcol) +
|
|
svsp->parms[1] - 1;
|
|
svsp->col = svsp->parms[1] - 1;
|
|
svsp->abs_write = 0;
|
|
}
|
|
else /* relative to screen start */
|
|
{
|
|
if((svsp->parms[0] == 0) && (svsp->parms[1] == 0))
|
|
{
|
|
svsp->cur_offset = 0;
|
|
svsp->col = 0;
|
|
svsp->abs_write = 0;
|
|
return;
|
|
}
|
|
|
|
if(svsp->parms[0] <= 0)
|
|
svsp->parms[0] = 1;
|
|
else if(svsp->parms[0] > svsp->screen_rows)
|
|
svsp->parms[0] = svsp->screen_rows;
|
|
|
|
if(svsp->parms[1] <= 0 )
|
|
svsp->parms[1] = 1;
|
|
if(svsp->parms[1] > svsp->maxcol) /* col */
|
|
svsp->parms[1] = svsp->maxcol;
|
|
|
|
svsp->cur_offset = (((svsp->parms[0]-1)*svsp->maxcol) +
|
|
(svsp->parms[1]-1));
|
|
svsp->col = svsp->parms[1]-1;
|
|
|
|
if (svsp->cur_offset >=
|
|
((svsp->scrr_beg + svsp->scrr_len + 1) * svsp->maxcol))
|
|
|
|
svsp->abs_write = 1;
|
|
else
|
|
svsp->abs_write = 0;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* RIS - reset to initial state (hard emulator runtime reset)
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_ris(struct video_state *svsp)
|
|
{
|
|
fillw(user_attr | ' ', svsp->Crtat, svsp->maxcol * svsp->screen_rows);
|
|
svsp->cur_offset = 0; /* cursor upper left corner */
|
|
svsp->col = 0;
|
|
svsp->row = 0;
|
|
svsp->lnm = 0; /* CR only */
|
|
clear_dld(svsp); /* clear download charset */
|
|
vt_clearudk(svsp); /* clear user defined keys */
|
|
svsp->selchar = 0; /* selective attribute off */
|
|
vt_str(svsp); /* and soft terminal reset */
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* DECSTR - soft terminal reset (SOFT emulator runtime reset)
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_str(struct video_state *svsp)
|
|
{
|
|
int i;
|
|
|
|
clr_parms(svsp); /* escape parameter init */
|
|
svsp->state = STATE_INIT; /* initial state */
|
|
|
|
svsp->dis_fnc = 0; /* display functions reset */
|
|
|
|
svsp->sc_flag = 0; /* save cursor position */
|
|
svsp->transparent = 0; /* enable control code processing */
|
|
|
|
for(i = 0; i < MAXTAB; i++) /* setup tabstops */
|
|
{
|
|
if(!(i % 8))
|
|
svsp->tab_stops[i] = 1;
|
|
else
|
|
svsp->tab_stops[i] = 0;
|
|
}
|
|
|
|
svsp->irm = 0; /* replace mode */
|
|
svsp->m_om = 0; /* origin mode */
|
|
svsp->m_awm = 1; /* auto wrap mode */
|
|
|
|
#if PCVT_INHIBIT_NUMLOCK
|
|
svsp->num_lock = 0; /* keypad application mode */
|
|
#else
|
|
svsp->num_lock = 1; /* keypad numeric mode */
|
|
#endif
|
|
|
|
svsp->scroll_lock = 0; /* reset keyboard modes */
|
|
svsp->caps_lock = 0;
|
|
|
|
svsp->ckm = 1; /* cursor key mode = "normal" ... */
|
|
svsp->scrr_beg = 0; /* start of scrolling region */
|
|
svsp->scrr_len = svsp->screen_rows; /* no. of lines in scrolling region */
|
|
svsp->abs_write = 0; /* scrr is complete screen */
|
|
svsp->scrr_end = svsp->scrr_len - 1;
|
|
|
|
if(adaptor_type == EGA_ADAPTOR || adaptor_type == VGA_ADAPTOR)
|
|
{
|
|
svsp->G0 = cse_ascii; /* G0 = ascii */
|
|
svsp->G1 = cse_ascii; /* G1 = ascii */
|
|
svsp->G2 = cse_supplemental; /* G2 = supplemental */
|
|
svsp->G3 = cse_supplemental; /* G3 = supplemental */
|
|
svsp->GL = &svsp->G0; /* GL = G0 */
|
|
svsp->GR = &svsp->G2; /* GR = G2 */
|
|
}
|
|
else
|
|
{
|
|
svsp->G0 = csd_ascii; /* G0 = ascii */
|
|
svsp->G1 = csd_ascii; /* G1 = ascii */
|
|
svsp->G2 = csd_supplemental; /* G2 = supplemental */
|
|
svsp->G3 = csd_supplemental; /* G3 = supplemental */
|
|
svsp->GL = &svsp->G0; /* GL = G0 */
|
|
svsp->GR = &svsp->G2; /* GR = G2 */
|
|
}
|
|
|
|
svsp->vtsgr = VT_NORMAL; /* no attributes */
|
|
svsp->c_attr = user_attr; /* reset sgr to normal */
|
|
|
|
svsp->selchar = 0; /* selective attribute off */
|
|
vt_initsel(svsp);
|
|
|
|
init_ufkl(svsp); /* init user fkey labels */
|
|
init_sfkl(svsp); /* init system fkey labels */
|
|
|
|
update_led(); /* update keyboard LED's */
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* RI - reverse index, move cursor up
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_ri(struct video_state *svsp)
|
|
{
|
|
if(svsp->cur_offset >= ((svsp->scrr_beg * svsp->maxcol) + svsp->maxcol))
|
|
svsp->cur_offset -= svsp->maxcol;
|
|
else
|
|
roll_down(svsp, 1);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* IND - index, move cursor down
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_ind(struct video_state *svsp)
|
|
{
|
|
if(svsp->cur_offset < (svsp->scrr_end * svsp->maxcol))
|
|
svsp->cur_offset += svsp->maxcol;
|
|
else
|
|
roll_up(svsp, 1);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* NEL - next line, first pos of next line
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_nel(struct video_state *svsp)
|
|
{
|
|
if(svsp->cur_offset < (svsp->scrr_end * svsp->maxcol))
|
|
{
|
|
svsp->cur_offset += (svsp->maxcol-svsp->col);
|
|
svsp->col = 0;
|
|
}
|
|
else
|
|
{
|
|
roll_up(svsp, 1);
|
|
svsp->cur_offset -= svsp->col;
|
|
svsp->col = 0;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* set dec private modes, esc [ ? x h
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_set_dec_priv_qm(struct video_state *svsp)
|
|
{
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 0: /* error, ignored */
|
|
case 1: /* CKM - cursor key mode */
|
|
svsp->ckm = 1;
|
|
break;
|
|
|
|
case 2: /* ANM - ansi/vt52 mode */
|
|
break;
|
|
|
|
case 3: /* COLM - column mode */
|
|
vt_col(svsp, SCR_COL132);
|
|
break;
|
|
|
|
case 4: /* SCLM - scrolling mode */
|
|
case 5: /* SCNM - screen mode */
|
|
break;
|
|
|
|
case 6: /* OM - origin mode */
|
|
svsp->m_om = 1;
|
|
break;
|
|
|
|
case 7: /* AWM - auto wrap mode */
|
|
svsp->m_awm = 1;
|
|
swritefkl(7,(u_char *)"AUTOWRAPENABLE *",svsp);
|
|
break;
|
|
|
|
case 8: /* ARM - auto repeat mode */
|
|
kbrepflag = 1;
|
|
break;
|
|
|
|
case 9: /* INLM - interlace mode */
|
|
case 10: /* EDM - edit mode */
|
|
case 11: /* LTM - line transmit mode */
|
|
case 12: /* */
|
|
case 13: /* SCFDM - space compression / field delimiting */
|
|
case 14: /* TEM - transmit execution mode */
|
|
case 15: /* */
|
|
case 16: /* EKEM - edit key execution mode */
|
|
break;
|
|
|
|
case 25: /* TCEM - text cursor enable mode */
|
|
if(vsp == svsp)
|
|
sw_cursor(1); /* cursor on */
|
|
svsp->cursor_on = 1;
|
|
break;
|
|
|
|
case 42: /* NRCM - 7bit NRC characters */
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* reset dec private modes, esc [ ? x l
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_reset_dec_priv_qm(struct video_state *svsp)
|
|
{
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 0: /* error, ignored */
|
|
case 1: /* CKM - cursor key mode */
|
|
svsp->ckm = 0;
|
|
break;
|
|
|
|
case 2: /* ANM - ansi/vt52 mode */
|
|
break;
|
|
|
|
case 3: /* COLM - column mode */
|
|
vt_col(svsp, SCR_COL80);
|
|
break;
|
|
|
|
case 4: /* SCLM - scrolling mode */
|
|
case 5: /* SCNM - screen mode */
|
|
break;
|
|
|
|
case 6: /* OM - origin mode */
|
|
svsp->m_om = 0;
|
|
break;
|
|
|
|
case 7: /* AWM - auto wrap mode */
|
|
svsp->m_awm = 0;
|
|
swritefkl(7,(u_char *)"AUTOWRAPENABLE ",svsp);
|
|
break;
|
|
|
|
case 8: /* ARM - auto repeat mode */
|
|
kbrepflag = 0;
|
|
break;
|
|
|
|
case 9: /* INLM - interlace mode */
|
|
case 10: /* EDM - edit mode */
|
|
case 11: /* LTM - line transmit mode */
|
|
case 12: /* */
|
|
case 13: /* SCFDM - space compression / field delimiting */
|
|
case 14: /* TEM - transmit execution mode */
|
|
case 15: /* */
|
|
case 16: /* EKEM - edit key execution mode */
|
|
break;
|
|
|
|
case 25: /* TCEM - text cursor enable mode */
|
|
if(vsp == svsp)
|
|
sw_cursor(0); /* cursor off */
|
|
svsp->cursor_on = 0;
|
|
break;
|
|
|
|
case 42: /* NRCM - 7bit NRC characters */
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* set ansi modes, esc [ x
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_set_ansi(struct video_state *svsp)
|
|
{
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 0: /* error, ignored */
|
|
case 1: /* GATM - guarded area transfer mode */
|
|
case 2: /* KAM - keyboard action mode */
|
|
case 3: /* CRM - Control Representation mode */
|
|
break;
|
|
|
|
case 4: /* IRM - insert replacement mode */
|
|
svsp->irm = 1; /* Insert mode */
|
|
break;
|
|
|
|
case 5: /* SRTM - status report transfer mode */
|
|
case 6: /* ERM - erasue mode */
|
|
case 7: /* VEM - vertical editing mode */
|
|
case 10: /* HEM - horizontal editing mode */
|
|
case 11: /* PUM - position unit mode */
|
|
case 12: /* SRM - send-receive mode */
|
|
case 13: /* FEAM - format effector action mode */
|
|
case 14: /* FETM - format effector transfer mode */
|
|
case 15: /* MATM - multiple area transfer mode */
|
|
case 16: /* TTM - transfer termination */
|
|
case 17: /* SATM - selected area transfer mode */
|
|
case 18: /* TSM - tabulation stop mode */
|
|
case 19: /* EBM - editing boundary mode */
|
|
break;
|
|
|
|
case 20: /* LNM - line feed / newline mode */
|
|
svsp->lnm = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* reset ansi modes, esc [ x
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_reset_ansi(struct video_state *svsp)
|
|
{
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 0: /* error, ignored */
|
|
case 1: /* GATM - guarded area transfer mode */
|
|
case 2: /* KAM - keyboard action mode */
|
|
case 3: /* CRM - Control Representation mode */
|
|
break;
|
|
|
|
case 4: /* IRM - insert replacement mode */
|
|
svsp->irm = 0; /* Replace mode */
|
|
break;
|
|
|
|
case 5: /* SRTM - status report transfer mode */
|
|
case 6: /* ERM - erasue mode */
|
|
case 7: /* VEM - vertical editing mode */
|
|
case 10: /* HEM - horizontal editing mode */
|
|
case 11: /* PUM - position unit mode */
|
|
case 12: /* SRM - send-receive mode */
|
|
case 13: /* FEAM - format effector action mode */
|
|
case 14: /* FETM - format effector transfer mode */
|
|
case 15: /* MATM - multiple area transfer mode */
|
|
case 16: /* TTM - transfer termination */
|
|
case 17: /* SATM - selected area transfer mode */
|
|
case 18: /* TSM - tabulation stop mode */
|
|
case 19: /* EBM - editing boundary mode */
|
|
break;
|
|
|
|
case 20: /* LNM - line feed / newline mode */
|
|
svsp->lnm = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* clear tab stop(s)
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_clrtab(struct video_state *svsp)
|
|
{
|
|
int i;
|
|
|
|
if(svsp->parms[0] == 0)
|
|
svsp->tab_stops[svsp->col] = 0;
|
|
else if(svsp->parms[0] == 3)
|
|
{
|
|
for(i=0; i<MAXTAB; i++)
|
|
svsp->tab_stops[i] = 0;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* DECSC - save cursor & attributes
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_sc(struct video_state *svsp)
|
|
{
|
|
svsp->sc_flag = 1;
|
|
svsp->sc_row = svsp->row;
|
|
svsp->sc_col = svsp->col;
|
|
svsp->sc_cur_offset = svsp->cur_offset;
|
|
svsp->sc_attr = svsp->c_attr;
|
|
svsp->sc_awm = svsp->m_awm;
|
|
svsp->sc_om = svsp->m_om;
|
|
svsp->sc_G0 = svsp->G0;
|
|
svsp->sc_G1 = svsp->G1;
|
|
svsp->sc_G2 = svsp->G2;
|
|
svsp->sc_G3 = svsp->G3;
|
|
svsp->sc_GL = svsp->GL;
|
|
svsp->sc_GR = svsp->GR;
|
|
svsp->sc_sel = svsp->selchar;
|
|
svsp->sc_vtsgr = svsp->vtsgr;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* DECRC - restore cursor & attributes
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_rc(struct video_state *svsp)
|
|
{
|
|
if(svsp->sc_flag == 1)
|
|
{
|
|
svsp->sc_flag = 0;
|
|
svsp->row = svsp->sc_row;
|
|
svsp->col = svsp->sc_col;
|
|
svsp->cur_offset = svsp->sc_cur_offset;
|
|
svsp->c_attr = svsp->sc_attr;
|
|
svsp->m_awm = svsp->sc_awm;
|
|
svsp->m_om = svsp->sc_om;
|
|
svsp->G0 = svsp->sc_G0;
|
|
svsp->G1 = svsp->sc_G1;
|
|
svsp->G2 = svsp->sc_G2;
|
|
svsp->G3 = svsp->sc_G3;
|
|
svsp->GL = svsp->sc_GL;
|
|
svsp->GR = svsp->sc_GR;
|
|
svsp->selchar = svsp->sc_sel;
|
|
svsp->vtsgr = svsp->sc_vtsgr;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* designate a character set as G0, G1, G2 or G3 for 94/96 char sets
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_designate(struct video_state *svsp)
|
|
{
|
|
u_short *ctp = NULL;
|
|
u_char ch;
|
|
|
|
if(svsp->whichi == 1)
|
|
ch = svsp->which[0];
|
|
else
|
|
{
|
|
int i;
|
|
|
|
if(svsp->dld_id[0] == '\0')
|
|
return;
|
|
|
|
if(!(((adaptor_type == EGA_ADAPTOR) ||
|
|
(adaptor_type == VGA_ADAPTOR)) &&
|
|
(vgacs[svsp->vga_charset].secondloaded)))
|
|
{
|
|
return;
|
|
}
|
|
|
|
for(i = (svsp->whichi)-1; i >= 0; i--)
|
|
{
|
|
if(svsp->which[i] != svsp->dld_id[i])
|
|
return;
|
|
}
|
|
#ifdef HAVECSE_DOWNLOADABLE
|
|
ctp = cse_downloadable;
|
|
swcsp(svsp, ctp);
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
if(((adaptor_type == EGA_ADAPTOR) || (adaptor_type == VGA_ADAPTOR)) &&
|
|
(vgacs[svsp->vga_charset].secondloaded))
|
|
{
|
|
if((ch == svsp->dld_id[0]) && (svsp->dld_id[1] == '\0'))
|
|
{
|
|
#ifdef HAVECSE_DOWNLOADABLE
|
|
ctp = cse_downloadable;
|
|
swcsp(svsp, ctp);
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
switch(ch)
|
|
{
|
|
case 'A': /* British or ISO-Latin-1 */
|
|
switch(svsp->state)
|
|
{
|
|
case STATE_BROPN: /* designate G0 */
|
|
case STATE_BRCLO: /* designate G1 */
|
|
case STATE_STAR: /* designate G2 */
|
|
case STATE_PLUS: /* designate G3 */
|
|
#ifdef HAVECSE_BRITISH
|
|
ctp = cse_british;
|
|
#endif
|
|
break;
|
|
|
|
case STATE_MINUS: /* designate G1 (96)*/
|
|
case STATE_DOT: /* designate G2 (96)*/
|
|
case STATE_SLASH: /* designate G3 (96)*/
|
|
#ifdef HAVECSE_ISOLATIN
|
|
ctp = cse_isolatin;
|
|
#endif
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 'B': /* USASCII */
|
|
#ifdef HAVECSE_ASCII
|
|
ctp = cse_ascii;
|
|
#endif
|
|
break;
|
|
|
|
case 'C': /* Finnish */
|
|
case '5': /* Finnish */
|
|
#ifdef HAVECSE_FINNISH
|
|
ctp = cse_finnish;
|
|
#endif
|
|
break;
|
|
|
|
case 'E': /* Norwegian/Danish */
|
|
case '6': /* Norwegian/Danish */
|
|
#ifdef HAVECSE_NORWEGIANDANISH
|
|
ctp = cse_norwegiandanish;
|
|
#endif
|
|
break;
|
|
|
|
case 'H': /* Swedish */
|
|
case '7': /* Swedish */
|
|
#ifdef HAVECSE_SWEDISH
|
|
ctp = cse_swedish;
|
|
#endif
|
|
break;
|
|
|
|
case 'K': /* German */
|
|
#ifdef HAVECSE_GERMAN
|
|
ctp = cse_german;
|
|
#endif
|
|
break;
|
|
|
|
case 'Q': /* French Canadien */
|
|
#ifdef HAVECSE_FRENCHCANADA
|
|
ctp = cse_frenchcanada;
|
|
#endif
|
|
break;
|
|
|
|
case 'R': /* French */
|
|
#ifdef HAVECSE_FRENCH
|
|
ctp = cse_french;
|
|
#endif
|
|
break;
|
|
|
|
case 'Y': /* Italian */
|
|
#ifdef HAVECSE_ITALIAN
|
|
ctp = cse_italian;
|
|
#endif
|
|
break;
|
|
|
|
case 'Z': /* Spanish */
|
|
#ifdef HAVECSE_SPANISH
|
|
ctp = cse_spanish;
|
|
#endif
|
|
break;
|
|
|
|
case '0': /* special graphics */
|
|
#ifdef HAVECSE_SPECIAL
|
|
ctp = cse_special;
|
|
#endif
|
|
break;
|
|
|
|
case '1': /* alternate ROM */
|
|
#ifdef HAVECSE_ALTERNATEROM1
|
|
ctp = cse_alternaterom1;
|
|
#endif
|
|
break;
|
|
|
|
case '2': /* alt ROM, spec graphics */
|
|
#ifdef HAVECSE_ALTERNATEROM2
|
|
ctp = cse_alternaterom2;
|
|
#endif
|
|
break;
|
|
|
|
case '3': /* HP Roman 8, upper 128 chars*/
|
|
#ifdef HAVECSE_ROMAN8
|
|
ctp = cse_roman8;
|
|
#endif
|
|
break;
|
|
|
|
case '4': /* Dutch */
|
|
#ifdef HAVECSE_DUTCH
|
|
ctp = cse_dutch;
|
|
#endif
|
|
break;
|
|
|
|
case '<': /* DEC Supplemental */
|
|
#ifdef HAVECSE_SUPPLEMENTAL
|
|
ctp = cse_supplemental;
|
|
#endif
|
|
break;
|
|
|
|
case '=': /* Swiss */
|
|
#ifdef HAVECSE_SWISS
|
|
ctp = cse_swiss;
|
|
#endif
|
|
break;
|
|
|
|
case '>': /* DEC Technical */
|
|
#ifdef HAVECSE_TECHNICAL
|
|
ctp = cse_technical;
|
|
#endif
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch(ch)
|
|
{
|
|
case 'A': /* British or ISO-Latin-1 */
|
|
switch(svsp->state)
|
|
{
|
|
case STATE_BROPN: /* designate G0 */
|
|
case STATE_BRCLO: /* designate G1 */
|
|
case STATE_STAR: /* designate G2 */
|
|
case STATE_PLUS: /* designate G3 */
|
|
#ifdef HAVECSD_BRITISH
|
|
ctp = csd_british;
|
|
#endif
|
|
break;
|
|
|
|
case STATE_MINUS: /* designate G1 (96)*/
|
|
case STATE_DOT: /* designate G2 (96)*/
|
|
case STATE_SLASH: /* designate G3 (96)*/
|
|
#ifdef HAVECSD_ISOLATIN
|
|
ctp = csd_isolatin;
|
|
#endif
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 'B': /* USASCII */
|
|
#ifdef HAVECSD_ASCII
|
|
ctp = csd_ascii;
|
|
#endif
|
|
break;
|
|
|
|
case 'C': /* Finnish */
|
|
case '5': /* Finnish */
|
|
#ifdef HAVECSD_FINNISH
|
|
ctp = csd_finnish;
|
|
#endif
|
|
break;
|
|
|
|
case 'E': /* Norwegian/Danish */
|
|
case '6': /* Norwegian/Danish */
|
|
#ifdef HAVECSD_NORWEGIANDANISH
|
|
ctp = csd_norwegiandanish;
|
|
#endif
|
|
break;
|
|
|
|
case 'H': /* Swedish */
|
|
case '7': /* Swedish */
|
|
#ifdef HAVECSD_SWEDISH
|
|
ctp = csd_swedish;
|
|
#endif
|
|
break;
|
|
|
|
case 'K': /* German */
|
|
#ifdef HAVECSD_GERMAN
|
|
ctp = csd_german;
|
|
#endif
|
|
break;
|
|
|
|
case 'Q': /* French Canadien */
|
|
#ifdef HAVECSD_FRENCHCANADA
|
|
ctp = csd_frenchcanada;
|
|
#endif
|
|
break;
|
|
|
|
case 'R': /* French */
|
|
#ifdef HAVECSD_FRENCH
|
|
ctp = csd_french;
|
|
#endif
|
|
break;
|
|
|
|
case 'Y': /* Italian */
|
|
#ifdef HAVECSD_ITALIAN
|
|
ctp = csd_italian;
|
|
#endif
|
|
break;
|
|
|
|
case 'Z': /* Spanish */
|
|
#ifdef HAVECSD_SPANISH
|
|
ctp = csd_spanish;
|
|
#endif
|
|
break;
|
|
|
|
case '0': /* special graphics */
|
|
#ifdef HAVECSD_SPECIAL
|
|
ctp = csd_special;
|
|
#endif
|
|
break;
|
|
|
|
case '1': /* alternate ROM */
|
|
#ifdef HAVECSD_ALTERNATEROM1
|
|
ctp = csd_alternaterom1;
|
|
#endif
|
|
break;
|
|
|
|
case '2': /* alt ROM, spec graphics */
|
|
#ifdef HAVECSD_ALTERNATEROM2
|
|
ctp = csd_alternaterom2;
|
|
#endif
|
|
break;
|
|
|
|
case '3': /* HP Roman 8, upper 128 chars*/
|
|
#ifdef HAVECSD_ROMAN8
|
|
ctp = csd_roman8;
|
|
#endif
|
|
break;
|
|
|
|
case '4': /* Dutch */
|
|
#ifdef HAVECSD_DUTCH
|
|
ctp = csd_dutch;
|
|
#endif
|
|
break;
|
|
|
|
case '<': /* DEC Supplemental */
|
|
#ifdef HAVECSD_SUPPLEMENTAL
|
|
ctp = csd_supplemental;
|
|
#endif
|
|
break;
|
|
|
|
case '=': /* Swiss */
|
|
#ifdef HAVECSD_SWISS
|
|
ctp = csd_swiss;
|
|
#endif
|
|
break;
|
|
|
|
case '>': /* DEC Technical */
|
|
#ifdef HAVECSD_TECHNICAL
|
|
ctp = csd_technical;
|
|
#endif
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
swcsp(svsp, ctp);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* device attributes
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_da(struct video_state *svsp)
|
|
{
|
|
static u_char *response = (u_char *)DA_VT220;
|
|
|
|
svsp->report_chars = response;
|
|
svsp->report_count = 18;
|
|
respond(svsp);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* screen alignment display
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_aln(struct video_state *svsp)
|
|
{
|
|
register int i;
|
|
|
|
svsp->cur_offset = 0;
|
|
svsp->col = 0;
|
|
|
|
for(i=0; i < (svsp->screen_rows*svsp->maxcol); i++)
|
|
{
|
|
*(svsp->Crtat + svsp->cur_offset) = user_attr | 'E';
|
|
vt_selattr(svsp);
|
|
svsp->cur_offset++;
|
|
svsp->col++;
|
|
}
|
|
|
|
svsp->cur_offset = 0; /* reset everything ! */
|
|
svsp->col = 0;
|
|
svsp->row = 0;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* request terminal parameters
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_reqtparm(struct video_state *svsp)
|
|
{
|
|
static u_char *answr = (u_char *)"\033[3;1;1;120;120;1;0x";
|
|
|
|
svsp->report_chars = answr;
|
|
svsp->report_count = 20;
|
|
respond(svsp);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* invoke selftest
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_tst(struct video_state *svsp)
|
|
{
|
|
clear_dld(svsp);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* device status reports
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_dsr(struct video_state *svsp)
|
|
{
|
|
static u_char *answr = (u_char *)"\033[0n";
|
|
static u_char *panswr = (u_char *)"\033[?13n"; /* Printer Unattached */
|
|
static u_char *udkanswr = (u_char *)"\033[?21n"; /* UDK Locked */
|
|
static u_char *langanswr = (u_char *)"\033[?27;1n"; /* North American*/
|
|
static u_char buffer[16];
|
|
int i = 0;
|
|
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 5: /* return status */
|
|
svsp->report_chars = answr;
|
|
svsp->report_count = 4;
|
|
respond(svsp);
|
|
break;
|
|
|
|
case 6: /* return cursor position */
|
|
buffer[i++] = 0x1b;
|
|
buffer[i++] = '[';
|
|
if((svsp->row+1) > 10)
|
|
buffer[i++] = ((svsp->row+1) / 10) + '0';
|
|
buffer[i++] = ((svsp->row+1) % 10) + '0';
|
|
buffer[i++] = ';';
|
|
if((svsp->col+1) > 10)
|
|
buffer[i++] = ((svsp->col+1) / 10) + '0';
|
|
buffer[i++] = ((svsp->col+1) % 10) + '0';
|
|
buffer[i++] = 'R';
|
|
buffer[i++] = '\0';
|
|
|
|
svsp->report_chars = buffer;
|
|
svsp->report_count = i;
|
|
respond(svsp);
|
|
break;
|
|
|
|
case 15: /* return printer status */
|
|
svsp->report_chars = panswr;
|
|
svsp->report_count = 6;
|
|
respond(svsp);
|
|
break;
|
|
|
|
case 25: /* return udk status */
|
|
svsp->report_chars = udkanswr;
|
|
svsp->report_count = 6;
|
|
respond(svsp);
|
|
break;
|
|
|
|
case 26: /* return language status */
|
|
svsp->report_chars = langanswr;
|
|
svsp->report_count = 8;
|
|
respond(svsp);
|
|
break;
|
|
|
|
default: /* nothing else valid */
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* IL - insert line
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_il(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if((svsp->row >= svsp->scrr_beg) && (svsp->row <= svsp->scrr_end))
|
|
{
|
|
if(p <= 0)
|
|
p = 1;
|
|
else if(p > svsp->scrr_end - svsp->row)
|
|
p = svsp->scrr_end - svsp->row;
|
|
|
|
svsp->cur_offset -= svsp->col;
|
|
svsp->col = 0;
|
|
if(svsp->row == svsp->scrr_beg)
|
|
roll_down(svsp, p);
|
|
else
|
|
{
|
|
bcopy(svsp->Crtat + svsp->cur_offset,
|
|
svsp->Crtat + svsp->cur_offset + (p * svsp->maxcol),
|
|
svsp->maxcol * (svsp->scrr_end-svsp->row+1-p) * CHR );
|
|
|
|
fillw(user_attr | ' ',
|
|
svsp->Crtat + svsp->cur_offset,
|
|
p * svsp->maxcol);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* ICH - insert character
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_ic(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if(p <= 0)
|
|
p = 1;
|
|
else if(p > svsp->maxcol-svsp->col)
|
|
p = svsp->maxcol-svsp->col;
|
|
|
|
while(p--)
|
|
{
|
|
bcopy((svsp->Crtat + svsp->cur_offset),
|
|
(svsp->Crtat + svsp->cur_offset) + 1,
|
|
(((svsp->maxcol)-1)-svsp->col) * CHR);
|
|
|
|
*(svsp->Crtat + svsp->cur_offset) = user_attr | ' ';
|
|
vt_selattr(svsp);
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* DL - delete line
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_dl(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if((svsp->row >= svsp->scrr_beg) && (svsp->row <= svsp->scrr_end))
|
|
{
|
|
if(p <= 0)
|
|
p = 1;
|
|
else if(p > svsp->scrr_end - svsp->row)
|
|
p = svsp->scrr_end - svsp->row;
|
|
|
|
svsp->cur_offset -= svsp->col;
|
|
svsp->col = 0;
|
|
|
|
if(svsp->row == svsp->scrr_beg)
|
|
roll_up(svsp, p);
|
|
else
|
|
{
|
|
bcopy(svsp->Crtat + svsp->cur_offset + (p * svsp->maxcol),
|
|
svsp->Crtat + svsp->cur_offset,
|
|
svsp->maxcol * (svsp->scrr_end-svsp->row+1-p) * CHR );
|
|
|
|
fillw(user_attr | ' ',
|
|
svsp->Crtat + ((svsp->scrr_end-p+1) * svsp->maxcol),
|
|
p * svsp->maxcol);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* DCH - delete character
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_dch(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if(p <= 0)
|
|
p = 1;
|
|
else if(p > svsp->maxcol-svsp->col)
|
|
p = svsp->maxcol-svsp->col;
|
|
|
|
while(p--)
|
|
{
|
|
bcopy((svsp->Crtat + svsp->cur_offset)+1,
|
|
(svsp->Crtat + svsp->cur_offset),
|
|
(((svsp->maxcol)-1) - svsp->col)* CHR );
|
|
|
|
*((svsp->Crtat + svsp->cur_offset) +
|
|
((svsp->maxcol)-1)-svsp->col) = user_attr | ' ';
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* scroll up
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_su(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if(p <= 0)
|
|
p = 1;
|
|
else if(p > svsp->screen_rows-1)
|
|
p = svsp->screen_rows-1;
|
|
|
|
roll_up(svsp, p);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* scroll down
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_sd(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if(p <= 0)
|
|
p = 1;
|
|
else if(p > svsp->screen_rows-1)
|
|
p = svsp->screen_rows-1;
|
|
|
|
roll_down(svsp, p);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* ECH - erase character
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_ech(struct video_state *svsp)
|
|
{
|
|
register int p = svsp->parms[0];
|
|
|
|
if(p <= 0)
|
|
p = 1;
|
|
else if(p > svsp->maxcol-svsp->col)
|
|
p = svsp->maxcol-svsp->col;
|
|
|
|
fillw(user_attr | ' ', (svsp->Crtat + svsp->cur_offset), p);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* media copy (NO PRINTER AVAILABLE IN KERNEL ...)
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_mc(struct video_state *svsp)
|
|
{
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* Device Control String State Machine Entry for:
|
|
*
|
|
* DECUDK - user-defined keys and
|
|
* DECDLD - downloadable charset
|
|
*
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_dcsentry(int ch, struct video_state *svsp)
|
|
{
|
|
switch(svsp->dcs_state)
|
|
{
|
|
case DCS_INIT:
|
|
switch(ch)
|
|
{
|
|
case '0':
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9': /* parameters */
|
|
svsp->parms[svsp->parmi] *= 10;
|
|
svsp->parms[svsp->parmi] += (ch -'0');
|
|
break;
|
|
|
|
case ';': /* next parameter */
|
|
svsp->parmi =
|
|
(svsp->parmi+1 < MAXPARMS) ?
|
|
svsp->parmi+1 : svsp->parmi;
|
|
break;
|
|
|
|
case '|': /* DECUDK */
|
|
svsp->transparent = 1;
|
|
init_udk(svsp);
|
|
svsp->dcs_state = DCS_AND_UDK;
|
|
break;
|
|
|
|
case '{': /* DECDLD */
|
|
svsp->transparent = 1;
|
|
init_dld(svsp);
|
|
svsp->dcs_state = DCS_DLD_DSCS;
|
|
break;
|
|
|
|
default: /* failsafe */
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case DCS_AND_UDK: /* DCS ... | */
|
|
switch(ch)
|
|
{
|
|
case '0':
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9': /* fkey number */
|
|
svsp->udk_fnckey *= 10;
|
|
svsp->udk_fnckey += (ch -'0');
|
|
break;
|
|
|
|
case '/': /* Key */
|
|
svsp->dcs_state = DCS_UDK_DEF;
|
|
break;
|
|
|
|
case 0x1b: /* ESC */
|
|
svsp->dcs_state = DCS_UDK_ESC;
|
|
break;
|
|
|
|
default:
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case DCS_UDK_DEF: /* DCS ... | fnckey / */
|
|
switch(ch)
|
|
{
|
|
case '0':
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9':
|
|
if(svsp->udk_deflow) /* low nibble */
|
|
{
|
|
svsp->udk_def[svsp->udk_defi] |= (ch -'0');
|
|
svsp->udk_deflow = 0;
|
|
svsp->udk_defi = (svsp->udk_defi+1 >= MAXUDKDEF) ?
|
|
svsp->udk_defi : svsp->udk_defi+1;
|
|
}
|
|
else /* high nibble */
|
|
{
|
|
svsp->udk_def[svsp->udk_defi] = ((ch -'0') << 4);
|
|
svsp->udk_deflow = 1;
|
|
}
|
|
break;
|
|
|
|
case 'a':
|
|
case 'b':
|
|
case 'c':
|
|
case 'd':
|
|
case 'e':
|
|
case 'f':
|
|
if(svsp->udk_deflow) /* low nibble */
|
|
{
|
|
svsp->udk_def[svsp->udk_defi] |= (ch - 'a' + 10);
|
|
svsp->udk_deflow = 0;
|
|
svsp->udk_defi = (svsp->udk_defi+1 >= MAXUDKDEF) ?
|
|
svsp->udk_defi : svsp->udk_defi+1;
|
|
}
|
|
else /* high nibble */
|
|
{
|
|
svsp->udk_def[svsp->udk_defi] = ((ch - 'a' + 10) << 4);
|
|
svsp->udk_deflow = 1;
|
|
}
|
|
break;
|
|
|
|
|
|
|
|
case 'A':
|
|
case 'B':
|
|
case 'C':
|
|
case 'D':
|
|
case 'E':
|
|
case 'F':
|
|
if(svsp->udk_deflow) /* low nibble */
|
|
{
|
|
svsp->udk_def[svsp->udk_defi] |= (ch - 'A' + 10);
|
|
svsp->udk_deflow = 0;
|
|
svsp->udk_defi = (svsp->udk_defi+1 >= MAXUDKDEF) ?
|
|
svsp->udk_defi : svsp->udk_defi+1;
|
|
}
|
|
else /* high nibble */
|
|
{
|
|
svsp->udk_def[svsp->udk_defi] = ((ch - 'A' + 10) << 4);
|
|
svsp->udk_deflow = 1;
|
|
}
|
|
break;
|
|
|
|
case ';': /* next function key */
|
|
vt_udk(svsp);
|
|
svsp->dcs_state = DCS_AND_UDK;
|
|
break;
|
|
|
|
case 0x1b: /* ESC */
|
|
svsp->dcs_state = DCS_UDK_ESC;
|
|
break;
|
|
|
|
default:
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case DCS_UDK_ESC: /* DCS ... | fkey/def ... ESC */
|
|
switch(ch)
|
|
{
|
|
case '\\': /* ST */
|
|
vt_udk(svsp);
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
break;
|
|
|
|
default:
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
|
|
case DCS_DLD_DSCS: /* got DCS ... { */
|
|
if(ch >= ' ' && ch <= '/') /* intermediates ... */
|
|
{
|
|
svsp->dld_dscs[svsp->dld_dscsi] = ch;
|
|
svsp->dld_id[svsp->dld_dscsi] = ch;
|
|
if(svsp->dld_dscsi >= DSCS_LENGTH)
|
|
{
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
svsp->dld_id[0] = '\0';
|
|
}
|
|
else
|
|
{
|
|
svsp->dld_dscsi++;
|
|
}
|
|
}
|
|
else if(ch >= '0' && ch <= '~') /* final .... */
|
|
{
|
|
svsp->dld_dscs[svsp->dld_dscsi] = ch;
|
|
svsp->dld_id[svsp->dld_dscsi++] = ch;
|
|
svsp->dld_id[svsp->dld_dscsi] = '\0';
|
|
svsp->dcs_state = DCS_DLD_DEF;
|
|
}
|
|
else
|
|
{
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
svsp->dld_id[0] = '\0';
|
|
}
|
|
break;
|
|
|
|
case DCS_DLD_DEF: /* DCS ... { dscs */
|
|
switch(ch)
|
|
{
|
|
case 0x1b: /* ESC */
|
|
svsp->dcs_state = DCS_DLD_ESC;
|
|
break;
|
|
|
|
case '/': /* sixel upper / lower divider */
|
|
svsp->dld_sixel_lower = 1;
|
|
break;
|
|
|
|
case ';': /* character divider */
|
|
vt_dld(svsp);
|
|
svsp->parms[1]++; /* next char */
|
|
break;
|
|
|
|
default:
|
|
if (svsp->dld_sixel_lower)
|
|
{
|
|
if(ch >= '?' && ch <= '~')
|
|
svsp->sixel.lower[svsp->dld_sixelli] = ch - '?';
|
|
svsp->dld_sixelli =
|
|
(svsp->dld_sixelli+1 < MAXSIXEL) ?
|
|
svsp->dld_sixelli+1 : svsp->dld_sixelli;
|
|
}
|
|
else
|
|
{
|
|
if(ch >= '?' && ch <= '~')
|
|
svsp->sixel.upper[svsp->dld_sixelui] = ch - '?';
|
|
svsp->dld_sixelui =
|
|
(svsp->dld_sixelui+1 < MAXSIXEL) ?
|
|
svsp->dld_sixelui+1 : svsp->dld_sixelui;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case DCS_DLD_ESC: /* DCS ... { dscs ... / ... ESC */
|
|
switch(ch)
|
|
{
|
|
case '\\': /* String Terminator ST */
|
|
vt_dld(svsp);
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
break;
|
|
|
|
default:
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
svsp->dld_id[0] = '\0';
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
svsp->transparent = 0;
|
|
svsp->state = STATE_INIT;
|
|
svsp->dcs_state = DCS_INIT;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* User Defineable Keys
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_udk(struct video_state *svsp)
|
|
{
|
|
int key, start, max, i;
|
|
int usedff = 0;
|
|
|
|
if(svsp->parms[0] != 1) /* clear all ? */
|
|
{
|
|
vt_clearudk(svsp);
|
|
svsp->parms[0] = 1;
|
|
}
|
|
|
|
if(svsp->udk_fnckey < 17 || svsp->udk_fnckey > 34)
|
|
{
|
|
init_udk(svsp);
|
|
return;
|
|
}
|
|
|
|
key = svsp->udk_fnckey - 17; /* index into table */
|
|
|
|
if(svsp->ukt.length[key] == 0) /* never used ? */
|
|
{
|
|
if(svsp->udkff < MAXUDKDEF-2) /* space available ? */
|
|
{
|
|
start = svsp->udkff; /* next sequential */
|
|
max = MAXUDKDEF - svsp->udkff; /* space available */
|
|
svsp->ukt.first[key] = start; /* start entry */
|
|
usedff = 1; /* flag to update later */
|
|
}
|
|
else /* no space */
|
|
{
|
|
init_udk(svsp);
|
|
return;
|
|
}
|
|
}
|
|
else /* in use, redefine */
|
|
{
|
|
start = svsp->ukt.first[key]; /* start entry */
|
|
max = svsp->ukt.length[key]; /* space available */
|
|
}
|
|
|
|
if(max < 2) /* hmmm .. */
|
|
{
|
|
init_udk(svsp);
|
|
return;
|
|
}
|
|
|
|
max--; /* adjust for tailing '\0' */
|
|
|
|
for(i = 0; i < max && i < svsp->udk_defi; i++)
|
|
svsp->udkbuf[start++] = svsp->udk_def[i];
|
|
|
|
svsp->udkbuf[start] = '\0'; /* make it a string, see pcvt_kbd.c */
|
|
svsp->ukt.length[key] = i+1; /* count for tailing '\0' */
|
|
if(usedff)
|
|
svsp->udkff += (i+2); /* new start location */
|
|
|
|
init_udk(svsp);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* clear all User Defineable Keys
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_clearudk(struct video_state *svsp)
|
|
{
|
|
register int i;
|
|
|
|
for(i = 0; i < MAXUDKEYS; i++)
|
|
{
|
|
svsp->ukt.first[i] = 0;
|
|
svsp->ukt.length[i] = 0;
|
|
}
|
|
svsp->udkff = 0;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* Down line LoaDable Fonts
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_dld(struct video_state *svsp)
|
|
{
|
|
unsigned char vgacharset;
|
|
unsigned char vgachar[16];
|
|
unsigned char vgacharb[16];
|
|
|
|
if(vgacs[svsp->vga_charset].secondloaded)
|
|
vgacharset = vgacs[svsp->vga_charset].secondloaded;
|
|
else
|
|
return;
|
|
|
|
svsp->parms[1] = (svsp->parms[1] < 1) ? 1 :
|
|
((svsp->parms[1] > 0x7E) ? 0x7E : svsp->parms[1]);
|
|
|
|
if(svsp->parms[2] != 1) /* Erase all characters ? */
|
|
{
|
|
clear_dld(svsp);
|
|
svsp->parms[2] = 1; /* Only erase all characters once per sequence */
|
|
}
|
|
|
|
sixel_vga(&(svsp->sixel),vgachar);
|
|
|
|
switch(vgacs[vgacharset].char_scanlines & 0x1F)
|
|
{
|
|
case 7:
|
|
vga10_vga8(vgachar,vgacharb);
|
|
break;
|
|
|
|
case 9:
|
|
default:
|
|
vga10_vga10(vgachar,vgacharb);
|
|
break;
|
|
|
|
case 13:
|
|
vga10_vga14(vgachar,vgacharb);
|
|
break;
|
|
|
|
case 15:
|
|
vga10_vga16(vgachar,vgacharb);
|
|
break;
|
|
}
|
|
|
|
loadchar(vgacharset, svsp->parms[1] + 0xA0, 16, vgacharb);
|
|
|
|
init_dld(svsp);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* select character attributes
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_sca(struct video_state *svsp)
|
|
{
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 1:
|
|
svsp->selchar = 1;
|
|
break;
|
|
case 0:
|
|
case 2:
|
|
default:
|
|
svsp->selchar = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* initalize selective attribute bit array
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_initsel(struct video_state *svsp)
|
|
{
|
|
register int i;
|
|
|
|
for(i = 0;i < MAXDECSCA;i++)
|
|
svsp->decsca[i] = 0;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* DECSEL - selective erase in line
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_sel(struct video_state *svsp)
|
|
{
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 0:
|
|
selective_erase(svsp, (svsp->Crtat + svsp->cur_offset),
|
|
svsp->maxcol-svsp->col);
|
|
break;
|
|
|
|
case 1:
|
|
selective_erase(svsp, (svsp->Crtat + svsp->cur_offset)-
|
|
svsp->col, svsp->col + 1);
|
|
break;
|
|
|
|
case 2:
|
|
selective_erase(svsp, (svsp->Crtat + svsp->cur_offset)-
|
|
svsp->col, svsp->maxcol);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* DECSED - selective erase in display
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
vt_sed(struct video_state *svsp)
|
|
{
|
|
switch(svsp->parms[0])
|
|
{
|
|
case 0:
|
|
selective_erase(svsp, (svsp->Crtat + svsp->cur_offset),
|
|
svsp->Crtat + (svsp->maxcol * svsp->screen_rows) -
|
|
(svsp->Crtat + svsp->cur_offset));
|
|
break;
|
|
|
|
case 1:
|
|
selective_erase(svsp, svsp->Crtat,
|
|
(svsp->Crtat + svsp->cur_offset) - svsp->Crtat + 1 );
|
|
break;
|
|
|
|
case 2:
|
|
selective_erase(svsp, svsp->Crtat,
|
|
svsp->maxcol * svsp->screen_rows);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* scroll screen n lines up
|
|
*---------------------------------------------------------------------------*/
|
|
void
|
|
roll_up(struct video_state *svsp, int n)
|
|
{
|
|
if(svsp->scrr_beg == 0 && /* if scroll region is whole screen */
|
|
svsp->scrr_len == svsp->screen_rows &&
|
|
(svsp != vsp || /* and either running in memory */
|
|
(svsp->screen_rows == svsp->screen_rowsize && /* or no fkeys */
|
|
adaptor_type != MDA_ADAPTOR))) /* and not on MDA/Hercules */
|
|
{
|
|
u_short *Memory =
|
|
#ifdef XSERVER
|
|
(vsp != svsp || (vsp->vt_status & VT_GRAFX)) ?
|
|
#else
|
|
(vsp != svsp) ?
|
|
#endif
|
|
svsp->Memory : Crtat;
|
|
|
|
if(svsp->Crtat > (Memory + (svsp->screen_rows - n) *
|
|
svsp->maxcol))
|
|
{
|
|
bcopy(svsp->Crtat + svsp->maxcol * n, Memory,
|
|
svsp->maxcol * (svsp->screen_rows - n) * CHR);
|
|
|
|
svsp->Crtat = Memory;
|
|
}
|
|
else
|
|
{
|
|
svsp->Crtat += n * svsp->maxcol;
|
|
}
|
|
#ifdef XSERVER
|
|
if(vsp == svsp && !(vsp->vt_status & VT_GRAFX))
|
|
#else
|
|
if(vsp == svsp)
|
|
#endif
|
|
{
|
|
outb(addr_6845, CRTC_STARTADRH);
|
|
outb(addr_6845+1, (svsp->Crtat - Crtat) >> 8);
|
|
outb(addr_6845, CRTC_STARTADRL);
|
|
outb(addr_6845+1, (svsp->Crtat - Crtat));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bcopy( svsp->Crtat + ((svsp->scrr_beg + n) * svsp->maxcol),
|
|
svsp->Crtat + (svsp->scrr_beg * svsp->maxcol),
|
|
svsp->maxcol * (svsp->scrr_len - n) * CHR );
|
|
}
|
|
fillw( user_attr | ' ',
|
|
svsp->Crtat + ((svsp->scrr_end - n + 1) * svsp->maxcol),
|
|
n * svsp->maxcol);
|
|
|
|
/*XXX*/ if(svsp->scroll_lock && svsp->openf && curproc)
|
|
tsleep((caddr_t)&(svsp->scroll_lock), PPAUSE, "scrlck", 0);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* scroll screen n lines down
|
|
*---------------------------------------------------------------------------*/
|
|
static void
|
|
roll_down(struct video_state *svsp, int n)
|
|
{
|
|
if(svsp->scrr_beg == 0 && /* if scroll region is whole screen */
|
|
svsp->scrr_len == svsp->screen_rows &&
|
|
(svsp != vsp || /* and either running in memory */
|
|
(svsp->screen_rows == svsp->screen_rowsize && /* or no fkeys */
|
|
adaptor_type != MDA_ADAPTOR))) /* and not on MDA/Hercules */
|
|
{
|
|
u_short *Memory =
|
|
#ifdef XSERVER
|
|
(vsp != svsp || (vsp->vt_status & VT_GRAFX)) ?
|
|
#else
|
|
(vsp != svsp) ?
|
|
#endif
|
|
svsp->Memory : Crtat;
|
|
|
|
if (svsp->Crtat < (Memory + n * svsp->maxcol))
|
|
{
|
|
bcopy(svsp->Crtat,
|
|
Memory + svsp->maxcol * (svsp->screen_rows + n),
|
|
svsp->maxcol * (svsp->screen_rows - n) * CHR);
|
|
|
|
svsp->Crtat = Memory + svsp->maxcol * svsp->screen_rows;
|
|
}
|
|
else
|
|
{
|
|
svsp->Crtat -= n * svsp->maxcol;
|
|
}
|
|
#ifdef XSERVER
|
|
if(vsp == svsp && !(vsp->vt_status & VT_GRAFX))
|
|
#else
|
|
if(vsp == svsp)
|
|
#endif
|
|
{
|
|
outb(addr_6845, CRTC_STARTADRH);
|
|
outb(addr_6845+1, (svsp->Crtat - Crtat) >> 8);
|
|
outb(addr_6845, CRTC_STARTADRL);
|
|
outb(addr_6845+1, (svsp->Crtat - Crtat));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bcopy( svsp->Crtat + (svsp->scrr_beg * svsp->maxcol),
|
|
svsp->Crtat + ((svsp->scrr_beg + n) * svsp->maxcol),
|
|
svsp->maxcol * (svsp->scrr_len - n) * CHR );
|
|
}
|
|
fillw( user_attr | ' ',
|
|
svsp->Crtat + (svsp->scrr_beg * svsp->maxcol),
|
|
n * svsp->maxcol);
|
|
|
|
/*XXX*/ if(svsp->scroll_lock && svsp->openf && curproc)
|
|
tsleep((caddr_t)&(svsp->scroll_lock), PPAUSE, "scrlck", 0);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* switch charset pointers
|
|
*---------------------------------------------------------------------------*/
|
|
static void
|
|
swcsp(struct video_state *svsp, u_short *ctp)
|
|
{
|
|
if(ctp == NULL)
|
|
return;
|
|
|
|
switch(svsp->state)
|
|
{
|
|
case STATE_BROPN: /* designate G0 */
|
|
svsp->G0 = ctp;
|
|
break;
|
|
|
|
case STATE_BRCLO: /* designate G1 */
|
|
case STATE_MINUS: /* designate G1 (96) */
|
|
svsp->G1 = ctp;
|
|
break;
|
|
|
|
case STATE_STAR: /* designate G2 */
|
|
case STATE_DOT: /* designate G2 (96) */
|
|
svsp->G2 = ctp;
|
|
break;
|
|
|
|
case STATE_PLUS: /* designate G3 */
|
|
case STATE_SLASH: /* designate G3 (96) */
|
|
svsp->G3 = ctp;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* process terminal responses
|
|
*---------------------------------------------------------------------------*/
|
|
static void
|
|
respond(struct video_state *svsp)
|
|
{
|
|
if(!(svsp->openf)) /* are we opened ? */
|
|
return;
|
|
|
|
while (*svsp->report_chars && svsp->report_count > 0)
|
|
{
|
|
(*linesw[svsp->vs_tty->t_line].l_rint)
|
|
(*svsp->report_chars++ & 0xff, svsp->vs_tty);
|
|
svsp->report_count--;
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* Initialization for User Defineable Keys
|
|
*---------------------------------------------------------------------------*/
|
|
static void
|
|
init_udk(struct video_state *svsp)
|
|
{
|
|
svsp->udk_defi = 0;
|
|
svsp->udk_deflow = 0;
|
|
svsp->udk_fnckey = 0;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* Clear loaded downloadable (DLD) character set
|
|
*---------------------------------------------------------------------------*/
|
|
static void
|
|
clear_dld(struct video_state *svsp)
|
|
{
|
|
register int i;
|
|
unsigned char vgacharset;
|
|
unsigned char vgachar[16];
|
|
|
|
if(vgacs[svsp->vga_charset].secondloaded)
|
|
vgacharset = vgacs[svsp->vga_charset].secondloaded;
|
|
else
|
|
return;
|
|
|
|
for(i=0;i < 16;i++) /* A zeroed character, vt220 has inverted '?' */
|
|
vgachar[i] = 0x00;
|
|
|
|
for(i=1;i <= 94;i++) /* Load (erase) all characters */
|
|
loadchar(vgacharset, i + 0xA0, 16, vgachar);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* Initialization for Down line LoaDable Fonts
|
|
*---------------------------------------------------------------------------*/
|
|
static void
|
|
init_dld(struct video_state *svsp)
|
|
{
|
|
register int i;
|
|
|
|
svsp->dld_dscsi = 0;
|
|
svsp->dld_sixel_lower = 0;
|
|
svsp->dld_sixelli = 0;
|
|
svsp->dld_sixelui = 0;
|
|
|
|
for(i = 0;i < MAXSIXEL;i++)
|
|
svsp->sixel.lower[i] = svsp->sixel.upper[i] = 0;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
* selective erase a region
|
|
*---------------------------------------------------------------------------*/
|
|
static void
|
|
selective_erase(struct video_state *svsp, u_short *pcrtat, int length)
|
|
{
|
|
register int i, j;
|
|
|
|
for(j = pcrtat - svsp->Crtat, i = 0;i < length;i++,pcrtat++)
|
|
{
|
|
if(!(svsp->decsca[INT_INDEX(j+i)] & (1 << BIT_INDEX(j+i))))
|
|
{
|
|
*pcrtat &= 0xFF00; /* Keep the video character attributes */
|
|
*pcrtat += ' '; /* Erase the character */
|
|
}
|
|
}
|
|
}
|
|
|
|
/* ------------------------- E O F ------------------------------------------*/
|