home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 053.lha / Warptext.asm < prev    next >
Assembly Source File  |  1986-11-20  |  22KB  |  513 lines

  1. From sdcsvax!chem.UCSD.EDU!crash!pnet01!billk@ucbvax.Berkeley.EDU Fri Jun  5 05:38:44 1987
  2. Received: by ingres.Berkeley.EDU (5.57/1.14)
  3.     id AA26561; Fri, 5 Jun 87 04:38:34 PST
  4. Received: by ucbvax.Berkeley.EDU (5.57/1.25)
  5.     id AA12570; Fri, 5 Jun 87 05:38:00 PDT
  6. Received: by sdcsvax.UCSD.EDU (5.57/5.0)
  7.     id AA01616 for ucbingres!hatcher; Fri, 5 Jun 87 04:36:17 PST
  8. Received: by chem.ucsd.edu (5.57)
  9.     id AA17340; Thu, 5 Jun 86 05:35:17 PDT
  10. Received: by crash.CTS.COM (5.54/UUCP-Project/rel-1.0/09-14-86)
  11.     id AA09156; Thu, 4 Jun 87 22:56:39 PDT
  12. Reply-To: sdcsvax!pnet01.UCSD.EDU!billk@ucbvax.Berkeley.EDU
  13. Message-Id: <8706050556.AA09156@crash.CTS.COM>
  14. Date: Thu, 4 Jun 87 22:39:19 PDT
  15. From: sdcsvax!pnet01.CTS.COM!billk@ucbvax.Berkeley.EDU (Bill Kelly)
  16. To: crash!kim@amdahl
  17. Subject: WarpText Prerelease
  18. Status: R
  19.  
  20. Well, after all of this time, I've *finally* finished my WarpText routines.
  21.  
  22. I'm very sorry it took OVER TWO WEEKS longer than I had originally expected!
  23. (The infamous SCHOOL_FINALS have struck again... :-)
  24.  
  25. Thanks go to all of you who offered suggestions as to how to do certain things.
  26. I have tried to implement them.  If you don't see what you asked for working
  27. yet, remember this is just a pre-release...  (Geez, someone wanted optional
  28. 'word-wrap' -- I don't know...)
  29.  
  30. Anyway, the following are the two files (source code) that you need to get
  31. WarpText going.  They are separated by ">>>> CUT HERE <<<<" thingies.
  32.  
  33. I assembled them with the MetaComCo Asembler.
  34.  
  35. Well, Have fun!!!
  36.  
  37. P.S. This routine does alot more than my original one, but I didn't sacrifice
  38. much speed.  It seems to spit out about 13,500 characters a second.
  39. Not too shabby, eh? :-)
  40.  
  41. >>>>>>>>>>>>>>> CUT HERE -- Filename: WarpText.asm <<<<<<<<<<<<<<<<<<<<<<<<<
  42. * --------------------------------------------------------------------------
  43. * WarpText.asm -- (PRE-RELEASE!) an ultra-fast,                   Bill Kelly
  44. * super_spiffy text-emitting routine.  :-)                        06/04/87
  45. *
  46. * Copyright 1987 by Bill W. Kelly.
  47. *
  48. * THANKS:
  49. *
  50. *   Many thanks to Hayes C. Haugen for giving me the idea to write
  51. *   these routines-- I took one look at Blitz and thought:
  52. *   "I've *gotta* DO that!"  Well, thanks, Hayes -- I've done it.
  53. *   Now, if I could *only* make a file requestor as nice as yours!!! :-)
  54. *
  55. *   Thanks also to the people who gave me suggestions about ways to improve
  56. *   the WarpText routines I had originally written!  These are much nicer...
  57. *
  58. * COPYRIGHT NOTICE:
  59. *
  60. *   This code, and the name "WarpText," is Copyright 1987 by Bill W. Kelly.
  61. *
  62. * DISTRIBUTION INFORMATION:
  63. *
  64. *   You may distribute this code in any way you want to.  I would prefer
  65. *   that you charge less than $10 for distribution, however, and please
  66. *   leave this whole notice intact.  Please also distribute the file
  67. *   "WarpText.i" together with "WarpText.asm" (this file).  Thanks!
  68. *
  69. *   NOTE: IF YOU ARE GOING TO MODIFY THE CODE, please make a little note
  70. *         containing the date, what the original code was, and anything
  71. *         else you deem necessary...
  72. *
  73. * USING WARPTEXT IN A PROGRAM:
  74. *
  75. *   That's what it's here for!
  76. *
  77. *   If you are going to distribute the source code with your program
  78. *   please follow the restrictions under "DISTRIBUTION INFORMATION."
  79. *
  80. *   It would be neat, especially if you aren't distributing the source
  81. *   with your program, if you could find a place somewhere in your program
  82. *   (the "ABOUT" menu, for instance) to say something like,
  83. *   "Using Bill Kelly's WarpText routines for speed!," however if you
  84. *   don't seem to be able to do this... don't worry about it.  I would
  85. *   really appreciate it, though!  Thanks!
  86. *
  87. *   PLEASE CONTACT ME BEFORE USING THIS CODE IN A COMMERCIAL PROGRAM!
  88. *
  89. * MY ADDRESS:
  90. *
  91. *   NAME: Bill W. Kelly
  92. *   UUCP: {akgua, hplabs!hp-sdd, sdcsvax}!crash!pnet01!billk
  93. *   ARPA: crash!pnet01!billk@nosc
  94. *   INET: billk@pnet01.CTS.COM    | For UUCP, don't do just pnet01!billk;
  95. *   USPS: 2507 Caminito La Paz    | please include the crash!pnet01!billk.
  96. *         La Jolla, CA  92037     | Thanks!
  97. *   FONE: (619) 454-1307
  98. *
  99. * PRE-RELEASE:
  100. *
  101. *   This is a pre-release version of WarpText.  In about half a month or
  102. *   a month I plan to release a version of WarpText that comes with
  103. *   an example program and has any reported bugs fixed.  I will also
  104. *   be adding a real clearscreen (clear 'window') on a formfeed and some
  105. *   other features.  If any of the code looks strange, or you notice
  106. *   that I'm doing something like "moveq #0,dn" where I don't need to...
  107. *   Well, you might mention it to save me time, although I will be going
  108. *   back over the code to look for little things like this...
  109. *   I took as much time as my schedule would permit to write this and get
  110. *   it debugged and out.  There are probably a few strange or unneeded
  111. *   things I've done -- I haven't *really* LOOKED at the code yet,
  112. *   though I have tested it...  Ah well...
  113. *
  114. * GEE, THAT'S ALL VERY NICE, BUT HOW DO I CALL THESE ROUTINES???
  115. *
  116. *   Well, I have given you yet another structure to deal with...
  117. *   Let me introduce you to WarpInfo...
  118. *
  119. *   STRUCTURE   WarpInfo,0      ; ...the <I> denotes internal use.
  120. *       APTR    wi_TextFont     ;     Pointer to a TextFont structure.
  121. *       APTR    wi_BitMap       ;     Pointer to a BitMap structure.
  122. *       WORD    wi_WhichPlane   ;     Which bitplane to render into.
  123. *       WORD    wi_Left         ;     Left edge of 'window' in char loc's.
  124. *       WORD    wi_Top          ;     Top edge of 'window' in char loc's.
  125. *       WORD    wi_Width        ;     Width of 'window' in char loc's.
  126. *       WORD    wi_Height       ;     Height of 'window' in char loc's.
  127. *       APTR    wi_WindowTop    ; <I> Address of top of 'window.'
  128. *       APTR    wi_CurLine      ; <I> Address of start of current line.
  129. *       APTR    wi_LastLine     ; <I> Address of start of last line.
  130. *       WORD    wi_CurX         ; <I> Current X position.
  131. *       WORD    wi_LastX        ; <I> Maximum X position on a line.
  132. *       WORD    wi_BPMod        ; <I> # total possible chars on a line in bp
  133. *       WORD    wi_Modulo       ; <I> Add this to get to next line.
  134. *       LABEL   wi_SIZE
  135. *
  136. *   When you assemble WarpText.asm, it will expect to find this structure
  137. *   in graphics directory of your include files.  It will do:
  138. *   INCLUDE "graphics/warptext.i"   I have already created a file called
  139. *   "WarpText.i" which should be distributed along with this file.
  140. *
  141. *   Now about the routines: there are only four routines that make up
  142. *   WarpText.  You must call the InitWarpInfo routine before calling any
  143. *   of the other three routines.
  144. *
  145. *   Please see each routine for information about how to call them.
  146. *
  147. * OH YEAH, BUG REPORTS:
  148. *
  149. *   What, bugs in *my* code???  (Shut up, Bill...!)
  150. *
  151. *   I would really appreciate hearing about the problems you find in
  152. *   my code!  I welcome your input.  'Ya know, suggestions, questions,
  153. *   comments, flames?, etc...
  154. *
  155. *   Remember, this is a pre-release version of WarpText.  I plan to release
  156. *   a version that *actually* has an EXAMPLE program with it. (Gee...)
  157. *   In this version I will fix all the reported bugs and may make some
  158. *   changes if anyone comes up with any interesting suggestions.
  159. *
  160. *   Anyway,
  161. *
  162. * HAVE FUN!                                                         Bill
  163. * --------------------------------------------------------------------------
  164.  
  165.     XDEF InitWarpInfo
  166.     XDEF GotoXY
  167.     XDEF GetXY
  168.     XDEF WarpText
  169.  
  170.             NOLIST  ; I don't want to see all of this junque...
  171.  
  172.                INCLUDE "graphics/text.i"
  173.                INCLUDE "graphics/gfx.i"
  174.                INCLUDE "graphics/warptext.i"
  175.  
  176.             LIST    ; Turn listing back on...
  177.  
  178. * -----------------------------------------
  179. * Seems like a good place to put some code:
  180. * -----------------------------------------
  181.  
  182.             CODE    ; Ready...FIRE! ...Aim?
  183.  
  184. * --------------------------------------------------------------------------
  185. * INITWARPINFO NEEDS:
  186. *
  187. * a0 - Pointer to an instance of the WarpInfo structure, with the following
  188. *      fields initialized:
  189. *
  190. *   wi_TextFont:    Pointer to an open font.  (I.e. what OpenFont() returns
  191. *                   to you, other than NULL.)
  192. *   wi_BitMap:      Pointer to an initialized, 'working' BitMap structure.
  193. *                   (E.g. Open a window.  Get the pointer to the screen
  194. *                   out of wd_WScreen.  From there the BitMap structure is
  195. *                   at sc_BitMap, which is an offset, not a pointer, into
  196. *                   the Screen structure.)
  197. *   wi_WhichPlane:  Which bitplane you want the routine to draw into.
  198. *                   Numbering begins at zero.  On the Workbench screen
  199. *                   (or any two-bitplane screen) the possible numbers for
  200. *                   wi_WhichPlane are 0 and 1.
  201. *   wi_Left:        Left edge of the 'window' (in character locations)
  202. *                   you want the routine to write into.
  203. *   wi_Top:         Top edge of the 'window' in character locations.
  204. *   wi_Width:       Width of 'window' (also on character locations).
  205. *   wi_Height:      Height of 'window' -- guess what? Character locations.
  206. *
  207. * REGISTER USAGE FOR INITWARPINFO:
  208. *
  209. * d0 - Left, Top, Width, Height, etc.
  210. * d1 - wi_Modulo
  211. * d2 - Scratch
  212. * d3 - Y size of font
  213. * d4 - Scratch
  214. *
  215. * a0 - Pointer to WarpInfo structure with above fields initialized.
  216. * a1 - Addr of top of bitplane, wi_WindowTop, etc.
  217. * a2 - Scratch
  218. * --------------------------------------------------------------------------
  219.  
  220. InitWarpInfo:   movem.l d0-d4/a1-a2,-(sp)
  221.  
  222.                 moveq   #0,d4                   ; Clear scratch.
  223.                 move.w  d4,wi_CurX(a0)          ; Store it in WarpInfo.
  224.  
  225.                 move.w  wi_Width(a0),wi_LastX(a0)  ; Max X position.
  226.  
  227.                 move.l  wi_BitMap(a0),a1        ; Get some stuff from bmap.
  228.  
  229.                 moveq   #0,d2
  230.                 move.w  bm_BytesPerRow(a1),d2   ; #bytes per row in d2
  231.                 move.w  d2,wi_BPMod(a0)         ; #bytes per row->wi_BPMod
  232.  
  233.                 move.w  wi_WhichPlane(a0),d4    ; Get bitplane#.
  234.                 asl.l   #2,d4                   ; Multiply plane# by four.
  235.                 move.l  bm_Planes(a1,d4.l),a1   ; Get address of bitplane.
  236.  
  237.                 moveq   #0,d3
  238.                 move.l  wi_TextFont(a0),a2
  239.                 move.w  tf_YSize(a2),d3         ; Get YSize of font.
  240.  
  241.                 moveq   #0,d1
  242.                 move.l  d2,d1                   ; Copy bytesperrow to d1.
  243.                 mulu.w  d3,d1                   ; YSize*BytesPerRow.
  244.                 move.w  d1,wi_Modulo(a0)        ; Store it in WarpInfo.
  245.  
  246.                 moveq   #0,d4
  247.                 move.l  d1,d4                   ; Copy wi_modulo to scratch.
  248.                 mulu.w  wi_Top(a0),d4           ; Mul by Y offset.
  249.                 add.w   wi_Left(a0),d4          ; Add X offset.
  250.  
  251.                 move.l  a1,a2                   ; BPlane addr to scratch.
  252.                 add.l   d4,a2                   ; Add offset to btpln addr.
  253.                 move.l  a2,wi_WindowTop(a0)     ; Stick in WarpInfo.
  254.                 move.l  a2,wi_CurLine(a0)       ; Stick in WarpInfo.
  255.  
  256.                 moveq   #0,d2
  257.                 move.w  wi_Top(a0),d2           ; Copy Y top to scratch.
  258.                 add.w   wi_Height(a0),d2        ; Add Y height to Y top.
  259.                 move.l  d1,d4                   ; Copy wi_modulo to scratch.
  260.                 mulu.w  d2,d4                   ; Mul by Y offset.
  261.                 add.w   wi_Left(a0),d4          ; Add X offset.
  262.  
  263.                 move.l  a1,a2                   ; BPlane addr to scratch.
  264.                 add.l   d4,a2                   ; Add offset to btpln addr.
  265.                 move.l  a2,wi_LastLine(a0)      ; Stick in WarpInfo.
  266.  
  267.                 movem.l (sp)+,d0-d4/a1-a2
  268.  
  269.                 rts
  270.  
  271. * --------------------------------------------------------------------------
  272. * GOTOXY NEEDS:
  273. *
  274. * d0 - New X position.          \ All regs. but d1 preserved,
  275. * d1 - New Y position.
  276. *
  277. * a0 - Pointer to initialized WarpInfo structure.
  278. *
  279. * NOTE: These positions are given in character locations, like everything
  280. *       else...  The positions are relative to the 'window' you have
  281. *       defined using InitWarpInfo.  Position 0,0 is the character in the
  282. *       top left corner of the window.
  283. *       This routine does no error checking.  (You're supposed to know
  284. *       how big your window is...)
  285. * --------------------------------------------------------------------------
  286.  
  287. GotoXY:         move.w  d0,wi_CurX(a0)      ; Set new X position.
  288.  
  289.                 mulu.w  wi_Modulo(a0),d1    ; Make Y an offset into window
  290.                 add.l   wi_WindowTop(a0),d1 ; Add this offset to the window
  291.                 move.l  d1,wi_CurLine(a0)   ; to make it the new Y position.
  292.  
  293.                 rts
  294.  
  295. * --------------------------------------------------------------------------
  296. * GETXY NEEDS:
  297. *
  298. * a0 - Pointer to an initialized WarpInfo structure.
  299. *
  300. * It returns the current X position in d0 and the current Y
  301. * position in d1.
  302. * --------------------------------------------------------------------------
  303.  
  304. GetXY:          move.l  wi_CurLine(a0),d1   ; Get current Y addr
  305.                 sub.l   wi_WindowTop(a0),d1 ; Sub window to get Y offset.
  306.                 divu.w  wi_Modulo(a0),d1    ; Should not be a remainder.
  307.  
  308.                 moveq   #0,d0
  309.                 move.w  wi_CurX(a0),d0      ; Get current X position.
  310.  
  311.                 rts
  312.  
  313. * --------------------------------------------------------------------------
  314. * WARPTEXT NEEDS:
  315. *
  316. * d0 - Number of characters to type. (count)
  317. *
  318. * a0 - Pointer to an initialized WarpInfo structure.  (See InitWarpInfo)
  319. * a1 - Address of string of characters to type.
  320. *
  321. * REGISTER USAGE FOR WARPTEXT:  (All regs preserved but d0 which will be 0)
  322. *
  323. * d0 - Number of characters to type (count)
  324. * d1 - Character to be emitted
  325. * d2 - LoChar
  326. * d3 - HiChar
  327. * d4 - Current X position
  328. * d5 - Scratch
  329. * d7 - Bitplane modulo: add to get to next raster line in bitplane.
  330. *
  331. * a0 - Pointer to WarpInfo structure
  332. * a1 - Address of string of characters to type
  333. * a2 - Pointer to TextFont structure, address of tf_CharData
  334. * a3 - Addr of Current line.
  335. * a4 - Scratch
  336. * a5 - Scratch
  337. *
  338. * STACK USAGE FOR WARPTEXT:
  339. *
  340. *  0(sp) - Last line
  341. *  4(sp) - Top line
  342. *  8(sp) - tf_YSize
  343. * 12(sp) - tf_Modulo: add it to get to next line in font data
  344. * 16(sp) - wi_Modulo: add it to get to next line in bitplane 'window'
  345. * 20(sp) - Maximum (last) possible X position on a line
  346. * --------------------------------------------------------------------------
  347.  
  348. sp_LastLine:    equ     0   ; Offsets into stack to get at this data.
  349. sp_TopLine:     equ     4
  350. sp_YSize:       equ     8
  351. sp_tf_Mod:      equ     12
  352. sp_wi_Mod:      equ     16
  353. sp_LastX:       equ     20
  354.  
  355. NoChar:         equ     256 ; This is where the empty-box char is. ???
  356.  
  357. WarpText:   movem.l d1-d5/d7/a2-a5,-(sp)
  358.  
  359.             moveq   #0,d4
  360.             move.w  wi_CurX(a0),d4      ; Get current X position.
  361.  
  362.             moveq   #0,d5
  363.             move.w  wi_LastX(a0),d5     ; Get maximum X position.
  364.             move.l  d5,-(sp)            ; Stick it on stack.  (1st item)
  365.  
  366.             move.w  wi_Modulo(a0),d5    ; Get wi_Modulo.
  367.             move.l  d5,-(sp)            ; Stick it on stack.  (2nd item)
  368.  
  369.             move.l  wi_TextFont(a0),a2  ; Use TextFont to get some stuff:
  370.  
  371.               moveq   #0,d2
  372.               move.b  tf_LoChar(a2),d2    ; Get tf_LoChar.
  373.  
  374.               moveq   #0,d3
  375.               move.b  tf_HiChar(a2),d3    ; Get tf_HiChar.
  376.  
  377.               move.w  tf_Modulo(a2),d5    ; Get tf_Modulo.
  378.               move.l  d5,-(sp)            ; Stick it on stack.  (3rd item)
  379.  
  380.               move.w  tf_YSize(a2),d5     ; Get tf_YSize
  381.               move.l  d5,-(sp)            ; Stick it on stack.  (4th item)
  382.  
  383.               move.l  tf_CharData(a2),a2  ; Replace textfont w/ tf_Chardata.
  384.  
  385.             move.l  wi_WindowTop(a0),a4 ; Get addr of wi_WindowTop.
  386.             move.l  a4,-(sp)            ; Stick it on stack.  (5th item)
  387.  
  388.             move.l  wi_LastLine(a0),a4  ; Get addr of wi_LastLine.
  389.             move.l  a4,-(sp)            ; Stick it on stack.  (6th item)
  390.  
  391.             move.l  wi_CurLine(a0),a3   ; Get addr of wi_CurLine.
  392.  
  393.             moveq   #0,d7
  394.             move.w  wi_BPMod(a0),d7     ; Get wi_BPMod.
  395.  
  396.             subq    #1,d0               ; Take one from count.
  397.             moveq   #0,d1               ; Clear d1 because using .b size.
  398.             subq    #1,d4               ; Take one from Current X.
  399.  
  400. DoNextChar:   addq    #1,d4               ; Add 1 to Current X.
  401. DoNextSinAdd: move.b  (a1)+,d1            ; Move char to emit to d1.
  402.               cmpi.b  #32,d1              ; Is it a space?
  403.                beq     Blank
  404.               cmp.b   d2,d1               ; Compare with LoChar.
  405.                blt     BoffoChar           ; May be a LF, FF, CR, etc.
  406.               cmp.b   d3,d1               ; Compare with HiChar.
  407.                blt     DoNoChar
  408.  
  409.               move.l  a2,a4               ; Copy tf_CharData to scratch.
  410.               sub.l   d2,d1               ; Sub LoChar from char.
  411.               adda.l  d1,a4               ; Add char to tf_CharData.
  412.  
  413. DoChar:       move.l  a3,a5               ; Copy current line to scratch.
  414.               adda.l  d4,a5               ; Add XPos to current line.
  415.  
  416.               move.l  sp_YSize(sp),d5     ; YSize is loop count.
  417.               subq.l  #1,d5
  418. MoveChar:       move.b  (a4),(a5)           ; Move line of char to bitplane.
  419.                 adda.l  sp_tf_Mod(sp),a4    ; Add tf_Modulo to tf_Chardata.
  420.                 adda.l  d7,a5               ; Add wi_BPMod to bitplane.
  421.                  dbra    d5,MoveChar
  422.  
  423. Blank:        cmp.l   sp_LastX(sp),d4     ; Compare max X and Current X...
  424.                ble     GotoDoNext          ; Do next if current <= max.
  425.  
  426. DoLF:         moveq   #0,d4               ; Xpos is zero now.
  427.  
  428. DoCR:         cmpa.l  (sp),a3             ; CMP sp_LastLine with current.
  429.                beq     GotoNSA             ; Wrap on line if equ.
  430.  
  431.               adda.l  sp_wi_Mod(sp),a3    ; Point at next line.
  432.                bra     GotoNSA             ; Do another character.
  433.  
  434. DoNoChar:   move.l  a2,a4               ; Copy tf_Chardata to scratch.
  435.             add.l   #NoChar,a4          ; Point at empty-box char.
  436.              bra     DoChar              ; Do the empty-box char.
  437.  
  438. BoffoChar:  cmpi.l  #10,d1              ; Is is a linefeed?
  439.              beq     DoLF
  440.             cmpi.l  #12,d1              ; Is it a formfeed?
  441.              beq     DoFF
  442.             cmpi.l  #13,d1              ; Is it a CR?
  443.              beq     DoCR
  444.              bra     DoNoChar           ; Fine. Put up the box.
  445.  
  446. DoFF:       moveq   #0,d4               ; Make X pos zero.  |  It doesn't
  447.             move.l  sp_TopLine(sp),a3   ; Point at top      |  CLS yet.
  448.              bra     GotoNSA
  449.  
  450. GotoDoNext: dbra    d0,DoNextChar       ; Keep looping?
  451.              bra     WindUp              ; Loop is done. Clean up & bail.
  452.  
  453. GotoNSA:    dbra    d0,DoNextSinAdd     ; Do NextChar without adding.
  454.  
  455. WindUp:     addq.l  #8,sp               ; Get rid of stuff kept on stack.
  456.             addq.l  #8,sp
  457.             addq.l  #8,sp
  458.  
  459.             move.w  d4,wi_CurX(a0)      ; Store current X for next time.
  460.             move.l  a3,wi_CurLine(a0)   ; Store current Y for next time.
  461.  
  462.             movem.l (sp)+,d1-d5/d7/a2-a5
  463.  
  464.             rts
  465.  
  466.         END
  467. >>>>>>>>>>>>>>> STOP CUTTING -- End of file: WarpText.asm <<<<<<<<<<<<<<<<<<
  468.  
  469. The next file is is the include file, called "WarpText.i"
  470.  
  471. >>>>>>>>>>>>>>> CUT HERE -- Filename: WarpText.i <<<<<<<<<<<<<<<<<<<<<<<<<<<
  472. * ------------------------------------------------------------------------
  473. * graphics/WarpText.i -- The include for an ultra-fast,     Bill Kelly
  474. * super_spiffy text-emitting routine.  :-)                  06/01/87
  475. *
  476. * Copyright 1987 by Bill W. Kelly.  All Rights Reserved.
  477. *
  478. * This is meant to go in the Graphics directory of the assembler includes.
  479. * When you assemble WarpText.asm, it includes: "graphics/WarpText.i"
  480. * ------------------------------------------------------------------------
  481.  
  482.     STRUCTURE   WarpInfo,0      ; ...the <I> denotes internal use.
  483.         APTR    wi_TextFont     ;     Pointer to a TextFont structure.
  484.         APTR    wi_BitMap       ;     Pointer to a BitMap structure.
  485.         WORD    wi_WhichPlane   ;     Which bitplane to render into.
  486.         WORD    wi_Left         ;     Left edge of 'window' in char loc's.
  487.         WORD    wi_Top          ;     Top edge of 'window' in char loc's.
  488.         WORD    wi_Width        ;     Width of 'window' in char loc's.
  489.         WORD    wi_Height       ;     Height of 'window' in char loc's.
  490.         APTR    wi_WindowTop    ; <I> Address of top of 'window.'
  491.         APTR    wi_CurLine      ; <I> Address of start of current line.
  492.         APTR    wi_LastLine     ; <I> Address of start of last line.
  493.         WORD    wi_CurX         ; <I> Current X position.
  494.         WORD    wi_LastX        ; <I> Maximum X position on a line.
  495.         WORD    wi_BPMod        ; <I> # total possible chars on a line in bp
  496.         WORD    wi_Modulo       ; <I> Add this to get to next line.
  497.         LABEL   wi_SIZE
  498. >>>>>>>>>>>>>>> STOP CUTTING -- End of file: WarpText.i <<<<<<<<<<<<<<<<<<<<
  499.  
  500. Well, that's everything you should need to get WarpText up and rolling...
  501.  
  502. Have fun,
  503. Bill Kelly (of "WarpSpeed" Software :-)  Yeah, that's it....
  504.  
  505.  
  506.  
  507. --
  508. Bill Kelly      {akgua, hplabs!hp-sdd, sdcsvax}!crash!pnet01!billk
  509.                 (Don't use pnet01!billk; try crash!pnet01!billk -- Thanks!)
  510.  
  511.                 Commodore's marketing strategy: "Ready...FIRE! ...aim???"
  512.  
  513.