]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/16_pm.c
16_pm tweakings
[16.git] / src / lib / 16_pm.c
index 9740195156dc584e7a15d26a248dbe76289c2028..8ebf0ec000a94529bb03c5b4a14230a9d4a8434e 100755 (executable)
@@ -28,7 +28,7 @@
 \r
 #include "src/lib/16_pm.h"\r
 #pragma hdrstop\r
-union REGS CPURegs;\r
+\r
 /*\r
 //     Main Mem specific variables\r
        boolean                 MainPresent;\r
@@ -77,23 +77,50 @@ static      char            *ParmStrings[] = {"nomain","noems","noxms",nil};
 //\r
 //     PML_MapEMS() - Maps a logical page to a physical page\r
 //\r
-void\r
-PML_MapEMS(word logical, word physical, global_game_variables_t *gvar)\r
+byte\r
+PML_MapEMS(word logical, byte physical, global_game_variables_t *gvar)\r
 {\r
-       union REGS CPURegs;\r
-       CPURegs.h.al = physical;\r
-       CPURegs.x.bx = logical;\r
-       CPURegs.x.dx = gvar->pm.emm.EMSHandle;\r
-       CPURegs.h.ah = EMS_MAPPAGE;\r
+       byte    str[160];\r
+       unsigned        EMShandle;\r
+       byte err;\r
+       boolean errorflag=false;\r
+       int     i;\r
+       EMShandle=gvar->pm.emm.EMSHandle;\r
+\r
        __asm {\r
+               mov     ah,EMS_MAPPAGE\r
+               mov     al,physical\r
+               mov     bx,logical\r
+               mov     dx,EMShandle\r
                int     EMS_INT\r
+               or      ah,ah\r
+               jnz     error\r
+               jmp End\r
+#ifdef __BORLANDC__\r
        }\r
-\r
-       if(CPURegs.h.ah)\r
+#endif\r
+               error:\r
+#ifdef __BORLANDC__\r
+       __asm {\r
+#endif\r
+               mov     err,ah\r
+               mov     errorflag,1\r
+#ifdef __BORLANDC__\r
+       }\r
+#endif\r
+               End:\r
+#ifdef __WATCOMC__\r
+       }\r
+#endif\r
+       if(errorflag==true)\r
        {\r
+               strcpy(str,"MM_MapEMS: EMS error ");\r
+               MM_EMSerr(str, err);\r
+               printf("%s\n",str);\r
                Quit("PML_MapEMS: Page mapping failed\n");\r
-               return;\r
+               return err;\r
        }\r
+       return 0;\r
 }\r
 \r
 //\r
@@ -111,7 +138,6 @@ boolean
 PML_StartupEMS(global_game_variables_t *gvar)\r
 {\r
        boolean emmcfems;\r
-       union REGS CPURegs;\r
 \r
        int             i;\r
        long    size;\r
@@ -121,8 +147,8 @@ PML_StartupEMS(global_game_variables_t *gvar)
        emmcfems=0;\r
 \r
        __asm {\r
-       //CPURegs.x.dx = (word)EMMDriverName;\r
-       //CPURegs.x.ax = 0x3d00;\r
+       //_DX = (word)EMMDriverName;\r
+       //_AX = 0x3d00;\r
        //geninterrupt(0x21);                   // try to open EMMXXXX0 device\r
                mov     dx,OFFSET EMMDriverName\r
                mov     ax,0x3d00\r
@@ -139,8 +165,8 @@ gothandle:
 #ifdef __BORLANDC__\r
        __asm {\r
 #endif\r
-       //CPURegs.x.bx = CPURegs.x.ax;\r
-       //CPURegs.x.ax = 0x4400;\r
+       //_BX = _AX;\r
+       //_AX = 0x4400;\r
        //geninterrupt(0x21);                   // get device info\r
                mov     bx,ax\r
                mov     ax,0x4400\r
@@ -159,43 +185,43 @@ gotinfo:
 #endif\r
        if(emmcfems!=0) goto error;\r
        __asm and       dx,0x80\r
-       if (!CPURegs.x.dx)\r
+       if (!_DX)\r
                goto error;\r
 \r
-       CPURegs.x.ax = 0x4407;\r
+       _AX = 0x4407;\r
        geninterrupt(0x21);                     // get status\r
        __asm mov       emmcfems,1\r
        if(emmcfems!=0) goto error;\r
 \r
-       if (!CPURegs.h.al)\r
+       if (!_AL)\r
                goto error;\r
 \r
-       CPURegs.h.ah = 0x3e;\r
+       _AH = 0x3e;\r
        geninterrupt(0x21);                     // close handle\r
 \r
-       CPURegs.h.ah = EMS_STATUS;\r
+       _AH = EMS_STATUS;\r
        geninterrupt(EMS_INT);\r
-       if (CPURegs.h.ah)\r
+       if (_AH)\r
                goto error;                             // make sure EMS hardware is present\r
 \r
-       CPURegs.h.ah = EMS_VERSION;\r
+       _AH = EMS_VERSION;\r
        geninterrupt(EMS_INT);\r
-       if (CPURegs.h.ah || (CPURegs.h.al < 0x32))      // only work on EMS 3.2 or greater (silly, but...)\r
+       if (_AH || (_AL < 0x32))        // only work on EMS 3.2 or greater (silly, but...)\r
                goto error;\r
 \r
-       CPURegs.h.ah = EMS_GETFRAME;\r
+       _AH = EMS_GETFRAME;\r
        geninterrupt(EMS_INT);\r
-       if (CPURegs.h.ah)\r
+       if (_AH)\r
                goto error;                             // find the page frame address\r
-       gvar->pm.emm.EMSPageFrame = CPURegs.x.bx;\r
+       gvar->pm.emm.EMSPageFrame = _BX;\r
 \r
-       CPURegs.h.ah = EMS_GETPAGES;\r
+       _AH = EMS_GETPAGES;\r
        geninterrupt(EMS_INT);\r
-       if (CPURegs.h.ah)\r
+       if (_AH)\r
                goto error;\r
-       if (CPURegs.x.bx < 2)\r
+       if (_BX < 2)\r
                goto error;             // Require at least 2 pages (32k)\r
-       gvar->pm.emm.EMSAvail = CPURegs.x.bx;\r
+       gvar->pm.emm.EMSAvail = _BX;\r
 \r
        // Don't hog all available EMS\r
        size = gvar->pm.emm.EMSAvail * (long)EMSPageSize;\r
@@ -205,12 +231,12 @@ gotinfo:
                gvar->pm.emm.EMSAvail = size / EMSPageSize;\r
        }\r
 \r
-       CPURegs.h.ah = EMS_ALLOCPAGES;\r
-       CPURegs.x.bx = gvar->pm.emm.EMSAvail;\r
+       _AH = EMS_ALLOCPAGES;\r
+       _BX = gvar->pm.emm.EMSAvail;\r
        geninterrupt(EMS_INT);\r
-       if (CPURegs.h.ah)\r
+       if (_AH)\r
                goto error;\r
-       gvar->pm.emm.EMSHandle = CPURegs.x.dx;\r
+       gvar->pm.emm.EMSHandle = _DX;\r
 \r
        gvar->mmi.EMSmem += gvar->pm.emm.EMSAvail * (long)EMSPageSize;\r
 \r
@@ -230,14 +256,12 @@ error:
 void\r
 PML_ShutdownEMS(global_game_variables_t *gvar)\r
 {\r
-       union REGS CPURegs;\r
-\r
        if (gvar->pm.emm.EMSPresent)\r
        {\r
-                       CPURegs.h.ah=EMS_FREEPAGES;\r
-                       CPURegs.x.ax=gvar->pm.emm.EMSHandle;\r
+                       _AH=EMS_FREEPAGES;\r
+                       _AX=gvar->pm.emm.EMSHandle;\r
                        geninterrupt(EMS_INT);\r
-               if (CPURegs.h.ah)\r
+               if (_AH)\r
                {\r
                        Quit("PML_ShutdownEMS: Error freeing EMS\n");\r
                        //return;\r
@@ -260,15 +284,13 @@ PML_ShutdownEMS(global_game_variables_t *gvar)
 boolean\r
 PML_StartupXMS(global_game_variables_t *gvar)\r
 {\r
-       union REGS CPURegs;\r
-\r
        XMSD;\r
        gvar->pm.xmm.XMSPresent = false;                                        // Assume failure\r
        gvar->pm.xmm.XMSAvail = 0;\r
 \r
-       CPURegs.x.ax=0x4300;\r
+       _AX=0x4300;\r
        geninterrupt(XMS_INT);                                  // Check for presence of XMS driver\r
-       if (CPURegs.h.al != 0x80)\r
+       if (_AL != 0x80)\r
                goto error;\r
 \r
 \r
@@ -280,19 +302,19 @@ PML_StartupXMS(global_game_variables_t *gvar)
        }\r
 \r
        XMS_CALL(XMS_QUERYFREE, gvar);                  // Find out how much XMS is available\r
-       gvar->pm.xmm.XMSAvail = CPURegs.x.ax;\r
-       if (!CPURegs.x.ax)                              // AJR: bugfix 10/8/92\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
-       CPURegs.x.dx = gvar->pm.xmm.XMSAvail;\r
+       _DX = gvar->pm.xmm.XMSAvail;\r
        XMS_CALL(XMS_ALLOC, gvar);                              // And do the allocation\r
-       gvar->pm.xmm.XMSHandle = CPURegs.x.dx;\r
+       gvar->pm.xmm.XMSHandle = _DX;\r
 \r
-       if (!CPURegs.x.ax)                              // AJR: bugfix 10/8/92\r
+       if (!_AX)                               // AJR: bugfix 10/8/92\r
        {\r
                gvar->pm.xmm.XMSAvail = 0;\r
                goto error;\r
@@ -340,12 +362,12 @@ PML_XMSCopy(boolean toxms,byte far *addr,word xmspage,word length, global_game_v
        __asm {\r
                push si\r
        }\r
-       CPURegs.x.si = (word)&copy;\r
+       _SI = (word)&copy;\r
        XMS_CALL(XMS_MOVE, gvar);\r
        __asm {\r
                pop     si\r
        }\r
-       if (!CPURegs.x.ax)\r
+       if (!_AX)\r
        {\r
                Quit("PML_XMSCopy: Error on copy");\r
                //return;\r
@@ -386,9 +408,9 @@ PML_ShutdownXMS(global_game_variables_t *gvar)
        XMSD;\r
        if (gvar->pm.xmm.XMSPresent)\r
        {\r
-               CPURegs.x.dx = gvar->pm.xmm.XMSHandle;\r
+               _DX = gvar->pm.xmm.XMSHandle;\r
                XMS_CALL(XMS_FREE, gvar);\r
-               if (CPURegs.h.bl)\r
+               if (_BL)\r
                {\r
                        Quit("PML_ShutdownXMS: Error freeing XMS");\r
                        //return;\r