summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/pcvt/pcvt_vtf.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i386/isa/pcvt/pcvt_vtf.c')
-rw-r--r--sys/i386/isa/pcvt/pcvt_vtf.c2154
1 files changed, 0 insertions, 2154 deletions
diff --git a/sys/i386/isa/pcvt/pcvt_vtf.c b/sys/i386/isa/pcvt/pcvt_vtf.c
deleted file mode 100644
index ce23f39..0000000
--- a/sys/i386/isa/pcvt/pcvt_vtf.c
+++ /dev/null
@@ -1,2154 +0,0 @@
-/*-
- * 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)
- {
- ttyld_rint(svsp->vs_tty, *svsp->report_chars++ & 0xff);
- 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 ------------------------------------------*/
OpenPOWER on IntegriCloud