This is sldostty.c in view mode; [Download] [Up]
/* Copyright (c) 1992, 1995 John E. Davis
* All rights reserved.
*
* You may distribute under the terms of either the GNU General Public
* License or the Perl Artistic License.
*/
#include "config.h"
#include <stdio.h>
#include <dos.h>
#if defined (__EMX__)
# define int86 _int86
# define delay _sleep2
#endif /* __EMX__ */
#if defined (__WATCOMC__)
# include <conio.h>
# include <bios.h>
# define int86 int386
#else
# define _NKEYBRD_READ 0x0
# define _NKEYBRD_READY 0x1
# define _NKEYBRD_SHIFTSTATUS 0x2
#endif /* __WATCOMC__ */
#define BIOSKEY slbioskey
#if defined(__WATCOMC__)
# define keyWaiting() _bios_keybrd(_NKEYBRD_READY)
#else
# define keyWaiting() BIOSKEY(_NKEYBRD_READY)
#endif
#include "slang.h"
#include "_slang.h"
#ifdef __cplusplus
# define _DOTS_ ...
#else
# define _DOTS_ void
#endif
#if !defined (__EMX__) && !defined (__GO32__) && !defined (__WATCOMC__)
#define HAS_INT9
#endif
#ifdef __GO32__
# include <signal.h>
#endif
#if defined (HAS_INT9)
static void interrupt (*int9_old) (_DOTS_);
static unsigned char far *shift = (unsigned char far *) 0x417;
static unsigned int Abort_Scan_Code = 34; /* 34 = scan code for ^G */
/*----------------------------------------------------------------------*\
* an interrupt 9 handler, not for use with most 32 bit compilers
\*----------------------------------------------------------------------*/
static void interrupt int9_handler (_DOTS_)
{
unsigned char s, s1;
s1 = *shift & 0xF; /* ignore caps, ins, num lock, scroll lock */
s = inp (0x60);
if (s1 & 0x04) /* control key */
{
if (s == Abort_Scan_Code)
{
if (SLang_Ignore_User_Abort == 0) SLang_Error = USER_BREAK;
SLKeyBoard_Quit = 1;
}
}
(*int9_old) ();
}
#endif /* HAS_INT9 */
static void int9_change (int set)
{
#if defined (HAS_INT9)
if (set) /* install a new handler */
{
if (int9_old != NULL) return;
int9_old = getvect (9);
setvect (9, int9_handler);
}
else if (int9_old != NULL) /* restore the old handler */
{
setvect (9, int9_old);
int9_old = NULL;
}
#else
(void) set;
#endif /* HAS_INT9 */
}
/*----------------------------------------------------------------------*\
* Function: static void set_ctrl_break (int state);
*
* set the control-break setting
\*----------------------------------------------------------------------*/
static void set_ctrl_break (int state)
{
#if defined (__EMX__)
(void) state; /* not really required */
#else /* __EMX__ */
static int prev = 0;
# if defined (__GO32__)
if (state == 0)
{
# if __DJGPP__ >= 2
signal (SIGINT, SIG_IGN);
# endif
prev = getcbrk ();
setcbrk (0);
}
else
{
# if __DJGPP__ >= 2
signal (SIGINT, SIG_DFL);
# endif
setcbrk (prev);
}
# else /* __GO32__ */
# if defined(__WATCOMC__)
fprintf (stderr, "Have not yet defined set_ctrl_break for __WATCOMC__\n");
prev = state;
# else
asm mov dl, byte ptr prev
asm mov ax, state
asm cmp ax, 0
asm jne L1
asm mov ah, 33h
asm mov al, 0
asm mov dl, byte ptr prev
asm int 21h
asm xor ax, ax
asm mov al, dl
asm mov prev, ax
asm mov dl, 0
L1:
asm mov al, 1
asm mov ah, 33h
asm int 21h
# endif /* __WATCOMC__ */
# endif /* __GO32__ */
#endif /* __EMX__ */
}
/*----------------------------------------------------------------------*\
* static unsigned int slbioskey (int op);
*
* op 0-2 (standard) and 0x10-0x12 (extended) are valid
*
* 0, 0x10 _NKEYBRD_READ - read the key
* 1, 0x11 _NKEYBRD_READY - check if a key is waiting
* if so give a peek of its value, otherwise return 0
* 2, 0x12 _NKEYBRD_SHIFTSTATUS - get shift flags
* (Ins, Cap, Num, Scroll, Alt, ^Ctrl L_shift, R_shift)
* flags = ICNSA^LR only the lower byte is valid!
\*----------------------------------------------------------------------*/
static int bios_key_f = 0;
static unsigned int slbioskey (int op)
{
union REGS r;
r.h.ah = (op & 0x03) | bios_key_f;
int86 (0x16, &r, &r);
#if defined(__WATCOMC__)
/* return (_bios_keybrd ((op & 0x03) | bios_key_f)); */
# if 1 /* the correct zero flag for watcom? */
/* is zero flag set? (no key waiting) */
if ((op & _NKEYBRD_READY) && (r.x.cflag & 0x40) == 0x40) return 0;
# else /* the correct zero flag for watcom? */
/* is zero flag set? (no key waiting) */
if ((op & _NKEYBRD_READY) && (r.x.cflag & 0x4)) return 0;
# endif
return (r.x.eax & 0xffff);
#else
/* is zero flag set? (no key waiting) */
if ((op & _NKEYBRD_READY) && (r.x.flags & 0x40) == 0x40) return 0;
return (r.x.ax & 0xffff);
#endif
}
/*----------------------------------------------------------------------*\
* Function: int SLang_init_tty (int abort_char, int no_flow_control,
* int opost);
*
* initialize the keyboard interface and attempt to set-up the interrupt 9
* handler if ABORT_CHAR is non-zero.
* NO_FLOW_CONTROL and OPOST are only for compatiblity and are ignored.
\*----------------------------------------------------------------------*/
int SLang_init_tty (int abort_char, int no_flow_control, int opost)
{
(void) no_flow_control;
(void) opost;
bios_key_f = 0x10; /* assume it's an enhanced keyboard */
#if defined (HAS_INT9)
bios_key_f &= peekb (0x40,0x96); /* verify it's true */
if (abort_char > 0) Abort_Scan_Code = (unsigned int) abort_char;
#else
(void) abort_char;
#endif
set_ctrl_break (0);
/* clear keyboard buffer */
/* while (keyWaiting()) BIOSKEY(_NKEYBRD_READ); */
return 0;
}
/*----------------------------------------------------------------------*\
* Function: void SLang_reset_tty (void);
*
* reset the tty before exiting
\*----------------------------------------------------------------------*/
void SLang_reset_tty (void)
{
int9_change (0);
set_ctrl_break (1);
}
/*----------------------------------------------------------------------*\
* Function: int SLsys_input_pending (int tsecs);
*
* sleep for *tsecs tenths of a sec waiting for input
\*----------------------------------------------------------------------*/
int SLsys_input_pending (int tsecs)
{
int count = tsecs * 5;
if (keyWaiting()) return 1;
while (count > 0)
{
delay (20); /* 20 ms or 1/50 sec */
if (keyWaiting()) break;
count--;
}
return (count);
}
/*----------------------------------------------------------------------*\
* Function: unsigned int SLsys_getkey (void);
*
* wait for and get the next available keystroke.
* Also re-maps some useful keystrokes.
*
* Backspace (^H) => Del (127)
* Ctrl-Space => ^@ (^@^3 - a pc NUL char)
* extended keys are prefixed by a null character
\*----------------------------------------------------------------------*/
unsigned int SLsys_getkey (void)
{
unsigned int key, scan, ch, shift;
#if 0
int tsecs = SL_input_time; /* tsecs = 300 */
if ((SLgetkey_hook != NULL) && !keyWaiting())
{
while (!SLsys_input_pending(tsecs))
getkey_hook ();
}
#endif
key = BIOSKEY(_NKEYBRD_READ);
ch = key & 0xff;
scan = key >> 8;
shift = BIOSKEY(_NKEYBRD_SHIFTSTATUS) & 0xf;
if (key == 0x0e08) ch = 127; /* Backspace key */
else if ((ch == 32) && (shift & 0x04)) /* ^space = ^@ */
{
scan = 3; /* send back Ctrl-@ => ^@^C */
ch = 0;
SLang_ungetkey (scan);
}
else if (!(ch) || (ch == 0xe0))
{
ch = 0; /* extended key code */
SLang_ungetkey (scan);
}
return (ch);
}
/*----------------------------------------------------------------------*\
* Function: void SLang_set_abort_signal (void (*handler)(int));
\*----------------------------------------------------------------------*/
void SLang_set_abort_signal (void (*handler)(int))
{
if (handler == NULL) int9_change (1);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.