home *** CD-ROM | disk | FTP | other *** search
- /***************************************************************************
- * 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 "tune.h"
-
- #ifdef MSDOS
-
- #include <bios.h>
- #include <dos.h>
-
- #include "jove.h"
-
- #ifdef LINT_ARGS
- private void waitfun(void);
- #else
- private void waitfun();
- #endif
-
- extern int UpdModLine;
- #ifdef IBMPC
- static char last = 0;
- extern int specialkey;
- #endif
-
- getrawinchar()
- {
- #ifdef RAINBOW
- union REGS regs;
- #endif /* RAINBOW */
- #ifdef IBMPC
- unsigned scan;
-
- if (specialkey = last) {
- scan = last;
- last = 0;
- return scan;
- }
- #endif /* IBMPC */
-
- while (!rawkey_ready())
- waitfun();
-
- #ifdef IBMPC
- scan = _bios_keybrd(_KEYBRD_READ);
- if ((scan&0xff) == 0) {
- last = (char) (scan >> 8);
- return 0xff;
- }
- return scan&0xff;
- #else /* IBMPC */
- #ifdef RAINBOW
- waitloop:
- regs.x.di = 2;
- int86(0x18, ®s, ®s);
- if (regs.h.al != 0) /* should never happen, but who knows */
- return regs.h.al;
- else
- goto waitloop;
- #else /* RAINBOW */
- return bdos(0x06, 0x00ff, 0xff) & 0xff;
- #endif /* RAINBOW */
- #endif /* IBMPC */
- }
-
- static int waiting = 0;
-
- rawkey_ready()
- {
- #ifndef IBMPC
- union REGS regs;
- #endif
-
- if (waiting)
- return 0;
- #ifdef IBMPC
- if (last)
- return 1;
-
- return _bios_keybrd(_KEYBRD_READY);
- #else /* IBMPC */
- #ifdef RAINBOW
- regs.x.di = 4;
- int86(0x18, ®s, ®s);
- return regs.h.cl != 0;
- #else /* RAINBOW */
- regs.h.ah = 0x44; /* ioctl call */
- regs.x.bx = 0; /* stdin file handle */
- regs.h.al = 0x06; /* get input status */
- intdos(®s, ®s);
- return regs.h.al & 1;
- #endif /* RAINBOW */
- #endif /* IBMPC */
- }
-
- #ifdef IBMPC
- static long timecount, lastcount = 0;
- #else
- static char lastmin = 0;
- #endif
-
-
- private void
- waitfun()
- {
- #ifndef IBMPC
- struct dostime_t tc;
- #endif
-
- if (UpdModLine) {
- waiting = 1;
- redisplay();
- waiting = 0;
- return;
- }
- #ifdef IBMPC
- if (_bios_timeofday(_TIME_GETCLOCK, &timecount) || /* after midnight */
- (timecount > lastcount + 0x444) ) {
- lastcount = timecount;
- UpdModLine = 1;
- }
- #else
- _dos_gettime(&tc);
- if (tc.minute != lastmin) {
- UpdModLine = 1;
- lastmin = tc.minute;
- }
- #endif
- }
-
- #endif /* MSDOS */
-