1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474 |
- Setup_Enemies
- ; Just in case (Glen will probably corrupt memory at some point)
- move.l #$ffffffff,BOBBACK1
- move.l #$ffffffff,BOBBACK2
- move.l #$ffffffff,FRIEND1
- move.l #$ffffffff,FRIEND2
- move.l #$ffffffff,CLEAR1
- move.l #$ffffffff,CLEAR2
- move.l #$ffffffff,SAVE1
- move.l #$ffffffff,SAVE2
- move.l #$ffffffff,LIST1
- move.l #$ffffffff,LIST2
- move.l #$ffffffff,Enemy_Store1
- move.l #$ffffffff,Enemy_Store2
- clr.l alien_map_position
- move.w #0,current_bonus
- move.w #1,current_bonus_counter
- ****
- ; Sets up virtual positions, later on the game will not work this way
- ****
- bsr Create_Enemy_Pointers
- move.l #Level_1_Enemies,a3 ; presets
- bsr Stuff_Preset_Enemies
- End_Setup_Aliens
- rts
- Create_Enemy_Pointers
- move.l Enemy_List,Last_Alien_in_list ; initialise tail var
- move.l #$ffffffff,([Enemy_List]) ; initialise list
-
- move.l #Enemy_Memory,a0
-
- move.l #Available_List,a1
- move.w #Max_No_Objects-1,d0 ; Alien store
- thingyi
- move.l a0,(a1)+
- add.l #Store_Size,a0
- dbra d0,thingyi
- no_space_left
- move.l a1,Available_Pointer
- rts
- Stuff_Preset_Enemies
- ; presets in a3
-
- cmp.w #$ffff,(a3)
- beq.s preset_enemies_done
- move.w (a3)+,d2 ; character
- move.w (a3)+,d0 ; X position
- move.w (a3)+,d1 ; Y position
- move.w (a3)+,d3 ; special data & mode2 bits
- bsr Add_An_Enemy
- bra.s stuff_preset_enemies
- preset_enemies_done
-
- rts
- Spawn_Preset_Enemies
- ; presets in a3
- ; alienX in d0
- ; alienY in d1
-
- move.w d0,d6
- move.w d1,d7
- spawny_loop
- cmp.w #$ffff,(a3)
- beq.s spawny_enemies_done
- move.w (a3)+,d2 ; character
- move.w (a3)+,d0 ; X offset
- move.w (a3)+,d1 ; Y offset
- move.w (a3)+,d3 ; Special data and mode bits
- btst.l #15,d2 ; custom needed
- beq.s no_thanks_custom
- move.l (a3)+,d4 ; custom bit ? nice eh
-
- no_thanks_custom
- add.w d6,d0 ; co-ords
- add.w d7,d1 ; co-ords
- bsr Add_An_Enemy ; stick it in
- bra.s spawny_loop
- spawny_enemies_done
- move.w d6,d0
- move.w d7,d1
- rts
- Create_Master_Slave_Chain
- ; presets in a3
- ; alienX in d0
- ; alienY in d1
- clr.w ms_first_time ; flag for first time through
-
- move.w d0,d6
- move.w d1,d7
- spawny_loop2
- cmp.w #$ffff,(a3)
- beq.s spawny_enemies_done2
- move.w (a3)+,d2 ; character
- move.w (a3)+,d0 ; X offset
- move.w (a3)+,d1 ; Y offset
- move.w (a3)+,d3 ; Special data and mode bits
- btst.l #15,d2 ; custom needed
- beq.s no_thanks_custom2
- move.l (a3)+,d4 ; custom bit ? nice eh
-
- no_thanks_custom2
- add.w d6,d0 ; co-ords
- add.w d7,d1 ; co-ords
- bsr Add_An_Enemy ; stick it in
- tst.l Add_Enemy_pointer ; *** Check if it was added
- beq.s serious_cock_up ; *** If this ever happens
- ; *** The game will look shit!
- tst.w ms_first_time
- bne.s not_first_time
- move.l a1,Master_Pointer ; ie alien which is generating
- move.w #1,ms_first_time ; this stuff is the master.
-
- not_first_time
- move.l a1,-(sp)
-
- move.l Master_Pointer,a1
- move.l Add_Enemy_Pointer,d3
- move.l d3,Alien_Slave_Pointer(a1)
-
- move.l (sp)+,a1
-
- move.l Add_Enemy_Pointer,d3 ; last added pointer
- move.l d3,Master_Pointer ; now becomes the master!
-
- bra.s spawny_loop2
- spawny_enemies_done2
- move.l Master_Pointer,a3
- clr.l Alien_Slave_Pointer(a3) ; has now more slaves in chain
- serious_cock_up
- move.w d6,d0
- move.w d7,d1
- rts
- ms_first_time dc.w 0
- Master_Pointer dc.l 0
- Replace_SaveBacks
- ****************************************************************
- * Function : Removes all alien bobs from a double buffered bob *
- ****************************************************************
- DoReplacePrelims
- BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s DoReplacePrelims
- clr.w BLTAMOD(a6) ; to a buffer
- MOVE.l #$09f00000,BLTCON0(a6) ; straight D=A blit
- move.l #-1,BLTAFWM(a6) ; we want all the bits
- move.l REPLACE_AREA_BUFFER,a2 ; aliens draw at frame-2
- Replace_Next_Bob
- cmp.l #$ffffffff,(a2) ; last alien to erase?
- beq.s Aliens_Replaced ; yes then exit
-
- move.l (a2)+,a0 ; screen memory pointer
- move.l (a2)+,a5 ; graphics memory pointer
- move.l (a2)+,a1 ; graphics struct pointer
-
- WaitforlastReplace
- BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s WaitforlastReplace
-
- move.w Alien_Mod(a1),BLTDMOD(a6) ; copying from the screen
- move.l Alien_Frame_Size(a1),d2 ;
- move.w Alien_Height(a1),d3 ;
- add.w d3,d2 ; add extra byte
- add.w d3,d2 ; add extra byte for padding
-
- move.w #4-1,d7 ; planes
- repl_plane_loop
- replP BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s replP
-
- MOVE.L a5,BLTAPTH(a6) ; a0 graphics on screen
- MOVE.L a0,BLTDPTH(a6) ; a5 pointer to saveback mem
- MOVE.W Alien_D_Blit(a1),BLTSIZE(a6)
- add.l #BYTES_PER_ROW*SCROLL_HEIGHT,a0
- add.l d2,a5
-
- dbra d7,repl_plane_loop
-
- bra.s Replace_Next_Bob ; branch for next alien
- Aliens_Replaced
- rts
-
- *************
- Clear_NoSaves
- DoClearPrelims
- BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s DoClearPrelims
- move.w #-2,BLTAMOD(a6) ; to a buffer
- move.w #-2,BLTBMOD(a6) ; to a buffer
- clr.w BLTBDAT(a6) ; sort this bollocks out
- move.l #$ffff0000,BLTAFWM(a6)
- move.l CLEAR_AREA_BUFFER,a2 ; aliens draw at frame-2
- Clear_Next_Bob
- cmp.l #$ffffffff,(a2) ; last alien to erase?
- beq.s Aliens_Replaced ; yes then exit
-
- move.l (a2)+,a0 ; screen memory pointer
- move.l (a2)+,a5 ; mask memory pointer
- move.l (a2)+,a1 ; graphics struct pointer
- move.l #$00000bca,d0 ; disable b (graphics)
- or.w (a2)+,d0 ; or shift
- swap.w d0 ; swap so in order
- MOVE.l d0,BLTCON0(a6)
-
- Waitforlastclear
- BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s Waitforlastclear
- move.w Alien_Mod(a1),BLTCMOD(a6) ; copying from the screen
- move.w Alien_Mod(a1),BLTDMOD(a6) ; copying from the screen
- move.w #4-1,d7 ; planes
- clear_plane_loop
- clearP BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s clearP
-
- MOVE.L a5,BLTAPTH(a6) ; mask
- * MOVE.L a5,BLTBPTH(a6) ; graphics ; not used
- move.l a0,BLTCPTH(a6) ; screen address
- MOVE.L a0,BLTDPTH(a6) ; screen address
- MOVE.W Alien_D_Blit(a1),BLTSIZE(a6)
- add.l #BYTES_PER_ROW*SCROLL_HEIGHT,a0
-
- dbra d7,clear_plane_loop
-
- bra.s Clear_Next_Bob ; branch for next alien
- Aliens_Cleared
- rts
- Object_Collision
- * This code really needs sorting out so that
- * types of aliens which collide are defined
- * correctly. ie We do not wish to kill platforms.
- move.l #Temporary_Object_List,a0
- next_object
- cmp.l #$ffffffff,(a0) ; end of list?
- beq object_collision_complete
-
- move.l (a0)+,a2
- move.l Enemy_List,a1
- next_object2
- cmp.l #$ffffffff,(a1) ;
- beq current_object_complete
- move.l (a1)+,a3 ;
-
- cmp.l a2,a3 ; same object ?
- beq.s next_object2
-
- btst.b #Alien_hit,Alien_Mode(a2) ; object already hit?
- bne.s next_object2
- btst.b #Alien_hit,Alien_Mode(a3) ; same again with obj 2
- bne.s next_object2
- ** Test Collision Pair **
- move.w Alien_Number(a2),d0
- move.w Alien_Number(a3),d1
- mulu.w #Character_Control_Size,d0
- mulu.w #Character_Control_Size,d1
- move.l d0,a4
- add.l #Character_Control_Block,a4
- move.l d1,a5
- add.l #Character_Control_Block,a5
- move.w Alien_X(a2),d0
- move.w Alien_Y(a2),d1
- add.w Character_Coll_Box_X(a4),d0
- add.w Character_Coll_Box_Y(a4),d1
- move.w d0,d2
- move.w d1,d3
- add.w Character_Coll_Box_DX(a4),d2
- add.w Character_Coll_Box_DY(a4),d3
-
- move.w Alien_X(a3),d4
- move.w Alien_Y(a3),d5
- add.w Character_Coll_Box_X(a5),d4
- add.w Character_Coll_Box_Y(a5),d5
- move.w d4,d6
- move.w d5,d7
- add.w Character_Coll_Box_DX(a5),d6
- add.w Character_Coll_Box_DY(a5),d7
- cmp.w d0,d4
- blt.s test_x_to_the_lefto
- text_x_to_the_righto
- cmp.w d2,d4
- blt.s x_in_boxo
- bra no_object_hit_alien
- test_x_to_the_lefto
- cmp.w d0,d6
- blt no_object_hit_alien
- x_in_boxo
- * Y collision
- cmp.w d1,d5
- blt.s test_y_aboveo
- text_y_belowo
- cmp.w d3,d5
- blt.s y_in_boxo
- bra no_object_hit_alien
- test_y_aboveo
- cmp.w d1,d7
- blt no_object_hit_alien
-
- y_in_boxo
- collision_happened
- btst.b #Alien_Object,Alien_Mode2(a3) ; did it hit another object?
- beq.s hit_an_alien_thats_all_right_then
- btst.b #Alien_Platform,Alien_Mode2(a3) ; did it hit a platform
- bne next_object2 ; do something about this shit code
- move.w Repeat_X(a2),d0
- tst.w d0
- bmi.s test_left_movement
- cmp.w Repeat_X(a3),d0
- blt.s object2wins
- bra.s object1wins
- test_left_movement
- cmp.w Repeat_X(a3),d0
- bgt.s object2wins
- object1wins
- move.l Character_Dead(a5),a4
- move.l a4,Alien_Flight(a3) ; set hit anim
- clr.w Repeat_Counter(a3)
- bset.b #Alien_OffScreen,Alien_Mode(a3)
- bset.b #Alien_Hit,Alien_Mode(a3)
- * bsr do_score_chance
- bra next_object2
- object2wins
-
- move.l Character_Dead(a4),a4
- move.l a4,Alien_Flight(a2) ; set hit anim
- clr.w Repeat_Counter(a2)
- bset.b #Alien_OffScreen,Alien_Mode(a2)
- bset.b #Alien_Hit,Alien_Mode(a2)
- * bsr do_score_chance
- bra next_object2
- hit_an_alien_thats_all_right_then
- move.l Character_Hit(a5),a5
- move.l a5,Alien_Flight(a3) ; set hit anim
- clr.w Repeat_Counter(a3)
- bset.b #Alien_OffScreen,Alien_Mode(a3)
- bset.b #Alien_Hit,Alien_Mode(a3)
- move.w #Sound_Slap,sound_chan1
- move.w d4,d0
- move.w d5,d1
- bsr do_score_chance
- cmp.w #BaseBall_Character,Alien_Number(a2)
- bne.s no_baseball
- move.l Character_Dead(a4),a4
- move.l a4,Alien_Flight(a2) ; set hit anim
- clr.w Repeat_Counter(a2)
- bset.b #Alien_OffScreen,Alien_Mode(a2)
- bset.b #Alien_Hit,Alien_Mode(a2)
- no_baseball
- no_object_hit_alien
- bra next_object2
- current_object_complete
- bra next_object
- object_collision_complete
- rts
- Player_Object_Collision
- tst.w current_bonus_counter
- beq.s reset_bonus
- subq.w #1,current_bonus_counter
- bra.s its1052
- reset_bonus
- move.w #0,current_bonus
- its1052
- clr.l Player_Object
- move.l Enemy_List,a0
- move.l #Temporary_Object_List,a1
- next_player_object
- cmp.l #$ffffffff,(a0) ; end of list?
- beq player_object_collision_complete
- * Must try to get this out of the loop
- move.w player_x,d0
- move.w player_y,d1
- add.w screen_x_position,d0
- add.w screen_y_position,d1
- move.w d0,d2
- move.w d1,d3
- add.w #15,d2 ; player width
- add.w #PLAYER_HEIGHT,d3 ; player height
-
- move.l (a0)+,a2 ; object1
- move.w Alien_Number(a2),d4
- mulu.w #Character_Control_Size,d4
- move.l d4,a4
- add.l #Character_Control_Block,a4
- btst.b #Alien_Platform,Alien_Mode2(a2)
- beq not_a_platform
- ** Test Alien Co-ordinates with that of the player
- add.w #8,d0
- add.w #PLAYER_HEIGHT,d1 ; feet co-ords
- move.w Alien_X(a2),d4
- move.w Alien_Y(a2),d5
- add.w Character_Coll_Box_X(a4),d4
- add.w Character_Coll_Box_Y(a4),d5
- move.w d4,d6
- move.w d5,d7
- add.w Character_Coll_Box_DX(a4),d6
- add.w Character_Coll_Box_DY(a4),d7
- cmp.w d4,d0
- blt.s no_pl_collision1
- cmp.w d5,d1
- blt.s no_pl_collision_test_y
- cmp.w d6,d0
- bgt.s no_pl_collision1
- cmp.w d7,d1
- bgt.s no_pl_collision1
- bra.s collision_happened_on_player
- no_pl_collision_test_y
- *This code checks player cannot fall through platform
- bsr check_player_fall_onto_platform
- tst d7
- bne.s collision_happened_on_player
- no_pl_collision1
- bra.s nothing_touching_player
-
- collision_happened_on_player
- ; set player y co-ordinate to that of the alien - height of player
- bsr check_player_on_platform
- tst d7
- beq.s nothing_touching_player
- player_hit_plat
- move.b #0,y_collision_jump_struct+in_air
- move.b #0,y_collision_fall_struct+in_air
- move.w #0,player_fall_velocity
- move.w #0,start_jump
- move.w #0,player_falling_flag
- move.w #ACTION_PLAYER_ON_GROUND,player_action
- move.w d5,d1
- sub.w #PLAYER_HEIGHT,d1
- sub.w screen_y_position,d1
- mulu.w #SCALE_FACTOR,d1
- move.w d1,player_y_scaled
- move.l a2,Player_Object ; player object address
- btst.b #Platform_Activate,Alien_Mode2(a2)
- beq.s dont_bother
- move.l Character_Hit(a4),a4
- move.l a4,Alien_Flight(a2) ; set hit anim
- clr.w Repeat_Counter(a2)
- dont_bother
- nothing_touching_player
- bra next_player_object
- not_a_platform
- btst.b #Alien_Hit,Alien_Mode(a2)
- bne next_player_object
- btst.b #Alien_Object,Alien_Mode2(a2)
- beq.s not_an_object
- move.l a2,(a1)+
- not_an_object
-
- * is a normal alien so do test for death and also jump on head
- move.w Alien_X(a2),d4
- move.w Alien_Y(a2),d5
- add.w Character_Coll_Box_X(a4),d4
- add.w Character_Coll_Box_Y(a4),d5
- move.w d4,d6
- move.w d5,d7
- add.w Character_Coll_Box_DX(a4),d6
- add.w Character_Coll_Box_DY(a4),d7
- btst.b #Alien_Bonus,Alien_Mode2(a2) ; for the baseball shit
- bne.s no_jump_collision
- cmp.w #ACTION_PLAYER_FALLING,player_action
- bne.s no_jump_collision
- * Test Jump on alien
- addq.w #2,d0
- subq.w #2,d2 ; mid of player
- subq.w #5,d3 ; feet box
- cmp.w d0,d4
- blt.s jumptest_x_to_the_left
- jumptest_x_to_the_right
- cmp.w d2,d4
- blt.s jumpx_in_box
- bra.s no_jp_collision1
- jumptest_x_to_the_left
- cmp.w d0,d6
- blt.s no_jp_collision1
- jumpx_in_box
- * Y collision ; test Y strip in alien
- cmp.w d3,d5
- blt.s jumptest_y_above
- jumptest_y_below
- add.w #5,d3
- cmp.w d3,d5
- blt.s player_jumped_on_alien
- bra.s no_jp_collision1
- jumptest_y_above
- *add.w #5,d3
- cmp.w d3,d7
- blt.s frig_code
- bra player_jumped_on_alien
-
- *cmp.w d4,d2
- *blt.s no_jp_collision1
- *cmp.w d5,d3
- *blt.s no_jp_collision1
- *cmp.w d6,d2
- *bgt.s no_jp_collision1
- *cmp.w d7,d3
- *bgt.s no_jp_collision1
- *bra player_jumped_on_alien
- frig_code
- *add.w #5,d3
- no_jp_collision1
- subq.w #2,d0
- addq.w #2,d2
-
- * Test player hit
- no_jump_collision
- cmp.w d0,d4
- blt.s test_x_to_the_left
- text_x_to_the_right
- cmp.w d2,d4
- blt.s x_in_box
- bra.s no_ob_collision
- test_x_to_the_left
- cmp.w d0,d6
- blt.s no_ob_collision
- x_in_box
- * Y collision
- cmp.w d1,d5
- blt.s test_y_above
- text_y_below
- cmp.w d3,d5
- blt.s y_in_box
- bra.s no_ob_collision
- test_y_above
- cmp.w d1,d7
- blt.s no_ob_collision
-
- y_in_box
- collision_happened_on_object
- btst.b #Alien_object,Alien_Mode2(a2)
- beq.s try_bonus
- bra.s hit_character_but_not_die
- try_bonus
- btst.b #Alien_Bonus,Alien_Mode2(a2)
- beq.s hit_nasty
- hit_character_but_not_die
- cmp.w #GlassBLOCK_CHARACTER,Alien_Number(a2)
- bne.s dont_bodge_it
- move.w #Sound_Cowbell,sound_chan1
- bset.b #Alien_Dead,Alien_Mode(a2)
- move.w #BASE_BALL,player_holding_object
- dont_bodge_it
- move.l Character_Hit(a4),a4
- move.l a4,Alien_Flight(a2) ; set hit anim
- clr.w Repeat_Counter(a2)
- bra next_player_object
- hit_nasty
- move.w #1,player_has_been_hit
- bra next_player_object
-
- no_ob_collision
- bra next_player_object
-
- player_jumped_on_alien
- move.b #0,y_collision_jump_struct+in_air
- move.b #0,y_collision_fall_struct+in_air
- move.w #0,player_fall_velocity
- move.w #0,start_jump
- move.w #0,player_falling_flag
- move.w #0,supress_repeat_jump
- move.w #1,fire
- tst.w ydirec
- bmi.s player_attempting_bum_flatten
- move.w #Sound_alienhit,sound_chan1
- bra.s done_player_alien_sounds
- player_attempting_bum_flatten
- move.w #Sound_bumhit,sound_chan1
- move.w player_x_velocity,d0
- asl d0
- move.w d0,player_x_velocity
- *we set both these bits - SPRING as there is code to bypass
- *various things if player sitting down - also set BOUNCE so only
- *a small jump is perfromed and not a SPRING jump - i.e clear it
- bset.b #BOUNCE_FLAG,player_control_bits
- bset.b #SPRING_FLAG,player_control_bits
- done_player_alien_sounds
- Set_alien_hit_anim
- move.l Character_Hit(a4),a4
- move.l a4,Alien_Flight(a2) ; set hit anim
- clr.w Repeat_Counter(a2)
- bset.b #Alien_OffScreen,Alien_Mode(a2)
- bset.b #Alien_Hit,Alien_Mode(a2)
- move.w d4,d0
- move.w d5,d1
- bsr do_score_chance
- move.w d2,d0
- subq.w #8,d0 ; centre star
- move.w d3,d1
- move.w #hitstar_character,d2
- bsr add_an_enemy
-
- bra next_player_object
-
- player_object_collision_complete
- move.l #$FFFFFFFF,(a1) ; end object list
- rts
- do_score_chance
- ; NOTE: buggers up a5
- tst.w ydirec
- bpl.s no_double_bum
- addq.w #1,current_bonus
- no_double_bum
- move.w #score_character,d2
- bsr add_an_enemy
- move.l add_enemy_pointer,a5
- move.w current_bonus,frame_number(a5)
- addq.w #1,current_bonus
- check_max_bonus
- cmp.w #12,current_bonus
- ble.s bonus_ok
- move.w #12,current_bonus
- bonus_ok
- move.w #50*3,current_bonus_counter
- rts
- current_bonus
- dc.w 1
- current_bonus_counter
- dc.w 0
-
- Move_Player_On_Object
-
- move.l Player_Object,a0
- tst.l a0
- beq.s no_object_on
- move.w Repeat_X(a0),d0
- move.w Repeat_Y(a0),d1
- mulu.w #SCALE_FACTOR,d0
- mulu.w #SCALE_FACTOR,d1
- add.w d0,player_x_scaled
- add.w d1,player_y_scaled
- no_object_on
- rts
-
- Move_Bobs
- *******************************************************************
- * Function : Handles the movement addition and deletion of aliens *
- * from an existance list *
- * Limits : So far this section has the following abilities *
- * Move Absolute/Relative, Speed *
- * Addition : This routine has been modified to include the Place *
- * bob procedure as this was found to be faster *
- *******************************************************************
- move.l Enemy_List,a0 ; all aliens to be processed
- move.l #Alien_Species,a2 ; all the varieties
- move.l OLDBOB_BUFFER,a3 ; planes to draw objects
- move.l CLEAR_LIST_BUFFER,a5 ; no saveback objects
- move.l Enemy_List_Buffer,a4 ; pointer for alien list processing
-
- New_Bob
- *-Next-Alien--------------------------------------------------------------
- cmp.l #$FFFFFFFF,(a0) ; no aliens left?
- beq aliens_processed ; yes then wrap up
-
- move.l (a0),a1 ; alien details
- co_ords
-
- move.w Alien_X(a1),d0 ; get last x pos of alien
- move.w Alien_Y(a1),d1 ; get last y pos of alien
- btst.b #Alien_Dying,Alien_Mode(a1) ; has alien already started to snuff it
- * bne.s Dont_Move_While_Dying
- bne dont_move_while_dying
- .
- move.w Screen_X_Position,d2
- move.w Screen_Y_Position,d3
- ********************
- *no boundary check *
- ********************
- *bra.s no_boundary_check
-
- no_boundary_check
- move.l a4,Last_Alien_in_List
- bsr Process_Character_Animation ; spawning etc
- move.l Last_Alien_in_List,a4
-
- btst.b #Alien_Dead,Alien_Mode(a1) ; remove if finally dead
- bne Remove_Alien
-
- move.w d0,Alien_X(a1) ; store new X
- move.w d1,Alien_Y(a1) ; store new Y
- Dont_Move_While_Dying
- Movement_Done
- *bra.s check_screen_visability
- ; Test for alien returning to map
- ; NOTE: Only testing x for now, this needs to be updated for
- ; maps which vary in the y axis
- move.w Screen_X_Position,d2
- sub.w #16*16,d2 ; 4 words
-
- cmp.w d2,d0
- blt.s out_of_screen_range
- add.w #16*16+320+16*16,d2 ; map window
- cmp.w d2,d0
- bgt.s out_of_screen_range
- bra.s check_screen_visability
- out_of_screen_range
- tst.l Alien_map_pointer(a1) ; has entry in map
- beq.s no_erase_from_map2 ; no then no bother
- bclr.b #ALIEN_BUSY,([Alien_map_pointer,a1]) ; clear busy flag
- bra.s remove_alien ; and remove alien
-
- no_erase_from_map2
- check_screen_visability
- move.w Screen_X_Position,d2
- move.w Screen_Y_Position,d3
-
- sub.w #48,d2 ; so it scrolls on smooth
- sub.w #0,d3 ; for use later
-
- cmp.w d2,d0
- blt.s NotVisable
- cmp.w d3,d1
- blt.s NotVisable
- add.w #320+48,d2 ; window width
- add.w #256-16,d3 ; for use later
- cmp.w d2,d0
- bgt.s NotVisable
- cmp.w d3,d1
- bgt.s NotVisable
- sub.w Screen_X_Position,d0 ; get a screen pos
- add.w #15,d0 ; NASTY
- sub.w current_scroll_pixel_offset,d0 ; SEE GLEN
- *sub.w Screen_Y_Position,d1 ; for the aliens
-
- bsr Place_Alien ; draw in the alien
- bra.s Visable
- NotVisable
- btst.b #Alien_OffScreen,Alien_Mode(a1) ; if alien should go now
- beq.s keep_processing
- tst.l Alien_map_pointer(a1) ; pos in map
- beq.s keep_in_map
- clr.b ([Alien_map_pointer,a1])
- keep_in_map
- bra.s Remove_Alien ; best remove it while it
- keep_processing
- Visable
- move.l a1,(a4)+ ; put alien back in
- bra.s Alien_Remains
- Remove_Alien
-
- no_erase_from_map
- alien_can_come_back_later
-
- move.l available_pointer,a6
- move.l a1,(a6)+
- move.l a6,available_pointer
- Alien_Remains
-
- addq.l #$4,a0 ; next alien post-box
- bra New_Bob
- aliens_processed
- move.l #$ffffffff,(a4) ; end of alien list marker
- move.l a4,Last_Alien_In_List ; its only polite really
- move.l #$ffffffff,(a3) ; end of aliens
- move.l #$ffffffff,(a5) ; end of nosaves
- move.l #$dff000,a6
- move.l Enemy_List,a0
- move.l Enemy_List_Buffer,Enemy_List ; replace list pointer
- move.l a0,Enemy_List_Buffer ; can be buffer next time
- RTS
- Add_An_Enemy
- ; Send Data d0 - x pos
- ; d1 - y pos
- ; d2 - character - corrupt
- ; d3 - Special Data
- ; Bit 15 in d2 set = Custom pattern in d4
- ; Then I will do the rest
-
- movem.l a0-a1,-(sp)
- clr.l Add_Enemy_Pointer ; for post-add manipulation
-
- move.l Available_Pointer,a0
- cmp.l #Available_List,a0 ; physically not possible to
- beq Cant_Add_Alien ; hold more data
-
- move.l -(a0),a1
- move.l a0,Available_Pointer ; save new stack pointer
- move.l Last_Alien_in_List,a0 ;
- move.l a1,(a0)+ ; store new alien pointer
- move.l a0,Last_Alien_In_List ; store new list pointer
- move.l #$ffffffff,(a0) ; put new tail marker
- btst.l #15,d2 ; custom pattern to set
- beq.s no_custom_pattern ;
- bclr.l #15,d2
- move.l d4,Alien_Flight(a1) ; custom pattern address
- move.w d2,Alien_Number(a1) ; character type
- mulu.w #Character_Control_Size,d2
- move.l #Character_Control_Block,a0
- add.l d2,a0
- move.l Character_Standard(a0),d2 ; default animation
- bra.s custom_was_set
- no_custom_pattern
- move.w d2,Alien_Number(a1) ; character type
- mulu.w #Character_Control_Size,d2
- move.l #Character_Control_Block,a0
- add.l d2,a0
- move.l Character_Standard(a0),d2 ; default animation
- move.l d2,Alien_Flight(a1)
- custom_was_set
- move.w Character_Flags(a0),d2 ; anim flags
- move.w d2,Alien_Mode(a1)
- move.b d3,Alien_Data+1(a1) ; only a byte
- *lsr.w #8,d3 ; get top byte
- *move.b d3,Alien_Mode2(a1) ; use as new mode bits
- clr.w alien_fall_velocity(a1)
- move.w #1,alien_in_air(a1)
- clr.w Alien_GFX_Number(a1)
- clr.w Frame_Number(a1)
- clr.w Frame_Counter(a1)
- clr.w Repeat_Counter(a1)
- move.w d0,Alien_X(a1)
- move.w d1,Alien_Y(a1)
-
- move.w #SET,Animation_Mode(a1)
- clr.w Animation_LoFrame(a1)
- clr.w Animation_HiFrame(a1)
- clr.w Animation_Speed(a1)
- clr.w Animation_Flags(a1)
- move.w #1,Alien_Hits(a1) ; needs work
- move.l alien_map_position,alien_map_pointer(a1)
- clr.l Alien_Slave_Pointer(a1) ; aliens under control
- move.l a1,add_enemy_pointer
-
- Cant_Add_Alien
- movem.l (sp)+,a0-a1
- rts
- add_enemy_pointer dc.l 0
- alien_map_position dc.l 0
- Place_Alien
-
- move.w Alien_GFX_Number(a1),d6 ; separate to char number
- btst.b #Alien_Left,Alien_Mode2(a1)
- beq.s walking_right
- addq.w #1,d6
- walking_right
- mulu.w #Graphics_Size,d6
- move.l a2,d5 ; alien species start
- add.l d6,d5 ; add offset
- move.l d5,Store_G_Pointer(a1) ; store species pointer
-
- move.l Alien_Graphics(a2,d6.w),d2 ; base of graphics
- move.l Alien_Mask(a2,d6.w),d3 ; mask
- move.l Alien_Frame_Size(a2,d6.w),d7
- mulu.w Frame_Number(a1),d7 ;
- add.l d7,d2 ; get graph pos
- add.l d7,d3
-
- Blit_Graphics
- MOVE.W D0,D6
- AND.W #$000F,D0
- AND.w #$FFF0,D6
- ASR.w #3,D6
- ext.l d6 ; could be negative so make long
- ROR.W #4,D0
- move.w d0,d7
- OR.W #$0fca,d0
- swap d0
- move.w d7,d0
- mulu.w #BYTES_PER_ROW,d1
- SORT_OUT_GRAPHICS
- ADD.l d1,D6
- add.l scroll_plane_position,d6
-
- MOVE.L d6,Store_Destination(a1) ; destination
- move.l d3,Store_Mask(a1) ; alien mask
- move.l d0,Store_Shift(a1) ; shift bits
- move.l a1,Store_Pointer(a1) ; alien pointer
- move.l d2,Store_Graphics(a1) ; graphics pointer
- ***
- *** Use this for separating on screen lists ? objects/aliens etc.
- ***
- btst.b #No_Saveback,Alien_Mode(a1) ; is it a friendly or ex
- bne.s dont_save
-
- move.l a1,(a3)+
- bra.s saved_as_required
- dont_save
- move.l a1,(a5)+
-
- saved_as_required
- rts
-
- Process_Character_Animation
- move.l a2,-(sp) ; need this
- move.l Alien_Flight(a1),a2
- ** Do frame Animation
- cmp.w #FLIP,Animation_Mode(a1) ; is it flip frame?
- bne.s no_flip_frame
-
- tst.w Frame_Counter(a1)
- beq.s reset_frame_counter
- subq.w #1,Frame_Counter(a1)
- bra.s Done_flip_Frame
- reset_frame_counter
- move.w Animation_Speed(a1),d4
- move.w d4,Frame_Counter(a1)
- move.w Frame_Number(a1),d4
- tst.w Animation_Flags(a1) ; going up or down?
- bne.s flip_down
- addq.w #1,d4
- cmp.w Animation_HiFrame(a1),d4 ; reached topframe?
- bne.s set_new_frame
- move.w #-1,Animation_Flags(a1) ; set down frame
- bra.s set_new_frame
- flip_down
- subq.w #1,d4
- cmp.w Animation_LoFrame(a1),d4 ; reached lowframe?
- bne.s set_new_frame
- move.w #0,Animation_Flags(a1)
- set_new_frame
- move.w d4,Frame_Number(a1)
- bra.s done_flip_frame
- no_flip_frame
-
- cmp.w #CYCLE,Animation_Mode(a1) ; is it cycle frame?
- bne.s no_cycle_frame
-
- tst.w Frame_Counter(a1)
- beq.s reset_CYCLE_frame
- subq.w #1,Frame_Counter(a1)
- bra.s Done_cycle_Frame
- reset_CYCLE_frame
- move.w Animation_Speed(a1),d4
- move.w d4,Frame_Counter(a1)
- move.w Frame_Number(a1),d4
- cmp.w Animation_HiFrame(a1),d4
- bne.s cycle_frame_ok
- move.w Animation_LoFrame(a1),d4
- bra.s set_cycle_frame
- cycle_frame_ok
- addq.w #1,d4
- set_cycle_frame
- move.w d4,Frame_Number(a1)
- no_cycle_frame
- done_flip_frame
- done_cycle_frame
- no_set_frame
-
- tst.w Repeat_Counter(a1) ; is movement in repeat?
- beq.s no_repeat_mode
- move.w Repeat_X(a1),d4
- move.w Repeat_Y(a1),d5
- bsr Add_Object_Deltas
- subq.w #1,Repeat_Counter(a1) ; decrement the counter
- bra repeat_increments
- no_repeat_mode
- check_command
- cmp.w #FIRST_COMMAND,(a2)
- blt.s no_new_command
- cmp.w #LAST_COMMAND,(a2)
- bgt.s no_new_command
-
- move.w (a2)+,d4
- sub.w #FIRST_COMMAND,d4
- move.l #Command_Pointers,a6
- move.l (a6,d4.w*4),a6
-
- jsr (a6)
- bra.s check_command ; DANGER of infinite loop
-
- no_new_command
- ******************
- * Move Character *
- ******************
- tst.w Repeat_Counter(a1) ; in case was set this time
- bne.s repeat_increments
-
- move.w (a2)+,d4
- move.w (a2)+,d5
-
- move.w d4,Repeat_X(a1) ; for player on object
- move.w d5,Repeat_Y(a1)
-
- bsr Add_Object_Deltas
-
- cmp.w #BaseBall_Character,Alien_Number(a1)
- bne.s repeat_increments
- repeat_increments
- cmp.w #BaseBall_Character,Alien_Number(a1)
- bne.s dont_do_ball
- btst.b #Alien_Hit,Alien_Mode(a1)
- bne.s dont_do_ball
- movem.l d3-d6/a0/a1/a3/a4,-(sp)
- move.w Alien_Number(a1),d2 ; character type
- mulu.w #Character_Control_Size,d2
- move.l #Character_Control_Block,a0
- add.l d2,a0
- bsr BaseBall_Collision ; a2 gets set if ball hits block
- movem.l (sp)+,d3-d6/a0/a1/a3/a4
-
- dont_do_ball
- btst.b #Ground_Collision,Alien_mode(a1)
- beq.s animation_done
- movem.l d3-d6/a0-a4,-(sp)
- move.w Alien_Number(a1),d2 ; character type
- mulu.w #Character_Control_Size,d2
- move.l #Character_Control_Block,a0
- add.l d2,a0
- bsr alien_ground_collision
- movem.l (sp)+,d3-d6/a0-a4
-
- animation_done
- move.l a2,Alien_Flight(a1) ; store new pointer
- move.l (sp)+,a2 ; restore
- rts
- Add_Object_Deltas
- ; Co-ords in d0,d1, alien pointer in a1
- ; delta-X in d4, delta-Y in d5
- btst.b #Alien_Left,Alien_Mode2(a1) ; is it going left
- beq.s delta_x_going_right
- neg.w d4 ; could add to a few more
- delta_x_going_right
-
- add.w d4,d0 ; add x delta to co-ord
- add.w d5,d1 ; add y delta to co-ord
- btst.b #Alien_Master,Alien_Mode2(a1)
- beq.s no_master_required
-
- movem.l a1,-(sp)
- slave_loop
- tst.l Alien_Slave_Pointer(a1)
- beq.s slaves_done
- move.l Alien_Slave_Pointer(a1),a1
- add.w d4,Alien_X(a1)
- add.w d5,Alien_Y(a1)
- bra.s slave_loop
- slaves_done
- movem.l (sp)+,a1
- no_master_required
- rts
-
- Command_Pointers
- dc.l Restart_Command
- dc.l Flip_Command
- dc.l Cycle_Command
- dc.l Set_Command
- dc.l Repeat_Command
- dc.l Spawn_Command
- dc.l Mode_Set_Command
- dc.l Mode_Clear_Command
- dc.l GFX_Command
- dc.l spring_block ; glens code
- dc.l freeze_command
- dc.l dog_talk
- dc.l Cast_Master_Slaves
- dc.l command_slaves_command
- dc.l new_anim_command
- dc.l activate_fruit_block ; glens code
- Restart_Command
- move.l (a2),a2 ; get address of start
- rts
- Flip_Command
- move.w #FLIP,Animation_Mode(a1)
- bra.s flip_params
- Cycle_Command
- move.w #CYCLE,Animation_Mode(a1)
- flip_params
- move.w (a2)+,d5
- move.w d5,Animation_LoFrame(a1)
- move.w d5,Frame_Number(a1)
- move.w (a2)+,Animation_HiFrame(a1)
- move.w (a2)+,d4
- move.w d4,Animation_Speed(a1)
- move.w d4,Frame_Counter(a1)
- clr.w Animation_Flags(a1)
- rts
- SET_command
- move.w #SET,Animation_Mode(a1) ; "SET" keyword
- move.w (a2)+,Frame_Number(a1) ; Frame to set
- rts
- Mode_Set_Command
- move.w (a2)+,d4 ; get mode bits
- or.w d4,Alien_Mode(a1) ; and then set them
- rts
- Mode_Clear_Command
- move.w (a2)+,d4 ; get mode bits
- not.w d4 ; invert the bits
- and.w d4,Alien_Mode(a1) ; and then clear them
- rts
-
- GFX_Command
- move.w (a2)+,d4 ; get new graphics
- move.w d4,Alien_GFX_Number(a1) ; and set it
- rts
-
- Spawn_command
- move.l a3,-(sp)
- move.l (a2)+,a3 ; list of aliens to spawn
- bsr spawn_preset_enemies ; oh no loops
- move.l (sp)+,a3 ; restore ol faithful
- rts
-
- Repeat_command
- move.w (a2)+,d4
- move.w d4,Repeat_X(a1)
- move.w (a2)+,d5
- move.w d5,Repeat_Y(a1)
- cmp.w #DATA,(a2) ; is it special data
- bne.s not_special_data
- move.w Alien_Data(a1),Repeat_Counter(a1)
- addq.l #2,a2 ; add on index
- bra.s special_data
- not_special_data
- move.w (a2)+,Repeat_Counter(a1)
- special_data
- bsr Add_Object_Deltas
- rts
- freeze_command
- move.b player_control_bits,d4
- bchg #stuck_flag,d4
- move.b d4,player_control_bits
- rts
- dog_talk
- move.l (a2)+,d4 ; talk pointer
- bsr character_speak
- rts
- Cast_Master_Slaves
- move.l a3,-(sp)
- move.l (a2)+,a3 ; list of aliens to spawn
- bsr create_master_slave_chain ; oh no loops
- move.l (sp)+,a3 ; restore ol faithful
- rts
- Command_Slaves_Command
- move.w (a2)+,d4
- sub.w #FIRST_COMMAND,d4
- move.l #Command_Pointers,a6
- move.l (a6,d4.w*4),a6
- move.l Alien_Slave_Pointer(a1),d4
- tst.l d4 ; check before entering loop
- beq.s no_slaves_ooh
- movem.l a1/d0-d1,-(sp)
- move.l d4,a1 ; for first pass
- slave_command_loop
- tst.l a1
- beq.s done_slave_commands ; should only call
- ; routines which
- ; set structure data! ie. a1
-
- move.l a2,-(sp) ; save master anim pointer
- jsr (a6) ; call anim routine
- move.l a2,d3 ; save pointer to next
- ; command for master
- move.l (sp)+,a2 ; restore pointer for next
- move.l Alien_Slave_Pointer(a1),a1 ; for next loop
- bra.s slave_command_loop
- done_slave_commands
- move.l d3,a2
- movem.l (sp)+,a1/d0-d1
- no_slaves_ooh
- rts
- ; SLAVE ONLY commands
-
- new_anim_command
- move.l (a2)+,Alien_Flight(a1)
- rts
-
- Store_NoSaves
- move.l CLEAR_LIST_BUFFER,a2
- move.l CLEAR_AREA_BUFFER,a5 ; objects which clear
- Store_Next_Bob
- cmp.l #$ffffffff,(a2) ; last alien to save?
- beq.s Aliens_stored ; yes then exit
- move.l (a2)+,a4
- move.l Store_G_Pointer(a4),a1
- move.l Store_Destination(a4),a0
- btst.b #Alien_Burn,Alien_Mode(a4) ; leave it in scroll?
- beq.s do_clear_save
- btst.b #Alien_Burn2,Alien_Mode(a4)
- bne.s ok_really_burned
- bset.b #Alien_Burn2,Alien_Mode(a4)
- bra.s store_next_bob
- ok_really_burned
- bset.b #Alien_Dead,Alien_mode(a4) ; set dead
- bra.s store_next_bob ; dont erase it
- do_clear_save
- move.l a0,(a5)+ ; screen memory pointer
- move.l Store_Mask(a4),(a5)+ ; graphics memory pointer
- move.l a1,(a5)+ ; graphics struct pointer
- move.l Store_Shift(a4),d0 ; get shift
- move.w d0,(a5)+ ; only want pure shift
-
- bra.s store_next_bob
- aliens_stored
- move.l #$ffffffff,(a5) ; end the clear list
- rts
-
- SaveBack_Enemies
- move.l SAVEBACK_BUFFER,d5 ; an address count of saveback graphics
- move.l OLDBOB_BUFFER,a2
- move.l REPLACE_AREA_BUFFER,a3 ; objects which saveback
- PreSaveSetup
- BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s PreSaveSetup
- move.l #-1,BLTAFWM(a6) ; all data stored
- clr.w BLTDMOD(a6) ; to a buffer
- MOVE.l #$09f00000,BLTCON0(a6) ; straight D=A blit
- Save_Next_Bob
- cmp.l #$ffffffff,(a2) ; last alien to save?
- beq Aliens_Saved ; yes then exit
- move.l (a2)+,a4
- move.l Store_G_Pointer(a4),a1
- move.l Store_Destination(a4),a0
- * Save parameters in replace list first
- save_required
- move.l a0,(a3)+ ; screen memory pointer
- move.l d5,(a3)+ ; graphics memory pointer
- move.l a1,(a3)+ ; graphics struct pointer
- Waitforlastsave
- BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s Waitforlastsave
-
- move.w Alien_Mod(a1),BLTAMOD(a6) ; copying from the screen
- move.l Alien_Frame_Size(a1),d2 ;
- move.w Alien_Height(a1),d3 ;
- add.w d3,d2 ; add extra byte
- add.w d3,d2 ; add extra byte for padding
-
- move.w #4-1,d7 ; planes
- save_plane_loop
- saveP BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s saveP
-
- MOVE.L a0,BLTAPTH(a6) ; a0 graphics on screen
- MOVE.L d5,BLTDPTH(a6) ; d5 pointer to saveback mem
- MOVE.W Alien_D_Blit(a1),BLTSIZE(a6)
- add.l #BYTES_PER_ROW*SCROLL_HEIGHT,a0
- add.l d2,d5
-
- dbra d7,save_plane_loop
- bra Save_Next_Bob
- Aliens_Saved
- move.l #$ffffffff,(a3) ; end the saveback list
- rts
-
-
- Draw_Enemies_In
- move.l OLDBOB_BUFFER,a2 ; aliens draw at frame-2
- bsr.s Draw_New_Bobs
- rts
- Draw_NoSaves
- move.l CLEAR_LIST_BUFFER,a2
- bsr.s Draw_New_Bobs
- rts
-
- Draw_New_Bobs
- PreDrawSetup
- BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s PreDrawSetup
- move.l #$FFFF0000,BLTAFWM(a6) ; mask off last word
- move.w #-2,BLTAMOD(a6)
- move.w #-2,BLTBMOD(a6)
-
- Draw_Next_Bob
- cmp.l #$ffffffff,(a2) ; last alien to draw?
- beq Aliens_Drawn ; yes then exit
- move.l (a2)+,a4
- move.l Store_G_Pointer(a4),a1
- move.l Store_Destination(a4),a0
- WaitforlastDraw
- BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s WaitforlastDraw
-
- move.w Alien_Mod(a1),BLTCMOD(a6)
- move.w Alien_Mod(a1),BLTDMOD(a6)
-
- MOVE.L Store_Mask(a4),d2
- MOVE.L Store_Graphics(a4),d3
- MOVE.l Store_Shift(a4),BLTCON0(a6)
- move.w #4-1,d7 ; planes
- enemy_plane_loop
- DrawP BTST #DMAB_BLTDONE-8,DMACONR(a6)
- BNE.s DrawP
-
- MOVE.L d2,BLTAPTH(a6) ; mask
- MOVE.L d3,BLTBPTH(a6) ; graphics
- move.l a0,BLTCPTH(a6) ; screen address
- MOVE.L a0,BLTDPTH(a6) ; screen address
- MOVE.W Alien_D_Blit(a1),BLTSIZE(a6)
- add.l #BYTES_PER_ROW*SCROLL_HEIGHT,a0
- add.l Alien_Plane_Size(a1),d3
-
- dbra d7,enemy_plane_loop
-
- bra Draw_Next_Bob
- Aliens_Drawn
- rts
|