X-Git-Url: http://git.shiar.net/nemesis.git/blobdiff_plain/34f7bc00468ab5305325e54704da6523012b6ac7..80fc412cfe5e0d5b551945794a5dbb7f561aa6ee:/nemesis.z80 diff --git a/nemesis.z80 b/nemesis.z80 index feb535d..a45c13c 100644 --- a/nemesis.z80 +++ b/nemesis.z80 @@ -1,25 +1,24 @@ ;------------------------------------------------------------------------------ ;---------------------- NEMESIS ----------------------------------------------- ;------------------------------------------------------------------------------ -; >>> NEMESIS <<< Version 0.96 BETA by SHIAR -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ; Title : Nemesis ; Version : 0.96 ; Release Date : 30.X.99 -; Filename : nemesis.86p (4836) nemesis0.86p (888) +; Filename : nemesis.86p (5kb) ; Author(s) : Shiar ; Email Address : shiar0@hotmail.com ; ICQ ; #43840958 -; Web Page : come.to/shiar -; Description : cool arcade-shoot-em-up-game (release 12/99) -; Where to get this game : www.ticalc.org -; Other games by author : N/A +; Web Page : www.shiar.org +; Description : cool arcade-shoot-em-up-game +; Where to get this game : www.shiar.org | www.ticalc.org +; Other games by author : Worm -; ABOUT: This source should only be used for learning practises, do not -; alter it, and certainly do not distribute an altered version!! +; ABOUT: This source should only be used for learning practises, do not +; alter it, and certainly do not distribute an altered version!! ; NOTE: &&& marks uncertainties or things to optimize -;---------------------- nemesis.z80 start ------------------------------------- +;---------------------- nemesis.z80 start ----------------------------------- #include "asm86.h" #include "ti86asm.inc" ;standard ti86 romcalls @@ -40,17 +39,8 @@ _asapvar = $d6fc storepos = _asm_exec_ram+6000 ;120 OF 165 storepos2 = _asm_exec_ram+6200 ;141 OF 167 -exlevel = _asm_exec_ram+6400 ;784+OF 2.7kb - -XLlevelsdata = exlevel+8 ;size: upto 1016 bytes -XLweapondata = exlevel+1024 ;size: always 64 byte -XLenemytable = exlevel+1088 ;size: always 16 byt -XLenemyinfos = exlevel+1104 ;size: always 64 by -XLsprenemies = exlevel+1168 ;size: like 128 b (upto 1kb) - -;---------------------- in-game vars ------------------------------------------ -temp1 = storepos ;+0+1 ;temp (2 bytes) bullet +;---------------------- in-game vars ---------------------------------------- just_fired = storepos+2 ; +2 ;counts how long a blast lasts curline = storepos+2 ; +2 ;used to display SFX @@ -95,25 +85,26 @@ your_prevpos = your_locpos+1 ;+88 ;save previous positions (32d) ;^-----------------------------------<1 ;-120=$78 -nrenemies = 10 ;max. nr of enemies -enemysize = 7 -enemies = storepos2 ; +0 ;info about each enemy (6byt) +enemies = storepos2 ; +0 ;info about each enemy +enemysize = 7 ;infobytes per enemy +nrenemies = 16 ;max. nr of enemies -nrybuls = 10 -ybullets = enemies+(nrenemies*6) ;+80 ;60 bytes = 20(state,x,y) -nrebuls = 10 -ebullets = ybullets+(nrybuls*3) ;+110 ;30 bytes = 10(state,x,y) +ybullets = enemies+(nrenemies*enemysize) ;60 bytes = 20(state,damg,x,y) +nrybuls = 32 ; +80\ +ebullets = ybullets+(nrybuls*4) ;+110 ;30 bytes = 10(state,x,y) +nrebuls = 16 ybuls = ebullets+(nrebuls*3) ;+140 +maxbullets = 32 ;^-----------------------------------<2 ;-141=$8D ;level_info: ; [0000:damage 0:directfire 0:ground 0:ceiling 0:diagfire] ;enemies: -; [HP] [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)] +; [HP64] [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)] ; [ship type or explosion frame] [x] [y] [move] [fire] -;---------------------- introduction ------------------------------------------ +;---------------------- introduction ---------------------------------------- nop ;hello yas/ase/rascall/whathever jp init ;here's the program, but first: a description @@ -133,26 +124,10 @@ Icon: .db 8,1 ;icon for YAS: width = 1byte; height = 9bytes .db %11100000 ; ███ ;recommend 80x50 screen mode .DB 0 ;clear stupid YAS-line -;---------------------- init -------------------------------------------------- +;---------------------- init ------------------------------------------------ level_name: .db 8,"nemesis0" -StartFix: - im 1 - ld hl,$D400 - ld de,$D401 - ld bc,$0100 - ld (hl),$D3 - ldir - ld hl,int_handler - ld de,$D3D3 - ld bc,int_end-int_handler - ldir - ld a,$D4 - ld i,a - im 2 - ret - int_handler: ex af,af' in a,($03) @@ -165,52 +140,38 @@ int_end: init: cal BUSY_OFF ;turns the run-indicator off, obviously cal _clrScrn ;clean the screen - -Loadlevel: - ld hl,level_name-1 ;find own variable - rst 20h ;cal _ABS_MOV10TOOP1 - rst 10h ;cal _FINDSYM - ret c ;not found? who cares... - - cal _ex_ahl_bde - cal _SET_ABS_SRC_ADDR - xor a - ld hl,exlevel - cal _SET_ABS_DEST_ADDR - ld hl,4+4 - cal _SET_MM_NUM_BYTES - cal _mm_ldir - - ld hl,(exlevel+4+2) - cal _SET_MM_NUM_BYTES - cal _mm_ldir - - xor a - ld hl,XLweapondata - cal _SET_ABS_DEST_ADDR - ld hl,272 - cal _SET_MM_NUM_BYTES - cal _mm_ldir ;save done (cal \ ret) - -setup: xor a ;: reset: + xor a ;ld a,0 ld (iy+13),a ;don't affect TEXT_MEM and don't scroll screen + cal _flushallmenus ;remove TI menus ld (_asapvar+1),a ;Asm( thinks it's the first time it runs Nems. - cal StartFix -setcontrast: - ld a,(CONTRAST) ;load current contrast level - cp $1f ;if already at maximum... - jr z,skipdarken ;...then skip level increase - inc a ;otherwise increase contrast level -skipdarken: - out (2),a ;set it -;---------------------- main menu --------------------------------------------- +FixKeys: ;fixes some key problems like left+down bug + im 1 + ld a,$D4 + ld bc,$0100 + ld h,a + ld l,c ;ld hl,$D400 + ld d,a + ld e,b ;ld de,$D401 + dec a ;ld a,$D3 + ld (hl),a + ldir + ld hl,int_handler + ld d,a + ld e,a ;ld de,$D3D3 + ld bc,int_end-int_handler + ldir + inc a ;ld a,$D4 + ld i,a + im 2 + +;---------------------- main menu ------------------------------------------- LogoPut: xor a ;white bitmask (a=0) - ld b,16 ;one line ld hl,logo_nemesis ;from... ld de,VIDEO_MEM+16 ;...to one line from top + ld b,e ;ld b,16: one line AboveLogo: ld (de),a ;clear/n byte inc de ;next @@ -219,14 +180,6 @@ AboveLogo: ld bc,16*19 ;logo size ldir ;display one line of logo -; ld hl,GRAPH_MEM ;cleared line -; ld bc,16 ;size=one line -; ldir ;also clear one line below the logo - -; ld a,-1 ;first line is -1+1=0 -; ld b,21 ;with first 21 lines: -; cal DoSFX ;do special effect &&&skip - ld hl,VIDEO_MEM+(16*$39)+4 ;$39 rows down, 4 cols right (4*8=$20) ld b,8 ;draw 8x one byte = 8*8 = 64 pixels wide ld a,%11111111 ;horizontal line mask @@ -280,7 +233,7 @@ menuloop: ld (_curRow),hl cal _putc - halt \ halt \ halt \ halt + halt \ halt cal GET_KEY ;wait for keypress cp K_UP @@ -300,11 +253,7 @@ menuloop: ld a,(menuitem) dec a jr nz,startnewgame - cal Continue_game - jr game_main_loop - -startnewgame: - cal New_game + cal samelevel jr game_main_loop menuchange: @@ -314,15 +263,18 @@ menuchange: jr menuloop do_invert: - ld (hl),$EE + ld (hl),$2F ;cpl ret undo_invert - ld (hl),$E6 + ld (hl),$B7 ;or a ret -;------------------------------------------------------------------------------ -;---------------------- game loop --------------------------------------------- -;------------------------------------------------------------------------------ +startnewgame: + cal New_game + +;---------------------------------------------------------------------------- +;---------------------- game loop ------------------------------------------- +;---------------------------------------------------------------------------- game_main_loop: ;REPEATS FROM HERE EVERY FRAME ld hl,timer ;update time @@ -384,11 +336,7 @@ game_stuff: cal CheckGround ;check for collision with the ground check_keys: - cal GET_KEY - cp K_GRAPH - cal z,Teacher - - ld a,%00111111 ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5) + ld a,%10111111 ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5) out (1),a ;ask for them nop \ nop ;delay 8 clocks in a,(1) ;get zem! @@ -406,19 +354,23 @@ check_firekey: psh hl ;push hl on stack (instead of cal Fire_bullet) jp z,Fire_bullet ;fire smtn (bulletstorplasermultiples+stuff..) pop hl ;no cal to Fire_bullet made, so pop stack - ld hl,just_fired ;no: - ld (hl),0 ;reset just_fired + xor a ;no: + ld (just_fired),a ;reset just_fired check_selkey: ld a,%01011111 ;look at first column of keys (ALPHA to STO) out (1),a ;gimme nop \ nop ;what's taking you so long in a,(1) ;at last... our precious keyzzz... - ;old: now see this: + + bit 6,a ;'bout the GRAPH key... + cal z,Teacher ;you didn't _press_ it, did you?!? + rla ;test bit7 so we know f ALPHA has been pressed cal nc,select ;yeppy, select the currently selected upgrade cal Enemies_hit ;check for collision with enemies + cal inc_weapdamage _gamestuff1: cal Handle_Ship ;move you @@ -432,9 +384,24 @@ _gamestuff1: cal Display_Screen ;display all halt ;delay - jp game_main_loop ;LOOP^^^^^^^^^^^^^ + jp game_main_loop ;LOOP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -;--------------------------- ground ------------------------------------------- +inc_weapdamage: + ld a,0 +weapincs =$-1 + inc a + cp 31 + ret nc ;return if increased 16 times or more already + ld (weapincs),a + + ld b,1 +weapdamage =$-1 + add a,b + + ld (curweapdamage),a + ret + +;--------------------------- ground ----------------------------------------- Handle_ground: ld a,(timer) @@ -537,7 +504,7 @@ CheckGround: ;check for collision with the ground ld b,5 jp damage_you -;--------------------------- ceiling ------------------------------------------ +;--------------------------- ceiling ---------------------------------------- Handle_ceiling: ld a,(timer) @@ -641,7 +608,7 @@ CheckCeiling: ;check for collision with the ground ld b,5 jp damage_you ;otherwise you don't wanna be in that ship -;--------------------------- move stars --------------------------------------- +;--------------------------- move stars ------------------------------------- DisplayStars: ;inputs: hl=starx# a=stars# b=nrstars# ld e,(hl) @@ -690,7 +657,7 @@ newstarok: dnz movestars_loop ret ;for stupid people, here's another comment... -;--------------------------- pause -------------------------------------------- +;--------------------------- pause ------------------------------------------ Pause: ld hl,$0200 ;top left @@ -703,7 +670,7 @@ pause: jr nz,pause ;no, wait some more ret ;continue -;--------------------------- teacher ------------------------------------------ +;--------------------------- teacher ---------------------------------------- Teacher: ld (iy+12),5 ;enable flashing cursor @@ -733,12 +700,10 @@ teacherans: jr teacherloop -;--------------------------- exit --------------------------------------------- +;--------------------------- exit ------------------------------------------- quit: - im 1 - ld a,(CONTRAST) ;load original contrast level - out (2),a ;and set it back + im 1 ;release keyfix procedure ld (iy+13),3 ;use textshadow (TEXT_MEM) and scrolling ld hl,GRAPH_MEM ;graph-screen location @@ -749,9 +714,8 @@ quit: jp _clrWindow ;as _clrLCD but also clears TEXT_MEM (like the ;_clrScrn) AND also executes _homeup and ret -; cal _clrScrn -; jp _homeup -;--------------------------- display ------------------------------------------ + +;--------------------------- display ---------------------------------------- Display_Screen: ld hl,GRAPH_MEM ;from storage (top left) @@ -762,7 +726,7 @@ displayloop: displaytloop: ld a,(hl) ;copy byte from (hl) _invert: - xor $ff ; } ;invert byte (white<=>black) + cpl ;xor $ff: invert byte (white<=>black) ld (de),a ;to (de) inc hl \ inc de ;next byte dnz displaytloop ;16x hl >> de @@ -788,7 +752,7 @@ ldhld: cal UNPACK_HL ;one digit of hl savestr: ;@here the score will be stored .db "00000",0 ;don't worry, it's just temporary -;------------------------- handle ship ---------------------------------------- +;------------------------- handle ship -------------------------------------- Handle_Ship: ld a,(your_occ) ;are @@ -969,7 +933,7 @@ no_armor: ld (your_occ),a ;set to explode ret -;------------------------- place multiples ------------------------------------ +;------------------------- place multiples ---------------------------------- Place_multiples: ld (mx),de ;set last multiple-position @@ -983,7 +947,7 @@ place_multiples: dnz place_multiples ;repeat ret -;------------------------- select upgrade ------------------------------------- +;------------------------- select upgrade ----------------------------------- select: ld hl,your_pickup ;select pickups @@ -993,12 +957,14 @@ select: jr nz,select2 ;no, carry on select1: ld a,(your_armor) ;load current armor - cp 24 ;is it >=24 - ret nc ;then return (armor may not be 25 or more) - xor a - ld (your_pickup),a ;reset pickups (a=0) - ld hl,your_armor ;change armor - inc (hl) ;increase HPs by one + cp 25-6 ;may not become >=25 + jr c,select1_ ;ok then just add 6 + ld a,25-6 ;set to maximum (6 will be added below) +select1_: + add a,6 ;add 6 to armor + ld (your_armor),a ;change armor + xor a ;ld a,0 + ld (your_pickup),a ;reset pickups jp disp_icons ;display and return select2: dec a ;is it 2? @@ -1014,20 +980,10 @@ select3: ld hl,your_weapon ld a,(hl) inc a - cp 10 - jp nc,disp_icons ;>=10 - ld (hl),a - - add a,a ;weap*2 - add a,a ; *4 - add a,a ; *8 - ld c,a - ld b,0 - ld hl,XLweapondata-7 - add hl,bc - ld a,(hl) - ld (ybuls),a - + cp maxnrweapons + jp nc,disp_icons ;weapon maxed out + ld (hl),a ;set new weapon + cal loadweapon ;load it (damage and stuff) jp disp_icons ;display n return select4: dec a ;is it 4? @@ -1049,14 +1005,9 @@ select6: ld (hl),0 ;reset pickups jp disp_icons ;display/return -;------------------------- fire bullet ---------------------------------------- +;------------------------- fire bullet -------------------------------------- Fire_bullet: - ld hl,RanPos ;random - inc (hl) ;update random counter - -; ld a,(laserlasts) -; ld b,5 ld hl,just_fired ld a,(hl) ;just_fired cp 5 ;already pressed? @@ -1087,7 +1038,7 @@ fireany: dec a ;1=yes jr z,fire_laser - ld ix,XLweapondata-6 + ld ix,weapondata-6 add a,a ;weap*2 add a,a ; *4 add a,a ; *8 @@ -1108,7 +1059,7 @@ fireany: ld c,(ix) xor a cp c - jr nz,fire_ybullet + cal nz,fire_ybullet ret fire_torp: @@ -1201,25 +1152,29 @@ nolashit: dnz laserhits ;check all enemies ret -enemy_lashit: +enemy_lashit: ;&&&before nolashit + ld a,1 ;damage cal enemy_hit jr nolashit fire_ybullet: ld hl,ybullets - ld de,3 - ld a,(ybuls) - ld b,a + ld de,4 + ld b,maxbullets find_ybullet: ld a,(hl) or a jr z,found_ybullet ;0 = no bullet here add hl,de dnz find_ybullet ;look next bullet - ret + pop hl ;don't try to fire any other bullets + ret ;so ret twice found_ybullet: ld (hl),c ;use the bullet and set correct bullet-type + inc hl ;@damage + ld (hl),1 ;set bullet damage +curweapdamage =$-1 ld a,(firex) ;your x-pos add a,5 ;place bullet in front of you inc hl ;go to bullet-x @@ -1229,9 +1184,12 @@ found_ybullet: add a,(ix+1) ;place bullet at the middle of your ship inc hl ;go to bullet-y ld (hl),a ;set y + + xor a + ld (weapincs),a ;reset damage ret -;------------------------ handle bullets -------------------------------------- +;------------------------ handle bullets ------------------------------------ bullet_left: ld a,124 @@ -1244,7 +1202,7 @@ bullet_left: ld (hl),a ;save new pos. ld d,a ;d = X - inc hl ;to y-pos + inc hl ;@y-pos ld a,c cal _shracc dec a @@ -1280,54 +1238,73 @@ bullet_noymove: ret remove_bullet: - dec hl + pop hl ;cal bullet_left + pop hl ;enemy+type ld (hl),0 ;dump this bullet! - pop hl - jr next_ybullet + jr next_ybullet+1 ;+1:skip pop hl at next_ybullet Handle_bullets: ld hl,ybullets - ld a,(ybuls) - ld b,a + ld b,maxbullets scan_bullets: - psh bc - psh hl + psh bc ;bullet counter + psh hl ;save enemy+type ld (temp1),hl ;needed for check_bullethits - ld a,(hl) - inc hl + ld a,(hl) ;@bulletType + inc hl ;@damage + inc hl ;@x or a jp z,next_ybullet ;bulletType=0 >> no bullet - ld c,a + ld c,a ;c=type and %1111 - ld b,a + ld b,a ;b=0000type cal bullet_left ;move bullet left display_bullet: - ld ix,spr_bullet01 - psh de + psh de ;save de =position + dec hl ;@x + dec hl ;@damage + ld a,(hl) ;bullet damage=size + ld hl,XLbullettable ;pointer to first bullet + srl a + srl a ;per 4 + inc a ;must be at least 1 +nextbulletlook: + inc hl ;next bullet sprite pointer + dec a ;for each 4 points of damage + jr nz,nextbulletlook + ld d,a ;ld d,0 + ld a,(hl) ;load pointer offset + ld e,a ;convert to 16bit + ld ix,spr_bullet01 ;first sprite + add ix,de ;add offset (go to correct sprite) + pop de ;saved position + psh de ;but will be altered so save again cal putsprite ;display bullet pop de cal check_bullethits next_ybullet: - pop hl - pop bc + pop hl ;restore enemy+type inc hl inc hl inc hl + inc hl ;skip type,dam,x,y: next enemy+type + pop bc ;b=counter dnz scan_bullets ;next bullet (loop) ret -;--------------------------- check bullethits -------------------------------- +;--------------------------- check bullethits ------------------------------- check_bullethits: ;INPUT: de=X,Y; (temp1)=bullet ld b,nrenemies ld hl,enemies+1 hit_enemies: ;Hits with normal enemies + psh bc ;enemy counter psh hl ld a,(hl) @@ -1362,35 +1339,44 @@ hit_enemies: ;Hits with normal enemies jp m,nohit psh hl - ld hl,(temp1) - ld (hl),$00 ;remove bullet - pop hl - + ld hl,0 ;@bulletType +temp1 =$-2 + ld (hl),0 ;remove bullet + inc hl ;@damage + ld a,(hl) ;set damage + pop hl ;enemy+y cal enemy_hit - nohit: pop hl - ld a,b ;psh bc ld bc,enemysize add hl,bc - ld b,a ;pop bc + pop bc dnz hit_enemies ;check next enemy ret -enemy_hit: - dec hl - dec hl - dec hl - ld a,(hl) ;occ - ld c,a ;psh occ - and %11111100 ;occ/4 = HP left ; jump - ld (hl),%01 ;set to explode +enemy_hit: ;in:a=damage;hl=enemy+y + add a,a ;a=damage to inflict + add a,a ;first 2 bits used for occ. + ld b,a + dec hl ;@x + dec hl ;@type + dec hl ;@hp00 (occ) + ld a,(hl) ;load hp00 + sub b ;decrease HP (if <0xx then c is set) + ld (hl),a ;save (no flag-changes) + dec hl ;@hp64; no change in c + ld a,(hl) ;load; no c-change + sbc a,0 ;if cf then decrease a + ld (hl),a ;save back the new value + ret nc ;if a>=0 then return, otherwise explode + + inc hl ;goto occ again + ld (hl),%01 ;set to explode ld a,(pickuptimer) ;counts enemies destroyed dec a ;enough destroyed for a pickup? jr nz,pickupdone ;otherwise just explode - ld (hl),%00000110 ;change it into a pickup (with 2 HP) + ld (hl),%110 ;change it into a pickup (with 2 HP) ld a,18 ;reset enemies counter (18 hits = next) pickupdone: ld (pickuptimer),a ;save new enemiescounter value @@ -1400,13 +1386,7 @@ pickupdone: ld hl,1 ;increase score by one jp scoreInc ;+ret -hpleft: - ld a,c ;pop occ - sub %00000100 ;decrease HP by one - ld (hl),a ;save - ret - -;--------------------------- handle torpedo ---------------------------------- +;--------------------------- handle torpedo --------------------------------- Handle_torp: ld a,(torp_occ) @@ -1440,7 +1420,7 @@ remove_torp: ld (torp_occ),a ret -;--------------------------- level events ------------------------------------- +;--------------------------- level events ----------------------------------- Level_event: ld hl,nextevent ;time to next event unused jr next_bullet+1 ;next bullet (SKIP THE = one byte) -;--------------------------- handle enemies ----------------------------------- +;--------------------------- handle enemies --------------------------------- Handle_enemies: ld hl,enemies+1 @@ -1816,7 +1795,7 @@ exploding_enemy: ld (hl),a ;next frame jr next_enemy -;--------------------------- moving enemies ----------------------------------- +;--------------------------- moving enemies --------------------------------- moving_enemy: ld a,(level_move) @@ -1933,7 +1912,7 @@ movedown: inc e ;otherwise save new position ret ;and return -;--------------------------- check collision ---------------------------------- +;--------------------------- check collision -------------------------------- Enemies_hit: ld hl,(x) ;e = X, d = Y @@ -2028,7 +2007,7 @@ check_next: dnz check_collision ret -;--------------------------- story ------------------------------------------- +;--------------------------- story ------------------------------------------ storyPage: psh hl @@ -2078,7 +2057,7 @@ dostory: ld (levelp),hl ;set the level-pointer ret ;and return -;--------------------------- SFX --------------------------------------------- +;--------------------------- SFX -------------------------------------------- CDoSFX: ld hl,VIDEO_MEM @@ -2135,11 +2114,11 @@ SFXdelay: halt dnz SFXdelay - pop bc + pop bc dnz SFXframe ret -;--------------------------- show icon ---------------------------------------- +;--------------------------- show icon -------------------------------------- drawline: ld (hl),a ;draw one piece of the divider-line @@ -2276,7 +2255,7 @@ disp_lives: dec hl \ dec hl jp _vputs ;display on screen +ret -;--------------------------- proc --------------------------------------------- +;--------------------------- proc ------------------------------------------- Random5016: cal Random50 ; a = 0..50 @@ -2385,7 +2364,7 @@ compressed: pop hl jr Decompress -;--------------------------- game over / new game / death --------------------- +;--------------------------- game over / new game / death ------------------- chartable: .db 0,"!<>^",0,0,0,0 .db 0,"xtoje0",0 ;enter..clear @@ -2414,7 +2393,8 @@ save_hi: cal _SET_ABS_SRC_ADDR ld hl,storehi_end-storehi_start cal _SET_MM_NUM_BYTES - jp _mm_ldir ;save done (cal \ ret) + cal _mm_ldir ;save done (cal \ ret) + jp _RAM_PAGE_1 save_lvl: ld hl,own_name-1 ;find own variable @@ -2432,8 +2412,8 @@ save_lvl: cal _SET_ABS_SRC_ADDR ld hl,storesave_end-storesave_start cal _SET_MM_NUM_BYTES - jp _mm_ldir ;save done (cal \ ret) - ret + cal _mm_ldir ;save done (cal \ ret) + jp _RAM_PAGE_1 game_over: pop hl ;=ret (game_over was called from a procedure) @@ -2556,9 +2536,6 @@ restore_line: cal _getkey ;wait for keypress jp quit ;restore some things and return to TI-OS/shell -Continue_game: - jr nonext_level - New_game: xor a ;ld a,0 ld (score),a ;reset score @@ -2577,23 +2554,26 @@ New_game: ld (your_lives),a ;3 lives (4 will be decreased @ You_die) ld (pickuptimer),a ;next pickup after 4 enemies destroyed - xor a - cp (hl) - cal z,dostory - You_die: ld a,12 - ld (your_armor),a ;5 HPs/shields - ld hl,your_lives - dec (hl) ;decrease lives - ld a,(hl) ;load lives left - inc a ;if lives=0ffh then a=0 - jp z,game_over ;if so, game's over - jr nonext_level + ld (your_armor),a ;12 HPs/shields + ld a,(your_lives) ;load lives left + dec a ;decrease lives + ld (your_lives),a ;if lives=0ffh GO + jp c,game_over + jr samelevel -;--------------------------- next level --------------------------------------- +;--------------------------- next level ------------------------------------- Next_level: + ld a,(your_armor) ;load current armor + cp 25-8 ;may not become >=25 + jr c,addok ;ok then just add 8 + ld a,25-8 ;set to maximum (8 will be added below) +addok: + add a,8 ;add 8 to armor + ld (your_armor),a ;change armor + ld hl,level ;level number ld a,(hl) inc a @@ -2612,26 +2592,15 @@ Next_level: add hl,bc ;update to point to next level ld (levelp),hl ;save - xor a - cp (hl) - cal z,dostory - -nonext_level: - ld a,(your_weapon) - add a,a ;weap*2 - add a,a ; *4 - add a,a ; *8 - ld c,a - ld b,0 - ld hl,XLweapondata-7 - add hl,bc - ld a,(hl) - ld (ybuls),a ;max number of bullets (varies per weap.class) - +samelevel: ld a,80 ld (nextevent),a ;time to first enemy appearance ld hl,(levelp) ;level pointer + xor a + cp (hl) + cal z,dostory + ld a,(hl) ;load new level-enemy type ld (level_enemy),a ;set level-enemy inc hl @@ -2691,7 +2660,7 @@ torpsclear: ld bc,(nrenemies*enemysize)+((nrybuls+nrebuls)*3)-1 ldir ;clear enemies + bullets (y/e) -;--------------------------- setup game --------------------------------------- +;--------------------------- setup game ------------------------------------- game_setup: cal BLACKLCD @@ -2743,11 +2712,27 @@ placestars: dnz placestars ;repeat for all stars ret -;--------------------------- putsprite ---------------------------------------- -;--------------------------- de =(X,Y) ---------------------------------------- +loadweapon: + ld a,(your_weapon) + add a,a ;weap*2 + add a,a ; *4 + add a,a ; *8 + ld c,a + ld b,0 + ld hl,weapondata-16 + add hl,bc + ld a,(hl) + ld (weapdamage),a ;damage of bullets + inc hl + ld a,(hl) +; ld (weapdaminc),a ;damage increase + ret + +;--------------------------- putsprite -------------------------------------- +;--------------------------- de =(X,Y) -------------------------------------- offsets_table: - .db 128,64,32,%10000,%01000,%00100,%00010,%00001 + .db $80,$40,$20,$10,8,4,2,1 putsprite: ld a,d ;a = X and %00000111 ;a = X mod 8 = bit nr. to mask @@ -2770,7 +2755,7 @@ putsprite: srl d ;d/4 srl d ;d/8 (8 bits in byte) ** c is set when overflow add a,d ;a = (Y*16+X/8) mod 256 - jp nc,_n1 ;jump if no carry = no overflow = a<=255 + jr nc,_n1 ;jump if no carry = no overflow = a<=255 inc b ;a>255 so increase bc by 256 _n1: ld c,a ;c = (Y*16+X/8) mod 256 add hl,bc ;bc = Y*16+X/8 @@ -2784,13 +2769,13 @@ _oloop: psh bc ;Save # of rows inc ix _smc1: ld a,1 ;Load pixel mask _iloop: sla c ;Test leftmost pixel - jp nc,_noplot ;See if a plot is needed + jr nc,_noplot ;See if a plot is needed ld e,a ;OR pixel with screen or (hl) ld (hl),a ld a,e _noplot:rrca - jp nc,_notedge ;Test if edge of byte reached + jr nc,_notedge ;Test if edge of byte reached inc hl ;Go to next byte _notedge: dnz _iloop @@ -2801,7 +2786,7 @@ _notedge: dnz _oloop ret ;s are used instead of = faster -;--------------------------- putbigsprite ------------------------------------- +;--------------------------- putbigsprite ----------------------------------- putwidesprite: ld a,d @@ -2873,9 +2858,9 @@ wover_1: dnz woloop ret -;------------------------------------------------------------------------------ -;------------------------------- sprites -------------------------------------- -;------------------------------------------------------------------------------ +;---------------------------------------------------------------------------- +;------------------------------- sprites ------------------------------------ +;---------------------------------------------------------------------------- spr_ship01: .db 7,7 ;ship alpha class @@ -2888,14 +2873,6 @@ spr_ship01: .db %01111000 ; ████ spr_ship01i: .db 7,7 ;ship alpha class - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %00000000 ; - .db %01010000 ; █ █ .db %10100000 ; █ █ .db %01010100 ; █ █ █ @@ -2930,16 +2907,38 @@ spr_multiple: .db %11111100 ; ██████ .db %01111000 ; ████ +;--------------------------------- bullets ---------------------------------- + spr_bullet01: - .db 5,3 ;your bullets - .db %00110000 ; ░▒▓█▒ - .db %11111000 ; ░▒▓████▒ - .db %00110000 ; ░▒▓█▒ + .db 5,3 ;dam=0-3 + .db %00110000 ; ▒██ + .db %01001000 ; ▒█ ▒█ + .db %00110000 ; ▒██ spr_bullet02: + .db 5,3 ;dam=4-7 + .db %00110000 ; ▒██ + .db %01101000 ; ▒██▒█ + .db %00110000 ; ▒██ +spr_bullet03: + .db 5,3 ;dam=8-11 + .db %00110000 ; ▒██ + .db %11101000 ;▒███▒█ + .db %00110000 ; ▒██ +spr_bullet04: + .db 5,3 ;dam=8-11 + .db %00110000 ; ▒██ + .db %11111000 ;▒█████ + .db %00110000 ; ▒██ +spr_bullet05: + .db 5,3 ;dam=8-11 + .db %01110000 ; ▒███ + .db %11111000 ;▒█████ + .db %01110000 ; ▒███ +spr_bullet06: .db 5,3 - .db %11110000 ; ░▒▓███▒ - .db %11111000 ; ░▒▓████▒ - .db %11110000 ; ░▒▓███▒ + .db %11110000 ;▒████ + .db %11111000 ;▒█████ + .db %11110000 ;▒████ spr_bullett1: .db 4,3 ;▒▒▒ .db %11100000 ;▒███ @@ -2952,7 +2951,7 @@ spr_bullete1: .db %11110000 ; ▒███▓▒░ .db %01100000 ; ▒█▓▒░ -;---------------------------------------- explosion ------------------------------------------- +;-------------------------------- explosion --------------------------------- spr_explosion: .db 8,6 ;1 @@ -3028,7 +3027,7 @@ spr_yexplosion: .db %00000000 ; .db %00000000 ; -;--------------------------------------- bar ----------------------------------- +;------------------------------------ bar ----------------------------------- spr_iconhalf: .db 16,7 ;selected .......: @@ -3106,7 +3105,21 @@ spr_dividerline: .db 8,7 .db 128,128,128,128,128,128,128 ;128 = %10000000 -;---------------------------- texts ------------------------------------------- +;-------------------------- weapondata -------------------------------------- + +;format:[unused] [ybuls(max.bullets)] [0000:direction 0000:speed] [offset] +maxnrweapons = 8+1 +weapondata: + .db 2,1,%00000010,2,%00000000,0,%00000000,0 ;single fire + .db 2,1,%00000011,2,%00000000,0,%00000000,0 ;fast single + .db 16,2,%00000010,0,%00000010,5,%00000000,0 ;double + .db 16,1,%00010010,2,%00110010,2,%01000010,2 ;triple + .db 16,1,%00010011,2,%00110011,2,%01000011,2 + .db 16,1,%00010011,2,%00110011,2,%01000100,2 + .db 16,1,%00010100,2,%00110100,2,%01000101,2 + .db 16,1,%00010100,2,%00110100,2,%01000101,2 + +;---------------------------- texts ----------------------------------------- txt_about: .db " v0.96.A30",127,"by Shiar",0 txt_email: .db "shiar0@hotmail.com",0 @@ -3123,19 +3136,19 @@ txt_pressenter: .db "Enter to continue",0 txt_teacher: .db "(2",Lpi,"*.95)/sin 13",0 txt_teacherans: .db Lneg,"14.2063168184",0 -;---------------------------- save data --------------------------------------- +;---------------------------- save data ------------------------------------- PutWhere .dw GRAPH_MEM ;where to put the wide sprites laserlasts .db 5 storehi_start: hiscore .dw $0000 -hiname .db "Shiar.96",0 +hiname .db "Shiar.97",0 storehi_end: storesave_start: level .db $01 ;level number -levelp .dw XLlevelsdata+4 ;pointer to level data +levelp .dw XLlevelsdata ;pointer to level data pickuptimer .db $04 ;counts when to place a pickup score .dw $0000 @@ -3145,13 +3158,264 @@ your_inv .db $00 ;invincibility left your_armor .db $0a ;HP left your_lives .db $03 ; -your_weapon .db $02 ;laser avail: 0=no, 1=yes +your_weapon .db $02 ;weapon: 0=no, 1=laser, 2+=bullet n+1 your_multiples .db $00 ;multiples present torp_occ .db $00 ;torp.state: 0=unavail 1=avail 2=presnt torp_pos .dw $0000 ;torpedo position (x,y) storesave_end: -;----------------------------- logo ------------------------------------------- + +;XLlevelsdata:--------------------------------------------------------------- +XLlevelsdata: + + .db 0 + .db $21,$1d,"Cosmic year 6716" ,0,0,$1d,$06 + .db $1b,$1d,"storyline coming soon..." ,0,0,$1d,$06 + .db $09,$19,"the Nemesis saga continues",0,1 + .db $2e,$21,"with NEMESIS 86" ,0,1 + .db $52,$36,"by Shiar" ,0,0,$19,$23 + .db $ff + +;format:[enemy nr] [enemy frequency] [next lvl] +; [level_info: 0000:damage 0:directfire 0:ground 0:ceiling 0:diagfire] +; [level_move] [level_fire] [tunnel size] [groundtype] [16_ground] +; [16_ceiling] [stars1] [stars2] + + .db $15,$07,$08 ;fireFreq; moveType; enemyType +level01: ;efrequency must be odd if halfluring! + .db $01,$1b,$2f,%00010001,0,255,0,0 ;0f>>2f ; 7 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ;16 + .db 1,1 ; 2 + .db $10,$07,$09 ; 3 + + .db 0 + .db $01,01,"And the storyline conti", + .db "nues.....",0,1 + .db $01,09,"You decide to fly close", + .db " to the",0,1 + .db $01,15,"surface of a nearby pl", + .db "anet =)",0,0,1,20 + .db $FF + + .db $10,$07,$09 ; 3 +level02: ;44 + .db $02,$13,$4b,%00100101,0,064,0,0 + .db 1,2,3,4,5,6,6,5,4,3,4,5,4,3,2,1 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + .db $0E,$07,$09 + + .db 0 + .db $01,01,"Blablabla...",0,1 + .db $01,34,"this storyline sux",0,0,1,39 + .DB $FF + + .db $0E,$07,$09 +level03: + .db $03,$2d,$3f,%00010110,0,255,-9,1 + .db 3,2,4,3,2,2,1,1,1,1 ,1,1,21,17,18,20 + .db 1,1,1,1,1,1,1,3,6,12,9,1,21,19,18,18 + .db -1,-1 + + .db $0D,$07,$08 +level04: + .db $04,$11,$41,%00100001,0,057,0,0 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + .db $0C,$07,$09 +level05: + .db $05,$11,$45,%00100101,%10,031,-7,1 + .db 14,12,11,9,10,7,7,5,4,3,4,4,2,3,1,2 + .db 1, 1, 1, 1,1, 1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + .db $0B,$07,$08 +level06: + .db $06,$19,$3a,%00100111,0,255,-4,1 + .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1 + .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + + .db $08,$07,$09 +level07: + .db $07,$09,$ff,%00100001,0,043,0,0 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + .db 1,1 + +;XLenemytable:--------------------------------------------------------------- +XLbullettable: + .db (spr_bullet01-spr_bullet01) ;0 + .db (spr_bullet01-spr_bullet01) ;4 + .db (spr_bullet02-spr_bullet01) ;8 + .db (spr_bullet02-spr_bullet01) ;12 + .db (spr_bullet03-spr_bullet01) ;16 + .db (spr_bullet03-spr_bullet01) ;20 + .db (spr_bullet03-spr_bullet01) ;24 + .db (spr_bullet04-spr_bullet01) ;28 + .db (spr_bullet04-spr_bullet01) ;32 + .db (spr_bullet04-spr_bullet01) ;36 + .db (spr_bullet05-spr_bullet01) ;40 + .db (spr_bullet05-spr_bullet01) ;44 + .db (spr_bullet05-spr_bullet01) ;48 + .db (spr_bullet06-spr_bullet01) ;52 + .db (spr_bullet06-spr_bullet01) ;56 + .db (spr_bullet06-spr_bullet01) ;60 + +XLenemytable: + .db $00 ;00 + .db (spr_enemy01-spr_enemy00)/2 ;01 + .db (spr_enemy02-spr_enemy00)/2 ;02 + .db (spr_enemy03-spr_enemy00)/2 ;03 + .db (spr_enemy04-spr_enemy00)/2 ;04 + .db (spr_enemy05-spr_enemy00)/2 ;05 + .db (spr_enemy06-spr_enemy00)/2 ;06 + .db (spr_enemy07-spr_enemy00)/2 ;07 + .db (spr_boss01 -spr_enemy00)/2 ;08 + .db (spr_boss02 -spr_enemy00)/2 ;09 + .db (spr_enemy08-spr_enemy00)/2 ;0A + .db (spr_enemy00-spr_enemy00)/2 ;0B + .db (spr_enemy00-spr_enemy00)/2 ;0C + .db (spr_enemy00-spr_enemy00)/2 ;0D + .db (spr_enemy00-spr_enemy00)/2 ;0E + .db (spr_enemy00-spr_enemy00)/2 ;0F + +;XLenemyinfos:--------------------------------------------------------------- +XLenemyinfos: + +;format: [000000:HP 00:occ] [HP64] [appearance(ypos)] [unused] + + .db %00100110,0,1,1 ;#1 HP:1 app:random + .db %00101010,0,2,3 ;#2 HP:1 app:halflure + .db %00001111,0,3,2 ;#3 HP:1 app:lure + + .db %00000110,0,4,2 ;#4 HP:2 app:lure + .db %00000111,0,5,3 ;#5 HP:2 app:random moving + .db %00001011,0,6,2 ;#6 HP:3 app:lure moving + + .db %00011011,0,7,3 ;#7 HP:7 app:halflure moving + + .db %00110011,1,8,1 ;boss1 + .db %00111011,0,9,3 ;boss2 + + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + .db %00000000,0,0,0 + +;XLsprenemies:--------------------------------------------------------------- +XLsprenemies: + +spr_enemy00: + .db 8,8 ;pickup + .db %00011000 ; ██ + .db %00011000 ; ██ + .db %00011000 ; ██ + .db %11111111 ; ████████ + .db %11111111 ; ████████ + .db %00011000 ; ██ + .db %00011000 ; ██ + .db %00011000 ; ██ + +spr_enemy01: + .db 6,6 ;enemy type one + .db %00111100 ; ████ + .db %01110000 ; ███ + .db %11110000 ; ████ + .db %11110000 ; ████ + .db %01110000 ; ███ + .db %00111100 ; ████ +spr_enemy02: + .db 8,6 ;enemy type two + .db %00111111 ; █████ + .db %01111000 ; ████ + .db %11111100 ; ██████ + .db %11111100 ; ██████ + .db %01111000 ; ████ + .db %00111111 ; █████ +spr_enemy03: + .db 6,6 ;enemy type three + .db %01111100 ; █████ + .db %11110000 ; ████ + .db %11111000 ; █████ + .db %11111000 ; █████ + .db %11110000 ; ████ + .db %01111100 ; █████ +spr_enemy04: + .db 6,6 ;enemy type four + .db %00111000 ; ███ + .db %01111100 ; █████ + .db %11111000 ; █████ + .db %11111000 ; █████ + .db %01111100 ; █████ + .db %00111000 ; ███ +spr_enemy05: + .db 7,6 ;enemy type five + .db %00011110 ; ████ + .db %01111110 ; ██████ + .db %11111100 ; ██████ + .db %11111100 ; ██████ + .db %01111110 ; ██████ + .db %00011110 ; ████ +spr_enemy06: + .db 7,6 ;enemy type six + .db %00011100 ; ███ + .db %01111110 ; ██████ + .db %10111000 ; █ ███ + .db %10111000 ; █ ███ + .db %01111110 ; ██████ + .db %00011100 ; ███ +spr_enemy07: + .db 8,6 ;enemy type seven + .db %00011110 ; ████ + .db %01111111 ; ███████ + .db %10011100 ; █ ███ + .db %10011100 ; █ ███ + .db %01111111 ; ███████ + .db %00011110 ; ████ + +spr_boss01: + .db 16,10 ;boss type one + .db %00000001,%11111111 ; █████████ + .db %00001111,%11111110 ; ███████████ + .db %00111111,%11110000 ; ██████████ + .db %01011111,%10000000 ; █ ██████ + .db %10011111,%01000000 ; █ █████ █ + .db %10011111,%01000000 ; █ █████ █ + .db %01011111,%10000000 ; █ ██████ + .db %00111111,%11110000 ; ██████████ + .db %00001111,%11111110 ; ███████████ + .db %00000001,%11111111 ; █████████ +spr_boss02: + .db 16,10 ;boss type:one : + .db %11111110,%00000000 ; ███████ + .db %00001111,%10001111 ; █████ ████ + .db %00111111,%11100011 ; █████████ ██ + .db %01001111,%11111110 ; █ ███████████ + .db %10001101,%01111100 ; █ ██ █ █████ + .db %10001101,%01111100 ; █ ██ █ █████ + .db %01001111,%11111110 ; █ ███████████ + .db %00111111,%11100011 ; █████████ ██ + .db %00001111,%10001111 ; █████ ████ + .db %11111110,%00000000 ; ███████ + + +spr_enemy08: + .db 8,6 ;enemy type eight + .db %00011110 ; ████ + .db %01111111 ; ███████ + .db %10011100 ; █ ███ + .db %10011100 ; █ ███ + .db %01111111 ; ███████ + .db %00011110 ; ████ + +;---------------------------------------------------------------------------- +;----------------------------- logo ------------------------------------------ +;---------------------------------------------------------------------------- logo_nemesis: .db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011,%11111111,%11111111,%11111111,%11111000 @@ -3174,13 +3438,15 @@ logo_nemesis: .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010101 .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010001 -;----------------------------- end -------------------------------------------- +;----------------------------- end ------------------------------------------ .end .end -;------------------------------------------------------------------------------ +;---------------------------------------------------------------------------- +;---------------------------------------------------------------------------- +;---------------------------------------------------------------------------- ; 0.95.A22 -- 22.X.99 -- size 5321 ; @@ -3220,6 +3486,15 @@ logo_nemesis: ; instead of two 4-byte spaces 40 bytes apart! (cleaner code; faster) ; * ground/ceiling/stars are continued when at boss (c00l level 3 boss) ; +; 0.97.622 -- 06.VI.99 -- size 5kb ; -; + added - removed * changed # bug fixed - +; # bullets do damage in all levels +; * more armor at armor-upgrade and extra armor at end of a level +; - internal levels again (no need 4 external, safer/smaller) +; # some registers not correctly pushed/popped +; * several optimizations (init.procs some bytes smaller) +; + bullets "charge up" (more damage) when not firing +; + more powerful bullets have different sprites (larger=more damage) +; +; +; + added - removed * changed # bug fixed \ No newline at end of file