]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/16_mm.c
wound workings
[16.git] / src / lib / 16_mm.c
index 9802e4d8d66626f6760dc31f463b4712db284bde..1ae9e65ab9f94e24f706f0eded02541424963b6a 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
@@ -174,7 +175,15 @@ unsigned MML_SetupEMS(mminfo_t *mm)
                mov     [freeEMSpages],bx
                or      bx,bx
                jz      noEMS                                           // no EMS at all to allocate
-
+                                                                                       //EXPAND DONG!!!!
+               cmp     [EMSVer],0x40
+               jb      low
+               cmp     bx,[freeEMSpages]
+               jle     getpages
+               mov     bx,[freeEMSpages]
+               jmp     getpages
+
+low:
                cmp     bx,4
                jle     getpages                                        // there is only 1,2,3,or 4 pages
                mov     bx,4                                            // we can't use more than 4 pages
@@ -261,7 +270,7 @@ unsigned MM_MapEMS(mminfo_t *mm)
        union REGS CPURegs;
        EMShandle=mm->EMShandle;
 
-       for (i=0;i<mm->EMSpagesmapped;i++)
+       for (i=0;i<4/*mm->EMSpagesmapped*/;i++)
        {
                __asm
                {
@@ -283,13 +292,44 @@ unsigned MM_MapEMS(mminfo_t *mm)
                        strcpy(str,"MM_MapEMS: EMS error 0x");
                        itoa(err,str2,16);
                        strcpy(str,str2);
-                       printf("%s\n",str);
+                       //printf("%s\n",str);
+                       printf("FACK! %u\n", err);
                        return err;
                }
        }
        return 0;
 }
 
+/*
+SUB EMS.MapXPages (PhysicalStart, LogicalStart, NumPages, Handle)\r
+\r
+  'Maps up to 4 logical EMS pages to physical pages in the page frame, where:\r
+  '\r
+  'PhysicalStart = Physical page first logical page is mapped to\r
+  'LogicalStart  = First logical page to map\r
+  'NumPages      = Number of pages to map (1 to 4)\r
+  'Handle        = EMS handle logical pages are allocated to\r
+\r
+  'Create a buffer containing the page information\r
+  FOR x = 0 TO NumPages - 1\r
+    MapInfo$ = MapInfo$ + MKI$(LogicalStart + x) + MKI$(PhysicalStart + x)\r
+  NEXT\r
+\r
+  Regs.ax = &H5000                           'Map the pages in the buffer\r
+  Regs.cx = NumPages                         'to the pageframe\r
+  Regs.dx = Handle\r
+  Regs.ds = VARSEG(MapInfo$)\r
+  Regs.si = SADD(MapInfo$)\r
+  InterruptX &H67, Regs, Regs\r
+  EMS.Error = (Regs.ax AND &HFF00&) \ &H100  'Store the status code\r
+\r
+END SUB
+*/
+void MM_MapXEMS(mminfo_t *mm)
+{
+
+}
+
 //==========================================================================
 
 /*
@@ -345,6 +385,7 @@ getmemory:
 
                mov     ah,XMS_ALLOCUMB
                mov     dx,0xffff                                       // try for largest block possible
+               //mov     ax,dx                                         // Set available Kbytes.
                call    [DWORD PTR XMSaddr]
                or      ax,ax
                jnz     gotone
@@ -362,6 +403,7 @@ gotone:
                mov     [size],dx
 done:
        }
+       printf("base=%u ", base); printf("size=%u\n", size);
        MML_UseSpace(base,size, mm);
        mmi->XMSmem += size*16;
        mm->UMBbase[mm->numUMBs] = base;
@@ -410,12 +452,12 @@ void MML_ShutdownXMS(mminfo_t *mm)
 ======================
 */
 
-void MML_UseSpace(unsigned segstart, unsigned seglength, mminfo_t *mm)
+void MML_UseSpace(/*d*/word segstart, dword seglength, mminfo_t *mm)
 {
        mmblocktype huge *scan,huge *last;
-       unsigned        oldend;
-       //++++if(mm->EMSVer)
-       long            extra;
+       word            segm;
+       dword   oldend;
+       dword           extra;
 
        scan = last = mm->mmhead;
        mm->mmrover = mm->mmhead;               // reset rover to start of memory
@@ -429,19 +471,51 @@ void MML_UseSpace(unsigned segstart, unsigned 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;
+
+       //++++emsver stuff!
+       if(segm>1/*extra>0xfffflu*/)
+       {
+               /*__asm
+               {
+                       push    ds
+                       mov     ax,ds
+                       inc             ax
+                       mov     ds,ax
+               }*/
+
+
+//MML_UseSpace(?segstart?, ?length?, mm);
+
+               /*__asm
+               {
+                       pop ds
+               }*/
+               //printf("MML_UseSpace: Segment spans two blocks!\n");
+       }
+
 //
 // take the given range out of the block
 //
        oldend = scan->start + scan->length;
        extra = oldend - (segstart+seglength);
-       //++++emsver stuff!
-       if(extra < 0)
-       {
-               printf("MML_UseSpace: Segment spans two blocks!");
-               return;
-       }
 
+printf("segm=%u        ", segm);
+printf("ex=%lu ", extra);
+printf("start+seglen=%lu       ", segstart+seglength);
+printf("len=%u ", scan->length);
+printf("segsta=%x      ", segstart);
+printf("seglen=%lu\n", seglength);
 
+//segu:
+//++++todo: linked list of segment!
+//printf("segm=%lu\n", segm);
        if(segstart == scan->start)
        {
                last->next = scan->next;                        // unlink block
@@ -451,6 +525,8 @@ void MML_UseSpace(unsigned segstart, unsigned seglength, mminfo_t *mm)
        else
                scan->length = segstart-scan->start;    // shorten block
 
+//     segm--;
+
        if(extra > 0)
        {
                MM_GetNewBlock(mm);
@@ -459,7 +535,7 @@ void MML_UseSpace(unsigned segstart, unsigned seglength, mminfo_t *mm)
                mm->mmnew->start = segstart+seglength;
                mm->mmnew->length = extra;
                mm->mmnew->attributes = LOCKBIT;
-       }
+       }//else if(segm>0) goto segu;
 
 }
 
@@ -491,7 +567,7 @@ void MML_ClearBlock(mminfo_t *mm)
                scan = scan->next;
        }
 
-       printf("MM_ClearBlock: No purgable blocks!");
+       printf("MM_ClearBlock: No purgable blocks!\n");
 }
 
 
@@ -542,6 +618,7 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi)
        mm->mmnew->next = NULL;
        mm->mmrover = mm->mmhead;
 
+//     farlen=_bios_memsize()*1024;
 
 //
 // get all available near conventional memory segments
@@ -550,13 +627,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
@@ -564,7 +641,7 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi)
 //---- length=farcoreleft();
        _fheapgrow();
        length=_memavl();
-       start = mm->farheap = halloc(length, 1);
+       start = mm->farheap = halloc(length, sizeof(byte));
        //start = mm->farheap = _fmalloc(length);
        length -= 16-(FP_OFF(start)&15);
        length -= SAVEFARHEAP;
@@ -573,11 +650,13 @@ 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");
 
 
 //
 // detect EMS and allocate up to 64K at page frame
 //
+       printf("EMS!\n\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!
        mmi->EMSmem = 0;
        for(i = 1;i < __argc;i++)
        {
@@ -590,11 +669,12 @@ void MM_Startup(mminfo_t *mm, mminfotype *mmi)
 //printf("EMS1\n");
                MML_SetupEMS(mm);                                       // allocate space
                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!
-               MML_UseSpace(mm->EMSpageframe,mm->EMSpagesmapped*0x400, mm);
+               //TODO: EMS4! AND EMS 3.2 MASSIVE DATA HANDLMENT!
+               MML_UseSpace(mm->EMSpageframe,(mm->EMSpagesmapped)*0x4000lu, mm);
 //printf("EMS3\n");
                MM_MapEMS(mm);                                  // map in used pages
 //printf("EMS4\n");
-               mmi->EMSmem = mm->EMSpagesmapped*0x4000l;
+               mmi->EMSmem = (mm->EMSpagesmapped)*0x4000lu;
        }
 
 //
@@ -607,11 +687,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
+               printf("XMS!\n");
+               //MML_SetupXMS(mm, mmi);                                        // allocate as many UMBs as possible
        }
 
 //
@@ -992,9 +1072,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);
@@ -1008,7 +1088,7 @@ void MM_ShowMemory(mminfo_t *mm)
 
 //CA_OpenDebug ();
 
-       while (scan)
+       while(scan)
        {
                if(scan->attributes & PURGEBITS)
                        color = 5;              // dark purple = purgable
@@ -1018,7 +1098,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;
@@ -1028,9 +1108,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");
@@ -1068,7 +1150,7 @@ fprintf(stdout, "%s", scratch);
 
 dword MM_UnusedMemory(mminfo_t *mm)
 {
-       unsigned free;
+       dword free;
        mmblocktype huge *scan;
 
        free = 0;
@@ -1099,7 +1181,7 @@ dword MM_UnusedMemory(mminfo_t *mm)
 
 dword MM_TotalFree(mminfo_t *mm)
 {
-       unsigned free;
+       dword free;
        mmblocktype huge *scan;
 
        free = 0;
@@ -1136,7 +1218,7 @@ void MM_Report(mminfo_t *mm, mminfotype *mmi)
                printf("freeEMSpages=%u\n", mm->freeEMSpages);
                printf("EMSpageframe=%x\n", mm->EMSpageframe);
        }
-       if(MML_CheckForXMS(mm)) printf("XMSaddr=%x\n", *XMSaddr);
+       if(MML_CheckForXMS(mm)) printf("XMSaddr=%Fp\n", *XMSaddr);
        printf("near=%lu\n", mmi->nearheap);
        printf("far=%lu\n", mmi->farheap);
        printf("EMSmem=%lu\n", mmi->EMSmem);
@@ -1206,3 +1288,33 @@ void MM_FreeBlock(mmblocktype *x, mminfo_t *mm)
        x->next=mm->mmfree;
        mm->mmfree=x;
 }
+
+void MM_seguin(void)
+{
+       __asm
+       {
+               push    ds
+               mov     ax,ds
+               inc             ax
+               mov     ds,ax
+       }
+}
+
+void MM_segude(void)
+{
+       __asm
+       {
+               pop ds
+       }
+}
+
+/*
+pull data from far and put it into ds var
+mov ax,es:si
+mov x,ax
+*/
+/*
+ss stack segment
+sp top of stack
+bp bottem of stack
+*/