sprite.z80 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. #define spritetmp 8000h
  2. #define sprite_mask0 spritetmp+6
  3. #define sprite_mask1 spritetmp+7
  4. sprite:
  5. ;Inputs:
  6. ; A is the method:
  7. ; 0=Overwrite
  8. ; 1=AND
  9. ; 2=XOR
  10. ; 3=OR
  11. ; 4=DataSwap.......Does nothing
  12. ; 5=Erase
  13. ; B is the X-coordinate
  14. ; C is the Y-Coordinate
  15. ; DE points to the sprite
  16. ; H is the height
  17. ; L is the width ;not added yet
  18. ; (gbuf_temp) is the buffer to which to draw
  19. ld l,a
  20. ;First check if the sprite is on-screen in the horizontal direction
  21. ld a,c
  22. cp 64
  23. jr c,+_
  24. add a,h
  25. ret nc
  26. ld h,a
  27. xor a
  28. sub c
  29. add a,e
  30. ld e,a
  31. jr nc,$+3
  32. inc d
  33. xor a
  34. ld c,a
  35. _:
  36. ;Next check h+c<=64
  37. ld a,64
  38. sub c
  39. cp h
  40. jr nc,+_
  41. ld h,a
  42. _:
  43. ;Next check if the sprite is on-screen in the vertical direction
  44. ld a,b
  45. cp 96
  46. jr c,+_
  47. add a,8
  48. ret nc
  49. ld a,b
  50. _:
  51. ;Now we need to get the left part of the mask
  52. ld a,h
  53. or a
  54. ret z
  55. ld (spritetmp),hl ;height
  56. ld (spritetmp+2),de ;sprite pointer
  57. ld (spritetmp+4),bc ;x,y
  58. ld a,b
  59. and 7
  60. ld de,spritemask
  61. add a,e
  62. ld e,a
  63. #if spritemask&255>248
  64. jr nc,$+3
  65. inc d
  66. #endif
  67. ld a,(de)
  68. ld (sprite_mask0),a
  69. cpl
  70. ld (sprite_mask1),a
  71. ;
  72. ;
  73. ld a,c
  74. add a,a
  75. sbc a,a
  76. ld h,a
  77. ld a,b
  78. ld b,h
  79. ld l,c
  80. add hl,hl
  81. add hl,bc
  82. add hl,hl
  83. add hl,hl
  84. ld c,a
  85. add a,a
  86. sbc a,a
  87. ld b,a
  88. ld a,c
  89. sra c
  90. sra c
  91. sra c
  92. add hl,bc
  93. ld bc,(gbuf_temp)
  94. add hl,bc
  95. ;
  96. ;
  97. and 7
  98. ld a,(spritetmp+1)
  99. ld b,a
  100. ;B is height
  101. ld de,(spritetmp+2)
  102. ld a,(spritetmp)
  103. dec a
  104. jp z,spriteloop_AND
  105. dec a
  106. jp z,spriteloop_XOR
  107. dec a
  108. jp z,spriteloop_OR
  109. sub 2
  110. jp z,spriteloop_Erase
  111. spriteloop_Overwrite:
  112. push bc
  113. push de
  114. ld a,(de)
  115. ld d,a
  116. ld e,0
  117. ld a,(spritetmp+5)
  118. ld c,a
  119. and 7
  120. jr z,+_
  121. ld b,a
  122. ld a,e
  123. srl d \ rra \ djnz $-3
  124. ld e,a
  125. _:
  126. ld a,c
  127. add a,8
  128. jr c,+_
  129. ld c,a
  130. ld a,(sprite_mask0)
  131. and (hl)
  132. or d
  133. ld (hl),a
  134. ld a,c
  135. _:
  136. inc hl
  137. cp 96
  138. jr nc,+_
  139. ld a,(sprite_mask1)
  140. and (hl)
  141. or e
  142. ld (hl),a
  143. _:
  144. ld de,11
  145. add hl,de
  146. pop de
  147. inc de
  148. pop bc
  149. djnz spriteloop_Overwrite
  150. ret
  151. spriteloop_OR:
  152. push bc
  153. push de
  154. ld a,(de)
  155. ld d,a
  156. ld e,0
  157. ld a,(spritetmp+5)
  158. ld c,a
  159. and 7
  160. jr z,+_
  161. ld b,a
  162. ld a,e
  163. srl d \ rra \ djnz $-3
  164. ld e,a
  165. _:
  166. ld a,c
  167. add a,8
  168. jr c,+_
  169. ld c,a
  170. ld a,(hl)
  171. or d
  172. ld (hl),a
  173. ld a,c
  174. _:
  175. inc hl
  176. cp 96
  177. jr nc,+_
  178. ld a,(sprite_mask1)
  179. ld a,(hl)
  180. or e
  181. ld (hl),a
  182. _:
  183. ld de,11
  184. add hl,de
  185. pop de
  186. inc de
  187. pop bc
  188. djnz spriteloop_OR
  189. ret
  190. spriteloop_XOR:
  191. push bc
  192. push de
  193. ld a,(de)
  194. ld d,a
  195. ld e,0
  196. ld a,(spritetmp+5)
  197. ld c,a
  198. and 7
  199. jr z,+_
  200. ld b,a
  201. ld a,e
  202. srl d \ rra \ djnz $-3
  203. ld e,a
  204. _:
  205. ld a,c
  206. add a,8
  207. jr c,+_
  208. ld c,a
  209. ld a,(hl)
  210. xor d
  211. ld (hl),a
  212. ld a,c
  213. _:
  214. inc hl
  215. cp 96
  216. jr nc,+_
  217. ld a,(sprite_mask1)
  218. ld a,(hl)
  219. xor e
  220. ld (hl),a
  221. _:
  222. ld de,11
  223. add hl,de
  224. pop de
  225. inc de
  226. pop bc
  227. djnz spriteloop_XOR
  228. ret
  229. spriteloop_AND:
  230. push bc
  231. push de
  232. ld a,(de)
  233. ld d,a
  234. ld e,-1
  235. ld a,(spritetmp+5)
  236. ld c,a
  237. and 7
  238. jr z,+_
  239. ld b,a
  240. ld a,e
  241. scf
  242. rr d \ rra \ djnz $-3
  243. ld e,a
  244. _:
  245. ld a,c
  246. add a,8
  247. jr c,+_
  248. ld c,a
  249. ld a,(hl)
  250. and d
  251. ld (hl),a
  252. ld a,c
  253. _:
  254. inc hl
  255. cp 96
  256. jr nc,+_
  257. ld a,(sprite_mask1)
  258. ld a,(hl)
  259. and e
  260. ld (hl),a
  261. _:
  262. ld de,11
  263. add hl,de
  264. pop de
  265. inc de
  266. pop bc
  267. djnz spriteloop_AND
  268. ret
  269. spriteloop_Erase:
  270. push bc
  271. push de
  272. ld a,(de)
  273. cpl
  274. ld d,a
  275. ld e,-1
  276. ld a,(spritetmp+5)
  277. ld c,a
  278. and 7
  279. jr z,+_
  280. ld b,a
  281. ld a,e
  282. scf
  283. rr d \ rra \ djnz $-3
  284. ld e,a
  285. _:
  286. ld a,c
  287. add a,8
  288. jr c,+_
  289. ld c,a
  290. ld a,(hl)
  291. and d
  292. ld (hl),a
  293. ld a,c
  294. _:
  295. inc hl
  296. cp 96
  297. jr nc,+_
  298. ld a,(hl)
  299. and e
  300. ld (hl),a
  301. _:
  302. ld de,11
  303. add hl,de
  304. pop de
  305. inc de
  306. pop bc
  307. djnz spriteloop_Erase
  308. ret
  309. spritemask:
  310. .db $00,$80,$C0,$E0,$F0,$F8,$FC,$FE
  311. #undefine spritetmp
  312. #undefine sprite_mask0
  313. #undefine sprite_mask1