]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/16_mm.c
pusing~
[16.git] / src / lib / 16_mm.c
index 9de9d0b8d4951e4746760681057c07e84b07de4a..1800c7d5bde45ba148ad6cf03dcce2460a66a0b9 100644 (file)
@@ -83,10 +83,11 @@ static      char *ParmStringsexmm[] = {"noems","noxms",""};
 boolean MML_CheckForEMS(void)
 {
        boolean emmcfems;
-       char    emmname[] = "EMMXXXX0";
+       static char     emmname[] = "EMMXXXX0"; //fix by andrius4669
 //             mov     dx,OFFSET emmname
        __asm {
-               LEA     DX, emmname     //fix by andrius4669
+               //LEA   DX, emmname     //fix by andrius4669
+               mov     dx,OFFSET emmname       //fix by andrius4669
                mov     ax,0x3d00
                int     0x21            // try to open EMMXXXX0 device
                jc      error
@@ -423,9 +424,8 @@ void MML_ShutdownXMS(mminfo_t *mm)
 void MML_UseSpace(/*d*/word segstart, dword seglength, mminfo_t *mm)
 {
        mmblocktype huge *scan,huge *last;
+       word            segm;
        dword   oldend;
-       ///*d*/word fat=0;
-       //word segm=0;
        dword           extra;
 
        scan = last = mm->mmhead;
@@ -440,13 +440,21 @@ void MML_UseSpace(/*d*/word segstart, dword seglength, mminfo_t *mm)
                scan = scan->next;
        }
 
+       //find out how many blocks it spans!
+       if(seglength>0xffffu)
+       {
+//             segm=seglength/0x4000u;
+               segm=seglength/0xffffu;
+       }
+       else segm=1;
+
 //
 // take the given range out of the block
 //
        oldend = scan->start + scan->length;
        extra = oldend - (segstart+seglength);
        //++++emsver stuff!
-       if(extra>0xfffflu)
+       if(segm>1/*extra>0xfffflu*/)
        {
                /*__asm
                {
@@ -455,11 +463,11 @@ void MML_UseSpace(/*d*/word segstart, dword seglength, mminfo_t *mm)
                        inc             ax
                        mov     ds,ax
                }*/
-printf("extra=%lu      ", extra);
-printf("oldend=%lu     ", oldend);
-printf("length=%u      ", scan->length);
-printf("segstart=%u    ", segstart);
-printf("seglength=%lu\n", seglength);
+printf("segm=%u        ", segm);
+printf("ex=%lu ", extra);
+printf("len=%u ", scan->length);
+printf("segsta=%x      ", segstart);
+printf("seglen=%lu\n", seglength);
 
 //MML_UseSpace(?segstart?, ?length?, mm);
 
@@ -544,7 +552,7 @@ void MML_ClearBlock(mminfo_t *mm)
 void MM_Startup(mminfo_t *mm, mminfotype *mmi)
 {
        int i;
-       dword length;//,farlen;
+       dword length;
        void huge       *start;
        unsigned        segstart,seglength,endfree;
 
@@ -570,7 +578,7 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi)
        MM_GetNewBlock(mm);
        mm->mmhead = mm->mmnew;                         // this will allways be the first node
        mm->mmnew->start = 0;
-       mm->mmnew->length = 0xffff;                     //todo: mm make it fucking massive as fuck!~
+       mm->mmnew->length = 0xffff;
        mm->mmnew->attributes = LOCKBIT;
        mm->mmnew->next = NULL;
        mm->mmrover = mm->mmhead;
@@ -584,13 +592,13 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi)
        _nheapgrow();
        length=_memavl();
        start = (void huge *)(mm->nearheap = malloc(length));
-
        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, mm);
        mmi->nearheap = length;
+       //printf("near heap ok!\n");
 
 //
 // get all available far conventional memory segments
@@ -598,8 +606,7 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi)
 //---- length=farcoreleft();
        _fheapgrow();
        length=_memavl();
-       //length-=farlen;
-       start = mm->farheap = halloc(length, sizeof(dword));
+       start = mm->farheap = halloc(length, sizeof(byte));
        //start = mm->farheap = _fmalloc(length);
        length -= 16-(FP_OFF(start)&15);
        length -= SAVEFARHEAP;
@@ -608,6 +615,7 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi)
        MML_UseSpace(segstart,seglength, mm);
        mmi->farheap = length;
        mmi->mainmem = mmi->nearheap + mmi->farheap;
+       //printf("far heap ok!\n");
 
 
 //
@@ -644,11 +652,11 @@ emsskip:
                if(US_CheckParm(__argv[i],ParmStringsexmm) == 0)
                        goto xmsskip;                           // param NOXMS
        }
-//     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("\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!
        if(MML_CheckForXMS(mm))
        {
                printf("XMS!\n");
-               //++++++++MML_SetupXMS(mm, mmi);                                        // allocate as many UMBs as possible
+               //MML_SetupXMS(mm, mmi);                                        // allocate as many UMBs as possible
        }
 
 //
@@ -1029,9 +1037,9 @@ void MM_SortMem(mminfo_t *mm)
 void MM_ShowMemory(mminfo_t *mm)
 {
        mmblocktype huge *scan;
-       unsigned color,temp;//, i;
+       unsigned color,temp;
        long    end,owner;
-       char    scratch[80],str[10];
+       char    scratch[160],str[16];
 
 //**** VW_SetDefaultColors();
 //**** VW_SetLineWidth(40);
@@ -1045,7 +1053,7 @@ void MM_ShowMemory(mminfo_t *mm)
 
 //CA_OpenDebug ();
 
-       while (scan)
+       while(scan)
        {
                if(scan->attributes & PURGEBITS)
                        color = 5;              // dark purple = purgable
@@ -1055,7 +1063,7 @@ void MM_ShowMemory(mminfo_t *mm)
                        color = 12;             // red = locked
                if(scan->start<=end)
                {
-                       printf("MM_ShowMemory: Memory block order currupted!");
+                       printf("\nMM_ShowMemory: Memory block order currupted!\n");
                        return;
                }
                end = scan->start+scan->length-1;
@@ -1065,9 +1073,11 @@ void MM_ShowMemory(mminfo_t *mm)
 //++++                 VW_Hlin(end+1,scan->next->start,0,0);   // black = free
 
 //****#if 0
-printf("Location:");
-printf("%x\t", scan->start);
-strcpy (scratch,"Size:");
+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!
+strcpy(scratch,"Location:");
+ultoa (scan->start,str,16);
+strcat (scratch,str);
+strcat (scratch,"\tSize:");
 ltoa ((dword)scan->length*16,str,10);
 strcat (scratch,str);
 strcat (scratch,"\tOwner:0x");