fix dcc functions
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3010
This commit is contained in:
parent
3fef357644
commit
53350b35be
2 changed files with 40 additions and 10 deletions
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue