1
0
Fork 0

tweak some vga bios functions to better stick to real implementations

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2995
This commit is contained in:
Sebastian Strohhäcker 2007-09-24 20:50:40 +00:00
parent 208edab1ac
commit d64648208a
7 changed files with 101 additions and 34 deletions

View file

@ -50,7 +50,8 @@ enum MachineType {
enum SVGACards {
SVGA_None,
SVGA_S3Trio
SVGA_S3Trio,
SVGA_TsengET4K
};
extern SVGACards svgaCard;

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: dosbox.cpp,v 1.122 2007-09-20 16:42:43 c2woody Exp $ */
/* $Id: dosbox.cpp,v 1.123 2007-09-24 20:50:40 c2woody Exp $ */
#include <stdlib.h>
#include <stdarg.h>
@ -265,9 +265,16 @@ static void DOSBOX_RealInit(Section * sec) {
else if (strcasecmp(mtype,"pcjr")==0) machine=MCH_PCJR;
else if (strcasecmp(mtype,"hercules")==0) machine=MCH_HERC;
else if (strcasecmp(mtype,"ega")==0) machine=MCH_EGA;
else if (strcasecmp(mtype,"vga")==0) {
else if ((strcasecmp(mtype,"vga")==0) || (strcasecmp(mtype,"vga_s3")==0) ||
(strcasecmp(mtype,"svga")==0) || (strcasecmp(mtype,"svga_s3")==0)) {
machine=MCH_VGA;
svgaCard=SVGA_S3Trio;
/* } else if ((strcasecmp(mtype,"vga_et4000")==0) || (strcasecmp(mtype,"svga_et4000")==0)) {
machine=MCH_VGA;
svgaCard=SVGA_TsengET4K; */
} else if (strcasecmp(mtype,"vgaonly")==0) {
machine=MCH_VGA;
svgaCard=SVGA_None;
} else LOG_MSG("DOSBOX:Unknown machine type %s",mtype);
}

View file

@ -139,7 +139,10 @@ static void write_p3cf(Bitu port,Bitu val,Bitu iolen) {
*/
break;
case 6: /* Miscellaneous Register */
gfx(miscellaneous)=val;
if ((gfx(miscellaneous) ^ val) & 0x0c) {
gfx(miscellaneous)=val;
VGA_DetermineMode();
} else gfx(miscellaneous)=val;
VGA_SetupHandlers();
/*
0 Indicates Graphics Mode if set, Alphanumeric mode else.

View file

@ -58,17 +58,17 @@ static Bitu INT10_Handler(void) {
INT10_SetCursorPos(reg_dh,reg_dl,reg_bh);
break;
case 0x03: /* get Cursor Pos and Cursor Shape*/
reg_ah=0;
// reg_ah=0;
reg_dl=CURSOR_POS_COL(reg_bh);
reg_dh=CURSOR_POS_ROW(reg_bh);
reg_cx=real_readw(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE);
break;
case 0x04: /* read light pen pos YEAH RIGHT */
/* Light pen is not supported */
reg_ah=0;
reg_ax=0;
break;
case 0x05: /* Set Active Page */
if (reg_al & 0x80 && IS_TANDY_ARCH) {
if ((reg_al & 0x80) && IS_TANDY_ARCH) {
Bit8u crtcpu=real_readb(BIOSMEM_SEG, BIOSMEM_CRTCPU_PAGE);
switch (reg_al) {
case 0x80:
@ -116,13 +116,8 @@ static Bitu INT10_Handler(void) {
INT10_SetBackgroundBorder(reg_bl);
break;
case 0x01: //Set color Select
INT10_SetColorSelect(reg_bl);
break;
default:
if ((machine==MCH_CGA) || (machine==MCH_PCJR)) {
/* those BIOSes check for !=0 */
INT10_SetColorSelect(reg_bl);
}
INT10_SetColorSelect(reg_bl);
break;
}
break;
@ -185,6 +180,7 @@ static Bitu INT10_Handler(void) {
break;
case 0x19: /* undocumented - GET PEL MASK */
INT10_GetPelMask(reg_bl);
reg_bh=0; // bx for get mask
break;
case 0x1A: /* GET VIDEO DAC COLOR PAGE */
INT10_GetDACPage(&reg_bl,&reg_bh);
@ -192,8 +188,12 @@ static Bitu INT10_Handler(void) {
case 0x1B: /* PERFORM GRAY-SCALE SUMMING */
INT10_PerformGrayScaleSumming(reg_bx,reg_cx);
break;
case 0xF0: /* ET4000: SET HiColor GRAPHICS MODE */
case 0xF1: /* ET4000: GET DAC TYPE */
case 0xF2: /* ET4000: CHECK/SET HiColor MODE */
default:
LOG(LOG_INT10,LOG_ERROR)("Function 10:Unhandled EGA/VGA Palette Function %2X",reg_al);
break;
}
break;
case 0x11: /* Character generator functions */
@ -287,12 +287,21 @@ graphics_chars:
break;
default:
LOG(LOG_INT10,LOG_ERROR)("Function 11:30 Request for font %2X",reg_bh);
break;
}
if ((reg_bh<=7) || (svgaCard==SVGA_TsengET4K)) {
if (machine==MCH_EGA) {
reg_cx=0x0e;
reg_dl=0x18;
} else {
reg_cx=real_readw(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT);
reg_dl=real_readb(BIOSMEM_SEG,BIOSMEM_NB_ROWS);
}
}
reg_cx=real_readw(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT);
reg_dl=real_readb(BIOSMEM_SEG,BIOSMEM_NB_ROWS);
break;
default:
LOG(LOG_INT10,LOG_ERROR)("Function 11:Unsupported character generator call %2X",reg_al);
break;
}
break;
case 0x12: /* alternate function select */
@ -302,18 +311,25 @@ graphics_chars:
case 0x10: /* Get EGA Information */
reg_bh=(real_readw(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS)==0x3B4);
reg_bl=3; //256 kb
reg_cx=real_readb(BIOSMEM_SEG,BIOSMEM_SWITCHES) & 0x0F;
reg_cl=real_readb(BIOSMEM_SEG,BIOSMEM_SWITCHES) & 0x0F;
reg_ch=real_readb(BIOSMEM_SEG,BIOSMEM_SWITCHES) >> 4;
break;
case 0x20: /* Set alternate printscreen */
break;
case 0x30: /* Select vertical resolution */
if (!IS_VGA_ARCH) break;
LOG(LOG_INT10,LOG_ERROR)("Function 12:Call %2X not handled",reg_bl);
reg_al=0x12; //fake a success call
if (reg_al>2) reg_al=0; //invalid subfunction
else reg_al=0x12; //fake a success call
break;
case 0x31: /* Palette loading on modeset */
{
if (!IS_VGA_ARCH) break;
if (svgaCard==SVGA_TsengET4K) reg_al&=1;
if (reg_al>1) {
reg_al=0; //invalid subfunction
break;
}
Bit8u temp = real_readb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL) & 0xf7;
if (reg_al&1) temp|=8; // enable if al=0
real_writeb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL,temp);
@ -323,11 +339,18 @@ graphics_chars:
case 0x32: /* Video adressing */
if (!IS_VGA_ARCH) break;
LOG(LOG_INT10,LOG_ERROR)("Function 12:Call %2X not handled",reg_bl);
reg_al=0x12; //fake a success call
if (svgaCard==SVGA_TsengET4K) reg_al&=1;
if (reg_al>1) reg_al=0; //invalid subfunction
else reg_al=0x12; //fake a success call
break;
case 0x33: /* SWITCH GRAY-SCALE SUMMING */
{
if (!IS_VGA_ARCH) break;
if (svgaCard==SVGA_TsengET4K) reg_al&=1;
if (reg_al>1) {
reg_al=0;
break;
}
Bit8u temp = real_readb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL) & 0xfd;
if (!(reg_al&1)) temp|=2; // enable if al=0
real_writeb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL,temp);
@ -338,6 +361,11 @@ graphics_chars:
{
// bit 0: 0=enable, 1=disable
if (!IS_VGA_ARCH) break;
if (svgaCard==SVGA_TsengET4K) reg_al&=1;
if (reg_al>1) {
reg_al=0;
break;
}
Bit8u temp = real_readb(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL) & 0xfe;
real_writeb(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL,temp|reg_al);
reg_al=0x12;
@ -350,6 +378,10 @@ graphics_chars:
break;
case 0x36: /* VGA Refresh control */
if (!IS_VGA_ARCH) break;
if ((svgaCard==SVGA_S3Trio) && (reg_al>1)) {
reg_al=0;
break;
}
/*
Call disables/enables the vga from outputting video,
don't support it, but fake a success return
@ -358,7 +390,7 @@ graphics_chars:
break;
default:
LOG(LOG_INT10,LOG_ERROR)("Function 12:Call %2X not handled",reg_bl);
reg_al=0x12; // wrong!?
if (machine!=MCH_EGA) reg_al=0;
break;
}
break;
@ -387,6 +419,8 @@ graphics_chars:
break;
default:
LOG(LOG_INT10,LOG_ERROR)("1B:Unhandled call BX %2X",reg_bx);
reg_al=0;
break;
}
break;
case 0x1C: /* Video Save Area */
@ -438,12 +472,13 @@ graphics_chars:
break;
case 0x01:
reg_al=0x4f;
reg_bh=0x00; //Weird?
reg_bh=0x00; //reserved
reg_ah=VESA_GetDisplayStart(reg_cx,reg_dx);
break;
default:
LOG(LOG_INT10,LOG_ERROR)("Unhandled VESA Function %X Subfunction %X",reg_al,reg_bl);
reg_ah=0x1;
break;
}
break;
case 0x09:
@ -461,6 +496,7 @@ graphics_chars:
default:
LOG(LOG_INT10,LOG_ERROR)("Unhandled VESA Function %X Subfunction %X",reg_al,reg_bl);
reg_ah=0x01;
break;
}
break;
case 0x0a: /* Get Pmode Interface */
@ -498,6 +534,7 @@ graphics_chars:
default:
LOG(LOG_INT10,LOG_ERROR)("Unhandled VESA Function %X",reg_al);
reg_al=0x0;
break;
}
break;
case 0xf0:
@ -531,6 +568,7 @@ graphics_chars:
default:
LOG(LOG_INT10,LOG_ERROR)("Function %2X not supported",reg_ah);
reg_al=0x00; //Successfull
break;
};
return CBRET_NONE;
}

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: int10_char.cpp,v 1.51 2007-09-20 16:42:43 c2woody Exp $ */
/* $Id: int10_char.cpp,v 1.52 2007-09-24 20:50:40 c2woody Exp $ */
/* Character displaying moving functions */
@ -273,7 +273,7 @@ filling:
void INT10_SetActivePage(Bit8u page) {
Bit16u mem_address;
if (page>7) return;
if (page>7) E_Exit("INT10_SetActivePage page %d",page);
mem_address=page*real_readw(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE);
/* Write the new page start */
real_writew(BIOSMEM_SEG,BIOSMEM_CURRENT_START,mem_address);
@ -348,7 +348,7 @@ dowrite:
void INT10_SetCursorPos(Bit8u row,Bit8u col,Bit8u page) {
Bit16u address;
if(page>7) return;
if (page>7) E_Exit("INT10_SetCursorPos page %d");
// Bios cursor pos
real_writeb(BIOSMEM_SEG,BIOSMEM_CURSOR_POS+page*2,col);
real_writeb(BIOSMEM_SEG,BIOSMEM_CURSOR_POS+page*2+1,row);
@ -358,7 +358,8 @@ void INT10_SetCursorPos(Bit8u row,Bit8u col,Bit8u page) {
// Get the dimensions
BIOS_NCOLS;
// Calculate the address knowing nbcols nbrows and page num
address=(ncols*row)+col+real_readw(BIOSMEM_SEG,BIOSMEM_CURRENT_START);
// NOTE: BIOSMEM_CURRENT_START counts in colour/flag pairs
address=(ncols*row)+col+real_readw(BIOSMEM_SEG,BIOSMEM_CURRENT_START)/2;
// CRTC regs 0x0e and 0x0f
Bit16u base=real_readw(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS);
IO_Write(base,0x0e);

View file

@ -53,10 +53,18 @@ void INT10_SetSinglePaletteRegister(Bit8u reg,Bit8u val) {
void INT10_SetOverscanBorderColor(Bit8u val) {
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,0x11);
IO_Write(VGAREG_ACTL_WRITE_DATA,val);
IO_Write(VGAREG_ACTL_ADDRESS,32); //Enable output and protect palette
switch (machine) {
case TANDY_ARCH_CASE:
IO_Read(VGAREG_TDY_RESET);
WriteTandyACTL(0x02,val);
break;
case EGAVGA_ARCH_CASE:
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,0x11);
IO_Write(VGAREG_ACTL_WRITE_DATA,val);
IO_Write(VGAREG_ACTL_ADDRESS,32); //Enable output and protect palette
break;
}
}
void INT10_SetAllPaletteRegisters(PhysPt data) {
@ -89,18 +97,27 @@ void INT10_SetAllPaletteRegisters(PhysPt data) {
void INT10_ToggleBlinkingBit(Bit8u state) {
Bit8u value;
state&=0x01;
// state&=0x01;
if ((state>1) && (svgaCard==SVGA_S3Trio)) return;
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,0x10);
value=IO_Read(VGAREG_ACTL_READ_DATA);
value&=0xf7;
value|=state<<3;
if (state<=1) {
value&=0xf7;
value|=state<<3;
}
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,0x10);
IO_Write(VGAREG_ACTL_WRITE_DATA,value);
IO_Write(VGAREG_ACTL_ADDRESS,32); //Enable output and protect palette
if (state<=1) {
Bit8u msrval=real_readb(BIOSMEM_SEG,BIOSMEM_CURRENT_MSR)&0xdf;
if (state) msrval|=0x20;
real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_MSR,msrval);
}
}
void INT10_GetSinglePaletteRegister(Bit8u reg,Bit8u * val) {

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: int10_vesa.cpp,v 1.28 2007-09-22 17:01:17 c2woody Exp $ */
/* $Id: int10_vesa.cpp,v 1.29 2007-09-24 20:50:40 c2woody Exp $ */
#include <string.h>
#include <stddef.h>
@ -126,8 +126,8 @@ Bit8u VESA_GetSVGAModeInformation(Bit16u mode,Bit16u seg,Bit16u off) {
Bitu pageSize;
Bitu i=0;
if ((mode&0x7fff)<0x100) return 0x01;
mode&=0xfff;
mode&=0x3fff; // vbe2 compatible, ignore lfb and keep screen content bits
if (mode<0x100) return 0x01;
while (ModeList_VGA[i].mode!=0xffff) {
if (mode==ModeList_VGA[i].mode) goto foundit; else i++;
}