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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? id_ca.c

?? Wolf 3D official source code.
?? C
?? 第 1 頁 / 共 3 頁
字號:
// ID_CA.C

// this has been customized for WOLF

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

Id Software Caching Manager
---------------------------

Must be started BEFORE the memory manager, because it needs to get the headers
loaded into the data segment

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

#include "ID_HEADS.H"
#pragma hdrstop

#pragma warn -pro
#pragma warn -use

#define THREEBYTEGRSTARTS

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

						 LOCAL CONSTANTS

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

typedef struct
{
  unsigned bit0,bit1;	// 0-255 is a character, > is a pointer to a node
} huffnode;


typedef struct
{
	unsigned	RLEWtag;
	long		headeroffsets[100];
	byte		tileinfo[];
} mapfiletype;


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

						 GLOBAL VARIABLES

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

byte 		_seg	*tinf;
int			mapon;

unsigned	_seg	*mapsegs[MAPPLANES];
maptype		_seg	*mapheaderseg[NUMMAPS];
byte		_seg	*audiosegs[NUMSNDCHUNKS];
void		_seg	*grsegs[NUMCHUNKS];

byte		far	grneeded[NUMCHUNKS];
byte		ca_levelbit,ca_levelnum;

int			profilehandle,debughandle;

char		audioname[13]="AUDIO.";

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

						 LOCAL VARIABLES

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

extern	long	far	CGAhead;
extern	long	far	EGAhead;
extern	byte	CGAdict;
extern	byte	EGAdict;
extern	byte	far	maphead;
extern	byte	mapdict;
extern	byte	far	audiohead;
extern	byte	audiodict;


char extension[5],	// Need a string, not constant to change cache files
     gheadname[10]=GREXT"HEAD.",
     gfilename[10]=GREXT"GRAPH.",
     gdictname[10]=GREXT"DICT.",
     mheadname[10]="MAPHEAD.",
     mfilename[10]="MAPTEMP.",
     aheadname[10]="AUDIOHED.",
     afilename[10]="AUDIOT.";

void CA_CannotOpen(char *string);

long		_seg *grstarts;	// array of offsets in egagraph, -1 for sparse
long		_seg *audiostarts;	// array of offsets in audio / audiot

#ifdef GRHEADERLINKED
huffnode	*grhuffman;
#else
huffnode	grhuffman[255];
#endif

#ifdef AUDIOHEADERLINKED
huffnode	*audiohuffman;
#else
huffnode	audiohuffman[255];
#endif


int			grhandle;		// handle to EGAGRAPH
int			maphandle;		// handle to MAPTEMP / GAMEMAPS
int			audiohandle;	// handle to AUDIOT / AUDIO

long		chunkcomplen,chunkexplen;

SDMode		oldsoundmode;



void	CAL_CarmackExpand (unsigned far *source, unsigned far *dest,
		unsigned length);


#ifdef THREEBYTEGRSTARTS
#define FILEPOSSIZE	3
//#define	GRFILEPOS(c) (*(long far *)(((byte far *)grstarts)+(c)*3)&0xffffff)
long GRFILEPOS(int c)
{
	long value;
	int	offset;

	offset = c*3;

	value = *(long far *)(((byte far *)grstarts)+offset);

	value &= 0x00ffffffl;

	if (value == 0xffffffl)
		value = -1;

	return value;
};
#else
#define FILEPOSSIZE	4
#define	GRFILEPOS(c) (grstarts[c])
#endif

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

					   LOW LEVEL ROUTINES

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

/*
============================
=
= CA_OpenDebug / CA_CloseDebug
=
= Opens a binary file with the handle "debughandle"
=
============================
*/

void CA_OpenDebug (void)
{
	unlink ("DEBUG.TXT");
	debughandle = open("DEBUG.TXT", O_CREAT | O_WRONLY | O_TEXT);
}

void CA_CloseDebug (void)
{
	close (debughandle);
}



/*
============================
=
= CAL_GetGrChunkLength
=
= Gets the length of an explicit length chunk (not tiles)
= The file pointer is positioned so the compressed data can be read in next.
=
============================
*/

