four_way_scroll.s 29 KB

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