**************************************************************************** **************************************************************************** ** ** Platinum Edition for TI-89 (Player firing routines) ** ** This software is in the public domain. There is no warranty. ** ** by Patrick Davidson (pad@calc.org, http://pad.calc.org/) ** ** Last updated July 27, 2001 ** **************************************************************************** **************************************************************************** ******************************************** SELECT PLAYER WEAPON * * Reads the function/number keys, and sets the selected weapon to the key * pressed if that weapon is available. * ******** fkeys_table: ; row, column of keys IFD ti89 dc.b 2,3 dc.b 3,3 dc.b 4,3 dc.b 2,2 dc.b 3,2 dc.b 4,2 dc.b 2,1 dc.b 3,1 dc.b 4,1 ENDIF IFD ti92plus dc.b 3,7 dc.b 3,6 dc.b 3,5 dc.b 2,7 dc.b 2,6 dc.b 2,5 dc.b 1,7 dc.b 1,6 dc.b 1,5 ENDIF Player_Weapon_Select: lea fkeys_table(pc),a0 lea key_data(a5),a4 moveq #0,d1 moveq #8,d0 \loop_pws: move.b (a0)+,d1 ; D1 = row move.b (a0)+,d2 ; D2 = column btst d2,0(a4,d1.w) beq.s \select_weapon dbra d0,\loop_pws rts \select_weapon: subq.w #1,d0 blt.s \available btst d0,weapons_available(a5) beq.s \not_available \available: addq.w #1,d0 add.w d0,d0 move.w d0,weapon_selected(a5) \not_available: rts ********************************************** FIRE PLAYER'S BULLETS * * If the a bullet should be fired (e.g. the player presses the fire button, * or holds it long enough for a repeat), calls the routine from the table * below to insert bullets into the bullet data structure. * ******** Player_Bullets_Shoot: GETKEY 0,4,0,3 beq.s player_fired clr.w lock_status(a5) rts already_fired: addq.w #1,lock_status(a5) rts player_fired: tst.w lock_status(a5) bne.s already_fired move.w fire_delay(a5),lock_status(a5) move.w weapon_selected(a5),d0 move.w player_xc(a5),d7 move.w player_yc(a5),d6 addq.w #6,d7 move.w Player_Weapon_Jump_Table(pc,d0.w),d0 jmp Player_Weapon_Jump_Table(pc,d0.w) Player_Weapon_Jump_Table: dc.w normal_weapon-Player_Weapon_Jump_Table dc.w Double_Shoot-Player_Weapon_Jump_Table dc.w Triple_Shoot-Player_Weapon_Jump_Table dc.w Quadruple_Shoot-Player_Weapon_Jump_Table dc.w Dual_Plasma_Cannon-Player_Weapon_Jump_Table dc.w Golden_Arches-Player_Weapon_Jump_Table dc.w Triple_Plasma_Cannon-Player_Weapon_Jump_Table dc.w Deluxe_Weapon-Player_Weapon_Jump_Table dc.w Ultimate_Weapon-Player_Weapon_Jump_Table ********************************************* NORMAL WEAPON HANDLERS Deluxe_Weapon: move.w #$600,d5 subq.w #4,d6 subq.w #3,d7 lea Bullet_Ultimate2(pc),a1 bsr Fire_Bullet addq.w #4,d7 lea Bullet_Ultimate3(pc),a1 bsr Fire_Bullet subq.w #8,d7 lea Bullet_Ultimate1(pc),a1 bsr Fire_Bullet add.w #12,d7 lea Bullet_Ultimate4(pc),a1 bra Fire_Bullet Dual_Plasma_Cannon: moveq #0,d4 subq.w #4,d6 subq.w #6,d7 bsr.s place_plasma_bullet addq.w #8,d7 place_plasma_bullet: lea Bullet_Plasma(pc),a1 move.b d4,(a1) bra Fire_Bullet Triple_Plasma_Cannon: subq.w #2,d7 subq.w #4,d6 moveq #0,d4 bsr.s place_plasma_bullet subq.w #4,d7 moveq #-1,d4 bsr.s place_plasma_bullet addq.w #8,d7 moveq #1,d4 bra.s place_plasma_bullet Golden_Arches: addq.w #3,d7 addq.w #4,d6 lea Bullet_Arch_Right(pc),a1 bsr Fire_Bullet sub.w #9,d7 lea Bullet_Arch_Left(pc),a1 bra Fire_Bullet Quadruple_Shoot: moveq #0,d5 subq.w #7,d7 bsr QS_TwoShots add.w #12,d7 QS_TwoShots: lea Bullet_Quad_Left(pc),a1 bsr Fire_Bullet lea Bullet_Quad_Right(pc),a1 bra Fire_Bullet Triple_Shoot: subq.w #1,d7 subq.w #5,d6 lea Bullet_Triple_Left(pc),a1 bsr Fire_Bullet lea Bullet_Triple_Middle(pc),a1 bsr Fire_Bullet lea Bullet_Triple_Right(pc),a1 bra Fire_Bullet Double_Shoot: subq.w #6,d6 subq.w #6,d7 bsr.s place_standard_bullet add.w #10,d7 bra.s place_standard_bullet Ultimate_Weapon: subq.w #3,d7 lea sw3_angles(pc),a4 moveq #4,d4 \uwl: lea Bullet_Blast(pc),a1 move.w (a4)+,(a1) bsr Fire_Bullet dbra d4,\uwl rts sw3_angles: dc.b 0,-12,-2,-11,2,-11,-4,-10,4,-10 normal_weapon: subq.w #1,d7 subq.w #5,d6 place_standard_bullet: lea Bullet_Standard(pc),a1 ********************************************* FIRE A BULLET * * Insert bullet described at (A1) at coordinates (D7, D6) with data = D5 * Modifies D0, A0, A1, D5 * ******** Fire_Bullet: lea bullets_data(a5),a0 move.w num_b(a5),d0 loop_find_bullet: tst.w (a0) beq.s found_bullet lea b_size(a0),a0 dbra d0,loop_find_bullet rts420: rts found_bullet: move.w (a1)+,(a0)+ ; Bullet type bsr.s extend_copy ; damage move.w d7,(a0)+ ; X-Coordinate bsr.s extend_copy ; Width move.w d6,(a0)+ ; Y-Coordinate bsr.s extend_copy ; Height move.b (a1)+,d5 move.w (a1)+,(a0)+ ; Image move.w d5,(a0)+ ; Misc. data rts extend_copy: move.b (a1)+,d1 ext.w d1 move.w d1,(a0)+ rts ********************************************* BULLET DESCRIPTIONS * * X-Velocity, Y-Velocity * 2, damage, width, height, type (bytes) * Then image (word) * ******** Bullet_Standard: dc.b 0,-8,2,3,10,0 dc.w in_Disruptor_Blast Bullet_Triple_Middle: dc.b 0,-10,2,4,4,0 dc.w in_Triple_Shot Bullet_Triple_Left: dc.b -3,-8,2,4,4,0 dc.w in_Triple_Shot Bullet_Triple_Right: dc.b 3,-8,2,4,4,0 dc.w in_Triple_Shot Bullet_Quad_Left: dc.b -4,-12,2,5,7,1 dc.w in_Quad_Blast Bullet_Quad_Right: dc.b 4,-12,2,5,7,1 dc.w in_Quad_Blast Bullet_Plasma: dc.b 0,-12,8,5,11,0 dc.w in_Plasma_Blast Bullet_Arch_Left: dc.b -1,5,16,4,16,2 dc.w in_Blob_Blast Bullet_Arch_Right: dc.b 1,5,16,4,16,2 dc.w in_Blob_Blast Bullet_Ultimate1: dc.b -4,-18,20,5,10,1 dc.w in_Ultimate_Bullet Bullet_Ultimate2: dc.b -1,-18,20,5,10,1 dc.w in_Ultimate_Bullet Bullet_Ultimate3: dc.b 1,-18,20,5,10,1 dc.w in_Ultimate_Bullet Bullet_Ultimate4: dc.b 4,-18,20,5,10,1 dc.w in_Ultimate_Bullet Bullet_Blast: dc.b 0,0,25,7,7,0 dc.w in_Ball