Fill out VBE2 mode information
Added Pmode interface code Corrected some return codes with far page change function Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1223
This commit is contained in:
parent
7cb8ed12e0
commit
2676825d87
1 changed files with 56 additions and 16 deletions
|
@ -31,6 +31,10 @@ static struct {
|
|||
Bitu setwindow;
|
||||
} callback;
|
||||
|
||||
static char string_oem[]="S3 Incorporated. Trio64";
|
||||
static char string_vendorname[]="DOSBox Development Team";
|
||||
static char string_productname[]="DOSBox - The DOS Emulator";
|
||||
static char string_productrev[]="DOSBox "VERSION;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma pack (1)
|
||||
|
@ -80,7 +84,7 @@ Bit8u VESA_GetSVGAInformation(Bit16u seg,Bit16u off) {
|
|||
/* Fill 256 byte buffer with VESA information */
|
||||
PhysPt buffer=PhysMake(seg,off);
|
||||
Bitu i;
|
||||
bool vbe2=false;
|
||||
bool vbe2=false;Bit16u vbe2_pos=256+off;
|
||||
if (mem_readd(buffer)==0x32454256) vbe2=true;
|
||||
if (vbe2) {
|
||||
for (i=0;i<0x200;i++) mem_writeb(buffer+i,0);
|
||||
|
@ -88,9 +92,22 @@ Bit8u VESA_GetSVGAInformation(Bit16u seg,Bit16u off) {
|
|||
for (i=0;i<0x100;i++) mem_writeb(buffer+i,0);
|
||||
}
|
||||
/* Fill common data */
|
||||
MEM_BlockWrite(buffer,(void *)"VESA",4); //Identification
|
||||
mem_writew(buffer+0x04,0x102); //Vesa version
|
||||
mem_writed(buffer+0x06,int10.rom.oemstring); //Oemstring
|
||||
MEM_BlockWrite(buffer,(void *)"VESA",4); //Identification
|
||||
if (vbe2) {
|
||||
mem_writew(buffer+0x04,0x200); //Vesa version 0x200
|
||||
mem_writed(buffer+0x06,RealMake(seg,vbe2_pos));
|
||||
for (i=0;i<sizeof(string_oem);i++) real_writeb(seg,vbe2_pos++,string_oem[i]);
|
||||
mem_writew(buffer+0x14,0x200); //VBE 2 software revision
|
||||
mem_writed(buffer+0x16,RealMake(seg,vbe2_pos));
|
||||
for (i=0;i<sizeof(string_vendorname);i++) real_writeb(seg,vbe2_pos++,string_vendorname[i]);
|
||||
mem_writed(buffer+0x1a,RealMake(seg,vbe2_pos));
|
||||
for (i=0;i<sizeof(string_productname);i++) real_writeb(seg,vbe2_pos++,string_productname[i]);
|
||||
mem_writed(buffer+0x1e,RealMake(seg,vbe2_pos));
|
||||
for (i=0;i<sizeof(string_productrev);i++) real_writeb(seg,vbe2_pos++,string_productrev[i]);
|
||||
} else {
|
||||
mem_writew(buffer+0x04,0x102); //Vesa version 0x102
|
||||
mem_writed(buffer+0x06,int10.rom.oemstring); //Oemstring
|
||||
}
|
||||
mem_writed(buffer+0x0a,0x0); //Capabilities and flags
|
||||
mem_writed(buffer+0x0e,int10.rom.vesa_modes); //VESA Mode list
|
||||
mem_writew(buffer+0x12,32); //32 64kb blocks for 2 mb memory
|
||||
|
@ -114,12 +131,12 @@ foundit:
|
|||
VideoModeBlock * mblock=&ModeList[i];
|
||||
switch (mblock->type) {
|
||||
case M_LIN8: //Linear 8-bit
|
||||
WLE(minfo.ModeAttributes,0x1b); //No bios output support, although would be easy
|
||||
WLE(minfo.ModeAttributes,0x9b);
|
||||
WLE(minfo.WinAAttributes,0x7); //Exists/readable/writable
|
||||
WLE(minfo.WinGranularity,64);
|
||||
WLE(minfo.WinSize,64);
|
||||
WLE(minfo.WinASegment,0xa000);
|
||||
WLE(minfo.WinBSegment,0xa000);
|
||||
// WLE(minfo.WinBSegment,0xa000);
|
||||
WLE(minfo.WinFuncPtr,CALLBACK_RealPointer(callback.setwindow));
|
||||
WLE(minfo.BytesPerScanLine,mblock->swidth);
|
||||
WLE(minfo.NumberOfPlanes,0x1);
|
||||
|
@ -134,6 +151,8 @@ foundit:
|
|||
WLE(minfo.YResolution,mblock->sheight);
|
||||
WLE(minfo.XCharSize,mblock->cwidth);
|
||||
WLE(minfo.YCharSize,mblock->cheight);
|
||||
WLE(minfo.PhysBasePtr,S3_LFB_BASE);
|
||||
|
||||
MEM_BlockWrite(buf,&minfo,sizeof(MODE_INFO));
|
||||
return 0x00;
|
||||
}
|
||||
|
@ -150,7 +169,7 @@ Bit8u VESA_GetSVGAMode(Bit16u & mode) {
|
|||
}
|
||||
|
||||
Bit8u VESA_SetCPUWindow(Bit8u window,Bit16u address) {
|
||||
//TODO Check with univbe if it doesn't check for window param either
|
||||
if (window) return 0x1;
|
||||
if ((address<32)) {
|
||||
IO_Write(0x3d4,0x6a);
|
||||
IO_Write(0x3d5,(Bit8u)address);
|
||||
|
@ -159,7 +178,7 @@ Bit8u VESA_SetCPUWindow(Bit8u window,Bit16u address) {
|
|||
}
|
||||
|
||||
Bit8u VESA_GetCPUWindow(Bit8u window,Bit16u & address) {
|
||||
//TODO Check with univbe if it doesn't check for window param either
|
||||
if (window) return 0x1;
|
||||
IO_Write(0x3d4,0x6a);
|
||||
address=IO_Read(0x3d5);
|
||||
return 0x0;
|
||||
|
@ -230,12 +249,26 @@ Bit8u VESA_ScanLineLength(Bit8u subcall,Bit16u & bytes,Bit16u & pixels,Bit16u &
|
|||
return 0x0;
|
||||
}
|
||||
|
||||
|
||||
/* Based of the s3 univbe driver */
|
||||
static Bit8u PmodeInterface[]={
|
||||
0x08,0x00,0x19,0x00,0x57,0x00,0x00,0x00,0x50,0x52,0x8b,0xc2,0x8a,0xe0,0xb0,0x6a,
|
||||
0x66,0xba,0xd4,0x03,0x66,0xef,0x5a,0x58,0xc3,0x52,0x66,0xba,0xda,0x03,0xec,0xa8,
|
||||
0x01,0x75,0xfb,0x5a,0x53,0x8a,0xf9,0xb3,0x0d,0xb1,0x0c,0x66,0x8b,0xf2,0x66,0xba,
|
||||
0xd4,0x03,0x66,0x8b,0xc3,0x66,0xef,0x66,0x8b,0xc1,0x66,0xef,0x66,0x8b,0xde,0x8a,
|
||||
0xe3,0xb0,0x69,0x66,0xef,0x5b,0x52,0xf6,0xc3,0x80,0x74,0x09,0x66,0xba,0xda,0x03,
|
||||
0xec,0xa8,0x08,0x74,0xfb,0x5a,0xc3,0xf6,0xc3,0x80,0x74,0x10,0x52,0x66,0xba,0xda,
|
||||
0x03,0xec,0xa8,0x08,0x75,0xfb,0xec,0xa8,0x08,0x74,0xfb,0x5a,0x1e,0x06,0x1f,0x0f,
|
||||
0xb7,0xc9,0x8b,0xc2,0x66,0xba,0xc8,0x03,0xee,0x42,0xfc,0x8a,0x47,0x02,0xee,0x8a,
|
||||
0x47,0x01,0xee,0x8a,0x07,0xee,0x83,0xc7,0x04,0x49,0x75,0xef,0x1f,0xc3
|
||||
};
|
||||
|
||||
Bit8u VESA_SetDisplayStart(Bit16u x,Bit16u y) {
|
||||
//TODO Maybe do things differently with lowres double line modes?
|
||||
Bitu start;
|
||||
switch (CurMode->type) {
|
||||
case M_LIN8:
|
||||
start=vga.config.scan_len*4*y+x;
|
||||
start=vga.config.scan_len*8*y+x;
|
||||
vga.config.display_start=start/4;
|
||||
IO_Read(0x3da);
|
||||
IO_Write(0x3c0,0x13+32);
|
||||
|
@ -248,8 +281,8 @@ Bit8u VESA_SetDisplayStart(Bit16u x,Bit16u y) {
|
|||
}
|
||||
|
||||
Bit8u VESA_GetDisplayStart(Bit16u & x,Bit16u & y) {
|
||||
Bitu times=vga.config.display_start/(vga.config.scan_len*4);
|
||||
Bitu rem=vga.config.display_start % (vga.config.scan_len*4);
|
||||
Bitu times=(vga.config.display_start*4)/(vga.config.scan_len*8);
|
||||
Bitu rem=(vga.config.display_start*4) % (vga.config.scan_len*8);
|
||||
Bitu pan=vga.config.pel_panning;
|
||||
switch (CurMode->type) {
|
||||
case M_LIN8:
|
||||
|
@ -265,11 +298,11 @@ Bit8u VESA_GetDisplayStart(Bit16u & x,Bit16u & y) {
|
|||
}
|
||||
|
||||
|
||||
static char oemstring[]="S3 Incorporated. Trio64";
|
||||
|
||||
static Bitu SetWindowPositionHandler(void) {
|
||||
if (reg_bh) VESA_GetCPUWindow(reg_bl,reg_dx);
|
||||
else VESA_SetCPUWindow(reg_bl,reg_dx);
|
||||
if (reg_bh) reg_ah=VESA_GetCPUWindow(reg_bl,reg_dx);
|
||||
else reg_ah=VESA_SetCPUWindow(reg_bl,reg_dx);
|
||||
reg_al=0x4f;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -290,10 +323,17 @@ void INT10_SetupVESA(void) {
|
|||
phys_writew(PhysMake(0xc000,int10.rom.used),0xffff);
|
||||
int10.rom.used+=2;
|
||||
int10.rom.oemstring=RealMake(0xc000,int10.rom.used);
|
||||
Bitu len=strlen(oemstring)+1;
|
||||
Bitu len=strlen(string_oem)+1;
|
||||
for (i=0;i<len;i++) {
|
||||
phys_writeb(0xc0000+i+int10.rom.used++,oemstring[i]);
|
||||
phys_writeb(0xc0000+i+int10.rom.used++,string_oem[i]);
|
||||
}
|
||||
/* Copy the pmode interface block */
|
||||
int10.rom.pmode_interface=RealMake(0xc000,int10.rom.used);
|
||||
int10.rom.pmode_interface_size=sizeof(PmodeInterface);
|
||||
for (i=0;i<sizeof(PmodeInterface);i++) {
|
||||
phys_writeb(0xc0000+int10.rom.used++,PmodeInterface[i]);
|
||||
}
|
||||
|
||||
callback.setwindow=CALLBACK_Allocate();
|
||||
CALLBACK_Setup(callback.setwindow,SetWindowPositionHandler,CB_RETF);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue