**************************************************************************** **************************************************************************** ** ** Monster for TI-89 / TI-92 Plus - Ball Movement ** ** Copyright 2002 by Patrick Davidson. This software may be freely ** modified and/or copied with no restrictions. There is no warranty. ** ** by Patrick Davidson (pad@calc.org, http://pad.calc.org/) ** ** Last updated March 7, 2002 ** **************************************************************************** **************************************************************************** BALLU MACRO ; Make ball go up move.w #-1,b_ydir(a6) ENDM BALLD MACRO ; Make ball go down move.w #1,b_ydir(a6) ENDM BALLL MACRO ; Make ball go left move.w #-1,b_xdir(a6) ENDM BALLR MACRO ; Make ball go right move.w #1,b_xdir(a6) ENDM GETVEL MACRO ; get velocity (D2 = XV / D3 = YV) lea Ball_Angles(pc),a0 move.w b_angle(a6),d2 add.w d2,d2 add.w d2,d2 add.w d2,a0 move.w (a0)+,d2 move.w (a0)+,d3 muls b_xdir(a6),d2 muls b_ydir(a6),d3 ENDM **************************************** HANDLE BALLS Handle_Balls: cmp.w #1,brickthru(a5) ble.s \nb subq.w #1,brickthru(a5) \nb: addq.w #1,game_timer(a5) clr.w num_balls(a5) lea balls+b_num*b_size(a5),a6 moveq #b_num-1,d6 Ball_Count_Loop: lea -b_size(a6),a6 tst.w (a6) beq.s \nc addq.w #1,num_balls(a5) \nc: dbra d6,Ball_Count_Loop moveq #b_num-1,d6 Ball_Loop: move.w d6,-(sp) move.w (a6),d0 beq.s Ball_Finished subq.w #1,d0 beq.s Ball_Normal bra.s Ball_Caught Ball_Finished: move.w (sp)+,d6 lea b_size(a6),a6 dbra d6,Ball_Loop rts **************************************** BALL CAUGHT ON PADDLE Ball_Caught: move.w b_x(a6),d0 add.w paddlex(a5),d0 moveq #11*TILE_HEIGHT-5,d1 lea ball_image(pc),a0 bsr Adjusted_Sprite bra.s Ball_Finished **************************************** NORMAL BALL Ball_Normal: addq.w #1,b_time(a6) ; speed up every 2 minutes cmp.w #3824,b_time(a6) blt.s \no_speed_up addq.w #1,b_speed(a6) clr.w b_time(a6) \no_speed_up: move.w b_voldx(a6),d0 ; draw trail of ball move.w b_voldy(a6),d1 blt.s \skip lea ball_image(pc),a0 bsr Grayscale_Sprite move.w b_oldx(a6),d0 move.w b_oldy(a6),d1 lea ball_image(pc),a0 bsr Grayscale_Sprite \skip: move.l b_oldx(a6),b_voldx(a6) move.w b_speed(a6),d7 subq.w #1,d7 Ball_Move: move.w b_x(a6),d0 ; first update coordinates move.w b_y(a6),d1 move.w d0,b_oldx(a6) move.w d1,b_oldy(a6) GETVEL add.w d2,d0 add.w d3,d1 move.w d0,b_x(a6) move.w d1,b_y(a6) asr.w #6,d0 ; convert to screen coordinate asr.w #6,d1 cmp.w #11*TILE_HEIGHT-5,d1 ; paddle bouncing blt.s \no_paddle bsr Paddle_Bounce beq.s \no_paddle bra.s Ball_Move \no_paddle: tst.w d0 ; test left edge of screen hit bge.s \noleftedge moveq #0,d0 move.w d0,b_x(a6) BALLR \noleftedge: cmp.w #284,d0 ; test right edge of screen hit blt.s \norightedge move.w #284<<6-1,b_x(a6) move.w #284-1,d0 BALLL ;**** INSERT GRAVITY ADJUST (?) **** \norightedge: tst.w d1 ; test top of screen hit bge.s \notop moveq #0,d1 move.w d1,b_y(a6) BALLD \notop: cmp.w #11*TILE_HEIGHT,d1 blt.s \nobottom ; test for falling off bottom clr.w (a6) bra Ball_Finished \nobottom: moveq #0,d6 move.w d0,d4 ; test top of ball / brick hit move.w d1,d5 addq.w #2,d4 bsr Check_Brick_Hit beq.s \no_ball_top BALLD moveq #-1,d6 \no_ball_top: move.w d0,d4 ; test left ball / brick hit move.w d1,d5 addq.w #2,d5 bsr Check_Brick_Hit beq.s \no_ball_left BALLR moveq #-1,d6 \no_ball_left: move.w d0,d4 ; test right of ball / brick hit move.w d1,d5 addq.w #2,d5 addq.w #4,d4 bsr Check_Brick_Hit beq.s \no_ball_right moveq #-1,d6 BALLL \no_ball_right: move.w d0,d4 ; test bottom of ball / brick hit move.w d1,d5 addq.w #2,d4 addq.w #4,d5 bsr Check_Brick_Hit beq.s \no_ball_bottom moveq #-1,d6 BALLU \no_ball_bottom: tst.w d6 bne.s ball_process_done move.w d0,d4 addq.w #4,d4 move.w d1,d5 bsr Check_Brick_Hit beq.s \no_ball_topright BALLD BALLL \no_ball_topright: move.w d0,d4 move.w d1,d5 addq.w #4,d5 bsr Check_Brick_Hit beq.s \no_ball_bottomleft BALLR BALLU \no_ball_bottomleft: move.w d0,d4 addq.w #4,d4 move.w d1,d5 addq.w #3,d5 bsr Check_Brick_Hit beq.s \no_ball_bottomright BALLL BALLU \no_ball_bottomright: move.w d0,d4 move.w d1,d5 bsr Check_Brick_Hit beq.s \no_ball_topleft BALLR BALLD \no_ball_topleft: ball_process_done: dbra d7,Ball_Move sub.w screenx(a5),d0 ; D0 = screen X coordinate move.w d0,b_oldx(a6) move.w d1,b_oldy(a6) lea ball_image(pc),a0 bsr Grayscale_Sprite bra Ball_Finished *************************************** BOUNCE BALL OFF PADDLE Paddle_Bounce: tst.w b_ydir(a6) ; don't bounce if already going up blt.s \nb move.w b_x(a6),d4 lsr.w #6,d4 sub.w paddlex(a5),d4 addq.w #4,d4 ; D4 = ball X - leftmost bouncable blt.s \nb ; if deltaX < 0, ball left of paddle mulu #34,d4 move.w paddlew(a5),d3 addq.w #4,d3 ; D3 = bouncable area width divu d3,d4 ; D4 = 17*deltaX / paddle width cmp.w #34,d4 bge.s \nb ; if deltaX > 34, ball too far right cmp.w #1,brickthru(a5) bne.s \nc clr.w brickthru(a5) \nc: move.w #1,(a6) ; set type to normal BALLU ; set direction to up move.l #$50,score_inc(a5) sub.w #17,d4 ; D4 = bounce point - center bge.s \bounceright \bounceleft: not.w d4 move.w d4,b_angle(a6) BALLL rts \bounceright: move.w d4,b_angle(a6) BALLR rts \nb: moveq #0,d4 rts Ball_Angles: IFD ti89 dc.w 8,30 dc.w 10,30 dc.w 12,29 dc.w 14,28 dc.w 16,27 dc.w 17,26 dc.w 19,25 dc.w 21,24 dc.w 22,22 dc.w 24,21 dc.w 25,19 dc.w 26,17 dc.w 27,16 dc.w 28,14 dc.w 29,12 dc.w 30,10 dc.w 30,8 ENDIF IFND ti89 dc.w 8,38 dc.w 10,37 dc.w 12,36 dc.w 14,35 dc.w 16,34 dc.w 17,33 dc.w 19,31 dc.w 21,30 dc.w 22,28 dc.w 24,26 dc.w 25,24 dc.w 26,22 dc.w 27,20 dc.w 28,17 dc.w 29,15 dc.w 30,12 dc.w 30,10 ENDIF