📄 bldrv.c
字号:
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 + -