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

  1. Appendix A
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Fastgraph Utilities
  8. 310   Fastgraph User's Guide
  9.  
  10.  
  11. Overview
  12.  
  13.      This appendix describes the utility programs supplied with Fastgraph.
  14. By default, the Fastgraph installation procedure places these utilities in
  15. the \FG directory.  To use these utilities, you must either (1) copy the .EXE
  16. file from \FG to your current directory, (2) make \FG your current directory,
  17. or (3) include the \FG directory in your DOS path specification.
  18.  
  19.  
  20. SNAPSHOT Utility
  21.  
  22.      The SNAPSHOT utility is a terminate and stay resident program (TSR) to
  23. capture graphic images.  It stores the image in Fastgraph's standard pixel
  24. run format.  To load SNAPSHOT, just enter the command SNAPSHOT at the DOS
  25. prompt, and you'll see messages similar to the following if SNAPSHOT loads
  26. successfully.
  27.  
  28.  
  29.         C> SNAPSHOT
  30.  
  31.         SNAPSHOT  Version 1.02
  32.         Copyright (c) 1991 Ted Gruber Software.  All Rights Reserved.
  33.  
  34.         Press <alt>-<left shift> to activate.
  35.  
  36.  
  37.      After SNAPSHOT loads, control returns to the DOS prompt.  At this point,
  38. you can use any method whatsoever to display a graphic image and then press
  39. the Alt and left shift keys at the same time to capture the image.  You don't
  40. need to load SNAPSHOT for each image capture, just once per system boot.
  41. SNAPSHOT uses about 14,000 bytes of conventional memory once loaded.
  42.  
  43.      To illustrate the use of SNAPSHOT, suppose you have drawn and saved an
  44. image with a commercial paint program, and you want to incorporate this image
  45. into a Fastgraph application.  Once you load SNAPSHOT, start the paint
  46. program and retrieve your image.  Then press the Alt and left shift keys
  47. simultaneously and wait for the success tone (three quick medium-pitched
  48. sounds).  Finally, exit the paint program to return to the DOS prompt.
  49.  
  50.      The sequence described in the preceding paragraph will store the
  51. captured image in Fastgraph's standard pixel run format, in a file named
  52. SNAPSHOT.nnn in the current directory.  The file type nnn will be the first
  53. sequence of digits that does not result in a duplicate file name.  That is,
  54. if there are no captured image files in the current directory, SNAPSHOT will
  55. use the file name SNAPSHOT.000.  The next time you capture an image, SNAPSHOT
  56. will store it in SNAPSHOT.001, then SNAPSHOT.002, and so forth.  If you
  57. rename or delete one of these files, SNAPSHOT will again use that file name.
  58. For example, if you delete SNAPSHOT.000 but keep SNAPSHOT.001, SNAPSHOT will
  59. store the next image it captures in SNAPSHOT.000.
  60.  
  61.      If SNAPSHOT is unable to capture the image, it will produce its error
  62. tone (a single low-pitched sound).  The most common cause of this is trying
  63. to capture an image from a text video mode, but it also will occur if there
  64. is not enough disk space or if all 1,000 image file names are already being
  65. used.
  66.                                         Appendix A:  Fastgraph Utilities   311
  67.  
  68. CLIP Utility
  69.  
  70.      The SNAPSHOT utility described in the previous section captures the
  71. entire screen.  While this might be desirable in some cases, other times
  72. you'll just need a portion of the screen.  CLIP is an interactive utility
  73. that you can use to reduce the size of any image stored in Fastgraph's
  74. standard or packed pixel run format.  The syntax of the command for invoking
  75. the CLIP utility from the DOS prompt is
  76.  
  77.                      CLIP input_file output_file options
  78.  
  79. where input_file is the name of the original image file, and output_file is
  80. the name of the new image file.  CLIP does not modify the input_file in any
  81. way, but it will overwrite the output_file if an identically named file
  82. exists in the current directory.  The options list specifies one or more
  83. optional switches as shown below.
  84.  
  85. option    meaning
  86.  
  87. /M:mode   Specifies the video mode number in which to display the image.  The
  88.           mode value must be an integer between 0 and 29.  If that video mode
  89.           is a text mode, an unsupported graphics mode, or an unavailable
  90.           graphics mode, CLIP displays an error message stating this.  If the
  91.           /M switch is not present, CLIP uses the first available video mode
  92.           from the list 18, 16, 15, 19, 13, 9, 4, 12.
  93.  
  94. /P        Indicates the input_file is in Fastgraph's packed pixel run format.
  95.           If the /P switch is not present, CLIP assumes it is in standard
  96.           pixel run format.  The output_file will be in the same format as
  97.           the input_file.
  98.  
  99. /W:width  Specifies the image width in pixels.  The width value must be an
  100.           integer between 1 and the horizontal resolution of the selected
  101.           video mode.  If the /W switch is not present, CLIP uses the
  102.           horizontal resolution of the selected video mode.
  103.  
  104. For example, if you wanted to create the image file PARTIAL.PPR from the
  105. packed pixel run file SCREEN.PPR, and use the native 320 by 200 EGA graphics
  106. video mode (mode 13), you would start CLIP with the following command.
  107.  
  108.                      CLIP PARTIAL.PPR SCREEN.PPR /P /M:13
  109.  
  110. Because no /W switch appears in the above command and the horizontal
  111. resolution of mode 13 is 320 pixels, CLIP assumes the image width is 320
  112. pixels.
  113.  
  114.      When CLIP displays the image and the plus-shaped cursor, you are ready
  115. to define one corner of the clipping region (that part of the image used to
  116. create the output_file).  To do this, use the directional keys on the numeric
  117. keypad to move the cursor to the desired position, then press the Enter key.
  118. You are then ready to define the clipping region's opposite corner.  Again,
  119. use the directional keys to move the cursor to the desired position.  When
  120. defining the second corner, however, CLIP uses a rectangular box instead of
  121. the plus-shaped cursor to simplify marking the clipping region's boundaries.
  122. After you press Enter to define the second corner, CLIP creates the
  123. 312   Fastgraph User's Guide
  124.  
  125. output_file and displays the resulting image width and the number of pixel
  126. runs the image contains.
  127.  
  128.      CLIP includes some features that may help you define the clipping
  129. region.  You can change the distance the cursor moves in response to the
  130. directional keys, display the current (x,y) pixel coordinates of the cursor,
  131. and change the cursor color.  The following table explains the keystrokes
  132. that CLIP recognizes when you are defining the clipping region.
  133.  
  134. key       meaning
  135.  
  136. F1        Displays the (x,y) coordinate bar at the top of the screen.  If the
  137.           coordinate bar is already on, F1 removes it.
  138. F2        Displays the (x,y) coordinate bar at the bottom of the screen.  If
  139.           the coordinate bar is already on, F2 removes it.
  140. F3        Changes the cursor or box color from white to black, or from black
  141.           to white.
  142. F4        Displays a summary of the keys CLIP recognizes when defining the
  143.           clipping region.
  144. KP1       Moves the cursor one unit down and to the left.
  145. KP2       Moves the cursor one unit down.
  146. KP3       Moves the cursor one unit down and to the right.
  147. KP4       Moves the cursor one unit to the left.
  148. KP6       Moves the cursor one unit to the right.
  149. KP7       Moves the cursor one unit up and to the left.
  150. KP8       Moves the cursor one unit up.
  151. KP9       Moves the cursor one unit up and to the right.
  152. +         Increases the unit of cursor movement by one pixel.  The default
  153.           cursor movement is one pixel.
  154. -         Decreases the unit of cursor movement by one pixel.
  155. Enter     Defines a corner of the clipping region at the cursor position.
  156. Esc       Exits to DOS without creating the output_file.  CLIP will first
  157.           issue an "Exit to DOS?" prompt in case you pressed the Esc key
  158.           accidentally.
  159.  
  160.  
  161. CONVERT Utility
  162.  
  163.      The CONVERT utility lets you translate files between Fastgraph's SPR and
  164. PPR image file formats.  The syntax of the command for invoking CONVERT from
  165. the DOS prompt is
  166.  
  167.                         CONVERT input_file output_file
  168.  
  169. where input_file is the name of the original image file, and output_file is
  170. the name of the new translated image file.  CONVERT does not modify the
  171. input_file in any way, but it will overwrite the output_file if an
  172. identically named file exists in the current directory.
  173.  
  174.      By default, the file type of the input_file and output_file determine
  175. the image format of that file.  If the file type is .PPR, CONVERT assumes the
  176. image is in Fastgraph's packed pixel run format.  If the file type is .SPR,
  177. CONVERT assumes it is in the Fastgraph's standard pixel run format.  If your
  178. image files use other file types, you can explicitly specify the file's image
  179. format by appending one of the switches /PPR or /SPR to the file name.  The
  180.                                         Appendix A:  Fastgraph Utilities   313
  181.  
  182. input_file and output_file must not both specify the same image format
  183. (CONVERT will display an error message if this is so).
  184.  
  185.      The following command will translate the standard pixel run file
  186. PICTURE.SPR to packed format.  The packed image will be stored in the file
  187. PICTURE.IMG, so we must append the switch /PPR to tell CONVERT that it will
  188. be a packed file.
  189.  
  190.                      CONVERT PICTURE.SPR PICTURE.IMG/PPR
  191.  
  192.  
  193. EDITSPR Utility
  194.  
  195.      The EDITSPR utility changes all pixel runs of one color to another color
  196. in an image file stored in Fastgraph's standard pixel run (SPR) format.  The
  197. syntax of the command for invoking the EDITSPR utility from the DOS command
  198. prompt is
  199.  
  200.                         EDITSPR input_file output_file
  201.  
  202. where input_file is the name of the original image file, and output_file is
  203. the name of the new image file.  EDITSPR does not modify the input_file in
  204. any way, but it will overwrite the output_file if an identically named file
  205. exists in the current directory.
  206.  
  207.      After it reads the pixel runs from the input_file, EDITSPR will perform
  208. the requested color changes.  It does this iteratively by asking for an old
  209. color value followed by a new color value (each value must be between 0 and
  210. 255).  EDITSPR then finds the pixel runs of the old color value and changes
  211. them to the new color value.  Following this, EDITSPR displays a message
  212. stating how many pixel runs it changed.  This process repeats until you enter
  213. a negative number for either color value.
  214.  
  215.      EDITSPR will next combine adjacent pixel runs of like colors.  For
  216. example, suppose the original image file contained a color 1 pixel run of
  217. length 50, followed by a color 2 pixel run of length 20, followed by another
  218. color 1 pixel run of length 10.  If you changed all color 2 pixel runs to
  219. color 1, EDITSPR will combine these three pixel runs into a single run of
  220. length 80.
  221.  
  222.      Finally, EDITSPR will close the output_file.
  223.  
  224.  
  225. GrabRGB Utility
  226.  
  227.      The GrabRGB utility is a terminate and stay resident program (TSR) to
  228. capture the current red, green, and blue color components of video DAC
  229. registers in 256-color graphics modes.  You can use GrabRGB together with
  230. Fastgraph's SNAPSHOT utility to preserve the original colors of a captured
  231. image.
  232.  
  233.      To load GrabRGB, just enter the command GRABRGB at the DOS prompt.
  234. After GrabRGB loads, control returns to the DOS prompt.  At this point, you
  235. can use any method whatsoever to display a 256-color graphic image and then
  236. press the Alt and right shift keys at the same time to capture the current
  237. DAC values.  You don't need to load GrabRGB for each image, just once per
  238. 314   Fastgraph User's Guide
  239. system boot.  GrabRGB uses about 15,000 bytes of conventional memory once
  240. loaded.
  241.  
  242.      To illustrate the use of GrabRGB, suppose you have drawn and saved a
  243. 256-color image with a commercial paint program, and you want to incorporate
  244. this image into a Fastgraph application.  Once you load SNAPSHOT and GrabRGB,
  245. start the paint program and retrieve your image.  Then press the Alt and left
  246. shift keys to capture the image with SNAPSHOT.  After SNAPSHOT's success tone
  247. (three quick medium-pitched sounds), press Alt and right shift to capture the
  248. RGB components of each DAC register with GrabRGB, and wait for GrabRGB's
  249. success tone.  Finally, exit the paint program and return to the DOS prompt.
  250.  
  251.      The sequence described in the preceding paragraph will write the RGB
  252. color components for each DAC register to a file named GRABRGB.nnn in the
  253. current directory.  The file type nnn will be the first sequence of digits
  254. that does not result in a duplicate file name.  That is, if there are no
  255. GrabRGB output files in the current directory, GrabRGB will use the file name
  256. GRABRGB.000.  The next time you use GrabRGB, it will store the RGB
  257. information in GRABRGB.001, then GRABRGB.002, and so forth.  If you rename or
  258. delete one of these files, GrabRGB will again use that file name.  For
  259. example, if you delete GRABRGB.000 but keep GRABRGB.001, GrabRGB will next
  260. use the file name GRABRGB.000.
  261.  
  262.      If GrabRGB is unable to obtain the RGB components of each DAC register,
  263. it will produce its error tone (a single low-pitched sound).  The most common
  264. cause of this is trying to capture an image from a text video mode, or from a
  265. graphics video mode with fewer than 256 colors.  It also will occur if there
  266. is not enough disk space or if all 1,000 output file names are already being
  267. used.
  268.  
  269.      Each line in the output file created by GrabRGB is of the form
  270.  
  271.                                 nnn,rr,gg,bb,
  272.  
  273. where nnn is a DAC register index (between 0 and 255), rr is the red
  274. component of that DAC register, gg is the green component, and bb is the blue
  275. component.  Each color component is between 0 and 63.  You can edit and
  276. reformat these lines as necessary for inclusion in a C initializer list, a
  277. BASIC or FORTRAN data statement, or a Pascal array-type constant list.  Such
  278. an array of RGB components, but without the nnn indices, is in the format
  279. expected by fg_setdacs.
  280.  
  281.      By default, GrabRGB captures information for all 256 DAC registers.  If
  282. you want to consider only the DAC registers with color components different
  283. from their initial values, just include the /D option when you load GrabRGB
  284. (that is, use the command GRABRGB /D).  If you specify the /D option and all
  285. 256 DACs use their default values, the output file will contain a message
  286. stating this.
  287.  
  288.  
  289. HERCFIX Utility
  290.  
  291.      The HERCFIX utility allows you to use SNAPSHOT (and possibly other TSRs)
  292. with programs that do not update the BIOS data area when establishing the 720
  293. by 348 Hercules graphics mode.  If you use SNAPSHOT with such a program, it
  294. will think the monochrome text mode (video mode 7) is active and will produce
  295. its low-pitched error tone when activated.
  296.                                         Appendix A:  Fastgraph Utilities   315
  297.  
  298.      If this occurs, use HERCFIX to load the application from which you are
  299. trying to capture the image.  To do this, enter
  300.  
  301.                                HERCFIX command
  302.  
  303. at the DOS prompt, where command is the command that starts the application.
  304. For example, suppose you use the command PAINTER /H to run a commercial paint
  305. program in Hercules graphics mode.  To load the paint program with HERCFIX,
  306. you would enter the command HERCFIX PAINTER /H.
  307.  
  308.  
  309. PCXHEAD Utility
  310.  
  311.      The PCXHEAD utility displays the most important information from the
  312. header of a PCX file.  This consists of the PCX version number, the number of
  313. bits per pixel, the number of bit planes, the scan line width, and the image
  314. dimensions and screen position.  It also proposes the optimal video mode for
  315. displaying the PCX file.  By optimal, we mean the compatible video mode
  316. having the lowest resolution larger than or equal to the image dimensions.
  317. For 256-color PCX images, PCXHEAD displays the extended color palette if one
  318. is present.
  319.  
  320.      The syntax of the command for invoking the PCXHEAD utility from the DOS
  321. command prompt is
  322.  
  323.                                PCXHEAD pcx_file
  324.  
  325. where pcx_file is the name of the PCX file to examine.  PCXHEAD does not
  326. modify the pcx_file in any way.  If the PCX file includes an extended color
  327. palette, you may prefer to direct the PCXHEAD output to a file using the DOS
  328. redirection operator (>).
  329. 316   Fastgraph User's Guide
  330. Appendix B
  331.  
  332.  
  333.  
  334.  
  335.  
  336. Using Fastgraph
  337. from Assembly Language
  338. 318   Fastgraph User's Guide
  339.  
  340.      Fastgraph uses the same naming and calling conventions as Microsoft C
  341. and Turbo C.  The details of these conventions that are important to assembly
  342. language programming are summarized below.  If you are calling Fastgraph
  343. routines from an assembly language program, the program must follow these
  344. conventions.
  345.  
  346.        All arrays and pointers are passed by reference
  347.        All other items are passed by value
  348.        Arguments are pushed onto the stack in reverse order
  349.        16-bit function values are returned in the AX register
  350.        32-bit function values are returned in the DX:AX register pair
  351.        Fastgraph routine names are prefixed with an underscore
  352.  
  353. The small and medium model Fastgraph libraries pass arrays and pointers by
  354. near reference, while the large model library does so by far reference.  This
  355. is consistent with the run-time libraries for the supported compilers.
  356.  
  357.      All Fastgraph routines preserve the BP, DS, DI, and SI registers.  The
  358. contents of any other registers are unknown upon return from a Fastgraph
  359. routine (except for the AX register, which will either contain zero or the
  360. routine's return value).
  361.  
  362.      The following DOS commands show how to assemble a program (using the
  363. Microsoft Macro Assembler) and then link it with Fastgraph.  In all cases,
  364. we'll assume the file EXAMPLE.ASM contains the source code for the program.
  365. The resulting executable file will be called EXAMPLE.EXE.
  366.  
  367.                               small memory model
  368.  
  369.                     MASM EXAMPLE.ASM;
  370.                     LINK /CP:4096 /E EXAMPLE,,NUL.MAP,FGS
  371.  
  372.  
  373.                              medium memory model
  374.  
  375.                     MASM EXAMPLE.ASM;
  376.                     LINK /CP:4096 /E EXAMPLE,,NUL.MAP,FGM
  377.  
  378.  
  379.                               large memory model
  380.  
  381.                     MASM EXAMPLE.ASM;
  382.                     LINK /CP:4096 /E EXAMPLE,,NUL.MAP,FGL
  383.  
  384.  
  385.      Example B-1 calls the fg_getmode, fg_setmode, fg_reset, and fg_version
  386. routines from an assembly language program.  The fg_getmode routine returns
  387. its function value in the AX register.  The fg_setmode routine has a single
  388. argument, while fg_reset has no arguments.  The fg_version routine has two
  389. arguments, both passed by reference.  Notice how they are pushed on the stack
  390. in reverse order.  This example would work with either the medium or large
  391. memory model Fastgraph libraries.  To make it work with the small model
  392. library, all you would need to do is change the word "far" to "near" in the
  393. EXTRN declarations, and change the name of the code segment from "main_TEXT"
  394. to "_TEXT".
  395.  
  396.                      Appendix B:  Using Fastgraph from Assembly Language   319
  397.  
  398.                                  Example B-1.
  399.  
  400.                 EXTRN   _fg_getmode:far  ; Fastgraph's GETMODE routine
  401.                 EXTRN   _fg_reset:far    ; Fastgraph's RESET routine
  402.                 EXTRN   _fg_setmode:far  ; Fastgraph's SETMODE routine
  403.                 EXTRN   _fg_version:far  ; Fastgraph's VERSION routine
  404.  
  405.       stackseg  SEGMENT stack         ; suppress the linker's
  406.       stackseg  ENDS                  ; "no stack segment" error message
  407.  
  408.       _DATA     SEGMENT word public 'DATA'
  409.  
  410.       major     dw      ?             ; major version number
  411.       minor     dw      ?             ; minor version number
  412.       old_mode  dw      ?             ; original video mode
  413.  
  414.       _DATA     ENDS
  415.  
  416.       dgroup    GROUP   _DATA
  417.                 ASSUME  cs:main_TEXT,ds:dgroup
  418.  
  419.       main_TEXT SEGMENT byte public 'CODE'
  420.  
  421.       start:    mov     ax,_DATA      ; load segment location
  422.                 mov     ds,ax         ; into DS register
  423.  
  424.                 call    _fg_getmode   ; AX = current video mode
  425.                 mov     old_mode,ax   ; save it
  426.  
  427.                 mov     ax,4          ; use video mode 4
  428.                 push    ax            ; pass argument to SETMODE
  429.                 call    _fg_setmode   ; establish CGA four-color mode
  430.                 add     sp,2          ; remove SETMODE argument
  431.  
  432.                 push    old_mode      ; pass argument to SETMODE
  433.                 call    _fg_setmode   ; restore original video mode
  434.                 add     sp,2          ; remove SETMODE argument
  435.  
  436.                 call    _fg_reset     ; restore screen attributes
  437.  
  438.                 lea     ax,minor      ; get address of minor variable
  439.                 push    ax            ; pass argument #2 to VERSION
  440.                 lea     ax,major      ; get address of major variable
  441.                 push    ax            ; pass argument #1 to VERSION
  442.                 call    _fg_version   ; get the Fastgraph version number
  443.                 add     sp,4          ; remove VERSION arguments
  444.  
  445.                 mov     ah,76         ; function 76: terminate process
  446.                 xor     al,al         ; errorlevel 0
  447.                 int     21h           ; exit to DOS
  448.  
  449.       main_TEXT ENDS
  450.                 END     start
  451.  
  452. 320   Fastgraph User's Guide
  453. Appendix C
  454.  
  455.  
  456.  
  457.  
  458.  
  459. Interrupts and Fastgraph
  460. 322   Fastgraph User's Guide
  461.  
  462. Interrupts Used by Fastgraph
  463.  
  464.      DOS maintains an interrupt vector table that contains the addresses of
  465. 256 interrupt handlers, or routines, that perform various functions.  The
  466. handlers are usually referenced by their hexadecimal interrupt number,
  467. between 00 and FF.  Of these, only interrupts 60 through 66 and F1 through FF
  468. are not used by DOS, the ROM BIOS, or other software and are thus available
  469. for user applications.
  470.  
  471.      Certain Fastgraph routines use some of the available interrupts.
  472. Namely, the fg_music routine uses interrupt 60, the asynchronous sound
  473. routines (fg_musicb, fg_sounds, and fg_voices) use interrupts 60 and 61, and
  474. all Fastgraph/Light routines use interrupt 62.  If your program defines its
  475. own interrupt handlers, it must not use any of the interrupts reserved for
  476. Fastgraph (unless, of course, it doesn't use any of the Fastgraph routines
  477. that would create a conflict).
  478.  
  479.  
  480. Extending the Time-of-Day Interrupt
  481.  
  482.      As mentioned in Chapter 16, the BIOS time-of-day clock is incremented by
  483. an interrupt handler.  The routine that does this is interrupt 08, a hardware
  484. interrupt automatically activated 18.2 times per second.  After incrementing
  485. the clock, interrupt 08 invokes interrupt 1C, which by default references a
  486. "do-nothing" interrupt handler.  While changing interrupt 08 can be tricky,
  487. it is fairly straightforward to define our own handler for interrupt 1C.
  488. This handler also will be executed automatically 18.2 times per second.
  489. Example C-1 illustrates how to do this.
  490.  
  491.      When we discussed joysticks in Chapter 14, we said there were two ways
  492. to monitor joystick button status.  One is to intersperse calls to the
  493. fg_button routine at strategic places in your program and then take necessary
  494. action depending on the button status.  However, the problem with this scheme
  495. is the chance of missing a button press -- if you press the joystick button
  496. and then release it between calls to fg_button, the program will not detect
  497. the joystick activity.  A preferable method is to call fg_button from a
  498. handler for interrupt 1C, which essentially provides continuous monitoring of
  499. the joystick buttons.  When we need the button status within our program, all
  500. we need to do is examine a global variable.
  501.  
  502.      Example C-1 consists of a main program (written in C) and an assembly
  503. language subroutine named int1C (suitable for the medium memory model).  The
  504. main program calls int1C to define a handler for interrupt 1C.  In response
  505. to any keystroke (except Escape), the program displays the button press
  506. information for each joystick since the previous keystroke (refer to the
  507. discussion of the fg_button routine for the meanings of the status values).
  508. When you press the Escape key, the program exits to DOS, but not before
  509. calling int1C to restore the original interrupt 1C handler.
  510.  
  511.                          Example C-1 (main program).
  512.  
  513.                #include <fastgraf.h>
  514.                #include <stdio.h>
  515.                void main(void);
  516.  
  517.                #define ESC 27
  518.                                    Appendix C:  Interrupts and Fastgraph   323
  519.  
  520.                int status1, status2;
  521.  
  522.                void main()
  523.                {
  524.                   unsigned char key, aux;
  525.  
  526.                   int1C(1);
  527.  
  528.                   status1 = 0;
  529.                   status2 = 0;
  530.  
  531.                   do {
  532.                      printf("\n");
  533.                      printf("Joystick 1 status: %d\n",status1);
  534.                      printf("Joystick 2 status: %d\n",status2);
  535.                      status1 = 0;
  536.                      status2 = 0;
  537.                      fg_getkey(&key,&aux);
  538.                      }
  539.                   while (key != ESC);
  540.  
  541.                   int1C(0);
  542.                }
  543.  
  544.  
  545.      We'll now examine the int1C assembly language subroutine.  It actually
  546. consists of three parts:  a portion to enable our interrupt handler, our
  547. handler itself, and a portion to disable the handler.  When we call int1C
  548. with a nonzero argument, it saves the original data segment (so we can access
  549. the global variables within the handler), saves the original handler's
  550. address (called the vector) for interrupt 1C, and then enables our handler,
  551. which takes the form of a far procedure.
  552.  
  553.      The handler routine then begins to be activated at 18.2 times per
  554. second.  After saving all the important registers, the handler calls the
  555. Fastgraph routine fg_button twice, once for each joystick.  The return values
  556. are logically ORed with the status1 and status2 C global variables to update
  557. the button status information.  Finally, the handler restores the original
  558. registers and returns control to the point of the interrupt.
  559.  
  560.      Before the main program exits, it calls int1C with a zero argument to
  561. restore the original handler for interrupt 1C.  No provision is made in the
  562. program to check if we had previously defined our own handler (and hence
  563. saved the original interrupt 1C vector), but this could be added with little
  564. difficulty.
  565.  
  566.                  Example C-1 (assembly language subroutine).
  567.  
  568.  
  569.               EXTRN   _status1:word ; C global variable for button 1 status
  570.  
  571.               EXTRN   _status2:word ; C global variable for button 2 status
  572.  
  573.               EXTRN   _fg_button:far ; Fastgraph routine
  574.  
  575. 324   Fastgraph User's Guide
  576.  
  577.  
  578.    int1C_TEXT SEGMENT byte public 'CODE'
  579.  
  580.               ASSUME  cs:int1C_TEXT
  581.  
  582.  
  583.  
  584.    int1C_CS   dw      ?             ; holds original INT 1C segment address
  585.  
  586.    int1C_IP   dw      ?             ; holds original INT 1C offset
  587.  
  588.    orig_DS    dw      ?             ; holds original data segment
  589.  
  590.  
  591.  
  592.    _int1C     PROC    far
  593.  
  594.               PUBLIC  _int1C
  595.  
  596.  
  597.  
  598.               push    bp            ; save caller's BP register
  599.  
  600.               mov     bp,sp         ; make BP point to argument list
  601.  
  602.               push    si            ; save caller's SI register
  603.  
  604.               push    di            ; save caller's DI register
  605.  
  606.  
  607.  
  608.               mov     dx,[bp+6]     ; get the flag parameter
  609.  
  610.               or      dx,dx         ; replace the old interrupt handler?
  611.  
  612.               jz      replace       ; yes, branch to that processing
  613.  
  614.  
  615.  
  616.    ; define a new handler for INT 1C
  617.  
  618.  
  619.  
  620.    define:    mov     ax,ds         ; put current data segment in AX
  621.  
  622.               mov     cs:orig_DS,ax ; save it in the control information area
  623.  
  624.  
  625.  
  626.               mov     al,1Ch        ; interrupt vector to save
  627.  
  628.               mov     ah,53         ; function 53: get interrupt vector
  629.  
  630.               int     21h           ; get the interrupt vector
  631.  
  632.                                    Appendix C:  Interrupts and Fastgraph   325
  633.  
  634.               mov     cs:int1C_CS,es; save the segment
  635.  
  636.               mov     cs:int1C_IP,bx; save the offset
  637.  
  638.  
  639.  
  640.               push    ds            ; save our DS register
  641.  
  642.               mov     dx,offset handler ; get offset of interrupt handler
  643.  
  644.               mov     ax,seg handler; get segment of interrupt handler
  645.  
  646.               mov     ds,ax         ; put it in DS
  647.  
  648.               mov     al,1Ch        ; interrupt vector to change
  649.  
  650.               mov     ah,37         ; function 37: set interrupt vector
  651.  
  652.               int     21h           ; change the INT 1C vector to our handler
  653.  
  654.               pop     ds            ; restore our DS register
  655.  
  656.  
  657.  
  658.               jmp     short return  ; return to the caller
  659.  
  660.  
  661.  
  662.    ; replace the original handler for INT 1C
  663.  
  664.  
  665.  
  666.    replace:   push    ds            ; save our DS register
  667.  
  668.               mov     dx,cs:int1C_IP; put original INT 1C offset in DX
  669.  
  670.               mov     ds,cs:int1C_CS; put original INT 1C segment in DS
  671.  
  672.               mov     ah,37         ; function 37: set interrupt vector
  673.  
  674.               mov     al,1Ch        ; interrupt vector 1C
  675.  
  676.               int     21h           ; restore original INT 1C vector
  677.  
  678.               pop     ds            ; restore our DS register
  679.  
  680.  
  681.  
  682.    return:    xor     ax,ax         ; in case int1C was called as a function
  683.  
  684.               pop     di            ; restore our DI register
  685.  
  686.               pop     si            ; restore our SI register
  687.  
  688.               pop     bp            ; restore our BP register
  689.  
  690. 326   Fastgraph User's Guide
  691.  
  692.               ret
  693.  
  694.  
  695.  
  696.    _int1C     ENDP
  697.  
  698.  
  699.  
  700.  
  701.  
  702.    handler    PROC    far           ; interrupt handler that replaces INT 1C
  703.  
  704.  
  705.  
  706.               cli                   ; disable interrupts while handler active
  707.  
  708.               push    ax            ; save registers that may be altered
  709.  
  710.               push    bx
  711.  
  712.               push    cx
  713.  
  714.               push    dx
  715.  
  716.               push    di
  717.  
  718.               push    si
  719.  
  720.               push    ds
  721.  
  722.               push    es
  723.  
  724.  
  725.  
  726.               mov     ds,cs:orig_DS ; retrieve the original data segment
  727.  
  728.  
  729.  
  730.               mov     ax,1          ; use joystick 1
  731.  
  732.               push    ax            ; pass joystick number to button routine
  733.  
  734.               call    _fg_button    ; AX = button status for joystick 1
  735.  
  736.               add     sp,2          ; remove the argument
  737.  
  738.               or      _status1,ax   ; update status variable for joystick 1
  739.  
  740.  
  741.  
  742.               mov     ax,2          ; use joystick 2
  743.  
  744.               push    ax            ; pass joystick number to button routine
  745.  
  746.               call    _fg_button    ; AX = button status for joystick 2
  747.  
  748.                                    Appendix C:  Interrupts and Fastgraph   327
  749.  
  750.               add     sp,2          ; remove the argument
  751.  
  752.               or      _status2,ax   ; update status variable for joystick 2
  753.  
  754.  
  755.  
  756.               pop     es            ; restore altered registers
  757.  
  758.               pop     ds
  759.  
  760.               pop     si
  761.  
  762.               pop     di
  763.  
  764.               pop     dx
  765.  
  766.               pop     cx
  767.  
  768.               pop     bx
  769.  
  770.               pop     ax
  771.  
  772.               iret                  ; return from the interrupt routine
  773.  
  774.  
  775.  
  776.    handler    ENDP
  777.  
  778.  
  779.  
  780.    int1C_TEXT ENDS
  781.  
  782.               END
  783.  
  784.  
  785.  
  786.  
  787.      The example just presented is not meant to be a tutorial on interrupts;
  788. there are many good references on DOS that explain them in detail.  However,
  789. an example specific to Fastgraph should be helpful.
  790. 328   Fastgraph User's Guide
  791. Appendix D
  792.  
  793.  
  794.  
  795.  
  796.  
  797. Contents of the
  798. Compiler-Specific Libraries
  799. 330   Fastgraph User's Guide
  800.  
  801.      Each supported Fastgraph compiler except QuickBASIC and Visual Basic for
  802. DOS have a compiler-specific Fastgraph library (also called the extended
  803. Fastgraph library) that contains the following routines:
  804.  
  805.           fg_boxw        fg_drawxw      fg_panw        fg_setsize
  806.           fg_boxxw       fg_drectw      fg_pointw      fg_setsizew
  807.           fg_circlew     fg_ellipsew    fg_pointxw     fg_setworld
  808.           fg_circlefw    fg_ellipsfw    fg_polygonw    fg_swchar
  809.           fg_clprectw    fg_floodw      fg_rectw       fg_swlength
  810.           fg_dashrw      fg_getworld    fg_restorew    fg_swtext
  811.           fg_dashw       fg_initw       fg_savew       fg_xscreen
  812.           fg_drawrw      fg_moverw      fg_setangle    fg_xworld
  813.           fg_drawrxw     fg_movew       fg_setclipw    fg_yscreen
  814.           fg_draww       fg_paintw      fg_setratio    fg_yworld
  815.  
  816. These routines use the world space coordinate system, either directly or
  817. internally.  Note that none of them are included in Fastgraph/Light.
  818.  
  819.      As mentioned in Chapter 1, if your program uses any of these routines,
  820. you must link it with the standard Fastgraph library and the corresponding
  821. extended Fastgraph library.
  822. Appendix E
  823.  
  824.  
  825.  
  826.  
  827.  
  828. Contents of the
  829. Pascal Unit Files
  830. 332   Fastgraph User's Guide
  831.  
  832.      Borland Pascal and Turbo Pascal restrict the total size of all code
  833. segments in a unit file 65,520 bytes.  Because the size of Fastgraph's code
  834. exceeds this amount, the Fastgraph functions are split among several unit
  835. files.  This appendix lists the contents of each Pascal unit file.
  836.  
  837. Fastgraph routines in FGBITMAP.TPU
  838.  
  839.           fg_clipmask       fg_flipmask      fg_imagebuf       fg_revimage
  840.           fg_clpimage       fg_flpimage      fg_imagesiz       fg_revmask
  841.           fg_drawmask       fg_getblock      fg_putblock
  842.           fg_drwimage       fg_getimage      fg_putimage
  843.  
  844. Fastgraph routines in FGGIF.TPU
  845.  
  846.           fg_makegif        fg_showgif
  847.  
  848. Fastgraph routines in FGMISC.TPU
  849.  
  850.           fg_button         fg_intkey        fg_mousepos       fg_setcaps
  851.           fg_capslock       fg_kbinit        fg_mouseptr       fg_setnum
  852.           fg_cursor         fg_kbtest        fg_mousespd       fg_sound
  853.           fg_getclock       fg_measure       fg_mousevis       fg_sounds
  854.           fg_getkey         fg_memavail      fg_music          fg_suspend
  855.           fg_getxjoy        fg_mousebut      fg_musicb         fg_voice
  856.           fg_getyjoy        fg_mousecur      fg_numlock        fg_voices
  857.           fg_hush           fg_mousefin      fg_playing        fg_waitfor
  858.           fg_hushnext       fg_mouseini      fg_quiet          fg_waitkey
  859.           fg_initjoy        fg_mouselim      fg_resume
  860.           fg_intjoy         fg_mousemov      fg_scrlock
  861.  
  862. Fastgraph routines in FGPCX.TPU
  863.  
  864.           fg_makepcx        fg_pcxhead       fg_pcxmode        fg_showpcx
  865.  
  866. Fastgraph routines in FGPR.TPU
  867.  
  868.           fg_dispfile       fg_displayp      fg_makespr        fg_showspr
  869.           fg_display        fg_makeppr       fg_showppr
  870.  
  871. Fastgraph routines in FGSVGA.TPU
  872.  
  873.           fg_defpages       fg_svgainit      fg_svgaver
  874.           fg_memory         fg_svgastat
  875.  
  876. Pascal versions of the routines listed in Appendix D are in the unit file
  877. FGWORLD.TPU.  All other Fastgraph routines are in the FGMAIN.TPU unit file.
  878.  
  879. As mentioned in Chapter 1, Pascal programs must include a uses statement
  880. listing all units referenced in the program.  The FGMAIN unit is always
  881. required.  Other unit files are needed when you call the Fastgraph functions
  882. they contain.
  883. Appendix F
  884.  
  885.  
  886.  
  887.  
  888.  
  889. Integrating Fastgraph With
  890. Other Graphics Software
  891. 334   Fastgraph User's Guide
  892.  
  893.      Sometimes you may want to use Fastgraph with other graphics software,
  894. such as when converting an existing graphics application to Fastgraph.  This
  895. appendix may clarify some points about doing this.
  896.  
  897.      First, let the other graphics software establish the video mode, then
  898. initialize Fastgraph for that mode by calling fg_setmode(-1).  Passing -1 to
  899. fg_setmode does not physically change video modes but merely initializes
  900. Fastgraph's internal parameters for the current video mode.
  901.  
  902.      Second, if you're using the EGA/VGA/SVGA 16-color graphics modes (modes
  903. 13 to 18, 28, and 29), you'll probably need to explicitly define the value of
  904. the EGA/VGA Enable Set/Reset register (port address 03CE hex, index 01).
  905. Fastgraph's functions expect this register to have the value 0F hex; this
  906. allows Fastgraph take advantage of a more efficient variant available in
  907. EGA/VGA write mode 0.  The default value for the Enable Set/Reset register is
  908. zero.
  909.  
  910.      After you've called fg_setmode(-1) and need to call a third party
  911. graphics function, set the Enable Set/Reset register to its default value by
  912. including the following statement just before calling the third party
  913. function:
  914.  
  915. outport(0x03CE,0x0001);       Borland C++, Turbo C/C++, or Power C
  916. outpw(0x03CE,0x0001);         Microsoft C or QuickC
  917. OUT &h03CE,1 : OUT &h03CF,0   QuickBASIC or Visual Basic
  918.  
  919. Just before you call the next Fastgraph function, restore the Enable
  920. Set/Reset register value with the following statement:
  921.  
  922. outport(0x03CE,0x0F01);       Borland C++, Turbo C/C++, or Power C
  923. outpw(0x03CE,0x0F01);         Microsoft C or QuickC
  924. OUT &h03CE,1 : OUT &h03CF,15  QuickBASIC or Visual Basic
  925.                                                                    Index   335
  926.  
  927.                                   I n d e x
  928.  
  929. 8253-5 programmable timer chip               /M option  311
  930.           286                                /P option  311
  931. Active page  151, 152                        /W option  311
  932. Animation  238                          Clipping  98
  933.      dynamic frame  244                 Clock tick  300-302
  934.      dynamic page flipping  246         Clock tick interrupt  291, 293,
  935.      page flipping  246                           300
  936.      simple  238                        Color  68
  937.      static frame  242                  Color indices  90
  938.      static page flipping  246          Color number  70
  939.      summary  248                       Color value  70
  940.      XOR  240                           Compilation  5
  941. ANSI.SYS  45                                 BASIC PDS  11
  942. Assembly language  318                       Borland C++  8
  943. Attribute  68, 132, 133                      Borland Pascal  10
  944. Available memory  304                        Microsoft C  13
  945. Background color  68-70                      Microsoft C++  13
  946. BASIC PDS  11                                Microsoft FORTRAN  14
  947. Bit maps  190                                Power C  23
  948.      CGA  195, 196, 203                      QuickBASIC  16
  949.      EGA  198, 205                           QuickC  18
  950.      filler bits  191                        Turbo C  25
  951.      Hercules  198                           Turbo C++  25
  952.      MCGA  199                               Turbo Pascal  27
  953.      memory requirements  209                Visual Basic  20
  954.      mode-independent  190                   Visual C++  22
  955.      mode-specific  194                      Zortech C++  28
  956.      PCjr  198                          Compiler-specific Fastgraph
  957.      retrieving  207                              library  330
  958.      subscript order  191, 192,         CONVERT  312, 313
  959.           202                                /PPR switch  312
  960.      SVGA  198, 199                          /SPR switch  312
  961.      Tandy  198                         Convex shape  108
  962.      text modes  201                    Coordinate conversion  64, 137,
  963.      VGA  198, 199                                138
  964. Bit-mapped characters  145              Current color  70
  965. Bit-mapped images  190                  Cursor mask  273, 275
  966. BitBlt  222                             Dash pattern  104, 105
  967. Blit  222                               Delay units  301, 302
  968. Block transfer routines  222            Display patterns  181
  969. Borland C++  3, 8                            CGA  181, 182
  970. Borland Pascal  3, 10                        EGA  184
  971. Byte boundary  223, 224                      Hercules  184
  972. CapsLock  262-264                            MCGA  184
  973. CGA palettes  70                             PCjr  183
  974. Character cells  32                          SVGA  184
  975. Character space  60, 128                     Tandy  183
  976. Characters                                   VGA  184
  977.      bit-mapped  145                    Dithering  114
  978.      hardware  129                      Dithering matrix  114
  979.      software  139                           256-color modes  119
  980. Circles  109                                 alignment  120
  981. Clearing the screen  98                      CGA  115, 116
  982. CLIP  311, 312                               EGA  118
  983. 336   Fastgraph User's Guide
  984. Dithering matrix (cont.)                     fg_dash  104, 105, 123
  985.      Hercules  117                           fg_dashrel  104, 123
  986.      PCjr  117                               fg_dashrw  104, 123
  987.      SVGA  118                               fg_dashw  104, 123
  988.      Tandy  117                              fg_defcolor  91, 94, 120
  989.      VGA  118                                fg_dispfile  180, 181, 188,
  990. EDITSPR  313                                      214
  991. Ellipses  109                                fg_display  212-214, 219
  992. EMM386.EXE  162                              fg_displayp  213, 214, 219
  993. EMS  162                                     fg_draw  102, 123, 254
  994. Expanded memory  162                         fg_drawmap  145, 190, 192,
  995. Expanded Memory Manager  162                      193, 194, 195, 207,
  996. Extended Fastgraph library  330                   208, 209, 212, 215,
  997. Extended memory  162                              218, 219, 230, 248,
  998. Fade  85, 86                                      275, 278
  999. FASTGRAF.BI  6                               fg_drawmask  216-219
  1000. FASTGRAF.H  6                                fg_drawrel  102, 121, 123
  1001. Fastgraph  2                                 fg_drawrelx  102, 123
  1002. Fastgraph routines                           fg_drawrw  102, 123
  1003.      fg_allocate  154, 155,                  fg_drawrxw  102, 123
  1004.           157, 158, 160-162,                 fg_draww  102, 124
  1005.           167-169, 222, 226,                 fg_drawx  102, 124
  1006.           227, 304                           fg_drawxw  102, 124
  1007.      fg_alloccms  162, 163,                  fg_drect  114, 115, 118,
  1008.           166, 167                                119, 120, 124
  1009.      fg_allocems  162, 163, 169              fg_drectw  115, 120, 124
  1010.      fg_allocxms  162, 163, 169              fg_drwimage  145, 195-198,
  1011.      fg_automode  49, 50, 56,                     200-204, 207, 209,
  1012.           99, 109, 111, 256                       212, 215, 217, 218,
  1013.      fg_bestmode  46, 50, 51,                     219, 248, 278
  1014.           53, 57, 121, 155,                  fg_ellipse  109, 124, 242
  1015.           157, 158, 233                      fg_ellipsef  109, 124
  1016.      fg_box  112, 122                        fg_ellipsew  109, 124
  1017.      fg_boxdepth  112, 122                   fg_ellipsfw  109, 124
  1018.      fg_boxw  112, 122                       fg_erase  98, 124, 168
  1019.      fg_boxx  113, 114, 122                  fg_fadein  250, 251, 258
  1020.      fg_boxxw  113, 122                      fg_fadeout  250, 258
  1021.      fg_button  280, 281, 283,               fg_fillpage  98, 124
  1022.           322, 323                           fg_flipmask  216, 217, 219
  1023.      fg_capslock  263, 283                   fg_flood  121, 124
  1024.      fg_chgattr  132, 145                    fg_floodw  121, 124
  1025.      fg_chgtext  132, 146                    fg_flpimage  203, 204, 207,
  1026.      fg_circle  109, 123                          215, 217, 219
  1027.      fg_circlef  109, 123                    fg_fontsize  137, 146
  1028.      fg_circlefw  109, 123                   fg_freepage  155, 157, 158,
  1029.      fg_circlew  109, 123                         162, 165, 169, 304
  1030.      fg_clipmask  216, 217, 219              fg_getaddr  160, 169
  1031.      fg_clpimage  203, 204,                  fg_getattr  133, 146
  1032.           207, 215, 217, 219                 fg_getblock  233, 234
  1033.      fg_clprect  111, 123, 238,              fg_getchar  133, 146
  1034.           245, 246                           fg_getclock  301, 303
  1035.      fg_clprectw  111, 123                   fg_getcolor  69, 70, 77, 94
  1036.      fg_copypage  163, 164,                  fg_getdacs  86-88, 94, 306
  1037.           166, 168, 169, 222,                fg_getentry  166, 169
  1038.           234                                fg_gethpage  225, 234
  1039.      fg_cursor  44, 57, 94,                  fg_getimage  133, 207, 209,
  1040.           134, 226                                210, 219, 233, 248
  1041.                                                                    Index   337
  1042. Fastgraph routines (cont.)                   fg_mouseini  165, 267-269,
  1043.      fg_getindex  94                              271, 284
  1044.      fg_getkey  262, 265, 283                fg_mouselim  269, 270, 284
  1045.      fg_getlines  47, 57                     fg_mousemov  269, 270, 284
  1046.      fg_getmap  207-210, 219,                fg_mousepos  271, 272, 284
  1047.           230, 248                           fg_mouseptr  273, 277, 284
  1048.      fg_getmaxx  61, 62, 64,                 fg_mousespd  269, 270, 284
  1049.           111                                fg_mousevis  269, 272, 284
  1050.      fg_getmaxy  61, 62, 64,                 fg_move  101, 102, 105,
  1051.           111                                     121, 125, 135, 178,
  1052.      fg_getmode  46, 57, 318                      180, 193, 194, 208,
  1053.      fg_getpage  160, 169                         210, 214, 230, 254
  1054.      fg_getpixel  99, 124                    fg_moverel  101, 102, 125
  1055.      fg_getrgb  84-86, 94                    fg_moverw  101, 125
  1056.      fg_getvpage  160, 169                   fg_movew  101, 125
  1057.      fg_getworld  63, 64                     fg_music  289-291, 293,
  1058.      fg_getxjoy  280-283                          296, 322
  1059.      fg_getxpos  102, 124                    fg_musicb  293-296, 322
  1060.      fg_getyjoy  280-283                     fg_numlock  263, 284
  1061.      fg_getypos  102, 124                    fg_pagesize  161, 168, 170
  1062.      fg_hush  291, 293, 294,                 fg_paint  121, 125, 254
  1063.           296                                fg_paintw  121, 125
  1064.      fg_hushnext  291, 293,                  fg_palette  71-80, 82-84,
  1065.           294, 296                                89, 90, 94, 95, 201
  1066.      fg_imagebuf  186, 187                   fg_palettes  90, 95, 306
  1067.      fg_imagesiz  209, 210,                  fg_pan  255-258, 306
  1068.           219, 233                           fg_panw  255, 256, 258
  1069.      fg_initems  162, 163, 165,              fg_pattern  181, 185, 188,
  1070.           169                                     212, 213
  1071.      fg_initjoy  165, 279-281,               fg_pcxhead  174, 188
  1072.           283                                fg_pcxmode  174, 188
  1073.      fg_initw  62, 64, 101, 140              fg_playing  291, 294, 296
  1074.      fg_initxms  162, 165, 170               fg_point  99, 101, 125
  1075.      fg_inside  109, 125                     fg_pointw  99, 101, 125
  1076.      fg_intjoy  281-283                      fg_pointx  101, 125
  1077.      fg_intkey  262, 263, 265,               fg_pointxw  101, 125
  1078.           281, 283, 294, 301                 fg_polyfill  107-109, 125
  1079.      fg_justify  133-135, 146                fg_polygon  105-107, 125
  1080.      fg_kbinit  265, 266, 283                fg_polygonw  106, 125
  1081.      fg_kbtest  265, 266, 283                fg_polyline  107-109, 125
  1082.      fg_locate  129-131, 134,                fg_polyoff  107
  1083.           137, 146, 152, 159,                fg_print  133-137, 146
  1084.           210                                fg_putblock  233, 234
  1085.      fg_makegif  175, 176, 188,              fg_putimage  203, 207, 215,
  1086.           306                                     219, 233
  1087.      fg_makepcx  172, 173, 175,              fg_quiet  287-289, 296
  1088.           176, 178, 188, 306                 fg_rect  80, 84, 111, 112,
  1089.      fg_makeppr  180, 188                         114, 125, 137-139,
  1090.      fg_makespr  178, 180, 188                    152, 192, 196, 227,
  1091.      fg_maprgb  89, 94                            238, 245
  1092.      fg_measure  302, 303                    fg_rectw  111, 125, 144
  1093.      Fg_memavail  304, 307                   fg_reset  45, 46, 57, 318
  1094.      fg_memory  55, 57                       fg_resize  164, 165, 170,
  1095.      fg_mousebut  271, 272, 283                   257, 258
  1096.      fg_mousecur  273, 274, 284              fg_restore  225, 227, 228,
  1097.      fg_mousefin  268, 284                        233, 235, 245, 251
  1098.                                              fg_restorew  225, 235
  1099. 338   Fastgraph User's Guide
  1100. Fastgraph routines (cont.)                   fg_showspr  178, 180, 181,
  1101.      fg_resume  295, 296                          188
  1102.      fg_revimage  203, 204,                  fg_sound  286-289, 291,
  1103.           207, 215, 217, 220                      292, 296
  1104.      fg_revmask  216, 217, 220               fg_sounds  291, 292, 294,
  1105.      fg_save  225-228, 233, 235                   296, 322
  1106.      fg_savew  225, 235                      fg_stall  301-303
  1107.      fg_scrlock  263, 284                    fg_suspend  295, 296
  1108.      fg_scroll  252-254, 258                 fg_svgainit  53-55, 57
  1109.      fg_setangle  143, 146                   fg_svgaver  55, 57
  1110.      fg_setattr  68, 69, 95,                 fg_swchar  140-144, 146
  1111.           98, 129, 130, 132,                 fg_swlength  144, 147
  1112.           146, 152, 153, 156,                fg_swtext  143, 144, 147
  1113.           158                                fg_tcdefine  231-233, 235
  1114.      fg_setcaps  264, 284                    fg_tcmask  231-233, 235
  1115.      fg_setclip  98, 126, 203                fg_tcxfer  231-233, 235
  1116.      fg_setclipw  98, 126                    fg_testmode  45, 46, 51,
  1117.      fg_setcolor  44, 69-80,                      53, 55, 57, 87, 152,
  1118.           82, 83, 84, 95, 98,                     155, 205, 225, 288
  1119.           99, 118, 119, 129,                 fg_text  44, 129-134, 136,
  1120.           132, 140, 146, 152,                     137, 138, 140, 146,
  1121.           153, 156, 158, 192,                     147
  1122.           239, 240, 241, 252,                fg_transfer  228, 230-233,
  1123.           253                                     235, 244-246, 251
  1124.      fg_setdacs  86-88, 95,                  fg_version  5, 55, 318
  1125.           306, 314                           fg_voice  287-289, 291-293,
  1126.      fg_setentry  166, 168, 170                   296
  1127.      fg_setfunc  240, 305, 307               fg_voices  292-294, 297,
  1128.      fg_sethpage  225, 226,                       322
  1129.           235, 250, 252                      fg_waitfor  85, 238, 244,
  1130.      fg_setlines  47, 57                          246, 254, 256, 263,
  1131.      fg_setmode  44, 46, 53,                      270, 289, 300-303
  1132.           57, 70, 77, 83, 88,                fg_waitkey  45, 262, 265,
  1133.           90, 91, 98, 99, 101,                    284
  1134.           109, 111, 117, 118,                fg_waitvr  306, 307
  1135.           129, 130, 132, 140,                fg_where  131, 147, 159
  1136.           152, 159, 165, 166,                fg_xalpha  64, 65, 138, 147
  1137.           182, 183-185, 205,                 fg_xconvert  64, 65, 138,
  1138.           260, 267, 279, 318,                     139, 147
  1139.           334                                fg_xscreen  64, 65, 99
  1140.      fg_setnum  264, 284                     fg_xworld  64, 65, 102
  1141.      fg_setpage  152, 170, 225               fg_yalpha  64, 65, 138, 147
  1142.      fg_setratio  140, 142, 146              fg_yconvert  64, 65, 138,
  1143.      fg_setrgb  73, 76, 80, 82,                   139, 147
  1144.           83, 84, 86, 89, 94,                fg_yscreen  64, 65, 99
  1145.           95, 185, 201                       fg_yworld  64, 65, 102
  1146.      fg_setsize  140, 146               Fastgraph/Light  2
  1147.      fg_setsizew  140, 146              Fastgraph/Light Video Driver  2,
  1148.      fg_setvpage  152, 161,                       29
  1149.           170, 246, 269, 306,           FGDRIVER  29
  1150.           307                                /U option  29
  1151.      fg_setworld  62-64, 140            Filler bits  191
  1152.      fg_showgif  175, 176, 188,         Fish tank animation demo  248
  1153.           306                           Flickering  306
  1154.      fg_showpcx  172-175, 187,          Foreground color  68, 69
  1155.           188, 306                      Full page transfer  222
  1156.      fg_showppr  180, 188               Game port  279
  1157.                                                                    Index   339
  1158. GetMem (TP procedure)  186, 233              vertical position  280
  1159. GIF file  175                           Keyboard  260
  1160.      creating  175                           buffer  262, 301
  1161.      displaying  175                         extended codes  260
  1162. GrabRGB  181, 313, 314                       handler  264
  1163.      /D option  314                          standard codes  260
  1164.      output file format  314                 state light  264
  1165. Graphics cursor  101                    Lines
  1166. Graphics modes  32, 35, 70                   dashed  104
  1167.      256-color  83                           solid  102
  1168.      CGA  35, 70, 72                    Linking  5
  1169.      EGA  37, 76, 78, 79                Logical pages  162
  1170.      Hercules  36, 74, 75                    creating  162
  1171.      MCGA  38, 81                            releasing  162
  1172.      native EGA  37                     Masking map  201, 215-218
  1173.      native VGA  38                     Memory conflicts
  1174.      PCjr  36, 73                            logical pages  167
  1175.      SVGA  40, 83                            virtual pages  167
  1176.      Tandy  73                          Memory models  3
  1177.      Tandy 1000  36                          large  4
  1178.      VGA  38, 81, 83                         medium  4
  1179.      XVGA  39                                small  3
  1180. Hardware characters  129                Memory update function  305
  1181.      graphics modes  133                Mickeys  269
  1182.      height  137                        Microsoft BASIC PDS  11
  1183.      side effects  136                  Microsoft C  3, 13
  1184.      text modes  129                    Microsoft C++  3, 13
  1185. HERCFIX  314, 315                       Microsoft FORTRAN  3, 14
  1186. Hidden page  151, 225                   Microsoft Mouse  267
  1187. HIMEM.SYS  162                          Microsoft QuickBASIC  3, 16
  1188. Hot spot  277                           Microsoft QuickC  3, 18
  1189. Image array  201                        Microsoft Visual Basic for DOS
  1190. Image buffer  186                                 3, 20
  1191. Images  172                             Microsoft Visual C++  3, 22
  1192.      clipped  203                       Mode X  39
  1193.      regular  195                       Mouse  266
  1194.      reversed  203                           button status  271
  1195.      reversed clipped  203                   CGA Considerations  278
  1196.      without transparent pixels              cursor  269, 273
  1197.           203                                cursor mask  273, 275
  1198. INCLUDE environment variable  6              cursor visibility  269
  1199. Input devices  260                           default cursor  275
  1200. INSTALL program  4                           hot spot  277
  1201.      /L option  5                            initialize  267
  1202. Installation  4                              limits  269
  1203. Interrupts  322                              position  269, 271
  1204. INTRFACE.FOR  6                              screen mask  273, 275
  1205. Joystick  279                                screen updates  269
  1206.      button status  280, 281,                speed  269
  1207.           322                                SVGA  268
  1208.      calibration  280                        XVGA  268
  1209.      characteristics  280               Mouse cursor  269, 273
  1210.      horizontal position  280                graphics modes  275
  1211.      initialize  279                         hot spot  277
  1212.      keyboard emulation  281                 text modes  273
  1213.      special considerations             Mouse driver  266
  1214.           283                           Music  289
  1215. 340   Fastgraph User's Guide
  1216. Music (cont.)                                unfilled  112
  1217.      asynchronous  293                  Region fill  121
  1218.      restarting  295                    Register preservation  318
  1219.      stopping  294                      Resolution  32
  1220.      suspending  295                    Reverse video  132
  1221.      synchronous  289                   RGB color mapping  89
  1222. Music commands  289                     Rubberband boxes  102, 113
  1223. Music string  289, 293                  Scan codes  265
  1224. Musical notes  289                      Screen dissolving  250
  1225. Naming conventions  5                   Screen mask  273, 275
  1226. NumLock  262-264                        Screen origin  255
  1227. Overscan  71                            Screen space  60, 61
  1228. Packed pixel run file  176, 179         Scrolling  252
  1229. Packed pixel run map  180, 213               circular  252
  1230. Page flipping  246, 247, 306,                end-off  252
  1231.           307                                increment  252
  1232. Palette  33                                  region  252
  1233. Palette number  73, 76, 78, 79,         ScrollLock  262, 263
  1234.           82                            SETMEM (BASIC function)  161
  1235. Palette registers  73, 76, 78,          Shadow  132
  1236.           79, 81, 83, 90, 91            Sliding tone  287
  1237. Palette value  73, 76, 78, 79           SNAPSHOT  181, 310, 311, 313,
  1238. Palettes  73, 76, 78, 79, 81,                     314
  1239.           83                                 error tone  310
  1240. Panning  164, 257, 306                       image files  310
  1241. PC Paintbrush  172                           success tone  310
  1242. PCOPTION environment variable           Software characters  139
  1243.           6                                  alternate font  139, 140,
  1244. PCX file  172                                     143
  1245.      creating  172                           angle  143
  1246.      displaying  172                         aspect ratio  140
  1247.      video mode compatibility                font change operator (\)
  1248.           174                                     141
  1249. PCXHEAD  315                                 primary font  139, 140
  1250. Periodic noise  288                          size  140
  1251. Physical pages  150                          string length  144
  1252. Pixel bleeding  279                          subscript operator (\v)
  1253. Pixel run  177                                    142
  1254. Pixel run file  176, 178, 180,               superscript operator (\^)
  1255.           181, 214                                142
  1256. Pixel run map  177, 181, 212                 underline operator (_)  142
  1257. Pixels  32                              Sound  286
  1258. Points  99                                   asynchronous  290
  1259. Polygon                                      disk accesses during  291
  1260.      filled  107, 108                        duration  286
  1261.      unfilled  105-107                       frequency  286
  1262.      vertex offsets  107                     PCjr  286
  1263. Power C  3, 23                               stopping  294
  1264. PPR file  176, 179                           synchronous  286
  1265. Put_string  131                              Tandy  286
  1266. QuickBASIC  3, 16                            volume  286
  1267. QuickC  3, 18                           Sound effects  286-288
  1268. READ.ME file  5                         Splitter cable  279
  1269. Real-time operations  300               SPR file  176
  1270. Rectangles                              Standard color set  70
  1271.      dithered  114                      Standard pixel run file  176
  1272.      solid  111                         Strlen  131
  1273.                                                                    Index   341
  1274. Stroke characters  139                       mode 23  40
  1275. SuperVGA  51                                 mode 24  40
  1276. SVGA  51                                     mode 25  40
  1277.      chipset  52                             mode 26  40
  1278.      dual banks  224                         mode 27  41
  1279.      initialization  53-55                   mode 28  41
  1280.      kernel  40, 52-56                       mode 29  41
  1281.      kernel version  54, 55                  mode X  39
  1282.      monitor compatibility  56               summary  32
  1283.      problematic cards  56              Video page resizing  257
  1284.      supported chipsets  52, 53         Video pages  33, 150
  1285.      VESA compatibility  52, 53              active  151, 152
  1286.      video memory present  55                hidden  151, 225
  1287. Texas Instruments SN76496A                   logical  162
  1288.           sound chip  286                    physical  150
  1289. Text cursor  44, 129, 159                    preserving  160, 166
  1290. Text modes  32, 33, 68                       resizing  164
  1291.      43 lines  47                            segment address  160
  1292.      50 lines  47                            virtual  150, 154
  1293.      color  68                               visual  151, 152
  1294.      monochrome  69                     Video subsystem  33
  1295. TI sound chip  286                      Virtual colors  90, 91
  1296. Transparency  190, 195, 197,            Virtual pages  150
  1297.           198, 200, 201, 203,                creating  154
  1298.           204, 212, 215, 218,                heap requirements  161
  1299.           231, 232, 233                      page flipping  161
  1300. Turbo C  3, 25                               releasing  155
  1301. Turbo C++  3, 25                             writing to unallocated  162
  1302. Turbo Pascal  3, 27                     Visual Basic  3, 20
  1303. Vector characters  139                  Visual C++  3, 22
  1304. Vertical retrace  306                   Visual effects  251
  1305. VESA  52, 53                            Visual page  151, 152
  1306. Video DAC registers  81-84, 86,         Warbling  287
  1307.           90, 306                       White noise  288
  1308.      EGA modes  87                      World space  60, 62
  1309. Video modes  32                         XMS  162
  1310.      mode 00  34                        XOR boxes  113
  1311.      mode 01  34                        XOR lines  102
  1312.      mode 02  34                        XOR pixels  101
  1313.      mode 03  34                        Zortech C++  3, 28
  1314.      mode 04  35
  1315.      mode 05  35
  1316.      mode 06  36
  1317.      mode 07  35
  1318.      mode 09  36
  1319.      mode 11  36
  1320.      mode 12  37
  1321.      mode 13  37
  1322.      mode 14  37
  1323.      mode 15  37
  1324.      mode 16  38
  1325.      mode 17  38
  1326.      mode 18  38
  1327.      mode 19  39
  1328.      mode 20  39
  1329.      mode 21  39
  1330.      mode 22  39