**************************************************************************** **************************************************************************** ** ** Monster for TI-89 / TI-92 Plus ** ** Copyright 2009 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 April 18, 2009 ** **************************************************************************** **************************************************************************** INCLUDE os.h XDEF _main XDEF _nostub INCLUDE which.i INCLUDE monster.i INCLUDE version.i INCLUDE init.asm load_error: tst.w exit_status(a5) bne.s \a move.w #EXIT_QUIT,exit_status(a5) \a: rts resume_game: clr.w saved_game(a5) bsr Load_Last_Level beq.s no_resume_game bsr Initialize_Game_Screen bsr Show_Lives_Number bsr Show_Level_Number bra.s main_loop main_game: tst.w saved_game(a5) bne.s resume_game no_resume_game: bsr Title_Screen move.w d7,speed(a5) move.l d6,speed_bonus(a5) move.l d5,victory_bonus(a5) bsr Initialize_Game beq.s load_error bsr Initialize_Game_Screen level_loop: bsr Initialize_Level round_loop: bsr Initialize_Round clr.w game_timer(a5) main_loop: bsr Read_All_Keys bsr Player_Move bsr Draw_Background bsr Player_Display bsr Handle_Balls bsr Handle_Lasers bsr Handle_Bonus bsr Show_Score tst.w paused(a5) bne.s pause_game bsr Wait_VBL BSR Display_Screen ; Copy buffer to actual screen tst.w num_balls(a5) beq.s player_died tst.w bricks_left(a5) beq.s level_loop GETEDGE 4,4,5,1 ; B (next level cheat) beq.s level_loop GETEDGE 2,4,2,2 ; D (extra bonus cheat) bne.s \nc st cheat(a5) \nc: bsr Contrast_Keys GETKEY 5,0,7,6 ; Test APPS beq.s save_game GETKEY 3,0,9,6 ; Test status of . key bne.s main_loop rts player_died: moveq #5,d5 \o: move.l #959,d4 move.l plane0(a5),a3 move.l plane1(a5),a2 \c: not.l (a2)+ not.l (a3)+ dbra d4,\c moveq #2,d4 \w: bsr Wait_VBL dbra d4,\w dbra d5,\o subq.w #1,lives(a5) bgt round_loop move.w #1,exit_status(a5) rts save_game: st saved_game(a5) rts pause_game: clr.w paused(a5) moveq #2-IS89,d0 bsr Set_Font lea balls(a5),a6 ; get first ball pointer in A6 tst.w (a6) bne.s \b lea b_size(a6),a6 tst.w (a6) bne.s \b lea b_size(a6),a6 \b: moveq #20,d0 ; D0 - opposite screen half as ballfs cmp.w #45<<6,b_y(a6) bge.s \c moveq #65,d0 \c: lea pause_msg(pc),a0 moveq #5,d1 bsr Display_String bsr Wait_VBL bsr Display_Screen \p: bsr Read_All_Keys bsr Contrast_Keys GETEDGE 5,7,6,4 ; F1 bne.s \p bsr Wait_VBL bra main_loop ******************************************* INITIALIZE A NEW LEVEL Initialize_Round: clr.w laserpower(a5) lea laserblasts(a5),a0 moveq #l_num-1,d0 \cl: clr.l (a0)+ dbra d0,\cl clr.w bonus_type(a5) clr.w brickthru(a5) move.w #136,paddlex(a5) move.w #16,paddlew(a5) lea balls+b_size*b_num(a5),a0 move.w #b_size*b_num/2-1,d0 \l: clr.w -(a0) dbra d0,\l move.l #2<<16+5,(a0)+ move.w #4,(a0)+ move.w speed(a5),balls+b_speed(a5) bra Show_Lives_Number Initialize_Level: lea temp_buffer(a5),a0 move.l #$1000,(a0)+ lea score+4(a5),a1 bsr Add_BCD move.w level(a5),d0 move.w d0,d1 addq.w #1,d1 cmp.w num_levels(a5),d0 bne.s \no_finish move.l (sp)+,a2 move.w #1,exit_status(a5) rts \no_finish: move.w d1,level(a5) mulu #216,d0 lea map(a5),a0 move.l level_pointer(a5),a1 add.w d0,a1 ; A1 = start of level in data move.w #215,d0 ; D0 = # of tiles remaining moveq #0,d1 ; D1 = # of bricks left to break \lcl: moveq #0,d2 moveq #0,d3 move.b (a1)+,d2 ; D2 = tile number cmp.b #11,d2 blo.s \valid_brick moveq #0,d2 \valid_brick: move.b tile_values(pc,d2.w),d3 ; D3 indicates if brick is breakable add.w d3,d1 \l: move.b d2,(a0)+ dbra d0,\lcl move.w d1,bricks_left(a5) bra Show_Level_Number tile_values: dc.b 0,0,0,0,1,1,0,1,1,1,1 EVEN first_ball: dc.w 2,5,4 ******************************************* INITIALIZE A NEW GAME Initialize_Game: lea data_clear_start(a5),a0 move.w #(data_end-data_clear_start)/2-1,d0 \l: clr.w (a0)+ dbra d0,\l move.w #5,lives(a5) bra Select_Level ******************************************* INCLUDE SUBROUTINE FILES IFD ti89 INCLUDE disp89.asm ENDIF IFND ti89 INCLUDE disp92.asm ENDIF INCLUDE lib.asm INCLUDE startup.asm INCLUDE gray.asm INCLUDE back.asm INCLUDE drawspr.asm INCLUDE player.asm INCLUDE images.asm INCLUDE balls.asm INCLUDE bricks.asm INCLUDE vars.asm INCLUDE bonuses.asm INCLUDE title.asm INCLUDE endgame.asm INCLUDE lasers.asm END