home *** CD-ROM | disk | FTP | other *** search
- /* Sample program to exercise VGA 640x400 16-color mode page flipping, by
- drawing a horizontal line at the top of page 0 and another at bottom of page 1,
- then flipping between them once every 30 frames.
- Tested with Borland C++ 4.02 in small model by Jim Mischel 12/16/94.
- */
- #include <dos.h>
- #include <conio.h>
-
- #define SCREEN_SEGMENT 0xA000
- #define SCREEN_HEIGHT 400
- #define SCREEN_WIDTH_IN_BYTES 80
- #define INPUT_STATUS_1 0x3DA /* color-mode address of Input Status 1
- register */
- /* The page start addresses must be even multiples of 256, because page
- flipping is performed by changing only the upper start address byte */
- #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(); /* set to 640x400 16-color mode */
-
- /* Point to first line of page 0 and draw a horizontal line across screen */
- FP_SEG(ScreenPtr) = SCREEN_SEGMENT;
- FP_OFF(ScreenPtr) = PAGE_0_START;
- for (i=0; i<(SCREEN_WIDTH_IN_BYTES/2); i++) *ScreenPtr++ = 0xFFFF;
-
- /* Point to last line of page 1 and draw a horizontal line across screen */
- 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;
-
- /* Now flip pages once every 30 frames until a key is pressed */
- do {
- Wait30Frames();
-
- /* Flip to page 1 */
- outpw(0x3D4, 0x0C | ((PAGE_1_START >> 8) << 8));
-
- Wait30Frames();
-
- /* Flip to page 0 */
- outpw(0x3D4, 0x0C | ((PAGE_0_START >> 8) << 8));
- } while (kbhit() == 0);
-
- getch(); /* clear the key press */
-
- /* Return to text mode and exit */
- regset.x.ax = 0x0003; /* AL = 3 selects 80x25 text mode */
- int86(0x10, ®set, ®set);
- }
-
- void Wait30Frames()
- {
- int i;
-
- for (i=0; i<30; i++) {
- /* Wait until we're not in vertical sync, so we can catch leading edge */
- while ((inp(INPUT_STATUS_1) & 0x08) != 0) ;
- /* Wait until we are in vertical sync */
- while ((inp(INPUT_STATUS_1) & 0x08) == 0) ;
- }
- }
-