]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/16_pm.c
xms still being worked on
[16.git] / src / lib / 16_pm.c
index a5bbb6010bb60ccca82c815786751565e59c0e0f..ae14303f5d13b43ad9ff4dcc241b00a61987498d 100755 (executable)
@@ -83,11 +83,11 @@ static      char            *ParmStrings[] = {"nomain","noems","noxms",nil};
 byte\r
 PML_MapEMS(word logical, byte physical, global_game_variables_t *gvar)\r
 {\r
-       byte    str[160];\r
+       byte    err, str[160];\r
        unsigned        EMShandle;\r
-       byte err;\r
-       boolean errorflag=false;\r
        int     i;\r
+\r
+       boolean errorflag=false;\r
        EMShandle=gvar->pm.emm.EMSHandle;\r
 \r
        __asm {\r
@@ -139,11 +139,10 @@ boolean
 PML_StartupEMS(global_game_variables_t *gvar)\r
 {\r
        int             i;\r
-       long    size;\r
-       byte    str[64];\r
-       byte err;\r
+       //long  size;\r
+       byte    err, str[64];\r
 \r
-       boolean errorflag=0;\r
+       boolean errorflag=false;\r
        static char     emmname[] = "EMMXXXX0"; //fix by andrius4669\r
        unsigned int EMSVer = 0;\r
        unsigned        totalEMSpages,freeEMSpages,EMSPageFrame,EMSHandle,EMSAvail;\r
@@ -299,10 +298,9 @@ void
 PML_ShutdownEMS(global_game_variables_t *gvar)\r
 {\r
        word EMSHandle;\r
-       byte err;\r
-       byte    str[64];\r
-       boolean errorflag=false;\r
+       byte err,str[64];\r
 \r
+       boolean errorflag=false;\r
        EMSHandle=gvar->pm.emm.EMSHandle;\r
 \r
        if (gvar->pm.emm.EMSPresent)\r
@@ -357,7 +355,12 @@ boolean
 PML_StartupXMS(global_game_variables_t *gvar)\r
 {\r
        boolean errorflag;\r
-       word XMSAvail, XMSHandle;\r
+       byte err;\r
+       word /*XMSAvail,*/ XMSHandle;\r
+\r
+       word XMSAvail1, XMSAvail2, XMSAvail3, XMSAvail4;\r
+\r
+       word e=0;\r
        errorflag=gvar->pm.xmm.XMSPresent = false;                                      // Assume failure\r
        gvar->pm.xmm.XMSAvail = gvar->mmi.XMSmem = 0;\r
 \r
@@ -365,83 +368,139 @@ PML_StartupXMS(global_game_variables_t *gvar)
                mov     ax,0x4300\r
                int     XMS_INT                                         // Check for presence of XMS driver\r
                cmp     al,0x80\r
-               jne     errorxu\r
+               jne     error1\r
+               mov     e,1\r
 \r
                mov     ax,0x4310\r
                int     XMS_INT                                                 // Get address of XMS driver\r
                mov     [WORD PTR XMSDriver],bx\r
                mov     [WORD PTR XMSDriver+2],es               // function pointer to XMS driver\r
+               mov     e,2\r
 \r
                //XMS_CALL(XMS_QUERYFREE);                      // Find out how much XMS is available\r
-               mov     ah,XMS_QUERYFREE\r
+               mov     ah,XMS_QUERYFREE                        // Find out how much XMS is available\r
                call    [DWORD PTR XMSDriver]\r
-               mov     [XMSAvail],ax\r
-               or      ax,ax                           // AJR: bugfix 10/8/92\r
-               jz      errorxu\r
-               jmp     Endxu\r
+               //mov   [XMSAvail],ax\r
+               //mov   XMSAvail1,ax\r
+               //mov   ax,XMSAvail2\r
+               //mov   [XMSAvail3],ax\r
+               mov     ax,[XMSAvail4]\r
+               mov     err,bl\r
+               cmp     ax,0                            // AJR: bugfix 10/8/92\r
+               je      error1\r
+               mov     e,3\r
+               jmp     End1\r
 #ifdef __BORLANDC__\r
        }\r
 #endif\r
-               errorxu:\r
+       error1:\r
 #ifdef __BORLANDC__\r
        __asm {\r
 #endif\r
-               //mov   err,ah\r
+               mov     err,bl\r
                mov     errorflag,1\r
-               jmp     Endxu\r
+               jmp End1\r
 #ifdef __BORLANDC__\r
        }\r
 #endif\r
-               Endxu:\r
+End1:\r
 #ifdef __WATCOMC__\r
        }\r
 #endif\r
-       XMSAvail &= ~(PMPageSizeKB - 1);        // Round off to nearest page size\r
-       if (XMSAvail < (PMPageSizeKB * 2)){     // Need at least 2 pages\r
-               printf("PISS! %u\n", XMSAvail);\r
+\r
+//     XMS_CALL(XMS_QUERYFREE);                        // Find out how much XMS is available\r
+//     XMSAvail = _AX;\r
+//     if (!_AX)                               // AJR: bugfix 10/8/92\r
+//             goto error;\r
+\r
+       printf("        XMSAvail=%u     e=%u\n", XMSAvail4, e);\r
+       //printf("      %u      %u      %u      %u\n", XMSAvail1, XMSAvail2, XMSAvail3, XMSAvail4);\r
+       XMSAvail4 &= ~(PMPageSizeKB - 1);       // Round off to nearest page size\r
+       if (XMSAvail4 < (PMPageSizeKB * 2)){    // Need at least 2 pages\r
+               printf("PISS! %u\n", XMSAvail4);\r
                goto error;\r
        }\r
 \r
        __asm {\r
-               mov     dx,[XMSAvail]\r
+               mov     dx,XMSAvail4\r
                //XMS_CALL(XMS_ALLOC);                          // And do the allocation\r
                mov     ah,XMS_ALLOC\r
-               call    [WORD PTR XMSDriver]\r
-               mov     [XMSHandle],dx\r
+               call    [DWORD PTR XMSDriver]\r
+               mov     XMSHandle,dx\r
                or      ax,ax                           // AJR: bugfix 10/8/92\r
-               jz      errorxuu\r
-               jmp     Endxuu\r
+               jz      error2\r
+               mov     e,4\r
+               jmp     End2\r
 #ifdef __BORLANDC__\r
-               }\r
+       }\r
 #endif\r
-               errorxuu:\r
+       error2:\r
 #ifdef __BORLANDC__\r
        __asm {\r
 #endif\r
-               //mov   err,ah\r
-               mov     [XMSAvail],0\r
+               mov     err,bl\r
                mov     errorflag,1\r
-               jmp     Endxuu\r
+               jmp End2\r
 #ifdef __BORLANDC__\r
        }\r
 #endif\r
-               Endxuu:\r
+End2:\r
 #ifdef __WATCOMC__\r
        }\r
 #endif\r
 \r
        if(errorflag==false)\r
        {\r
-               gvar->pm.xmm.XMSAvail = XMSAvail;\r
-               gvar->mmi.XMSmem += gvar->pm.xmm.XMSAvail * (dword)1024;\r
+               gvar->mmi.XMSmem = XMSAvail4 * (dword)1024;\r
+               gvar->pm.xmm.XMSAvail = XMSAvail4;\r
                gvar->pm.xmm.XMSHandle = XMSHandle;\r
 \r
                gvar->pm.xmm.XMSPresent = true;\r
-               printf("        %u      %u      %u\n", gvar->mmi.XMSmem, gvar->pm.xmm.XMSAvail, XMSAvail);\r
+               printf("        %u      %u      %u\n", gvar->mmi.XMSmem, gvar->pm.xmm.XMSAvail, XMSAvail4);\r
                getch();\r
-       }else printf("  errorflag\n");\r
+       }else printf("  %u      errorflag=%02X\n", XMSAvail4, err);\r
 error:\r
        return(gvar->pm.xmm.XMSPresent);\r
+/*\r
+       gvar->pm.xmm.XMSPresent = false;                                        // Assume failure\r
+       gvar->pm.xmm.XMSAvail = 0;\r
+\r
+__asm  mov     ax,0x4300\r
+__asm  int     XMS_INT                                         // Check for presence of XMS driver\r
+       if (_AL != 0x80)\r
+               goto error;\r
+\r
+\r
+__asm  mov     ax,0x4310\r
+__asm  int     XMS_INT                                                 // Get address of XMS driver\r
+__asm  mov     [WORD PTR XMSDriver],bx\r
+__asm  mov     [WORD PTR XMSDriver+2],es               // function pointer to XMS driver\r
+\r
+       XMS_CALL(XMS_QUERYFREE);                        // Find out how much XMS is available\r
+       gvar->pm.xmm.XMSAvail = _AX;\r
+       if (!_AX)                               // AJR: bugfix 10/8/92\r
+               goto error;\r
+\r
+       gvar->pm.xmm.XMSAvail &= ~(PMPageSizeKB - 1);   // Round off to nearest page size\r
+       if (gvar->pm.xmm.XMSAvail < (PMPageSizeKB * 2)) // Need at least 2 pages\r
+               goto error;\r
+\r
+       _DX = gvar->pm.xmm.XMSAvail;\r
+       XMS_CALL(XMS_ALLOC);                            // And do the allocation\r
+       gvar->pm.xmm.XMSHandle = _DX;\r
+\r
+       if (!_AX)                               // AJR: bugfix 10/8/92\r
+       {\r
+               gvar->pm.xmm.XMSAvail = 0;\r
+               goto error;\r
+       }\r
+\r
+       gvar->mmi.XMSmem = gvar->pm.xmm.XMSAvail * 1024;\r
+\r
+       gvar->pm.xmm.XMSPresent = true;\r
+error:\r
+       printf("XMSstart        %u      %u\n", gvar->mmi.XMSmem, gvar->pm.xmm.XMSAvail);\r
+       return(gvar->pm.xmm.XMSPresent);*/\r
 }\r
 \r
 //\r
@@ -529,7 +588,7 @@ PML_ShutdownXMS(global_game_variables_t *gvar)
                        mov     dx,[XMSHandle]\r
                        //XMS_CALL(XMS_FREE);\r
                        mov     ah,XMS_FREE\r
-                       call    [WORD PTR XMSDriver]\r
+                       call    [DWORD PTR XMSDriver]\r
                        or      bl,bl\r
                        jz      errorxs\r
                        jmp     Endxs\r
@@ -1474,7 +1533,7 @@ PM_Startup(global_game_variables_t *gvar)
 \r
        if (!noems && MML_CheckForEMS())\r
                PML_StartupEMS(gvar);\r
-       if (!noxms && MML_CheckForXMS(gvar))\r
+       if (!noxms && MML_CheckForXMS())\r
                PML_StartupXMS(gvar);\r
 \r
        if (!nomain && !gvar->pm.emm.EMSPresent)\r
@@ -1496,7 +1555,7 @@ PM_Startup(global_game_variables_t *gvar)
 void\r
 PM_Shutdown(global_game_variables_t *gvar)\r
 {\r
-       if(MML_CheckForXMS(gvar)) PML_ShutdownXMS(gvar);\r
+       if(MML_CheckForXMS()) PML_ShutdownXMS(gvar);\r
        if(MML_CheckForEMS()) PML_ShutdownEMS(gvar);\r
 \r
        if (!gvar->pm.PMStarted)\r