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

📄 bldrv.c

📁 用来将电脑连接到电视荧幕, 并以15Khz输出的源码, 请只用在支援15Khz的荧幕上, 以免伤害荧幕
💻 C
📖 第 1 页 / 共 2 页
字号:
	d1 = d1 | d0;
	SetSeqReg(0x01, d1);
}


static void SetBladeVClock(int Num, int DeN, int PS, int PCDiv)
{
	BYTE d0;
	BYTE d1;
	BYTE d2;

	SetPixelClockDivider(PCDiv);
	SetSeqDivider(1);

	/* N is all 8bits */
	d1 = Num;
	/* M is first 6bits, with K last 2bits */
	d2 = (DeN & 0x3F) | (PS << 6);

	SetSeqReg(ClockLow, d1);
	SetSeqReg(ClockHigh, d2);

	d0 = (_inb(0x3CC) & 0xF3) | 0x08;
	_outb(0x3C2, d0);							// use vclk2
}

static void SetPixelClockDivider(int d0)
{
//
//	d0 = PixelClockDiv * 10
//

	BYTE d1;
	BYTE d2;

	switch(d0){
		case 10:		 // div 1
			d1 = 0;
			break;
		case 15:		 // div 1.5
			d1 = 3;
			break;
		case 20:		 // div 2
			d1 = 1;
			break;
		case 40:		 // div 4
			d1 = 2;
			break;
		default:
			d1 = 0;
	}

	d1 = d1 << 1;
	d1 = d1 &  0x06;
	d2 = GetSeqReg(NewMode2);
	d2 = d2 & ~0x06;
	d2 = d2 | d1;
	SetSeqReg(NewMode2, d2);
}



static void NewMode(void)
{
//	  BYTE d0;

	GetSeqReg(OldNewModeControl);
//	  d0 = GetSeqReg(OldNewModeControl);
//	  logerror("Chip Version %2Xh\n", d0);
}

void SetGfxcReg(BYTE __idx, BYTE data)
{
	_outb(0x3ce, __idx);
	_outb(0x3cf, data);
}

BYTE GetGfxcReg(BYTE __idx)
{
	BYTE d0;

	_outb(0x3ce, __idx);
	d0 = _inb(0x3cf);
	return d0;
}



static void SetHSyncSkewInMisc(int flag)
{
	DWORD d0;

	if(flag == 0){
		flag = 1;
	}else{
		flag = 0;		// no skew
	}
	d0 = GetGfxcReg(MiscInternalControlReg);
	d0 = BitMov(d0, 5, flag, 0);
	SetGfxcReg(MiscInternalControlReg, (BYTE)d0);
}


static int GetDoubleLogicalLineWidth(void)
{
	DWORD d0;

	d0 = GetGfxcReg(MiscInternalControlReg);
	d0 = d0 >> 2;
	d0 = d0 & 0x01;

	return (int)d0;
}

static void SetDoubleLogicalLineWidth(int flag)
{
	DWORD d0;

	if(flag != 0) flag = 1;
	d0 = GetGfxcReg(MiscInternalControlReg);
	d0 = BitMov(d0, 2, flag, 0);
	SetGfxcReg(MiscInternalControlReg, (BYTE)d0);
}




static int DetectBlade3D(void)
{
	BYTE d0;
	int result;

	d0 = GetSeqReg(0x09);
//	  logerror("Seq index 09h %2X\n", d0);
	d0 = d0 & 0xF8;
	if(d0 == 0x38){
		result = 1;
	}else{
		result = 0;
	}

	return result;
}


static int DetectBladeXP(void)
{
	BYTE d0;
	int result;

	d0 = GetSeqReg(0x09);
//	  logerror("Seq index 09h %2X\n", d0);
	if(d0 == 0x63){
		result = 1;
	}else{
		result = 0;
	}

	return result;
}




