Use backtick code blocks for syntax highlighting
This commit is contained in:
parent
8ed9dea394
commit
f658bfbb40
203 changed files with 26546 additions and 25801 deletions
142
45-05.md
142
45-05.md
|
|
@ -23,77 +23,79 @@ flipping.
|
|||
|
||||
**LISTING 45.3 L45-3.C**
|
||||
|
||||
/* 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++,
|
||||
in C compilation mode. */
|
||||
```c
|
||||
/* 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++,
|
||||
in C compilation mode. */
|
||||
|
||||
#include <dos.h>
|
||||
#include <conio.h>
|
||||
#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)
|
||||
#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(void);
|
||||
void Wait30Frames(void);
|
||||
extern void Set640x400(void);
|
||||
|
||||
void main()
|
||||
{
|
||||
int i;
|
||||
unsigned int far *ScreenPtr;
|
||||
union REGS regset;
|
||||
void main()
|
||||
{
|
||||
int i;
|
||||
unsigned int far *ScreenPtr;
|
||||
union REGS regset;
|
||||
|
||||
Set640x400(); /* set to 640x400 16-color mode */
|
||||
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 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;
|
||||
/* 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();
|
||||
/* 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));
|
||||
/* Flip to page 1 */
|
||||
outpw(0x3D4, 0x0C | ((PAGE_1_START >> 8) << 8));
|
||||
|
||||
Wait30Frames();
|
||||
Wait30Frames();
|
||||
|
||||
/* Flip to page 0 */
|
||||
outpw(0x3D4, 0x0C | ((PAGE_0_START >> 8) << 8));
|
||||
} while (kbhit() == 0);
|
||||
/* Flip to page 0 */
|
||||
outpw(0x3D4, 0x0C | ((PAGE_0_START >> 8) << 8));
|
||||
} while (kbhit() == 0);
|
||||
|
||||
getch(); /* clear the key press */
|
||||
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);
|
||||
}
|
||||
/* Return to text mode and exit */
|
||||
regset.x.ax = 0x0003; /* AL = 3 selects 80x25 text mode */
|
||||
int86(0x10, ®set, ®set);
|
||||
}
|
||||
|
||||
void Wait30Frames()
|
||||
{
|
||||
int i;
|
||||
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) ;
|
||||
}
|
||||
}
|
||||
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) ;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
After I described 640x400 mode in a magazine article, Bill Lindley, of
|
||||
Mesa, Arizona, wrote me to suggest that when programming the VGA to a
|
||||
|
|
@ -117,19 +119,21 @@ calls down the road.
|
|||
|
||||
**LISTING 45.4 L45-4.C**
|
||||
|
||||
/* Function to tell the BIOS to set up properly sized characters for 25 rows of
|
||||
16 pixel high text in 640x400 graphics mode. Call immediately after mode set.
|
||||
Based on a contribution by Bill Lindley. */
|
||||
```c
|
||||
/* Function to tell the BIOS to set up properly sized characters for 25 rows of
|
||||
16 pixel high text in 640x400 graphics mode. Call immediately after mode set.
|
||||
Based on a contribution by Bill Lindley. */
|
||||
|
||||
#include <dos.h>
|
||||
#include <dos.h>
|
||||
|
||||
void Set640x400()
|
||||
{
|
||||
union REGS regs;
|
||||
void Set640x400()
|
||||
{
|
||||
union REGS regs;
|
||||
|
||||
regs.h.ah = 0x11; /* character generator function */
|
||||
regs.h.al = 0x24; /* use ROM 8x6 character set for graphics */
|
||||
regs.h.bl = 2; /* 25 rows */
|
||||
int86(0x10, ®s, ®s); /* invoke the BIOS video interrupt
|
||||
to set up the text */
|
||||
}
|
||||
regs.h.ah = 0x11; /* character generator function */
|
||||
regs.h.al = 0x24; /* use ROM 8x6 character set for graphics */
|
||||
regs.h.bl = 2; /* 25 rows */
|
||||
int86(0x10, ®s, ®s); /* invoke the BIOS video interrupt
|
||||
to set up the text */
|
||||
}
|
||||
```
|
||||
|
|
|
|||
Loading…
Reference in a new issue