8 DELC_LEN = _undelBufLen ;$64 bytes long
12 .dw $0001 ;description type 2 (= +YASicon)
13 .dw Title ;pointer to description
14 .dw spr_ship ;pointer to YAS icon
16 Title: .db "Nemesis v0.91.95 by Shiar",0
18 just_fired = TEXT_MEM ;byte
19 temp1 = TEXT_MEM+1 ;word
20 RanPos = TEXT_MEM+3 ;byte
21 firex = TEXT_MEM+4 ;byte
25 your_locpos = TEXT_MEM+8 ;byte
26 your_prevpos = TEXT_MEM+9 ;16 words
29 ybullets = your_prevpos+32 ;20 x (state,x,y)
31 ebullets = ybullets+(nrybullets*3) ;10 x (state,x,y)
35 ; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
36 ; %11111111 (ship type or explosion frame) %11111111 (x) %11111111 (y)
37 add2enemy = nrenemies*4
38 enemiesxtra = enemies+add2enemy
40 ;---------------------- init --------------------------------------------------
43 call _runindicoff ;turn the run-indicator off, obviously
44 call _clrLCD ;clean the screen
49 ld a,(CONTRAST) ;load current contrast level
50 cp $1f ;if already at maximum...
51 jr z,skipdarken ;...then skip level increase
52 inc a ;otherwise increase contrast level
56 ;---------------------- main menu ---------------------------------------------
59 ld hl,logo_nemesis ;from...
60 ld de,VIDEO_MEM+16 ;...to one line from top
63 ld bc,16 ;set screen width
64 ldir ;display one line
65 dec a ;decrease line-counter
66 jr nz,LogoLoop ;repeat when counter is not yet zero
69 ld hl,$1608 ;just below logo
71 ld hl,txt_about ;display "by Shiar (ICQ#43840958)"
74 ld hl,$0705 ;located one row above bottom
75 ld (_curRow),hl ;go there
76 ld hl,txt_1player ;display "ONE PLAYER"
78 ld hl,$0706 ;below oneplayer text
80 ld hl,txt_2players ;display "TWO PLAYERS"
83 call _getkey ;wait for keypress
84 call New_game ;prepare level
86 ;------------------------------------------------------------------------------
87 ;---------------------- game loop ---------------------------------------------
88 ;------------------------------------------------------------------------------
91 ld hl,timer ;update time
92 inc (hl) ;increase by 1
95 ld hl,RanPos ;random counter
96 ld a,(hl) ;random value
97 add a,b ;even more random by adding timer
98 ld (hl),a ;save even more random value back
102 ld hl,GRAPH_MEM ;screen location (top left)
103 ld b,$E0 ;loop 0E0h = 224 times = 256-32 for score-bar)
105 ld (hl),a ;clear four times (total = 224*4 = 896 bytes)
113 djnz clearloop ;repeat 224x
121 ; ld a,%00111111 ;<exit> pressed?
125 ; bit 6,a ;test bit 6 = <EXIT>
126 ; jr z,quit ;yes: quit game
129 call Level_event ;insert enemies
130 call Handle_Ship ;move you
131 call Handle_enemies ;move enemies
133 call Fire_bullet ;check for fire
134 call Handle_bullets ;move your bullets
135 call Handle_torp ;move your torpedo
136 call Enemy_bullets ;move enemy bullets
137 call Enemies_hit ;check for collision with enemies
139 call Display_Screen ;display all
141 jr game_main_loop ;loop
143 ;--------------------------- pause --------------------------------------------
146 ld hl,$0200 ;top left
148 ld hl,txt_pressenter ;"Enter to continue"
149 call _puts ;display message
151 call _getkey ;enter low-power mode and wait for key
152 cp kEnter ;keypressed = enter?
153 jr nz,pause ;no, wait some more
156 ;--------------------------- exit ---------------------------------------------
159 ld a,(CONTRAST) ;load original contrast level
160 out (2),a ;and set it back
164 ;--------------------------- display ------------------------------------------
167 ld hl,GRAPH_MEM ;from storage (top left)
168 ld de,VIDEO_MEM ;to screen (top left)
169 ld a,56 ;display height = 64 bytes (minus 8 for bar)
171 ld bc,16 ;display width = 16 bytes (16*8bits=256pixels)
174 jr nz,displayloop ;loop 64x
176 ld hl,$396b ;Display Score
177 ld (_penCol),hl ;bottom right of screen
181 _D_HL_DECI: ;------- display 5-digit value -------
182 ld de,savestr+4 ;savenr saves number string
184 ldhld: call UNPACK_HL ;one digit of hl
185 add a,'0' ;make number
186 ld (de),a ;save into savenr
187 dec de ;point to next digit
188 djnz ldhld ;repeat for all digits
191 call _vputs ;display string
197 ;------------------------- handle ship ----------------------------------------
202 jr z,ok ;0 = normal stat
204 inc a ;next (explosion)frame
205 ld (your_occ),a ;save
207 cp 34 ;last explosion frame?
208 jp c,exploding_you ;not yet: display explosion
209 cp 40 ;delay finished?
210 jp z,You_die ;yes = game over
211 ret ;don't display anything
218 rra ;rotate right (put last bit in c)
223 cp 49 ;55-6 = bottom of screen
229 rr b ;because we now use b, it's rr instead of rra
232 sub 1 ;<dec a> doesn't affect c-flag
233 jr c,no_left ;-1 = left side
239 cp 121 ;127-6 = right side
249 sub 1 ;<dec a> doesn't affect carry-flag
250 jr c,no_up ;-1 = top of screen
251 ld (hl),a ;save new y
254 ld ix,spr_ship01 ;ship sprite
255 ld hl,your_inv ;invulnerable?
256 ld a,(hl) ;load time in a
258 jr z,handle_multiples ;yes so ship = normal (display \ continue)
260 ld b,a ;save inv-time
261 ld a,(timer) ;load frame nr.
262 and %00000011 ;a=0 once every four frames
263 jr nz,not_time ;a<>0 = not time to update counter
264 dec (hl) ;decrease inv-time left
266 and %00000010 ;a switches 0<->1 every 2 frames
267 jr z,no_flicker ;don't show normal sprite anyway
269 and %11110000 ;inv-time <16 ticks left?
270 jr handle_multiples ;yes: display normal sprite and continue
273 ld ix,spr_ship01i ;display inv-ship (ld ix is faster than add ix)
276 call putsprite ;display your ship
278 ld a,(your_multiples) ;do you have multiples
280 ret z ;then don't handle them either
282 ld hl,your_locpos ;location to save this position
285 and %00001111 ;if a>15 then a=a-16
286 ld (hl),a ;save new a
291 ld hl,your_prevpos ;previous positions
292 add hl,bc ;16 turns ago
296 ld (mx),de ;save multiple position in (mx)
298 ld a,(y) ;load new y-pos
299 ld (hl),a ;save it for 16 turns in the future
301 ld a,(x) ;load new x-pos
302 ld (hl),a ;save that too
304 ld ix,spr_multiple ;sprite of the multiple
305 jp putsprite ;display it + <ret>
308 srl a ;half the framerate
309 dec a ;first frame is 1>inc>srl>dec = 0
328 ld a,(your_inv) ;invulnerability left?
330 ret nz ;return if inv>0
331 ld hl,your_armor ;armor left
334 jp m,no_armor ;yes, 0hp left so explode
335 ld (hl),a ;no, so save decreased hp
336 call disp_armor ;and display new value
339 ld a,%01 ;occ %xxxxxx01 = explode
340 ld (your_occ),a ;set to explode
343 ;------------------------- fire bullet ----------------------------------------
346 ld a,(your_occ) ;are you 100% OK?
348 ret nz ;return if not normal stat
350 ld a,%00111111 ;function keys (F1-F5)
351 out (1),a ;ask for them
352 nop \ nop ;delay 8 clocks
354 bit 4,a ;test bit 4 = F1-key
355 jr z,fire ;fire pressed?
357 ld (hl),0 ;no: reset just_fired
358 bit 3,a ;test bit 3 = F2-key &&&
359 ret nz ;return if not
362 ld hl,your_pickup ;select pickups
363 ld a,(hl) ;load pickups taken so far
365 jr nz,select2 ;no, carry on
366 ld (hl),a ;reset pickups (a=0)
367 ld hl,your_armor ;change armor
368 inc (hl) ;increase HPs by one
369 jp disp_icons ;display and return
372 jr nz,select3 ;no, carry on
373 ld (hl),a ;reset pickups
375 ld (torp_occ),a ;ready torpedoes
376 jp disp_icons ;display 'n return
379 jr nz,select4 ;no, carry on
380 ld (hl),a ;reset pickups
381 jp disp_icons ;display n return
384 jr nz,select5 ;no, carry on again
385 ld (hl),a ;reset pickups
387 ld (your_laser),a ;ready laser
388 jp disp_icons ;display + return
391 jr nz,select6 ;no, carry on once more
392 ld (hl),a ;reset pickups
394 ld (your_multiples),a
395 jp disp_icons ;display, return
397 ld (hl),0 ;reset pickups
398 jp disp_icons ;display/return
400 fire: ld hl,RanPos ;random
401 inc (hl) ;update random counter
403 ld a,(hl) ;just_fired
404 or a ;zero when key just pressed (not already in)
405 ret nz ;return when already pressed
406 inc (hl) ;set just_fired to 1
408 ld hl,(x) ;yes: first fire from ship position (x)
409 ld (firex),hl ;set firepos
410 ld a,(your_multiples) ;any multiples?
412 jr nz,fireany ;then just fire somethin'
413 call fireany ;and blast
414 ld hl,(my) ;then, fire from multiple position (mx)
417 ld (firex),hl ;set firepos
418 ;blast again and <ret>
420 ld a,(your_laser) ;do you have laser?
422 jr nz,fire_ybullet ;no, just fire a bullet
424 fire_laser: ;yes, fire that laser instead
425 ld a,(firex) ;a = your x-pos
428 ld hl,GRAPH_MEM ;save-location
429 ld a,(firey) ;y-coord
430 add a,3 ;at middle of your ship (y+3)
431 ld e,a ;save laser-y in e
435 rl b ;b (=0) =b*2+overflow (if y>32 then bc=bc+256)
436 add a,a ;y*16 (width of screen)
437 rl b ;b=b*2+overflow (if y>64 then bc=bc+512)
438 inc a ;8 pixels to right (a=even so no overflow)
443 add a,d ;a = (Y*16+X/8) mod 256 (c set on overflow)
444 jr nc,_nolc ;jump if no carry = no overflow = a<=255
445 inc b ;a>255 so increase bc by 256
446 _nolc: ld c,a ;c = (Y*16+X/8) mod 256
447 add hl,bc ;bc = Y*16+X/8
449 ld a,15 ;128/8=16=screen width ** minus one (inc a ^^)
450 sub d ;minus x-start (d=X/8)
455 inc hl ;Go to next byte
460 ld d,a ;d was divided, so reload the laser-x
462 check_laserhits: ;de = (x,y)
467 laserhits: ;Hits with normal enemies
472 jr z,nolashit ;no hit when enemy_occ <> 2/3
476 or a ;enemy #0 = pickup
477 jr z,nolashit ;yes: don't destroy
482 jp m,nolashit ;no hit when enemy is left of you
487 jp z,enemy_hit ;a-e=0 = laser on top line of enemy = hit
488 jr nc,nolashit ;a-e>0 = enemy above laser = no hit
489 add a,5 ;add enemy height
490 jp p,enemy_hit ;a-e>0 = hit
494 inc hl ;go to next enemy
498 djnz laserhits ;check all enemies
503 jr fire_torp ;fire torpedoes as well
512 jr z,found_ybullet ;0 = no bullet here
514 djnz find_ybullet ;look next bullet
518 ld (hl),1 ;use bullet
519 ld a,(firex) ;your x-pos
520 add a,5 ;place bullet in front of you
521 inc hl ;go to bullet-x
523 ld e,a ;save torp-x in e
525 ld a,(firey) ;your y-pos
526 add a,2 ;place bullet at the middle of your ship
527 inc hl ;go to bullet-y
529 add a,3 ;place torpedo at bottom of ship
530 ld d,a ;save torp-y in d
533 ld hl,torp_occ ;torpedo...
534 ld a,(hl) ;load torpInfo
535 dec a ;do you have (unused) torpedoes?
536 ret nz ;nope (a must be 1)
537 ld (hl),2 ;yes; use torpedo
538 ld (torp_pos),de ;save torpedo position (in de)
541 ;------------------------ handle bullets --------------------------------------
545 ld (hl),0 ;dump this bullet!
558 call z,bullet_2left ;yes: 2left
562 add hl,de ;3 x <inc hl>
563 djnz scan_bullets ;next bullet (loop)
568 cp 122 ;off screen? (x>128-5)
570 add a,2 ;move 2 2 the right
571 ld (hl),a ;save new pos.
579 call putsprite ;display bullet
582 check_bullethits: ;INPUT: de=X,Y
587 hit_enemies: ;Hits with normal enemies
592 jr z,nohit ;no hit when enemy_occ <> 2/3
596 or a ;enemy #0 = pickup
597 jr z,nohit ;yes: don't destroy
617 ld (hl),$00 ;remove bullet
626 and %11111100 ;occ/4 = HP left ;<srl a\srl a
627 jr nz,hpleft ;not zero -> jump
628 ld (hl),%01 ;set to explode
630 ld a,(RanPos) ;use random var
631 and %01011011 ;matches 0 100/2/2/2/2/2=3% of the time
632 jr nz,pickupdone ;otherwise just explode
633 ld (hl),%00000110 ;change it into a pickup (with 2 HP)
636 ld (hl),$00 ;explosionFrame 0
641 sub %00000100 ;decrease HP by one
651 djnz hit_enemies ;check next enemy
654 ;--------------------------- handle torpedo -----------------------------------
659 ret m ;return if occ=0/1
661 ld hl,torp_pos ;x-position
664 cp 125 ;right edge reached
665 jr nc,remove_torp ;remove if x>125
666 ld (hl),a ;save new x
672 cp 56 ;bottom reached
673 jr nc,remove_torp ;remove if y>40
674 ld (hl),a ;save new y
679 call putsprite ;display torpedo
681 jr check_bullethits ;check for hits with enemies
688 ;--------------------------- level events -------------------------------------
691 ld hl,nextevent ;time to next event <ld a,(nextevent)
692 dec (hl) ;decrease counter <dec a
693 ld a,(hl) ;look at counter <ld (nextevent),a
694 or a ;has it reached zero?
695 ret nz ;nope: get outta here!
697 ld a,(eventtime) ;enemy frequency (lvl)
698 ld (nextevent),a ;set time to next event
700 dec (hl) ;update enemy-counter
702 ld a,(hl) ;look at counter
703 or a ;has it reached 0?
704 jp z,Next_level ;yes: level finished
705 dec a ;has it reached 1?
706 jr nz,do_event ;nope: wait for enemies to leave
707 inc hl ;nextevent located behind eventleft
708 ld (hl),119 ;set delay
709 ret ;don't place any more enemies
719 or a ;0 = no enemy present
723 ld a,(eventenemy) ;enemy type to place (lvl)
724 ld hl,enemy00 ;enemy 1 specs
728 ld b,0 ;bc = enemy nr.
729 add hl,bc ;hl = enemy specs
730 ld a,(hl) ;load hitpoints+occ of this enemy class
733 inc hl ;next enemyInfo byte
734 inc de ;next byte of current enemy
735 ld a,(hl) ;load movement+type of this enemy class
736 ld (de),a ;enemy type
739 ld a,122 ;appear at right edge of screen (128-6)
740 ld (de),a ;= x-position
743 inc hl ;where to place??
744 ld a,(hl) ;load placeInfo
746 jr z,random_enemy ;yes: create random value <51 in a
748 jr z,lure_enemy ;yes: create a 100% luring enemy
750 halflure_enemy: ;yes (of course it is): pick one (50% lure)
751 ld a,(timer) ;look at frame-number
752 and %00000001 ;make random if odd frame nr.
753 jr nz,random_enemy ;1st possibility: random enemy
754 lure_enemy: ;2nd possibility: luring enemy
755 ld a,(y) ;place at same y-pos as YOUR ship
759 call Random ;make a (in a) random value 0-255
760 cp 51 ;y may not be more than 51
761 jr c,ypos_OK ;OK if a<51
762 and %00111111 ;a = 0..63
764 jr c,random_enemy ;not OK if a<0
766 ypos_OK: ;random value successfully created
767 ld (de),a ;save y-position
769 ld hl,add2enemy-3 ;offset to xtra enemy info
770 add hl,de ;hl points to <xtra info: move>
771 ld (hl),1 ;set move-counter to 1
772 inc hl ;hl to <xtra info: fire>
773 ld (hl),1 ;set time-to-fire to 1 frame (fires directly)
777 ld a,(RanPos) ;a handy random-var.
778 ld hl,x ;add your x-coord for randomness
780 ld hl,y ;add your y-coord for randomness
782 ld (RanPos),a ;save altered random-var
783 ret ;RanPos also in #a
785 ;--------------------------- enemy fires --------------------------------------
787 Enemy_fires: ;de = x,y
798 jr z,found_ebullet ;0 = not used
799 inc hl \ inc hl \ inc hl
800 djnz find_ebullet ;look next bullet
804 ld (hl),1 ;use bullet &&&
812 ;----------------------------- enemy bullets ----------------------------------
820 ld a,(hl) ;load bulletType in a
822 jr nz,enemy_bullet ;no: handle bullet
824 pop hl ;do not move the <pop hl>
826 inc hl \ inc hl \ inc hl
833 ld a,(hl) ;check if it has reached the left side of scrn
834 and %11111110 ;it is <2 (0 or 1)?
835 jr z,remove_ebullet ;yes, remove bullet
836 dec (hl) ;move one left
837 dec (hl) ;and another one
843 jr z,ebullet_common ;normal bullet
853 ld ix,spr_bullete1 ;display enemy bullet
859 jr nz,next_bullet ;0 = you're normal
879 call damage_you ;HIT!!
881 pop hl ;hl could be destroyed by damage_you
882 ld (hl),0 ;bullet > unused
883 jr next_bullet+1 ;next bullet (SKIP THE <POP HL> = one byte)
885 ;--------------------------- handle enemies -----------------------------------
889 ld b,nrenemies ;handle all enemies
897 jr z,next_enemy ;occ "no enemy" 0
899 jr z,exploding_enemy ;occ "exploding" 1
900 ld b,a ;b=2 if moving, otherwise b=1
902 normal_enemy: ;occ "normal" 2 or "moving" 3
906 ld e,(hl) ;e = enemy type
909 ld hl,sprites ;hl = @sprites offset-table
910 add hl,de ;points to offset of current enemy offset
911 ld e,(hl) ;de = @enemy offset
913 ld ix,spr_enemy00 ;first enemy sprite
914 add ix,de ;add offset for current enemy
920 jr c,remove_enemy ;off screen
926 ld a,b ;moving state was stored in b earlier
928 call nz,moving_enemy ;2 = moving enemy
931 ld (hl),d ;store new x
934 ld a,c ;a = enemy type
935 or a ;type 0? (pickup)
936 jr z,firing_done ;pickups don't fire
938 ld bc,add2enemy+1-2 ;offset of <xtra enemy info: fire>
939 add hl,bc ;go there (@hl)
940 dec (hl) ;decrease counter till next blast
941 ld a,(hl) ;load new counter
942 or a ;has it reached zero?
943 jr nz,firing_done ;finished if not
945 add a,64 ;re-set counter for next blast
947 call Enemy_fires ;fires bullet
950 push de ;save registers for firing-use
951 call putsprite ;display sprite @ix
952 pop de ;restore (destroyed by putsprite)
964 ld (hl),$0000 ;bye bye enemy
972 call explosion_stuff ;display explosion
977 jr z,remove_enemy ;remove when at last frame
979 ld (hl),a ;next frame
982 ;--------------------------- moving enemies -----------------------------------
996 or a ;reset carry flag
1002 ld a,(hl) ;load y-position
1003 dec a ;decrease y-pos (=move up)
1004 ret m ;don't move off the screen (y<0)
1005 ld (hl),a ;save new y-pos
1008 ld a,(hl) ;load current y
1009 inc a ;increase y-pos
1010 cp 55 ;compare with bottom
1011 ret nc ;return if it has passed that line (>40)
1012 ld (hl),a ;otherwise save new position
1015 ;--------------------------- check collision ----------------------------------
1019 or a ;0 = you're normal
1022 ld de,(x) ;e = X, d = Y
1024 ld b,nrenemies ;check all 20 enemies
1029 jr z,check_next ;2 or 3 = ok
1035 ; ld hl,enemy00 ;enemy 1 specs
1039 ; ld b,0 ;bc = 4 * enemy nr.
1040 ; add hl,bc ;hl = enemy specs
1041 ; ld a,(hl) ;load size byte
1044 ; ld c,a ;save size in c
1047 ld a,(hl) ;check x match
1048 sub e ;enemy position minus yours
1055 ld a,(hl) ;check y match
1056 sub d ;same as with x-check
1065 ld a,(hl) ;load enemy type
1067 jr nz,collide ;enemy when <>0
1070 ld hl,your_pickup ;your pickups
1075 ld a,1 ;yes: reset to pickup 1
1078 call disp_icons ;display altered pickupicons
1081 dec hl ;to enemy occ
1082 xor a ;set to 0 = gone
1084 jr check_next ;all done, next..
1088 ld (hl),a ;explosionFrame 0
1091 ld (hl),a ;set to explode
1092 call damage_you ;auch!
1100 djnz check_collision
1103 ;--------------------------- show icon ----------------------------------------
1106 ld hl,VIDEO_MEM+(16*57);57 rows down = seven rows from bottom
1107 ld b,16*7 ;draw 16x (screen width) 7x (height)
1109 ld a,%00000000 ;blank line mask
1110 ld (hl),a ;draw one piece of the divider-line
1111 inc hl ;move right (8 pixels = 1 byte)
1112 djnz cleanline ;repeat (16bytes * 7rows * 8pixels)
1114 ld hl,VIDEO_MEM+(56*16)
1119 ld ix,spr_icon01 ;armorIcon
1120 ld de,$1a01 ;icon #1
1121 call putwidesprite ;display icon
1122 call disp_armor ;display value
1128 ld ix,spr_icon02 ;torpedoIcon
1130 ld de,$2a01 ;icon #2
1131 call putwidesprite ;display
1134 ld de,$3a01 ;icon #3
1137 ld ix,spr_icon00 ;emptyIcon
1141 ld ix,spr_icon04 ;laserIcon
1143 ld de,$4a01 ;icon #4
1146 ld ix,spr_icon00 ;emptyIcon
1147 ld a,(your_multiples)
1152 ld de,$5a01 ;icon #5
1155 ld a,(your_pickup) ;pickups taken
1157 ret z ;return if no pickups
1162 ld d,a ;y-pos = picks * $10 + $0a (1a,2a,3a,4a,5a)
1163 ld e,$01 ;x-pos = bottom (1a01,2a01,3a01,4a01,5a01)
1170 ld hl,$3926 ;Display Armor left
1171 ld (_penCol),hl ;place @ armorIcon
1172 ld a,(your_armor) ;load armor left
1173 add a,'0' ;make digit
1174 call _vputmap ;display char
1178 ld hl,$3900 ;display Lives
1179 ld (_penCol),hl ;bottom left
1186 ld a,(lives) ;nr of lives in a
1187 add a,'0' ;make digit
1190 call _vputs ;display on screen
1193 ;--------------------------- game over / new game / death ---------------------
1196 call _clrLCD ;clear screen
1198 ld (_curRow),hl ;center
1200 call _puts ;display "GAME OVER"
1205 call _getkey ;wait for keypress
1207 pop hl ;=ret (game_over was called from a procedure)
1208 ret ;quit to TI-OS or shell
1212 ld (score),a ;reset score
1214 ld (level),a ;reset level nr
1215 ld hl,level01 ;set level pointer to level#1
1216 ld (levelp),hl ;reset level pointer
1217 ld hl,lives ;starting lives
1218 ld (hl),4 ;3 lives (will be decreased @ You_die)
1222 dec (hl) ;decrease lives
1223 ld a,(hl) ;load lives left
1224 inc a ;if lives=0ffh then a=0
1225 jr z,game_over ;if so, game's over
1228 ld (your_armor),a ;no armor
1229 ld (torp_occ),a ;no torpedoes
1231 ld (your_laser),a ;no laser
1233 ld (your_pickup),a ;reset pickups
1234 ld (your_multiples),a ;no multiples
1237 ;--------------------------- next level ---------------------------------------
1240 ld hl,level ;level number
1241 inc (hl) ;increase it
1242 ld hl,(levelp) ;level pointer
1245 inc hl ;update to point to next level
1246 ld (levelp),hl ;save
1250 ld (nextevent),a ;time to first enemy appearance
1252 ld hl,(levelp) ;level pointer
1253 ld a,(hl) ;load new level-enemy type
1254 ld (eventenemy),a ;set level-enemy
1256 ld a,(hl) ;load new appearance-time
1257 ld (eventtime),a ;set
1259 ld a,(hl) ;load nr of enemies in this level
1260 ld (eventleft),a ;set nr of events left
1263 ld (timer),a ;reset time
1264 ld hl,your_occ ;hl = your_occ
1265 ld (hl),a ;reset your ship (not exploding)
1266 inc hl ;hl = your_inv
1267 ld (hl),50 ;set 50 frames invulnerable
1268 ld hl,x ;begin position x=...
1269 ld (hl),a ;...=a=0=left
1271 ld (hl),24 ;...=24=middle
1273 xor a ;reset previous positions
1274 ld hl,your_prevpos ;place all previous positions
1275 ld b,16 ;all 16 of them
1277 ld (hl),a ;set prev-x to 0
1279 ld (hl),24 ;set prev-y to 24
1281 djnz place_multiples ;repeat
1283 ;--------------------------- setup game ---------------------------------------
1286 call _clrLCD ;clear screen
1288 ld hl,VIDEO_MEM ;screen location (top left)
1289 ld b,0 ;b = 0 (loop 0-1 = 0FFh = 256 times)
1292 ld (hl),a ;clear four times (total = 256*4 = 1024 bytes)
1302 djnz clearloop2 ;repeat 256x
1305 ld (_curRow),hl ;center
1307 call _puts ;display "LEVEL "
1318 call _putc ;display second digit
1320 call _putmap ;display first digit
1323 ld (_curRow),hl ;display lives left below level nr
1324 ld hl,txt_lives ;bar text: "Lx0"...
1325 ld a,(lives) ;lives left
1326 add a,'0' ;make value
1327 ld (txt_lives+3),a ;add to text
1328 call _puts ;display the string
1333 call _getkey ;wait for keypress
1335 call _clrLCD ;clear screen
1336 call disp_icons ;display bottom icons
1338 ld hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom
1339 ld b,16 ;draw 16x (screen width)
1341 ld a,%11111111 ;horizontal line mask
1342 ld (hl),a ;draw one piece of the divider-line
1343 inc hl ;move right (8 pixels = 1 byte)
1344 djnz drawline ;repeat (16bytes * 8pixels =128= screen width)
1347 ;--------------------------- putsprite ----------------------------------------
1348 ;--------------------------- de =(X,Y) ----------------------------------------
1351 .db 128,64,32,%10000,%01000,%00100,%00010,%00001
1354 and %00000111 ;a = X mod 8 = bit nr. to mask
1355 ld hl,offsets_table ;pixel mask table
1358 add hl,bc ;add to table
1359 ld a,(hl) ;a = pixel mask
1360 ld (_smc1+1),a ;alter pixel mask
1362 ld hl,GRAPH_MEM ;save-location
1367 rl b ;b (=0) =b*2+overflow (if y>32 then bc=bc+256)
1368 add a,a ;y*16 (width of screen)
1369 rl b ;b=b*2+overflow (if y>64 then bc=bc+512)
1372 srl d ;d/8 (8 bits in byte) ** c is set when overflow
1373 add a,d ;a = (Y*16+X/8) mod 256
1374 jr nc,_n1 ;jump if no carry = no overflow = a<=255
1375 inc b ;a>255 so increase bc by 256
1376 _n1: ld c,a ;c = (Y*16+X/8) mod 256
1377 add hl,bc ;bc = Y*16+X/8
1381 _oloop: push bc ;Save # of rows
1382 push hl ;Save screen address
1384 ld c,(ix+2) ;Load one line of image
1386 _smc1: ld a,1 ;Load pixel mask
1387 _iloop: sla c ;Test leftmost pixel
1388 jr nc,_noplot ;See if a plot is needed
1389 ld e,a ;OR pixel with screen
1394 jr nc,_notedge ;Test if edge of byte reached
1395 inc hl ;Go to next byte
1398 pop hl ;Restore address
1399 ld bc,16 ;Go to next line
1401 pop bc ;Restore data
1405 ;--------------------------- putbigsprite -------------------------------------
1438 woloop: push bc ;Save # of rows
1439 push hl ;Save screen address
1441 ld c,(ix+2) ;Load one line of image
1443 wsmc1: ld a,1 ;Load pixel mask
1444 wiloop: sla c ;Test leftmost pixel
1445 jr nc,wnoplot ;See if a plot is needed
1446 ld e,a ;OR pixel with screen
1452 jr nc,wnotedge ;Test if edge of byte reached
1453 inc hl ;Go to next byte
1459 pop hl ;Restore address
1460 ld bc,16 ;Go to next line
1462 pop bc ;Restore data
1477 ;------------------------------------------------------------------------------
1478 ;------------------------------- sprites --------------------------------------
1479 ;------------------------------------------------------------------------------
1484 .db %01111000 ; ████
1485 .db %00111110 ; █████
1486 .db %01111001 ; ████ █
1487 .db %01111001 ; ████ █
1488 .db %01111001 ; ████ █
1489 .db %00111110 ; █████
1490 .db %01111000 ; ████
1494 .db 7,7 ;ship alpha class
1495 .db %01111000 ; ████
1497 .db %11111100 ; ██████
1498 .db %11110010 ; ████ █
1499 .db %11111100 ; ██████
1501 .db %01111000 ; ████
1503 .db 7,7 ;ship alpha class
1506 .db %01010100 ; █ █ █
1507 .db %10100010 ; █ █ █
1508 .db %01010100 ; █ █ █
1513 .db 7,7 ;ship beta class
1515 .db %11110000 ; ████
1516 .db %01111100 ; █████
1517 .db %01110010 ; ███ █
1518 .db %01111100 ; █████
1519 .db %11110000 ; ████
1522 .db 7,7 ;ship beta class
1525 .db %01010100 ; █ █ █
1527 .db %01010100 ; █ █ █
1533 .db %01111000 ; ████
1534 .db %11111100 ; ██████
1535 .db %11111100 ; ██████
1536 .db %01111000 ; ████
1539 .db 5,3 ;your bullets
1540 .db %00110000 ; ░▒▓█▒
1541 .db %11111000 ; ░▒▓████▒
1542 .db %00110000 ; ░▒▓█▒
1545 .db %11110000 ; ░▒▓███▒
1546 .db %11111000 ; ░▒▓████▒
1547 .db %11110000 ; ░▒▓███▒
1551 .db %11110000 ; ████
1555 .db 4,3 ;enemy bullets
1556 .db %01100000 ; ▒█▓▒░
1557 .db %11110000 ; ▒███▓▒░
1558 .db %01100000 ; ▒█▓▒░
1560 ;---------------------------------------- explosion -------------------------------------------
1566 .db %00111110 ; █████
1567 .db %01010110 ; █ █ ██
1573 .db %01001110 ; █ ▒███
1574 .db %10111110 ; █ █████
1575 .db %01001111 ; █ ▒████
1577 .db %00011010 ; ██ █
1580 .db %10110000 ; █ ██
1581 .db %01001110 ; █ ███
1582 .db %10110101 ; █ ██▒█▒█
1583 .db %01000101 ; █ ▒█▒█
1584 .db %00111110 ; █████
1585 .db %01011010 ; █ ██ █
1588 .db %00101010 ; ▒ █▒█ █
1589 .db %01000110 ; █ ▒██
1590 .db %10110101 ; █ ██ █ █
1591 .db %01100110 ; ██ ██▒
1592 .db %00111100 ; ████▒
1593 .db %01011001 ; █ ██ ▒█
1596 .db %01000000 ; █▒ ▒ ▒
1597 .db %00100101 ; ▒█ █▒█
1598 .db %00010100 ; ▒ ▒█ █ ▒
1599 .db %01000100 ; █▒ █
1600 .db %00010010 ; ▒█▒▒█
1601 .db %10011010 ; █▒ ██ █▒
1605 .db %00100000 ; ▒█ ▒ ▒
1606 .db %00000001 ; ▒ ▒ █
1608 .db %00100010 ; █▒ █
1609 .db %01001000 ; ▒█ ▒█ ▒
1612 .db %00001000 ; ▒ █▒
1613 .db %11000010 ; ██ ▒ █
1615 .db %00100000 ; ▒█ ▒
1616 .db %00000001 ; ▒ ▒█
1617 .db %00110000 ; ▒██▒
1621 .db %00000000 ; ▒▒ ▒
1625 .db %00100100 ; █▒ █
1627 ;--------------------------------------- bar -----------------------------------
1630 .db 16,7 ;unused .......:.......:
1631 .db %11111111,%11111111 ; ████████████████
1632 .db %11000000,%00000001 ; ██ █
1633 .db %11000000,%00000001 ; ██ █
1634 .db %11000000,%00000001 ; ██ █
1635 .db %11000000,%00000001 ; ██ █
1636 .db %11000000,%00000001 ; ██ █
1637 .db %11111111,%11111111 ; ████████████████
1639 .db 16,7 ;unused .......:.......:
1640 .db %10101010,%10101010 ; █ █ █ █ █ █ █ █
1641 .db %11010101,%01010101 ; ██ █ █ █ █ █ █ █
1642 .db %10101010,%10101010 ; █ █ █ █ █ █ █ █
1643 .db %11010101,%01010101 ; ██ █ █ █ █ █ █ █
1644 .db %10101010,%10101010 ; █ █ █ █ █ █ █ █
1645 .db %11010101,%01010101 ; ██ █ █ █ █ █ █ █
1646 .db %10101010,%10101010 ; █ █ █ █ █ █ █ █
1648 .db 16,7 ;armor ; .......:.......:
1649 .db %10001111,%10000000 ; █ █████
1650 .db %10010000,%01000000 ; █ █ █ ▒▒▒
1651 .db %10101110,%00100000 ; █ █ ███ █ ▒▒▒
1652 .db %10100111,%10100000 ; █ █ ████ █ ▒▒▒
1653 .db %10101110,%00100000 ; █ █ ███ █ ▒▒▒
1654 .db %10010000,%01000000 ; █ █ █ ▒▒▒
1655 .db %10001111,%10000000 ; █ █████
1657 .db 16,7 ;torpedo .......:.......:
1658 .db %10111000,%00010101 ; █ ███ █ █ █
1659 .db %10011100,%00010101 ; █ ███ █ █ █
1660 .db %10111000,%01001010 ; █ ███ █ █ █
1661 .db %10000000,%11101010 ; █ ███ █ █
1662 .db %11100001,%11100101 ; ███ ████ █ █
1663 .db %10011000,%11110101 ; █ ██ ████ █ █
1664 .db %11100110,%00110010 ; ███ ██ ██ █
1666 .db 16,7 ; .......:.......:
1667 .db %10000000,%01010100 ; █
1668 .db %10011110,%00101010 ; █
1669 .db %10111000,%00010101 ; █
1670 .db %10111111,%10101010 ; █
1671 .db %10111111,%00010101 ; █
1672 .db %10111000,%00101010 ; █
1673 .db %10011110,%01010100 ; █
1675 .db 16,7 ;laser .......:.......:
1676 .db %10000000,%00000000 ; █
1677 .db %10110010,%10000000 ; █ ██ █ █
1678 .db %10111011,%00000000 ; █ ███ ██
1679 .db %10011101,%11111111 ; █ ███ █████████
1680 .db %10111011,%00000000 ; █ ███ ██
1681 .db %10110010,%10000000 ; █ ██ █ █
1682 .db %10000000,%00000000 ; █
1684 .db 16,7 ;multiple .......:.......:
1685 .db %10000011,%10000000 ; █ ███
1686 .db %10000001,%11100111 ; █ ████ ███
1687 .db %10000001,%11100000 ; █ ████
1688 .db %10000011,%10000000 ; █ ███
1689 .db %10011000,%00000000 ; █ ██
1690 .db %10111100,%01110000 ; █ ████ ███
1691 .db %10011000,%00000000 ; █ ██
1693 ;---------------------------- texts -------------------------------------------
1695 txt_about: .db "v0.91.95 ","by Shiar "
1696 .db "(ICQ#43840958)",0
1697 txt_1player: .db "1 PLAYER",0
1698 txt_2players: .db "2 PLAYERS",0
1699 txt_level: .db "LEVEL ",0
1700 txt_gameover: .db "GAME OVER!",0
1701 txt_lives: .db "Lx0?",0
1702 txt_pressenter: .db "Enter to continue",0
1704 ;---------------------------- save data ---------------------------------------
1708 PutWhere .dw GRAPH_MEM ;where to put the wide sprites
1710 timer .db $00 ;frame counter
1711 level .db $00 ;level number
1712 levelp .dw level01 ;pointer to level data
1714 eventenemy .db $02 ;enemy type
1715 eventtime .db $15 ;enemy frequency
1716 eventleft .db $00 ;nr. of enemies still to come
1717 nextevent .db $50 ;time to next event
1722 your_occ .db $00 ;0=normal 1..16=exploding
1723 your_inv .db $50 ;invincibility left
1724 your_armor .db $13 ;HP left
1727 y .db $46 ;think about it..
1728 hp .db $00 ;hitpoints left
1730 your_laser .db $01 ;laser avail: 0=no, 1=yes
1731 your_multiples .db $00 ;multiples present
1732 torp_occ .db $00 ;torp.state: 0=unavail 1=avail 2=presnt
1733 torp_pos .dw $0000 ;torpedo position (x,y)
1735 ;---------------------------- enemy data --------------------------------------
1739 .db spr_enemy01-spr_enemy00
1740 .db spr_enemy02-spr_enemy00
1741 .db spr_enemy03-spr_enemy00
1742 .db spr_enemy04-spr_enemy00
1743 .db spr_enemy05-spr_enemy00
1744 .db spr_enemy06-spr_enemy00
1745 .db spr_enemy07-spr_enemy00
1749 .db %11111110 ; ███████
1750 .db %10011010 ; █ ██ █
1751 .db %11111110 ; ███████
1752 .db %10011010 ; █ ██ █
1753 .db %11111110 ; ███████
1755 .db 6,6 ;enemy type one
1756 .db %00111100 ; ████
1758 .db %11110000 ; ████
1759 .db %11110000 ; ████
1761 .db %00111100 ; ████
1763 .db 8,6 ;enemy type two
1764 .db %00111111 ; █████
1765 .db %01111000 ; ████
1766 .db %11111100 ; ██████
1767 .db %11111100 ; ██████
1768 .db %01111000 ; ████
1769 .db %00111111 ; █████
1771 .db 6,6 ;enemy type three
1772 .db %01111100 ; █████
1773 .db %11110000 ; ████
1774 .db %11111000 ; █████
1775 .db %11111000 ; █████
1776 .db %11110000 ; ████
1777 .db %01111100 ; █████
1779 .db 6,6 ;enemy type four
1781 .db %01111100 ; █████
1782 .db %11111000 ; █████
1783 .db %11111000 ; █████
1784 .db %01111100 ; █████
1787 .db 7,6 ;enemy type four
1788 .db %00011110 ; ████
1789 .db %01111110 ; ██████
1790 .db %11111100 ; ██████
1791 .db %11111100 ; ██████
1792 .db %01111110 ; ██████
1793 .db %00011110 ; ████
1795 .db 7,6 ;enemy type four
1797 .db %01111110 ; ██████
1798 .db %10111000 ; █ ███
1799 .db %10111000 ; █ ███
1800 .db %01111110 ; ██████
1803 .db 8,6 ;enemy type four
1804 .db %00011110 ; ████
1805 .db %01111111 ; ███████
1806 enemy00:.db %10011100 ; █ ███
1807 .db %10011100 ; █ ███
1808 .db %01111111 ; ███████
1809 .db %00011110 ; ████
1811 ;enemyInfo: %000000:HP %10:occ $00:type $00:app $00:unused
1812 enemy01: ;#1 HP:1 app:random
1814 enemy02: ;#2 HP:1 app:halflure
1816 enemy03: ;#3 HP:1 app:random moving
1818 enemy04: ;#4 HP:2 app:lure
1820 enemy05: ;#5 HP:2 app:random moving
1822 enemy06: ;#6 HP:2 app:lure moving
1824 enemy07: ;#7 HP:4 app:halflure moving
1827 ;----------------------------- level info -------------------------------------
1830 .db $01,$1b,$2f ;enemy nr ; enemy frequency ; next lvl
1831 level02: ;frequency must be odd if halfluring!
1844 ;----------------------------- logo -------------------------------------------
1847 .db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011,%11111111,%11111111,%11111111,%11111000
1848 .db %01111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00011011,%11111111,%11111111,%11111111,%11110000
1849 .db %00111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00111011,%11111111,%11111111,%11111111,%11100000
1850 .db %00011111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%01111011,%11111111,%11111111,%11111111,%11000000
1851 .db %00000000,%00000000,%00000001,%00011110,%00010000,%00000000,%10000001,%00011110,%00010000,%000000001,%00000000,%00001000,%01000000,%00000000,%00000000,%00000000
1852 .db %00000000,%00000000,%00000011,%00011110,%00110000,%00000001,%10000011,%00011110,%00110000,%000000011,%00000000,%00011000,%11000000,%00000000,%00000000,%00000000
1853 .db %00000000,%00000000,%00000111,%00011110,%01110000,%00000011,%10000111,%00011110,%01110000,%000000111,%00000000,%00111001,%11000000,%00000000,%00000000,%00000000
1854 .db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
1855 .db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
1856 .db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
1857 .db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
1858 .db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
1859 .db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
1860 .db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
1861 .db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
1862 .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000111,%11010001
1863 .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00011011
1864 .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010101
1865 .db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00010001
1867 ;----------------------------- end --------------------------------------------
1872 ;----------------------------- NEMESIS'86 by Shiar ----------------------------
1874 ;Game · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · NEMESIS
1875 ;Version · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 0.9.94
1876 ;Latest modification · · · · · · · · · · · · · · · · · · · · · · · · · 4.IX.99
1877 ;Calc · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · TI-86 only
1878 ;Size · · · · · · · · · · · · · · · · · · · · · · · · · · · 2694 bytes on calc
1880 ;Author · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · SHIAR
1881 ;ICQ · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · #43840958
1882 ;E-mail · · · · · · · · · · · · · · · · · · · · · · · · · · shiar0@hotmail.com
1883 ;Homepage · · · · · · · · · · · · · · · · · · coming soon (www.wish.net/~shiar)
1886 ; <*> This game is not yet finished (BETA) and there may still be some bugs.
1887 ; <*> Source will be released when the game has been finished.
1888 ; <*> Have fun, and have even more fun with the completed version of NEMESIS!
1890 ;----------------------------- version history --------------------------------
1892 ;0.01.717 -- 17.VII.99 -- size 909
1894 ; + used "Galaxian"-game engine (drawings, movement, enemy-routines)
1895 ; + movement of ship over 3/4 screen (96 pixels; 32 pixels for score)
1896 ; + enemies moving from right to left, appearing right at specified times
1898 ; 0.1.718 -- 18.VII.99 -- size 832
1900 ; # no crash when level restarts for the third time
1901 ; * exit-procedure updated, unnecessary stuff/keychecks removed
1902 ; - alot of unused code removed
1903 ; + different types of enemies (just look different)
1904 ; + collision detection!! enemy ships disappear when you hit them
1906 ; 0.2.718 -- 18.VII.99 -- size 1078
1908 ; + ability to fire bullets (F1). Enemies disappear on impact
1909 ; * enemies explode instead of disappearing
1911 ; 0.3.719 -- 19.VII.99 -- size 1326
1913 ; * bullets appear correctly (not INSIDE your ship)
1914 ; + some enemies can take multiple hits (differs per class)
1915 ; + all enemies fire bullets at random
1916 ; + if you're hit by bullet/enemy, you'll lose one hitpoint
1918 ; 0.4.720 -- 20.VII.99 -- size 1406
1920 ; # collision detection fixed and optimized (much faster now!)
1921 ; + shell-icon added (YAS type)
1922 ; * code optimizations, some data "compression"
1923 ; * explosion looks better, and some vars removed/smaller
1924 ; # enemies are removed when at left side (instead of becoming invisible)
1925 ; + displays level number before each level begins
1927 ; 0.5.725 -- 25.VII.99 -- size 1703
1929 ; * waits a sec at level display (in case of accidental keypress)
1930 ; * moving enemies (move up+down)
1931 ; # bullets removed correctly so they can be used again later
1932 ; * first level made
1933 ; # enemy weaponfire is fired from correct positions
1934 ; + your ship explodes on impact with ships/bullets
1935 ; * game over screen will be displayed just *after* your ship's gone
1936 ; + frame counter onscreen
1938 ; 0.6.820 -- 20.IIX.99 -- size 2077
1940 ; * play field increased to full screen instead of 3/4
1941 ; + bottom eight lines used for score (etc) display
1942 ; - no more solid levels, enemies are placed at random
1943 ; + enemies appear every x turns (depends on level)
1944 ; # fixed bullets so they don't disappear at 3/4 of the screen
1945 ; * A LOT of optimizations both in speed and size!!
1946 ; + enemy type, frequency, and number specified per level
1947 ; + bottom score bar displays score, lives and icons (to be used later)
1948 ; * smarter enemy handling (so enemies have different sizes)
1949 ; + bottom bar divided from playing field by a horizontal line
1950 ; + five levels (and five enemies) made
1951 ; # game vars reset at start and game over
1952 ; + NEMESIS LOGO displayed at startup!! (also, program grew 350bytes ):
1953 ; + version/credits string displayed below logo: v0.6.820 by shiar (ICQ#)
1955 ; 0.6.825 -- 25.IIX.99 -- size 2085
1957 ; # pointer to fifth ship corrected (ships in level 5 weren't displayed)
1958 ; # calc doesn't crash anymore when game is continued after game over!!
1959 ; + lives are decreased when ship is destroyed
1960 ; # last eight pixels of divider line are shown correctly now
1962 ; 0.7.92 -- 02.IX .99 -- size 2303
1964 ; + contrast is increased one level at startup (and restored on exit)
1965 ; + invulnerable for a sec when you enter the game (inv-pickup later)
1966 ; + when in invulnerable-mode, your ship look different!
1967 ; + at the beginning you get three *hitpoints* so you can be hit 3 times
1968 ; * bottomline icons are now 16 pixels wide and 7 pixels high!
1969 ; + hitpoint icon added: displays nr. of hps left next to a nice picture
1970 ; * maximum invulnerability-time is increased (can last upto 1024 frames)
1971 ; + when invulnerable-mode has nearly expired, your ship flashes!
1972 ; * again a lot of optimizations esp. in size ('bout 100 bytes)
1973 ; + pickups! 10% chance a destroyed enemy changes into an armor-pickup
1974 ; # code optimization caused some bullets to reappear as "fake" bullets
1975 ; * pickups can't be destroyed by bullets (they pass right through it)
1977 ; 0.8.93 -- 03.IX .99 -- size 2433
1979 ; + enemies move individually, not all at the same time!! Looks very nice
1980 ; # titlescreen background is cleared (looked weird in Rascall and TI-OS)
1981 ; + enemies fire at a ### rate instead of firing at will (too random)
1982 ; # moving enemies don't move off the screen top/bottom (they wait there)
1983 ; + seven playable levels going easy to hard (including moving enemies)
1984 ; # xtraInfo data wasn't reset when a moving enemy entered the game
1985 ; * longer delay when level is completed (NextLevel screen came too soon)
1987 ; 0.9.94 -- 04.IX .99 -- size 2693
1989 ; # pickups no longer fire bullets like normal enemies
1990 ; + <halt>s added so the game runs slower and looks better
1991 ; + TORPEDOES!!! Bullets that fire downwards! Just like in Nemesis
1992 ; * a pickup selects the next icon on bottom bar instead of increasing hp
1993 ; + an icon can be taken by pressing F2. second icon selects torpedoes
1994 ; + first icon increases armor, icon 3 and 4 are unused for now
1995 ; * selecting an unused icon (3+4) resets pickups like icon 1 and 2
1996 ; * when you're destroyed, you loose one life instead of going game over
1997 ; you also loose all upgrades and pickups, but remain in the same level
1998 ; * random is more randomized, no more "tricks" to fool the randomizer
1999 ; # after game over the game is terminated instead of continuing+crashing
2000 ; - no more armor to start with. you'll have to collect them on your own
2001 ; * of course optimizations and a few tiny bug fixes (not important)
2002 ; * increased the size of the enemy bullets so they're better to see
2004 ; 0.91.95 -- 05.IX .99 -- size 2797
2006 ; + LASERS!!!!! four pickups and you fire laserbeams instead of bullets
2007 ; * multiple enemies can be hit at once, very usefull when firing lasers
2008 ; + MULTIPLE!! like the (shadow-)multiple from MSX-Nemesis. for 5 pickups
2009 ; you get an multiple following you, firing bullets and lasers like you
2010 ; * most data (enemy positions) stored at TEXT_MEM and DELC_LEN positions
2011 ; instead of in program, saving A LOT of bytes in program-size
2012 ; - at release of 0.91 bullets didn't work, laser is used instead
2015 ; + added - removed * changed # bug fixed