From 53350b35be2053cf2fc86cd22325411f1ac40975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Sat, 6 Oct 2007 19:46:32 +0000 Subject: [PATCH] fix dcc functions Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3010 --- src/ints/int10.cpp | 45 +++++++++++++++++++++++++++++++++------- src/ints/int10_modes.cpp | 5 ++--- 2 files changed, 40 insertions(+), 10 deletions(-) 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