📄 vt100.c
字号:
/* * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc. * * 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 the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. * * from: $Hdr: vt100.c,v 4.300 91/06/09 06:14:56 root Rel41 $ SONY * * @(#)vt100.c 8.1 (Berkeley) 6/10/93 */#include <sys/types.h>#include <sys/param.h>#include <sys/systm.h>#include <news3400/iop/framebuf.h>#include <news3400/iop/kbreg.h>#include <news3400/iop/keyboard.h>#include <news3400/fb/fbdefs.h>#include <news3400/bm/vt100.h>#include <news3400/bm/bitmapif.h>#ifdef IPC_MRX#include "config.h"#define kbd_ioctl(chan, cmd, argp) { \ if (kb_ioctl) \ (*kb_ioctl)(chan, cmd, argp); \}#endif#ifdef IPC_MRX#include "mrx.h"#include "process.h"#include "object.h"#include "console.h"#endif#ifdef CPU_SINGLE#include <news3400/sio/scc.h>#endifextern Key_string key_str;extern int tmode;static unsigned int first_code;#ifdef IPC_MRX#define SCC_KEYBOARD 0#endifSCREEN screen;struct cursor inner_buf_csr;int inner_buf_tstat;char c_pos_mess[C_MESS_SIZ];extern struct csr_buf local_csr_buf;#ifdef IPC_MRXint bitmap_use;#ifdef IPC_3CPU#include "../../ubdev/msgio.h"extern int ipc_ready;#endif /* IPC_3CPU */extern struct cons_devsw vt100_cons;#endif /* IPC_MRX */#ifdef CPU_DOUBLEint auto_dimmer();#endif#if CPU_SINGLEextern int hz;extern kbd_profun_init();#endiflRectangle char_r1;lRectangle font_r1;lRectangle char_r2;lRectangle font_r2;int font_len1;int font_len2;int fcolor;int bcolor;int font_w;int font_h;int char_w;int char_h;int scr_w;int scr_h;int ch_pos;int ul_pos;int x_ofst;int y_ofst;int rit_m;int btm_m;int bell_len;int dim_cnt;int a_dim_on;unsigned short fbuf[256];int fp;int fpn;lPoint fpp;int fpa;vt100init(){ register int i; register SCREEN *sp = &screen; sp->s_term_mode = 0; sp->s_term_mode |= (SRM|DECSCLM|DECAWM|DECARM|DECCSR_ACTV); sp->s_current_stat = 0; sp->s_csr.csr_x = 1; sp->s_csr.csr_y = 1; sp->s_csr.csr_p.x = x_ofst; sp->s_csr.csr_p.y = y_ofst; sp->s_csr.csr_attributes = NORMALM; sp->s_region.top_margin = TOP_M; sp->s_region.btm_margin = btm_m; sp->s_plane = consfb->planemask; sp->s_bgcol = 0; fcolor = sp->s_plane; bcolor = sp->s_bgcol; for (i = 0; i < RIT_M_MAX; i++) sp->s_tab_pos[i] = 0; for (i = 9; i < RIT_M_MAX; i +=8) sp->s_tab_pos[i] = 1; esc_store_csr(sp); inner_buf_tstat = sp->s_term_mode & (DECOM|DECAWM); local_csr_buf.csr_number = 1; cursor_on(&sp->s_csr.csr_p);}ncp_str(p, q, n) register char *p, *q; register int n;{ while (n-- > 0) *q++ = *p++;}/* * default parameter set */set_default_param(){ register struct fbdev *cfb = consfb; font_w = cfb->font_w; font_h = cfb->font_h; char_w = cfb->char_w; char_h = cfb->char_h; scr_w = cfb->scr_w; scr_h = cfb->scr_h; ch_pos = cfb->ch_pos; ul_pos = cfb->ul_pos; x_ofst = cfb->x_offset; y_ofst = cfb->y_offset; rit_m = cfb->rit_m; btm_m = cfb->btm_m; a_dim_on = 1; font_r1.extent.x = font_w; font_r1.extent.y = font_h; font_r2.extent.x = font_w * 2; font_r2.extent.y = font_h; font_len1 = (font_w + 0x0f) >> 4; font_len2 = (font_w*2 + 0x0f) >> 4; char_r1.extent.x = char_w; char_r1.extent.y = char_h; char_r2.extent.x = char_w * 2; char_r2.extent.y = char_h; dim_cnt = DIM_CNT_DFLT; bell_len = BELL_LEN_DFLT;}vt100_open(){ static int only_one = 0; extern char **ext_fnt_addr; set_default_param(); vt100init(); bitmapinit(); if (only_one == 0) {#ifdef IPC_MRX#ifdef IPC_3CPU while (ipc_ready == 0) proc_sleep_self(100);#endif while ((bitmap_use = object_query(BITMAP)) <= 0) proc_sleep_self(100); proc_create("auto_dimmer", auto_dimmer, 401, 512, 0);#endif /* IPC_MRX */ only_one = 1; }#define INIT_STRING "\033[42;1H" vt100_write(0, INIT_STRING, sizeof(INIT_STRING) - 1);#ifdef CPU_SINGLE kbd_open(SCC_KEYBOARD);#endif}#ifdef IPC_MRXvt100_cons_setup(){ int vt100_open(), vt100_read(), vt100_write(), vt100_ioctl(); vt100_cons.open = vt100_open; vt100_cons.read = vt100_read; vt100_cons.write = vt100_write; vt100_cons.ioctl = vt100_ioctl;}#define DIMMER_RESET 0#define DIMMER_ON 1#define DIMMER_OFF 2#define DIMMER_INTERVAL 60 /* sec */static int dimmer_stdport;auto_dimmer(){ register int select, i; register int dimm_counter = DIM_CNT_DFLT; register int dimm_level = 0; int ports[2], *mode; spl0(); ports[0] = dimmer_stdport = STDPORT; ports[1] = port_create("auto_dimmer_sub"); register_interval(ports[1], DIMMER_INTERVAL); for(;;) { select = msg_select(2, ports); if (select == 0) { msg_recv(ports[0], NULL, &mode, NULL, 0); switch (*mode) { case DIMMER_RESET: if (!a_dim_on) break; dimm_counter = dim_cnt; if (dimm_level > 0) { dimm_level =0; for (i = 0; i < nfbdev; i++) fbbm_set_dimmer(&fbdev[i], 0); } break; case DIMMER_ON: dimm_counter = dim_cnt; dimm_level =0; for (i = 0; i < nfbdev; i++) fbbm_set_dimmer(&fbdev[i], dimm_level); a_dim_on = 1; break; case DIMMER_OFF: dimm_counter = dim_cnt; dimm_level =0; for (i = 0; i < nfbdev; i++) fbbm_set_dimmer(&fbdev[i], dimm_level); a_dim_on = 0; break; } } else { msg_recv(ports[1], NULL, NULL, NULL, 0); if (a_dim_on && (dimm_counter-- <= 0)) { if (dimm_level < 3) { dimm_level++; } for (i = 0; i < nfbdev; i++) fbbm_set_dimmer(&fbdev[i], dimm_level); dimm_counter = dim_cnt; } } }}rst_dimmer_cnt(){ register int diff; static unsigned last_time; extern unsigned sys_time; int mode = DIMMER_RESET; diff = sys_time - last_time; if (diff > DIMMER_INTERVAL*HZ || diff < 0) { dimmer(DIMMER_RESET); last_time = sys_time; }}auto_dimmer_on(){ dimmer(DIMMER_ON);}auto_dimmer_off(){ dimmer(DIMMER_OFF);}dimmer(mode) int mode;{ if (dimmer_stdport) msg_send(dimmer_stdport, 0, &mode, sizeof(mode), 0);}#else /* IPC_MRX */static int dimmer_counter = DIM_CNT_DFLT;static int dim_level = 0;#ifdef CPU_SINGLEauto_dimmer(){ register int s, i; s = spl4(); if (a_dim_on && (dimmer_counter-- <= 0)) { if (dim_level < 3) dim_level++; for (i = 0; i < nfbdev; i++) fbbm_set_dimmer(&fbdev[i], dim_level); dimmer_counter = dim_cnt; } splx(s); timeout(auto_dimmer, (caddr_t) 0, 60 * hz);}#endifrst_dimmer_cnt(){ register int s, i; if (!a_dim_on) return;#ifdef CPU_SINGLE s = spl4();#endif dimmer_counter = dim_cnt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -