home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / PROG / BASIC / QBEVGFX2.ZIP / QBEVGFX.DOC < prev    next >
Encoding:
Text File  |  1992-03-21  |  19.2 KB  |  568 lines

  1.  
  2. Shareware Documentation            QB/EVGFX (C)1990 Cornel Huth
  3. with minor changes 21-Mar-92 chh
  4.  
  5. Complete documentation is available with registration.  See the
  6. end of this document for complete ordering information.
  7.  
  8. Shareware, def.  A try-before-you-buy marketing concept.  It
  9. relies on those that benefit from the product to pay for it.  Go
  10. ahead and try before you buy.  If you can't use it, pass it
  11. along, someone else may.  If you can and do use it, pay for it. 
  12. What do you get for your money?  Not only the legal continued use
  13. of the product but you also get personal support from the author. 
  14. Need something changed for a particular need?  Just ask.  Try
  15. that anywhere else.  Just remember, this product is not free, so
  16. if you use it please pay for it.
  17.  
  18.  
  19. OVERVIEW
  20.  
  21. QB/EVGFX is a set of graphic routines for the EGA and VGA
  22. assembled into a linkable LIB file.  All routines have been
  23. written in 8086 assembly and are self-contained.  In other words,
  24. even though QB/EVGFX has been designed for QuickBASIC 4.00+
  25. compilers, QuickBASIC itself is not needed.
  26.  
  27. QB/EVGFX requires an EGA or VGA compatible video card with at
  28. least 256K of RAM.  It can be used in any native EGA and VGA mode
  29. and also extended modes.  All these routines will work on either
  30. an EGA or VGA.
  31.  
  32. Accept the fact that these routines are for programmers. 
  33. Understand that this documentation is for programmers.
  34. If you are not completely familiar with QB, BC, LINK and LIB, do
  35. not fault this documentation.  Consult the appropriate reference
  36. or register this release to receive the 70-plus-page programmer
  37. reference manual.  The manual describes each routine completely
  38. and offers ideas on how it, and QB/EVGFX, can best be used.
  39.  
  40. @@@@@@@@ Version 1.1 is the latest and greatest release of QB/EVGFX @@@@@@@@@@@
  41. @                                                                             @
  42. @ This shareware release you now have is 1.0, the original. Release 1.1       @
  43. @ has a few more routines (like dithered windows), cleaned-up docs, better    @
  44. @ window parameters (x/y-size rather than end-points), more fonts (70+),      @
  45. @ pixel-precision windowed draw routines, and more I can't remember now.      @
  46. @ Release 1.0 was distributed through limited channels nearly 1 1/2 years     @
  47. @ ago. This re-release through PDN (thanks Erik! et. al) should result in a   @
  48. @ greater exposure and that's what shareware is all about. -- Granted, these  @
  49. @ docs in this shareware release won't make you an instant expert, but it sure@
  50. @ should give you a good idea of what this package can do for you. To order   @
  51. @ your copy see the form at the end of this documentation and in !ORDER.FRM.  @
  52. @                                                                             @
  53. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  54.  
  55. ----------------------------------------------------------------
  56. * Some routines require a variable-length string in DGROUP as a 
  57. * parameter.  If you don't have this capability, see the section
  58. * on simulating this data structure.
  59. ----------------------------------------------------------------
  60.  
  61.  
  62. -----------------------
  63. QB/EVGFX COMMAND SUMMARY
  64.  VIDEO CONTROL ROUTINES
  65.  DRAWING ROUTINES
  66.  FONTS
  67.  MISC ROUTINES
  68.  
  69. -------------------------------
  70. VIDEO CONTROL ROUTINES include:
  71.  
  72. EGAVIDEO,VGAVIDEO,COLORVIDEO
  73. SETMODE,SETMODEX,GETMODE
  74. SETPSA,GETPSA
  75. SETPALREG,SETPALETTE
  76. SETSCNBUFF
  77. BLANKSCN
  78. BLINKBIT
  79. WAITVS
  80.  
  81.  
  82. FUNCTION EGAVIDEO%()
  83. EGAVIDEO returns -1 if EGA video is supported, 0 if not.
  84. Eg>IsEGA = EGAVIDEO
  85.  
  86.  
  87. FUNCTION VGAVIDEO%()
  88. VGAVIDEO returns -1 if VGA video is supported, 0 if not.
  89. Eg>IsVGA = VGAVIDEO
  90.  
  91.  
  92. FUNCTION COLORVIDEO%()
  93. COLORVIDEO returns -1 if color video is supported, 0 if not.
  94. Eg>IsColor = COLORVIDEO
  95.  
  96.  
  97. SUB SETMODE(mode%)
  98. SETMODE sets the computer's BIOS video to mode.  
  99. Normal EGA 640x350x16 graphics (QB SCREEN 9) is SETMODE 16.
  100. Normal VGA 640x480x16 graphics (QB SCREEN 12) is SETMODE 18.
  101. Eg>SETMODE &H10
  102.  
  103.  
  104. SUB SETMODEX(regax%,regbx%)
  105. SETMODEX is similar to SETMODEX but allows setting the computer's
  106. BIOS mode to an extended mode.  Most extended modes require only
  107. the AL register, in which case SETMODE can be used.  However,
  108. some video adapter's extended modes need an additional register
  109. to also be set (eg EVEREX).  Consult your adapter manual.
  110. Eg>SETMODEX &H0070,&H0
  111.  
  112.  
  113. FUNCTION GETMODE%()
  114. GETMODE returns the current BIOS video mode.
  115. Eg>VMode = GETMODE
  116.  
  117.  
  118. SUB SETPSA(onoff%)
  119. SETPSA activates/deactivates the palette save area. 
  120. SETPSA 1 activates the BIOS palette save area.  Any future
  121. changes in the palette will be stored there for later recall.
  122. SETPSA 0 deactivates the BIOS palette save area.  If you activate
  123. the PSA in your program you MUST deactivate it before the program
  124. ends.
  125. Eg>SETPSA 1
  126.  
  127.  
  128. SUB GETPSA(pal17$)
  129. GETPSA returns a table of palette values and border color.  The
  130. variable pal17$ is a variable length string in DGROUP. The first
  131. byte of pal17$ returned is the color value for attribute 0,
  132. second byte is attribute 1, and so on.  Byte 17 of pal17$ is the
  133. color border value.  This routine should only be used if there is
  134. an active palette save area (SETPSA 1).
  135. Eg>GETPSA pal17$
  136.  
  137.  
  138. SUB SETPALREG(reg%,colorval%)
  139. SETPALREG sets one of the palette registers.  Attribute 0 is
  140. controlled by register 0, attribute 1 by register 1...up to
  141. register 17 which is the border color.  Colorval is any color
  142. value between 0 and 63.
  143. Eg>SETPALREG 8,&H37
  144.  
  145.  
  146. SUB SETPALETTE(pal17$)
  147. SETPALETTE sets all 16 palette registers and the border with a
  148. single call.  The variable pal17$ is a variable length string in
  149. DGROUP.  The first byte of pal17$ is the color value for
  150. attribute 0, second byte is attribute 1, and so on.  Byte 17 of
  151. pal17$ is the border color value.  
  152. Eg>SETPALETTE pal17$
  153.  
  154.  
  155. SETSCNBUFF(x1%,y1%)
  156. SETSCNBUFF set the logical dimensions of the video display
  157. buffer.  This should be done after every video mode change. 
  158. Standard dimensions are x1%=640, y1%=350 for EGA mode 16,
  159. x1%=640,y1%=480 for VGA mode 18.
  160. Eg>SETMODE &H12
  161. Eg>SETSCNBUFF 640,480
  162.  
  163.  
  164. BLANKSCN(onoff%)
  165. BLANKSCN turns the video system on or off.
  166. BLANKSCN 1 turns the video off.
  167. BLANKSCN 0 turns the video back on.
  168. Eg>BLANKSCN 1
  169.  
  170.  
  171. BLINKBIT(onoff%)
  172. BLINKBIT allows selecting either 16 possible background values or
  173. 8 background values and 8 blinking.  The palette needs to be
  174. adjusted on the EGA before using BLINKBIT 1.
  175. Eg>BLINKBIT 1
  176.  
  177.  
  178. WAITVS(count%)
  179. WAITVS waits for count% vertical sync signals.  In EGA mode 16
  180. and VGA mode 18 a vert sync is at least 1/60th of a second. 
  181. Eg>WAITVS 1
  182.  
  183.  
  184. -------------------------
  185. DRAWING ROUTINES include:
  186.  
  187. READDOT,DRAWDOT
  188. DRAWCH
  189. SETSTEP,GETSTEP
  190. DRAWLN,DRAWLNP,DRAWLNS
  191. DRAWSTR
  192. DRAWELL
  193. FILLSCN,FILLAREA,FILLAREAP,FLUDAREA,FLUDAREAP
  194. DIMBLOCK,GETBLOCK,PUTBLOCK
  195.  
  196.  
  197. The x and y coordinates are screen coordinates with 0,0 at the
  198. upper-left of the screen.  x runs across, y runs down.
  199.  
  200. The value is an attribute value, 0 to 15.  Eg, using a value of 7
  201. would use the color value in attribute register 7.
  202.  
  203. The mode is the method used when updating the pixels.  A mode=0
  204. replaces the pixels, mode=8 ANDs the pixels, mode=16 ORs the
  205. pixels, and mode=24 XORs the pixels.
  206.  
  207.  
  208. FUNCTION READDOT%(x0%,y0%)
  209. READDOT returns the value of the pixel at position x0,y0.
  210. Eg>dot = READDOT(320,175)
  211.  
  212.  
  213. SUB DRAWDOT(mode%,value%,x0%,y0%)
  214. DRAWDOT sets the pixel by mode at position x0,y0 to value.
  215. Eg>DRAWDOT 0,7,320,175
  216.  
  217.  
  218. SUB DRAWCH(mode%,char%,x0%,y0%,fg%,bg%)
  219. DRAWCH draws ASCII char by mode at position x0,y0 in foreground
  220. value fg, background bg.
  221. Eg>DRAWCH 0,65,0,0,7,0
  222.  
  223.  
  224. SUB DRAWLN(mode%,value%,x0%,y0%,x1%,y1%)
  225. DRAWLN draws a line by mode from x0,y0 to x1,y1 in value.
  226. Eg>DRAWLN 0,7,0,0,639,349
  227.  
  228.  
  229. SUB DRAWLNP(mode%,pattern$,x0%,y0%,x1%,y1%)
  230. DRAWLNP draws a line by mode from x0,y0 to x1,y1 using the
  231. pattern pattern$.  The first byte of pattern$ is to be the shift
  232. count, the other bytes are the attribute values to use as the
  233. pattern.  Though not all that useful in DRAWLNP, the shift count
  234. lets you fill with diagonal patterns in the pattern fill
  235. routines. 
  236. Eg>pattern$=chr$(0)  'no shift after each line
  237. Eg>for i=1 to 15:pattern$ = pattern$ + chr$(i):next
  238. Eg>DRAWLNP 0,pattern$,0,0,320,175
  239.  
  240.  
  241. SUB SETSTEP(x0%,y0%)
  242. SETSTEP sets the x0,y0 point for DRAWLNS.
  243. Eg>SETSTEP 320,175
  244.  
  245.  
  246. SUB GETSTEP(x0%,y0%)
  247. GETSTEP returns the current x0%,y0% step point.
  248. Eg>GETSTEP x0,y0
  249. Eg>PRINT x0;y0   'x0=320,y0=175
  250.  
  251.  
  252. SUB DRAWLNS(mode%,value%,x1%,y1%)
  253. DRAWLNS draws a line by mode from step point to x1,y1 in value. 
  254. The initial step point is set using SETSTEP, thereafter, DRAWLNS
  255. updates the step point.  You cannot have any other QB/EVGFX
  256. routines between successive DRAWLNSs.
  257. Eg>DRAWLNS 0,7,310,160
  258.  
  259.  
  260. FUNCTION DRAWSTR%(mode%,strg$,x0%,y0%,fg%,bg%,gap%)
  261. DRAWSTR draws a text string by mode starting at x0,y0 in
  262. foreground value fg, background bg, with an inter-character gap
  263. of gap.  If gap=0 the inter-character gap is taken from the
  264. font's width table for proportional spacing.  DRAWSTR returns the
  265. next available x-position after the end of the string.
  266. Eg>nx=DRAWSTR(0,"Drawn in proportional space...",0,0,7,0,0)
  267.  
  268.  
  269. SUB DRAWELL(mode%,value%,xC%,yC%,maj%,min%)
  270. DRAWELL draws an ellipse by mode with the center at xC,yC with an
  271. x-radius of maj, y-radius of min, in value.
  272. Eg>DRAWELL 0,7,320,175,100,130
  273.  
  274.  
  275. SUB FILLSCN(lines%,value%)
  276. FILLSCN fills the screen buffer starting at 0,0 for lines count,
  277. in value.
  278. Eg>FILLSCN 350,0
  279.  
  280.  
  281. SUB FILLAREA(mode%,newval%,borderval%,x%,y%)
  282. FILLAREA will boundary-fill any shape by mode, bounded by
  283. borderval completely enclosing x,y, with newval.  For each level
  284. of complexity, FILLAREA uses 12 bytes of stack space.  Many areas
  285. can be filled with as little at 12 bytes (an empty circle) while
  286. others can require more, perhaps 1K (very complex).  In any case,
  287. by changing the DECLARE of FILLAREA from a SUB to a FUNCTION, you
  288. can get the maximum number of bytes used on the stack, say, for
  289. debugging purposes.
  290. Eg>DECLARE FILLAREA%(mode%,newval%,borderval%,x%,y%)
  291. Eg>maxbytes=FILLAREA(0,5,7,320,175)
  292.  
  293.  
  294. SUB FILLAREAP(mode%,pattern$,borderval%,x%,y%)
  295. FILLAREAP will boundary-fill any non-complex shape by mode,
  296. bounded by borderval completely enclosing x,y, with pattern$. 
  297. FILLAREAP cannot make complex pattern fills.  For complex pattern
  298. fills, use FLUDAREAP.  See DRAWLNP for the structure of pattern$.
  299. Eg>FILLAREAP 0,pattern$,7,320,175)
  300.  
  301.  
  302. SUB FLUDAREA(mode%,newval%,x%,y%)
  303. FLUDAREA will flood-fill any shape by mode that has the value at
  304. x,y, with newval.  The difference between FLUDAREA and FILLAREA
  305. is that FILLAREA stops when it reaches a borderval, going over
  306. any other value.  FLUDAREA stops when it reaches any value other
  307. than the value at the seed, x,y.  For stack usage, see FILLAREA.
  308. Eg>FLUDAREA 0,15,320,175
  309.  
  310.  
  311. SUB FLUDAREAP(mode%,pattern$,x%,y%)
  312. FLUDAREAP will flood-fill any shape by mode that has the value at
  313. x,y, with pattern$.  For stack usage, see FILLAREA.  See DRAWLNP
  314. for the structure of pattern$.
  315. Eg>FLUDAREAP 0,pattern$,320,175
  316.  
  317.  
  318. FUNCTION DIMBLOCK&(pmask%,x0%,y0%,x1%,y1%)
  319. DIMBLOCK is used to calculate the number of bytes needed to store
  320. the block defined by the upper-left coordinates x0,y0 and lower-
  321. right coordinates x1,y1, based on the plane mask, pmask.  Pmask
  322. is the mask value of planes to be used where 0 is no planes and
  323. 15 is all 4 planes (pmask=3 uses planes 0 & 1...).
  324. Eg>sz& = DIMBLOCK&(15,0,0,79,99)
  325. Eg>PRINT sz&   'size = 4006 bytes
  326.  
  327.  
  328. SUB GETBLOCK(pmask%,x0%,y0%,x1%,y1%,vseg%,voff%)
  329. GETBLOCK stores to RAM the block defined by the upper-left
  330. coordinates x0,y0 and the lower-right coordinates x1,y1, based on
  331. the plane mask, pmask.  The vseg and voff parameters are the
  332. VARSEG and VARPTR to the storage area in RAM.
  333. Eg>REDIM buff(0 TO sz&) AS STRING * 1
  334. Eg>GETBLOCK 15,0,0,79,99,VARSEG(buff(0)),VARPTR(buff(0))
  335.  
  336.  
  337. SUB PUTBLOCK(mode%,x0%,y0%,vseg%,voff%)
  338. PUTBLOCK stores to the video buffer by mode the block in RAM to
  339. the upper-left coordinates x0,y0.  The block in RAM is pointed to
  340. by the vseg and voff parameters.
  341. Eg>PUTBLOCK 0,1,1,VARSEG(buff(0)),VARPTR(buff(0))
  342.  
  343.  
  344. ----------------------
  345. FONT ROUTINES include:
  346.  
  347. FONTSYS08,FONTSYS14,FONTSYS16,FONTSRF14P
  348. USERFONT
  349.  
  350.  
  351. SUB FONTSYS08()
  352. FONTSYS08 makes the DRAWCH and DRAWSTR routines use the system
  353. 8x8 font in adapter ROM.
  354. Eg>FONTSYS08
  355.  
  356.  
  357. SUB FONTSYS14()
  358. FONTSYS14 makes the DRAWCH and DRAWSTR routines use the system
  359. 8x14 font in adapter ROM.
  360. Eg>FONTSYS14
  361.  
  362.  
  363. SUB FONTSYS16()
  364. FONTSYS16 makes the DRAWCH and DRAWSTR routines use the system
  365. 8x16 font in adapter ROM.  This is a VGA-only font.  On EGA
  366. systems this call will use the 8x14 font.
  367. Eg>FONTSYS16
  368.  
  369.  
  370. SUB FONTSRF14P()
  371. FONTSRF14P is the proportional font included in the shareware
  372. release of QB/EVGFX.  Many other fonts and a font editor are
  373. available.  With them the programmer can create callable or user
  374. fonts. 
  375. Eg>FONTSRF14P
  376.  
  377.  
  378. SUB USERFONT(vseg%,voff%,pts%)
  379. USERFONT defines a dynamic font.  By using this routine, the
  380. programmer can use fonts stored on disk rather than having all
  381. fonts linked in memory.  Vseg and voff point to the font data,
  382. pts is the height of the font.  The programmer allocates storage
  383. for the largest font to be used, then loads the font data from
  384. disk into the storage area.  The area can be reused.
  385. Eg>REDIM buff(0 TO 8448) AS STRING * 1 'max 32 pts+width table
  386. Eg>DoLOADUF font$,buff()
  387. Eg>USERFONT VARSEG(buff(0)),VARPTR(buff(0)),pts
  388.  
  389.  
  390. ----------------------
  391. MISC ROUTINES include:
  392.  
  393. GETBIT,SETBIT,XORBIT
  394.  
  395.  
  396. FUNCTION GETBIT%(BYVAL CheckMe%,BYVAL BitPos%)
  397. GETBIT returns non-zero if the bit at BitPos is set in CheckMe. 
  398. BitPos is 15-0 with bit 15 the most significant, 0 the least.
  399. Eg>set = GETBIT(CheckMe,15)
  400.  
  401.  
  402. FUNCTION SETBIT%(BYVAL UseMe%,BYVAL BitPos%)
  403. SETBIT sets the bit at BitPos returning the new value.
  404. Eg>UseMe = SETBIT(UseMe,0)
  405.  
  406.  
  407. FUNCTION XORBIT%(BYVAL XorMe%,BYVAL BitPos%)
  408. XORBIT toggles the bit at BitPos returning the new value.
  409. Eg>NewXorMe = XORBIT(XorMe,15)
  410.  
  411.  
  412.  
  413. -------------------------------------------------
  414. In addition to the shareware release of QB/EVGFX:
  415. QB/EVGFX2, QB/EVGFX plus window and 2-D routines:
  416.  
  417. SUB SETWIN2D(vseg2%,voff2%)
  418. SETWIN2D defines the 2-D window.
  419.  
  420. SUB GETWIN2D(vseg2%,voff2%)
  421. GETWIN2D returns the window definitions.
  422.  
  423. SUB SETSCNORG(x0%,y0%)
  424. SETSCNORG positions the hardware display start address allowing
  425. smooth-scrolling of the video buffer, page flipping...
  426.  
  427. FUNCTION DRAWSTRW%(mode%,strg$,x0%,y0%,fg%,bg%,gap%)
  428. DRAWSTRW is identical to DRAWSTR except it only draws characters
  429. that are within the defined window.
  430.  
  431. SUB DRAWELLW(mode%,value%,xC%,yC%,maj%,min%)
  432. DRAWELLW is identical to DRAWELL except that it draws only within
  433. the defined window.  DRAWELLW can also be used to draw arcs.
  434.  
  435. SUB FILLWIN(mode%,value%)
  436. FILLWIN fills the defined window with value.
  437.  
  438. SUB FILLWINP(mode%,pattern$)
  439. FILLWINP fills the defined window with pattern$.
  440.  
  441. SUB XFORM2D(vseg2%,voff2%)
  442. XFORM2D performs complete transformations in 2-D on any number of
  443. 2-D points.  Rotation degrees, rotational center, x-axis
  444. translation, y-axis translation, x-axis scale, y-axis scale, can
  445. all be done with a single call.
  446.  
  447. FUNCTION CLIP2D%(vsegln2%,voffln2%)
  448. CLIP2D performs the classic Sutherland-Cohen algorithm to clip
  449. lines to the defined window.  Approximately 1000 lines per second
  450. per MHz CPU speed can be clipped (33000 lines/sec on a 386/33).
  451.  
  452.  
  453.  
  454. ------------------------------------------------------------
  455. In addition to the shareware release QB/EVGFX and QB/EVGFX2:
  456. QB/EVGFX3, QB/EVGFX plus QB/EVGFX2 plus 3-D routines:
  457.  
  458. SUB SETWIN3D(vseg3%,voff3%)
  459. SETWIN3D defines the 3-D window.
  460.  
  461. SUB GETWIN3D(vseg3%,voff3%)
  462. GETWIN3D returns the window definitions.
  463.  
  464. SUB XFORM3D(vseg3%,voff3%)
  465. XFORM3D performs complete transformations in 3-D on any number of
  466. 3-D points.  Rotation heading, pitch, bank, rotational center, x-
  467.  & y- & z-axis translation, x- & y- & z-axis scale can all be
  468. done with a single call.
  469.  
  470. FUNCTION CLIP3D%(vsegln3%,voffln3%)
  471. CLIP3D performs the classic Sutherland-Cohen algorithm to clip
  472. lines to the defined window.  Approximately 1000 lines per second
  473. per MHz CPU speed can be clipped (33000 lines/sec on a 386/33).
  474.  
  475. SUB PROJORTHO(vseg3%,voff3%)
  476. PROJORTHO performs orthographic parallel projection conversion on
  477. a set of 3-D points.
  478.  
  479. SUB PROJPERS(vseg3%,voff3%)
  480. PROJPERS performs one-point perspective projection conversion on
  481. a set of 3-D points.
  482.  
  483.  
  484. -------------------------------
  485. SIMULATING NEAR VAR-LEN STRINGS
  486.  
  487. Declare the routine replacing $ with a % and BYVAL
  488. DECLARE FUNCTION DRAWSTR%(mode%,BYVAL doff%,x0%,y0%,fg%,bg%,gap%)
  489.                                 ^^^^^
  490. Define a structure that will be stored in DGROUP.
  491. TYPE SIMSTRtype
  492. length AS INTEGER
  493. addr   AS INTEGER
  494. strg   AS STRING * 200   'or whatever max length you want
  495. END TYPE
  496. DIM SIMSTR AS SIMSTRtype
  497.  
  498. text$ = "I'M REGISTERING QB/EVGFX, NOW!"  'pretty soon, then?
  499. SIMSTR.strg = text$
  500. SIMSTR.length = LEN(text$)
  501. SIMSTR.addr = VARPTR(SIMSTR.strg)
  502. nx = DRAWSTR(0,VARPTR(SIMSTR),0,0,7,0,8)
  503.  
  504.  
  505.  
  506. All orders include the respective programmer's manual.  Upgrades
  507. are available at the difference in price plus $10.  All orders
  508. will receive update notices unless request is made otherwise.
  509.  
  510. No credit card orders accepted. Phone only for information.
  511.  
  512.  
  513.  
  514.                            QB/EVGFX v1.1 ORDER FORM
  515.  
  516.  
  517.                                                       Qty     Extended
  518.  
  519.       QB/EVGFX basic  . . . . . . . . . . . $20.00 x _____ = __________
  520.  
  521.  OR,  QB/EVGFX basic + 2-D windows  . . . .  40.00 x _____ = __________
  522.  
  523.  OR,  QB/EVGFX basic + 2-D + 3-D windows  .  60.00 x _____ = __________
  524.  
  525.       Additional products:
  526.          FONTED and 70 fonts .  . . . . . . $20.00 x _____ = __________
  527.  
  528.                                                   Subtotal:  __________
  529.  
  530.               (Texas residents only add 8.25%)   Sales tax:  __________
  531.  
  532.       SHIPPING COSTS   USA   CDN   Foreign  Shipping costs:  ___0.00___
  533.                       none   none   none
  534.                                                      TOTAL: $
  535.                                                              ==========
  536.       Please remit TOTAL amount in US funds on US bank only, to:
  537.  
  538.         Cornel Huth                    |Foreign order may send US currency
  539.         6402 Ingram Rd.                |via Registered mail--be sure to
  540.         San Antonio, TX  78238-3915    |endorse as AirMail in any case.
  541.         U.S.A
  542.  
  543.  
  544.       Name: ___________________________________________________________
  545.  
  546.       Mailing address: ________________________________________________
  547.  
  548.       _________________________________________________________________
  549.  
  550.       _________________________________________________________________
  551.  
  552.       _________________________________________________________________
  553.  
  554.       Special instructions or comments (continue on reverse if needed):
  555.  
  556.  
  557.  
  558.       Please indicate how you obtained QB/EVGFX. If from a BBS please
  559.       indicate which one and its telephone number:
  560.  
  561.       _________________________________________________________________
  562.  
  563.       BBS:_____________________________ Tele: (     )______-___________
  564.  
  565.  Opt. CPU:________   O/S:______________  RAM:____________ HD:__________
  566.  
  567.       What software would you like to see:_____________________________
  568.