home *** CD-ROM | disk | FTP | other *** search
/ ftp.whtech.com / ftp.whtech.com.tar / ftp.whtech.com / Geneve / 9640news / CAT14 / SPRITS.ARK < prev    next >
Text File  |  2006-10-19  |  14KB  |  368 lines

  1. ?
  2.                                   SPIRITED SPRITES
  3.                                  by Mack Mc Cormick
  4.                                    74206,1522
  5.  
  6. This tutorial is intended for the advanced assembler programmer (beyond
  7. Molesworth).
  8.  
  9. Apple pie and motherhood. We all know this but I've got to start someplace.
  10. Sprites may occupy screen positions independently of any character already
  11. present. Once set into motion, they can move independently of direct program
  12. control. You can magnify or make double size by changing VDP register 1.
  13.  
  14. How can they be used? Up to 32 sprites on the screen at any one time.  Can be
  15. used in GRAPHICS and MULTICOLOR modes. Also can be used in BIT MAP mode but not
  16. the automatic motion feature. Sprites cannot be used in the TEXT mode.
  17.  
  18. There are three tables which contain all the information needed to use
  19. sprites:
  20.  
  21. 1. SPRITE ATTRIBUTE TABLE
  22.  
  23.    a. Sprite Position
  24.    b. Sprite Color
  25.  
  26. 2. SPRITE DESCRIPTOR TABLE
  27.  
  28.    a. Sprite Pattern Identifier
  29.    b. Specify magnified or double sized sprites.
  30.  
  31. 3. SPRITE MOTION TABLE
  32.  
  33.    a. Define X and Y velocities of Sprites.
  34.  
  35.                    DEFAULT LOCATIONS OF SPRITE TABLES
  36.           ---------------------------------------------------------
  37.           Table                  Table Begins at this VDP address
  38.           ---------------------------------------------------------
  39.           SPRITE ATTRIBUTE TABLE                 >0300
  40.           SPRITE DESCRIPTOR TABLE                >0400
  41.           SPRITE MOTION TABLE                    >0780
  42.           ---------------------------------------------------------
  43.  
  44. Sprites are numbered from 0 to 31.  Here's how the screen is defined for
  45. Sprites:
  46.  
  47. Columns are labeled starting from the left from 0 to 255 (>00 to >FF). Rows are
  48. numbered from top left, the first row is numbered 255 (>FF) followed by the
  49. numbers 0 to 190 (>0 to >BE).  Each screen location defined in this manner is
  50. referred to as a pixel. A pixel is the smallest area of the screen you can turn
  51. on or off. Heres the way it looks:
  52.  
  53.     >00 >01 >02 >03...                 >FF
  54. >FF
  55. >00         P1
  56. .
  57. .
  58. .
  59. >BE                                     P2
  60. Pixel 1 is in row >00 column >02. P2 is in row >BE column >FF.
  61. Here are the formulas to convert row and column locations to pixel locations:
  62.  
  63.                  GRAPHIC TO PIXEL CONVERSIONS
  64.         ----------------------------------------------------
  65.         GRAPHIC ROW TO PIXEL ROW        GR*8-7=PR
  66.         GRAPHIC COLUMN TO PIXEL COLUMN  GC*8-7=PC
  67.  
  68.         PIXEL ROW TO GRAPHIC ROW        INT[(PR+7)/8]=GR
  69.         PIXEL COLUMN TO GRAPHIC COLUMN  INT[(PC+7)/8]=GC
  70.         ----------------------------------------------------
  71.  
  72. SPRITE ATTRIBUTE TABLE
  73.  
  74. Begins at VDP >0300 by default.  Contains the present position of sprites and
  75. their colors.  Each sprite takes up four bytes in the table.  The first byte is
  76. the row or Y position of the sprite. The second byte is the column or X
  77. position.  The third byte references the pattern of the sprite as to where it
  78. is located in the Sprite Descriptor Table.  The fourth byte is the early clock
  79. attribute and also codes for the color of the sprite.
  80.  
  81. When the computer moves sprites it updates the information in the sprite
  82. attribute table.  The more sprites it has to update the longer it takes to
  83. execute the program.  To shorten this time place a value of >D0 as the Y
  84. location of the lowest numbered non-moving sprite. Always let the final unused
  85. sprite be undefined by specifying the Y location as >D0.
  86.  
  87. The third byte references a pattern in the Pattern Descriptor Table. Can range
  88. from >00 to >FF.  For example if the third byte contained >80 it would point to
  89. >0400 through >0407 in the Sprite Descriptor Table.
  90.  
  91. The forth byte controls the early clock and color.  The first four bits control
  92. the early clock.  If the last bit (3) is reset to zero the early clock is off
  93. and the location of the sprite is said to be it's upper left hand corner.  This
  94. means the sprite will fade in and out on the right hand side of the screen.  If
  95. bit 3 is on the sprites location is shifted 32 pixels to the left.  The sprite
  96. can then fade in and out from the left side of the screen.
  97.  
  98. Bits 4-7 of byte four contain the color.  Same as other VDP colors 0 to >F.
  99.  
  100. Heres an example Sprite Attribute:
  101.  
  102.                      Sprite 0    Sprite 1
  103.  
  104.         SAL   DATA   >3356,>8001,>A828,>810F,>D0 -- Third Sprite Undefined
  105.                       / /   / /
  106.                      Y X   / color
  107.                        pattern
  108.  
  109. SPRITE DESCRIPTOR TABLE
  110.  
  111. Just like the pattern descriptor table for characters. Usually begins at >0400.
  112. Addresses >0400 through >0407 are defined as sprite pattern >80.
  113.  
  114. You can also make sprites magnified or double sized by writing a value to the
  115. two least significant bits of VDP register 1. See page 340 of the E/A manual
  116. for the values.
  117.  
  118. SPRITE MOTION TABLE
  119.  
  120. Describes the X and Y velocities of each sprite.  This table begins at >0780.
  121. Before a sprite can be placed into motion several conditions must be met. Your
  122. program must allow interrupts using LIMI 2 but before accessing VDP RAM you
  123. must disable interrupts with a LIMI 0.  You must indicate how many sprites will
  124. be in motion by placing a value at CPU address >837A. For example if sprites 2,
  125. 5, and 7 are in motion you must place an >8 at address >837A which will allow
  126. motion of 0 through 7.  A description of the motion must be placed in the
  127. Sprite Motion Table.  Each sprite takes up four bytes in the table.  The first
  128. byte is the Y velocity, the second byte is the X velocity.  The third and
  129. fourth bytes are used by the interrupt routines, just be sure you leave space
  130. for them.  The following are allowed as values for X and Y velocities:
  131. >00 to >FF. >00 to >7F are positive velocities (down for vertical motion and
  132. right for horizontal motion), and velocities >FF to >80 are two's compliment
  133. negative velocities (up for vertical motion and left for horizontal motion).
  134. A value of >01 will cause the sprite to move one pixel every 16 VDP interrupts.
  135. About once every 16/60 of a second.
  136.  
  137. A thought: Have you ever seen a screen dump program that would dump sprites? It
  138. could be done by obtaining their location and pattern and converting to printer
  139. bit graphics.
  140.  
  141. Program explanation: I will make the assumption that you understand basic
  142. assembler and therefore will only explain the advanced concepts.
  143.  
  144. General: You will note right away that only 1/4 of the sprite initially appears
  145. on the screen until you press a key the second time to load VDP R1 with the
  146. value to use double sized sprites, and again to use double size and magnified
  147. sprites. This was intentional to show you what all four sizes look like. When
  148. using double size sprites the sprite generator looks at four consecutive
  149. patterns in memory to make up the sprite.
  150.  
  151. START LWPI MYREG
  152. You'll note right away that I am using the CPU scratchpad RAM for my workspace.
  153. This is because this is the only RAM that is on a 16 bit data bus and therefore
  154. is twice as fast. Always try to place your workspace in this area when you can.
  155.  
  156.      LI   R0,>0400
  157.      LI   R1,HELI
  158.      LI   R2,32
  159. Loads all four sprite patterns into the sprite descriptor table.
  160.  
  161.      LI   R0,>0300
  162.      LI   R1,SDATA
  163.      LI   R2,6
  164. Loads the initial Y location, X location, the sprite number, early clock, and
  165. the color of the sprite in the sprite attribute table. Note the early clock
  166. byte is set so the sprites fades out from the right side of the screen.
  167. Experiment here with the early clock and color to observe the results.
  168.  
  169.      LI   R0,>0780
  170.      LI   R1,SPEED
  171.      LI   R2,4
  172. Establishes the speed of the sprite as down and right. Remember the next two
  173. bytes must equal 0.
  174.  
  175.      LI   R1,>0100
  176.      MOVB R1,@>837A
  177. Lets the VDP interrupt routine know you only want to move one sprite by placing
  178. he number 1 at >837A.
  179.  
  180. The rest of the program scans the keyboard and alters VDP R1 to vary the size
  181. an magnification of the sprites. LIMI 2 enables interrupts. 0 and 2 are the
  182. only values with any meaning on the TI-99. More on LIMI later. Just remember
  183. VDP interrupts must be disabled LIMI 0 before accessing VDP RAM.
  184.  
  185. I recommend you read the chapter on Sprites in the Editor/Assembler manual
  186. Pages 338-348. Be glad to answer any questions. Until next time...Assembler
  187. Executing.
  188.  
  189.  
  190. ****************************************
  191. **                                    **
  192. **  SPRITES AND TEXT FROM BIT MAP     **
  193. **       BY MACK MCCORMICK            **
  194. **       ENTRY POINT START            **
  195. **     WORKSPACE AT >8300             **
  196. **     R0,R1,R2 - GEN VDP             **
  197. **     NO RESERVED REGISTERS ON EXIT  **
  198. **                                    **
  199. ****************************************
  200.  
  201.        DEF  START
  202.        REF  VSBW,VMBW,VSBR,VMBR,VWTR
  203. PDT    EQU  >0000        PATTERN DESCRIPTOR TABLE
  204. SVVDP1 EQU  >83D4        SAVE LOC FOR VDP R1
  205. SIT    EQU  >1800        SCREEN IMAGE TABLE
  206. CT     EQU  >2000        COLOR TABLE
  207. SATAB  EQU  >1B00        SPRITE ATTRIBUTE LIST
  208. SDTAB  EQU  >1C00        SPRITE DESCRIPTOR TABLE
  209. STATUS EQU  >837C
  210.  
  211. WS     EQU  >8300        MY WORKSPACE IN HIGH SPEED CPU RAM
  212.  
  213. *  DATA STATEMENTS  *
  214.  
  215. VDPREG DATA >02A0,>06FF,>0336,>030F VDP REGS BIT MAP MODE
  216.  
  217. SPRITE DATA >0001,>0307,>0F0F,>3FFF,>3F0F,>0F07,>0301,0  SPRITE DESCRIPTOR
  218.        DATA >F0E0,>E0C0,>8286,>FEFF,>FE86,>82C0,>E0E0,>F000
  219. SALINT DATA >5080,>8005,>D000
  220.  
  221. CHRTAB BSS  >2F8
  222.  
  223. STRING TEXT 'THIS IS THE TEXT TO BE DISPLAYED'
  224.        EVEN
  225.  
  226. *  BEGIN CODE  *
  227.  
  228. START  LWPI WS
  229.  
  230. *  SAVE THE CHAR SET FROM E/A LOADER  *
  231.  
  232.        LI   R0,>900      DASE ADDRESS E/A (START CHAR >20)
  233. NOTEA  LI   R1,CHRTAB    READ THE CHAR SET INTO CHRTAB
  234.        LI   R2,>2F8
  235.        BLWP @VMBR
  236.  
  237. *  SET VDP REGS TO BIT MAP  *
  238.  
  239.        CLR  R0           VDP REG VALUE
  240.        LI   R1,VDPREG    VDP REG POINTER
  241.        LI   R2,8         REGISTERS TO WRITE TO
  242. VDPL   MOVB *R1+,@WS+1   MOV TO R0 LSB
  243.        BLWP @VWTR
  244.        AI   R0,>0100     NEXT VDP REG
  245.        DEC  R2
  246.        JNE  VDPL
  247.        MOVB @VDPREG+1,@SVVDP1 BLANK DISABLED
  248. * YOU MUST SAVE A COPY OD VDP R1 AT >83D4 OR KEYSCAN WILL INTERFERE
  249.  
  250. *  FORMAT SCREEN >00->FF THREE TIMES  *
  251.  
  252.        LI   R0,SIT
  253.        CLR  R1           BEGIN WITH 0
  254.        LI   R2,>300      LEN OF SIT
  255. THIRDS BLWP @VSBW
  256.        INC  R0           NEXT LOCATION
  257.        AI   R1,>0100     WILL WRAP AFTER >FF00
  258.        DEC  R2
  259.        JNE  THIRDS
  260.  
  261. *  CLEAR THE PATTERN AREA BLANK AND MAKE COLOR TABLE RED ON WHITE*
  262.  
  263.        BL   @CLRVDP      CLEAR PATTERN AREA
  264.        DATA PDT,>1800,0  DATA FOR SUBROUTINE
  265.        BL   @CLRVDP      RED ON WHITE COLOR AREA
  266.        DATA CT,>1800,>9F9F
  267.  
  268. *  ENABLE THE SCREEN SO YOU CAN SEE  *
  269.  
  270.        LI   R0,>01E3     WRITE >E3 TO VDP REG 1
  271.        BLWP @VWTR        DOUBLE/MAGNIFIED SPRITES
  272.        SWPB R0
  273.        MOVB R0,@SVVDP1   SAVE THE VALUE
  274.  
  275. *  PUT THE TEXT ON THE SCREEN  *
  276.  
  277.        BL   @DISTEX      SUBROUTINE TO PLACE TEXT ON THE SCREEN
  278.        DATA >B00,STRING,32
  279.  
  280. *  SET UP SPRITES *
  281.  
  282.        LI   R0,SDTAB     SPRITE DESCRIPTOR TABLE ADDRESS
  283.        LI   R1,SPRITE    SPRITE CHARACTER DATA
  284.        LI   R2,32        DOUBLE SIZE SPRITE
  285.        BLWP @VMBW
  286.  
  287.        LI   R0,SATAB     SPRITE ATTRIBUTE TABLE
  288.        LI   R1,SALINT    INIT DATA FOR SPRITE ATTRIBUTE LIST
  289.        LI   R2,5         FIVE BYTES TO WRITE
  290.        BLWP @VMBW        >D0 REQUIRED TO DISABLE REMAINING SPRITES
  291.  
  292. * THE SPRITE IS ON THE SCREEN. NOW TO MOVE IT.
  293.  
  294. LOOP   LI   R0,SATAB+1   X POSITION OF THE SPRITE. Y AT SATAB
  295.        BLWP @VSBR        READ THE CURRENT X POSITION
  296.        SRL  R1,8         PUT VALUE IN RIGHT BYTE
  297.        DEC  R1           SUBTRACT 1 FROM THE X VALUE
  298.        JNE  MOVE         IF X=0 THEN
  299.        LI   R1,>FF       X=>FF
  300.  
  301. MOVE   SLA  R1,8         MOVE TO MSBYTE
  302.        BLWP @VSBW        WRITE THE NEW X POSITION UP
  303.  
  304.        LI   R2,800       DELAY TO SLOW DOWN THE SPEED OF THE SPRITE
  305. DELAY  NOP               WASTE TIME
  306.        DEC  R2
  307.        JNE  DELAY
  308.  
  309.        JMP  LOOP         THIS IS WHERE YOU COULD PLACE THE REMAINING PROGRAM
  310.  
  311. * THIS IS A CONTINUOUS LOOP NO PROVISION FOR EXITING GIVEN *
  312.  
  313. **************************************
  314. *                                    *
  315. *  SUBROUTINE TO FILL VDP WITH DATA  *
  316. *    RT IS R12                       *
  317. *    DATA PDT,>1800,>0000            *
  318. *    (DEST,LEN,VALUE TO FILL)        *
  319. *                                    *
  320. **************************************
  321.  
  322. CLRVDP MOV  *R11+,R0     DEST
  323. CLRLV  MOV  *R11+,R3     LEN
  324. CLRV   MOV  *R11+,R4     VALUE(S)
  325. CLR    MOV  R11,R12      SAVRTN
  326.  
  327.        SRL  R3,1         DIVIDE BY 2
  328.        LI   R2,2         BYTES OF DATA
  329.        LI   R1,WS+8      FROM R4
  330. CLRVL  BLWP @VMBW
  331.        INCT R0           NEXT 2 LOCATIONS
  332.        DEC  R3           DONE?
  333.        JNE  CLRVL
  334.        B    *R12         RT
  335.  
  336. *************************************
  337. *                                   *
  338. *      DISPLAY TEXT SUBROUTINE      *
  339. *         (LOC,TEXT,LENGTH)         *
  340. *           >388,MMENU,9            *
  341. *                                   *
  342. *************************************
  343.  
  344. DISTEX MOV  *R11+,R0     LOCATION
  345. *                        LOC=((ROW-1)*256)+((COLUMN-1)*8)
  346.        MOV  *R11+,R3     ADDRESS OF TEXT TO WRITE
  347.        MOV  *R11+,R5     LENGTH OF TEXT STRING
  348.        LI   R2,8         8 BYTES IN A CHAR DESCRIPTION
  349. PUTDIS MOVB *R3+,R1      BYTE TO WRITE
  350.        SRL  R1,8         RIGHT JUSTIFY
  351.        AI   R1,-32       STRIP THE ASCII OFFSET
  352.        SLA  R1,3         MULTIPLY BY 8 FOR OFFSET
  353.        AI   R1,CHRTAB    ADD THE BASE ADDRESS OF THE CHAR TABLE
  354.        BLWP @VMBW        PUT IT ON THE SCREEN
  355.        AI   R0,8         NEXT SCREEN LOCATION
  356.        DEC  R5           DECREMENT LENGTH COUNTER
  357.        JNE  PUTDIS       ANY MORE TO WRITE?
  358.        RT
  359.  
  360.        END
  361.  
  362.  
  363.  
  364.  
  365. Download complete.  Turn off Capture File.
  366.  
  367.  
  368.