ftp.nice.ch/pub/next/unix/games/nethack.3.0.N.bs.tar.gz#/PubDomain/Games/HACK/vms/vmstty.c

This is vmstty.c in view mode; [Download] [Up]

/*	SCCS Id: @(#)vmstty.c	3.0	88/05/03
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed.  See license for details. */
/* tty.c - (VMS) version */

#define NEED_VARARGS
#include "hack.h"

#include	<descrip.h>
#include	<iodef.h>
#include	<smgdef.h>

#define LIB$M_CLI_CTRLT 0x100000
#define LIB$M_CLI_CTRLY 0x2000000

extern short ospeed;
char erase_char, intr_char, kill_char;
static boolean settty_needed = FALSE;
static unsigned int kb = 0;

int
vms_getchar()
{
    short key;

    if (kb)
    {
	SMG$READ_KEYSTROKE(&kb, &key);
	switch (key)
	{
	  case SMG$K_TRM_UP:
	    key = 'k';
	    break;
	  case SMG$K_TRM_DOWN:
	    key = 'j';
	    break;
	  case SMG$K_TRM_LEFT:
	    key = 'h';
	    break;
	  case SMG$K_TRM_RIGHT:
	    key = 'l';
	    break;
	  case '\r':
	    key = '\n';
	    break;
	  default:
	    if (key == '\007' || key == '\032' || key > 255)
		key = '\033';
	    break;
	}
    }
    else
	key = getchar();
    return key;
}

static struct sensemode {
    short status;
    unsigned char xmit_baud;
    unsigned char rcv_baud;
    unsigned char crfill;
    unsigned char lffill;
    unsigned char parity;
    unsigned char unused;
    char class;
    char type;
    short scr_wid;
    unsigned long tt_char: 24, scr_len: 8;
    unsigned long tt2_char;
} sg;
unsigned int ctrl_mask;

static void
setctty(){
}

/*
 * Get initial state of terminal, set ospeed (for termcap routines)
 * and switch off tab expansion if necessary.
 * Called by startup() in termcap.c and after returning from ! or ^Z
 */
void
gettty(){
    int status;
    int input_chan;
    $DESCRIPTOR (input_dsc, "TT");
    unsigned int zero = 0;

    if (!(SYS$ASSIGN (&input_dsc, &input_chan, 0, 0) & 1))
	perror("NetHack (gettty)");
    status = SYS$QIOW(0, input_chan, IO$_SENSEMODE, &sg, 0, 0, &sg.class, 12,
		      0, 0, 0, 0);
    SYS$DASSGN (input_chan);
    if (!(status & 1))
	perror("NetHack (gettty)");
    ospeed = sg.xmit_baud;
    erase_char = '\177';
    kill_char = '\025';
    intr_char = '\003';
    (void) LIB$ENABLE_CTRL(&zero, &ctrl_mask);
    /* Use the systems's values for lines and columns if it has any idea. */
    if (sg.scr_len)
	LI = sg.scr_len;
    if (sg.scr_wid)
	CO = sg.scr_wid;
    settty_needed = TRUE;
}

#ifdef MAIL
unsigned long pasteboard_id = 0;
#endif

/* reset terminal to original state */
void
settty(s)
char *s;
{
	clear_screen();
	end_screen();
	if(s) Printf(s);
	(void) fflush(stdout);
	SMG$DELETE_VIRTUAL_KEYBOARD(&kb);
#ifdef MAIL
	SMG$DELETE_PASTEBOARD(&pasteboard_id);
#endif
	if (ctrl_mask)
	    (void) LIB$ENABLE_CTRL(&ctrl_mask, 0);
	flags.echo = ON;
	flags.cbreak = OFF;
}

#ifdef MAIL
static void
broadcast_ast(dummy)
{
	extern int broadcasts;

	broadcasts++;
}
#endif

void
setftty(){
	unsigned int mask = LIB$M_CLI_CTRLT | LIB$M_CLI_CTRLY;

	flags.cbreak = ON;
	flags.echo = OFF;
	(void) LIB$DISABLE_CTRL(&mask, 0);
	SMG$CREATE_VIRTUAL_KEYBOARD(&kb);
#ifdef MAIL
	SMG$CREATE_PASTEBOARD(&pasteboard_id, 0, 0, 0, 0);
	SMG$SET_BROADCAST_TRAPPING(&pasteboard_id, broadcast_ast, 0);
#endif
	start_screen();
}


void
intron() {		/* enable kbd interupts if enabled when game started */
}

void
introff() {		/* disable kbd interrupts if required*/
}


/* fatal error */
/*VARARGS1*/
void
error VA_DECL(char *,s)
	VA_START(s);
	VA_INIT(char *,s);
	if(settty_needed)
		settty(NULL);
	Vprintf(s,VA_ARGS);
	(void) putchar('\n');
	VA_END();
	exit(1);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.