]> 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 090145a17246750b83b0be5352e9a3e995e53a5d..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
@@ -156,50 +155,50 @@ PML_StartupEMS(global_game_variables_t *gvar)
                mov     dx,OFFSET emmname       //fix by andrius4669\r
                mov     ax,0x3d00\r
                int     EMS_INT         // try to open EMMXXXX0 device\r
-               jc      erroreu\r
+               jc      error1\r
 \r
                mov     bx,ax\r
                mov     ax,0x4400\r
 \r
                int     EMS_INT         // get device info\r
-               jc      erroreu\r
+               jc      error1\r
 \r
                and     dx,0x80\r
-               jz      erroreu\r
+               jz      error1\r
 \r
                mov     ax,0x4407\r
 \r
                int     EMS_INT         // get status\r
-               jc      erroreu\r
+               jc      error1\r
                or      al,al\r
-               jz      erroreu\r
+               jz      error1\r
 \r
                mov     ah,0x3e\r
                int     EMS_INT         // close handle\r
-               jc      erroreu\r
+               jc      error1\r
 \r
                mov     ah,EMS_STATUS\r
                int     EMS_INT\r
-               jc      erroreu                 // make sure EMS hardware is present\r
+               jc      error                 // make sure EMS hardware is present\r
 \r
                mov     ah,EMS_VERSION\r
                int     EMS_INT                 // only work on EMS 3.2 or greater (silly, but...)\r
                or      ah,ah\r
-               jnz     erroreu\r
+               jnz     error1\r
                mov     [EMSVer],ax             //      set EMSVer\r
                cmp     al,0x32                 // only work on ems 3.2 or greater\r
-               jb      erroreu\r
+               jb      error1\r
 \r
                mov     ah,EMS_GETFRAME\r
                int     EMS_INT                 // find the page frame address\r
                or      ah,ah\r
-               jnz     erroreu\r
+               jnz     error1\r
                mov     [EMSPageFrame],bx\r
 \r
                mov     ah,EMS_GETPAGES\r
                int     EMS_INT                 // find out how much EMS is there\r
                or      ah,ah\r
-               jnz     erroreu\r
+               jnz     error1\r
                or      bx,bx\r
                jz      noEMS                   // no EMS at all to allocate\r
                cmp     bx,2\r
@@ -207,22 +206,22 @@ PML_StartupEMS(global_game_variables_t *gvar)
                mov     [totalEMSpages],dx\r
                mov     [freeEMSpages],bx\r
                mov     [EMSAvail],bx\r
-               jmp     Endeu\r
+               jmp End1\r
 #ifdef __BORLANDC__\r
        }\r
 #endif\r
-               erroreu:\r
+       error1:\r
 #ifdef __BORLANDC__\r
        __asm {\r
 #endif\r
                mov     err,ah\r
                mov     errorflag,1\r
-               jmp     Endeu\r
+               jmp End1\r
 #ifdef __BORLANDC__\r
        }\r
 #endif\r
-               noEMS:\r
-               Endeu:\r
+noEMS:\r
+End1:\r
 #ifdef __WATCOMC__\r
        }\r
 #endif\r
@@ -240,34 +239,32 @@ PML_StartupEMS(global_game_variables_t *gvar)
 */\r
        __asm {\r
                mov     ah,EMS_ALLOCPAGES\r
-               mov     bx,[EMSAvail]\r
+               mov     bx,[EMSAvail];\r
                int     EMS_INT\r
                or      ah,ah\r
-               jnz     erroreuu\r
+               jnz     error2\r
                mov     [EMSHandle],dx\r
-               jmp     Endeuu\r
+               jmp     End2\r
 #ifdef __BORLANDC__\r
        }\r
 #endif\r
-               erroreuu:\r
+       error2:\r
 #ifdef __BORLANDC__\r
        __asm {\r
 #endif\r
                mov     err,ah\r
                mov     errorflag,1\r
-               jmp Endeuu\r
+               jmp End2\r
 #ifdef __BORLANDC__\r
        }\r
 #endif\r
-               Endeuu:\r
+End2:\r
 #ifdef __WATCOMC__\r
        }\r
 #endif\r
 \r
        if(errorflag==false)\r
        {\r
-       //gvar->pm.emm.EMSAvail = EMSAvail;\r
-       //gvar->mmi.EMSmem = gvar->pm.emm.EMSAvail * (dword)EMSPageSize;\r
        gvar->mmi.EMSmem = EMSAvail * (dword)EMSPageSize;\r
 \r
        // Initialize EMS mapping cache\r
@@ -285,6 +282,7 @@ PML_StartupEMS(global_game_variables_t *gvar)
 \r
        gvar->pm.emm.EMSPresent = true;                 // We have EMS\r
        gvar->pm.emm.EMSPageFrame = EMSPageFrame;\r
+       gvar->pm.emm.EMSAvail = EMSAvail;\r
        gvar->pm.emm.EMSVer = EMSVer;\r
        gvar->pm.emm.EMSHandle = EMSHandle;\r
        gvar->pm.emm.freeEMSpages = freeEMSpages;\r
@@ -300,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
@@ -358,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
@@ -366,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
@@ -530,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
@@ -1473,9 +1531,9 @@ PM_Startup(global_game_variables_t *gvar)
 \r
        //0000+=+=PML_OpenPageFile(gvar);\r
 \r
-       if (!noems)\r
+       if (!noems && MML_CheckForEMS())\r
                PML_StartupEMS(gvar);\r
-       if (!noxms)\r
+       if (!noxms && MML_CheckForXMS())\r
                PML_StartupXMS(gvar);\r
 \r
        if (!nomain && !gvar->pm.emm.EMSPresent)\r
@@ -1497,8 +1555,8 @@ PM_Startup(global_game_variables_t *gvar)
 void\r
 PM_Shutdown(global_game_variables_t *gvar)\r
 {\r
-       PML_ShutdownXMS(gvar);\r
-       PML_ShutdownEMS(gvar);\r
+       if(MML_CheckForXMS()) PML_ShutdownXMS(gvar);\r
+       if(MML_CheckForEMS()) PML_ShutdownEMS(gvar);\r
 \r
        if (!gvar->pm.PMStarted)\r
                return;\r