add partial ega-only machine
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2992
This commit is contained in:
parent
5c9a311f7b
commit
6188566e38
23 changed files with 208 additions and 111 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue