**************************************************************************** **************************************************************************** ** ** Platinum Edition for TI-89 ** ** This software is in the public domain. There is no warranty. ** ** by Patrick Davidson (pad@calc.org, http://pad.calc.org/) ** ** Last updated August 2, 2001 ** **************************************************************************** **************************************************************************** INCLUDE os.h XDEF _main INCLUDE which.i IFD ti89 XDEF _ti89 ENDIF IFD ti92plus XDEF _ti92plus ENDIF INCLUDE platinum.i INCLUDE version.i INCLUDE init.asm main_game: tst.b game_started(a5) ; Test for restored game bne.s Pre_Main_Loop bsr Data_Initialize ; Clear data bsr Platinum_Title_Screen tst.b game_started(a5) ; test if user chose to play bne.s start_game rts start_game: bsr Data_Initialize_2 ; Set initial values (life, etc.) ******************************************** MAIN LOOP Pre_Main_Loop: move.w #0,oskey move.w #in_Player_Ship_Platinum,player_image(a5) tst.w classic(a5) beq.s Main_Loop move.w #in_Player_Ship_Classic,player_image(a5) Main_Loop: tst.w enemies_remaining(a5) ; Go to the next level if no bne.s level_not_done ; enemies remain. bsr Next_Level move.w #0,oskey level_not_done: bsr Timer_Delay ; Wait for next 30th of second BSR Display_Game_Screen ; Copy buffer toe actual screen tst.w ludicrous(a5) beq.s \not_ludicrous bsr Read_All_Keys sf flags(a5) addq.l #1,cycle_counter(a5) addq.w #1,level_timer(a5) bsr Enemy_Collisions ; Check enemy-to-bullet hits bsr Do_Pattern ; Process master enemy pattern bsr Move_Enemies ; Move enemy ships bsr Player_Weapon_Select ; Allow player to select weapon bsr Draw_Player ; Draw/handle player's ship bsr Enemy_Bullets ; Everything with enemy bullets bsr Player_Bullets_Shoot ; Fire player bullets bsr Player_Bullets ; Move/draw player bullets \not_ludicrous: bsr Enemy_Collisions ; Check enemy-to-bullet hits bsr Read_All_Keys sf flags(a5) addq.l #1,cycle_counter(a5) addq.w #1,level_timer(a5) tst.l time_bonus(a5) beq.s time_ran_out lea bcd_buffer(a5),a0 move.l #1,(a0)+ lea time_bonus+4(a5),a1 bsr Sub_BCD time_ran_out: bsr Draw_Background_Main bsr Do_Pattern ; Process master enemy pattern bsr Move_Enemies ; Move enemy ships bsr Draw_Enemies ; Draw enemy ships bsr Player_Weapon_Select ; Allow player to select weapon bsr Draw_Player ; Draw/handle player's ship bsr Enemy_Bullets ; Everything with enemy bullets bsr Player_Bullets_Shoot ; Fire player bullets bsr Player_Bullets ; Move/draw player bullets tst.b cheated(a5) beq.s nokludge move.b ticks+1(pc),score(a5) ; Timing kludge nokludge: GETKEY 5,0,7,6 ; Test APPS beq save_game GETKEY 3,0,9,6 ; Test status of . key and beq.s Game_Over ; continue game if not pressed. tst.w game_lose(a5) ; End the game if the player beq Main_Loop ; has been destroyed. ******************************************** GAME OVER Game_Lose: bsr Display_High_Scores Game_Over: sf game_started(a5) save_game: bra Wait_No_Key ******************************************** DAMAGE TO PLAYER'S SHIP (D5+1) Player_Damage: tst.w d5 ; If damage is negative, go to blt.s player_cash ; money adding move.w player_dmg(a5),d0 ; D0 = shield status sbcd d5,d0 bmi.s destroyed move.w d0,player_dmg(a5) ; Store new status rts destroyed: st game_lose(a5) rts player_cash: lea bcd_buffer(a5),a0 clr.w (a0)+ bclr #15,d5 move.w d5,(a0)+ lea cash+4(a5),a1 bra Add_BCD ******************************************** INITIALIZE DATA Data_Initialize: lea data_start(a5),a4 ; Clear the memory area move.w #((clear_end-data_start)/2)-1,d0 moveq #0,d1 loop_clear: move.w d1,(a4)+ dbra d0,loop_clear clr.w trigger_flag rts Data_Initialize_2: move.l #$100000,time_bonus(a5) move.w difficulty(a5),d0 lsl.w #4,d0 lea init_table-16(pc,d0.w),a6 move.l (a6)+,cash(a5) move.l (a6)+,score(a5) move.w (a6)+,num_b(a5) move.w (a6)+,fire_delay(a5) move.w (a6)+,player_dmg(a5) move.b (a6)+,weapons_available(a5) move.b (a6)+,d0 ext.w d0 move.w d0,weapon_selected(a5) tst.w ludicrous(a5) beq.s \not_ludicrous add.l #$200000,score(a5) \not_ludicrous: tst.b cheated(a5) beq.s start_game_ move.w #-3,fire_delay(a5) move.b #%11111111,weapons_available(a5) move.l #$10000,cash(a5) move.w #23,num_b(a5) move.l #$100000,time_bonus(a5) New_Ship: move.w #$30,player_dmg(a5) start_game_: moveq #97,d0 move d0,player_yc(a5) ; Set up game statistics move d0,player_xc(a5) bra Load_Player ; Load ship specifications ; cash, score, num bullets, fire delay, damage, weapons, weapon selected init_table: dc.l $200,0 dc.w 15,-10,$30 dc.b %00000001,2 dc.l $50,$150000 dc.w 15,-10,$20 dc.b %00000000,0 dc.l 0,$300000 dc.w 15,-10,$10 dc.b %00000000,0 ******************************************** DISPLAY GAME SCREEN Display_Game_Screen: bsr Display_Screen lea 6+16+95*32(a5),a1 lea score(a5),a0 moveq #3,d0 bsr Display_BCD lea 6+3+95*32(a5),a1 lea cash(a5),a0 moveq #3,d0 bsr Display_BCD lea 6+11+95*32(a5),a1 lea player_dmg+1(a5),a0 moveq #0,d0 bra Display_BCD ******************************************** INCLUDE SUBROUTINE FILES INCLUDE lib.asm INCLUDE sprites.asm INCLUDE player.asm INCLUDE shop.asm INCLUDE startup.asm INCLUDE title.asm INCLUDE endgame.asm INCLUDE collide.asm INCLUDE enemies.asm INCLUDE edestroy.asm INCLUDE eshoot.asm INCLUDE setup.asm INCLUDE levels.asm INCLUDE shoot.asm INCLUDE bullets.asm INCLUDE ebullets.asm INCLUDE drawspr.asm INCLUDE pattern.asm INCLUDE back.asm INCLUDE hitenemy.asm INCLUDE display.asm INCLUDE bcd.asm ******************************************* DISPLAY TIMING VARIABLES trigger_flag: ; Set on int5 dc.w 0 END