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
=============================================================================
*/
-
+#ifndef __16_PM__
static char *ParmStringsexmm[] = {"noems","noxms",""};
-
+#endif
/*
======================
=
boolean MML_CheckForEMS(void)
{
- boolean emmcfems;
+ 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);
}
-
+#ifndef __16_PM__
/*
======================
=
}
#endif
if(errorflag==true)
- Quit("MML_ShutdownEMS: Error freeing EMS!\n"); //++++ add something
+ Quit (gvar, "MML_ShutdownEMS: Error freeing EMS!\n"); //++++ add something
}
/*
}
}
gvar->mmi.EMSmem = (i)*0x4000lu;
- //printf(" gvar->mmi.EMSmem=%lu\n", gvar->mmi.EMSmem);
return 0;
}
gvar->mmi.EMSmem = (i)*0x4000lu;
return 0;
}
-
+#endif
//==========================================================================
/*
=======================
*/
-boolean MML_CheckForXMS(global_game_variables_t *gvar)
+boolean MML_CheckForXMS(void)
{
+ //numUMBs = 0;
boolean errorflag=false;
- gvar->mm.numUMBs = 0;
__asm {
mov ax,0x4300
else return true;
}
-
+#ifndef __16_PM__
/*
======================
=
}
}
}
-
+#endif
//==========================================================================
/*
======================
*/
-/*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.mmhead = NULL;
gvar->mm.mmfree = &(gvar->mm.mmblocks[0]);
for(i=0;i<MAXBLOCKS-1;i++)
- {
gvar->mm.mmblocks[i].next = &(gvar->mm.mmblocks[i+1]);
- }
gvar->mm.mmblocks[i].next = NULL;
//
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();
#endif
#ifdef __BORLANDC__
- printf("farcoreleft() %lu\n", farcoreleft());
- printf("(farcoreleft()+32)-_FCORELEFT %d\n", (sword)((farcoreleft()+32)-_FCORELEFT));
+// printf("farcoreleft() %lu\n", farcoreleft());
+// printf("(farcoreleft()+32)-_FCORELEFT %d\n", (sword)((farcoreleft()+32)-_FCORELEFT));
#endif
- length=_FCORELEFT;//_fcoreleft();//(dword)GetFarFreeSize();//0xffffUL*4UL;
- 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(!debugpm) {
+#if !defined(__16_PM__)// && defined(__WATCOMC__)
+ if(!dbg_debugpm) {
//
// detect EMS and allocate up to 64K at page frame
//
gvar->mmi.EMSmem = 0;
//goto emsskip; //0000
- for(i = 1;i <
-#ifdef __WATCOMC__
- __argc
-#endif
-#ifdef __BORLANDC__
- _argc
-#endif
- ;i++)
+ for(i = 1;i < _argc;i++)
{
- if(US_CheckParm(
-#ifdef __WATCOMC__
- __argv[i]
-#endif
-#ifdef __BORLANDC__
- _argv[i]
-#endif
- ,ParmStringsexmm) == 0)
+ if(US_CheckParm(_argv[i],ParmStringsexmm) == 0)
goto emsskip; // param NOEMS
}
if(MML_CheckForEMS())
{
MML_SetupEMS(gvar); // allocate space
- //TODO: EMS4! AND EMS 3.2 MASSIVE DATA HANDLMENT!
+ //16_PM: EMS4! AND EMS 3.2 MASSIVE DATA HANDLMENT!
MML_UseSpace(gvar->mm.EMSPageFrame,(MAPPAGES)*0x4000lu, gvar);
//if(gvar->pm.emm.EMSVer<0x40)
MM_MapEMS(gvar); // map in used pages
emsskip:
gvar->mmi.XMSmem = 0;
goto xmsskip;//0000
- for(i = 1;i <
-#ifdef __WATCOMC__
- __argc
-#endif
-#ifdef __BORLANDC__
- _argc
-#endif
- ;i++)
+ for(i = 1;i < _argc;i++)
{
- if(US_CheckParm(
-#ifdef __WATCOMC__
- __argv[i]
-#endif
-#ifdef __BORLANDC__
- _argv[i]
-#endif
- ,ParmStringsexmm) == 0)
+ if(US_CheckParm( _argv[i],ParmStringsexmm) == 0)
goto xmsskip; // param NOXMS
}
- if(MML_CheckForXMS(gvar))
+ if(MML_CheckForXMS())
{
MML_SetupXMS(gvar); // allocate as many UMBs as possible
}
}
+xmsskip:
#endif
//
// allocate the misc buffer
//
-xmsskip:
gvar->mm.mmrover = gvar->mm.mmhead; // start looking for space after low block
MM_GetPtr(&(gvar->mm.bufferseg),BUFFERSIZE, gvar);
#ifdef __BORLANDC__
free(gvar->mm.nearheap);// printf(" near freed\n");
#endif
+#ifndef __16_PM__
#ifdef __DEBUG__
- if(!debugpm) {
+ if(!dbg_debugpm) {
#endif
if(MML_CheckForEMS()){ MML_ShutdownEMS(gvar); }//printf(" EMS freed\n"); }
- if(MML_CheckForXMS(gvar)){ MML_ShutdownXMS(gvar); }//printf(" XMS freed\n"); }
+ if(MML_CheckForXMS()){ MML_ShutdownXMS(gvar); }//printf(" XMS freed\n"); }
#ifdef __DEBUG__
}
#endif
+#endif
}
//==========================================================================
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;
+ unsigned start,length,source,dest;//++++,oldborder;
+ //++++int playing;
//
// lock down a currently playing sound
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);*/
}
//==========================================================================
void MM_ShowMemory(global_game_variables_t *gvar)
{
- //huge mmblocktype huge *scan;
mmblocktype far *scan;
- word temp;
+ //word temp;
sdword end,owner;
//word chx,chy;
word w;
//dword wwww;
- byte scratch[160],scratch0[4096],scratch1[160],str[16];
+ byte scratch[160],scratch0[4096],str[16];//[[[[scratch1[160],
//byte d = '#';
-//**** VW_SetDefaultColors();
-//**** VW_SetLineWidth(40);
+//[[[[ VW_SetDefaultColors();
+//[[[[ VW_SetLineWidth(40);
//++++mh temp = bufferofs;
//++++mh bufferofs = 0;
-//**** VW_SetScreen (0,0);
+//[[[[ VW_SetScreen (0,0);
scan = gvar->mm.mmhead;
end = -1;
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;
void MM_Report_(global_game_variables_t *gvar)
{
printf("========================================\n");
- printf(" MM_Report\n");
+ printf(" MM_Report_\n");
printf("========================================\n");
if(MML_CheckForEMS())
{
- printf(" LIMEMS\n");
- printf(" EMM v%x.%x available\n", gvar->pm.emm.EMSVer>>4,gvar->pm.emm.EMSVer&0x0F);
- printf(" totalEMSpages: %u ", gvar->pm.emm.totalEMSpages); printf("freeEMSpages: %u\n", gvar->pm.emm.freeEMSpages);
- printf(" EMSPageFrame: %x\n", gvar->pm.emm.EMSPageFrame);
+ printf(" %cLIMEMS %u\n", 0xC9, gvar->pm.emm.EMSPresent);
+ printf(" %c%cEMM v%x.%x available\n", 0xC7, 0xC4, gvar->pm.emm.EMSVer>>4,gvar->pm.emm.EMSVer&0x0F);
+ printf(" %c%ctotalEMSpages: %u ", 0xC7, 0xC4, gvar->pm.emm.totalEMSpages); printf("freeEMSpages: %u\n", gvar->pm.emm.freeEMSpages);
+ printf(" %c%cEMSPageFrame: %04x\n", 0xC7, 0xC4, gvar->pm.emm.EMSPageFrame);
+ printf(" %c%cEMSmem: %lu\n", 0xD3, 0xC4, gvar->mmi.EMSmem);
}
- if(MML_CheckForXMS(gvar))
+ if(MML_CheckForXMS())
{
- printf(" XMS\n");
- printf(" XMSaddr: %X\n", *XMSaddr);
+ printf(" %cXMS %u\n", 0xC9, gvar->pm.xmm.XMSPresent);
+ printf(" %c%cXMS v%x.%x available\n", 0xC7, 0xC4, XMSVer>>8,XMSVer&0x0F);
+ printf(" %c%cXMSDriver: %Fp\n", 0xC7, 0xC4, XMSDriver);
+ printf(" %c%cXMSHandle: %04x\n", 0xC7, 0xC4, gvar->pm.xmm.XMSHandle);
+ printf(" %c%cXMSmem: %lu\n", 0xD3, 0xC4, gvar->mmi.XMSmem);
}
- printf("near: %lu ", gvar->mmi.nearheap); printf("far: %lu\n", gvar->mmi.farheap); if(MML_CheckForEMS())
- printf("EMSmem: %lu ", gvar->pm.emm.EMSAvail/*gvar->mmi.EMSmem*/); if(MML_CheckForXMS(gvar)) printf("XMSmem: %lu", gvar->mmi.XMSmem); printf("\n");
+ printf(" %cConv. %u\n", 0xC9, gvar->pm.mm.MainPresent); DebugMemory_(gvar, 0);
//printf("mainmem: %lu\n", gvar->mmi.mainmem);
- printf("Total convmem: %lu ", gvar->mmi.mainmem); printf("TotalFree: %lu ", MM_TotalFree(gvar)); printf("TotalUsed: %lu\n", gvar->mmi.mainmem+gvar->mmi.EMSmem+gvar->mmi.XMSmem+gvar->mmi.XMSmem);
- printf(" UnusedMemory: %lu\n", MM_UnusedMemory(gvar));
+ //printf("Total convmem: %lu ", gvar->mmi.mainmem); printf("TotalFree: %lu ", MM_TotalFree(gvar)+gvar->mmi.EMSmem+gvar->mmi.XMSmem+gvar->mmi.XMSmem); printf("TotalUsed: %lu\n", gvar->mmi.mainmem);
+ //printf(" UnusedMemory: %lu\n", MM_UnusedMemory(gvar));
+ printf("nearheap: %lu ", gvar->mmi.nearheap); printf("farheap: %lu\n", gvar->mmi.farheap);
}
//==========================================================================
gvar->mm.mmfree=x;
}*/
+void xms_call(byte v, global_game_variables_t *gvar)
+{
+ dword XMSDriver = gvar->pm.xmm.XMSDriver;
+ __asm {
+ mov ah,[v]
+ call [DWORD PTR XMSDriver]
+ }
+}
+
/*void MM_seguin(void)
{
__asm {