/* Configure la palette en mode X, selon une organisation RVB générale 2-2-2, avec 64 niveaux distincts de purs rouge, vert, et bleu. Ce qui convient parfaitement aux couleurs pures, mais s'avère médiocre pour les mélanges. ------------------------- |0 0 | Red|Green| Blue | ------------------------- 7 6 5 4 3 2 1 0 ------------------------- |0 1 | Red | ------------------------- 7 6 5 4 3 2 1 0 ------------------------- |1 0 | Green | ------------------------- 7 6 5 4 3 2 1 0 ------------------------- |1 1 | Blue | ------------------------- 7 6 5 4 3 2 1 0 Les couleurs sont corrigées gamma pour un gamma de 2.3 pour donner des progression d'intensité régulière. */ #include #include "polygon.h" static unsigned char Gamma4Levels[] = { 0, 39, 53, 63 }; static unsigned char Gamma64Levels[] = { 0, 10, 14, 17, 19, 21, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, }; static unsigned char PaletteBlock[256][3]; /* 256 entrées RVB */ void InitializePalette() { int Red, Green, Blue, Index; union REGS regset; struct SREGS sregset; for (Red=0; Red<4; Red++) { for (Green=0; Green<4; Green++) { for (Blue=0; Blue<4; Blue++) { Index = (Red<<4)+(Green<<2)+Blue; PaletteBlock[Index][0] = Gamma4Levels[Red]; PaletteBlock[Index][1] = Gamma4Levels[Green]; PaletteBlock[Index][2] = Gamma4Levels[Blue]; } } } for (Red=0; Red<64; Red++) { PaletteBlock[64+Red][0] = Gamma64Levels[Red]; PaletteBlock[64+Red][1] = 0; PaletteBlock[64+Red][2] = 0; } for (Green=0; Green<64; Green++) { PaletteBlock[128+Green][0] = 0; PaletteBlock[128+Green][1] = Gamma64Levels[Green]; PaletteBlock[128+Green][2] = 0; } for (Blue=0; Blue<64; Blue++) { PaletteBlock[192+Blue][0] = 0; PaletteBlock[192+Blue][1] = 0; PaletteBlock[192+Blue][2] = Gamma64Levels[Blue]; } /* A présent configure la palette */ regset.x.ax = 0x1012; /* fonction de paramétrage du bloc de registres du DAC*/ regset.x.bx = 0; /* premier emplacement du DAC à charger */ regset.x.cx = 256; /* nombre d'emplacements du DAC à charger */ regset.x.dx = (unsigned int)PaletteBlock; /* offset du tableau à partir duquel charger les paramètres RVB */ sregset.es = _DS; /* segment du tableau à partir duquel charger les paramètres */ int86x(0x10, ®set, ®set, &sregset); /* charge le bloc de la palette */ }