Annotation of 43BSDReno/contrib/jove/pcscr.c, revision 1.1

1.1     ! root        1: /***************************************************************************
        !             2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
        !             3:  * is provided to you without charge, and with no warranty.  You may give  *
        !             4:  * away copies of JOVE, including sources, provided that this notice is    *
        !             5:  * included in all the files.                                              *
        !             6:  ***************************************************************************/
        !             7: 
        !             8: #include "jove.h"
        !             9: 
        !            10: #ifdef IBMPC
        !            11: 
        !            12: /* here come the actual emulation routines     */
        !            13: 
        !            14: #include <dos.h>
        !            15: #include <conio.h>
        !            16: 
        !            17: #define BYTE   unsigned char
        !            18: #define WORD   unsigned int
        !            19: 
        !            20: #ifdef MAC
        !            21: # undef private
        !            22: # define private
        !            23: #endif
        !            24: 
        !            25: private BYTE near get_mode proto((void));
        !            26: 
        !            27: private WORD
        !            28:        near cur_page proto((void)),
        !            29:        near get_cur proto((void));
        !            30: 
        !            31: private void
        !            32:        near ch_out proto((BYTE, BYTE)),
        !            33:        near clr_eop proto((void)),
        !            34:        near cur_advance proto((void)),
        !            35:        near cur_down proto((void)),
        !            36:        near cur_left proto((void)),
        !            37:        near cur_right proto((void)),
        !            38:        near cur_up proto((void)),
        !            39:        near line_feed proto((void)),
        !            40:        near set_cur proto((WORD)),
        !            41:        near set_mode proto((BYTE)),
        !            42:        near wherexy proto((BYTE *, BYTE *));
        !            43: 
        !            44: void   near normfun proto((char)),
        !            45:        near scr_win proto((int, BYTE, BYTE, BYTE, BYTE)),
        !            46:        near clr_page(),
        !            47:        near clr_eoln();
        !            48: 
        !            49: #ifdef MAC
        !            50: # undef private
        !            51: # define private static
        !            52: #endif
        !            53: 
        !            54: #define VIDEO   0x10
        !            55: 
        !            56: #define intr(n, r)     int86((n), (r), (r));
        !            57: 
        !            58: BYTE CHPL=80,
        !            59:      LPP=25,
        !            60:      CUR_PAGE=0,
        !            61:      C_ATTR = 0x07,
        !            62:      C_X=0,
        !            63:      C_Y=0;
        !            64: 
        !            65: int Fgcolor = 7,
        !            66:     Bgcolor = 0,
        !            67:        Mdcolor = 0;
        !            68: 
        !            69: void setcolor(fg, bg)
        !            70: BYTE fg, bg;
        !            71: {
        !            72:    C_ATTR = ((bg&0xf)<<4)|(fg&0xf);
        !            73: }
        !            74: 
        !            75: private
        !            76: WORD near cur_page()
        !            77: {
        !            78:    union REGS vr;
        !            79: 
        !            80:    vr.h.ah = 0x0f;
        !            81:    intr(VIDEO, &vr);
        !            82:    return(vr.h.bh);
        !            83: }
        !            84: 
        !            85: private
        !            86: void near set_cur(xy)
        !            87: WORD xy;
        !            88: {
        !            89:    union REGS vr;
        !            90: 
        !            91:    vr.h.bh = CUR_PAGE;
        !            92:    vr.h.ah = 0x02;
        !            93:    vr.x.dx = xy;
        !            94:    intr(VIDEO, &vr);
        !            95: }
        !            96: 
        !            97: private
        !            98: WORD near get_cur()
        !            99: {
        !           100:    union REGS vr;
        !           101: 
        !           102:    vr.h.bh = CUR_PAGE;
        !           103:    vr.h.ah = 0x03;
        !           104:    intr(VIDEO, &vr);
        !           105:    return (vr.x.dx);
        !           106: }
        !           107: 
        !           108: private
        !           109: BYTE near get_mode()
        !           110: {
        !           111:   union REGS vr;
        !           112: 
        !           113:   vr.h.ah = 0x0f;
        !           114:   intr(VIDEO, &vr);
        !           115:   return(vr.h.al);
        !           116: }
        !           117: 
        !           118: BYTE lpp()
        !           119: {
        !           120:    int far *regen = (int far *) 0x44C;
        !           121:    int what;
        !           122:    BYTE chpl();
        !           123: 
        !           124:    what = (*regen&0xff00)/2/chpl();
        !           125:    return (what > 43 ? 25 : what);
        !           126: }
        !           127: 
        !           128: private
        !           129: void near set_mode(n)
        !           130: BYTE n;
        !           131: {
        !           132:   union REGS vr;
        !           133: 
        !           134:   vr.h.ah = 0x00;
        !           135:   vr.h.al = n;
        !           136:   intr(VIDEO, &vr);
        !           137: }
        !           138: 
        !           139: #define gotoxy(x,y)    set_cur((x)<<8|((y)&0xff))
        !           140: #define cur_mov(x,y)   set_cur((C_X=(x))<<8|((C_Y=(y))&0xff))
        !           141: 
        !           142: private
        !           143: void near wherexy( x, y)
        !           144: BYTE *x, *y;
        !           145: {
        !           146:   register WORD xy;
        !           147: 
        !           148:   xy = get_cur();
        !           149:   *x = xy>>8;
        !           150:   *y = xy&0xff;
        !           151: }
        !           152: 
        !           153: #define wherex()       C_X
        !           154: #define wherey()       C_Y
        !           155: 
        !           156: void near scr_win(no, ulr, ulc, lrr, lrc)
        !           157: int no;
        !           158: BYTE ulr, ulc, lrr, lrc;
        !           159: {
        !           160:   union REGS vr;
        !           161: 
        !           162:   if (no >= 0)
        !           163:      vr.h.ah = 0x06;
        !           164:   else {
        !           165:      vr.h.ah = 0x07;
        !           166:      no = - no;
        !           167:   }
        !           168:   vr.h.al = no;
        !           169:   vr.x.cx = ulr<<8 | ulc;
        !           170:   vr.x.dx = lrr<<8 | lrc;
        !           171:   vr.h.bh = C_ATTR;
        !           172:   intr(VIDEO, &vr);
        !           173: }
        !           174: 
        !           175: BYTE chpl()
        !           176: {
        !           177:   union REGS vr;
        !           178: 
        !           179:   vr.h.ah = 0x0f;
        !           180:   intr(VIDEO, &vr);
        !           181:   return(vr.h.ah);
        !           182: }
        !           183: 
        !           184: void near
        !           185: clr_page()
        !           186: {
        !           187:        scr_win(0, 0, 0, LPP-1, CHPL-1);
        !           188:        gotoxy(C_X = 0, C_Y = 0);
        !           189: }
        !           190: 
        !           191: private
        !           192: void near cur_right()
        !           193: {
        !           194:    if (C_Y < CHPL-1)
        !           195:       C_Y++;
        !           196:    gotoxy(C_X, C_Y);
        !           197: }
        !           198: 
        !           199: private
        !           200: void near cur_up()
        !           201: {
        !           202:    if (C_X)
        !           203:       C_X--;
        !           204:    gotoxy(C_X, C_Y);
        !           205: }
        !           206: 
        !           207: private
        !           208: void near cur_left()
        !           209: {
        !           210:    if (C_Y)
        !           211:       C_Y--;
        !           212:    gotoxy(C_X, C_Y);
        !           213: }
        !           214: 
        !           215: private
        !           216: void near cur_down()
        !           217: {
        !           218:    if (C_X < LPP-1)
        !           219:       C_X++;
        !           220:    gotoxy(C_X, C_Y);
        !           221: }
        !           222: 
        !           223: private
        !           224: void near ch_out(c, n)
        !           225: BYTE c, n;
        !           226: {
        !           227:   union REGS vr;
        !           228: 
        !           229:   vr.h.ah = 0x09;
        !           230:   vr.h.al = c;
        !           231:   vr.h.bl = C_ATTR;
        !           232:   vr.h.bh = CUR_PAGE;
        !           233:   vr.x.cx = n;
        !           234:   intr(VIDEO, &vr);
        !           235: }
        !           236: 
        !           237: #define wrch(c)                ch_out((c), 1), cur_advance()
        !           238: 
        !           239: #define home_cur()     gotoxy(C_X = 0, C_Y = 0)
        !           240: 
        !           241: void near
        !           242: clr_eoln()
        !           243: {
        !           244:        ch_out(' ', CHPL-wherey());
        !           245: }
        !           246: 
        !           247: private
        !           248: void near clr_eop()
        !           249: {
        !           250:   clr_eoln();
        !           251:   scr_win(LPP-1-wherex(), wherex()+1, 0, LPP-1, CHPL-1);
        !           252: }
        !           253: 
        !           254: void init_43()
        !           255: {
        !           256:    BYTE far *info = (BYTE far *) 0x487;
        !           257:    WORD far *CRTC = (WORD far *) 0x463;
        !           258:    union REGS vr;
        !           259:    WORD cur;
        !           260: 
        !           261:    CUR_PAGE = cur_page();
        !           262:    CHPL = chpl();
        !           263:    LPP = lpp();
        !           264: 
        !           265:    if (get_mode()!=3)
        !           266:       set_mode(3);
        !           267:    cur = get_cur();
        !           268: 
        !           269:    vr.x.ax = 0x1112;
        !           270:    vr.h.bl = 0;
        !           271:    intr(VIDEO, &vr);
        !           272: 
        !           273:    *info |= 1;
        !           274:    vr.x.ax = 0x0100;
        !           275:    vr.h.bh = 0;
        !           276:    vr.x.cx = 0x0600;
        !           277:    intr(VIDEO, &vr);
        !           278: 
        !           279:    outp(*CRTC, 0x14);
        !           280:    outp(*CRTC+1, 0x07);
        !           281: 
        !           282:    vr.x.ax = 0x1200;
        !           283:    vr.h.bl = 0x20;
        !           284:    intr(VIDEO, &vr);
        !           285: 
        !           286:    LPP = lpp();
        !           287: 
        !           288:    set_cur(cur);
        !           289:    wherexy(&C_X, &C_Y);
        !           290: }
        !           291: 
        !           292: void reset_43()
        !           293: {
        !           294:    BYTE far *info = (BYTE far *) 0x487;
        !           295:    WORD far *CRTC = (WORD far *) 0x463;
        !           296:    union REGS vr;
        !           297: 
        !           298:    set_mode(3);
        !           299: 
        !           300:    *info &= 128;
        !           301:    vr.x.ax = 0x0100;
        !           302:    vr.h.bh = 0x0607;
        !           303:    vr.x.cx = 0x0607;
        !           304:    intr(VIDEO, &vr);
        !           305: 
        !           306:    outp(*CRTC, 0x14);
        !           307:    outp(*CRTC+1, 13);
        !           308: 
        !           309: }
        !           310: 
        !           311: #define scr_up()               scr_win(1, 0, 0, LPP-1, CHPL-1)
        !           312: #define back_space()   cur_left()
        !           313: 
        !           314: private
        !           315: void near line_feed()
        !           316: {
        !           317:    if (++C_X > LPP-1) {
        !           318:       C_X = LPP-1;
        !           319:       scr_up();
        !           320:    }
        !           321:    gotoxy(C_X, C_Y);
        !           322: }
        !           323: 
        !           324: #define BELL_P 0x61                    /* speaker */
        !           325: #define BELL_D 0x2dc                   /* 550 hz  */
        !           326: #define TIME_P 0x40                    /* timer   */
        !           327: #define TINI   182                     /* 10110110b timer initialization */
        !           328: 
        !           329: void dobell(x)
        !           330: {
        !           331:    unsigned int n = 0x8888;
        !           332:    int orgval;
        !           333: 
        !           334:    outp(TIME_P+3, TINI);
        !           335:    outp(TIME_P+2, BELL_D&0xff);
        !           336:    outp(TIME_P+2, BELL_D>>8);
        !           337:    orgval = inp(BELL_P);
        !           338:    outp(BELL_P, orgval|3);             /* turn speaker on  */
        !           339:    while (--n > 0)
        !           340:         ;
        !           341:    outp(BELL_P, orgval);
        !           342: }
        !           343: 
        !           344: #define carriage_return()      gotoxy(wherex(), C_Y = 0)
        !           345: 
        !           346: private
        !           347: void near cur_advance()
        !           348: {
        !           349:    if (++C_Y > CHPL-1) {
        !           350:       C_Y = 0;
        !           351:       if (++C_X > LPP-1) {
        !           352:         scr_up();
        !           353:         C_X = LPP-1;
        !           354:       }
        !           355:    }
        !           356:    gotoxy(C_X, C_Y);
        !           357: }
        !           358: 
        !           359: void init_term()
        !           360: {
        !           361:    if (lpp() == 43)
        !           362:       reset_43();
        !           363:    CUR_PAGE = cur_page();
        !           364:    CHPL = chpl();
        !           365:    LPP = lpp();
        !           366:    wherexy(&C_X, &C_Y);
        !           367: }
        !           368: 
        !           369: void near normfun();
        !           370: 
        !           371: void write_em(s)
        !           372: char *s;
        !           373: {
        !           374:   while (*s)
        !           375:        normfun(*s++);
        !           376: }
        !           377: 
        !           378: void write_emif(s)
        !           379: char *s;
        !           380: {
        !           381:   if (s)
        !           382:         write_em(s);
        !           383: }
        !           384: 
        !           385: void write_emc(s, n)
        !           386: char *s;
        !           387: int n;
        !           388: {
        !           389:    while (n--)
        !           390:         normfun(*s++);
        !           391: }
        !           392: 
        !           393: void near normfun(c)
        !           394: char c;
        !           395: {
        !           396:       switch (c) {
        !           397:        case 10: line_feed(); break;
        !           398:        case 13: carriage_return(); break;
        !           399:        case  8: back_space(); break;
        !           400:        case  7: dobell(0); break;
        !           401:                case  0: break;
        !           402:        default: wrch(c);
        !           403:       }
        !           404: }
        !           405: 
        !           406: #endif /* IBMPC */
        !           407: 
        !           408: #ifdef IBMPC
        !           409: 
        !           410: /* No cursor optimization on an IBMPC, this simplifies things a lot.
        !           411:    Think about it: it would be silly!
        !           412:  */
        !           413: 
        !           414: int    phystab = 8;
        !           415: 
        !           416: void
        !           417: Placur(line, col)
        !           418: {
        !           419:        cur_mov(line, col);
        !           420:        CapCol = col;
        !           421:        CapLine = line;
        !           422: }
        !           423: 
        !           424: void
        !           425: SO_on()
        !           426: {
        !           427:        if (Mdcolor)
        !           428:                setcolor(Mdcolor&0xf, Mdcolor>>4);
        !           429:        else
        !           430:                setcolor(Bgcolor, Fgcolor);
        !           431: }
        !           432: 
        !           433: void
        !           434: SO_off()
        !           435: {
        !           436:    setcolor(Fgcolor, Bgcolor);
        !           437: }
        !           438: 
        !           439: extern int EGA;
        !           440: 
        !           441: void
        !           442: 
        !           443: UnsetTerm(foo)
        !           444: char *foo;
        !           445: {
        !           446:   extern int ILI;
        !           447: 
        !           448:   Placur(ILI, 0);
        !           449:   clr_eoln();
        !           450:   if (EGA)
        !           451:         reset_43();
        !           452: }
        !           453: 
        !           454: 
        !           455: void
        !           456: ResetTerm()
        !           457: {
        !           458:        if (EGA)
        !           459:           init_43();
        !           460:        else
        !           461:           init_term();
        !           462: 
        !           463:        do_sgtty();             /* this is so if you change baudrate or stuff
        !           464:                                   like that, JOVE will notice. */
        !           465:        ttyset(ON);
        !           466: }
        !           467: 
        !           468: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.