⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcscr.c

📁 早期freebsd实现
💻 C
字号:
/*************************************************************************** * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE * * is provided to you without charge, and with no warranty.  You may give  * * away copies of JOVE, including sources, provided that this notice is    * * included in all the files.                                              * ***************************************************************************/#include "jove.h"#ifdef	IBMPC/* here come the actual emulation routines	*/#include <dos.h>#include <conio.h>#define BYTE	unsigned char#define WORD	unsigned int#ifdef	MAC# undef private# define private#endifprivate BYTE near get_mode proto((void));private WORD	near cur_page proto((void)),	near get_cur proto((void));private void	near ch_out proto((BYTE, BYTE)),	near clr_eop proto((void)),	near cur_advance proto((void)),	near cur_down proto((void)),	near cur_left proto((void)),	near cur_right proto((void)),	near cur_up proto((void)),	near line_feed proto((void)),	near set_cur proto((WORD)),	near set_mode proto((BYTE)),	near wherexy proto((BYTE *, BYTE *));void	near normfun proto((char)),	near scr_win proto((int, BYTE, BYTE, BYTE, BYTE)),	near clr_page(),	near clr_eoln();#ifdef	MAC# undef private# define private static#endif#define VIDEO   0x10#define intr(n, r)	int86((n), (r), (r));BYTE CHPL=80,     LPP=25,     CUR_PAGE=0,     C_ATTR = 0x07,     C_X=0,     C_Y=0;int Fgcolor = 7,    Bgcolor = 0,	Mdcolor = 0;void setcolor(fg, bg)BYTE fg, bg;{   C_ATTR = ((bg&0xf)<<4)|(fg&0xf);}privateWORD near cur_page(){   union REGS vr;   vr.h.ah = 0x0f;   intr(VIDEO, &vr);   return vr.h.bh;}privatevoid near set_cur(xy)WORD xy;{   union REGS vr;   vr.h.bh = CUR_PAGE;   vr.h.ah = 0x02;   vr.x.dx = xy;   intr(VIDEO, &vr);}privateWORD near get_cur(){   union REGS vr;   vr.h.bh = CUR_PAGE;   vr.h.ah = 0x03;   intr(VIDEO, &vr);   return (vr.x.dx);}privateBYTE near get_mode(){  union REGS vr;  vr.h.ah = 0x0f;  intr(VIDEO, &vr);  return vr.h.al;}BYTE lpp(){   int far *regen = (int far *) 0x44C;   int what;   BYTE chpl();   what = (*regen&0xff00)/2/chpl();   return (what > 43 ? 25 : what);}privatevoid near set_mode(n)BYTE n;{  union REGS vr;  vr.h.ah = 0x00;  vr.h.al = n;  intr(VIDEO, &vr);}#define gotoxy(x,y)	set_cur((x)<<8|((y)&0xff))#define cur_mov(x,y)	set_cur((C_X=(x))<<8|((C_Y=(y))&0xff))privatevoid near wherexy( x, y)BYTE *x, *y;{  register WORD xy;  xy = get_cur();  *x = xy>>8;  *y = xy&0xff;}#define wherex()	C_X#define wherey()	C_Yvoid near scr_win(no, ulr, ulc, lrr, lrc)int no;BYTE ulr, ulc, lrr, lrc;{  union REGS vr;  if (no >= 0)     vr.h.ah = 0x06;  else {     vr.h.ah = 0x07;     no = - no;  }  vr.h.al = no;  vr.x.cx = ulr<<8 | ulc;  vr.x.dx = lrr<<8 | lrc;  vr.h.bh = C_ATTR;  intr(VIDEO, &vr);}BYTE chpl(){  union REGS vr;  vr.h.ah = 0x0f;  intr(VIDEO, &vr);  return vr.h.ah;}void nearclr_page(){	scr_win(0, 0, 0, LPP-1, CHPL-1);	gotoxy(C_X = 0, C_Y = 0);}privatevoid near cur_right(){   if (C_Y < CHPL-1)      C_Y++;   gotoxy(C_X, C_Y);}privatevoid near cur_up(){   if (C_X)      C_X--;   gotoxy(C_X, C_Y);}privatevoid near cur_left(){   if (C_Y)      C_Y--;   gotoxy(C_X, C_Y);}privatevoid near cur_down(){   if (C_X < LPP-1)      C_X++;   gotoxy(C_X, C_Y);}privatevoid near ch_out(c, n)BYTE c, n;{  union REGS vr;  vr.h.ah = 0x09;  vr.h.al = c;  vr.h.bl = C_ATTR;  vr.h.bh = CUR_PAGE;  vr.x.cx = n;  intr(VIDEO, &vr);}#define wrch(c)		ch_out((c), 1), cur_advance()#define home_cur()	gotoxy(C_X = 0, C_Y = 0)void nearclr_eoln(){	ch_out(' ', CHPL-wherey());}privatevoid near clr_eop(){  clr_eoln();  scr_win(LPP-1-wherex(), wherex()+1, 0, LPP-1, CHPL-1);}void init_43(){   BYTE far *info = (BYTE far *) 0x487;   WORD far *CRTC = (WORD far *) 0x463;   union REGS vr;   WORD cur;   CUR_PAGE = cur_page();   CHPL = chpl();   LPP = lpp();   if (get_mode()!=3)      set_mode(3);   cur = get_cur();   vr.x.ax = 0x1112;   vr.h.bl = 0;   intr(VIDEO, &vr);   *info |= 1;   vr.x.ax = 0x0100;   vr.h.bh = 0;   vr.x.cx = 0x0600;   intr(VIDEO, &vr);   outp(*CRTC, 0x14);   outp(*CRTC+1, 0x07);   vr.x.ax = 0x1200;   vr.h.bl = 0x20;   intr(VIDEO, &vr);   LPP = lpp();   set_cur(cur);   wherexy(&C_X, &C_Y);}void reset_43(){   BYTE far *info = (BYTE far *) 0x487;   WORD far *CRTC = (WORD far *) 0x463;   union REGS vr;   set_mode(3);   *info &= 128;   vr.x.ax = 0x0100;   vr.h.bh = 0x0607;   vr.x.cx = 0x0607;   intr(VIDEO, &vr);   outp(*CRTC, 0x14);   outp(*CRTC+1, 13);}#define scr_up()		scr_win(1, 0, 0, LPP-1, CHPL-1)#define back_space()	cur_left()privatevoid near line_feed(){   if (++C_X > LPP-1) {      C_X = LPP-1;      scr_up();   }   gotoxy(C_X, C_Y);}#define BELL_P 0x61			/* speaker */#define BELL_D 0x2dc			/* 550 hz  */#define TIME_P 0x40			/* timer   */#define TINI   182			/* 10110110b timer initialization */void dobell(x){   unsigned int n = 0x8888;   int orgval;   outp(TIME_P+3, TINI);   outp(TIME_P+2, BELL_D&0xff);   outp(TIME_P+2, BELL_D>>8);   orgval = inp(BELL_P);   outp(BELL_P, orgval|3);		/* turn speaker on  */   while (--n > 0)	outp(BELL_P, orgval);}#define carriage_return()	gotoxy(wherex(), C_Y = 0)privatevoid near cur_advance(){   if (++C_Y > CHPL-1) {      C_Y = 0;      if (++C_X > LPP-1) {	 scr_up();	 C_X = LPP-1;      }   }   gotoxy(C_X, C_Y);}void init_term(){   if (lpp() == 43)      reset_43();   CUR_PAGE = cur_page();   CHPL = chpl();   LPP = lpp();   wherexy(&C_X, &C_Y);}void near normfun();void write_em(s)char *s;{  while (*s)	normfun(*s++);}void write_emif(s)char *s;{  if (s)	 write_em(s);}void write_emc(s, n)char *s;int n;{   while (n--)	 normfun(*s++);}void near normfun(c)char c;{	switch (c) {	case 10: line_feed(); break;	case 13: carriage_return(); break;	case  8: back_space(); break;	case  7: dobell(0); break;	case  0: break;	default: wrch(c);	}}#endif	/* IBMPC */#ifdef	IBMPC/* No cursor optimization on an IBMPC, this simplifies things a lot.   Think about it: it would be silly! */int	phystab = 8;voidPlacur(line, col){	cur_mov(line, col);	CapCol = col;	CapLine = line;}voidSO_on(){	if (Mdcolor)		setcolor(Mdcolor&0xf, Mdcolor>>4);	else		setcolor(Bgcolor, Fgcolor);}voidSO_off(){   setcolor(Fgcolor, Bgcolor);}extern bool EGA;voidUnsetTerm(foo)char *foo;{  extern int ILI;  Placur(ILI, 0);  clr_eoln();  if (EGA)	 reset_43();}voidResetTerm(){	if (EGA)	   init_43();	else	   init_term();	do_sgtty();		/* this is so if you change baudrate or stuff				   like that, JOVE will notice. */	ttyset(ON);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -