X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=src%2Flib%2F16_mm.c;h=9486e2e55e008d1abcdd0f3ebc8a36d0cb3074b9;hb=f7d4708784bcfac49b37a1648e06e24b56063e7e;hp=c85297a83a211608eb65f498b744331fd7013490;hpb=1d18e37e88759bbd3ecc829766f29e695ef24c55;p=16.git diff --git a/src/lib/16_mm.c b/src/lib/16_mm.c index c85297a8..9486e2e5 100644 --- a/src/lib/16_mm.c +++ b/src/lib/16_mm.c @@ -47,6 +47,10 @@ Open Watcom port by sparky4 */ #include "src/lib/16_mm.h" +#pragma hdrstop + +#pragma warn -pro +#pragma warn -use /* ============================================================================= @@ -629,19 +633,21 @@ void MML_ClearBlock(mminfo_t *mm) void MM_Startup(mminfo_t *mm, mminfotype *mmi) { int i; - dword length; + dword length,seglength; + //dword length; word seglength; void huge *start; - unsigned segstart,seglength,endfree; + word segstart;//,endfree; if(mm->mmstarted) MM_Shutdown(mm); mm->mmstarted = true; mm->bombonerror = true; + // // set up the linked list (everything in the free list; // - printf(" linked list making!\n"); + //printf(" linked list making!\n"); mm->mmhead = NULL; mm->mmfree = &(mm->mmblocks[0]); for(i=0;immhead = mm->mmnew; // this will allways be the first node mm->mmnew->start = 0; - mm->mmnew->length = 0x1; + mm->mmnew->length = 0xffff; mm->mmnew->attributes = LOCKBIT; mm->mmnew->next = NULL; mm->mmrover = mm->mmhead; @@ -665,11 +671,10 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi) // // get all available near conventional memory segments // - printf(" nearheap making!\n"); //---- length=coreleft(); - //_nheapgrow(); - length=_memmax(); - //printf(" %Fp\n", mmi->segu); + printf(" nearheap making!\n"); + _nheapgrow(); + length=(dword)_coreleft();//(dword)_memmax();//(dword)GetFreeSize(); start = (void huge *)(mm->nearheap = _nmalloc(length)); length -= 16-(FP_OFF(start)&15); length -= SAVENEARHEAP; @@ -677,21 +682,9 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi) segstart = FP_SEG(start)+(FP_OFF(start)+15)/16; MML_UseSpace(segstart,seglength, mm); mmi->nearheap = length; - /*switch( _nheapchk() ) { - case _HEAPOK: - printf( "OK - nearheap is good\n" ); - break; - case _HEAPEMPTY: - printf( "OK - nearheap is empty\n" ); - break; - case _HEAPBADBEGIN: - printf( "ERROR - nearheap is damaged\n" ); - break; - case _HEAPBADNODE: - printf( "ERROR - bad node in nearheap\n" ); - break; - }*/ - printf(" near heap ok!\n"); + printf("start=%FP segstart=%X seglen=%lu len=%lu\n", start, segstart, seglength, length); + //heapdump(); + //getch(); // // get all available far conventional memory segments @@ -699,32 +692,23 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi) //---- length=farcoreleft(); printf(" farheap making!\n"); _fheapgrow(); - length=0xffffUL*4UL;//_memavl(); - //printf(" %Fp\n", mmi->segu); - start = mm->farheap = halloc(length, sizeof(byte)); - //start = mm->farheap = _fmalloc(length); + length=(dword)_farcoreleft();//(dword)GetFarFreeSize();//0xffffUL*4UL; + //start = mm->farheap = halloc(length, 1); + start = mm->farheap = _fmalloc(length); 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, mm); mmi->farheap = length; + printf("start=%FP segstart=%X seglen=%lu len=%lu\n", start, segstart, seglength, length); + heapdump(); + mmi->mainmem = mmi->nearheap + mmi->farheap; - /*switch( _fheapchk() ) { - case _HEAPOK: - printf( "OK - farheap is good\n" ); - break; - case _HEAPEMPTY: - printf( "OK - farheap is empty\n" ); - break; - case _HEAPBADBEGIN: - printf( "ERROR - farheap is damaged\n" ); - break; - case _HEAPBADNODE: - printf( "ERROR - bad node in farheap\n" ); - break; - }*/ - printf(" far heap ok!\n"); + + getch(); + +//goto xmsskip; // // detect EMS and allocate up to 64K at page frame @@ -770,7 +754,6 @@ printf("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 { printf("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); //bug! printf(" XMS!\n"); - //++++ MML_SetupXMS(mm, mmi); // allocate as many UMBs as possible } @@ -778,10 +761,6 @@ printf(" XMS!\n"); // allocate the misc buffer // xmsskip: -/*mmi->nearheap = 0; -mmi->farheap = 0; -mmi->EMSmem = 0; -mmi->XMSmem = 0;*/ mm->mmrover = mm->mmhead; // start looking for space after low block MM_GetPtr(&(mm->bufferseg),BUFFERSIZE, mm, mmi); @@ -804,12 +783,8 @@ void MM_Shutdown(mminfo_t *mm) if(!(mm->mmstarted)) return; - _ffree(mm->farheap); - printf(" far freed\n"); - free(mm->nearheap); - printf(" near freed\n"); - //hfree(mm->hugeheap); - //printf("huge freed\n"); + _ffree(mm->farheap); printf(" far freed\n"); + _nfree(mm->nearheap); printf(" near freed\n"); if(MML_CheckForEMS()){ MML_ShutdownEMS(mm); printf(" EMS freed\n"); } if(MML_CheckForXMS(mm)){ MML_ShutdownXMS(mm); printf(" XMS freed\n"); } } @@ -909,7 +884,12 @@ void MM_GetPtr(memptr *baseptr,dword size, mminfo_t *mm, mminfotype *mmi) } if (mm->bombonerror) + { printf(OUT_OF_MEM_MSG,(size-mmi->nearheap)); + printf("for stability reasons the program will shut down! wwww\n"); + MM_Shutdown(mm); + exit(-1); + } else mm->mmerror = true; } @@ -1229,7 +1209,7 @@ strcpy(scratch,"Seg:"); ultoa (scan->start,str,16); strcat (scratch,str); strcat (scratch,"\tSize:"); -ltoa ((dword)scan->length*16,str,10); +ultoa ((dword)scan->length,str,10); strcat (scratch,str); strcat (scratch,"\tOwner:0x"); owner = (unsigned)scan->useptr; @@ -1273,9 +1253,9 @@ void MM_DumpData(mminfo_t *mm) //++++free(mm->nearheap); - dumpfile = fopen ("mmdump.txt","w"); + dumpfile = fopen ("mmdump.16","w"); if (!dumpfile){ - printf("MM_DumpData: Couldn't open MMDUMP.TXT!\n"); + printf("MM_DumpData: Couldn't open MMDUMP.16!\n"); return; } @@ -1316,7 +1296,7 @@ void MM_DumpData(mminfo_t *mm) } while (lowest != 0xffff); fclose(dumpfile); - printf("MMDUMP.TXT created.\n"); + printf("MMDUMP.16 created.\n"); } //========================================================================== @@ -1346,8 +1326,8 @@ dword MM_UnusedMemory(mminfo_t *mm) scan = scan->next; } - return free*16l; -// return free; +// return free*16l; + return free; } //========================================================================== @@ -1379,8 +1359,8 @@ dword MM_TotalFree(mminfo_t *mm) scan = scan->next; } - return free*16l; -// return free; +// return free*16l; + return free; } //========================================================================== @@ -1402,7 +1382,7 @@ void MM_Report(/*page_t *page, */mminfo_t *mm, mminfotype *mmi) printf("freeEMSpages=%u\n", mm->freeEMSpages); printf("EMSpageframe=%x\n", mm->EMSpageframe); } - if(MML_CheckForXMS(mm)) printf("XMSaddr=%Fp\n", *XMSaddr); + if(MML_CheckForXMS(mm)) printf("XMSaddr=%X\n", *XMSaddr); printf("near=%lu\n", mmi->nearheap); printf("far=%lu\n", mmi->farheap); printf("EMSmem=%lu\n", mmi->EMSmem); @@ -1410,6 +1390,8 @@ void MM_Report(/*page_t *page, */mminfo_t *mm, mminfotype *mmi) printf("mainmem=%lu\n", mmi->mainmem); printf("UnusedMemory=%lu\n", MM_UnusedMemory(mm)); printf("TotalFree=%lu\n", MM_TotalFree(mm)); + //mmi->nearheap+mmi->farheap+ + printf("TotalUsed=%lu\n", mmi->mainmem+mmi->EMSmem+mmi->XMSmem);//+); // printf("\n"); // printf("UnusedMemory=%lu kb\n", MM_UnusedMemory()/10248); // printf("TotalFree=%lu kb\n", MM_TotalFree()/10248); @@ -1584,8 +1566,7 @@ void MM_FreeBlock(mmblocktype *x, mminfo_t *mm) void MM_seguin(void) { - __asm - { + __asm { push ds mov ax,ds inc ax @@ -1595,8 +1576,7 @@ void MM_seguin(void) void MM_segude(void) { - __asm - { + __asm { pop ds } }