home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / gamesuite_1 / GameSuite / Examples / BolMaster / !BolMaster / Sources / BCheck next >
Encoding:
Text File  |  1995-05-06  |  3.7 KB  |  231 lines

  1. #name ^.Object.BCheck
  2. #type &ffd
  3.  
  4. #include <Bolmaster$Path>Sources.Structures
  5. #include <Bolmaster$Path>Sources.Variables
  6. #set hitbit=1<<7
  7. #set baseshift=3; 8 pixel block size
  8. #set netshift=2 ; 4x4 net blocks per graphics block
  9. ;on entry
  10. ;R10=object pointer
  11.  
  12. STMFD R13!,{R10,R14}
  13. LDR R3,[R10,#8]
  14. LDR R4,[R10,#12];get R3=x, R4=y
  15.  
  16. LDR R5,[R10,#16]
  17. LDR R6,[R10,#20]
  18. ADD R3,R3,R5    ;add suggested velocity to object
  19. ADD R4,R4,R6
  20.  
  21. LDR R5,[R10,#28];size entry
  22. MOV R6,R5,LSL #16
  23. MOV R6,R6,LSR #16
  24. MOV R5,R5,LSR #16
  25. MOV R5,R5,LSL #12     ;R5=xsize, R6=ysize
  26. MOV R6,R6,LSL #12     ;in pixels <<12
  27.  
  28. SUB R3,R3,R5,LSR #1
  29. SUB R4,R4,R6,LSR #1  ;R3 and R4 point to the top left of the object
  30.  
  31. CMP R3,#0            ;check if the object strays off the levelnet
  32. BLT fail             ;on it's bottom or right sides
  33. CMP R4,#0
  34. BLT fail
  35. LDR R7,[R12,#v.netxsize]
  36. LDR R8,[R12,#v.netysize]
  37. MOV R7,R7,LSL #netshift
  38. MOV R8,R8,LSL #netshift
  39. ADD R0,R3,R5
  40. CMP R0,R7,LSL #12+baseshift
  41. BGE fail
  42. ADD R1,R4,R6
  43. CMP R1,R8,LSL #12+baseshift
  44. BGE fail
  45.  
  46.  
  47. MOV R0,#0
  48. MOV R1,#0
  49. BL checkperim
  50. BEQ pass
  51.  
  52. LDR R3,[R10,#8]  ;get original position
  53. LDR R4,[R10,#12]
  54. SUB R3,R3,R5,LSR #1 ;of top left corner
  55. SUB R4,R4,R6,LSR #1
  56. LDR R7,[R10,#16] ;get velocity
  57. LDR R8,[R10,#20]
  58. AND R1,R3,#&FFF
  59. AND R2,R4,#&FFF
  60. SUB R3,R3,R1
  61. SUB R4,R4,R2
  62. ADD R7,R7,R1
  63. ADD R8,R8,R2
  64.  
  65. MOVS R9,R7
  66. RSBMI R9,R9,#0
  67. MOVS R11,R8
  68. RSBMI R11,R11,#0
  69.  
  70. .check1
  71. CMP R9,#0
  72. CMPLE R11,#0
  73. BLE done
  74. MOV R0,R7
  75. MOV R1,R8
  76. BL checkperim
  77. BNE check2
  78. .checkins
  79. ADD R3,R3,R0
  80. ADD R4,R4,R1
  81. SUB R7,R7,R0
  82. SUB R8,R8,R1
  83. SUBS R9,R9,#1<<12
  84. SUBS R11,R11,#1<<12
  85. B check1
  86.  
  87. .check2
  88. MOV R0,R7
  89. MOV R1,#0
  90. BL checkperim
  91. BNE check3
  92. B checkins
  93.  
  94. .check3
  95. MOV R0,#0
  96. MOV R1,R8
  97. BL checkperim
  98. BNE check4
  99. B checkins
  100.  
  101. .check4
  102. B done
  103.  
  104.  
  105.  
  106. .pass
  107. ADD R0,R10,#8
  108. LDMIA R0,{R3-R6}
  109. MOV R0,PC
  110. ORR R0,R0,#1<<30; set zero flag
  111. TEQP PC,R0
  112. LDMFD R13!,{R10,PC}
  113.  
  114. .done
  115. ADD R3,R3,R5,LSR #1  ;get back to normal R3,R4
  116. ADD R4,R4,R6,LSR #1
  117. LDR R1,[R10,#8]
  118. LDR R2,[R10,#12]
  119.  
  120. SUB R5,R3,R1
  121. SUB R6,R4,R2
  122. MOV R0,PC
  123. BIC R0,R0,#1<<30; clear zero flag
  124. TEQP PC,R0
  125. LDMFD R13!,{R10,PC}
  126.  
  127.  
  128. .fail
  129. MOV R0,PC
  130. BIC R0,R0,#1<<30; clear zero flag
  131. TEQP PC,R0
  132. LDMFD R13!,{R10,PC}
  133.  
  134.  
  135.  
  136.  
  137.  
  138. ;checkperim checks the perimeter of the object for collisions
  139. ;on entry to checkperim R3=x, R4=y, R5=xsize, R6=ysize
  140.  
  141. .checkperim
  142. CMP R0,#1<<12
  143. MOVGT R0,#1<<12
  144. CMP R0,#-1<<12
  145. MOVLT R0,#-1<<12
  146. CMP R1,#1<<12
  147. MOVGT R1,#1<<12
  148. CMP R1,#-1<<12
  149. MOVLT R1,#-1<<12
  150. STMFD R13!,{R0-R11,R14}
  151. SUB R5,R5,#1
  152. SUB R6,R6,#1
  153. ADD R3,R3,R0
  154. ADD R4,R4,R1
  155. LDR R11,[R12,#v.levelnet]   ;these are globals required for the fast
  156. LDR R10,[R12,#v.levelshift] ;translate routine
  157. ADD R10,R10,#netshift
  158. translate R7,R3,R4  ;x,y
  159. ADD R0,R3,R5
  160. translate R8,R0,R4  ;x+dx,y
  161. MOV R9,#1
  162.   .loop0
  163.   LDRB R0,[R7],R9
  164.   TST R0,#hitbit
  165.   BNE checkperimfail
  166.   CMP R7,R8
  167.   BLE loop0
  168.  
  169. translate R7,R3,R4 ;x,y
  170. ADD R1,R4,R6
  171. translate R8,R3,R1 ;x,y+dy
  172. LDR R9,[R12,#v.netxsize]
  173. ADD R7,R7,R9,LSL #netshift  ;skip what we've already checked
  174. CMP R7,R8
  175. BGT cpskip1
  176.   .loop1
  177.   LDRB R0,[R7],R9,LSL #netshift
  178.   TST R0,#hitbit
  179.   BNE checkperimfail
  180.   CMP R7,R8
  181.   BLE loop1
  182. .cpskip1
  183.  
  184. ADD R0,R3,R5
  185. translate R7,R0,R4 ;x+dx,y
  186. ADD R0,R3,R5
  187. ADD R1,R4,R6
  188. translate R8,R0,R1 ;x+dy,y+dy
  189. LDR R9,[R12,#v.netxsize]
  190. ADD R7,R7,R9,LSL #netshift
  191. CMP R7,R8
  192. BGT cpskip2
  193.   .loop2
  194.   LDRB R0,[R7],R9,LSL #netshift
  195.   TST R0,#hitbit
  196.   BNE checkperimfail
  197.   CMP R7,R8
  198.   BLE loop2
  199. .cpskip2
  200.  
  201. ADD R1,R4,R6
  202. translate R7,R3,R1 ;x,y+dy
  203. ADD R0,R3,R5
  204. ADD R1,R4,R6
  205. translate R8,R0,R1 ;x+dy,y+dy
  206. MOV R9,#1
  207. ADD R7,R7,R9
  208. SUB R8,R8,R9
  209. CMP R7,R8
  210. BGT cpskip3
  211.   .loop3
  212.   LDRB R0,[R7],R9
  213.   TST R0,#hitbit
  214.   BNE checkperimfail
  215.   CMP R7,R8
  216.   BLE loop3
  217. .cpskip3
  218. CMP R0,R0
  219. LDMFD R13!,{R0-R11,PC}
  220. .checkperimfail
  221. ; returns NE as already set
  222. LDMFD R13!,{R0-R11,PC}
  223.  
  224. macro translate m0,m1,m2
  225. {
  226.   MOV m0,m2,LSR #12+baseshift
  227.   ADD m0,R11,m0,LSL R10
  228.   ADD m0,m0,m1,LSR #12+baseshift
  229. }
  230.  
  231.