diff --git a/include/dosbox.h b/include/dosbox.h index efe7a50b..19bde530 100644 --- a/include/dosbox.h +++ b/include/dosbox.h @@ -50,7 +50,8 @@ enum MachineType { enum SVGACards { SVGA_None, - SVGA_S3Trio + SVGA_S3Trio, + SVGA_TsengET4K }; extern SVGACards svgaCard; diff --git a/src/dosbox.cpp b/src/dosbox.cpp index 3e831398..5be71d77 100644 --- a/src/dosbox.cpp +++ b/src/dosbox.cpp @@ -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 #include @@ -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); } diff --git a/src/hardware/vga_gfx.cpp b/src/hardware/vga_gfx.cpp index 7d789ef8..81d61f56 100644 --- a/src/hardware/vga_gfx.cpp +++ b/src/hardware/vga_gfx.cpp @@ -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. diff --git a/src/ints/int10.cpp b/src/ints/int10.cpp index 90b13178..33f4dd39 100644 --- a/src/ints/int10.cpp +++ b/src/ints/int10.cpp @@ -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; } diff --git a/src/ints/int10_char.cpp b/src/ints/int10_char.cpp index d0695a15..b244b278 100644 --- a/src/ints/int10_char.cpp +++ b/src/ints/int10_char.cpp @@ -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); diff --git a/src/ints/int10_pal.cpp b/src/ints/int10_pal.cpp index c017e79d..8003edf3 100644 --- a/src/ints/int10_pal.cpp +++ b/src/ints/int10_pal.cpp @@ -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) { diff --git a/src/ints/int10_vesa.cpp b/src/ints/int10_vesa.cpp index 20a98344..b66a0d2b 100644 --- a/src/ints/int10_vesa.cpp +++ b/src/ints/int10_vesa.cpp @@ -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 #include @@ -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++; }