*** empty log message ***
This commit is contained in:
361
sys/os2/os2.c
Normal file
361
sys/os2/os2.c
Normal file
@@ -0,0 +1,361 @@
|
||||
/* SCCS Id: @(#)os2.c 3.3 96/02/29 */
|
||||
/* Copyright (c) Timo Hakulinen, 1990, 1991, 1992, 1993, 1996. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
/*
|
||||
* OS/2 system functions.
|
||||
*/
|
||||
|
||||
#define NEED_VARARGS
|
||||
#include "hack.h"
|
||||
|
||||
#ifdef OS2
|
||||
|
||||
#include "tcap.h"
|
||||
|
||||
/* OS/2 system definitions */
|
||||
|
||||
#ifdef __EMX__
|
||||
#undef CLR_BLACK
|
||||
#undef CLR_WHITE
|
||||
#undef CLR_BLUE
|
||||
#undef CLR_RED
|
||||
#undef CLR_GREEN
|
||||
#undef CLR_CYAN
|
||||
#undef CLR_YELLOW
|
||||
#undef CLR_BROWN
|
||||
#endif
|
||||
|
||||
#include "def_os2.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
static char NDECL(DOSgetch);
|
||||
static char NDECL(BIOSgetch);
|
||||
|
||||
int
|
||||
tgetch()
|
||||
{
|
||||
char ch;
|
||||
|
||||
/* BIOSgetch can use the numeric key pad on IBM compatibles. */
|
||||
if (iflags.BIOS)
|
||||
ch = BIOSgetch();
|
||||
else
|
||||
ch = DOSgetch();
|
||||
return ((ch == '\r') ? '\n' : ch);
|
||||
}
|
||||
|
||||
/*
|
||||
* Keyboard translation tables.
|
||||
*/
|
||||
#define KEYPADLO 0x47
|
||||
#define KEYPADHI 0x53
|
||||
|
||||
#define PADKEYS (KEYPADHI - KEYPADLO + 1)
|
||||
#define iskeypad(x) (KEYPADLO <= (x) && (x) <= KEYPADHI)
|
||||
|
||||
/*
|
||||
* Keypad keys are translated to the normal values below.
|
||||
* When iflags.BIOS is active, shifted keypad keys are translated to the
|
||||
* shift values below.
|
||||
*/
|
||||
static const struct pad {
|
||||
char normal, shift, cntrl;
|
||||
} keypad[PADKEYS] = {
|
||||
{'y', 'Y', C('y')}, /* 7 */
|
||||
{'k', 'K', C('k')}, /* 8 */
|
||||
{'u', 'U', C('u')}, /* 9 */
|
||||
{'m', C('p'), C('p')}, /* - */
|
||||
{'h', 'H', C('h')}, /* 4 */
|
||||
{'g', 'g', 'g'}, /* 5 */
|
||||
{'l', 'L', C('l')}, /* 6 */
|
||||
{'p', 'P', C('p')}, /* + */
|
||||
{'b', 'B', C('b')}, /* 1 */
|
||||
{'j', 'J', C('j')}, /* 2 */
|
||||
{'n', 'N', C('n')}, /* 3 */
|
||||
{'i', 'I', C('i')}, /* Ins */
|
||||
{'.', ':', ':'} /* Del */
|
||||
}, numpad[PADKEYS] = {
|
||||
{'7', M('7'), '7'}, /* 7 */
|
||||
{'8', M('8'), '8'}, /* 8 */
|
||||
{'9', M('9'), '9'}, /* 9 */
|
||||
{'m', C('p'), C('p')}, /* - */
|
||||
{'4', M('4'), '4'}, /* 4 */
|
||||
{'g', 'G', 'g'}, /* 5 */
|
||||
{'6', M('6'), '6'}, /* 6 */
|
||||
{'p', 'P', C('p')}, /* + */
|
||||
{'1', M('1'), '1'}, /* 1 */
|
||||
{'2', M('2'), '2'}, /* 2 */
|
||||
{'3', M('3'), '3'}, /* 3 */
|
||||
{'i', 'I', C('i')}, /* Ins */
|
||||
{'.', ':', ':'} /* Del */
|
||||
};
|
||||
|
||||
/*
|
||||
* Unlike Ctrl-letter, the Alt-letter keystrokes have no specific ASCII
|
||||
* meaning unless assigned one by a keyboard conversion table, so the
|
||||
* keyboard BIOS normally does not return a character code when Alt-letter
|
||||
* is pressed. So, to interpret unassigned Alt-letters, we must use a
|
||||
* scan code table to translate the scan code into a letter, then set the
|
||||
* "meta" bit for it. -3.
|
||||
*/
|
||||
#define SCANLO 0x10
|
||||
#define SCANHI 0x32
|
||||
#define SCANKEYS (SCANHI - SCANLO + 1)
|
||||
#define inmap(x) (SCANLO <= (x) && (x) <= SCANHI)
|
||||
|
||||
static const char scanmap[SCANKEYS] = { /* ... */
|
||||
'q','w','e','r','t','y','u','i','o','p','[',']', '\n',
|
||||
0, 'a','s','d','f','g','h','j','k','l',';','\'', '`',
|
||||
0, '\\', 'z','x','c','v','b','N','m' /* ... */
|
||||
};
|
||||
|
||||
/*
|
||||
* BIOSgetch emulates the MSDOS way of getting keys directly with a BIOS call.
|
||||
*/
|
||||
#define SHIFT_KEY (0x1 | 0x2)
|
||||
#define CTRL_KEY 0x4
|
||||
#define ALT_KEY 0x8
|
||||
|
||||
static char
|
||||
BIOSgetch()
|
||||
{
|
||||
unsigned char scan, shift, ch;
|
||||
const struct pad *kpad;
|
||||
|
||||
KBDKEYINFO CharData;
|
||||
USHORT IOWait = 0;
|
||||
HKBD KbdHandle = 0;
|
||||
|
||||
KbdCharIn(&CharData,IOWait,KbdHandle);
|
||||
ch = CharData.chChar;
|
||||
scan = CharData.chScan;
|
||||
shift = CharData.fsState;
|
||||
|
||||
/* Translate keypad keys */
|
||||
if (iskeypad(scan)) {
|
||||
kpad = iflags.num_pad ? numpad : keypad;
|
||||
if (shift & SHIFT_KEY)
|
||||
ch = kpad[scan - KEYPADLO].shift;
|
||||
else if (shift & CTRL_KEY)
|
||||
ch = kpad[scan - KEYPADLO].cntrl;
|
||||
else
|
||||
ch = kpad[scan - KEYPADLO].normal;
|
||||
}
|
||||
/* Translate unassigned Alt-letters */
|
||||
if ((shift & ALT_KEY) && !ch) {
|
||||
if (inmap(scan))
|
||||
ch = scanmap[scan - SCANLO];
|
||||
return (isprint(ch) ? M(ch) : ch);
|
||||
}
|
||||
return ch;
|
||||
}
|
||||
|
||||
static char
|
||||
DOSgetch()
|
||||
{
|
||||
KBDKEYINFO CharData;
|
||||
USHORT IOWait = 0;
|
||||
HKBD KbdHandle = 0;
|
||||
|
||||
KbdCharIn(&CharData,IOWait,KbdHandle);
|
||||
if (CharData.chChar == 0) { /* an extended code -- not yet supported */
|
||||
KbdCharIn(&CharData,IOWait,KbdHandle); /* eat the next character */
|
||||
CharData.chChar = 0; /* and return a 0 */
|
||||
}
|
||||
return (CharData.chChar);
|
||||
}
|
||||
|
||||
char
|
||||
switchar()
|
||||
{
|
||||
return '/';
|
||||
}
|
||||
|
||||
int
|
||||
kbhit()
|
||||
{
|
||||
KBDKEYINFO CharData;
|
||||
HKBD KbdHandle = 0;
|
||||
|
||||
KbdPeek(&CharData,KbdHandle);
|
||||
return (CharData.fbStatus & (1 << 6));
|
||||
}
|
||||
|
||||
long
|
||||
freediskspace(path)
|
||||
char *path;
|
||||
{
|
||||
FSALLOCATE FSInfoBuf;
|
||||
#ifdef OS2_32BITAPI
|
||||
ULONG
|
||||
#else
|
||||
USHORT
|
||||
#endif
|
||||
DriveNumber, FSInfoLevel = 1, res;
|
||||
|
||||
if (path[0] && path[1] == ':')
|
||||
DriveNumber = (toupper(path[0]) - 'A') + 1;
|
||||
else
|
||||
DriveNumber = 0;
|
||||
res =
|
||||
#ifdef OS2_32BITAPI
|
||||
DosQueryFSInfo(DriveNumber,FSInfoLevel,(PVOID)&FSInfoBuf,(ULONG)sizeof(FSInfoBuf));
|
||||
#else
|
||||
DosQFSInfo(DriveNumber,FSInfoLevel,(PBYTE)&FSInfoBuf,(USHORT)sizeof(FSInfoBuf));
|
||||
#endif
|
||||
if (res)
|
||||
return -1L; /* error */
|
||||
else
|
||||
return ((long) FSInfoBuf.cSectorUnit * FSInfoBuf.cUnitAvail *
|
||||
FSInfoBuf.cbSector);
|
||||
}
|
||||
|
||||
/*
|
||||
* Functions to get filenames using wildcards
|
||||
*/
|
||||
|
||||
#ifdef OS2_32BITAPI
|
||||
static FILEFINDBUF3 ResultBuf;
|
||||
#else
|
||||
static FILEFINDBUF ResultBuf;
|
||||
#endif
|
||||
static HDIR DirHandle;
|
||||
|
||||
int
|
||||
findfirst(path)
|
||||
char *path;
|
||||
{
|
||||
#ifdef OS2_32BITAPI
|
||||
ULONG
|
||||
#else
|
||||
USHORT
|
||||
#endif
|
||||
res, SearchCount = 1;
|
||||
|
||||
DirHandle = 1;
|
||||
res =
|
||||
#ifdef OS2_32BITAPI
|
||||
DosFindFirst((PSZ)path,&DirHandle,0L,(PVOID)&ResultBuf,(ULONG)sizeof(ResultBuf),&SearchCount,1L);
|
||||
#else
|
||||
DosFindFirst((PSZ)path,&DirHandle,0,&ResultBuf,(USHORT)sizeof(ResultBuf),&SearchCount,0L);
|
||||
#endif
|
||||
return(!res);
|
||||
}
|
||||
|
||||
int
|
||||
findnext()
|
||||
{
|
||||
#ifdef OS2_32BITAPI
|
||||
ULONG
|
||||
#else
|
||||
USHORT
|
||||
#endif
|
||||
res, SearchCount = 1;
|
||||
|
||||
res =
|
||||
#ifdef OS2_32BITAPI
|
||||
DosFindNext(DirHandle,(PVOID)&ResultBuf,(ULONG)sizeof(ResultBuf),&SearchCount);
|
||||
#else
|
||||
DosFindNext(DirHandle,&ResultBuf,(USHORT)sizeof(ResultBuf),&SearchCount);
|
||||
#endif
|
||||
return(!res);
|
||||
}
|
||||
|
||||
char *
|
||||
foundfile_buffer()
|
||||
{
|
||||
return(ResultBuf.achName);
|
||||
}
|
||||
|
||||
long
|
||||
filesize(file)
|
||||
char *file;
|
||||
{
|
||||
if (findfirst(file)) {
|
||||
return (* (long *) (ResultBuf.cbFileAlloc));
|
||||
} else
|
||||
return -1L;
|
||||
}
|
||||
|
||||
/*
|
||||
* Chdrive() changes the default drive.
|
||||
*/
|
||||
void
|
||||
chdrive(str)
|
||||
char *str;
|
||||
{
|
||||
char *ptr;
|
||||
char drive;
|
||||
|
||||
if ((ptr = index(str, ':')) != (char *)0) {
|
||||
drive = toupper(*(ptr - 1));
|
||||
#ifdef OS2_32BITAPI
|
||||
DosSetDefaultDisk((ULONG)(drive - 'A' + 1));
|
||||
#else
|
||||
DosSelectDisk((USHORT)(drive - 'A' + 1));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
disable_ctrlP()
|
||||
{
|
||||
KBDINFO KbdInfo;
|
||||
HKBD KbdHandle = 0;
|
||||
|
||||
if (!iflags.rawio) return;
|
||||
KbdInfo.cb = sizeof(KbdInfo);
|
||||
KbdGetStatus(&KbdInfo,KbdHandle);
|
||||
KbdInfo.fsMask &= 0xFFF7; /* ASCII off */
|
||||
KbdInfo.fsMask |= 0x0004; /* BINARY on */
|
||||
KbdSetStatus(&KbdInfo,KbdHandle);
|
||||
}
|
||||
|
||||
void
|
||||
enable_ctrlP()
|
||||
{
|
||||
KBDINFO KbdInfo;
|
||||
HKBD KbdHandle = 0;
|
||||
|
||||
if (!iflags.rawio) return;
|
||||
KbdInfo.cb = sizeof(KbdInfo);
|
||||
KbdGetStatus(&KbdInfo,KbdHandle);
|
||||
KbdInfo.fsMask &= 0xFFFB; /* BINARY off */
|
||||
KbdInfo.fsMask |= 0x0008; /* ASCII on */
|
||||
KbdSetStatus(&KbdInfo,KbdHandle);
|
||||
}
|
||||
|
||||
void
|
||||
get_scr_size()
|
||||
{
|
||||
VIOMODEINFO ModeInfo;
|
||||
HVIO VideoHandle = 0;
|
||||
|
||||
ModeInfo.cb = sizeof(ModeInfo);
|
||||
|
||||
(void) VioGetMode(&ModeInfo,VideoHandle);
|
||||
|
||||
CO = ModeInfo.col;
|
||||
LI = ModeInfo.row;
|
||||
}
|
||||
|
||||
void
|
||||
gotoxy(x,y)
|
||||
int x,y;
|
||||
{
|
||||
HVIO VideoHandle = 0;
|
||||
|
||||
x--; y--; /* (0,0) is upper right corner */
|
||||
|
||||
(void) VioSetCurPos(x, y, VideoHandle);
|
||||
}
|
||||
|
||||
|
||||
char* get_username(lan_username_size)
|
||||
int *lan_username_size;
|
||||
{
|
||||
return (char*)0;
|
||||
}
|
||||
#endif /* OS2 */
|
||||
Reference in New Issue
Block a user