]> granicus.if.org Git - nethack/commitdiff
*** empty log message ***
authorjwalz <jwalz>
Sat, 5 Jan 2002 21:05:57 +0000 (21:05 +0000)
committerjwalz <jwalz>
Sat, 5 Jan 2002 21:05:57 +0000 (21:05 +0000)
sys/os2/os2.c [new file with mode: 0644]

diff --git a/sys/os2/os2.c b/sys/os2/os2.c
new file mode 100644 (file)
index 0000000..5cf68d8
--- /dev/null
@@ -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 */