/* Programme pour tester la permutation de pages en mode 640x400 en 16 couleurs du VGA, en affichant une ligne horizontale en haut de la page 0 et une autre en bas de la page 1, puis en les permutant une fois toutes les 30 trames. Testé avec Borland C++ 4.02 en modèle small par Jim Mischel 12/16/94. */ #include #include #define SCREEN_SEGMENT 0xA000 #define SCREEN_HEIGHT 400 #define SCREEN_WIDTH_IN_BYTES 80 #define INPUT_STATUS_1 0x3DA /* adresse du mode de couleur du registre Input Status 1*/ /* Les adresses de départ de la page doivent être des multiples de 256, car la permutation de page est faite en ne changeant que l'octet de poids fort de l'adresse de départ */ #define PAGE_0_START 0 #define PAGE_1_START (400*SCREEN_WIDTH_IN_BYTES) void main(void); void Wait30Frames(void); extern void Set640x400(void); void main() { int i; unsigned int far *ScreenPtr; union REGS regset; Set640x400(); /* paramètre en mode 640x400 en 16 couleurs */ /* Pointe sur la première ligne de la page 0 et affiche une ligne horizontale au travers de l'écran */ FP_SEG(ScreenPtr) = SCREEN_SEGMENT; FP_OFF(ScreenPtr) = PAGE_0_START; for (i=0; i<(SCREEN_WIDTH_IN_BYTES/2); i++) *ScreenPtr++ = 0xFFFF; /* Pointe sur la dernière ligne de la page 1 et affiche une ligne horizontale au travers de l'écran */ FP_OFF(ScreenPtr) = PAGE_1_START + ((SCREEN_HEIGHT-1)*SCREEN_WIDTH_IN_BYTES); for (i=0; i<(SCREEN_WIDTH_IN_BYTES/2); i++) *ScreenPtr++ = 0xFFFF; /* A présent permute les pages une fois toutes les 30 trames jusqu'à une touche clavier */ do { Wait30Frames(); /* Permute à la page 1 */ outpw(0x3D4, 0x0C | ((PAGE_1_START >> 8) << 8)); Wait30Frames(); /* Permute à la page 0 */ outpw(0x3D4, 0x0C | ((PAGE_0_START >> 8) << 8)); } while (kbhit() == 0); getch(); /* Revient en mode texte et quitte */ regset.x.ax = 0x0003; /* AL = 3 sélectionne le mode texte 80x25 */ int86(0x10, ®set, ®set); } void Wait30Frames() { int i; for (i=0; i<30; i++) { /* Attend jusqu'à ce que nous ne soyons plus en vertical sync */ while ((inp(INPUT_STATUS_1) & 0x08) != 0) ; /* Attend jusqu'à ce que nous soyons en vertical sync */ while ((inp(INPUT_STATUS_1) & 0x08) == 0) ; } }