home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Graphics / graphics-16000.iso / msdos / animutil / fastgfx / fg303b / manuals.arj / USER08.DOC < prev    next >
Text File  |  1993-10-02  |  53KB  |  1,184 lines

  1. Chapter 8
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Video Page Management
  8. 150   Fastgraph User's Guide
  9.  
  10. Overview
  11.  
  12.      The amount of memory required to store one full screen of information is
  13. called a video page.  This chapter will discuss video pages in detail, along
  14. with the Fastgraph routines you can use to manage video pages.
  15.  
  16.  
  17. Physical Pages and Virtual Pages
  18.  
  19.      Pages that use the memory that resides on the video adapter are called
  20. physical pages or true pages.  The number of physical pages available depends
  21. on the video mode and the amount of memory resident on the user's video
  22. adapter.  All video modes have at least one physical page.  In certain video
  23. modes, Fastgraph can allocate available random-access memory (RAM) and treat
  24. this memory as a video page.  Pages that use standard RAM in this sense are
  25. called virtual pages.  From a programmer's perspective, virtual pages are
  26. essentially identical to physical pages.
  27.  
  28.      The following table shows the number of physical pages in each video
  29. mode.  It also indicates whether or not specific video modes support virtual
  30. pages.
  31.  
  32.       Mode                                   Page Size Physical  Virtual
  33.      Number    Description                   in Bytes  Pages     Pages
  34.  
  35.         0      40 column color text            2,000        8    no
  36.         1      40 column color text            2,000        8    no
  37.         2      80 column color text            4,000        4    no
  38.         3      80 column color text            4,000        4    no
  39.         4      320x200x4 CGA graphics         16,000        1    yes
  40.         5      320x200x4 CGA graphics         16,000        1    yes
  41.         6      640x200x2 CGA graphics         16,000        1    yes
  42.         7      80 column monochrome text       4,000        1    yes
  43.         9      320x200x16 Tandy graphics      32,000        1    yes
  44.        11      720x348 Hercules graphics      31,320        2    yes
  45.        12      320x200 Hercules graphics      31,320        2    yes
  46.        13      320x200x16 EGA graphics        32,000        8    no
  47.        14      640x200x16 EGA graphics        64,000        4    no
  48.        15      640x350 EGA mono graphics      56,000        2    no
  49.        16      640x350x16 EGA graphics       112,000        2    no
  50.        17      640x480x2 MCGA/VGA graphics    38,400        1+   no
  51.        18      640x480x16 VGA graphics       153,600        1+   no
  52.        19      320x200x256 MCGA graphics      64,000        1    yes
  53.        20      320x200x256 XVGA graphics      64,000        4    no
  54.        21      320x400x256 XVGA graphics     128,000        2    no
  55.        22      320x240x256 XVGA graphics      76,800        3+   no
  56.        23      320x480x256 XVGA graphics     153,600        1+   no
  57.        24      640x400x256 SVGA graphics     256,000        4    no
  58.        25      640x480x256 SVGA graphics     307,200        2    no
  59.        26      800x600x256 SVGA graphics     480,000        2    no
  60.        27      1024x768x256 SVGA graphics    786,432        1+   no
  61.        28      800x600x16 SVGA graphics      240,000        4    no
  62.        29      1024x768x16 SVGA graphics     393,216        2    no
  63.  
  64. This table assumes the video adapter has 256K of video memory installed for
  65. EGA and VGA modes, and 1MB of video memory for SVGA modes.  For adapters with
  66.                                        Chapter 8:  Video Page Management   151
  67.  
  68. less video memory, the number of physical pages is reduced proportionately.
  69. In other words, a 64K EGA has two video pages available instead of eight in
  70. mode 13.  Similarly, a 512K SVGA has one page instead of two in modes 25 and
  71. 26, and wouldn't support mode 27.  The next table summarizes the number of
  72. video pages available in SVGA graphics modes for video cards with 256K, 512K,
  73. 768K, and 1MB of video memory installed.
  74.  
  75.                 Mode                    Number of pages with...
  76.                Number    Resolution     256K 512K  768K 1MB
  77.  
  78.                  24      640x400x256     1+   2     3    4
  79.                  25      640x480x256     0    1+    1+   2
  80.                  26      800x600x256     0    1+    1+   2
  81.                  27      1024x768x256    0    0     1    1+
  82.                  28      800x600x16      1+   2     3    4
  83.                  29      1024x768x16     0    1+    1+   2
  84.  
  85.      In the preceding two tables, note that the number of physical pages in
  86. some video modes is followed by a plus symbol.  In these modes, there is an
  87. additional partial video page available.  For modes 17, 18, and 23, there is
  88. one full page (page 0) plus one partial page of 320 pixel rows (page 1).  For
  89. mode 22, there are three full physical pages (numbered 0 to 2) plus one
  90. partial page of 80 pixel rows (page 3).  For mode 27, there is one full page
  91. (page 0) plus one partial page of 256 pixel rows (page 1) on a 1MB SVGA card.
  92. You can safely use the partial pages as long as you don't reference pixel
  93. rows beyond its last available row.  However, you cannot make a partial video
  94. page the visual page.
  95.  
  96.      In SVGA graphics modes (modes 24 to 29), video pages must begin on 256K
  97. boundaries to maintain compatibility between different SVGA chipsets.  This
  98. results in unused video memory at the end of a page.  For example, pages in
  99. mode 26 require 480,000 bytes of video memory.  On a 1MB SVGA card, the two
  100. pages will begin at 0 and 524,288 (512K). Thus there are 44,288 (524,288
  101. minus 480,000) unused video memory bytes at the end of each page.  With 800
  102. pixels (and hence 800 bytes) per screen row, this means each page has an
  103. extra 55 pixel rows per page.  The actual page size is therefore 800 by 654,
  104. with the first 600 rows being displayed.
  105.  
  106.      Physical pages are numbered starting at zero.  For example, there are
  107. four physical video pages available in mode 3, and they are numbered 0 to 3.
  108. Virtual pages are numbered n to 63, where n is the number of physical pages
  109. in that mode.  For example, there are two physical pages (numbered 0 and 1)
  110. and 62 virtual pages (numbered 2 to 63) in mode 11.  Note only modes 4
  111. through 12 and mode 19 offer virtual pages, and the amount of conventional
  112. memory in the user's system usually limits the number of virtual pages
  113. available (this is especially true in mode 19 because of the large page
  114. size).
  115.  
  116.  
  117. Pages With Special Meanings
  118.  
  119.      There are three video pages that have special meanings to Fastgraph.
  120. The visual page, as one might guess, is the video page currently visible on
  121. the user's display.  The active page is the video page to which Fastgraph
  122. writes text or graphics information.  The hidden page is meaningful only to a
  123. few Fastgraph routines and will be discussed specifically within the context
  124. 152   Fastgraph User's Guide
  125.  
  126. of those routines.  The fg_setmode routine sets all three of these pages to
  127. page 0, and it does not matter if these pages are physical or virtual.
  128.  
  129.      One of the most useful features of multiple video pages (either physical
  130. or virtual) is the ability to build a text or graphics image off screen (that
  131. is, on some video page besides the visual page).  Then, once the image is
  132. ready, we can either transfer it to the visual page, or make the page on
  133. which the image resides the visual page.  This feature is especially useful
  134. in animation, for it displays an image instantaneously instead of visibly
  135. updating the screen while producing the image.
  136.  
  137.  
  138. Some Simple Examples
  139.  
  140.      In this section, we will present six variations of a simple program that
  141. uses four video pages.  The program fills each video page with a rectangle
  142. and then displays text containing the video page number in the center of each
  143. page.  The first two examples run in a specific text or graphics video mode
  144. and only use physical pages.  The next two examples also run in a specific
  145. text or graphics video mode, but they also use virtual pages.  The final two
  146. examples are more general and run in several video modes.  You could of
  147. course write a program that essentially does the same thing as the examples
  148. in this section without using multiple video pages.  However, to use
  149. Fastgraph's image display and animation routines effectively, you must first
  150. understand the concept of video pages.
  151.  
  152.      Before proceeding, we must introduce the Fastgraph routines fg_setpage
  153. and fg_setvpage.  The fg_setpage routine defines the active video page, which
  154. causes Fastgraph to put subsequent text and graphics output on that page.
  155. The fg_setvpage routine defines the visual video page displayed on the
  156. screen.  Both routines take a single integer argument between 0 and 63 that
  157. specifies the video page number.  It does not matter if the referenced video
  158. page is a physical page or a virtual page.  As mentioned earlier, fg_setmode
  159. makes page 0 the active and visual video page.
  160.  
  161.      Example 8-1 uses four video pages (numbered 0 to 3) in the 40-column
  162. color text mode (mode 1).  The program first calls fg_testmode to check the
  163. availability of the requested video mode when used with four video pages.  If
  164. it is available, the program calls fg_setmode to establish that video mode.
  165. The first for loop fills each of the four pages with different color
  166. rectangles and then displays black text containing the video page number in
  167. the center of each page.  It does this by calling fg_setpage to define the
  168. active video page, fg_setcolor and fg_rect to draw the colored rectangles,
  169. and finally fg_setattr, fg_locate, and fg_text to display the text.  The
  170. program must call fg_locate inside the loop because each video page has its
  171. own text cursor position.  The second for loop successively makes each video
  172. page the visual page; the page remains displayed until you press a key.
  173. After displaying all four video pages, the program restores the original
  174. video mode and screen attributes before returning to DOS.
  175.  
  176.                                  Example 8-1.
  177.  
  178.                #include <fastgraf.h>
  179.                #include <stdio.h>
  180.                #include <stdlib.h>
  181.                void main(void);
  182.                                        Chapter 8:  Video Page Management   153
  183.  
  184.                #define PAGES 4
  185.  
  186.                void main()
  187.                {
  188.                   int color;
  189.                   int old_mode;
  190.                   int page;
  191.                   char string[8];
  192.  
  193.                   if (fg_testmode(1,PAGES) == 0) {
  194.                      printf("This program requires color.\n");
  195.                      exit(1);
  196.                      }
  197.  
  198.                   old_mode = fg_getmode();
  199.                   fg_setmode(1);
  200.  
  201.                   for (page = 0; page < PAGES; page++) {
  202.                      fg_setpage(page);
  203.                      color = page + 1;
  204.                      fg_setcolor(color);
  205.                      fg_rect(0,fg_getmaxx(),0,fg_getmaxy());
  206.                      fg_setattr(0,color,0);
  207.                      fg_locate(12,17);
  208.                      sprintf(string,"page %d",page);
  209.                      fg_text(string,6);
  210.                      }
  211.  
  212.                   for (page = 0; page < PAGES; page++) {
  213.                      fg_setvpage(page);
  214.                      fg_waitkey();
  215.                      }
  216.  
  217.                   fg_setmode(old_mode);
  218.                   fg_reset();
  219.                }
  220.  
  221.      Example 8-2 is similar to example 8-1, but it uses the 320 by 200 EGA
  222. graphics mode (mode 13) instead of a text mode.  Note the only real
  223. difference between this program and the text mode version is the use of
  224. fg_setcolor instead of fg_setattr to make the text appear in black.
  225.  
  226.                                  Example 8-2.
  227.  
  228.                #include <fastgraf.h>
  229.                #include <stdio.h>
  230.                #include <stdlib.h>
  231.                void main(void);
  232.  
  233.                #define PAGES 4
  234.  
  235.                void main()
  236.                {
  237.                   int color;
  238.                   int old_mode;
  239.                   int page;
  240. 154   Fastgraph User's Guide
  241.  
  242.                   char string[8];
  243.  
  244.                   if (fg_testmode(13,PAGES) == 0) {
  245.                      printf("This program requires a ");
  246.                      printf("320 x 200 EGA graphics mode.\n");
  247.                      exit(1);
  248.                      }
  249.  
  250.                   old_mode = fg_getmode();
  251.                   fg_setmode(13);
  252.  
  253.                   for (page = 0; page < PAGES; page++) {
  254.                      fg_setpage(page);
  255.                      color = page + 1;
  256.                      fg_setcolor(color);
  257.                      fg_rect(0,fg_getmaxx(),0,fg_getmaxy());
  258.                      fg_setcolor(0);
  259.                      fg_locate(12,17);
  260.                      sprintf(string,"page %d",page);
  261.                      fg_text(string,6);
  262.                      }
  263.  
  264.                   for (page = 0; page < PAGES; page++) {
  265.                      fg_setvpage(page);
  266.                      fg_waitkey();
  267.                      }
  268.  
  269.                   fg_setmode(old_mode);
  270.                   fg_reset();
  271.                }
  272.  
  273.  
  274.      Virtual video pages are created with Fastgraph's fg_allocate routine.
  275. The fg_allocate routine reserves conventional random-access memory (RAM)
  276. which Fastgraph then treats as a video page.  The amount of memory required
  277. depends on the current video mode.  The fg_allocate routine takes a single
  278. integer argument that specifies the page number by which the virtual page
  279. will be referenced.  This value must be between 0 and 63.
  280.  
  281.      If you try to create a virtual page with a page number already assigned
  282. to a physical page, fg_allocate does nothing.  For example, in the Hercules
  283. graphics modes (modes 11 and 12) there are two physical pages numbered 0 and
  284. 1.  Virtual pages in the Hercules graphics modes must thus have page numbers
  285. between 2 and 63.  If you tell fg_allocate to create a Hercules virtual page
  286. numbered 0 or 1, it does nothing because those video pages are physical
  287. pages.  Similarly, if you use the fg_allocate routine in a video mode that
  288. does not support virtual video pages, it simply returns without doing
  289. anything.
  290.  
  291.      A possible problem with fg_allocate can occur when there is not enough
  292. memory available for creating a virtual page in the current video mode.  The
  293. fg_allocate routine returns as its function value a status code indicating
  294. whether or not it was successful.  The possible values of the status code
  295. are:
  296.  
  297.         value  meaning
  298.                                        Chapter 8:  Video Page Management   155
  299.           0    virtual page created
  300.           1    specified page number is a physical page
  301.           7    virtual page created, but memory control blocks were destroyed
  302.           8    insufficient memory to create the virtual page
  303.  
  304. If you use the fg_testmode or fg_bestmode routines to check if the required
  305. number of video pages are available when using the requested video mode, you
  306. should not need to monitor the status code returned by the fg_allocate
  307. routine.
  308.  
  309.      The fg_freepage routine releases the memory for a virtual page created
  310. with fg_allocate.  It requires a single integer argument that identifies the
  311. virtual page number to release.  This value must be between 0 and 63.  If you
  312. try to release a physical video page, or release a virtual page that was
  313. never created, fg_freepage does nothing.  It is a good idea to use
  314. fg_freepage to release all virtual video pages before a program returns
  315. control to DOS, or just before a program selects a new video mode.
  316.  
  317.      Example 8-3 is also similar to example 8-1, but it uses the monochrome
  318. text mode (mode 7).  Because the monochrome text mode only has one physical
  319. video page, we must use virtual video pages for page numbers 1, 2, and 3.
  320. Note how the fg_allocate and fg_freepage routines are used to create and
  321. release the virtual video pages in this example.
  322.  
  323.                                  Example 8-3.
  324.  
  325.              #include <fastgraf.h>
  326.              #include <stdio.h>
  327.              #include <stdlib.h>
  328.              void main(void);
  329.  
  330.              #define PAGES 4
  331.  
  332.              void main()
  333.              {
  334.                 int old_mode;
  335.                 int page;
  336.                 char string[8];
  337.  
  338.                 if (fg_testmode(7,PAGES) == 0) {
  339.                    printf("This program requires monochrome.\n");
  340.                    exit(1);
  341.                    }
  342.  
  343.                 old_mode = fg_getmode();
  344.                 fg_setmode(7);
  345.                 fg_cursor(0);
  346.  
  347.                 for (page = 0; page < PAGES; page++) {
  348.                    fg_allocate(page);
  349.                    fg_setpage(page);
  350.                    fg_setcolor(7);
  351.                    fg_rect(0,fg_getmaxx(),0,fg_getmaxy());
  352.                    fg_setattr(0,7,0);
  353.                    fg_locate(12,37);
  354.                    sprintf(string,"page %d",page);
  355.                    fg_text(string,6);
  356. 156   Fastgraph User's Guide
  357.  
  358.                    }
  359.  
  360.                 for (page = 0; page < PAGES; page++) {
  361.                    fg_setvpage(page);
  362.                    fg_waitkey();
  363.                    fg_freepage(page);
  364.                    }
  365.  
  366.                 fg_setmode(old_mode);
  367.                 fg_reset();
  368.              }
  369.  
  370.      Example 8-4 is similar to example 8-3, but it uses the standard Hercules
  371. graphics mode (mode 11) instead of the monochrome text mode.  Because the
  372. Hercules graphics modes have two physical video pages, we must use virtual
  373. video pages for page numbers 2 and 3.  Note the only real difference between
  374. this program and the text mode version is the use of fg_setcolor instead of
  375. fg_setattr to make the text appear in black.
  376.  
  377.                                  Example 8-4.
  378.  
  379.                #include <fastgraf.h>
  380.                #include <stdio.h>
  381.                #include <stdlib.h>
  382.                void main(void);
  383.  
  384.                #define PAGES 4
  385.  
  386.                void main()
  387.                {
  388.                   int old_mode;
  389.                   int page;
  390.                   char string[8];
  391.  
  392.                   if (fg_testmode(11,PAGES) == 0) {
  393.                      printf("This program requires Hercules ");
  394.                      printf("monochrome graphics.\n");
  395.                      exit(1);
  396.                      }
  397.  
  398.                   old_mode = fg_getmode();
  399.                   fg_setmode(11);
  400.  
  401.                   for (page = 0; page < PAGES; page++) {
  402.                      fg_allocate(page);
  403.                      fg_setpage(page);
  404.                      fg_setcolor(7);
  405.                      fg_rect(0,fg_getmaxx(),0,fg_getmaxy());
  406.                      fg_setcolor(0);
  407.                      fg_locate(12,37);
  408.                      sprintf(string,"page %d",page);
  409.                      fg_text(string,6);
  410.                      }
  411.  
  412.                   for (page = 0; page < PAGES; page++) {
  413.                      fg_setvpage(page);
  414.                                        Chapter 8:  Video Page Management   157
  415.  
  416.                      fg_waitkey();
  417.                      fg_freepage(page);
  418.                      }
  419.  
  420.                   fg_setmode(old_mode);
  421.                   fg_reset();
  422.                }
  423.  
  424.      Example 8-5 is a generalized version of examples 8-1 and 8-3 that runs
  425. in any 80-column text video mode.  To simplify the program, each video page
  426. is filled with rectangles of the same color.  Note that fg_allocate and
  427. fg_freepage are used to manage the virtual video pages in case fg_bestmode
  428. selects the monochrome text mode (mode 7).  If fg_bestmode selects one of the
  429. 80-column color text modes (which have four physical video pages),
  430. fg_allocate and fg_freepage will simply return without doing anything.
  431.  
  432.                                  Example 8-5.
  433.  
  434.                 #include <fastgraf.h>
  435.                 #include <stdio.h>
  436.                 #include <stdlib.h>
  437.                 void main(void);
  438.  
  439.                 #define PAGES 4
  440.  
  441.                 void main()
  442.                 {
  443.                    int old_mode, new_mode;
  444.                    int page;
  445.                    char string[8];
  446.  
  447.                    new_mode = fg_bestmode(80,25,PAGES);
  448.                    if (new_mode < 0) {
  449.                       printf("This program requires ");
  450.                       printf("an 80-column display.\n");
  451.                       exit(1);
  452.                       }
  453.  
  454.                    old_mode = fg_getmode();
  455.                    fg_setmode(new_mode);
  456.                    fg_cursor(0);
  457.  
  458.                    for (page = 0; page < PAGES; page++) {
  459.                       fg_allocate(page);
  460.                       fg_setpage(page);
  461.                       fg_setcolor(7);
  462.                       fg_rect(0,fg_getmaxx(),0,fg_getmaxy());
  463.                       fg_setattr(0,7,0);
  464.                       fg_locate(12,37);
  465.                       sprintf(string,"page %d",page);
  466.                       fg_text(string,6);
  467.                       }
  468.  
  469.                    for (page = 0; page < PAGES; page++) {
  470.                       fg_setvpage(page);
  471.                       fg_waitkey();
  472. 158   Fastgraph User's Guide
  473.  
  474.                       fg_freepage(page);
  475.                       }
  476.  
  477.                    fg_setmode(old_mode);
  478.                    fg_reset();
  479.                 }
  480.  
  481.      Example 8-6 is a generalized version of examples 8-2 and 8-4 that runs
  482. in any 320 by 200 graphics video mode.  To simplify the program, each video
  483. page is filled with rectangles of the same color.  As in example 8-5,
  484. fg_allocate and fg_freepage are used to manage the virtual video pages in
  485. case fg_bestmode selects a video mode with fewer than four physical video
  486. pages.  Note the only real difference between this program and the text mode
  487. version is the use of fg_setcolor instead of fg_setattr to make the text
  488. appear in black.
  489.  
  490.                                  Example 8-6.
  491.  
  492.                 #include <fastgraf.h>
  493.                 #include <stdio.h>
  494.                 #include <stdlib.h>
  495.                 void main(void);
  496.  
  497.                 #define PAGES 4
  498.  
  499.                 void main()
  500.                 {
  501.                    int old_mode, new_mode;
  502.                    int page;
  503.                    char string[8];
  504.  
  505.                    new_mode = fg_bestmode(320,200,PAGES);
  506.                    if (new_mode < 0) {
  507.                       printf("This program requires a ");
  508.                       printf("320 x 200 graphics mode.\n");
  509.                       exit(1);
  510.                       }
  511.  
  512.                    old_mode = fg_getmode();
  513.                    fg_setmode(new_mode);
  514.  
  515.                    for (page = 0; page < PAGES; page++) {
  516.                       fg_allocate(page);
  517.                       fg_setpage(page);
  518.                       fg_setcolor(15);
  519.                       fg_rect(0,fg_getmaxx(),0,fg_getmaxy());
  520.                       fg_setcolor(0);
  521.                       fg_locate(12,17);
  522.                       sprintf(string,"page %d",page);
  523.                       fg_text(string,6);
  524.                       }
  525.  
  526.                    for (page = 0; page < PAGES; page++) {
  527.                       fg_setvpage(page);
  528.                       fg_waitkey();
  529.                       fg_freepage(page);
  530.                                        Chapter 8:  Video Page Management   159
  531.  
  532.                       }
  533.  
  534.                    fg_setmode(old_mode);
  535.                    fg_reset();
  536.                 }
  537.  
  538.  
  539. Text Cursors
  540.  
  541.      As mentioned in the previous chapter, Fastgraph draws hardware
  542. characters at the position defined by the text cursor.  Like the graphics
  543. cursor, the text cursor is not a cursor in the true sense, but is simply a
  544. pair of character space (row,column) coordinates with a special meaning.  The
  545. first 8 video pages (that is, pages 0 through 7) each have their own text
  546. cursor.  Each subsequent group of 8 video pages (pages 8 through 15, pages 16
  547. to 23, and so forth) respectively share the same text cursor positions as the
  548. first 8 pages.  This means the fg_locate routine will update one of 8
  549. different text cursors depending on the active video page.  Similarly, the
  550. fg_where routine returns the text cursor position for the active page.  The
  551. fg_setmode routine sets all 8 text cursor positions to the character space
  552. coordinates (0,0).
  553.  
  554.      Example 8-7 demonstrates the use of different text cursors in an 80-
  555. column color text mode (mode 3).  The program first displays the text "Page "
  556. on video page 0 (the visible page) and waits for a keystroke.  It then makes
  557. page 1 the active video page, changes the text cursor location for that page,
  558. and displays the text "Page 1" on video page 1.  Next, it appends the
  559. character "0" to the text originally displayed on page 0.  Note it is not
  560. necessary to restore the text cursor position for page 0 because it is
  561. unaffected by changing the text cursor for page 1.  After waiting for another
  562. keystroke, the program makes video page 1 the visual page and then waits for
  563. yet another keystroke before returning to DOS.
  564.  
  565.                                  Example 8-7.
  566.  
  567.                          #include <fastgraf.h>
  568.                          void main(void);
  569.  
  570.                          void main()
  571.                          {
  572.                             int old_mode;
  573.  
  574.                             old_mode = fg_getmode();
  575.                             fg_setmode(3);
  576.                             fg_cursor(0);
  577.                             fg_setattr(10,0,0);
  578.  
  579.                             fg_locate(1,0);
  580.                             fg_text("Page ",5);
  581.                             fg_waitkey();
  582.  
  583.                             fg_setpage(1);
  584.                             fg_locate(23,0);
  585.                             fg_text("Page 1",6);
  586.  
  587.                             fg_setpage(0);
  588. 160   Fastgraph User's Guide
  589.  
  590.                             fg_text("0",1);
  591.                             fg_waitkey();
  592.  
  593.                             fg_setvpage(1);
  594.                             fg_waitkey();
  595.  
  596.                             fg_setmode(old_mode);
  597.                             fg_reset();
  598.                          }
  599.  
  600.  
  601. Obtaining Video Page Information
  602.  
  603.      Fastgraph includes two routines, fg_getpage and fg_getvpage, that
  604. respectively return the current active or visual video page number.  Each
  605. routine returns the video page number as its function value, and neither
  606. routine requires any arguments.
  607.  
  608.      The fg_getaddr routine is sometimes useful when using virtual pages.  It
  609. returns as its function value the segment address for the start of the active
  610. video page.  It does not require any arguments.  Although fg_getaddr is more
  611. useful when using virtual video pages, it works equally well when using
  612. physical video pages.
  613.  
  614.      Example 8-8 illustrates the use of the fg_getpage, fg_getvpage, and
  615. fg_getaddr routines in the standard CGA color graphics mode (mode 4).  This
  616. video mode offers only one physical page, so the program uses fg_allocate to
  617. create a virtual video page (page 1).  After creating the virtual page, the
  618. program makes it the active video page; page 0 remains the visual video page.
  619. The fg_getpage routine then returns the active page number (1), followed by a
  620. call to fg_getvpage to return the visual page number (0).  Next, the program
  621. uses fg_getaddr to return the segment address for video pages 0 and 1.
  622. Finally, it restores the original video mode and screen attributes, displays
  623. the returned values, and returns to DOS.
  624.  
  625.                                  Example 8-8.
  626.  
  627.                  #include <fastgraf.h>
  628.                  #include <stdio.h>
  629.                  void main(void);
  630.  
  631.                  void main()
  632.                  {
  633.                     int old_mode;
  634.                     int active, visual;
  635.                     int page0, page1;
  636.  
  637.                     old_mode = fg_getmode();
  638.                     fg_setmode(4);
  639.                     fg_allocate(1);
  640.                     fg_setpage(1);
  641.  
  642.                     active = fg_getpage();
  643.                     visual = fg_getvpage();
  644.  
  645.                     fg_setpage(0);
  646.                                        Chapter 8:  Video Page Management   161
  647.  
  648.                     page0 = fg_getaddr();
  649.                     fg_setpage(1);
  650.                     page1 = fg_getaddr();
  651.  
  652.                     fg_freepage(1);
  653.                     fg_setmode(old_mode);
  654.                     fg_reset();
  655.  
  656.                     printf("Active page is %d.\n",active);
  657.                     printf("Visual page is %d.\n",visual);
  658.                     printf("Page 0 address is %4X\n",page0);
  659.                     printf("Page 1 address is %4X\n",page1);
  660.                  }
  661.  
  662.  
  663. Considerations for Virtual Pages
  664.  
  665.      If you're using Power C, QuickBASIC, Visual Basic, Borland Pascal, or
  666. Turbo Pascal and need to create virtual pages, you must reduce the size of
  667. the far heap.  Normally, these compilers allocate all remaining memory for
  668. the heap, which means fg_allocate will not be able to allocate memory for the
  669. virtual page.
  670.      In QuickBASIC and Visual Basic programs, the SETMEM function reduces the
  671. size of the far heap.  The BASIC versions of the Fastgraph example programs
  672. include the statement
  673.  
  674.                           SetMemStatus& = SETMEM(-n)
  675.  
  676. before calling FGallocate.  This reduces the size of the far heap by n bytes.
  677. For a given video mode, the actual reduction needed is the number of virtual
  678. pages multiplied by the page size in that mode.  Page sizes are listed at the
  679. beginning of this chapter, or you can use fg_pagesize to determine the page
  680. size for the current video mode.
  681.  
  682.      In Borland Pascal and Turbo Pascal, the $M compiler directive defines
  683. the maximum heap size in bytes.  The Pascal versions of the Fastgraph example
  684. programs include the statement
  685.  
  686.                               {$M 16384,0,16384}
  687.  
  688. at the beginning of the examples that call fg_allocate.  The third value in
  689. this list defines the maximum heap size at 16K bytes.  This is suitable for
  690. most applications, but if your program uses the New or GetMem procedures to
  691. create dynamic variables that require more heap space, you'll need to
  692. increase the size beyond 16K.
  693.  
  694.      The far heap size for Power C programs is defined at link time.  You
  695. must override the default heap size by including the option [,,16K] on the
  696. PCL command when you link a Power C program that uses fg_allocate.  The value
  697. 16K is suitable for most applications, but if your program calls the
  698. farcalloc or farmalloc functions (or the calloc or malloc functions when
  699. using the large memory model), you may need to increase the far heap size
  700. beyond 16K.
  701.  
  702.      When you are using virtual pages, you should avoid using the fg_setvpage
  703. routine in sections of the program that require fast screen updates or
  704. 162   Fastgraph User's Guide
  705. animation sequences.  This is because the PC and PS/2 video BIOS are only
  706. capable of displaying physical pages.  To compensate for this restriction,
  707. Fastgraph exchanges the contents of a physical page with the requested
  708. virtual page.  In other words, if page 1 is a virtual page and you make it
  709. the visual page, Fastgraph will exchange the contents of page 1 with whatever
  710. page was previously the visual page.  This does not mean Fastgraph's page
  711. numbers change because Fastgraph also maintains an internal table containing
  712. video page addresses and exchanges the two corresponding table entries.  As
  713. before, you would make page 1 the active video page if you wanted to write
  714. something to the visual page.
  715.  
  716.      About the only other potential problem when using virtual pages is what
  717. happens when you try to write to a non-existent video page (for example, if
  718. you write to virtual video page 1 before creating it with fg_allocate).  In
  719. this case, Fastgraph simply redirects the video output to the visual page.
  720.  
  721.  
  722. Logical Pages
  723.  
  724.      In addition to physical and virtual video pages, Fastgraph offers
  725. another class of video pages, called logical pages.  You can create logical
  726. pages in any video mode.  They can exist in conventional memory, expanded
  727. memory (EMS), or extended memory (XMS).  However, they are not as versatile
  728. as physical or virtual pages because the only operations you can perform with
  729. logical pages are:
  730.  
  731.        Copy an entire physical or virtual page to a logical page
  732.        Copy an entire logical page to a physical or virtual page
  733.        Copy an entire logical page to another logical page
  734.  
  735. Three Fastgraph routines -- fg_alloccms, fg_allocems, and fg_allocxms --
  736. create logical pages in conventional memory, expanded memory, and extended
  737. memory, respectively.  All three routines have a single integer argument that
  738. specifies the page number by which the logical page will be referenced.  The
  739. page number must be between 1 and 63 and must not reference a physical or
  740. virtual page.  Their return value is 0 if the logical page is created, and
  741. negative otherwise (refer to the descriptions of these routines in the
  742. Fastgraph Reference Manual for a complete list of return values).  As with
  743. virtual pages, use the fg_freepage function to release a logical page.
  744.  
  745.      Before you can create logical pages in expanded or extended memory, you
  746. must initialize these resources for use with Fastgraph.  The fg_initems
  747. routine initializes expanded memory.  To use expanded memory, you must have
  748. an Expanded Memory Manager (EMM) that conforms to the Lotus/Intel/Microsoft
  749. Expanded Memory Specification (LIM-EMS) version 3.2 or later.  On 80386 and
  750. 80486 systems, the EMM386.EXE device driver supplied with DOS 5.0 can be used
  751. to treat some or all of extended memory as expanded memory.  The fg_initxms
  752. routine initializes extended memory for use with Fastgraph.  To use extended
  753. memory, you must have an XMS driver that conforms to the
  754. Lotus/Intel/Microsoft/AST eXtended Memory Specification version 2.0 or later,
  755. such as HIMEM.SYS.  XMS drivers require an 80286, 80386, or 80486 system.
  756. The fg_initems and fg_initxms routines have no arguments.  Their return value
  757. is 0 if successful, and -1 if the required driver and resources are not
  758. present.
  759.  
  760.      Example 8-9 illustrates the use of logical pages in a 320 by 200 color
  761. graphics mode.  The program first tries to create a logical page in extended
  762.                                        Chapter 8:  Video Page Management   163
  763. memory by calling fg_initxms and fg_allocxms.  If the initialization or page
  764. creation fails, it then tries to create the page in expanded memory with
  765. fg_initems and fg_allocems.  Should that fail, the program calls fg_alloccms
  766. to try to create the page in conventional memory.  If it can't create the
  767. logical page at all, the program displays an error message and exits.
  768.  
  769.      Once the logical page is created, example 8-9 displays the word "test"
  770. in the middle of the visual page (page 0) and then uses fg_copypage to
  771. transfer the visual page contents to the logical page (page 8).  Because this
  772. program runs in one of several different graphics modes, we must use a
  773. logical page number greater than any possible physical page number.  We chose
  774. page 8 because mode 13 has physical pages numbered 0 through 7, and no mode
  775. has higher-numbered physical pages.  After waiting for a keystroke, the
  776. program erases the visual page, waits for another keystroke, and copies the
  777. logical page contents back to the visual page.  It then releases the logical
  778. page and exits.
  779.  
  780.                                  Example 8-9.
  781.  
  782.               #include <fastgraf.h>
  783.               #include <stdio.h>
  784.               #include <stdlib.h>
  785.               void main(void);
  786.  
  787.               void main()
  788.               {
  789.                  int new_mode, old_mode;
  790.                  int status;
  791.  
  792.                  new_mode = fg_bestmode(320,200,1);
  793.                  if (new_mode < 0 || new_mode == 12) {
  794.                     printf("This program requires a 320 ");
  795.                     printf("x 200 color graphics mode.\n");
  796.                     exit(1);
  797.                     }
  798.                  old_mode = fg_getmode();
  799.                  fg_setmode(new_mode);
  800.  
  801.                  status = fg_initxms();
  802.                  if (status == 0) status = fg_allocxms(8);
  803.                  if (status < 0) {
  804.                     status = fg_initems();
  805.                     if (status == 0) status = fg_allocems(8);
  806.                     }
  807.                  if (status < 0) status = fg_alloccms(8);
  808.  
  809.                  if (status < 0) {
  810.                     fg_setmode(old_mode);
  811.                     fg_reset();
  812.                     printf("Unable to create logical page.\n");
  813.                     exit(1);
  814.                     }
  815.  
  816.                  fg_setcolor(7);
  817.                  fg_rect(0,319,0,199);
  818.                  fg_setcolor(9);
  819.                  fg_locate(12,18);
  820. 164   Fastgraph User's Guide
  821.  
  822.                  fg_text("test",4);
  823.                  fg_waitkey();
  824.  
  825.                  fg_copypage(0,8);
  826.                  fg_erase();
  827.                  fg_waitkey();
  828.  
  829.                  fg_copypage(8,0);
  830.                  fg_waitkey();
  831.  
  832.                  fg_freepage(8);
  833.                  fg_setmode(old_mode);
  834.                  fg_reset();
  835.               }
  836.  
  837.      As mentioned before, the only function you can perform with logical
  838. pages is copying one video page to another.  The fg_copypage routine provides
  839. the only way to do this for logical pages.  See Chapter 11 for more
  840. information about fg_copypage.
  841.  
  842.  
  843. Video Page Resizing
  844.  
  845.      Resizing is the process of changing the dimensions of a video page.  It
  846. is available only in the native EGA graphics modes (modes 13 to 16), native
  847. VGA graphics modes (17 and 18), extended VGA modes (20 to 23), and SVGA modes
  848. (24 to 29).  Resizing does not change the screen resolution, but instead
  849. increases the video page size so that only part of the page is visible.  For
  850. now, we'll just introduce resizing with a simple example, but in Chapter 13
  851. we'll see its real power when we perform smooth panning.
  852.  
  853.      The Fastgraph routine fg_resize changes the dimensions of a video page.
  854. Its two integer arguments define the page width and page height, both in
  855. pixels.  Example 8-10 runs in the 320 by 200 EGA graphics mode (mode 13).
  856. After establishing the video mode, it displays the word "resize" starting in
  857. column 38 of row 0.  Because the characters extend beyond the last column of
  858. the row, they wrap to the next row.  The program continues displaying this
  859. until you press a key.  Then, it clears the screen and calls fg_resize to
  860. make the page size 640 by 200 pixels.  Again the program displays the word
  861. "resize" starting in column 38 of row 0, but this time it does not wrap to
  862. the next row.  This is because the resizing doubled the page width, which
  863. increased the number of character cells per row from 40 to 80.  The
  864. characters that formerly wrapped to the next row now continue on an off-
  865. screen portion of the same row.
  866.  
  867.                                 Example 8-10.
  868.  
  869.                 #include <fastgraf.h>
  870.                 #include <stdio.h>
  871.                 #include <stdlib.h>
  872.                 void main(void);
  873.  
  874.                 void main()
  875.                 {
  876.                    int old_mode;
  877.  
  878.                                        Chapter 8:  Video Page Management   165
  879.  
  880.                    if (fg_testmode(13,1) == 0) {
  881.                       printf("This program requires a 320 ");
  882.                       printf("x 200 EGA graphics mode.\n");
  883.                       exit(1);
  884.                       }
  885.  
  886.                    old_mode = fg_getmode();
  887.                    fg_setmode(13);
  888.  
  889.                    fg_setcolor(9);
  890.                    fg_locate(0,38);
  891.                    fg_text("resize",6);
  892.                    fg_waitkey();
  893.  
  894.                    fg_erase();
  895.                    fg_resize(640,200);
  896.                    fg_setcolor(10);
  897.                    fg_locate(0,38);
  898.                    fg_text("resize",6);
  899.                    fg_waitkey();
  900.  
  901.                    fg_setmode(old_mode);
  902.                    fg_reset();
  903.                 }
  904.  
  905.  
  906.      The size of a video page is constrained only by the amount of video
  907. memory available.  Increasing the video page size reduces the number of
  908. physical pages available proportionally.  In mode 13, for example, increasing
  909. the page size from 320 by 200 to 640 by 400 reduces the number of video pages
  910. from 8 to 2.  When you call fg_resize, the visual page must be page 0.  If
  911. you have created any logical video pages, you must release them with
  912. fg_freepage before calling fg_resize, and then create them again afterward.
  913. If you have initialized the mouse (with fg_mouseini), joysticks (with
  914. fg_initjoy), expanded memory (with fg_initems), or extended memory (with
  915. fg_initxms), you should re-initialize these resources after calling
  916. fg_resize.  Most mouse drivers expect a fixed video page width, so the mouse
  917. cursor may become distorted after resizing video pages.  When you call
  918. fg_resize, Fastgraph sets the clipping region to the new page limits.  The
  919. fg_setmode routine re-establishes the dimensions of a video page to the
  920. default screen resolution for the selected video mode.
  921.  
  922.       Depending on the dimensions passed to fg_resize, you may end up with a
  923. partial video page.  Again, suppose we're using mode 13 and have changed the
  924. page size to 960 by 400 (this is six times the default page size).  The
  925. original pages 0 to 5 now comprise page 0, and original pages 6 and 7 now
  926. comprise page 1.  However, there is not enough video memory left on page 1
  927. for a full 960 by 400 page.  In this case, the number of pixel rows available
  928. on page 1 would be one-third the full page size, or 133 rows.  This is
  929. because the total storage required by original pages 6 and 7 is one-third the
  930. total required for original pages 0 through 5.
  931. 166   Fastgraph User's Guide
  932.  
  933.  
  934. Preserving Video Page Contents Across Mode Switches
  935.  
  936.      Sometimes a graphics program may temporarily need to switch to another
  937. video mode.  An example of this might be a graphical user interface (GUI)
  938. menuing system that includes "shell to DOS" as one of its options.  When the
  939. user selects this option, the program must revert to a text video mode so the
  940. user will see the familiar DOS prompt when the shell executes.  On leaving
  941. the DOS shell, the program returns to a graphics mode and should ideally
  942. restore the screen to what it was originally.
  943.  
  944.      When you establish a video mode with fg_setmode, Fastgraph clears all
  945. physical video pages and initializes its internal page tables as if no
  946. virtual or logical pages have been created.  While it's not possible to
  947. preserve physical page contents across video mode switches, you can use
  948. Fastgraph's fg_getentry and fg_setentry routines to save virtual or logical
  949. page contents.  The trick, so to speak, is using fg_getentry to save the
  950. virtual or logical page address and type before switching video modes.  Then,
  951. when you return to the same video mode, you can use fg_setentry to restore
  952. the internal page tables to their previous state.  This effectively makes the
  953. virtual or logical page accessible again.
  954.  
  955.      Example 8-11 illustrates this process.  This program runs in video mode
  956. 18, the 640 by 480 16-color VGA graphics mode.  After establishing this video
  957. mode, the program calls fg_alloccms to create a logical page in conventional
  958. memory (we chose page 2 because this is the first page number available for
  959. logical pages in mode 18).  Next, it calls fg_getentry to save the address
  960. and type of the logical page just created.  The first argument to fg_getentry
  961. specifies the page number; the next two arguments receive the page address
  962. and type.  Page type codes used by fg_getentry and fg_setentry are as
  963. follows:
  964.  
  965.      0 = unallocated page
  966.      1 = physical page
  967.      2 = virtual page
  968.      3 = logical page in expanded memory (EMS)
  969.      4 = logical page in extended memory (XMS)
  970.      5 = logical page in conventional memory
  971.  
  972.      After this setup work, example 8-11 fills the screen with light blue
  973. pixels, draws a white box around the edge, and then waits for a keystroke.
  974. Before switching back to the original video mode (assumed to be mode 3), the
  975. program uses fg_copypage to copy the visual page contents to the logical
  976. page.  This is necessary because we can only save virtual or logical page
  977. contents across video mode changes, not physical pages.  In mode 3, the
  978. program prompts for a keystroke before returning to mode 18.
  979.  
  980.      Now we're ready to restore the previous contents of the visual page.
  981. Because the example program did not release the logical page, the memory is
  982. still allocated; Fastgraph just cannot access it.  To solve this, the program
  983. calls fg_setentry to restore Fastgraph's internal page table entries for page
  984. 2 to what they were previously.  Note how we use the same page address and
  985. type values in the call to fg_setentry that were returned earlier by
  986. fg_getentry.  Now that the logical page (page 2) is once again accessible,
  987. the program can use fg_copypage to copy its contents back to the visual page.
  988. With that explanation behind us, here is example 8-11.
  989.                                        Chapter 8:  Video Page Management   167
  990.  
  991.                                 Example 8-11.
  992.  
  993.                    #include <fastgraf.h>
  994.                    void main(void);
  995.  
  996.                    void main()
  997.                    {
  998.                       int old_mode;
  999.                       int page_addr, page_type;
  1000.  
  1001.                       old_mode = fg_getmode();
  1002.                       fg_setmode(18);
  1003.                       fg_alloccms(2);
  1004.                       fg_getentry(2,&page_addr,&page_type);
  1005.  
  1006.                       fg_setcolor(9);
  1007.                       fg_fillpage();
  1008.                       fg_setcolor(15);
  1009.                       fg_box(0,639,0,479);
  1010.                       fg_waitkey();
  1011.  
  1012.                       fg_copypage(0,2);
  1013.                       fg_setmode(old_mode);
  1014.                       fg_cursor(0);
  1015.                       fg_setcolor(15);
  1016.                       fg_text("Press any key.",14);
  1017.                       fg_waitkey();
  1018.  
  1019.                       fg_setmode(18);
  1020.                       fg_setentry(2,page_addr,page_type);
  1021.                       fg_copypage(2,0);
  1022.                       fg_waitkey();
  1023.  
  1024.                       fg_freepage(2);
  1025.                       fg_setmode(old_mode);
  1026.                       fg_reset();
  1027.                    }
  1028.  
  1029.  
  1030.      To keep the example as simple as possible, it does not test for
  1031. availability of video modes, nor does it check if the logical page creation
  1032. was successful.  In a real application, of course, omitting these checks is
  1033. not recommended.
  1034.  
  1035.  
  1036. Controlling Page Allocation
  1037.  
  1038.      When Fastgraph creates virtual or logical pages in conventional memory
  1039. with fg_allocate or fg_alloccms, it uses the DOS allocate memory service
  1040. (function 48 hex of interrupt 21 hex).  Some compilers allocate all or part
  1041. of available conventional memory to a data structure called the heap or far
  1042. heap.  Memory allocation functions such as malloc handle their requests
  1043. through an associated heap manager instead of through DOS services.  If the
  1044. heap manager controls all available memory, the DOS allocate memory service
  1045. is essentially disabled because there will be no memory available to satisfy
  1046. allocation requests.  If the heap manager controls some but not all available
  1047. 168   Fastgraph User's Guide
  1048. memory, a conflict may arise between the heap manager and the DOS allocate
  1049. memory service.
  1050.  
  1051.      To solve this problem, you can use the compiler's allocate far memory
  1052. function to reserve memory for the virtual or logical page and then make the
  1053. page known to Fastgraph with fg_setentry.  The easiest way to determine the
  1054. amount of memory to allocate is through the fg_pagesize function, which
  1055. returns the page size in bytes (as a long integer) for the current video
  1056. mode.  To release the page, use fg_setentry with a page type of zero to mark
  1057. the page as unallocated before actually freeing the memory.  Pages created
  1058. this way are not initially cleared because the allocated memory block
  1059. contents are undefined.  We recommend using fg_erase to set the page contents
  1060. to the background color.
  1061.  
  1062.      Example 8-12 shows how to create a virtual page using these techniques
  1063. instead of fg_allocate.  It uses the farmalloc and farfree functions from the
  1064. C run-time library for Borland compilers (the analogous Microsoft functions
  1065. are _fmalloc and _ffree).  Example 8-12 uses fg_pagesize and the Borland run-
  1066. time library function farmalloc to create a virtual page in the 320 by 200
  1067. VGA/MCGA 256-color graphics mode.  After allocating the memory, the program
  1068. calls fg_setentry, passing it the page number (1), the segment portion of the
  1069. memory block address (using the FP_SEG macro from the run-time library), and
  1070. the code for a virtual page (2).  Once the virtual page is set up, the
  1071. program writes some text on the virtual page and then uses fg_copypage to
  1072. display the virtual page contents on the visual page.  Finally, it releases
  1073. the page by calling fg_setentry (so Fastgraph knows the virtual page is gone)
  1074. and the farfree run-time library function (to actually free the memory).  The
  1075. call to fg_setentry is not really needed in this instance because no further
  1076. references are made to page 1.
  1077.  
  1078.                                 Example 8-12.
  1079.  
  1080.            #include <fastgraf.h>
  1081.            #include <dos.h>
  1082.            #ifdef __TURBOC__
  1083.            #include <alloc.h>
  1084.            #else
  1085.            #include <malloc.h>
  1086.            #define  farfree(p)   _ffree(p)
  1087.            #define  farmalloc(n) _fmalloc(n)
  1088.            #endif
  1089.            void main(void);
  1090.  
  1091.            void main()
  1092.            {
  1093.               int old_mode;
  1094.               unsigned page_addr;
  1095.               char far *buffer;
  1096.  
  1097.               old_mode = fg_getmode();
  1098.               fg_setmode(19);
  1099.               buffer = farmalloc(fg_pagesize()+16);
  1100.               page_addr = FP_SEG(buffer) + (FP_OFF(buffer)+15)/16;
  1101.               fg_setentry(1,page_addr,2);
  1102.  
  1103.               fg_setpage(1);
  1104.               fg_erase();
  1105.                                        Chapter 8:  Video Page Management   169
  1106.  
  1107.               fg_setcolor(9);
  1108.               fg_text("This is page 1.",15);
  1109.               fg_waitkey();
  1110.  
  1111.               fg_copypage(1,0);
  1112.               fg_setentry(1,0,0);
  1113.               fg_waitkey();
  1114.  
  1115.               farfree(buffer);
  1116.               fg_setmode(old_mode);
  1117.               fg_reset();
  1118.            }
  1119.  
  1120.  
  1121.  
  1122. Summary of Video Page Management Routines
  1123.  
  1124.      This section summarizes the functional descriptions of the Fastgraph
  1125. routines presented in this chapter.  More detailed information about these
  1126. routines, including their arguments and return values, may be found in the
  1127. Fastgraph Reference Manual.
  1128.  
  1129.      FG_ALLOCATE creates a virtual video page.  The amount of memory required
  1130. depends on the current video mode.  This routine has no effect if it
  1131. references a physical or logical video page.
  1132.  
  1133.      FG_ALLOCEMS creates a logical page in expanded memory (EMS).  The amount
  1134. of memory required depends on the current video mode and video buffer
  1135. dimensions.  This routine has no effect if it references a physical or
  1136. virtual video page.
  1137.  
  1138.      FG_ALLOCXMS creates a logical page in extended memory (XMS).  The amount
  1139. of memory required depends on the current video mode and video buffer
  1140. dimensions.  This routine has no effect if it references a physical or
  1141. virtual video page.
  1142.  
  1143.      FG_COPYPAGE transfers the contents of one video page to another.  The
  1144. pages may be physical, virtual, or logical video pages.  If both pages are
  1145. logical pages, they must exist in the same type of memory.
  1146.  
  1147.      FG_FREEPAGE releases a virtual or logical video page created with the
  1148. fg_allocate, fg_alloccms, fg_allocems, or fg_allocxms routines.  This routine
  1149. has no effect if it references a physical video page, or a virtual page that
  1150. was never created.
  1151.  
  1152.      FG_GETADDR returns the segment address of the active video page.
  1153.  
  1154.      FG_GETENTRY retrieves the type and address of a physical, virtual, or
  1155. logical video page.  This routine is useful for saving virtual or logical
  1156. page contents across video mode changes.
  1157.  
  1158.      FG_GETPAGE returns the active video page number.
  1159.  
  1160.      FG_GETVPAGE returns the visual video page number.
  1161.  
  1162.      FG_INITEMS initializes expanded memory for use with Fastgraph.
  1163. 170   Fastgraph User's Guide
  1164.  
  1165.      FG_INITXMS initializes extended memory for use with Fastgraph.
  1166.  
  1167.      FG_PAGESIZE returns the video page size in bytes for the current video
  1168. mode.
  1169.  
  1170.      FG_RESIZE changes the dimensions of a video page in EGA and VGA graphics
  1171. modes.
  1172.  
  1173.      FG_SETENTRY specifies the type and address of a physical, virtual, or
  1174. logical video page.  For logical pages, it further specifies if the page
  1175. resides in conventional, expanded, or extended memory.  This routine is
  1176. useful for saving virtual or logical page contents across video mode changes,
  1177. or for manual creation of virtual and logical pages.
  1178.  
  1179.      FG_SETPAGE establishes the active video page.  It may be a physical or
  1180. virtual page.
  1181.  
  1182.      FG_SETVPAGE establishes the visual video page.  It may be a physical or
  1183. virtual page.
  1184.