diff --git a/sys/msdos/ovlinit.c b/sys/msdos/ovlinit.c new file mode 100644 index 000000000..035076495 --- /dev/null +++ b/sys/msdos/ovlinit.c @@ -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 +#include + + +#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*/