1
0
Fork 0

fix INT10_GetDACBlock; add gray scale summing (from VGABIOS)

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2353
This commit is contained in:
Sebastian Strohhäcker 2005-10-23 19:47:18 +00:00
parent 9175b74b13
commit c614c13e0e
4 changed files with 38 additions and 8 deletions

View file

@ -176,6 +176,9 @@ static Bitu INT10_Handler(void) {
case 0x1A: /* GET VIDEO DAC COLOR PAGE */
INT10_GetDACPage(&reg_bl,&reg_bh);
break;
case 0x1B: /* PERFORM GRAY-SCALE SUMMING */
INT10_PerformGrayScaleSumming(reg_bx,reg_cx);
break;
default:
LOG(LOG_INT10,LOG_ERROR)("Function 10:Unhandled EGA/VGA Palette Function %2X",reg_al);
}
@ -274,12 +277,18 @@ graphics_chars:
if (machine<MCH_VGA) break;
switch (reg_bl) {
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;
break;
}
reg_bh=(real_readw(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS)==0x3B4);
reg_bl=3; //256 kb
reg_cx=real_readb(BIOSMEM_SEG,BIOSMEM_SWITCHES) & 0x0F;
break;
case 0x33: /* SWITCH GRAY-SCALE SUMMING */
{
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);
reg_al=0x12;
break;
}
case 0x34: /* ALTERNATE FUNCTION SELECT (VGA) - CURSOR EMULATION */
{
// bit 0: 0=enable, 1=disable

View file

@ -179,7 +179,7 @@ void INT10_SelectDACPage(Bit8u function,Bit8u mode);
void INT10_GetDACPage(Bit8u* mode,Bit8u* page);
void INT10_SetPelMask(Bit8u mask);
void INT10_GetPelMask(Bit8u & mask);
void INT10_PerformGrayScaleSumming(Bit16u start_reg,Bit16u count);
/* Vesa Group */

View file

@ -781,6 +781,12 @@ dac_text16:
}
break;
}
if (machine==MCH_VGA) {
/* check if gray scale summing is enabled */
if (real_readb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL) & 2) {
INT10_PerformGrayScaleSumming(0,256);
}
}
/* Setup some special stuff for different modes */
Bit8u feature=real_readb(BIOSMEM_SEG,BIOSMEM_INITIAL_MODE);
switch (CurMode->type) {

View file

@ -154,7 +154,7 @@ void INT10_SetDACBlock(Bit16u index,Bit16u count,PhysPt data) {
}
void INT10_GetDACBlock(Bit16u index,Bit16u count,PhysPt data) {
IO_Write(VGAREG_DAC_WRITE_ADDRESS,(Bit8u)index);
IO_Write(VGAREG_DAC_READ_ADDRESS,(Bit8u)index);
for (;count>0;count--) {
mem_writeb(data++,IO_Read(VGAREG_DAC_DATA));
mem_writeb(data++,IO_Read(VGAREG_DAC_DATA));
@ -239,3 +239,18 @@ void INT10_SetColorSelect(Bit8u val) {
INT10_SetSinglePaletteRegister( 3, val );
}
}
void INT10_PerformGrayScaleSumming(Bit16u start_reg,Bit16u count) {
if (count>0x100) count=0x100;
for (Bitu ct=0; ct<count; ct++) {
IO_Write(VGAREG_DAC_READ_ADDRESS,start_reg+ct);
Bit8u red=IO_Read(VGAREG_DAC_DATA);
Bit8u green=IO_Read(VGAREG_DAC_DATA);
Bit8u blue=IO_Read(VGAREG_DAC_DATA);
/* calculate clamped intensity, taken from VGABIOS */
Bit32u i=(( 77*red + 151*green + 28*blue ) + 0x80) >> 8;
Bit8u ic=(i>0x3f) ? 0x3f : ((Bit8u)(i & 0xff));
INT10_SetSingleDacRegister(start_reg+ct,ic,ic,ic);
}
}