📄 pcvt_vtf.c
字号:
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 *---------------------------------------------------------------------------*/voidvt_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 *---------------------------------------------------------------------------*/voidvt_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 *---------------------------------------------------------------------------*/voidvt_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 *---------------------------------------------------------------------------*/voidvt_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 *---------------------------------------------------------------------------*/voidvt_initsel(struct video_state *svsp){ register int i; for(i = 0;i < MAXDECSCA;i++) svsp->decsca[i] = 0;}/*---------------------------------------------------------------------------* * DECSEL - selective erase in line *---------------------------------------------------------------------------*/voidvt_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 *---------------------------------------------------------------------------*/voidvt_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 *---------------------------------------------------------------------------*/voidroll_up(struct video_state *svsp, int n){#if (PCVT_NOFASTSCROLL==0) 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 =#if PCVT_USL_VT_COMPAT (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; }#if PCVT_USL_VT_COMPAT 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#endif { 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), PUSER, "scrlck", 0);}/*---------------------------------------------------------------------------* * scroll screen n lines down *---------------------------------------------------------------------------*/static voidroll_down(struct video_state *svsp, int n){#if (PCVT_NOFASTSCROLL==0) 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 =#if PCVT_USL_VT_COMPAT (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; }#if PCVT_USL_VT_COMPAT 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#endif { 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), PUSER, "scrlck", 0);}/*---------------------------------------------------------------------------* * switch charset pointers *---------------------------------------------------------------------------*/static voidswcsp(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 voidrespond(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 voidinit_udk(struct video_state *svsp){ svsp->udk_defi = 0; svsp->udk_deflow = 0; svsp->udk_fnckey = 0;}/*---------------------------------------------------------------------------* * Clear loaded downloadable (DLD) character set *---------------------------------------------------------------------------*/static voidclear_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 voidinit_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 voidselective_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 */ } }}#endif /* NVT > 0 *//* ------------------------- E O F ------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -