four_way_scrolltest3.s 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564
  1. *----------------------------SCROLL CODE----------------------
  2. WAIT_DRAW_BLOCKS EQU 0
  3. START_DRAW_BLOCKS EQU 1
  4. *All these values are correct but something is going wrong
  5. *and funny blocks effects happen when scrolling diagonally right
  6. *-- Y OFFSETS
  7. SCROLL_GOING_DOWN EQU (-48*BPR) ;up from bottom of scroll
  8. SCROLL_GOING_UP EQU (-16*BPR)
  9. MAP_SCREEN_OFFSET_DOWN EQU (17*BIGGEST_MAP_X)-2
  10. MAP_SCREEN_OFFSET_UP EQU (-1*BIGGEST_MAP_X)-2
  11. SCROLL_POSITION_OFFSET_DOWN EQU (17*16)
  12. SCROLL_POSITION_OFFSET_UP EQU (-1*16)
  13. *-- X OFFSETS
  14. SCROLL_GOING_LEFT EQU (-32*BPR)+42
  15. SCROLL_GOING_RIGHT EQU (-32*BPR)-2
  16. MAP_SCREEN_OFFSET_LEFT EQU (-BIGGEST_MAP_X*2)+21
  17. MAP_SCREEN_OFFSET_RIGHT EQU (-BIGGEST_MAP_X*2)-1
  18. SCROLL_POSITION_OFFSET_LEFT EQU 21*16
  19. SCROLL_POSITION_OFFSET_RIGHT EQU (-1)*16
  20. total_number_of_y_blocks_to_draw dc.w 24
  21. current_y_map_position dc.w 0
  22. total_number_of_x_blocks_to_draw dc.w 20
  23. current_x_map_position dc.w 0
  24. number_of_x_blocks_per_frame dc.w 3-1
  25. number_of_y_blocks_per_frame dc.w 3-1
  26. ******************************************
  27. **** MOVE SCROLL *****
  28. ******************************************
  29. move_scroll
  30. move.w player_x_inc,d0
  31. move.w player_y_inc,d1
  32. *-Test x bounds
  33. add.w d0,scroll_x_position
  34. bge.s scroll_x_not_hit_bounds
  35. clr.w scroll_x_position
  36. bra.s scroll_x_not_hit_max_bounds
  37. scroll_x_not_hit_bounds
  38. move.w map_x_size,d3
  39. cmp.w scroll_x_position,d3
  40. bgt.s scroll_x_not_hit_max_bounds
  41. move.w d3,scroll_x_position
  42. scroll_x_not_hit_max_bounds
  43. *-<
  44. *-Test y bounds
  45. add.w d1,scroll_y_position
  46. bge.s scroll_not_hit_bounds
  47. clr.w scroll_y_position
  48. bra.s scroll_y_not_hit_max_bounds
  49. scroll_not_hit_bounds
  50. move.w map_y_size,d5
  51. cmp.w scroll_y_position,d5
  52. bgt.s scroll_y_not_hit_max_bounds
  53. move.w d5,scroll_y_position
  54. scroll_y_not_hit_max_bounds
  55. *-<
  56. move.w scroll_x_position,d0
  57. move.w scroll_y_position,d1
  58. sub.w last_scroll_x,d0
  59. sub.w last_scroll_y,d1
  60. move.w scroll_x_position,last_scroll_x
  61. move.w scroll_y_position,last_scroll_y
  62. movem.w d0/d1,-(sp)
  63. bsr position_scroll
  64. movem.w (sp)+,d0/d1
  65. bsr check_add_blocks
  66. rts
  67. last_scroll_x dc.w 0
  68. last_scroll_y dc.w 0
  69. ******************************************
  70. **** CHECK ADD BLOCKS *****
  71. ******************************************
  72. check_add_blocks
  73. *-Do for y blocks
  74. add.w d1,check_y_add
  75. cmp.w #16,check_y_add
  76. blt check_min_add
  77. sub.w #16,check_y_add
  78. move.w #START_DRAW_BLOCKS,y_ready_flag
  79. move.w #GOING_DOWN,y_direction_flag
  80. move.w total_fix_x,alien_x_pos
  81. move.w fixed_y,total_fix_y
  82. move.w fixed_y,alien_y_pos
  83. move.l y_scroll_pos,d2
  84. move.l d2,total_fix_scroll_y
  85. move.l y_map_pos,d3
  86. move.l d3,total_fix_map_y
  87. move.l y_alien_map_pos,d4
  88. move.l d4,total_fix_alien_map_y
  89. add.l total_fix_scroll_x,d2
  90. move.l d2,current_y_screen_position
  91. add.l total_fix_map_x,d3
  92. move.l d3,current_y_map_mem_position
  93. add.l total_fix_alien_map_x,d4
  94. move.l d4,current_y_alien_map_mem_position
  95. bra drawing_please_wait
  96. check_min_add
  97. cmp.w #-17,check_y_add
  98. bgt.s drawing_please_wait
  99. add.w #16,check_y_add
  100. move.w #START_DRAW_BLOCKS,y_ready_flag
  101. move.w #GOING_UP,y_direction_flag
  102. move.w total_fix_x,alien_x_pos
  103. move.w fixed_y,total_fix_y
  104. move.w fixed_y,alien_y_pos
  105. move.l y_scroll_pos,d2
  106. move.l d2,total_fix_scroll_y
  107. move.l y_map_pos,d3
  108. move.l d3,total_fix_map_y
  109. move.l y_alien_map_pos,d4
  110. move.l d4,total_fix_alien_map_y
  111. add.l total_fix_scroll_x,d2
  112. move.l d2,current_y_screen_position
  113. add.l total_fix_map_x,d3
  114. move.l d3,current_y_map_mem_position
  115. add.l total_fix_alien_map_x,d4
  116. move.l d4,current_y_alien_map_mem_position
  117. drawing_please_wait
  118. *-<
  119. *- Do for x blocks
  120. add.w d0,check_x_add
  121. cmp.w #16,check_x_add
  122. blt check_x_min_add
  123. sub.w #16,check_x_add
  124. move.w #START_DRAW_BLOCKS,x_ready_flag
  125. move.w #GOING_LEFT,x_direction_flag
  126. move.w total_fix_y,alien_y_pos
  127. move.w fixed_x,total_fix_x
  128. move.w fixed_x,alien_x_pos
  129. move.l x_scroll_pos,d2
  130. move.l d2,total_fix_scroll_x
  131. move.l x_map_pos,d3
  132. move.l d3,total_fix_map_x
  133. move.l x_alien_map_pos,d4
  134. move.l d4,total_fix_alien_map_x
  135. add.l total_fix_scroll_y,d2
  136. move.l d2,current_x_screen_position
  137. add.l total_fix_map_y,d3
  138. move.l d3,current_x_map_mem_position
  139. add.l total_fix_alien_map_y,d4
  140. move.l d4,current_x_alien_map_mem_position
  141. bra drawing_x_please_wait
  142. check_x_min_add
  143. cmp.w #-17,check_x_add
  144. bgt.s drawing_x_please_wait
  145. add.w #16,check_x_add
  146. move.w #START_DRAW_BLOCKS,x_ready_flag
  147. move.w #GOING_RIGHT,x_direction_flag
  148. move.w total_fix_y,alien_y_pos
  149. move.w fixed_x,total_fix_x
  150. move.w fixed_x,alien_x_pos
  151. move.l x_scroll_pos,d2
  152. move.l d2,total_fix_scroll_x
  153. move.l x_map_pos,d3
  154. move.l d3,total_fix_map_x
  155. move.l x_alien_map_pos,d4
  156. move.l d4,total_fix_alien_map_x
  157. add.l total_fix_scroll_y,d2
  158. move.l d2,current_x_screen_position
  159. add.l total_fix_map_y,d3
  160. move.l d3,current_x_map_mem_position
  161. add.l total_fix_alien_map_y,d4
  162. move.l d4,current_x_alien_map_mem_position
  163. drawing_x_please_wait
  164. *-<
  165. sub.w d0,actual_x_position
  166. sub.w d1,actual_y_position
  167. asl #PLAYER_SCALE,d0
  168. asl #PLAYER_SCALE,d1
  169. sub.w d0,player_x_position
  170. sub.w d1,player_y_position
  171. rts
  172. GOING_LEFT EQU -1
  173. GOING_RIGHT EQU 1
  174. GOING_UP EQU -1
  175. GOING_DOWN EQU 1
  176. total_fix_scroll_y dc.l 0
  177. total_fix_alien_map_y dc.l 0
  178. total_fix_map_y dc.l 0
  179. total_fix_scroll_x dc.l 0
  180. total_fix_map_x dc.l 0
  181. total_fix_alien_map_x dc.l 0
  182. total_fix_y dc.w 0
  183. total_fix_x dc.w 0
  184. y_scroll_pos dc.l 0 ;mem
  185. x_scroll_pos dc.l 0 ;bytes
  186. y_map_pos dc.l 0
  187. x_map_pos dc.l 0
  188. x_alien_map_pos dc.l 0
  189. y_alien_map_pos dc.l 0
  190. x_direction_flag dc.w 0
  191. y_direction_flag dc.w 0
  192. fixed_x dc.w 0
  193. fixed_y dc.w 0
  194. alien_x_pos dc.w 0
  195. alien_y_pos dc.w 0
  196. alien_x_pos2 dc.w 0
  197. alien_y_pos2 dc.w 0
  198. add_y_block_direction dc.l 0
  199. check_y_add dc.w 0
  200. y_ready_flag dc.w 0
  201. add_x_block_direction dc.l 0
  202. check_x_add dc.w 0
  203. x_ready_flag dc.w 0
  204. add_y_map_direction dc.l 0
  205. add_x_map_direction dc.l 0
  206. add_y_map_alien_direction dc.l 0
  207. add_x_map_alien_direction dc.l 0
  208. scroll_add_y_offset dc.w 0
  209. scroll_add_x_offset dc.w 0
  210. ******************************************
  211. **** POSITION SCROLL *****
  212. ******************************************
  213. position_scroll
  214. *Positions scroll by the x and y values stored
  215. move.w scroll_x_position,d0
  216. move.w scroll_y_position,d1
  217. position_scroll_along_x
  218. moveq #0,d3
  219. move.w d0,d2
  220. move.w d0,d3
  221. andi.w #$000f,d2 ;shift value
  222. move.w d2,alien_shift
  223. asr.w #4,d3 ;number of blocks in
  224. andi.w #$fff0,d0
  225. move.w d0,fixed_x
  226. asr.w #3,d0
  227. ext.l d0 ;bytes in
  228. neg.w d2
  229. add.w #15,d2
  230. move.w d2,d4
  231. asl.w #4,d2
  232. or.w d2,d4
  233. move.w d4,scroll_value
  234. position_scroll_along_y
  235. *--- get current map positions
  236. moveq #0,d2
  237. move.w d1,d2
  238. andi.w #$fff0,d2
  239. move.w d2,fixed_y
  240. move.w d1,d2
  241. asr.w #4,d2
  242. mulu #BIGGEST_MAP_X,d2
  243. move.l current_alien_map_pointer,a0
  244. move.l d3,x_alien_map_pos
  245. add.l d2,a0 ;add y
  246. move.l a0,y_alien_map_pos
  247. asl d2 ;cos map mem = word
  248. asl d3
  249. move.l current_map_pointer,a0
  250. move.l d3,x_map_pos
  251. add.l d2,a0 ;add y
  252. move.l a0,y_map_pos
  253. *---
  254. ext.l d1
  255. divu #SCROLL_HEIGHT,d1
  256. swap d1 ;this is all we want - split position down screen
  257. neg.w d1 ;so scroll goes right way
  258. add.w #SCROLL_HEIGHT,d1
  259. move.w d1,split_position
  260. *---calc where to draw
  261. moveq #0,d3
  262. move.w #SCROLL_HEIGHT,d3 ;position above buffer area
  263. sub.w d1,d3 ;position of buffer area
  264. andi.w #$fff0,d3
  265. mulu #BPR,d3
  266. add.l scroll_area,d3
  267. move.l d0,x_scroll_pos
  268. move.l d3,y_scroll_pos
  269. *------
  270. move.w d1,d2
  271. add.w #$2c,d1
  272. moveq #0,d4
  273. cmp.w #$ff,d1
  274. ble.s not_over_dodgy_line
  275. moveq #1,d4
  276. not_over_dodgy_line
  277. cmp.w #$ff+$2c-16,d1
  278. ble.s not_off_copper
  279. move.w #-1,d4
  280. bra.s calc_screen_split
  281. not_off_copper
  282. andi.w #$ff,d1 ;so values wraps round
  283. asl.w #8,d1
  284. addq.w #1,d1 ; = wait value
  285. calc_screen_split
  286. neg.w d2
  287. add.w #SCROLL_HEIGHT,d2
  288. mulu #BPR,d2
  289. ext.l d2
  290. move.l d2,d5
  291. add.l buff_plane1,d5
  292. add.l plane1,d2 ;to display at top
  293. move.l plane1,d3 ;top display at split
  294. add.l d0,d2 ;add x in
  295. add.l d0,d5
  296. move.l d5,current_alien_draw_position
  297. move.l buff_plane1,d5
  298. add.l d0,d5
  299. move.l d5,current_alien_split_draw_position
  300. add.l d0,d3 ;add x in
  301. bsr insert_plane_pointers
  302. rts
  303. ******************************************
  304. **** INSERT PLANE POINTERS *****
  305. ******************************************
  306. insert_plane_pointers
  307. *d1 contains wait value
  308. *d2 = top of display
  309. *d3 = split part of display
  310. *d4 indicates if inserting after 255 gap
  311. tst d4
  312. bmi clear_all_banks
  313. beq.s insert_before_line
  314. insert_after_line
  315. move.l #scroll_bank_2,a0
  316. move.l #scroll_bank_1,a1
  317. bsr fill_banks
  318. rts
  319. insert_before_line
  320. move.l #scroll_bank_1,a0
  321. move.l #scroll_bank_2,a1
  322. bsr fill_banks
  323. rts
  324. clear_all_banks
  325. move.l #scroll_bank_1,a0
  326. move.l #scroll_bank_2,a1
  327. bsr clear_banks
  328. rts
  329. ******************************************
  330. **** FILL BANKS *****
  331. ******************************************
  332. fill_banks
  333. *a0 = bank to fill
  334. *a1 = bank to clear
  335. *d1 = wait
  336. *d2 = top of display
  337. *d3 = split display
  338. *change to copper jump later - but get it working first!!!
  339. * IN USE SPLIT POINTERS
  340. move.w d1,wait_pos(a0)
  341. move.w #$fffe,wait_mask(a0)
  342. move.w #$e2,plane_1_lo_ptr(a0)
  343. move.w d3,plane_1_lo_val(a0)
  344. swap d3
  345. move.w #$e0,plane_1_hi_ptr(a0)
  346. move.w d3,plane_1_hi_val(a0)
  347. swap d3
  348. add.l #PLANE_INC,d3
  349. move.w #$e6,plane_2_lo_ptr(a0)
  350. move.w d3,plane_2_lo_val(a0)
  351. swap d3
  352. move.w #$e4,plane_2_hi_ptr(a0)
  353. move.w d3,plane_2_hi_val(a0)
  354. swap d3
  355. add.l #PLANE_INC,d3
  356. move.w #$ea,plane_3_lo_ptr(a0)
  357. move.w d3,plane_3_lo_val(a0)
  358. swap d3
  359. move.w #$e8,plane_3_hi_ptr(a0)
  360. move.w d3,plane_3_hi_val(a0)
  361. swap d3
  362. add.l #PLANE_INC,d3
  363. move.w #$ee,plane_4_lo_ptr(a0)
  364. move.w d3,plane_4_lo_val(a0)
  365. swap d3
  366. move.w #$ec,plane_4_hi_ptr(a0)
  367. move.w d3,plane_4_hi_val(a0)
  368. * UNUSED SET OF SPLIT POINTERS
  369. move.w #$1f0,wait_pos(a1)
  370. move.w #$1f0,plane_1_hi_ptr(a1)
  371. move.w #$1f0,plane_1_lo_ptr(a1)
  372. move.w #$1f0,plane_2_hi_ptr(a1)
  373. move.w #$1f0,plane_2_lo_ptr(a1)
  374. move.w #$1f0,plane_3_hi_ptr(a1)
  375. move.w #$1f0,plane_3_lo_ptr(a1)
  376. move.w #$1f0,plane_4_hi_ptr(a1)
  377. move.w #$1f0,plane_4_lo_ptr(a1)
  378. * TOP OF SCREEN
  379. move.l #top_of_screen-4,a0 ;so rs.w's work
  380. move.w d2,plane_1_lo_val(a0)
  381. swap d2
  382. move.w d2,plane_1_hi_val(a0)
  383. swap d2
  384. add.l #PLANE_INC,d2
  385. move.w d2,plane_2_lo_val(a0)
  386. swap d2
  387. move.w d2,plane_2_hi_val(a0)
  388. swap d2
  389. add.l #PLANE_INC,d2
  390. move.w d2,plane_3_lo_val(a0)
  391. swap d2
  392. move.w d2,plane_3_hi_val(a0)
  393. swap d2
  394. add.l #PLANE_INC,d2
  395. move.w d2,plane_4_lo_val(a0)
  396. swap d2
  397. move.w d2,plane_4_hi_val(a0)
  398. rts
  399. ******************************************
  400. **** CLEAR BANKS *****
  401. ******************************************
  402. clear_banks
  403. * UNUSED SET OF SPLIT POINTERS 1
  404. move.w #$1f0,wait_pos(a1)
  405. move.w #$1f0,plane_1_hi_ptr(a1)
  406. move.w #$1f0,plane_1_lo_ptr(a1)
  407. move.w #$1f0,plane_2_hi_ptr(a1)
  408. move.w #$1f0,plane_2_lo_ptr(a1)
  409. move.w #$1f0,plane_3_hi_ptr(a1)
  410. move.w #$1f0,plane_3_lo_ptr(a1)
  411. move.w #$1f0,plane_4_hi_ptr(a1)
  412. move.w #$1f0,plane_4_lo_ptr(a1)
  413. * UNUSED SET OF SPLIT POINTERS 2
  414. move.w #$1f0,wait_pos(a0)
  415. move.w #$1f0,plane_1_hi_ptr(a0)
  416. move.w #$1f0,plane_1_lo_ptr(a0)
  417. move.w #$1f0,plane_2_hi_ptr(a0)
  418. move.w #$1f0,plane_2_lo_ptr(a0)
  419. move.w #$1f0,plane_3_hi_ptr(a0)
  420. move.w #$1f0,plane_3_lo_ptr(a0)
  421. move.w #$1f0,plane_4_hi_ptr(a0)
  422. move.w #$1f0,plane_4_lo_ptr(a0)
  423. * TOP OF SCREEN
  424. move.l #top_of_screen-4,a0 ;so rs.w's work
  425. move.w d2,plane_1_lo_val(a0)
  426. swap d2
  427. move.w d2,plane_1_hi_val(a0)
  428. swap d2
  429. add.l #PLANE_INC,d2
  430. move.w d2,plane_2_lo_val(a0)
  431. swap d2
  432. move.w d2,plane_2_hi_val(a0)
  433. swap d2
  434. add.l #PLANE_INC,d2
  435. move.w d2,plane_3_lo_val(a0)
  436. swap d2
  437. move.w d2,plane_3_hi_val(a0)
  438. swap d2
  439. add.l #PLANE_INC,d2
  440. move.w d2,plane_4_lo_val(a0)
  441. swap d2
  442. move.w d2,plane_4_hi_val(a0)
  443. rts
  444. scroll_x_position dc.w 0
  445. scroll_y_position dc.w 0
  446. split_position dc.w 0
  447. **********************************************************
  448. *********** DRAW BLOCKS FOR SCROLL ***********
  449. **********************************************************
  450. draw_blocks_for_scroll
  451. tst.w y_ready_flag
  452. beq.s see_if_x_to_draw
  453. move.l current_y_screen_position,a0
  454. move.l current_y_map_mem_position,a1
  455. move.l current_y_alien_map_mem_position,a4
  456. bsr draw_y_blocks
  457. see_if_x_to_draw
  458. tst.w x_ready_flag
  459. beq.s quit_draw_blocks_for_scroll
  460. move.l current_x_screen_position,a0
  461. move.l current_x_map_mem_position,a1
  462. move.l current_x_alien_map_mem_position,a4
  463. bsr draw_x_blocks
  464. quit_draw_blocks_for_scroll
  465. rts
  466. current_screen_position dc.l 0
  467. current_y_screen_position dc.l 0
  468. current_x_screen_position dc.l 0
  469. current_map_mem_position dc.l 0
  470. current_alien_map_mem_position dc.l 0
  471. current_x_map_mem_position dc.l 0
  472. current_y_map_mem_position dc.l 0
  473. current_x_alien_map_mem_position dc.l 0
  474. current_y_alien_map_mem_position dc.l 0
  475. **********************************************************
  476. *********** DRAW Y BLOCKS ***********
  477. **********************************************************
  478. draw_y_blocks
  479. *current screen mem position in a0
  480. *current map position in a1
  481. tst.w y_direction_flag
  482. bmi.s scroll_moving_up
  483. scroll_moving_down
  484. add.l #SCROLL_GOING_DOWN,a0
  485. add.l #MAP_SCREEN_OFFSET_DOWN*MAP_BLOCK_SIZE,a1
  486. add.l #MAP_SCREEN_OFFSET_DOWN,a4
  487. move.w #SCROLL_POSITION_OFFSET_DOWN,d6
  488. bra.s finished_adding_y_offsets
  489. scroll_moving_up
  490. add.l #SCROLL_GOING_UP,a0
  491. add.l #MAP_SCREEN_OFFSET_UP*MAP_BLOCK_SIZE,a1
  492. add.l #MAP_SCREEN_OFFSET_UP,a4
  493. move.w #SCROLL_POSITION_OFFSET_UP,d6
  494. finished_adding_y_offsets
  495. cmp.l scroll_area,a0
  496. bge.s draw_inside_plane_area
  497. add.l #SCROLL_HEIGHT*BPR,a0
  498. draw_inside_plane_area
  499. *---- So starts one block back so filling in x strips - see design
  500. *---- must be done here or else cant do the check above - i.e will
  501. *----- just be above plane and then blocks will be drawn in wrong place
  502. subq.l #4,a0
  503. *-<
  504. draw_blocks_main
  505. *---Set up start x and y values
  506. move.w alien_x_pos,d5
  507. sub.w #2*16,d5
  508. add.w alien_y_pos,d6
  509. *----
  510. move.l Alien_Add_List_Pointer,a5
  511. moveq #0,d0
  512. move.w current_y_map_position,d0
  513. ext.l d0
  514. add.l d0,a4 ;current alien map position
  515. asl d0 ;cos map data = word
  516. add.l d0,a1 ;current map position
  517. * asl d0 ;get into bytes
  518. add.l d0,a0 ;get to current line
  519. asl #3,d0
  520. add.w d0,d5 ;current add x position
  521. move.l a0,start_draw_pos ;store for buff write
  522. move.w total_number_of_y_blocks_to_draw,d2
  523. moveq #0,d7 ;count number of blocks drawn
  524. init_blit_values
  525. btst #14,dmaconr(a6)
  526. bne.s init_blit_values
  527. move.w #BPR-2,bltdmod(a6)
  528. move.w #0,bltamod(a6)
  529. move.l #$ffffffff,bltafwm(a6)
  530. move.l #$09F00000,bltcon0(A6)
  531. move.w number_of_y_blocks_per_frame,d0
  532. draw_loop
  533. move.l level_background_blocks,a2
  534. moveq #0,d1
  535. *--- Adding aliens from map
  536. move.b (a4),d1
  537. beq.s alien_already_in_map
  538. btst #ALIEN_BUSY,d1
  539. bne.s alien_already_in_map
  540. move.l a4,Add_Map_Position(a5)
  541. move.w d5,Add_X_Position(a5)
  542. move.w d6,Add_Y_Position(a5)
  543. move.w d1,Add_Alien_number(a5)
  544. add.l #Add_Struct_Size,a5
  545. bset.b #ALIEN_BUSY,(a4)
  546. alien_already_in_map
  547. *--- Done adding for this block
  548. move.w (a1),d1
  549. asl.w #7,d1 ;same as mulu (16*2)*4
  550. add.l d1,a2 ;get to correct position in block data
  551. *Messy to look at but faster than 68000 - only very marginally
  552. *slower than blitter and map blocks can be in fast mem!!
  553. move.l a0,a3
  554. move.w (a2)+,(a3)
  555. move.w (a2)+,BPR(a3)
  556. move.w (a2)+,BPR*2(a3)
  557. move.w (a2)+,BPR*3(a3)
  558. move.w (a2)+,BPR*4(a3)
  559. move.w (a2)+,BPR*5(a3)
  560. move.w (a2)+,BPR*6(a3)
  561. move.w (a2)+,BPR*7(a3)
  562. move.w (a2)+,BPR*8(a3)
  563. move.w (a2)+,BPR*9(a3)
  564. move.w (a2)+,BPR*10(a3)
  565. move.w (a2)+,BPR*11(a3)
  566. move.w (a2)+,BPR*12(a3)
  567. move.w (a2)+,BPR*13(a3)
  568. move.w (a2)+,BPR*14(a3)
  569. move.w (a2)+,BPR*15(a3)
  570. add.l #PLANE_INC,a3
  571. move.w (a2)+,(a3)
  572. move.w (a2)+,BPR(a3)
  573. move.w (a2)+,BPR*2(a3)
  574. move.w (a2)+,BPR*3(a3)
  575. move.w (a2)+,BPR*4(a3)
  576. move.w (a2)+,BPR*5(a3)
  577. move.w (a2)+,BPR*6(a3)
  578. move.w (a2)+,BPR*7(a3)
  579. move.w (a2)+,BPR*8(a3)
  580. move.w (a2)+,BPR*9(a3)
  581. move.w (a2)+,BPR*10(a3)
  582. move.w (a2)+,BPR*11(a3)
  583. move.w (a2)+,BPR*12(a3)
  584. move.w (a2)+,BPR*13(a3)
  585. move.w (a2)+,BPR*14(a3)
  586. move.w (a2)+,BPR*15(a3)
  587. add.l #PLANE_INC,a3
  588. move.w (a2)+,(a3)
  589. move.w (a2)+,BPR(a3)
  590. move.w (a2)+,BPR*2(a3)
  591. move.w (a2)+,BPR*3(a3)
  592. move.w (a2)+,BPR*4(a3)
  593. move.w (a2)+,BPR*5(a3)
  594. move.w (a2)+,BPR*6(a3)
  595. move.w (a2)+,BPR*7(a3)
  596. move.w (a2)+,BPR*8(a3)
  597. move.w (a2)+,BPR*9(a3)
  598. move.w (a2)+,BPR*10(a3)
  599. move.w (a2)+,BPR*11(a3)
  600. move.w (a2)+,BPR*12(a3)
  601. move.w (a2)+,BPR*13(a3)
  602. move.w (a2)+,BPR*14(a3)
  603. move.w (a2)+,BPR*15(a3)
  604. add.l #PLANE_INC,a3
  605. move.w (a2)+,(a3)
  606. move.w (a2)+,BPR(a3)
  607. move.w (a2)+,BPR*2(a3)
  608. move.w (a2)+,BPR*3(a3)
  609. move.w (a2)+,BPR*4(a3)
  610. move.w (a2)+,BPR*5(a3)
  611. move.w (a2)+,BPR*6(a3)
  612. move.w (a2)+,BPR*7(a3)
  613. move.w (a2)+,BPR*8(a3)
  614. move.w (a2)+,BPR*9(a3)
  615. move.w (a2)+,BPR*10(a3)
  616. move.w (a2)+,BPR*11(a3)
  617. move.w (a2)+,BPR*12(a3)
  618. move.w (a2)+,BPR*13(a3)
  619. move.w (a2)+,BPR*14(a3)
  620. move.w (a2)+,BPR*15(a3)
  621. done_a_block
  622. add.w #16,d5 ;x position of block
  623. addq.l #2,a0 ;next block position along screen
  624. addq.l #2,a1 ;next map position
  625. addq.l #1,a4 ;next alien map position
  626. addq.w #1,current_y_map_position
  627. addq.w #1,d7 ;count number blocks drawn
  628. cmp.w current_y_map_position,d2
  629. bne.s not_yet_done_line
  630. clr current_y_map_position
  631. move.w #WAIT_DRAW_BLOCKS,y_ready_flag ;done our line now wait for screen to scroll 16
  632. bra.s done_all_blocks
  633. not_yet_done_line
  634. dbra d0,draw_loop
  635. done_all_blocks
  636. move.w #-1,(a5) ;end add list
  637. move.l a5,Alien_Add_List_Pointer
  638. *------------------Draw y blocks into buffer--------------
  639. move.l start_draw_pos,a5 ;source positiion
  640. move.l a5,a4
  641. add.l #PLANE_INC*4,a5 ;buff position
  642. move.l a5,a3
  643. add.l #PLANE_INC*4,a3
  644. move.w #BPR,d0
  645. move.w d7,d1
  646. asl d1
  647. sub.w d1,d0 ;modulus
  648. add.w #16<<6,d7 ;blitsize
  649. wait_y_buff_start
  650. btst #14,dmaconr(a6)
  651. bne.s wait_y_buff_start
  652. move.w d0,bltamod(a6)
  653. move.w d0,bltdmod(a6)
  654. move.l a4,bltapth(a6)
  655. move.l a5,bltdpth(a6)
  656. move.w d7,bltsize(a6)
  657. draw_y_copy1
  658. btst #14,dmaconr(a6)
  659. bne.s draw_y_copy1
  660. move.l a3,bltdpth(a6)
  661. move.l a4,bltapth(a6)
  662. move.w d7,bltsize(a6)
  663. add.l #PLANE_INC,a4
  664. add.l #PLANE_INC,a5
  665. add.l #PLANE_INC,a3
  666. y_buff_block_p2
  667. btst #14,dmaconr(a6)
  668. bne.s y_buff_block_p2
  669. move.l a4,bltapth(a6)
  670. move.l a5,bltdpth(a6)
  671. move.w d7,bltsize(a6)
  672. draw_y_copy2
  673. btst #14,dmaconr(a6)
  674. bne.s draw_y_copy2
  675. move.l a3,bltdpth(a6)
  676. move.l a4,bltapth(a6)
  677. move.w d7,bltsize(a6)
  678. add.l #PLANE_INC,a4
  679. add.l #PLANE_INC,a5
  680. add.l #PLANE_INC,a3
  681. y_buff_block_p3
  682. btst #14,dmaconr(a6)
  683. bne.s y_buff_block_p3
  684. move.l a4,bltapth(a6)
  685. move.l a5,bltdpth(a6)
  686. move.w d7,bltsize(a6)
  687. draw_y_copy3
  688. btst #14,dmaconr(a6)
  689. bne.s draw_y_copy3
  690. move.l a3,bltdpth(a6)
  691. move.l a4,bltapth(a6)
  692. move.w d7,bltsize(a6)
  693. add.l #PLANE_INC,a4
  694. add.l #PLANE_INC,a5
  695. add.l #PLANE_INC,a3
  696. y_buff_block_p4
  697. btst #14,dmaconr(a6)
  698. bne.s y_buff_block_p4
  699. move.l a4,bltapth(a6)
  700. move.l a5,bltdpth(a6)
  701. move.w d7,bltsize(a6)
  702. draw_y_copy4
  703. btst #14,dmaconr(a6)
  704. bne.s draw_y_copy4
  705. move.l a3,bltdpth(a6)
  706. move.l a4,bltapth(a6)
  707. move.w d7,bltsize(a6)
  708. rts
  709. start_draw_pos dc.l 0
  710. **********************************************************
  711. *********** DRAW X BLOCKS ***********
  712. **********************************************************
  713. draw_x_blocks
  714. *current screen mem position in a0
  715. *current map position in a1
  716. tst.w x_direction_flag
  717. bmi.s scroll_moving_left
  718. scroll_moving_right
  719. add.l #SCROLL_GOING_RIGHT,a0
  720. add.l #MAP_SCREEN_OFFSET_RIGHT*MAP_BLOCK_SIZE,a1
  721. add.l #MAP_SCREEN_OFFSET_RIGHT,a4
  722. move.w #SCROLL_POSITION_OFFSET_RIGHT,d4
  723. bra.s done_adding_x_offsets
  724. scroll_moving_left
  725. add.l #SCROLL_GOING_LEFT,a0
  726. add.l #MAP_SCREEN_OFFSET_LEFT*MAP_BLOCK_SIZE,a1
  727. add.l #MAP_SCREEN_OFFSET_LEFT,a4
  728. move.w #SCROLL_POSITION_OFFSET_LEFT,d4
  729. done_adding_x_offsets
  730. draw_x_blocks_straight
  731. *---Set up start x and y values
  732. add.w alien_x_pos2,d4
  733. move.w alien_y_pos2,d5
  734. sub.w #16*2,d5
  735. *----
  736. move.l Alien_Add_List_Pointer,a5
  737. moveq #0,d0
  738. moveq #0,d6
  739. move.w current_x_map_position,d0
  740. move.w d0,d1
  741. mulu #BIGGEST_MAP_X,d0
  742. add.l d0,a4 ;get to current line in alien map
  743. asl d0 ;cos map data = word
  744. add.l d0,a1 ;get to current line
  745. asl #4,d1
  746. add.w d1,d5 ;current y position on screen
  747. mulu #BPR,d1 ;way BPR*16 but already done *16
  748. add.l d1,a0 ;current screen block position
  749. *Check that we are not trying to draw above scroll (remember we are
  750. * subtracting values so blocks are drawn at bottom first)
  751. move.l scroll_area,a3 ;top of scroll area
  752. cmp.l a3,a0
  753. bge.s within_plane_still
  754. add.l #SCROLL_HEIGHT*BPR,a0
  755. within_plane_still
  756. add.l #SCROLL_HEIGHT*BPR,a3
  757. cmp.l a3,a0
  758. blt.s test2
  759. sub.l #SCROLL_HEIGHT*BPR,a0
  760. test2
  761. move.l a0,start_draw_pos ;for buff purposes
  762. move.w total_number_of_x_blocks_to_draw,d2
  763. moveq #0,d7 ;count number of blocks drawn
  764. init_x_blit_values
  765. btst #14,dmaconr(a6)
  766. bne.s init_x_blit_values
  767. move.w #BPR-2,bltdmod(a6)
  768. move.w #0,bltamod(a6)
  769. move.l #$ffffffff,bltafwm(a6)
  770. move.l #$09F00000,bltcon0(A6)
  771. move.w number_of_x_blocks_per_frame,d0
  772. draw_x_loop
  773. move.l level_background_blocks,a2
  774. moveq #0,d1
  775. *--- Adding aliens from map
  776. move.b (a4),d1
  777. beq.s alien_x_already_in_map
  778. btst #ALIEN_BUSY,d1
  779. bne.s alien_x_already_in_map
  780. move.l a4,Add_Map_Position(a5)
  781. move.w d4,Add_X_Position(a5)
  782. move.w d5,Add_Y_Position(a5)
  783. move.w d1,Add_Alien_number(a5)
  784. add.l #Add_Struct_Size,a5
  785. bset.b #ALIEN_BUSY,(a4)
  786. alien_x_already_in_map
  787. *--- Done adding for this block
  788. move.w (a1),d1
  789. asl.w #7,d1 ;same as mulu (16*2)*4
  790. add.l d1,a2 ;get to correct position in block data
  791. move.l a0,a3
  792. move.w (a2)+,(a3)
  793. move.w (a2)+,BPR(a3)
  794. move.w (a2)+,BPR*2(a3)
  795. move.w (a2)+,BPR*3(a3)
  796. move.w (a2)+,BPR*4(a3)
  797. move.w (a2)+,BPR*5(a3)
  798. move.w (a2)+,BPR*6(a3)
  799. move.w (a2)+,BPR*7(a3)
  800. move.w (a2)+,BPR*8(a3)
  801. move.w (a2)+,BPR*9(a3)
  802. move.w (a2)+,BPR*10(a3)
  803. move.w (a2)+,BPR*11(a3)
  804. move.w (a2)+,BPR*12(a3)
  805. move.w (a2)+,BPR*13(a3)
  806. move.w (a2)+,BPR*14(a3)
  807. move.w (a2)+,BPR*15(a3)
  808. add.l #PLANE_INC,a3
  809. move.w (a2)+,(a3)
  810. move.w (a2)+,BPR(a3)
  811. move.w (a2)+,BPR*2(a3)
  812. move.w (a2)+,BPR*3(a3)
  813. move.w (a2)+,BPR*4(a3)
  814. move.w (a2)+,BPR*5(a3)
  815. move.w (a2)+,BPR*6(a3)
  816. move.w (a2)+,BPR*7(a3)
  817. move.w (a2)+,BPR*8(a3)
  818. move.w (a2)+,BPR*9(a3)
  819. move.w (a2)+,BPR*10(a3)
  820. move.w (a2)+,BPR*11(a3)
  821. move.w (a2)+,BPR*12(a3)
  822. move.w (a2)+,BPR*13(a3)
  823. move.w (a2)+,BPR*14(a3)
  824. move.w (a2)+,BPR*15(a3)
  825. add.l #PLANE_INC,a3
  826. move.w (a2)+,(a3)
  827. move.w (a2)+,BPR(a3)
  828. move.w (a2)+,BPR*2(a3)
  829. move.w (a2)+,BPR*3(a3)
  830. move.w (a2)+,BPR*4(a3)
  831. move.w (a2)+,BPR*5(a3)
  832. move.w (a2)+,BPR*6(a3)
  833. move.w (a2)+,BPR*7(a3)
  834. move.w (a2)+,BPR*8(a3)
  835. move.w (a2)+,BPR*9(a3)
  836. move.w (a2)+,BPR*10(a3)
  837. move.w (a2)+,BPR*11(a3)
  838. move.w (a2)+,BPR*12(a3)
  839. move.w (a2)+,BPR*13(a3)
  840. move.w (a2)+,BPR*14(a3)
  841. move.w (a2)+,BPR*15(a3)
  842. add.l #PLANE_INC,a3
  843. move.w (a2)+,(a3)
  844. move.w (a2)+,BPR(a3)
  845. move.w (a2)+,BPR*2(a3)
  846. move.w (a2)+,BPR*3(a3)
  847. move.w (a2)+,BPR*4(a3)
  848. move.w (a2)+,BPR*5(a3)
  849. move.w (a2)+,BPR*6(a3)
  850. move.w (a2)+,BPR*7(a3)
  851. move.w (a2)+,BPR*8(a3)
  852. move.w (a2)+,BPR*9(a3)
  853. move.w (a2)+,BPR*10(a3)
  854. move.w (a2)+,BPR*11(a3)
  855. move.w (a2)+,BPR*12(a3)
  856. move.w (a2)+,BPR*13(a3)
  857. move.w (a2)+,BPR*14(a3)
  858. move.w (a2)+,BPR*15(a3)
  859. done_x_block
  860. add.w #16,d5 ;current y pixel position
  861. add.l #BPR*16,a0
  862. *Cant go off top only bottom so thats the only check
  863. move.l scroll_area,a3
  864. add.l #SCROLL_HEIGHT*BPR,a3
  865. cmp.l a3,a0
  866. blt.s have_not_gone_off_scroll_bottom
  867. move.w d7,d6 ;point where split
  868. addq.w #1,d6
  869. sub.l #SCROLL_HEIGHT*BPR,a0
  870. have_not_gone_off_scroll_bottom
  871. add.l #BIGGEST_MAP_X*MAP_BLOCK_SIZE,a1
  872. add.l #BIGGEST_MAP_X,a4
  873. addq.w #1,current_x_map_position
  874. addq.w #1,d7 ;count number blocks drawn
  875. cmp.w current_x_map_position,d2
  876. bne.s not_yet_done_x_line
  877. clr current_x_map_position
  878. move.w #WAIT_DRAW_BLOCKS,x_ready_flag ;done our line now wait for screen to scroll 16
  879. bra.s done_all_x_blocks
  880. not_yet_done_x_line
  881. dbra d0,draw_x_loop
  882. done_all_x_blocks
  883. move.w #-1,(a5) ;end add list
  884. move.l a5,Alien_Add_List_Pointer
  885. *----------------Now do one big blit to buffer areas---------------
  886. *need to know if wrapped - so have to do two blits
  887. move.l start_draw_pos,a4
  888. move.l a4,a0
  889. buff_wait_fin
  890. btst #14,dmaconr(a6)
  891. bne.s buff_wait_fin
  892. move.w #BPR-2,bltamod(a6)
  893. move.l a4,a5
  894. add.l #PLANE_INC*4,a4 ;buff start position
  895. move.l a4,a3
  896. add.l #PLANE_INC*4,a3 ;copyback area
  897. moveq #0,d0
  898. tst d6
  899. beq.s no_split_occured
  900. move.w d7,d0 ;number of blocks to draw
  901. sub.w d6,d0 ;blocks after split
  902. move.w d6,d7
  903. no_split_occured
  904. move.l a4,bltdpth(a6) ;screen
  905. move.l a5,bltapth(a6) ;graphics
  906. asl.w #4,d7 ;height of blocks
  907. asl.w #6,d7
  908. addq.w #1,d7
  909. move.w d7,bltsize(a6)
  910. draw_x_copy1
  911. btst #14,dmaconr(a6)
  912. bne.s draw_x_copy1
  913. move.l a3,bltdpth(a6)
  914. move.l a4,bltapth(a6)
  915. move.w d7,bltsize(a6)
  916. add.l #PLANE_INC,a4
  917. add.l #PLANE_INC,a5
  918. add.l #PLANE_INC,a3
  919. draw_x_buff2
  920. btst #14,dmaconr(a6)
  921. bne.s draw_x_buff2
  922. move.l a4,bltdpth(a6)
  923. move.l a5,bltapth(a6)
  924. move.w d7,bltsize(a6)
  925. draw_x_copy2
  926. btst #14,dmaconr(a6)
  927. bne.s draw_x_copy2
  928. move.l a3,bltdpth(a6)
  929. move.l a4,bltapth(a6)
  930. move.w d7,bltsize(a6)
  931. add.l #PLANE_INC,a4
  932. add.l #PLANE_INC,a5
  933. add.l #PLANE_INC,a3
  934. draw_x_buff3
  935. btst #14,dmaconr(a6)
  936. bne.s draw_x_buff3
  937. move.l a4,bltdpth(a6)
  938. move.l a5,bltapth(a6)
  939. move.w d7,bltsize(a6)
  940. draw_x_copy3
  941. btst #14,dmaconr(a6)
  942. bne.s draw_x_copy3
  943. move.l a3,bltdpth(a6)
  944. move.l a4,bltapth(a6)
  945. move.w d7,bltsize(a6)
  946. add.l #PLANE_INC,a4
  947. add.l #PLANE_INC,a5
  948. add.l #PLANE_INC,a3
  949. draw_x_buff4
  950. btst #14,dmaconr(a6)
  951. bne.s draw_x_buff4
  952. move.l a4,bltdpth(a6)
  953. move.l a5,bltapth(a6)
  954. move.w d7,bltsize(a6)
  955. draw_x_copy4
  956. btst #14,dmaconr(a6)
  957. bne.s draw_x_copy4
  958. move.l a3,bltdpth(a6)
  959. move.l a4,bltapth(a6)
  960. move.w d7,bltsize(a6)
  961. tst d0
  962. beq no_need_to_draw_more_blocks
  963. move.l a0,a5
  964. asl.w #4,d6
  965. mulu #BPR,d6
  966. add.l d6,a5
  967. sub.l #SCROLL_HEIGHT*BPR,a5
  968. move.l a5,a4
  969. add.l #PLANE_INC*4,a4
  970. move.l a4,a3
  971. add.l #PLANE_INC*4,a3
  972. move.w d0,d7 ;blocks after split
  973. draw_x_buff1_split
  974. btst #14,dmaconr(a6)
  975. bne.s draw_x_buff1_split
  976. move.l a4,bltdpth(a6) ;screen
  977. move.l a5,bltapth(a6) ;graphics
  978. asl.w #4,d7 ;height of blocks
  979. asl.w #6,d7
  980. addq.w #1,d7
  981. move.w d7,bltsize(a6)
  982. draw_x_copy1_split
  983. btst #14,dmaconr(a6)
  984. bne.s draw_x_copy1_split
  985. move.l a3,bltdpth(a6)
  986. move.l a4,bltapth(a6)
  987. move.w d7,bltsize(a6)
  988. add.l #PLANE_INC,a4
  989. add.l #PLANE_INC,a5
  990. add.l #PLANE_INC,a3
  991. draw_x_buff2_split
  992. btst #14,dmaconr(a6)
  993. bne.s draw_x_buff2_split
  994. move.l a4,bltdpth(a6)
  995. move.l a5,bltapth(a6)
  996. move.w d7,bltsize(a6)
  997. draw_x_copy2_split
  998. btst #14,dmaconr(a6)
  999. bne.s draw_x_copy2_split
  1000. move.l a3,bltdpth(a6)
  1001. move.l a4,bltapth(a6)
  1002. move.w d7,bltsize(a6)
  1003. add.l #PLANE_INC,a4
  1004. add.l #PLANE_INC,a5
  1005. add.l #PLANE_INC,a3
  1006. draw_x_buff3_split
  1007. btst #14,dmaconr(a6)
  1008. bne.s draw_x_buff3_split
  1009. move.l a4,bltdpth(a6)
  1010. move.l a5,bltapth(a6)
  1011. move.w d7,bltsize(a6)
  1012. draw_x_copy3_split
  1013. btst #14,dmaconr(a6)
  1014. bne.s draw_x_copy3_split
  1015. move.l a3,bltdpth(a6)
  1016. move.l a4,bltapth(a6)
  1017. move.w d7,bltsize(a6)
  1018. add.l #PLANE_INC,a4
  1019. add.l #PLANE_INC,a5
  1020. add.l #PLANE_INC,a3
  1021. draw_x_buff4_split
  1022. btst #14,dmaconr(a6)
  1023. bne.s draw_x_buff4_split
  1024. move.l a4,bltdpth(a6)
  1025. move.l a5,bltapth(a6)
  1026. move.w d7,bltsize(a6)
  1027. draw_x_copy4_split
  1028. btst #14,dmaconr(a6)
  1029. bne.s draw_x_copy4_split
  1030. move.l a3,bltdpth(a6)
  1031. move.l a4,bltapth(a6)
  1032. move.w d7,bltsize(a6)
  1033. no_need_to_draw_more_blocks
  1034. rts
  1035. ********************************************************
  1036. **** FILL SCREEN WITH BLOCKS ****
  1037. ********************************************************
  1038. fill_screen_with_blocks
  1039. *send in d0 and d1 as the x and y
  1040. *--
  1041. move.l #Alien_Add_List,Alien_Add_List_Pointer
  1042. move.w d0,scroll_x_position
  1043. move.w d1,scroll_y_position
  1044. move.w d0,last_scroll_x
  1045. move.w d1,last_scroll_y
  1046. bsr Position_Scroll
  1047. *--
  1048. *-- SET UP ALIEN ADD POSITIONS
  1049. clr.w scroll_add_y_offset
  1050. clr.w scroll_add_x_offset
  1051. sub.w #32,fixed_y ;position on screen properly
  1052. add.w #32,fixed_x ;position on screen properly
  1053. move.w fixed_x,alien_x_pos
  1054. move.w fixed_y,alien_y_pos
  1055. move.w fixed_x,alien_x_pos2
  1056. move.w fixed_y,alien_y_pos2
  1057. move.l y_scroll_pos,d2
  1058. move.l y_map_pos,d3
  1059. move.l y_alien_map_pos,d4
  1060. add.l x_scroll_pos,d2
  1061. move.l d2,current_alien_draw_position
  1062. add.l x_map_pos,d3
  1063. move.l d3,current_map_mem_position
  1064. add.l x_alien_map_pos,d4
  1065. move.l d4,current_alien_map_mem_position
  1066. rts
  1067. move.l current_alien_draw_position,a0
  1068. move.l current_map_mem_position,a1
  1069. move.l current_alien_map_mem_position,a4 ;just so no crash
  1070. sub.l #PLANE_INC*4,a0 ;cos buff
  1071. *--Position back two lines to fill gap above
  1072. tst scroll_y_position
  1073. beq.s dont_do_extra2
  1074. sub.l #(BPR*16)*2,a0
  1075. cmp.l plane1,a0
  1076. bge.s not_wrapped_off
  1077. add.l #SCROLL_HEIGHT*BPR,a0
  1078. not_wrapped_off
  1079. sub.l #(2*BIGGEST_MAP_X)*MAP_BLOCK_SIZE,a1
  1080. sub.l #2*BIGGEST_MAP_X,a4
  1081. dont_do_extra2
  1082. *---------
  1083. move.w #20-1,d0
  1084. do_all_blocks
  1085. move.w #START_DRAW_BLOCKS,y_ready_flag
  1086. keep_drawing
  1087. moveq #0,d6
  1088. movem.l a0-a5/d0-d7,-(sp)
  1089. bsr draw_blocks_main
  1090. movem.l (sp)+,a0-a5/d0-d7
  1091. tst y_ready_flag
  1092. bne.s keep_drawing
  1093. add.w #16,alien_y_pos
  1094. add.l #16*BPR,a0
  1095. move.l plane1,a2
  1096. add.l #SCROLL_HEIGHT*BPR,a2
  1097. cmp.l a2,a0
  1098. blt.s not_in_area_yet
  1099. sub.l #SCROLL_HEIGHT*BPR,a0
  1100. not_in_area_yet
  1101. add.l #(BIGGEST_MAP_X*MAP_BLOCK_SIZE),a1
  1102. add.l #BIGGEST_MAP_X,a4
  1103. dbra d0,do_all_blocks
  1104. move.w #WAIT_DRAW_BLOCKS,y_ready_flag
  1105. bsr Add_New_Aliens
  1106. *-- FILL IN TWO COLS OF X BLOCKS
  1107. move.w #START_DRAW_BLOCKS,x_ready_flag
  1108. wait_until_done
  1109. move.l current_alien_draw_position,a0
  1110. sub.l #PLANE_INC*4,a0 ;cos buff
  1111. move.l current_map_mem_position,a1
  1112. *--
  1113. sub.l #33*BPR,a0
  1114. sub.l #(2*BIGGEST_MAP_X)*MAP_BLOCK_SIZE,a1
  1115. *--
  1116. move.l current_alien_map_mem_position,a4
  1117. add.l #44,a0
  1118. sub.l #2*MAP_BLOCK_SIZE,a1
  1119. moveq #0,d4
  1120. bsr draw_x_blocks_straight
  1121. cmp.w #WAIT_DRAW_BLOCKS,x_ready_flag
  1122. bne.s wait_until_done
  1123. move.w #START_DRAW_BLOCKS,x_ready_flag
  1124. wait_until_done2
  1125. move.l current_alien_draw_position,a0
  1126. sub.l #PLANE_INC*4,a0 ;cos buff
  1127. move.l current_map_mem_position,a1
  1128. move.l current_alien_map_mem_position,a4
  1129. *--
  1130. sub.l #33*BPR,a0
  1131. sub.l #(2*BIGGEST_MAP_X)*MAP_BLOCK_SIZE,a1
  1132. *--
  1133. add.l #46,a0
  1134. sub.l #1*MAP_BLOCK_SIZE,a1
  1135. moveq #0,d4
  1136. bsr draw_x_blocks_straight
  1137. cmp.w #WAIT_DRAW_BLOCKS,x_ready_flag
  1138. bne.s wait_until_done2
  1139. move.w #WAIT_DRAW_BLOCKS,x_ready_flag
  1140. bsr Add_New_Aliens
  1141. rts
  1142. ********************************************************
  1143. **** SET UP SCROLL POSITION ****
  1144. ********************************************************
  1145. set_up_scroll_position
  1146. clr.w current_x_map_position ;position of drawn blocks
  1147. clr.w current_y_map_position
  1148. clr.w check_x_add
  1149. clr.w check_y_add
  1150. move.l level_map,a0
  1151. move.w map_data_x(a0),d0
  1152. move.w d0,map_x_size
  1153. move.w map_datasize(a0),d1
  1154. asl d1,d0
  1155. mulu map_data_y(a0),d0 ;=size of map
  1156. move.w map_data_y(a0),map_y_size
  1157. add.l #map_data_start,a0
  1158. move.l a0,current_map_pointer
  1159. add.l d0,a0
  1160. move.l a0,current_alien_map_pointer
  1161. move.w map_x_size,d0
  1162. move.w map_y_size,d1
  1163. sub.w #20-2,d0
  1164. sub.w #15,d1
  1165. asl #4,d0
  1166. asl #4,d1
  1167. subq.w #1,d0
  1168. move.w d0,map_x_size
  1169. move.w d1,map_y_size
  1170. rts
  1171. ********************************************************
  1172. **** DRAW CURRENT SCROLL POINT ****
  1173. ********************************************************
  1174. Draw_Current_Scroll_Point
  1175. *Routine sets up screen
  1176. move.l current_map_pointer,a0
  1177. move.w scroll_x_position,d0
  1178. move.w scroll_y_position,d1
  1179. moveq #0,d0
  1180. asr #4,d1
  1181. asr #3,d0 ;cos word map
  1182. mulu #BIGGEST_MAP_X*MAP_BLOCK_SIZE,d1
  1183. add.l d1,a0
  1184. add.l d0,a0 ;map
  1185. rts
  1186. current_map_pointer dc.l 0
  1187. current_alien_map_pointer dc.l 0
  1188. rsreset
  1189. wait_pos rs.w 1
  1190. wait_mask rs.w 1
  1191. plane_1_hi_ptr rs.w 1
  1192. plane_1_hi_val rs.w 1
  1193. plane_1_lo_ptr rs.w 1
  1194. plane_1_lo_val rs.w 1
  1195. plane_2_hi_ptr rs.w 1
  1196. plane_2_hi_val rs.w 1
  1197. plane_2_lo_ptr rs.w 1
  1198. plane_2_lo_val rs.w 1
  1199. plane_3_hi_ptr rs.w 1
  1200. plane_3_hi_val rs.w 1
  1201. plane_3_lo_ptr rs.w 1
  1202. plane_3_lo_val rs.w 1
  1203. plane_4_hi_ptr rs.w 1
  1204. plane_4_hi_val rs.w 1
  1205. plane_4_lo_ptr rs.w 1
  1206. plane_4_lo_val rs.w 1
  1207. rsreset
  1208. map_file_header rs.l 1
  1209. map_blk_size rs.w 1
  1210. map_data_x rs.w 1
  1211. map_data_y rs.w 1
  1212. map_planes rs.w 1
  1213. map_datasize rs.w 1
  1214. map_data_start rs.w 1