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:
parent
9175b74b13
commit
c614c13e0e
4 changed files with 38 additions and 8 deletions
|
@ -176,6 +176,9 @@ static Bitu INT10_Handler(void) {
|
|||
case 0x1A: /* GET VIDEO DAC COLOR PAGE */
|
||||
INT10_GetDACPage(®_bl,®_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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue