📄 memory.cpp
字号:
#include "Memory.h"
#include "mem.h"
#include "Dos.h"
#include "stdio.h"
#include "tools.h"
BOOL InitializeXMSMemory(PXMSINFO pXMSInfo)
{
if (pXMSInfo == 0) return FALSE;
memset((void*)pXMSInfo , 0 , sizeof(XMSINFO));
unsigned int RetVal = 0;
unsigned int XMSBlockSize , XMSBlockHnd;
unsigned long XMSBlockPos , XMMHandler;
long XMSLeft;
XMSBlockSize = XMSBlockHnd = XMSBlockPos = XMMHandler = 0;
XMSLeft = 0;
//#1 Check if the XMS Manager is installed
_asm{
MOV AX,4300H
INT 2FH
MOV RetVal , AX
}
if ((RetVal & 0X00FF) == 0x80) //Found XMS Manager(AL = 80)
{
//#2 get XMS Manager Handler Address
union REGS in , out;
struct SREGS sregs;
in.x.ax = 0x4310;
int86x(0x2F, &in, &out, &sregs);
XMMHandler = sregs.es;
XMMHandler = (XMMHandler << 16) + (out.x.bx);
//Query the largest Mem Block
_asm{
MOV AH,0008H
CALL DWORD PTR XMMHandler
MOV XMSBlockSize , AX
OR AX,AX
MOV RetVal , AX
}
if(RetVal == 0x00) // Not Find Largest Block
goto NOXMMMEM;
//Allocate the largest Mem Block
_asm{
MOV AH, 09H
MOV DX, XMSBlockSize
CALL DWORD PTR XMMHandler
MOV XMSBlockHnd , DX
MOV RetVal , AX
}
if(RetVal != 0x01) //Allocate Largest Block Error
goto NOXMMMEM;
//{Lock XMS block}
unsigned int High , Low;
High = Low = 0;
_asm{
MOV AH,0CH
MOV DX,XMSBlockHnd
CALL DWORD PTR XMMHandler
MOV Low , BX
MOV High, DX
MOV RetVal , AX
}
XMSBlockPos = High;
XMSBlockPos = (XMSBlockPos << 16) + Low;
if(RetVal != 0x01) //Lock Largest Block Error
goto NOXMMMEM;
NOXMMMEM:
// {Global enable A20}
_asm{
MOV AH,03H
CALL DWORD PTR XMMHandler
MOV RetVal , AX
}
if(RetVal == 0x01)
{
if(XMSBlockPos != 0)
XMSLeft = ((unsigned long)XMSBlockSize) << 10;
}
}
else //XMS manager not found, need to enable A20 & figure out XMS size ourselves
{
unsigned int Attempt;
unsigned char X;
Attempt = 0;
while (A20IsNotOn() && ( Attempt < 3 ))
{
//{First try PS2 method}
_asm{
CLI
IN AL,92H
OR AL,2
OUT 92H,AL
STI
}
delay( 10 ); //{wait a while before testing}
//{If it didn't work then try KBC method}
if (A20IsNotOn())
{
_asm {CLI};
outportb(0x64, 0xD0);
while(( inportb(0x64) & 1 ) == 0);
X = inportb(0x60);
outportb(0x64, 0xD1);
while(( inportb(0x64) & 2 ) != 0);
outportb(0x60, X | 0x02);
_asm {STI };
delay( 10 ); //{wait a while before testing}
}
Attempt ++;
}
XMSLeft = -2; //{No XMS}
}
XMMDONE:
if(A20IsNotOn())
XMSLeft = -1;
//copy all the information into the structure
pXMSInfo->XMMHandler = XMMHandler;
pXMSInfo->XMSBlockHnd = XMSBlockHnd;
pXMSInfo->XMSBlockLeft = XMSLeft;
pXMSInfo->XMSBlockPos = XMSBlockPos;
pXMSInfo->XMSBlockSize = XMSBlockSize;
return TRUE;
}
BOOL CloseXMSMemory(PXMSINFO pXMSInfo)
{
if(pXMSInfo == 0) return FALSE;
if(pXMSInfo->XMSBlockHnd != 0) //we have allocate the Memory in the XMS
{
unsigned long XMMHandler;
unsigned int XMSBlockHnd;
XMMHandler = pXMSInfo->XMMHandler;
XMSBlockHnd = pXMSInfo->XMSBlockHnd;
_asm{
MOV AH , 0DH
MOV DX , XMSBlockHnd
CALL DWORD PTR XMMHandler
MOV AH , 0AH
MOV DX , XMSBlockHnd
CALL DWORD PTR XMMHandler
MOV AH , 04H
CALL DWORD PTR XMMHandler
}
}
memset((void*)pXMSInfo , 0 , sizeof(XMSINFO));
return TRUE;
}
BOOL InitializeMem(PXMSINFO pXMSInfo)
{
if(pXMSInfo == NULL) return FALSE;
InitializeXMSMemory(pXMSInfo);
if(pXMSInfo->XMSBlockLeft == -1)
return FALSE;
return TRUE;
}
BOOL AllocateHiMem(PXMSINFO pXMSInfo)
{
BOOL Done = FALSE;
if (pXMSInfo->XMSBlockLeft == -2)
{
//Scan for available memory. NOTE: It is assumed that none of this memory
//is in use and that there is a gap between system memory & option ROM/RAM !!
pXMSInfo->XMSBlockPos = 0x100000;
pXMSInfo->XMSBlockLeft = 0;
do
{
Done = TRUE;
FOMemByte( pXMSInfo->XMSBlockPos, 0x55 );
if ( FIMemByte( pXMSInfo->XMSBlockPos ) == 0x55 )
{
FOMemByte( pXMSInfo->XMSBlockPos, 0xAA );
if ( FIMemByte( pXMSInfo->XMSBlockPos ) == 0xAA )
{
FOMemByte( pXMSInfo->XMSBlockPos + 4095, 0x55 );
if ( FIMemByte( pXMSInfo->XMSBlockPos + 4095 ) == 0x55 )
{
FOMemByte( pXMSInfo->XMSBlockPos + 4095, 0xAA );
if ( FIMemByte( pXMSInfo->XMSBlockPos + 4095 ) == 0xAA)
{
Done = FALSE;
pXMSInfo->XMSBlockLeft = pXMSInfo->XMSBlockLeft + 4096;
pXMSInfo->XMSBlockPos = pXMSInfo->XMSBlockPos + 4096;
}
}
}
}
} while( !Done );
pXMSInfo->XMSBlockPos = 0x100000;
}
return TRUE;
}
//End of the Implementation of Memory.Cpp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -