亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? id_mm.c

?? Wolf 3D official source code.
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
// NEWMM.C

/*
=============================================================================

		   ID software memory manager
		   --------------------------

Primary coder: John Carmack

RELIES ON
---------
Quit (char *error) function


WORK TO DO
----------
MM_SizePtr to change the size of a given pointer

Multiple purge levels utilized

EMS / XMS unmanaged routines

=============================================================================
*/

#include "ID_HEADS.H"
#pragma hdrstop

#pragma warn -pro
#pragma warn -use

/*
=============================================================================

							LOCAL INFO

=============================================================================
*/

#define LOCKBIT		0x80	// if set in attributes, block cannot be moved
#define PURGEBITS	3		// 0-3 level, 0= unpurgable, 3= purge first
#define PURGEMASK	0xfffc
#define BASEATTRIBUTES	0	// unlocked, non purgable

#define MAXUMBS		10

typedef struct mmblockstruct
{
	unsigned	start,length;
	unsigned	attributes;
	memptr		*useptr;	// pointer to the segment start
	struct mmblockstruct far *next;
} mmblocktype;


//#define GETNEWBLOCK {if(!(mmnew=mmfree))Quit("MM_GETNEWBLOCK: No free blocks!")\
//	;mmfree=mmfree->next;}

#define GETNEWBLOCK {if(!mmfree)MML_ClearBlock();mmnew=mmfree;mmfree=mmfree->next;}

#define FREEBLOCK(x) {*x->useptr=NULL;x->next=mmfree;mmfree=x;}

/*
=============================================================================

						 GLOBAL VARIABLES

=============================================================================
*/

mminfotype	mminfo;
memptr		bufferseg;
boolean		mmerror;

void		(* beforesort) (void);
void		(* aftersort) (void);

/*
=============================================================================

						 LOCAL VARIABLES

=============================================================================
*/

boolean		mmstarted;

void far	*farheap;
void		*nearheap;

mmblocktype	far mmblocks[MAXBLOCKS]
			,far *mmhead,far *mmfree,far *mmrover,far *mmnew;

boolean		bombonerror;

//unsigned	totalEMSpages,freeEMSpages,EMSpageframe,EMSpagesmapped,EMShandle;

void		(* XMSaddr) (void);		// far pointer to XMS driver

unsigned	numUMBs,UMBbase[MAXUMBS];

//==========================================================================

//
// local prototypes
//

boolean		MML_CheckForEMS (void);
void 		MML_ShutdownEMS (void);
void 		MM_MapEMS (void);
boolean 	MML_CheckForXMS (void);
void 		MML_ShutdownXMS (void);
void		MML_UseSpace (unsigned segstart, unsigned seglength);
void 		MML_ClearBlock (void);

//==========================================================================

/*
======================
=
= MML_CheckForXMS
=
= Check for XMM driver
=
=======================
*/

boolean MML_CheckForXMS (void)
{
	numUMBs = 0;

asm {
	mov	ax,0x4300
	int	0x2f				// query status of installed diver
	cmp	al,0x80
	je	good
	}

	return false;
good:
	return true;
}


/*
======================
=
= MML_SetupXMS
=
= Try to allocate all upper memory block
=
=======================
*/

void MML_SetupXMS (void)
{
	unsigned	base,size;

asm	{
	mov	ax,0x4310
	int	0x2f
	mov	[WORD PTR XMSaddr],bx
	mov	[WORD PTR XMSaddr+2],es		// function pointer to XMS driver
	}

getmemory:
asm	{
	mov	ah,XMS_ALLOCUMB
	mov	dx,0xffff					// try for largest block possible
	call	[DWORD PTR XMSaddr]
	or	ax,ax
	jnz	gotone

	cmp	bl,0xb0						// error: smaller UMB is available
	jne	done;

	mov	ah,XMS_ALLOCUMB
	call	[DWORD PTR XMSaddr]		// DX holds largest available UMB
	or	ax,ax
	jz	done						// another error...
	}

gotone:
asm	{
	mov	[base],bx
	mov	[size],dx
	}
	MML_UseSpace (base,size);
	mminfo.XMSmem += size*16;
	UMBbase[numUMBs] = base;
	numUMBs++;
	if (numUMBs < MAXUMBS)
		goto getmemory;

done:;
}


/*
======================
=
= MML_ShutdownXMS
=
======================
*/

void MML_ShutdownXMS (void)
{
	int	i;
	unsigned	base;

	for (i=0;i<numUMBs;i++)
	{
		base = UMBbase[i];

asm	mov	ah,XMS_FREEUMB
asm	mov	dx,[base]
asm	call	[DWORD PTR XMSaddr]
	}
}

//==========================================================================

/*
======================
=
= MML_UseSpace
=
= Marks a range of paragraphs as usable by the memory manager
= This is used to mark space for the near heap, far heap, ems page frame,
= and upper memory blocks
=
======================
*/

void MML_UseSpace (unsigned segstart, unsigned seglength)
{
	mmblocktype far *scan,far *last;
	unsigned	oldend;
	long		extra;

	scan = last = mmhead;
	mmrover = mmhead;		// reset rover to start of memory

//
// search for the block that contains the range of segments
//
	while (scan->start+scan->length < segstart)
	{
		last = scan;
		scan = scan->next;
	}

//
// take the given range out of the block
//
	oldend = scan->start + scan->length;
	extra = oldend - (segstart+seglength);
	if (extra < 0)
		Quit ("MML_UseSpace: Segment spans two blocks!");

	if (segstart == scan->start)
	{
		last->next = scan->next;			// unlink block
		FREEBLOCK(scan);
		scan = last;
	}
	else
		scan->length = segstart-scan->start;	// shorten block

	if (extra > 0)
	{
		GETNEWBLOCK;
		mmnew->useptr = NULL;

		mmnew->next = scan->next;
		scan->next = mmnew;
		mmnew->start = segstart+seglength;
		mmnew->length = extra;
		mmnew->attributes = LOCKBIT;
	}

}

//==========================================================================

/*
====================
=
= MML_ClearBlock
=
= We are out of blocks, so free a purgable block
=
====================
*/

void MML_ClearBlock (void)
{
	mmblocktype far *scan,far *last;

	scan = mmhead->next;

	while (scan)
	{
		if (!(scan->attributes&LOCKBIT) && (scan->attributes&PURGEBITS) )
		{
			MM_FreePtr(scan->useptr);
			return;
		}
		scan = scan->next;
	}

	Quit ("MM_ClearBlock: No purgable blocks!");
}


//==========================================================================

/*
===================
=
= MM_Startup
=
= Grabs all space from turbo with malloc/farmalloc
= Allocates bufferseg misc buffer
=
===================
*/

static	char *ParmStrings[] = {"noems","noxms",""};

void MM_Startup (void)
{
	int i;
	unsigned 	long length;
	void far 	*start;
	unsigned 	segstart,seglength,endfree;

	if (mmstarted)
		MM_Shutdown ();


	mmstarted = true;
	bombonerror = true;
//
// set up the linked list (everything in the free list;
//
	mmhead = NULL;
	mmfree = &mmblocks[0];
	for (i=0;i<MAXBLOCKS-1;i++)
		mmblocks[i].next = &mmblocks[i+1];
	mmblocks[i].next = NULL;

//
// locked block of all memory until we punch out free space
//
	GETNEWBLOCK;
	mmhead = mmnew;				// this will allways be the first node
	mmnew->start = 0;
	mmnew->length = 0xffff;
	mmnew->attributes = LOCKBIT;
	mmnew->next = NULL;
	mmrover = mmhead;


//
// get all available near conventional memory segments
//
	length=coreleft();
	start = (void far *)(nearheap = malloc(length));

	length -= 16-(FP_OFF(start)&15);
	length -= SAVENEARHEAP;
	seglength = length / 16;			// now in paragraphs
	segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
	MML_UseSpace (segstart,seglength);
	mminfo.nearheap = length;

//
// get all available far conventional memory segments
//
	length=farcoreleft();
	start = farheap = farmalloc(length);
	length -= 16-(FP_OFF(start)&15);
	length -= SAVEFARHEAP;
	seglength = length / 16;			// now in paragraphs
	segstart = FP_SEG(start)+(FP_OFF(start)+15)/16;
	MML_UseSpace (segstart,seglength);
	mminfo.farheap = length;
	mminfo.mainmem = mminfo.nearheap + mminfo.farheap;

//
// allocate the misc buffer
//
	mmrover = mmhead;		// start looking for space after low block

	MM_GetPtr (&bufferseg,BUFFERSIZE);
}

