home *** CD-ROM | disk | FTP | other *** search
/ ticalc.org / ticalc_org_rev_b.iso / archives / 82 / asm / source / crash / sprclip.asm < prev    next >
Encoding:
Assembly Source File  |  2001-07-01  |  6.4 KB  |  189 lines

  1. ;────────────────────────────────────────────────────────────────────────────
  2. ;                    SpriteClip v1.2 by CrASH_Man                   02/14/98
  3. ;────────────────────────────────────────────────────────────────────────────
  4. ;
  5. ;   This is a highly optimized clipping 8 by X sprite routine for the TI-82.
  6. ; This routine also incorporates AND/XOR masking, described below.  No
  7. ; registers are destroyed, so you may modify the routine (lines with a **)
  8. ; if your code does not need to save them.
  9. ;
  10. ;   For an example on how to use this routine, please take a look at
  11. ; SPRTEST.ASM.
  12. ;
  13. ;   You may use this routine in your programs, but please give me credit
  14. ; for my work by including my name in the documentation and source.
  15. ;
  16. ;                                                                by CrASH_Man
  17. ;
  18. ;────────────────────────────────────────────────────────────────────────────
  19. ; Usage:
  20. ;────────────────────────────────────────────────────────────────────────────
  21. ;  CALL PutSprClp         Puts a sprite pointed by HL at (B, C) in GRAPH_MEM
  22. ;  CALL SetSpriteHeight   Sets the height of sprites used by PutSprClp to A
  23. ;
  24. ; DefaultSpriteHeight needed for compiling, as a integer definition.
  25. ;
  26. ;────────────────────────────────────────────────────────────────────────────
  27. ; The AND/XOR mask
  28. ;────────────────────────────────────────────────────────────────────────────
  29. ;   The AND mask is first put on the screen, then the XOR is put on the
  30. ; screen.  The result turns out so that:
  31. ;
  32. ;   00 = White           01 = Black
  33. ;   10 = Unchanged       11 = Inverted
  34. ;
  35. ; For example:
  36. ; ------------
  37. ;  AND mask     +  XOR mask        Result
  38. ;
  39. ; .DB %11100111   .DB 00011000  =  UUUBBUUU      W is white
  40. ; .DB %11000011   .DB 00100100  =  UUBWWBUU      B is black
  41. ; .DB %10000001   .DB 01000010  =  UBWWWWBU      U is unchanged
  42. ; .DB %00011000   .DB 10011001  =  BWWIIWWB      I is inverted
  43. ; .DB %00011000   .DB 10011001  =  BWWIIWWB
  44. ; .DB %10000001   .DB 01000010  =  UBWWWWBU
  45. ; .DB %11000011   .DB 00100100  =  UUBWWBUU
  46. ; .DB %11100111   .DB 00011000  =  UUUBBUUU
  47. ;
  48. ;────────────────────────────────────────────────────────────────────────────
  49. ; Revision History:
  50. ;────────────────────────────────────────────────────────────────────────────
  51. ;  0.9 10/04/97 - Complete clipping except for minor bug in top-left corner.
  52. ;  1.0 10/05/97 - Complete clipping anywhere...  Kewl!!
  53. ;  1.1 10/09/97 - Clipping w/OR XOR Masks, variable sprite height
  54. ;  1.2 02/14/98 - Clipping w/AND XOR Masks, no more EX or EXX used
  55.  
  56. ;────────────────────────────────────────────────────────────────────────────
  57. ; PutSprClp - Puts a sprite with clipping and and/xor mask (quite fast)
  58. ; Inputs: (B, C) coordinates, HL -> sprite
  59. ; OutPut: Puts clipped sprite
  60. ;────────────────────────────────────────────────────────────────────────────
  61. PutSprClp:
  62.   PUSH BC \ PUSH DE \ PUSH HL \ PUSH IX                  ; ** Save Registers
  63.  
  64.   PUSH HL \ POP IX              ; LD  IX, HL
  65.  
  66. __Change_1:
  67.   LD  D, DefaultSpriteHeight
  68.   BIT 7, C \ JR  NZ, _PSC_NoBotClip ; If Y is negative, clip top
  69. _PSC_BotClip:
  70.   LD  A, 63
  71.   SUB C \ JP  C, _PSC_Done
  72. __Change_2:
  73.   CP  DefaultSpriteHeight-1
  74.   JR  NC, _PSC_NoVertClip       ; If the sprite fits, done clipping
  75.  
  76.   INC A
  77.   JR  _PSC_ClipTop
  78. _PSC_NoBotClip:
  79.   LD  A, C
  80. __Change_3:
  81.   CP  -(DefaultSpriteHeight-1)
  82.   JR  C, _PSC_Done              ; If Y < -(DefaultSpriteHeight-1) then done
  83. _PSC_TopClip:
  84.   LD  L, A
  85.   NEG \ LD  E, A                ; Find number to shift
  86.   LD  A, L
  87. __Change_4:
  88.   ADD A, DefaultSpriteHeight
  89.   LD  D, 0 \ ADD IX, DE
  90.   LD  C, D                      ; C = 0 or -1 if at top-left
  91. _PSC_ClipTop:
  92.   LD  D, A
  93. _PSC_NoVertClip:
  94.   LD  E, $FF \ LD  A, B
  95.   BIT 7, A \ JR  Z, _PSC_NoLeftClip ; If X is non-negative, check right side
  96. _PSC_LeftClip:
  97.   CP  -7 \ JR  C, _PSC_Done     ; If X is less than -7, done
  98.   NEG \ LD  H, B \ LD  B, A     ; Find number to shift right
  99. _PSC_LeftLoop:
  100.   SRL E                         ; Shift mask to right
  101.   DJNZ _PSC_LeftLoop
  102.   LD  A, H \ ADD A, 96 \ LD  B, A ; Shift sprite up a row.
  103.   JR  _PSC_ClipDone2
  104. _PSC_NoLeftClip:
  105.   SUB 89 \ JR C, _PSC_ClipDone  ; If X < 89 then no need to clip on right
  106. _PSC_RightClip:
  107.   CP  7 \ JR NC, _PSC_Done      ; If Shift # > 7 then done
  108.   LD  H, B \ LD  B, A \ INC B
  109. _PSC_RightLoop:
  110.   SLA E                         ; Shift mask to left
  111.   DJNZ _PSC_RightLoop
  112.   LD  B, H
  113. _PSC_ClipDone:
  114.   INC C
  115. _PSC_ClipDone2:
  116.   LD  A, B \ LD  B, 0           ; [11] Save B, Clear B so we can add BC
  117.   LD  H, B \ LD  L, C           ; [ 8] HL = BC
  118.   ADD HL, BC \ ADD HL, BC       ; [22] HL = HL + 12
  119.   ADD HL, HL \ ADD HL, HL       ; [22]
  120.   LD  C, A                      ; [ 4]
  121.   SRL C \ SRL C \ SRL C         ; [24] C = B \ 8
  122.   ADD HL, BC                    ; [11]
  123.   LD  BC, GRAPH_MEM-12          ; [10]
  124.   ADD HL, BC                    ; [11]
  125.   LD  B, D                      ; Number of Rows
  126.  
  127.   AND %00000111                 ; [ 7]
  128.   JR  Z, _PSC_NoShift
  129.  
  130.   LD  C, A                      ; Number to Shift
  131. _PSC_LineLoop:
  132.   PUSH BC
  133.   PUSH DE
  134.   LD  A, E
  135. __Change_5:
  136.   AND (IX+DefaultSpriteHeight)
  137.   LD  D, A
  138.   LD  A, E
  139.   CPL \ OR  (IX+0)
  140.   LD  B, C
  141.   LD  C, %11111111
  142.   LD  E, %00000000
  143.  
  144. _PSC_ShiftNum:
  145.   SCF \ RRA \ RR  C
  146.   SRL D \ RR  E                 ; Shift
  147.   DJNZ _PSC_ShiftNum
  148.  
  149.   AND (HL) \ XOR D \ LD (HL), A \ INC HL    ; Or data with background
  150.   LD  A, C \ AND (HL) \ XOR E \ LD  (HL), A ; Xor Mask, etc.
  151.  
  152.   INC IX \ LD  C, 11 \ ADD HL, BC ; Next row
  153.   POP DE
  154.   POP BC
  155.   DJNZ _PSC_LineLoop
  156.  
  157. _PSC_Done:
  158.   POP IX \ POP HL \ POP DE \ POP BC                    ; ** Restore registers
  159.   RET
  160.  
  161. _PSC_NoShift:
  162.   LD  DE, 12                    ; Add 12 each row
  163. _PSC_NoShiftLoop:
  164.   LD  A, (HL)
  165.   AND (IX+0)
  166. __Change_6:
  167.   XOR (IX+DefaultSpriteHeight)
  168.   LD  (HL), A                   ; Or data with background
  169.   ADD HL, DE \ INC IX           ; Next row
  170.   DJNZ _PSC_NoShiftLoop
  171.  
  172.   JR _PSC_Done
  173.  
  174. ;────────────────────────────────────────────────────────────────────────────
  175. ; SetSpriteHeight - Changes the default sprite size
  176. ; Inputs:  A = Sprite Height
  177. ; Output: Self modifies routine to sprites that are A pixels in height.
  178. ;────────────────────────────────────────────────────────────────────────────
  179. SetSpriteHeight:
  180.   LD  (__Change_1+1), A
  181.   LD  (__Change_2+1), A
  182.   LD  (__Change_4+1), A
  183.   LD  (__Change_5+2), A
  184.   LD  (__Change_6+2), A
  185.   DEC A
  186.   NEG
  187.   LD  (__Change_3+1), A
  188.   RET
  189.