This is pcscr.c in view mode; [Download] [Up]
/*************************************************************************** * 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 #endif private 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); } private WORD near cur_page() { union REGS vr; vr.h.ah = 0x0f; intr(VIDEO, &vr); return(vr.h.bh); } private void 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); } private WORD near get_cur() { union REGS vr; vr.h.bh = CUR_PAGE; vr.h.ah = 0x03; intr(VIDEO, &vr); return (vr.x.dx); } private BYTE 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); } private void 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)) private void 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_Y void 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 near clr_page() { scr_win(0, 0, 0, LPP-1, CHPL-1); gotoxy(C_X = 0, C_Y = 0); } private void near cur_right() { if (C_Y < CHPL-1) C_Y++; gotoxy(C_X, C_Y); } private void near cur_up() { if (C_X) C_X--; gotoxy(C_X, C_Y); } private void near cur_left() { if (C_Y) C_Y--; gotoxy(C_X, C_Y); } private void near cur_down() { if (C_X < LPP-1) C_X++; gotoxy(C_X, C_Y); } private void 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 near clr_eoln() { ch_out(' ', CHPL-wherey()); } private void 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() private void 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) private void 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; void Placur(line, col) { cur_mov(line, col); CapCol = col; CapLine = line; } void SO_on() { if (Mdcolor) setcolor(Mdcolor&0xf, Mdcolor>>4); else setcolor(Bgcolor, Fgcolor); } void SO_off() { setcolor(Fgcolor, Bgcolor); } extern int EGA; void UnsetTerm(foo) char *foo; { extern int ILI; Placur(ILI, 0); clr_eoln(); if (EGA) reset_43(); } void ResetTerm() { 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
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.