void SetBladeVGA(int x, int y, int center_x, int center_y, int hsyncdelay, int hdispdelay)
{
	CRTCPARAM cp;
	int Num;
	int DeN;
	int PS;
	int PCDiv;

	GetMode15KHz(&cp, x, y);
	AdjustCenter(&cp, center_x, center_y);

	cp.HBStart = cp.HDisp;
	cp.HBEnd   = cp.HSEnd;
	cp.VBStart = cp.VDisp;
	cp.VBEnd   = cp.VSEnd;

	cp.dotclockHz = GetBladeVclkParam(cp.dotclockHz, &Num, &DeN, &PS, &PCDiv);

	NewMode();
	UnprotectRegisters();

	DisableGenerateSignal();
	SetInterlaceStatus(0);
	SetGenericVGARegister(&cp, hsyncdelay, hdispdelay);
	SetBladeExtRegister(&cp);
	SetHSyncSkewInMisc(0);
	SetBladeVClock(Num, DeN, PS, PCDiv);
	SetTextWidth(8);
	EnableGenerateSignal();
}



void SetBladeText40x25(int center_x, int center_y, int hsyncdelay, int hdispdelay)
{
	CRTCPARAM cp;
	int Num;
	int DeN;
	int PS;
	int PCDiv;

	GetMode15KHz(&cp, 320, 200); /* 40x25 */
	AdjustCenter(&cp, center_x + 24, center_y);

	cp.HBStart = cp.HDisp;
	cp.HBEnd   = cp.HSEnd;
	cp.VBStart = cp.VDisp;
	cp.VBEnd   = cp.VSEnd;

	cp.dotclockHz = GetBladeVclkParam(cp.dotclockHz, &Num, &DeN, &PS, &PCDiv);

	NewMode();
	UnprotectRegisters();

	DisableGenerateSignal();
	SetInterlaceStatus(0);
	SetGenericVGARegister(&cp, hsyncdelay, hdispdelay);
	SetBladeExtRegister(&cp);
	SetHSyncSkewInMisc(0);
	SetTextHeight(8);
	SetTextWidth(8);
	SetBladeVClock(Num, DeN, PS, PCDiv);
	EnableGenerateSignal();
}




/* can restore dosbox <-> full screen */
void SetBladeText80x25(int center_x, int center_y, int h_sync_delay, int h_disp_delay)
{
	CRTCPARAM cp;
	int Num;
	int DeN;
	int PS;
	int PCDiv;
	long min14;
	long max14;

	GetMode15KHz(&cp, 640, 200);	 /* 80x25 */
	AdjustCenter(&cp, center_x + 24, center_y);

	cp.HBStart = cp.HDisp;
	cp.HBEnd   = cp.HSEnd;
	cp.VBStart = cp.VDisp;
	cp.VBEnd   = cp.VSEnd;

	cp.dotclockHz = GetBladeVclkParam(cp.dotclockHz, &Num, &DeN, &PS, &PCDiv);

	NewMode();
	UnprotectRegisters();

	DisableGenerateSignal();
	SetGenericVGARegister(&cp, h_sync_delay, h_disp_delay);
	SetHSyncSkewInMisc(0);
	SetDoubleScan(cp.doublescan);
	SetHVPolarity(cp.hpolarity, cp.vpolarity);
	SetTextHeight(8);
	SetTextWidth(8);

	min14 = 14000000;		/* 14.0MHz */
	max14 = 14300000;		/* 14.3MHz */
	if(min14 <= cp.dotclockHz && cp.dotclockHz <= max14){
		Set14MHz(); 		/* set 14.161MHz */
	}else{
		SetBladeVClock(Num, DeN, PS, PCDiv);
	}
	EnableGenerateSignal();
}

void SetBladeModeX(int x, int y, int center_x, int center_y, int hsyncdelay, int hdispdelay)
{
	CRTCPARAM cp;
	int Num;
	int DeN;
	int PS;
	int PCDiv;

	if(GetMode15KHz(&cp, x, y) == 0)
			GetMode15KHz(&cp, 640, 200);

	AdjustCenter(&cp, center_x, center_y);

	cp.HBStart = cp.HDisp;
	cp.HBEnd   = cp.HSEnd;
	cp.VBStart = cp.VDisp;
	cp.VBEnd   = cp.VSEnd;

	cp.dotclockHz = GetBladeVclkParam(cp.dotclockHz, &Num, &DeN, &PS, &PCDiv);

	NewMode();
	UnprotectRegisters();

	DisableGenerateSignal();
	SetInterlaceStatus(0);
	SetGenericVGARegister(&cp, hsyncdelay, hdispdelay);
	SetBladeExtRegister(&cp);
	SetHSyncSkewInMisc(0);
	SetBladeVClock(Num, DeN, PS, PCDiv);
	SetTextWidth(8);
	EnableGenerateSignal();

	SetTextHeight(1);
}


