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:
parent
208edab1ac
commit
d64648208a
7 changed files with 101 additions and 34 deletions
|
@ -50,7 +50,8 @@ enum MachineType {
|
|||
|
||||
enum SVGACards {
|
||||
SVGA_None,
|
||||
SVGA_S3Trio
|
||||
SVGA_S3Trio,
|
||||
SVGA_TsengET4K
|
||||
};
|
||||
|
||||
extern SVGACards svgaCard;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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(®_bl,®_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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue