📄 pcscr.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 + -