/********************************************************************/


int  Detect15KHz(void)
{
	return DetectBlade();
}

int  SetSVGA(int xres, int yres, int center_x, int center_y, int hsyncdelay, int hdispdelay)
{
	return SetBlade(xres, yres, center_x, center_y, hsyncdelay, hdispdelay);
}

void SetVGA(int x, int y, int center_x, int center_y, int hsyncdelay, int hdispdelay)
{
	SetBladeVGA(x, y, center_x, center_y, hsyncdelay, hdispdelay);
}

void SetVGAText40x25(int center_x, int center_y, int hsyncdelay, int hdispdelay)
{
	SetBladeText40x25(center_x, center_y, hsyncdelay, hdispdelay);
}

void SetVGAText80x25(int center_x, int center_y, int hsyncdelay, int hdispdelay)
{
	SetInterlaceStatus(0);
	SetBladeText80x25(center_x, center_y, hsyncdelay, hdispdelay);
}

void SetModeX(int center_x, int center_y, int hsyncdelay, int hdispdelay)
{
	int x;
	int y;
	Copy_VGACRTC_to_VIDEOMODE(&x, &y);
	SetBladeModeX(x, y, center_x, center_y, hsyncdelay, hdispdelay);
}

WORD  AdjustBytesPerLine(WORD bytesperline)
{
	return AdjustBladeBytesPerLine(bytesperline);
}

WORD  GetBytesPerLine(void)
{
	return GetBladeBytesPerLine();
}

void  SetBytesPerLine(WORD bytesperline)
{
	SetBladeBytesPerLine(bytesperline);
}


DWORD GetScreenStartAddress(void)
{
	return GetBladeScreenStartAddress();
}

void  SetScreenStartAddress(DWORD address)
{
	SetBladeScreenStartAddress(address);
}

WORD  GetMaxBytesPerLine(void)
{
	return GetBladeMaxBytesPerLine();
}

char NotFoundBlade[] = "No Trident Blade 3D compatible found!\n";

char* NotFoundMessage(void)
{
	return NotFoundBlade;
}

WORD GetActualVesaMode(int xres, int yres, int bpp)
{
	int mode;

	mode = _640x480x8;
	if(xres <= 640 && yres <= 480){
		if(bpp == 8){
			mode = _640x480x8;
		}else if(bpp == 15){
			mode = _640x480x15;
		}else if(bpp == 16){
			mode = _640x480x16;
		}else if(bpp == 32){
			mode = _640x480_TC;
		}
	}else if(xres <= 1024 && yres <= 768){
		if(bpp == 8){
			mode = _1024x768x8;
		}else if(bpp == 15){
			mode = _1024x768x15;
		}else if(bpp == 16){
			mode = _1024x768x16;
		}else if(bpp == 32){
			mode = _1024x768_TC;
		}
	}else{
		if(bpp == 8){
			mode = _1280x1024x8;
		}else if(bpp == 15){
			mode = _1280x1024x15;
		}else if(bpp == 16){
			mode = _1280x1024x16;
		}else if(bpp == 32){
			mode = _1280x1024_TC;
		}
	}

	return mode;
}

int GetAvailableBpp(int bpp)
{
	int result;

	result = 8;
	if(bpp == 8){
		result = 8;
	}else if(bpp == 15){
		result = 15;
	}else if(bpp == 16){
		result = 16;
#if 0
	}else if(bpp == 24){
		result = 32;
	}else if(bpp == 32){
		result = 32;
#endif
	}

	return result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -