⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memory.cpp

📁 PC燒錄BIOS的源程序
💻 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 + -