1
0
Fork 0

better vga compatibility (rom strings, initial mode field) for 221b Baker Street/Coloring Book 2;

fixes for monochrome modes, clearmem flag;
corrections from ih8regs


Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2320
This commit is contained in:
Sebastian Strohhäcker 2005-09-27 11:05:44 +00:00
parent 9d8f00c6c3
commit 417fb048ba
6 changed files with 95 additions and 39 deletions

View file

@ -125,7 +125,7 @@ static Bitu INT10_Handler(void) {
break;
case 0x0F: /* Get videomode */
reg_bh=real_readb(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE);
reg_al=real_readb(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE);
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 */

View file

@ -72,17 +72,20 @@ void INT10_LoadFont(PhysPt font,bool reload,Bitu count,Bitu offset,Bitu map,Bitu
}
}
void INT10_SetupRomMemory(void) {
/* This should fill up certain structures inside the Video Bios Rom Area */
PhysPt rom_base=PhysMake(0xc000,0);
Bitu i;
int10.rom.used=3; // int10.rom.used=2; Size of ROM added
int10.rom.used=3;
if (machine==MCH_VGA) {
// 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+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);
int10.rom.used=0x100;
}
int10.rom.font_8_first=RealMake(0xC000,int10.rom.used);
for (i=0;i<128*8;i++) {

View file

@ -92,13 +92,13 @@ void INT10_GetFuncStateInformation(PhysPt save) {
Bit16u col_count=0;
switch (CurMode->type) {
case M_TEXT:
col_count=16;break;
if (CurMode->mode==0x7) col_count=1; else col_count=16;break;
case M_CGA2:
col_count=2;break;
case M_CGA4:
col_count=4;break;
case M_EGA16:
col_count=16;break;
if (CurMode->mode==0x11 || CurMode->mode==0x0f) col_count=2; else col_count=16;break;
case M_VGA:
col_count=256;break;
default:
@ -119,7 +119,9 @@ void INT10_GetFuncStateInformation(PhysPt save) {
case 480:
mem_writeb(save+0x2a,3);break;
};
//TODO Maybe misc flags
/* misc flags */
if (CurMode->type==M_TEXT) mem_writeb(save+0x2d,0x21);
else mem_writeb(save+0x2d,0x01);
/* Video Memory available */
mem_writeb(save+0x31,3);
}

View file

@ -38,9 +38,9 @@ VideoModeBlock ModeList_VGA[]={
{ 0x001 ,M_TEXT ,360 ,400 ,40 ,25 ,9 ,16 ,8 ,0xB8000 ,0x0800 ,50 ,449 ,40 ,400 ,_EGA_HALF_CLOCK },
{ 0x002 ,M_TEXT ,720 ,400 ,80 ,25 ,9 ,16 ,8 ,0xB8000 ,0x1000 ,100 ,449 ,80 ,400 ,0 },
{ 0x003 ,M_TEXT ,720 ,400 ,80 ,25 ,9 ,16 ,8 ,0xB8000 ,0x1000 ,100 ,449 ,80 ,400 ,0 },
{ 0x004 ,M_CGA4 ,320 ,200 ,40 ,25 ,8 ,8 ,4 ,0xB8000 ,0x0800 ,50 ,449 ,40 ,400 ,_EGA_HALF_CLOCK | _EGA_LINE_DOUBLE},
{ 0x005 ,M_CGA4 ,320 ,200 ,40 ,25 ,8 ,8 ,1 ,0xB8000 ,0x0800 ,50 ,449 ,40 ,400 ,_EGA_HALF_CLOCK | _EGA_LINE_DOUBLE},
{ 0x006 ,M_CGA2 ,640 ,200 ,80 ,25 ,8 ,8 ,1 ,0xB8000 ,0x0800 ,100 ,449 ,80 ,400 ,_EGA_HALF_CLOCK | _EGA_LINE_DOUBLE},
{ 0x004 ,M_CGA4 ,320 ,200 ,40 ,25 ,8 ,8 ,1 ,0xB8000 ,0x4000 ,50 ,449 ,40 ,400 ,_EGA_HALF_CLOCK | _EGA_LINE_DOUBLE},
{ 0x005 ,M_CGA4 ,320 ,200 ,40 ,25 ,8 ,8 ,1 ,0xB8000 ,0x4000 ,50 ,449 ,40 ,400 ,_EGA_HALF_CLOCK | _EGA_LINE_DOUBLE},
{ 0x006 ,M_CGA2 ,640 ,200 ,80 ,25 ,8 ,8 ,1 ,0xB8000 ,0x4000 ,100 ,449 ,80 ,400 ,_EGA_HALF_CLOCK | _EGA_LINE_DOUBLE},
{ 0x007 ,M_TEXT ,720 ,400 ,80 ,25 ,9 ,16 ,8 ,0xB0000 ,0x1000 ,100 ,449 ,80 ,400 ,0 },
{ 0x00D ,M_EGA16 ,320 ,200 ,40 ,25 ,8 ,8 ,8 ,0xA0000 ,0x2000 ,50 ,449 ,40 ,400 ,_EGA_HALF_CLOCK | _EGA_LINE_DOUBLE },
@ -95,6 +95,18 @@ static Bit8u text_palette[64][3]=
{0x15,0x15,0x15},{0x15,0x15,0x3f},{0x15,0x3f,0x15},{0x15,0x3f,0x3f},{0x3f,0x15,0x15},{0x3f,0x15,0x3f},{0x3f,0x3f,0x15},{0x3f,0x3f,0x3f}
};
static Bit8u mtext_palette[64][3]=
{
0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f,
0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00,
0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a, 0x2a,0x2a,0x2a,
0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f, 0x3f,0x3f,0x3f
};
static Bit8u ega_palette[64][3]=
{
{0x00,0x00,0x00}, {0x00,0x00,0x2a}, {0x00,0x2a,0x00}, {0x00,0x2a,0x2a}, {0x2a,0x00,0x00}, {0x2a,0x00,0x2a}, {0x2a,0x15,0x00}, {0x2a,0x2a,0x2a},
@ -210,10 +222,10 @@ static void FinishSetMode(bool clearmem) {
else real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE,CurMode->mode-0x98); //Looks like the s3 bios
real_writew(BIOSMEM_SEG,BIOSMEM_NB_COLS,CurMode->twidth);
real_writew(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE,CurMode->plength);
real_writew(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS,CurMode->mode==7 ? 0x3b4 : 0x3d4);
real_writew(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS,((CurMode->mode==7 )|| (CurMode->mode==0x0f)) ? 0x3b4 : 0x3d4);
real_writeb(BIOSMEM_SEG,BIOSMEM_NB_ROWS,CurMode->theight-1);
real_writew(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT,CurMode->cheight);
real_writeb(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL,(0x60|(clearmem << 7)));
real_writeb(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL,(0x60|(clearmem?0:0x80)));
real_writeb(BIOSMEM_SEG,BIOSMEM_SWITCHES,0x09);
real_writeb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL,real_readb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL)&0x7f);
@ -358,9 +370,13 @@ bool INT10_SetVideoMode_OTHER(Bitu mode,bool clearmem) {
bool INT10_SetVideoMode(Bitu mode) {
bool clearmem=true;Bitu i;
if ((mode<256) && (mode & 128)) {
if (mode>=0x100) {
if (mode & 0x8000) clearmem=false;
mode&=0xfff;
}
if ((mode<0x100) && (mode & 0x80)) {
clearmem=false;
mode-=128;
mode-=0x80;
}
LOG(LOG_INT10,LOG_NORMAL)("Set Video Mode %X",mode);
if (machine!=MCH_VGA) return INT10_SetVideoMode_OTHER(mode,clearmem);
@ -615,7 +631,7 @@ bool INT10_SetVideoMode(Bitu mode) {
misc_control_2=0x0;
break;
}
IO_WriteB(0x3d4,0x67);IO_WriteB(0x3d5,misc_control_2);
IO_WriteB(crtc_base,0x67);IO_WriteB(crtc_base+1,misc_control_2);
/* Write Misc Output */
IO_Write(0x3c2,misc_output);
/* Program Graphics controller */
@ -654,10 +670,26 @@ bool INT10_SetVideoMode(Bitu mode) {
switch (CurMode->type) {
case M_EGA16:
att_data[0x10]=0x01; //Color Graphics
if (CurMode->mode>0xe) goto att_text16;
switch (CurMode->mode) {
case 0x0f:
att_data[0x10]|=0x0a; //Monochrome
att_data[0x01]=0x08;
att_data[0x04]=0x18;
att_data[0x05]=0x18;
att_data[0x09]=0x08;
att_data[0x0d]=0x18;
break;
case 0x11:
for (i=1;i<16;i++) att_data[i]=0x3f;
break;
case 0x10:
case 0x12: goto att_text16;
default:
for (i=0;i<8;i++) {
att_data[i]=i;
att_data[i+8]=i+0x10;
att_data[i]=i;
att_data[i+8]=i+0x10;
}
break;
}
break;
case M_TANDY16:
@ -667,6 +699,7 @@ bool INT10_SetVideoMode(Bitu mode) {
case M_TEXT:
att_data[0x13]=0x08; //Pel panning on 8, although we don't have 9 dot text mode
att_data[0x10]=0x0C; //Color Text with blinking
real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_PAL,0x30);
att_text16:
for (i=0;i<8;i++) {
att_data[i]=i;
@ -709,7 +742,8 @@ att_text16:
IO_Write(0x3c8,0);
switch (CurMode->type) {
case M_EGA16:
if (CurMode->mode>0xe) goto dac_text16;
if (CurMode->mode>0xf) goto dac_text16;
else if (CurMode->mode==0xf) goto dac_mtext16;
for (i=0;i<64;i++) {
IO_Write(0x3c9,ega_palette[i][0]);
IO_Write(0x3c9,ega_palette[i][1]);
@ -726,6 +760,15 @@ att_text16:
}
break;
case M_TEXT:
if (CurMode->mode==7) {
dac_mtext16:
for (i=0;i<64;i++) {
IO_Write(0x3c9,mtext_palette[i][0]);
IO_Write(0x3c9,mtext_palette[i][1]);
IO_Write(0x3c9,mtext_palette[i][2]);
}
break;
}
dac_text16:
for (i=0;i<64;i++) {
IO_Write(0x3c9,text_palette[i][0]);
@ -760,6 +803,12 @@ dac_text16:
break;
case M_TEXT:
feature=(feature&~0x30)|0x20;
switch (CurMode->mode) {
case 0:real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_MSR,0x2c);break;
case 1:real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_MSR,0x28);break;
case 2:real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_MSR,0x2d);break;
case 3:real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_MSR,0x29);break;
}
break;
case M_EGA16:
case M_VGA:
@ -767,7 +816,8 @@ dac_text16:
break;
}
real_writeb(BIOSMEM_SEG,BIOSMEM_INITIAL_MODE,feature);
// disabled, has to be set in bios.cpp exclusively
// real_writeb(BIOSMEM_SEG,BIOSMEM_INITIAL_MODE,feature);
/* Setup the CPU Window */
IO_Write(crtc_base,0x6a);
IO_Write(crtc_base+1,0);
@ -790,6 +840,3 @@ dac_text16:
}
return true;
}

View file

@ -23,6 +23,10 @@
#define ACTL_MAX_REG 0x14
static INLINE void ResetACTL(void) {
IO_Read(real_readw(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS) + 6);
}
void INT10_SetSinglePaletteRegister(Bit8u reg,Bit8u val) {
switch (machine) {
case MCH_TANDY:
@ -32,7 +36,7 @@ void INT10_SetSinglePaletteRegister(Bit8u reg,Bit8u val) {
break;
case MCH_VGA:
if(reg<=ACTL_MAX_REG) {
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,reg);
IO_Write(VGAREG_ACTL_WRITE_DATA,val);
}
@ -43,7 +47,7 @@ void INT10_SetSinglePaletteRegister(Bit8u reg,Bit8u val) {
void INT10_SetOverscanBorderColor(Bit8u val) {
IO_Read(VGAREG_ACTL_RESET);
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
@ -64,7 +68,7 @@ void INT10_SetAllPaletteRegisters(PhysPt data) {
IO_Write(VGAREG_TDY_DATA,mem_readb(data));
break;
case MCH_VGA:
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
// First the colors
for(Bit8u i=0;i<0x10;i++) {
IO_Write(VGAREG_ACTL_ADDRESS,i);
@ -82,14 +86,14 @@ void INT10_SetAllPaletteRegisters(PhysPt data) {
void INT10_ToggleBlinkingBit(Bit8u state) {
Bit8u value;
state&=0x01;
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,0x10);
value=IO_Read(VGAREG_ACTL_READ_DATA);
value&=0xf7;
value|=state<<3;
IO_Read(VGAREG_ACTL_RESET);
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
@ -97,7 +101,7 @@ void INT10_ToggleBlinkingBit(Bit8u state) {
void INT10_GetSinglePaletteRegister(Bit8u reg,Bit8u * val) {
if(reg<=ACTL_MAX_REG) {
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,reg+32);
*val=IO_Read(VGAREG_ACTL_READ_DATA);
IO_Write(VGAREG_ACTL_WRITE_DATA,*val);
@ -105,25 +109,25 @@ void INT10_GetSinglePaletteRegister(Bit8u reg,Bit8u * val) {
}
void INT10_GetOverscanBorderColor(Bit8u * val) {
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,0x11+32);
*val=IO_Read(VGAREG_ACTL_READ_DATA);
IO_Write(VGAREG_ACTL_WRITE_DATA,*val);
}
void INT10_GetAllPaletteRegisters(PhysPt data) {
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
// First the colors
for(Bit8u i=0;i<0x10;i++) {
IO_Write(VGAREG_ACTL_ADDRESS,i);
mem_writeb(data,IO_Read(VGAREG_ACTL_READ_DATA));
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
data++;
}
// Then the border
IO_Write(VGAREG_ACTL_ADDRESS,0x11+32);
mem_writeb(data,IO_Read(VGAREG_ACTL_READ_DATA));
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
}
void INT10_SetSingleDacRegister(Bit8u index,Bit8u red,Bit8u green,Bit8u blue) {
@ -159,7 +163,7 @@ void INT10_GetDACBlock(Bit16u index,Bit16u count,PhysPt data) {
}
void INT10_SelectDACPage(Bit8u function,Bit8u mode) {
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,0x10);
Bit8u old10=IO_Read(VGAREG_ACTL_READ_DATA);
if (!function) { //Select paging mode
@ -178,7 +182,7 @@ void INT10_SelectDACPage(Bit8u function,Bit8u mode) {
}
void INT10_GetDACPage(Bit8u* mode,Bit8u* page) {
IO_Read(VGAREG_ACTL_RESET);
ResetACTL();
IO_Write(VGAREG_ACTL_ADDRESS,0x10);
Bit8u reg10=IO_Read(VGAREG_ACTL_READ_DATA);
IO_Write(VGAREG_ACTL_WRITE_DATA,reg10);

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: int10_vesa.cpp,v 1.16 2005-04-27 18:58:08 qbix79 Exp $ */
/* $Id: int10_vesa.cpp,v 1.17 2005-09-27 11:05:44 c2woody Exp $ */
#include <string.h>
#include <stddef.h>
@ -158,7 +158,7 @@ foundit:
Bit8u VESA_SetSVGAMode(Bit16u mode) {
if (INT10_SetVideoMode(mode & 0xfff)) return 0x00;
if (INT10_SetVideoMode(mode)) return 0x00;
return 0x01;
};