diff --git a/src/ints/int10.cpp b/src/ints/int10.cpp index 5d653dba..96af9e9b 100644 --- a/src/ints/int10.cpp +++ b/src/ints/int10.cpp @@ -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>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