//==========================================================================

/*
====================
=
= MM_Shutdown
=
= Frees all conventional, EMS, and XMS allocated
=
====================
*/

void MM_Shutdown (void)
{
  if (!mmstarted)
	return;

  farfree (farheap);
  free (nearheap);
//  MML_ShutdownXMS ();
}

//==========================================================================

/*
====================
=
= MM_GetPtr
=
= Allocates an unlocked, unpurgable block
=
====================
*/

void MM_GetPtr (memptr *baseptr,unsigned long size)
{
	mmblocktype far *scan,far *lastscan,far *endscan
				,far *purge,far *next;
	int			search;
	unsigned	needed,startseg;

	needed = (size+15)/16;		// convert size from bytes to paragraphs

	GETNEWBLOCK;				// fill in start and next after a spot is found
	mmnew->length = needed;
	mmnew->useptr = baseptr;
	mmnew->attributes = BASEATTRIBUTES;

tryagain:
	for (search = 0; search<3; search++)
	{
	//
	// first search:	try to allocate right after the rover, then on up
	// second search: 	search from the head pointer up to the rover
	// third search:	compress memory, then scan from start
		if (search == 1 && mmrover == mmhead)
			search++;

		switch (search)
		{
		case 0:
			lastscan = mmrover;
			scan = mmrover->next;
			endscan = NULL;
			break;
		case 1:
			lastscan = mmhead;
			scan = mmhead->next;
			endscan = mmrover;
			break;
		case 2:
			MM_SortMem ();
			lastscan = mmhead;
			scan = mmhead->next;
			endscan = NULL;
			break;
		}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合九色综合欧美亚洲| 欧美在线一二三四区| 一区二区三区在线视频观看 | 色香蕉成人二区免费| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲欧洲日产国产综合网| 久久免费看少妇高潮| 91国偷自产一区二区开放时间 | 欧美少妇一区二区| 成人免费的视频| 麻豆精品视频在线观看免费| 亚洲乱码国产乱码精品精的特点| 国产亚洲综合性久久久影院| 欧美高清视频一二三区 | 极品少妇一区二区| 午夜视频在线观看一区二区 | 一区二区三区中文字幕| 国产情人综合久久777777| 日韩三级免费观看| 欧美久久一区二区| 在线观看国产91| 色综合咪咪久久| 色综合咪咪久久| 色综合中文字幕| 亚洲综合一区二区精品导航| 国产日韩欧美电影| 久久夜色精品国产欧美乱极品| 欧美一级在线免费| 69成人精品免费视频| 欧美伦理影视网| 欧美日韩亚洲丝袜制服| 在线免费亚洲电影| 在线免费视频一区二区| 91成人在线观看喷潮| 91久久精品日日躁夜夜躁欧美| 一本在线高清不卡dvd| 99久久99久久精品免费观看 | 精品视频全国免费看| 在线观看一区二区精品视频| 色婷婷久久综合| 欧美亚洲日本一区| 欧美日韩国产免费| 欧美一区二区网站| 欧美大白屁股肥臀xxxxxx| 日韩精品一区二区三区四区| 精品国产sm最大网站免费看| 久久久九九九九| 中文成人综合网| 亚洲欧美一区二区视频| 一区二区三区毛片| 亚欧色一区w666天堂| 日本亚洲最大的色成网站www| 日本视频一区二区三区| 九色|91porny| 成人午夜看片网址| 日本高清不卡视频| 欧美一区二区三区四区久久| 337p粉嫩大胆色噜噜噜噜亚洲| 久久久久国产一区二区三区四区 | 亚洲欧洲性图库| 亚洲一区二区三区四区不卡| 奇米777欧美一区二区| 国内久久婷婷综合| 99久久精品国产精品久久| 色综合久久久网| 日韩一区二区三区在线视频| 欧美电视剧在线观看完整版| 国产精品伦一区二区三级视频| 亚洲精品视频在线观看网站| 天堂蜜桃91精品| 看片的网站亚洲| 国产精品一区三区| 欧洲视频一区二区| 精品国产一区二区三区av性色| 国产精品久久久久久久久图文区 | k8久久久一区二区三区 | 亚洲欧美综合另类在线卡通| 亚洲大片一区二区三区| 国产精品夜夜爽| 欧美亚洲综合网| 国产日韩三级在线| 亚洲免费资源在线播放| 精品一区二区在线观看| 色狠狠桃花综合| 久久精品视频免费| 亚洲一区二区三区四区五区中文| 国产自产视频一区二区三区 | 亚洲精品在线网站| 一区二区三区av电影| 国产在线精品免费av| 欧美性色黄大片| 日本一区二区成人| 中文在线一区二区| 亚洲一区二区高清| 成人黄色软件下载| 欧美大片一区二区| 洋洋成人永久网站入口| 国产盗摄女厕一区二区三区| 在线电影国产精品| 亚洲精品日韩专区silk| 成人一区在线看| 日韩欧美国产三级| 亚洲成在线观看| 色婷婷综合久久久| 中文字幕一区二区三区在线不卡| 精品一区二区日韩| 51午夜精品国产| 亚洲二区在线视频| 99久久精品一区二区| 精品国产91亚洲一区二区三区婷婷 | 午夜欧美视频在线观看| 91麻豆免费在线观看| 久久日一线二线三线suv| 日本va欧美va精品发布| 欧美色视频一区| 亚洲激情第一区| 成人av在线网| 国产精品日产欧美久久久久| 亚洲线精品一区二区三区| av在线不卡免费看| 欧美高清在线视频| 成人丝袜高跟foot| 欧美激情资源网| 高清不卡在线观看| 欧美激情一区二区三区四区 | 99re这里只有精品首页| 国产欧美精品日韩区二区麻豆天美| 精品一区免费av| xnxx国产精品| 精品在线一区二区| 久久免费美女视频| 国产**成人网毛片九色| 国产日韩欧美麻豆| 成人av动漫网站| 亚洲欧美日韩一区二区三区在线观看| 成人av小说网| 亚洲精品国产无套在线观| 色哟哟国产精品| 亚洲福中文字幕伊人影院| 欧美美女一区二区在线观看| 五月婷婷综合网| 日韩一区二区精品葵司在线| 久久草av在线| 国产喷白浆一区二区三区| 成人网在线播放| 一区二区三区视频在线看| 欧美日韩一级视频| 久久国内精品自在自线400部| 欧美一级黄色片| 欧美性高清videossexo| 亚洲国产欧美日韩另类综合| 91精品在线观看入口| 精品一区二区三区蜜桃| 中文字幕精品—区二区四季| 91精品1区2区| 美女网站色91| 国产欧美日韩在线视频| 91久久香蕉国产日韩欧美9色| 亚洲va欧美va天堂v国产综合| 欧美xingq一区二区| 国产不卡视频在线播放| 亚洲精品国产品国语在线app| 欧美另类变人与禽xxxxx| 国产综合色精品一区二区三区| 国产精品成人一区二区艾草 | 日韩美女视频一区| 欧美日韩视频一区二区| 黄页视频在线91| 久久久www成人免费无遮挡大片| 99精品欧美一区二区三区小说| 亚洲国产精品人人做人人爽| 日韩精品一区国产麻豆| 99国产精品久| 久久精品国产网站| 亚洲欧美二区三区| 欧美大片在线观看一区| 色综合网色综合| 久久99国产乱子伦精品免费| 亚洲男人天堂一区| www国产亚洲精品久久麻豆| 在线观看视频一区| 国产成人在线色| 无码av免费一区二区三区试看| 国产欧美一区二区精品性色| 欧美系列亚洲系列| 成人国产精品免费网站| 免费日本视频一区| 国产精品麻豆视频| 日韩一区二区精品| 日本黄色一区二区| 国产91露脸合集magnet| 蜜臀久久久久久久| 亚洲黄色性网站| 欧美激情一区二区| 欧美r级在线观看| 欧美日韩午夜在线| 色综合久久66| 成人免费看的视频| 韩国成人精品a∨在线观看| 午夜精品福利一区二区三区蜜桃|