RELIES ON
---------
-Quit (char *error) function
+Quit (global_game_variables_t *gvar, char *error) function
WORK TO DO
*/
#include "src/lib/16_mm.h"
#include "src/lib/16_ca.h"
+#include <malloc.h>
#pragma hdrstop
#pragma warn -pro
}
#endif
if(errorflag==true)
- Quit("MML_ShutdownEMS: Error freeing EMS!\n"); //++++ add something
+ Quit (gvar, "MML_ShutdownEMS: Error freeing EMS!\n"); //++++ add something
}
/*
======================
*/
-/*void MML_UseSpace(word segstart, dword seglength, global_game_variables_t *gvar)
-{
- //huge mmblocktype huge *scan,huge *last;
- word segm=1;
- word oldend;
- dword segmlen;
- dword extra;
-
- scan = last = gvar->mm.mmhead;
- gvar->mm.mmrover = gvar->mm.mmhead; // reset rover to start of memory
-
-//
-// search for the block that contains the range of segments
-//
- while(scan->start+scan->length < segstart)
- {
- last = scan;
- scan = scan->next;
- }
-
-//
-// take the given range out of the block
-//
- oldend = scan->start + scan->length;
+/*
extra = oldend - (segstart+seglength);
segmlen=extra;
printf("segmlen=%lu\n", segmlen);
}
//++++todo: linked list of segment!
- if(segstart == scan->start)
- {
- last->next = scan->next; // unlink block
- FREEBLOCK(scan);
- scan = last;
- }
- else
- scan->length = segstart-scan->start; // shorten block
-
- if(extra > 0)
- {
- GETNEWBLOCK;
- gvar->mm.mmnew->useptr = NULL;
-
- gvar->mm.mmnew->next = scan->next;
- scan->next = gvar->mm.mmnew;
- gvar->mm.mmnew->start = segstart+seglength;
- gvar->mm.mmnew->length = extra;
- gvar->mm.mmnew->attributes = LOCKBIT;
- }//else if(segm>0) goto segu;
-
-}*/
+*/
void MML_UseSpace(word segstart, dword seglength, global_game_variables_t *gvar)
{
mmblocktype far *scan,far *last;
gvar->mm.mmnew->start = segstart+seglength;
gvar->mm.mmnew->length = extra;
gvar->mm.mmnew->attributes = LOCKBIT;
- }
+ }//else if(segm>0) goto segu;
}
void MML_ClearBlock(global_game_variables_t *gvar)
{
- //huge mmblocktype huge *scan,huge *last;
- mmblocktype __far *scan;//,far *last;
+ mmblocktype far *scan;//,far *last;
scan = gvar->mm.mmhead->next;
int i;
//dword length,seglength;
dword length; word seglength;
- //huge void huge *start;
void far *start;
word segstart;//,endfree;
- //memptr *peeonself;
if(gvar->mm.mmstarted)
MM_Shutdown(gvar);
gvar->mm.mmnew->length = 0xffff;
gvar->mm.mmnew->attributes = LOCKBIT;
gvar->mm.mmnew->next = NULL;
- //gvar->mm.mmnew->useptr = peeonself;
gvar->mm.mmrover = gvar->mm.mmhead;
- //printf(" %x\n", peeonself);
- //printf(" %x\n", *peeonself);
//
// get all available near conventional memory segments
//
#ifdef __WATCOMC__
_nheapgrow();
- length=(dword)_memavl();//(dword)GetFreeSize();
- //huge start = (void huge *)(gvar->mm.nearheap = _nmalloc(length));
- start = (void far *)(gvar->mm.nearheap = _nmalloc(length));
+#endif
+ length=(word)_memavl();//(word)coreleft();
+ //start = gvar->mm.nearheap = _fmalloc(length);
+#ifdef __WATCOMC__
+ start = (void __far *)(gvar->mm.nearheap = _nmalloc(length));
#endif
#ifdef __BORLANDC__
- length=coreleft();
- //huge start = (void huge *)(gvar->mm.nearheap = malloc(length));
start = (void far *)(gvar->mm.nearheap = malloc(length));
#endif
+
length -= 16-(FP_OFF(start)&15);
length -= SAVENEARHEAP;
seglength = length / 16; // now in paragraphs
segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
MML_UseSpace(segstart,seglength, gvar);
gvar->mmi.nearheap = length;
- //printf("start=%Fp segstart=%x seglen=%lu len=%lu\n", start, segstart, seglength, length);
+ //0000printf("near: start=%Fp segstart=%x seglen=%lu len=%lu\n", start, segstart, (dword)seglength, length);
//
// get all available far conventional memory segments
//
- //printf("_FARCORELEFT %lu\n", _FCORELEFT);
#ifdef __WATCOMC__
_fheapgrow();
- length=_FCORELEFT;//_fcoreleft();//(dword)GetFarFreeSize();//0xffffUL*4UL;
#endif
#ifdef __BORLANDC__
- printf("farcoreleft() %lu\n", farcoreleft());
- printf("(farcoreleft()+32)-_FCORELEFT %d\n", (sword)((farcoreleft()+32)-_FCORELEFT));
- length=farcoreleft();//_fcoreleft();//(dword)GetFarFreeSize();//0xffffUL*4UL;
+// printf("farcoreleft() %lu\n", farcoreleft());
+// printf("(farcoreleft()+32)-_FCORELEFT %d\n", (sword)((farcoreleft()+32)-_FCORELEFT));
#endif
- start = gvar->mm.farheap = _fmalloc(length);
- //start = gvar->mm.farheap = halloc(length, 1);
+ length=_FCORELEFT;
+ start = gvar->mm.farheap = _fmalloc(length);//start = gvar->mm.farheap = halloc(length, 1);
+
length -= 16-(FP_OFF(start)&15);
length -= SAVEFARHEAP;
seglength = length / 16; // now in paragraphs
segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
MML_UseSpace(segstart,seglength, gvar);
gvar->mmi.farheap = length;
- //printf("start=%Fp segstart=%x seglen=%lu len=%lu\n", start, segstart, seglength, length);
+ //0000printf("far: start=%Fp segstart=%x seglen=%lu len=%lu\n", start, segstart, (dword)seglength, length);
gvar->mmi.mainmem = gvar->mmi.nearheap + gvar->mmi.farheap;
-#ifndef __16_PM__
+#if !defined(__16_PM__)// && defined(__WATCOMC__)
if(!dbg_debugpm) {
//
// detect EMS and allocate up to 64K at page frame
void MM_GetPtr (memptr *baseptr, dword size, global_game_variables_t *gvar)
{
- //huge mmblocktype huge *scan,huge *lastscan,huge *endscan,huge *purge,huge *next;
mmblocktype far *scan,far *lastscan,far *endscan,far *purge,far *next;
int search;
unsigned needed,startseg;
gvar->mm.mmnew->useptr = baseptr;
//if(gvar->mm.mmnew->useptr==NULL){
#ifdef __DEBUG_MM__
+ if(dbg_debugmm>0){
printf("MM_GetPtr\n");
//%04x
printf(" baseptr=%Fp ", baseptr); printf("useptr=%Fp\n", gvar->mm.mmnew->useptr);
printf(" *baseptr=%Fp ", *baseptr); printf("*useptr=%Fp\n", *(gvar->mm.mmnew->useptr));
printf(" &baseptr=%Fp ", &baseptr); printf("&useptr=%Fp\n", &(gvar->mm.mmnew->useptr));
+ }
#endif
- //exit(-5); }
+ //Quit(gvar, "gvar->mm.mmnew->useptr==NULL"); }
gvar->mm.mmnew->attributes = BASEATTRIBUTES;
//tryagain:
//heapdump();
#endif
printf(OUT_OF_MEM_MSG,(size-gvar->mmi.nearheap));
- printf("for stability reasons the program will shut down! wwww\n");
- MM_Shutdown(gvar);
- exit(-1);
+ Quit(gvar, "for stability reasons the program will shut down! wwww\n");
}
else
gvar->mm.mmerror = true;
void MM_FreePtr(memptr *baseptr, global_game_variables_t *gvar)
{
- //huge mmblocktype huge *scan,huge *last;
mmblocktype far *scan,far *last;
last = gvar->mm.mmhead;
if(!scan)
{
- printf("MM_FreePtr: Block not found!\n");
- return;
+ Quit(gvar, "MM_FreePtr: Block not found!\n");
+ //printf("MM_FreePtr: Block not found!\n"); return;
}
last->next = scan->next;
void MM_SetPurge(memptr *baseptr, int purge, global_game_variables_t *gvar)
{
- //huge mmblocktype huge *start;
mmblocktype far *start;
start = gvar->mm.mmrover;
gvar->mm.mmrover = gvar->mm.mmhead;
else if(gvar->mm.mmrover == start)
{
- Quit("MM_SetPurge: Block not found!");
+ Quit (gvar, "MM_SetPurge: Block not found!");
//return;
}
void MM_SetLock(memptr *baseptr, boolean locked, global_game_variables_t *gvar)
{
- //huge mmblocktype huge *start;
mmblocktype far *start;
start = gvar->mm.mmrover;
gvar->mm.mmrover = gvar->mm.mmhead;
else if(gvar->mm.mmrover == start)
{
- Quit("MM_SetLock: Block not found!");
+ Quit (gvar, "MM_SetLock: Block not found!");
//return;
}
void MM_SortMem(global_game_variables_t *gvar)
{
- //huge mmblocktype huge *scan,huge *last,huge *next;
mmblocktype far *scan,far *last,far *next;
unsigned start,length,source,dest;//++++,oldborder;
//++++int playing;
void MM_ShowMemory(global_game_variables_t *gvar)
{
- //huge mmblocktype huge *scan;
mmblocktype far *scan;
//word temp;
sdword end,owner;
void MM_DumpData(global_game_variables_t *gvar)
{
- //huge mmblocktype huge *scan,huge *best;
mmblocktype far *scan,far *best;
long lowest,oldlowest;
word owner;
byte lock,purge;
FILE *dumpfile;
+#ifdef __WATCOMC__
+ _nfree(gvar->mm.nearheap);
+#endif
+#ifdef __BORLANDC__
free(gvar->mm.nearheap);
+#endif
#ifdef __BORLANDC__
dumpfile = fopen ("mmdump.16b","w");
#endif
dword MM_UnusedMemory(global_game_variables_t *gvar)
{
dword free;
- //huge mmblocktype huge *scan;
mmblocktype far *scan;
free = 0;
dword MM_TotalFree(global_game_variables_t *gvar)
{
dword free;
- //huge mmblocktype huge *scan;
mmblocktype far *scan;
free = 0;