From: jwalz Date: Sat, 5 Jan 2002 21:05:57 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: MOVE2GIT~3729 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=00322bffcd473dede0bb12093b7badac316c382f;p=nethack *** empty log message *** --- diff --git a/sys/os2/os2.c b/sys/os2/os2.c new file mode 100644 index 000000000..5cf68d847 --- /dev/null +++ b/sys/os2/os2.c @@ -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 + +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 */