*/
#include "src/lib/16_mm.h"
#include "src/lib/16_ca.h"
+#include <malloc.h>
#pragma hdrstop
#pragma warn -pro
boolean MML_CheckForEMS(void)
{
- boolean emmcfems=0;
+ boolean emmcfems = false;
+ word EMSPageFrame = 0;
+ byte err=0, str[64];
static char emmname[] = "EMMXXXX0"; //fix by andrius4669
__asm {
mov dx,OFFSET emmname //fix by andrius4669
mov ax,0x3d00
- int 0x21 // try to open EMMXXXX0 device
+ int EMM_INT // try to open EMMXXXX0 device
jc error
mov bx,ax
mov ax,0x4400
- int 0x21 // get device info
+ int EMM_INT // get device info
jc error
and dx,0x80
mov ax,0x4407
- int 0x21 // get status
+ int EMM_INT // get status
jc error
or al,al
jz error
mov ah,0x3e
- int 0x21 // close handle
+ int EMM_INT // close handle
jc error
+
+ //
+ // pageframe check
+ //
+ mov ah,EMS_GETFRAME
+ int EMS_INT // find the page frame address
+ or ah,ah
+ jnz error
+ mov [EMSPageFrame],bx
+
//
// EMS is good
//
- mov emmcfems,1
- jmp End
+ mov emmcfems,1
+ jmp End
#ifdef __BORLANDC__
}
#endif
//
// EMS is bad
//
- mov emmcfems,0
+ mov err,ah
+ mov emmcfems,0
#ifdef __BORLANDC__
}
#endif
#ifdef __WATCOMC__
}
#endif
+
+ //
+ // Pageframe switch to determine if there is one!
+ //
+ if(!EMSPageFrame)
+ {
+ emmcfems = false;
+#if defined(__DEBUG_PM__) || defined(__DEBUG_MM__)
+ printf("MML_CheckForEMS: EMS error No Pageframe!\nAddress detected to be %04x\n", EMSPageFrame);
+#endif
+ }else if(!emmcfems)// if there is an error and page frame is not 0000
+ {
+ strcpy(str,"MML_CheckForEMS: EMS error ");
+ MM_EMSerr(str, err);
+ printf("%s\n",str);
+ }
+
return(emmcfems);
}
======================
*/
-/*void MML_UseSpace(word segstart, dword seglength, global_game_variables_t *gvar)
-{
- mmblocktype far *scan,far *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;
}
//
#ifdef __WATCOMC__
_nheapgrow();
- length=(dword)_memavl();//(dword)GetFreeSize();
- 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();
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
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
//Quit(gvar, "gvar->mm.mmnew->useptr==NULL"); }
gvar->mm.mmnew->attributes = BASEATTRIBUTES;
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;
playing += STARTADLIBSOUNDS;
break;
}
- MM_SetLock(&(memptr)audiosegs[playing],true);
+ MM_SetLock((memptr *)&audiosegs[playing],true);
}
// VW_ColorBorder (oldborder);
/*++++ if(playing)
- MM_SetLock(&(memptr)audiosegs[playing],false);*/
+ MM_SetLock((memptr *)&audiosegs[playing],false);*/
}
//==========================================================================
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