1
0
Fork 0

add partial ega-only machine

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2992
This commit is contained in:
Sebastian Strohhäcker 2007-09-20 16:42:43 +00:00
parent 5c9a311f7b
commit 6188566e38
23 changed files with 208 additions and 111 deletions

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: bios.cpp,v 1.68 2007-06-12 20:22:08 c2woody Exp $ */
/* $Id: bios.cpp,v 1.69 2007-09-20 16:42:43 c2woody Exp $ */
#include "dosbox.h"
#include "mem.h"
@ -705,7 +705,7 @@ static Bitu INT15_Handler(void) {
LOG(LOG_BIOS,LOG_ERROR)("INT15:Unknown call %4X",reg_ax);
reg_ah=0x86;
CALLBACK_SCF(true);
if ((machine==MCH_VGA) || (machine==MCH_CGA)) {
if ((IS_EGAVGA_ARCH) || (machine==MCH_CGA)) {
/* relict from comparisons, as int15 exits with a retf2 instead of an iret */
CALLBACK_SZF(false);
}
@ -917,7 +917,7 @@ public:
//Startup monochrome
config|=0x30;
break;
case MCH_VGA:
case EGAVGA_ARCH_CASE:
case MCH_CGA:
case TANDY_ARCH_CASE:
//Startup 80x25 color

View file

@ -140,7 +140,9 @@ static Bitu INT10_Handler(void) {
reg_al=real_readb(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE)|(real_readb(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL)&0x80);
reg_ah=(Bit8u)real_readw(BIOSMEM_SEG,BIOSMEM_NB_COLS);
break;
case 0x10: /* EGA/VGA Palette functions */
case 0x10: /* Palette functions */
if ((machine==MCH_CGA) || ((!IS_VGA_ARCH) && (reg_al>0x02))) break;
//TODO: subfunction 0x03 for ega
switch (reg_al) {
case 0x00: /* SET SINGLE PALETTE REGISTER */
INT10_SetSinglePaletteRegister(reg_bl,reg_bh);
@ -195,7 +197,7 @@ static Bitu INT10_Handler(void) {
}
break;
case 0x11: /* Character generator functions */
if (machine<MCH_VGA)
if (!IS_EGAVGA_ARCH)
break;
switch (reg_al) {
/* Textmode calls */
@ -216,6 +218,7 @@ static Bitu INT10_Handler(void) {
break;
case 0x04: /* Load 8x16 font */
case 0x14:
if (!IS_VGA_ARCH) break;
INT10_LoadFont(Real2Phys(int10.rom.font_16),reg_al==0x14,256,0,0,16);
break;
/* Graphics mode calls */
@ -235,6 +238,7 @@ static Bitu INT10_Handler(void) {
real_writew(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT,8);
goto graphics_chars;
case 0x24: /* Rom 8x16 set */
if (!IS_VGA_ARCH) break;
RealSetVec(0x43,int10.rom.font_16);
real_writew(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT,16);
goto graphics_chars;
@ -277,6 +281,7 @@ graphics_chars:
reg_bp=RealOff(int10.rom.font_8_second);
break;
case 0x06: /* font 8x16 */
if (!IS_VGA_ARCH) break;
SegSet16(es,RealSeg(int10.rom.font_16));
reg_bp=RealOff(int10.rom.font_16);
break;
@ -291,7 +296,7 @@ graphics_chars:
}
break;
case 0x12: /* alternate function select */
if (machine<MCH_VGA)
if (!IS_EGAVGA_ARCH)
break;
switch (reg_bl) {
case 0x10: /* Get EGA Information */
@ -302,20 +307,27 @@ graphics_chars:
case 0x20: /* Set alternate printscreen */
break;
case 0x30: /* Select vertical resolution */
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
break;
case 0x31: /* Palette loading on modeset */
{
if (!IS_VGA_ARCH) 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);
reg_al=0x12;
break;
}
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
break;
case 0x33: /* SWITCH GRAY-SCALE SUMMING */
{
if (!IS_VGA_ARCH) 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);
@ -325,12 +337,19 @@ graphics_chars:
case 0x34: /* ALTERNATE FUNCTION SELECT (VGA) - CURSOR EMULATION */
{
// bit 0: 0=enable, 1=disable
if (!IS_VGA_ARCH) break;
Bit8u temp = real_readb(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL) & 0xfe;
real_writeb(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL,temp|reg_al);
reg_al=0x12;
break;
}
case 0x35:
if (!IS_VGA_ARCH) break;
LOG(LOG_INT10,LOG_ERROR)("Function 12:Call %2X not handled",reg_bl);
reg_al=0x12;
break;
case 0x36: /* VGA Refresh control */
if (!IS_VGA_ARCH) break;
/*
Call disables/enables the vga from outputting video,
don't support it, but fake a success return
@ -347,7 +366,7 @@ graphics_chars:
INT10_WriteString(reg_dh,reg_dl,reg_al,reg_bl,SegPhys(es)+reg_bp,reg_cx,reg_bh);
break;
case 0x1A: /* Display Combination */
if (machine<MCH_VGA) break;
if (!IS_VGA_ARCH) break;
if (reg_al==0) {
reg_bx=real_readb(BIOSMEM_SEG,BIOSMEM_DCC_INDEX);
reg_al=0x1A;
@ -360,7 +379,7 @@ graphics_chars:
}
break;
case 0x1B: /* functionality State Information */
if (machine<MCH_VGA) break;
if (!IS_VGA_ARCH) break;
switch (reg_bx) {
case 0x0000:
INT10_GetFuncStateInformation(SegPhys(es)+reg_di);
@ -371,11 +390,12 @@ graphics_chars:
}
break;
case 0x1C: /* Video Save Area */
if (machine<MCH_VGA) break;
if (IS_VGA_ARCH) break;
if (reg_al==0) reg_bx = 0;
reg_al = 0x1C;
break;
case 0x4f: /* VESA Calls */
if ((!IS_VGA_ARCH) || (svgaCard==SVGA_None)) break;
switch (reg_al) {
case 0x00: /* Get SVGA Information */
reg_al=0x4f;

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: int10_char.cpp,v 1.50 2007-06-12 20:22:08 c2woody Exp $ */
/* $Id: int10_char.cpp,v 1.51 2007-09-20 16:42:43 c2woody Exp $ */
/* Character displaying moving functions */
@ -271,14 +271,13 @@ filling:
}
void INT10_SetActivePage(Bit8u page) {
Bit16u mem_address;
if (page>7) return;
mem_address=page*real_readw(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE);
/* Write the new page start */
real_writew(BIOSMEM_SEG,BIOSMEM_CURRENT_START,mem_address);
if (machine==MCH_VGA && CurMode->mode<0x8) mem_address>>=1;
if (IS_EGAVGA_ARCH && CurMode->mode<0x8) mem_address>>=1;
/* Write the new start address in vgahardware */
Bit16u base=real_readw(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS);
IO_Write(base,0x0c);
@ -522,7 +521,7 @@ void WriteChar(Bit16u col,Bit16u row,Bit8u page,Bit8u chr,Bit8u attr,bool useatt
void INT10_WriteChar(Bit8u chr,Bit8u attr,Bit8u page,Bit16u count,bool showattr) {
if (CurMode->type!=M_TEXT) {
switch (machine) {
case MCH_VGA:
case EGAVGA_ARCH_CASE:
page%=CurMode->ptotal;
break;
case MCH_CGA:

View file

@ -78,14 +78,16 @@ void INT10_SetupRomMemory(void) {
PhysPt rom_base=PhysMake(0xc000,0);
Bitu i;
int10.rom.used=3;
if (machine==MCH_VGA) {
if (IS_EGAVGA_ARCH) {
// set up the start of the ROM
phys_writew(rom_base+0,0xaa55);
phys_writeb(rom_base+2,0x40); // Size of ROM: 64 512-blocks = 32KB
phys_writeb(rom_base+0x1e,0x49); // IBM string
phys_writeb(rom_base+0x1f,0x42);
phys_writeb(rom_base+0x20,0x4d);
phys_writeb(rom_base+0x21,0x00);
if (IS_VGA_ARCH) {
phys_writeb(rom_base+0x1e,0x49); // IBM string
phys_writeb(rom_base+0x1f,0x42);
phys_writeb(rom_base+0x20,0x4d);
phys_writeb(rom_base+0x21,0x00);
}
int10.rom.used=0x100;
}
int10.rom.font_8_first=RealMake(0xC000,int10.rom.used);
@ -116,7 +118,7 @@ void INT10_SetupRomMemory(void) {
if (IS_TANDY_ARCH) {
RealSetVec(0x44,int10.rom.font_8_first);
}
if (machine == MCH_VGA) { //EGA/VGA. Just to be safe
if (IS_EGAVGA_ARCH) { //EGA/VGA. Just to be safe
//Reserve checksum location
checksumlocation = int10.rom.used++;
}
@ -145,7 +147,7 @@ void INT10_ReloadRomFonts(void) {
}
void INT10_SetupRomMemoryChecksum(void) {
if (machine == MCH_VGA) { //EGA/VGA. Just to be safe
if (IS_EGAVGA_ARCH) { //EGA/VGA. Just to be safe
/* Sum of all bytes in rom module 256 should be 0 */
Bit8u sum = 0;
PhysPt rom_base = PhysMake(0xc000,0);

View file

@ -272,7 +272,7 @@ static void FinishSetMode(bool clearmem) {
real_writeb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL,real_readb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL)&0x7f);
// FIXME We nearly have the good tables. to be reworked
if (machine==MCH_VGA) real_writeb(BIOSMEM_SEG,BIOSMEM_DCC_INDEX,0x08); // 8 is VGA should be ok for now
if (IS_VGA_ARCH) real_writeb(BIOSMEM_SEG,BIOSMEM_DCC_INDEX,0x08); // 8 is VGA should be ok for now
real_writew(BIOSMEM_SEG,BIOSMEM_VS_POINTER,0x00);
real_writew(BIOSMEM_SEG,BIOSMEM_VS_POINTER+2,0x00);
@ -468,7 +468,11 @@ bool INT10_SetVideoMode(Bitu mode) {
mode-=0x80;
}
LOG(LOG_INT10,LOG_NORMAL)("Set Video Mode %X",mode);
if (machine!=MCH_VGA) return INT10_SetVideoMode_OTHER(mode,clearmem);
if (!IS_EGAVGA_ARCH) return INT10_SetVideoMode_OTHER(mode,clearmem);
if ((machine==MCH_EGA) && (mode>0x10)) {
LOG(LOG_INT10,LOG_ERROR)("EGA:Trying to set illegal mode %X",mode);
return false;
}
Bit8u modeset_ctl,video_ctl,vga_switches;
if (!SetCurMode(ModeList_VGA,mode)){
@ -643,7 +647,10 @@ bool INT10_SetVideoMode(Bitu mode) {
ver_overflow|=(line_compare & 0x400) >> 4;
Bit8u underline=0;
/* Maximum scanline / Underline Location */
if (CurMode->special & _EGA_LINE_DOUBLE) max_scanline|=0x80;
if (CurMode->special & _EGA_LINE_DOUBLE) {
if (machine==MCH_EGA) max_scanline=1;
else max_scanline|=0x80;
}
switch (CurMode->type) {
case M_TEXT:
max_scanline|=CurMode->cheight-1;
@ -661,7 +668,8 @@ bool INT10_SetVideoMode(Bitu mode) {
break;
case M_CGA2:
case M_CGA4:
max_scanline|=1;
if (machine==MCH_EGA) max_scanline|=2;
else max_scanline|=1;
break;
}
if (CurMode->vdispend==350) underline=0x0f;
@ -819,13 +827,23 @@ bool INT10_SetVideoMode(Bitu mode) {
for (i=1;i<16;i++) att_data[i]=0x3f;
break;
case 0x10:
case 0x12: goto att_text16;
case 0x12:
if (IS_VGA_ARCH)
goto att_text16;
// ega fallthrough
default:
if ( CurMode->type == M_LIN4 )
goto att_text16;
for (i=0;i<8;i++) {
att_data[i]=i;
att_data[i+8]=i+0x10;
if (!IS_VGA_ARCH) {
for (i=0;i<8;i++) {
att_data[i]=i;
att_data[i+8]=i+0x38;
}
} else {
for (i=0;i<8;i++) {
att_data[i]=i;
att_data[i+8]=i+0x10;
}
}
break;
}
@ -929,7 +947,7 @@ dac_text16:
}
break;
}
if (machine==MCH_VGA) {
if (IS_VGA_ARCH) {
/* check if gray scale summing is enabled */
if (real_readb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL) & 2) {
INT10_PerformGrayScaleSumming(0,256);

View file

@ -39,7 +39,8 @@ void INT10_SetSinglePaletteRegister(Bit8u reg,Bit8u val) {
IO_Read(VGAREG_TDY_RESET);
WriteTandyACTL(reg+0x10,val);
break;
case MCH_VGA:
case EGAVGA_ARCH_CASE:
if (!IS_VGA_ARCH) reg&=0x1f;
if(reg<=ACTL_MAX_REG) {
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,reg);
@ -70,7 +71,7 @@ void INT10_SetAllPaletteRegisters(PhysPt data) {
// Then the border
WriteTandyACTL(0x02,mem_readb(data));
break;
case MCH_VGA:
case EGAVGA_ARCH_CASE:
ResetACTL();
// First the colors
for(Bit8u i=0;i<0x10;i++) {
@ -215,7 +216,7 @@ void INT10_SetBackgroundBorder(Bit8u val) {
real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_PAL,temp);
if (machine == MCH_CGA || IS_TANDY_ARCH)
IO_Write(0x3d9,temp);
else if (machine == MCH_VGA) {
else if (IS_EGAVGA_ARCH) {
val = ((val << 1) & 0x10) | (val & 0x7);
/* Aways set the overscan color */
INT10_SetSinglePaletteRegister( 0x11, val );
@ -238,7 +239,7 @@ void INT10_SetColorSelect(Bit8u val) {
real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_PAL,temp);
if (machine == MCH_CGA || IS_TANDY_ARCH)
IO_Write(0x3d9,temp);
else if (machine == MCH_VGA) {
else if (IS_EGAVGA_ARCH) {
if (CurMode->mode <= 3) //Maybe even skip the total function!
return;
val = (temp & 0x10) | 2 | val;