void CAL_GetGrChunkLength (int chunk)
{
	lseek(grhandle,GRFILEPOS(chunk),SEEK_SET);
	read(grhandle,&chunkexplen,sizeof(chunkexplen));
	chunkcomplen = GRFILEPOS(chunk+1)-GRFILEPOS(chunk)-4;
}


/*
==========================
=
= CA_FarRead
=
= Read from a file to a far pointer
=
==========================
*/

boolean CA_FarRead (int handle, byte far *dest, long length)
{
	if (length>0xffffl)
		Quit ("CA_FarRead doesn't support 64K reads yet!");

asm		push	ds
asm		mov	bx,[handle]
asm		mov	cx,[WORD PTR length]
asm		mov	dx,[WORD PTR dest]
asm		mov	ds,[WORD PTR dest+2]
asm		mov	ah,0x3f				// READ w/handle
asm		int	21h
asm		pop	ds
asm		jnc	good
	errno = _AX;
	return	false;
good:
asm		cmp	ax,[WORD PTR length]
asm		je	done
	errno = EINVFMT;			// user manager knows this is bad read
	return	false;
done:
	return	true;
}


/*
==========================
=
= CA_SegWrite
=
= Write from a file to a far pointer
=
==========================
*/

boolean CA_FarWrite (int handle, byte far *source, long length)
{
	if (length>0xffffl)
		Quit ("CA_FarWrite doesn't support 64K reads yet!");

asm		push	ds
asm		mov	bx,[handle]
asm		mov	cx,[WORD PTR length]
asm		mov	dx,[WORD PTR source]
asm		mov	ds,[WORD PTR source+2]
asm		mov	ah,0x40			// WRITE w/handle
asm		int	21h
asm		pop	ds
asm		jnc	good
	errno = _AX;
	return	false;
good:
asm		cmp	ax,[WORD PTR length]
asm		je	done
	errno = ENOMEM;				// user manager knows this is bad write
	return	false;

done:
	return	true;
}


/*
==========================
=
= CA_ReadFile
=
= Reads a file into an allready allocated buffer
=
==========================
*/

boolean CA_ReadFile (char *filename, memptr *ptr)
{
	int handle;
	long size;

	if ((handle = open(filename,O_RDONLY | O_BINARY, S_IREAD)) == -1)
		return false;

	size = filelength (handle);
	if (!CA_FarRead (handle,*ptr,size))
	{
		close (handle);
		return false;
	}
	close (handle);
	return true;
}


/*
==========================
=
= CA_WriteFile
=
= Writes a file from a memory buffer
=
==========================
*/

boolean CA_WriteFile (char *filename, void far *ptr, long length)
{
	int handle;
	long size;

	handle = open(filename,O_CREAT | O_BINARY | O_WRONLY,
				S_IREAD | S_IWRITE | S_IFREG);

	if (handle == -1)
		return false;

	if (!CA_FarWrite (handle,ptr,length))
	{
		close (handle);
		return false;
	}
	close (handle);
	return true;
}



/*
==========================
=
= CA_LoadFile
=
= Allocate space for and load a file
=
==========================
*/

boolean CA_LoadFile (char *filename, memptr *ptr)
{
	int handle;
	long size;

	if ((handle = open(filename,O_RDONLY | O_BINARY, S_IREAD)) == -1)
		return false;

	size = filelength (handle);
	MM_GetPtr (ptr,size);
	if (!CA_FarRead (handle,*ptr,size))
	{
		close (handle);
		return false;
	}
	close (handle);
	return true;
}

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

		COMPRESSION routines, see JHUFF.C for more

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



/*
===============
=
= CAL_OptimizeNodes
=
= Goes through a huffman table and changes the 256-511 node numbers to the
= actular address of the node.  Must be called before CAL_HuffExpand
=
===============
*/

void CAL_OptimizeNodes (huffnode *table)
{
  huffnode *node;
  int i;

  node = table;

  for (i=0;i<255;i++)
  {
	if (node->bit0 >= 256)
	  node->bit0 = (unsigned)(table+(node->bit0-256));
	if (node->bit1 >= 256)
	  node->bit1 = (unsigned)(table+(node->bit1-256));
	node++;
  }
}



/*
======================
=
= CAL_HuffExpand
=
= Length is the length of the EXPANDED data
= If screenhack, the data is decompressed in four planes directly
= to the screen
=
======================
*/

void CAL_HuffExpand (byte huge *source, byte huge *dest,
  long length,huffnode *hufftable, boolean screenhack)
{
//  unsigned bit,byte,node,code;
  unsigned sourceseg,sourceoff,destseg,destoff,endoff;
  huffnode *headptr;
  byte		mapmask;
//  huffnode *nodeon;

  headptr = hufftable+254;	// head node is allways node 254

  source++;	// normalize
  source--;
  dest++;
  dest--;

  if (screenhack)
  {
	mapmask = 1;
asm	mov	dx,SC_INDEX
asm	mov	ax,SC_MAPMASK + 256
asm	out	dx,ax
	length >>= 2;
  }

  sourceseg = FP_SEG(source);
  sourceoff = FP_OFF(source);
  destseg = FP_SEG(dest);
  destoff = FP_OFF(dest);
  endoff = destoff+length;

//
// ds:si source
// es:di dest
// ss:bx node pointer
//

	if (length <0xfff0)
	{

//--------------------------
// expand less than 64k of data
//--------------------------

asm mov	bx,[headptr]

asm	mov	si,[sourceoff]
asm	mov	di,[destoff]
asm	mov	es,[destseg]
asm	mov	ds,[sourceseg]
asm	mov	ax,[endoff]

asm	mov	ch,[si]				// load first byte
asm	inc	si
asm	mov	cl,1

expandshort:
asm	test	ch,cl			// bit set?
asm	jnz	bit1short
asm	mov	dx,[ss:bx]			// take bit0 path from node
asm	shl	cl,1				// advance to next bit position
asm	jc	newbyteshort
asm	jnc	sourceupshort

bit1short:
asm	mov	dx,[ss:bx+2]		// take bit1 path
asm	shl	cl,1				// advance to next bit position
asm	jnc	sourceupshort

newbyteshort:
asm	mov	ch,[si]				// load next byte
asm	inc	si
asm	mov	cl,1				// back to first bit

sourceupshort:
asm	or	dh,dh				// if dx<256 its a byte, else move node
asm	jz	storebyteshort
asm	mov	bx,dx				// next node = (huffnode *)code
asm	jmp	expandshort

storebyteshort:
asm	mov	[es:di],dl
asm	inc	di					// write a decopmpressed byte out
asm	mov	bx,[headptr]		// back to the head node for next bit

asm	cmp	di,ax				// done?
asm	jne	expandshort

//
// perform screenhack if needed
//
asm	test	[screenhack],1
asm	jz	notscreen
asm	shl	[mapmask],1
asm	mov	ah,[mapmask]
asm	cmp	ah,16
asm	je	notscreen			// all four planes done
asm	mov	dx,SC_INDEX
asm	mov	al,SC_MAPMASK
asm	out	dx,ax
asm	mov	di,[destoff]
asm	mov	ax,[endoff]
asm	jmp	expandshort

notscreen:;
	}
	else
	{

//--------------------------
// expand more than 64k of data
//--------------------------

  length--;

asm mov	bx,[headptr]
asm	mov	cl,1

asm	mov	si,[sourceoff]
asm	mov	di,[destoff]
asm	mov	es,[destseg]
asm	mov	ds,[sourceseg]

asm	lodsb			// load first byte

expand:
asm	test	al,cl		// bit set?
asm	jnz	bit1
asm	mov	dx,[ss:bx]	// take bit0 path from node
asm	jmp	gotcode
bit1:
asm	mov	dx,[ss:bx+2]	// take bit1 path

gotcode:
asm	shl	cl,1		// advance to next bit position
asm	jnc	sourceup
asm	lodsb
asm	cmp	si,0x10		// normalize ds:si
asm  	jb	sinorm
asm	mov	cx,ds
asm	inc	cx
asm	mov	ds,cx
asm	xor	si,si
sinorm:
asm	mov	cl,1		// back to first bit

sourceup:
asm	or	dh,dh		// if dx<256 its a byte, else move node
asm	jz	storebyte
asm	mov	bx,dx		// next node = (huffnode *)code
asm	jmp	expand

storebyte:
asm	mov	[es:di],dl
asm	inc	di		// write a decopmpressed byte out
asm	mov	bx,[headptr]	// back to the head node for next bit

asm	cmp	di,0x10		// normalize es:di
asm  	jb	dinorm
asm	mov	dx,es
asm	inc	dx
asm	mov	es,dx
asm	xor	di,di
dinorm:

asm	sub	[WORD PTR ss:length],1
asm	jnc	expand
asm  	dec	[WORD PTR ss:length+2]
asm	jns	expand		// when length = ffff ffff, done

	}

asm	mov	ax,ss

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一区国产| av在线不卡电影| 欧美综合久久久| 亚洲欧洲精品一区二区精品久久久| 日本人妖一区二区| 亚洲成人一二三| 五月婷婷激情综合| 欧美色图激情小说| 亚洲午夜精品一区二区三区他趣| 欧美亚洲愉拍一区二区| 日韩在线一区二区三区| 日韩网站在线看片你懂的| 日韩在线播放一区二区| 日韩精品一区二区三区老鸭窝| 韩国精品一区二区| 国产精品免费观看视频| 欧美日韩综合不卡| 精品中文av资源站在线观看| 国产精品人妖ts系列视频| 色av成人天堂桃色av| 卡一卡二国产精品| 亚洲欧洲日韩女同| 日韩视频在线永久播放| 日韩av中文字幕一区二区三区 | 亚洲色大成网站www久久九九| 91福利在线观看| 国产91富婆露脸刺激对白| 亚洲一区二区三区精品在线| 国产亚洲欧美日韩在线一区| 色嗨嗨av一区二区三区| 国产高清成人在线| 丝袜亚洲精品中文字幕一区| 中文字幕精品在线不卡| 88在线观看91蜜桃国自产| 国产91精品一区二区麻豆亚洲| 亚洲一区二三区| 18成人在线视频| 国产色产综合产在线视频| 91精品国产aⅴ一区二区| 91香蕉视频在线| 99视频精品全部免费在线| 久久99精品久久久久婷婷| 五月婷婷综合网| 亚洲最色的网站| 一区二区在线观看不卡| 国产精品久久久久久福利一牛影视| 91精品久久久久久久99蜜桃| 欧美午夜在线一二页| 色综合 综合色| 欧美中文字幕一二三区视频| 99久久99久久久精品齐齐| 成人国产精品免费观看动漫| 国产黄色成人av| 本田岬高潮一区二区三区| 亚洲成人资源在线| 一区二区三区欧美日| 一区二区三区中文在线观看| 午夜精品久久久久久久| 中文字幕精品一区二区三区精品| 91精品欧美久久久久久动漫| 91精品国产综合久久精品| 欧美美女直播网站| 日韩欧美激情四射| 日韩三级精品电影久久久| 欧美成人猛片aaaaaaa| 精品久久久久久久久久久久包黑料 | 欧洲色大大久久| 国产成人精品免费在线| 欧美日韩二区三区| 欧美一区午夜视频在线观看| 精品剧情在线观看| 久久久午夜电影| 国产精品国产三级国产普通话99 | 国产一区 二区 三区一级| 成人免费毛片高清视频| 欧美日韩一本到| www一区二区| 香港成人在线视频| 成人网男人的天堂| 91精品国产高清一区二区三区 | 欧美日韩精品一区二区三区蜜桃| 欧美zozozo| 亚洲成人动漫精品| 99久久精品免费观看| 日韩视频免费直播| 一区二区三区美女视频| 国产麻豆91精品| 日韩一区二区免费视频| 亚洲精品视频在线看| 成人黄色国产精品网站大全在线免费观看 | 5月丁香婷婷综合| 一区二区三区在线影院| 成人一区在线观看| 久久久久久久久久久久久夜| 美国欧美日韩国产在线播放| 欧美久久一二三四区| 一区二区三区在线免费视频| 国产精品99久久久久久久女警 | 欧美高清dvd| 香蕉久久夜色精品国产使用方法 | 97se亚洲国产综合自在线不卡| 久久精品无码一区二区三区| 欧美aaaaaa午夜精品| 5月丁香婷婷综合| 免费av网站大全久久| 欧美一级欧美三级在线观看| 青娱乐精品在线视频| 欧美一区二区三区小说| 美女网站在线免费欧美精品| 欧美日韩综合不卡| 天天av天天翘天天综合网色鬼国产 | 国产欧美视频在线观看| 国产精品亚洲专一区二区三区| 精品国产一二三| 99免费精品视频| 五月综合激情婷婷六月色窝| 久久综合精品国产一区二区三区| 岛国av在线一区| 亚洲精品国产a久久久久久| 欧美天堂亚洲电影院在线播放| 日韩不卡免费视频| 久久精品亚洲乱码伦伦中文 | 亚洲人妖av一区二区| 色呦呦一区二区三区| 五月天一区二区| 国产午夜精品理论片a级大结局| fc2成人免费人成在线观看播放 | 久久蜜桃av一区二区天堂| 天堂va蜜桃一区二区三区| 美女一区二区三区| 精品国产亚洲在线| 国产乱妇无码大片在线观看| 国产成人亚洲综合a∨婷婷 | 91久久精品午夜一区二区| 日本vs亚洲vs韩国一区三区二区| 亚洲乱码日产精品bd| 欧美不卡一二三| 色av成人天堂桃色av| 国产91精品一区二区麻豆亚洲| 午夜a成v人精品| 亚洲国产精品成人久久综合一区| 99国产欧美另类久久久精品| 久久91精品国产91久久小草| 亚洲123区在线观看| 国产精品成人一区二区艾草| 在线不卡的av| 欧美日韩高清一区二区| 国产精品白丝jk黑袜喷水| 精品伊人久久久久7777人| 五月天中文字幕一区二区| 一区二区三区四区乱视频| 国产精品美女视频| 亚洲国产精品ⅴa在线观看| 精品少妇一区二区三区| 538在线一区二区精品国产| 欧美日韩精品高清| 欧美一区二区三区四区视频| 91精品欧美一区二区三区综合在| 欧洲生活片亚洲生活在线观看| 97精品国产97久久久久久久久久久久 | 成人激情校园春色| 成人黄色在线网站| 91麻豆精品在线观看| 在线视频你懂得一区| 欧美日韩综合色| 日韩欧美一区在线观看| 精品区一区二区| 欧美国产日韩一二三区| 亚洲欧美日韩系列| 国产精品久久久久久久久晋中| 亚洲男人的天堂在线观看| 专区另类欧美日韩| 日产精品久久久久久久性色| 国产尤物一区二区| 色天使色偷偷av一区二区| 欧美肥大bbwbbw高潮| 国产日产欧美一区二区视频| 中文字幕中文字幕在线一区 | 在线观看免费视频综合| 91.com视频| 国产精品久久久久久久久动漫| 亚洲国产乱码最新视频| 国产**成人网毛片九色| 97久久精品人人爽人人爽蜜臀| 亚洲激情网站免费观看| 老色鬼精品视频在线观看播放| 韩日av一区二区| 日韩一区二区三| 亚洲在线成人精品| 9i看片成人免费高清| 欧美变态tickling挠脚心| 亚洲国产精品影院| proumb性欧美在线观看| 日韩免费在线观看| 午夜久久久影院| 欧美亚洲国产一区在线观看网站| 久久综合中文字幕| 久久精品国产网站| 日韩精品中文字幕一区| 日韩精品成人一区二区在线|