\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
//\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
PML_StartupEMS(global_game_variables_t *gvar)\r
{\r
boolean emmcfems;\r
- union REGS CPURegs;\r
\r
int i;\r
long size;\r
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
#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
#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
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
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
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
}\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
__asm {\r
push si\r
}\r
- CPURegs.x.si = (word)©\r
+ _SI = (word)©\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
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