1
0
Fork 0

fix dcc functions

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3010
This commit is contained in:
Sebastian Strohhäcker 2007-10-06 19:46:32 +00:00
parent 3fef357644
commit 53350b35be
2 changed files with 40 additions and 10 deletions

View file

@ -399,15 +399,46 @@ graphics_chars:
break;
case 0x1A: /* Display Combination */
if (!IS_VGA_ARCH) break;
if (reg_al==0) {
reg_bx=real_readb(BIOSMEM_SEG,BIOSMEM_DCC_INDEX);
if (reg_al==0) { // get dcc
// walk the tables...
RealPt vsavept=real_readd(BIOSMEM_SEG,BIOSMEM_VS_POINTER);
RealPt svstable=real_readd(RealSeg(vsavept),RealOff(vsavept)+0x10);
if (svstable) {
RealPt dcctable=real_readd(RealSeg(svstable),RealOff(svstable)+0x02);
Bit8u entries=real_readb(RealSeg(dcctable),RealOff(dcctable)+0x00);
Bit8u idx=real_readb(BIOSMEM_SEG,BIOSMEM_DCC_INDEX);
// check if index within range
if (idx<entries) {
Bit16u dccentry=real_readw(RealSeg(dcctable),RealOff(dcctable)+0x04+idx*2);
if ((dccentry&0xff)==0) reg_bx=dccentry>>8;
else reg_bx=dccentry;
} else reg_bx=0xffff;
} else reg_bx=0xffff;
reg_al=0x1A;
break;
}
if (reg_al==1) {
real_writeb(BIOSMEM_SEG,BIOSMEM_DCC_INDEX,reg_bl);
} else if (reg_al==1) { // set dcc
Bit8u newidx=0xff;
// walk the tables...
RealPt vsavept=real_readd(BIOSMEM_SEG,BIOSMEM_VS_POINTER);
RealPt svstable=real_readd(RealSeg(vsavept),RealOff(vsavept)+0x10);
if (svstable) {
RealPt dcctable=real_readd(RealSeg(svstable),RealOff(svstable)+0x02);
Bit8u entries=real_readb(RealSeg(dcctable),RealOff(dcctable)+0x00);
if (entries) {
Bitu ct;
Bit16u swpidx=reg_bh|(reg_bl<<8);
// search the ddc index in the dcc table
for (ct=0; ct<entries; ct++) {
Bit16u dccentry=real_readw(RealSeg(dcctable),RealOff(dcctable)+0x04+ct*2);
if ((dccentry==reg_bx) || (dccentry==swpidx)) {
newidx=ct;
break;
}
}
}
}
real_writeb(BIOSMEM_SEG,BIOSMEM_DCC_INDEX,newidx);
reg_al=0x1A;
break;
}
break;
case 0x1B: /* functionality State Information */

View file

@ -290,9 +290,8 @@ static void FinishSetMode(bool clearmem) {
real_writeb(BIOSMEM_SEG,BIOSMEM_SWITCHES,0x09);
real_writeb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL,real_readb(BIOSMEM_SEG,BIOSMEM_MODESET_CTL)&0x7f);
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);
// this is an index into the dcc table:
if (IS_VGA_ARCH) real_writeb(BIOSMEM_SEG,BIOSMEM_DCC_INDEX,0x0b);
real_writed(BIOSMEM_SEG,BIOSMEM_VS_POINTER,int10.rom.video_save_pointers);
// Set cursor shape