]> 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/msdos/ovlinit.c [new file with mode: 0644]

diff --git a/sys/msdos/ovlinit.c b/sys/msdos/ovlinit.c
new file mode 100644 (file)
index 0000000..0350764
--- /dev/null
@@ -0,0 +1,154 @@
+/*     SCCS Id: @(#)ovlinit.c  3.3     94/03/20                  */
+/* Copyright (c) NetHack PC Development Team 1995                 */
+/* NetHack may be freely redistributed.  See license for details. */
+
+#include "hack.h"
+#include <dos.h>
+#include <stdio.h>
+
+
+#ifdef _MSC_VER
+
+#define RESERVED_PARAGRAPHS    5120    /* leave 80K for malloc and inits */
+                                       /* subject to change before release */
+
+/*
+ * memavail() Returns the amount of RAM available (in paragraphs which are 16
+ *  bytes) - the amount to be reserved for heap allocations.
+ *
+ */
+unsigned memavail(minovl)
+unsigned minovl;                       /* minimum size of overlay heap */
+{
+       unsigned available;
+
+       unsigned farparaavail;
+       unsigned tmp;
+
+        /*
+         * _dos_allocmem will return the maximum block size available.
+         * It uses DOS (int 21h) service 0x48.
+         */
+
+       _dos_allocmem(0xFFFF, &farparaavail);
+       available = farparaavail - RESERVED_PARAGRAPHS;
+       tmp = RESERVED_PARAGRAPHS + minovl;
+       if (farparaavail < tmp) {
+          panic("Not enough free RAM to begin a game of NetHack (%ld bytes)",
+                       (long)((long)tmp * 16L));
+       }
+       return available;
+}
+#endif /*_MSC_VER*/
+
+#ifdef __BORLANDC__
+
+#define RSRVD_MALLOC   65 * 1024L      /* malloc() calls use about 65K    */
+#define RSRVD_CRTL     50 * 1024L      /* C runtime library uses 50K      */
+#define RSRVD_TOTAL    115 * 1024L     /* reserved for use in malloc()    */
+                                       /* as well as by C runtime library */
+                                       /* routines which allocate memory  */
+                                       /* after this routine runs.        */
+#define MIN_OVRBUF     30 * 1024L      /* Overlay buffer gets minimum of  */
+#define MAX_OVRBUF     200 * 1024L     /* 30K and maximum of 200K.        */
+
+#define RESIZE_OVL
+#ifdef RESIZE_OVL
+
+extern unsigned _ovrbuffer = 0;    /* Use default size initially */
+unsigned appFail = 0;              /* Fail flag if not enough RAM */
+unsigned memAlloc = 0;
+unsigned long ProgramSize;
+unsigned long runAlloc;
+unsigned far *mem_top;
+unsigned total;
+signed long tmpbuffer;
+int emsstatus;
+int xmsstatus;
+
+void NDECL(_resizeOvrBuffer);
+
+void _resizeOvrBuffer()
+{
+   mem_top = (unsigned far *) MK_FP( _psp, 0x02 );
+   total = *mem_top - _psp;
+
+   ProgramSize = * (unsigned far *) MK_FP( _psp - 1, 0x03 );
+   tmpbuffer = total - ProgramSize - RSRVD_TOTAL / 16;
+   memAlloc = min (MAX_OVRBUF / 16, tmpbuffer);
+   if (tmpbuffer >= MIN_OVRBUF / 16)
+       _ovrbuffer = memAlloc;
+   else {
+       _ovrbuffer = 1;
+       appFail = 1;
+   };
+
+
+/*
+ * Remember, when inside this code, nothing has been setup on
+ * the system, so do NOT call any RTL functions for I/O or
+ * anything else that might rely on a startup function.  This
+ * includes accessing any global objects as their constructors
+ * have not been called yet.
+ */
+
+}
+
+#pragma startup _resizeOvrBuffer 0      /* Put function in table */
+
+void
+startup ()
+{
+       if (appFail) {
+           printf ("NetHack fits in memory, but it cannot allocate memory");
+           printf (" for the overlay buffer\nand the runtime functions.  ");
+           printf ("Please free up just %ld more bytes.",
+                       (long)(MIN_OVRBUF - tmpbuffer * 16L));
+           exit (-1);
+       } else {
+
+       /* Now try to use expanded memory for the overlay manager */
+       /* If that doesn't work, we revert to extended memory */
+
+       emsstatus = _OvrInitEms (0, 0, 0);
+#ifdef RECOGNIZE_XMS
+       xmsstatus = (emsstatus) ? _OvrInitExt (0, 0) : -1;
+#endif
+
+     }
+}
+
+void
+show_borlandc_stats(win)
+winid win;
+{
+       char buf[BUFSZ];
+
+       putstr(win, 0, "");
+       putstr(win, 0, "");
+       putstr(win, 0, "Memory usage stats"); putstr(win, 0, "");
+       putstr(win, 0, "");
+       Sprintf (buf, "Overlay buffer memory allocation: %ld bytes.",
+           memAlloc * 16L); putstr(win, 0, buf);
+       Sprintf (buf, "_ovrbuffer = %u.", _ovrbuffer); putstr(win, 0, buf);
+       Sprintf (buf, "Startup memory usage: 0x%X", ProgramSize);
+       putstr(win, 0, buf);
+       runAlloc = * (unsigned far *) MK_FP( _psp - 1, 0x03);
+       Sprintf (buf, "Current memory usage: 0x%X", runAlloc);
+       putstr(win, 0, buf);
+       if (emsstatus) Sprintf (buf, "EMS search failed (%d).", emsstatus);
+       else Sprintf (buf, "EMS search successful.");
+       putstr(win, 0, buf);
+#ifdef RECOGNIZE_XMS
+       if (xmsstatus) Sprintf (buf, "XMS search failed (%d).", xmsstatus);
+       else Sprintf (buf, "XMS search successful.");
+       putstr(win, 0, buf);
+#endif
+
+
+}
+
+#endif  /* #ifdef RESIZE_OVL */
+#endif /* #ifdef __BORLANDC__ */
+
+/*ovlinit.c*/