Annotation of 43BSDReno/contrib/jove/getch.c, revision 1.1.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 "tune.h"
                      9: 
                     10: #ifdef MSDOS
                     11: 
                     12: #include <bios.h>
                     13: #include <dos.h>
                     14: 
                     15: #include "jove.h"
                     16: 
                     17: private void waitfun proto((void));
                     18: 
                     19: extern int UpdModLine;
                     20: #ifdef IBMPC
                     21: static char last = 0;
                     22: extern int specialkey;
                     23: #endif
                     24: 
                     25: getrawinchar()
                     26: {
                     27: #ifdef RAINBOW
                     28:        union REGS regs;
                     29: #endif /* RAINBOW */
                     30: #ifdef IBMPC
                     31:        unsigned scan;
                     32: 
                     33:        if (specialkey = last) {
                     34:                scan = last;
                     35:                last = 0;
                     36:                return scan;
                     37:        }
                     38: #endif /* IBMPC */
                     39: 
                     40:        while (!rawkey_ready())
                     41:                waitfun();
                     42: 
                     43: #ifdef IBMPC
                     44:        scan = _bios_keybrd(_KEYBRD_READ);
                     45:        if ((scan&0xff) == 0) {
                     46:                last = (char) (scan >> 8);
                     47:                return 0xff;
                     48:        }
                     49:        return scan&0xff;
                     50: #else /* IBMPC */
                     51: #ifdef RAINBOW
                     52: waitloop:
                     53:        regs.x.di = 2;
                     54:        int86(0x18, &regs, &regs);
                     55:        if (regs.h.al != 0)     /* should never happen, but who knows */
                     56:                return regs.h.al;
                     57:        else
                     58:                goto waitloop;
                     59: #else /* RAINBOW */
                     60:        return bdos(0x06, 0x00ff, 0xff) & 0xff;
                     61: #endif /* RAINBOW */
                     62: #endif /* IBMPC */
                     63: }
                     64: 
                     65: static int waiting = 0;
                     66: 
                     67: rawkey_ready()
                     68: {
                     69: #ifndef IBMPC
                     70:        union REGS regs;
                     71: #endif
                     72: 
                     73:        if (waiting)
                     74:                return 0;
                     75: #ifdef IBMPC
                     76:        if (last)
                     77:                return 1;
                     78: 
                     79:        return _bios_keybrd(_KEYBRD_READY);
                     80: #else /* IBMPC */
                     81: #ifdef RAINBOW
                     82:        regs.x.di = 4;
                     83:        int86(0x18, &regs, &regs);
                     84:        return regs.h.cl != 0;
                     85: #else /* RAINBOW */
                     86:        regs.h.ah = 0x44;               /* ioctl call */
                     87:        regs.x.bx = 0;                  /* stdin file handle */
                     88:        regs.h.al = 0x06;               /* get input status */
                     89:        intdos(&regs, &regs);
                     90:        return regs.h.al & 1;
                     91: #endif /* RAINBOW */
                     92: #endif /* IBMPC */
                     93: }
                     94: 
                     95: #ifdef IBMPC
                     96: static long timecount, lastcount = 0;
                     97: #else
                     98: static char lastmin = 0;
                     99: #endif
                    100: 
                    101: 
                    102: private void
                    103: waitfun()
                    104: {
                    105: #ifndef IBMPC
                    106:        struct dostime_t tc;
                    107: #endif
                    108: 
                    109:        if (UpdModLine) {
                    110:                waiting = 1;
                    111:                redisplay();
                    112:                waiting = 0;
                    113:                return;
                    114:        }
                    115: #ifdef IBMPC
                    116:        if (_bios_timeofday(_TIME_GETCLOCK, &timecount) ||  /* after midnight */
                    117:            (timecount > lastcount + 0x444) ) {
                    118:                lastcount = timecount;
                    119:                UpdModLine = 1;
                    120:        }
                    121: #else
                    122:        _dos_gettime(&tc);
                    123:        if (tc.minute != lastmin) {
                    124:                UpdModLine = 1;
                    125:                lastmin = tc.minute;
                    126:        }
                    127: #endif
                    128: }
                    129: 
                    130: #endif /* MSDOS */

unix.superglobalmegacorp.com

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