version 0.9 (public beta): upgrade select (armor, torpedoes), readme
[nemesis.git] / nemesis.z80
index cb0f3eb21bea232724637aff9ddf31d64a9177db..cefd4d00cb14c4ef106b40a141b55a6002b91fea 100644 (file)
@@ -1,32 +1,64 @@
        .include "asm86.h"
        .include "ti86asm.inc"
-       .include "ti86abs.inc"
 
        .org _asm_exec_ram
 
+TEXT_MEM = _textShadow
+
        nop
-       jp  Start
-       .dw $0001
-       .dw Title
-       .dw spr_ship
-Title: .db "Nemesis v0.5.725 by Shiar",0
-Start:
-       jr init
+       jp  init
+       .dw $0001               ;description type 2 (= +YASicon)
+       .dw Title               ;pointer to description
+       .dw spr_ship            ;pointer to YAS icon
+
+Title: .db "Nemesis v0.9.94 by Shiar",0
 
-just_fired     = $c0f9         ;byte
-temp1          = $c100         ;word
+just_fired     = TEXT_MEM      ;byte
+temp1          = TEXT_MEM+1    ;word
+RanPos         = TEXT_MEM+3    ;byte
 
 ;---------------------- init --------------------------------------------------
 
 init:
-       call _runindicoff
+       call _runindicoff       ;turn the run-indicator off, obviously
+       call _clrLCD            ;clean the screen
+
+       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 ---------------------------------------------
 
-;---------------------- game setup --------------------------------------------
+LogoPut:
+       ld hl,logo_nemesis      ;from...
+       ld de,VIDEO_MEM+16      ;...to one line from top
+       ld a,19                 ;19 rows
+LogoLoop:
+       ld bc,16                ;set screen width
+       ldir                    ;display one line
+       dec a                   ;decrease line-counter
+       jr nz,LogoLoop          ;repeat when counter is not yet zero
+
+menutext:
+       ld  hl,$1608            ;just below logo
+       ld  (_penCol),hl
+       ld  hl,txt_about        ;display "by Shiar (ICQ#43840958)"
+       call _vputs
+
+       ld  hl,$0705            ;located one row above bottom
+       ld  (_curRow),hl        ;go there
+       ld  hl,txt_1player      ;display "ONE PLAYER"
+       call _puts
+       ld  hl,$0706            ;below oneplayer text
+       ld  (_curRow),hl
+       ld  hl,txt_2players     ;display "TWO PLAYERS"
+       call _puts
 
-play_game:
-       call Next_level
+       call _getkey            ;wait for keypress
+       call New_game           ;prepare level
 
 ;------------------------------------------------------------------------------
 ;---------------------- game loop ---------------------------------------------
@@ -34,29 +66,36 @@ play_game:
 
 game_main_loop:
        ld  hl,timer            ;update time
-       inc (hl)
+       inc (hl)                ;increase by 1
+       ld  b,(hl)              ;new time
+
+       ld  hl,RanPos           ;random counter
+       ld  a,(hl)              ;random value
+       add a,b                 ;even more random by adding timer
+       ld  (hl),a              ;save even more random value back
 
 Clear_screen:
-       xor a
-       ld  hl,GRAPH_MEM+(16*12)
-       ld  b,a
+       xor a                   ;empty bitmask
+       ld  hl,GRAPH_MEM        ;screen location (top left)
+       ld  b,$E0               ;loop 0E0h = 224 times = 256-32 for score-bar)
 clearloop:
+       ld  (hl),a              ;clear four times (total = 224*4 = 896 bytes)
+       inc hl
        ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
-       djnz clearloop
+       djnz clearloop          ;repeat 224x
 
 check_exitkey:
        ld  a,%00111111         ;<exit> pressed?
        out (1),a
-       nop
-       nop
+       nop \ nop
        in  a,(1)
-       bit 6,a
-       jr  z,quit              ;yes: quit game
+       bit 6,a                 ;test bit 6 = <EXIT>
+        jr  z,quit              ;yes: quit game
 
 game_stuff:
        call Level_event        ;insert enemies
@@ -64,38 +103,54 @@ game_stuff:
        call Fire_bullet        ;check for fire
        call Handle_enemies     ;move enemies
        call Handle_bullets     ;move your bullets
+       call Handle_torp        ;move your torpedo
        call Enemy_bullets      ;move enemy bullets
        call Enemies_hit        ;check for collision with enemies
 
        call Display_Screen     ;display all
-       halt \ halt \ halt      ;delay
+       halt ;\ halt            ;delay
        jr   game_main_loop     ;loop
 
-quit:  ret
+;--------------------------- exit ---------------------------------------------
+
+quit:
+       ld  a,(CONTRAST)        ;load original contrast level
+       out (2),a               ;and set it back
+       ret                     ;quit Nemesis :(
 
-;---------------------- display -----------------------------------------------
+;--------------------------- display ------------------------------------------
 
 Display_Screen:
-       ld  a,64                ;Display Image
-       ld  hl,GRAPH_MEM+(16*12)
-       ld  de,$fc00
+       ld  hl,GRAPH_MEM        ;from storage (top left)
+       ld  de,VIDEO_MEM        ;to screen (top left)
+       ld  a,56                ;display height = 64 bytes (minus 8 for bar)
 displayloop:
-       ld  bc,12
-       ldir
-       inc de
-       inc de
-       inc de
-       inc de
-       dec a
-       jr  nz,displayloop
+       ld  bc,16               ;display width = 16 bytes (16*8bits=256pixels)
+       ldir                    ;16x de >> hl
+       dec a                   ;next line
+       jr  nz,displayloop      ;loop 64x
 
-       ld  hl,$1006            ;Display Score
-       ld  (_curRow),hl
+       ld  hl,$396b            ;Display Score
+       ld  (_penCol),hl        ;bottom right of screen
        ld  hl,(timer)
        ld  h,0
-       jp  _D_HL_DECI
+
+_D_HL_DECI:            ;------- display 5-digit value -------
+       ld   de,savestr+4       ;savenr saves number string
+       ld   b,5                ;five digits
+ldhld: call UNPACK_HL          ;one digit of hl
+       add  a,'0'              ;make number
+       ld   (de),a             ;save into savenr
+       dec  de                 ;point to next digit
+       djnz ldhld              ;repeat for all digits
+
+       ld   hl,savestr
+       call _vputs             ;display string
        ret
 
+savestr:
+       .db "SHIAR",0
+
 ;------------------------- handle ship ----------------------------------------
 
 Handle_Ship:
@@ -108,8 +163,8 @@ Handle_Ship:
 
        cp  34                  ;last explosion frame?
        jr  c,exploding_you     ;not yet: display explosion
-       cp  54                  ;delay finished?
-       jp  z,game_over         ;yes = game over
+       cp  40                  ;delay finished?
+       jp  z,You_die           ;yes = game over
        ret                     ;don't display anything
 
 ok:
@@ -117,46 +172,63 @@ ok:
        out (1),a
        ld  hl,y
        in  a,(1)
-       rra
-       ld  b,a
+       rra                     ;rotate right (put last bit in c)
+       ld  b,a                 ;we need a
 
        jr  c,no_down
        ld  a,(hl)
-       inc a
-       cp  73                  ;y < 73
+       cp  49                  ;55-6 = bottom of screen
        jr  z,no_down
+       inc a
        ld  (hl),a
 no_down:
        dec hl
-       rr  b
+       rr  b                   ;because we now use b, it's rr instead of rra
        jr  c,no_left
        ld  a,(hl)
-       dec a
-       jr  z,no_left           ;x > 0
+       sub 1                   ;<dec a> doesn't affect c-flag
+       jr  c,no_left           ;-1 = left side
        ld  (hl),a
 no_left:
-       rr b   
+       rr  b   
        jr  c,no_right
        ld  a,(hl)
-       inc a
-       cp  89                  ;x < 89
+       cp  121                 ;127-6 = right side
        jr  z,no_right
+       inc a
        ld  (hl),a
 no_right:
-       ld d,(hl)
+       ld  d,(hl)
        inc hl
        rr  b
        jr  c,no_up
        ld  a,(hl)
-       dec a
-       cp  15                  ;y > 15
-       jr  z,no_up
-       ld  (hl),a
-no_up: ld  ix,spr_ship01
-
-display_common:
-       ld  e,(hl)
-       jp  drw_spr             ;ret
+       sub 1                   ;<dec a> doesn't affect carry-flag
+       jr  c,no_up             ;-1 = top of screen
+       ld  (hl),a              ;save new y
+
+no_up: ld  e,(hl)
+       ld  ix,spr_ship01       ;ship sprite
+       ld  hl,your_inv         ;invulnerable?
+       ld  a,(hl)              ;load time in a
+       or  a                   ;is it 0?
+       jp  z,putsprite         ;yes so ship = normal (display \ ret)
+
+       ld  b,a                 ;save inv-time
+       ld  a,(timer)           ;load frame nr.
+       and %00000011           ;a=0 once every four frames
+       jr  nz,not_time         ;a<>0 = not time to update counter
+       dec (hl)                ;decrease inv-time left
+not_time:
+       and %00000010           ;a switches 0<->1 every 2 frames
+       jr  z,no_flicker        ;don't show normal sprite anyway
+       ld  a,b                 ;pop inv-time
+       and %11110000           ;inv-time <16 ticks left?
+       jp  z,putsprite         ;yes: display normal sprite
+
+no_flicker:
+       ld  ix,spr_ship01i      ;display inv-ship (ld ix is faster than add ix)
+       jp  putsprite           ;ret
 
 exploding_you:
        srl a                   ;half the framerate
@@ -175,32 +247,70 @@ explosion_stuff:
        inc hl
        ld  d,(hl)
        inc hl
-       jr  display_common
+       ld  e,(hl)
+       jp  putsprite
 
 damage_you:
-       ld  a,1                 ;set to explode (1st frame)
-       ld  (your_occ),a
+       ld  a,(your_inv)        ;invulnerability left?
+       or  a
+       ret nz                  ;return if inv>0
+       ld  hl,your_armor       ;armor left
+       ld  a,(hl)              ;check
+       dec a                   ;is it 0?
+       jp  m,no_armor          ;yes, 0hp left so explode
+       ld  (hl),a              ;no, so save decreased hp
+       call disp_armor         ;and display new value
+       ret                     ;and return
+no_armor:
+       ld  a,%01               ;occ %xxxxxx01 = explode
+       ld  (your_occ),a        ;set to explode
        ret
 
 ;------------------------- fire bullet ----------------------------------------
 
 Fire_bullet:
-       ld  a,%00111111
-       out (1),a
-       ld  a,(your_occ)
-       or  a
+       ld  a,(your_occ)        ;are you 100% OK?
+       or  a                   ;a=0??
        ret nz                  ;return if not normal stat
-       ld  hl,just_fired
-       in  a,(1)
-       bit 4,a
-       jr  z,fire              ;fire pressed?
-       ld  (hl),0              ;not fired
-       ret
 
-fire:  ld  a,(hl)
-       or  a                   ;can't fire when 1
-       ret nz
-       ld  (hl),1              ;just fired
+       ld  a,%00111111         ;function keys (F1-F5)
+       out (1),a               ;ask for them
+       nop \ nop               ;delay 8 clocks
+       in  a,(1)               ;get zem!
+       bit 4,a                 ;test bit 4 = F1-key
+       jr  z,fire              ;fire pressed?
+       ld  hl,just_fired
+       ld  (hl),0              ;no: reset just_fired
+       bit 3,a                 ;test bit 3 = F2-key &&&
+       ret nz                  ;return if not
+
+select:
+       ld  hl,your_pickup      ;select pickups
+       ld  a,(hl)              ;load pickups taken so far
+       dec a                   ;is it 1?
+       jr  nz,select2          ;no, carry on
+       ld  (hl),a              ;reset pickups
+       ld  hl,your_armor       ;change armor
+       inc (hl)                ;increase HPs by one
+       jp  disp_icons          ;display and return
+select2:
+       dec a                   ;is it 2?
+       jr  nz,select3          ;no, carry on
+       ld  (hl),a              ;reset pickups
+       inc a                   ;a=1
+       ld  (torp_occ),a        ;ready torpedoes
+       jp  disp_icons          ;display 'n return
+select3:
+       ld  (hl),0              ;reset pickups
+       jp  disp_icons          ;display n return
+
+fire:  ld  hl,RanPos           ;random
+       inc (hl)                ;update random counter
+       ld  hl,just_fired
+       ld  a,(hl)              ;just_fired
+       or  a                   ;zero when key just pressed (not already in)
+       ret nz                  ;return when already pressed
+       inc (hl)                ;set just_fired to 1
 
        ld  hl,ybullets
        ld  de,3
@@ -215,14 +325,26 @@ find_ybullet:
 
 found_ybullet:
        ld  (hl),1              ;use bullet
-       inc hl
-       ld  a,(x)
-       add a,5
+       ld  a,(x)               ;your x-pos
+       add a,5                 ;place bullet in front of you
+       inc hl                  ;go to bullet-x
        ld  (hl),a              ;set x
-       ld  a,(y)
-       add a,2
-       inc hl
+       ld  e,a                 ;save torp-x in e
+
+       ld  a,(y)               ;your y-pos
+       add a,2                 ;place bullet at the middle of your ship
+       inc hl                  ;go to bullet-y
        ld  (hl),a              ;set y
+       add a,3                 ;place torpedo at bottom of ship
+       ld  d,a                 ;save torp-y in d
+
+       ld  hl,torp_occ         ;torpedo...
+       ld  a,(hl)              ;load torpInfo
+       dec a                   ;do you have (unused) torpedoes?
+       ret nz                  ;nope (a must be 1)
+       ld  (hl),2              ;yes; use torpedo
+       ld  (torp_pos),de       ;save torpedo position (in de)
+
        ret
 
 ;------------------------ handle bullets --------------------------------------
@@ -241,31 +363,32 @@ scan_bullets:
        ld  (temp1),hl
        ld  a,(hl)
        inc hl
-       dec a
-       call z,bullet_type1
+       dec a                   ;type 1?
+       call z,bullet_2left     ;yes: 2left
        pop hl
        pop bc
        ld  de,3
-       add hl,de
-       djnz scan_bullets
+       add hl,de               ;3 x <inc hl>
+       djnz scan_bullets       ;next bullet (loop)
        ret
 
-bullet_type1:
+bullet_2left:
        ld  a,(hl)              ;d = X
-       inc a                   ;move right
-       cp  $5a                 ;off screen?
-       jr  z,remove_bullet
-       inc a                   ;move right
-       cp  $5a                 ;off screen?
-       jr  z,remove_bullet
+       cp  122                 ;off screen? (x>128-5)
+       jr  nc,remove_bullet
+       add a,2                 ;move 2 2 the right
        ld  (hl),a              ;save new pos.
        ld  d,a
-       inc hl
+
+       inc hl                  ;to y-pos
        ld  e,(hl)              ;e = Y
+
        ld  ix,spr_bullet01
        push de
-       call drw_spr            ;display bullet
+       call putsprite          ;display bullet
        pop de
+
+check_bullethits:              ;INPUT: de=X,Y
        ld  b,nrenemies
        ld  hl,enemies
 
@@ -276,7 +399,11 @@ hit_enemies:                       ;Hits with normal enemies
        and %00000010
        jr  z,nohit             ;no hit when enemy_occ <> 2/3
 
-       inc hl
+       inc hl                  ;enemy type
+       ld  a,(hl)
+       or  a                   ;enemy #0 = pickup
+       jr  z,nohit             ;yes: don't destroy
+
        inc hl
        ld  a,(hl)              ;check x
        sub d
@@ -293,10 +420,9 @@ hit_enemies:                       ;Hits with normal enemies
        cp  10
        jr  nc,nohit
 
-       xor a
        push hl
        ld  hl,(temp1)
-       ld  (hl),a              ;remove bullet
+       ld  (hl),$00            ;remove bullet
        pop hl
 
        dec hl
@@ -304,12 +430,19 @@ hit_enemies:                      ;Hits with normal enemies
        dec hl
        ld  a,(hl)              ;occ
        ld  b,a                 ;push occ
-       srl a
-       srl a                   ;occ/4 = HP left
-       jr  nz,hpleft
-       ld  (hl),$01            ;set to explode
+       and %11111100           ;occ/4 = HP left        ;<srl a\srl a
+       jr  nz,hpleft           ;not zero -> jump
+       ld  (hl),%01            ;set to explode
+
+       ld  a,(RanPos)          ;use random var
+       and %01011011           ;matches 0 100/2/2/2/2/2=3% of the time
+       jr  nz,pickupdone       ;otherwise just explode
+       ld  (hl),%00000110      ;change it into a pickup (with 2 HP)
+pickupdone:
        inc hl
-       ld  (hl),a              ;explosionFrame 0
+       ld  b,(hl)              ;save enemy type
+       ld  (hl),$00            ;explosionFrame 0
+
        pop hl
        ret
 
@@ -320,7 +453,8 @@ hpleft:
        pop hl
        ret
 
-nohit: pop hl
+nohit:
+       pop hl
        inc hl
        inc hl
        inc hl
@@ -328,17 +462,64 @@ nohit:    pop hl
        djnz hit_enemies        ;check next enemy
        ret
 
+;--------------------------- handle torpedo -----------------------------------
+
+Handle_torp:
+       ld  a,(torp_occ)
+       sub 2
+       ret m                   ;return if occ=0/1
+
+       ld  hl,torp_pos         ;x-position
+       ld  a,(hl)              ;load in a
+       inc a                   ;move right
+       cp  125                 ;right edge reached
+       jr  nc,remove_torp      ;remove if x>125
+       ld  (hl),a              ;save new x
+       ld  d,a
+
+       inc hl                  ;y-position
+       ld  a,(hl)
+       inc a                   ;move down
+       cp  56                  ;bottom reached
+       jr  nc,remove_torp      ;remove if y>40
+       ld  (hl),a              ;save new y
+       ld  e,a
+
+       ld  ix,spr_bullett1
+       push de
+       call putsprite          ;display torpedo
+       pop de
+       jr check_bullethits     ;check for hits with enemies
+
+remove_torp:
+       ld  a,1
+       ld  (torp_occ),a
+       ret
+
 ;--------------------------- level events -------------------------------------
 
 Level_event:
-       ld  a,(nextevent)
-       dec a
-       ld  (nextevent),a
-       or  a
-       ret nz
+       ld  hl,nextevent        ;time to next event     <ld  a,(nextevent)
+       dec (hl)                ;decrease counter       <dec a
+       ld  a,(hl)              ;look at counter        <ld  (nextevent),a
+       or  a                   ;has it reached zero?
+       ret nz                  ;nope: get outta here!
+
+       ld  a,(eventtime)       ;enemy frequency (lvl)
+       ld  (nextevent),a       ;set time to next event
+       ld  hl,eventleft
+       dec (hl)                ;update enemy-counter
+
+       ld  a,(hl)              ;look at counter
+       or  a                   ;has it reached 0?
+       jp  z,Next_level        ;yes: level finished
+       dec a                   ;has it reached 1?
+       jr  nz,do_event         ;nope: wait for enemies to leave
+       inc hl                  ;nextevent located behind eventleft
+       ld  (hl),119            ;set delay
+       ret                     ;don't place any more enemies
 
 do_event:
-       ld  hl,(curevent)
        ld  de,enemies-4
 chk_noenemy:
        inc de
@@ -349,47 +530,73 @@ chk_noenemy:
        or  a                   ;0 = no enemy present
        jr  nz,chk_noenemy
 
-       ld  a,(hl)              ;type
-       ld  hl,enemy01
-       ld  c,a
-       ld  b,0
-       add hl,bc
-       add hl,bc
+place_enemy:
+       ld  a,(eventenemy)      ;enemy type to place (lvl)
+       ld  hl,enemy00          ;enemy 1 specs
+       add a,a                 ;a=type*2
+       add a,a                 ;a=type*4
+       ld  c,a                 ;c=type
+       ld  b,0                 ;bc = enemy nr.
        add hl,bc               ;hl = enemy specs
        ld  a,(hl)              ;load hitpoints+occ of this enemy class
        ld  (de),a              ;occ
 
-       inc hl
-       inc de
+       inc hl                  ;next enemyInfo byte
+       inc de                  ;next byte of current enemy
        ld  a,(hl)              ;load movement+type of this enemy class
-       ld  (de),a              ;type
-
-       inc de
-       ld  a,$5a               ;appear at right edge of screen
-       ld  (de),a              ;x
-       inc de
-
-       ld  hl,(curevent)
-       inc hl
-       ld  a,(hl)
-       ld  (de),a              ;y
-
-       inc hl                  ;@ next event
-       ld  a,(hl)
-       cp  $ff                 ;255 = end marker
-       jp  z,Next_level
-       ld  (nextevent),a       ;else time to next event
-
-       inc hl
-       ld  (curevent),hl       ;update pointer
-
-       or  a                   ;no delay
-       jr  z,do_event
-       ret                     ;no more events for now
+       ld  (de),a              ;enemy type
+
+       inc de                  ;set x-pos
+       ld  a,122               ;appear at right edge of screen (128-6)
+       ld  (de),a              ;= x-position
+
+       inc de                  ;set y-pos
+       inc hl                  ;where to place??
+       ld  a,(hl)              ;load placeInfo
+       dec a                   ;is it 1?
+       jr  z,random_enemy      ;yes: create random value <51 in a
+       dec a                   ;is it 2?
+       jr  z,lure_enemy        ;yes: create a 100% luring enemy
+                               ;otherwise?
+halflure_enemy:                        ;yes (of course it is): pick one (50% lure)
+       ld  a,(timer)           ;look at frame-number
+       and %00000001           ;make random if odd frame nr.
+       jr  nz,random_enemy     ;1st possibility: random enemy
+lure_enemy:                    ;2nd possibility: luring enemy
+       ld  a,(y)               ;place at same y-pos as YOUR ship
+       jr  ypos_OK
+
+random_enemy:
+       call Random             ;make a (in a) random value 0-255
+       cp  51                  ;y may not be more than 51
+       jr  c,ypos_OK           ;OK if a<51
+       and %00111111           ;a = 0..63
+       sub 13                  ;a = -13..50
+       jr  c,random_enemy      ;not OK if a<0
+
+ypos_OK:                       ;random value successfully created
+       ld  (de),a              ;save y-position
+
+       ld  hl,add2enemy-3      ;offset to xtra enemy info
+       add hl,de               ;hl points to <xtra info: move>
+       ld  (hl),1              ;set move-counter to 1
+       inc hl                  ;hl to <xtra info: fire>
+       ld  (hl),1              ;set time-to-fire to 1 frame (fires directly)
+       ret                     ;return
+
+Random:
+       ld  a,(RanPos)          ;a handy random-var.
+       ld  hl,x                ;add your x-coord for randomness
+       adc a,(hl)
+       ld  hl,y                ;add your y-coord for randomness
+       adc a,(hl)
+       ld  (RanPos),a          ;save altered random-var
+       ret                     ;RanPos also in #a
 
 ;--------------------------- enemy fires --------------------------------------
 
 Enemy_fires:                   ;de = x,y
+       push de
        dec d
        dec d                   ;d = x-2
        inc e                   ;e = y+1
@@ -400,18 +607,17 @@ find_ebullet:
        ld  a,(hl)
        or  a
        jr  z,found_ebullet     ;0 = not used
-       inc hl
-       inc hl
-       inc hl
+       inc hl \ inc hl \ inc hl
        djnz find_ebullet       ;look next bullet
        ret
 
 found_ebullet:
-       ld  (hl),1              ;use bullet
+       ld  (hl),1              ;use bullet &&&
        inc hl
        ld  (hl),d              ;set x-pos
        inc hl
        ld  (hl),e              ;set y-pos
+       pop de
        ret         
 
 ;----------------------------- enemy bullets ----------------------------------
@@ -422,32 +628,43 @@ Enemy_bullets:
 handle_bullet:
        push bc
        push hl
-       ld  a,(hl)
-       or  a
-       jr  nz,enemy_bullet
+       ld  a,(hl)              ;load bulletType in a
+       or  a                   ;is it 0?
+       jr  nz,enemy_bullet     ;no: handle bullet
 next_bullet:
-       pop hl
+       pop hl                  ;do not move the <pop hl>
        pop bc
-       inc hl
-       inc hl
-       inc hl
+       inc hl \ inc hl \ inc hl
        djnz handle_bullet
        ret
 
 enemy_bullet:
-       inc hl
-       ld  a,(hl)              ;bullet x
-       dec a
-       jp  m,remove_ebullet    ;off screen?
-       jr  z,remove_ebullet    ;"
-       dec a                   ;move left
-       ld  (hl),a
-       ld  d,a                 ;d=x
-       inc hl
+       ld  b,a                 ;save type
+       inc hl                  ;bullet x
+       ld  a,(hl)              ;check if it has reached the left side of scrn
+       and %11111110           ;it is <2 (0 or 1)?
+       jr  z,remove_ebullet    ;yes, remove bullet
+       dec (hl)                ;move one left
+       dec (hl)                ;and another one
+       ld  d,(hl)              ;d=x
+       inc hl                  ;@y
+
+       ld  a,b                 ;restore type
+       dec a                   ;type 1?
+       jr  z,ebullet_common    ;normal bullet
+
+ebullet_down:
+       ld  a,(timer)
+       rra
+       jr  c,ebullet_common
+       inc (hl)
+
+ebullet_common:
        ld  e,(hl)              ;e=y
-       ld  ix,spr_bullet11     ;display enemy bullet
-       call drw_spr
+       ld  ix,spr_bullete1     ;display enemy bullet
+       call putsprite
 
+ebullet_hits:
        ld  a,(your_occ)
        or  a
        jr  nz,next_bullet      ;0 = you're normal
@@ -472,15 +689,15 @@ enemy_bullet:
 
        call damage_you         ;HIT!!
 remove_ebullet:
-       dec hl
-       ld   (hl),0             ;bullet > unused
-       jr   next_bullet
+       pop hl                  ;hl could be destroyed by damage_you
+       ld  (hl),0              ;bullet > unused
+       jr  next_bullet+1       ;next bullet (SKIP THE <POP HL> = one byte)
 
 ;--------------------------- handle enemies -----------------------------------
 
 Handle_enemies:
        ld  hl,enemies
-       ld  b,nrenemies         ;loop 20x
+       ld  b,nrenemies         ;handle all enemies
 
 handle_enemy:
        push bc
@@ -491,94 +708,60 @@ handle_enemy:
        jr  z,next_enemy        ;occ "no enemy" 0
        dec a
        jr  z,exploding_enemy   ;occ "exploding" 1
-       ld  b,1
-       dec a
-       jr  z,normal_enemy      ;occ "normal" 2
-
-moving_enemy:                  ;occ "moving" 3
-       ld  b,0
+       ld  b,a                 ;b=2 if moving, otherwise b=1
 
-normal_enemy:
+normal_enemy:                  ;occ "normal" 2 or "moving" 3
        inc hl
-       ld  a,(hl)              ;type
-       and %11100000           ;move-type
-       add a,b                 ;add move bit from occ
-       ld  b,a                 ;save in b
-       ld  a,(hl)              ;type
-       add a,a
-       add a,a
-       add a,a
-       ld  c,a                 ;type*8 = offset
+       push hl
+
+       ld  e,(hl)              ;e = enemy type
+       ld  c,e                 ;c = e
+       ld  d,0                 ;de = e
+       ld  hl,sprites          ;hl = @sprites offset-table
+       add hl,de               ;points to offset of current enemy offset
+       ld  e,(hl)              ;de = @enemy offset
+
+       ld  ix,spr_enemy00      ;first enemy sprite
+       add ix,de               ;add offset for current enemy
+       pop hl
 
        inc hl
        ld  a,(hl)              ;x
        dec a                   ;move left
-       jp  m,remove_enemy      ;off screen
+       jr  c,remove_enemy      ;off screen
        jr  z,remove_enemy      ;"
        ld  d,a
 
        inc hl
        ld  e,(hl)              ;y
-       ld  a,b                 ;%xxx00001=moving -0=normal
-       dec a
-       jr  z,ymove_done        ;skip y-move
-
-;      srl a
-;      ld  b,a                 ;b = %0xxx0000 (move stat)
-       ld  a,(timer)
-       and %00010000           ;switches 0<>1 every 16 turns
-;      add a,b                 ;a = new move stat
-;      add a,a
-;      ld  b,a                 ;b = %xxx00000 (new move stat*2)
-
-;      dec hl \ dec hl
-;      ld  a,(hl)              ;type
-;      and %00011111           ;reset move-type
-;      add a,b                 ;set new move-type
-;      ld  (hl),a
-;      inc hl \ inc hl         ;@y
-
-;      and %00100000
-       jr  z,movedown
-moveup:        dec (hl)                ;decrease y-pos
-       jr ymove_done
-movedown:
-       inc (hl)                ;increase y-pos
+       ld  a,b                 ;moving state was stored in b earlier
+       dec a                   ;is it 1?
+       call nz,moving_enemy    ;2 = moving enemy
 
-ymove_done:
        dec hl                  ;@x
        ld  (hl),d              ;store new x
-       ld  ix,spr_enemy01
-       ld  b,$00
-       add ix,bc
 
-;      push hl                 ;save registers
-       push de
-       call drw_spr            ;display
-       pop  de                 ;restore (destroyed by drw_spr)
-;      pop  hl
-
-;      dec hl
-;      ld  b,(hl)              ;type
-;      and %00011111           ;enemy class
-;      ld  hl,enemy01          ;all enemies' specs
-;      inc b                   ;next enemy's specs
-;      ld  c,$00
-;      add hl,bc
-;      add hl,bc
-;      add hl,bc               ;go there
-;      dec hl                  ;last byte of this enemy's specs
-
-       ld  a,$ff               ;fire frequency
-       call Random             ;random value < a
-       dec a                   ;fire if 1
-       call z,Enemy_fires      ;fires bullet
-       jr   next_enemy
+check_enemyfire:
+       ld  a,c                 ;a = enemy type
+       or  a                   ;type 0? (pickup)
+       jr  z,firing_done       ;pickups don't fire
+
+       ld  bc,add2enemy+1-2    ;offset of <xtra enemy info: fire>
+       add hl,bc               ;go there (@hl)
+       dec (hl)                ;decrease counter till next blast
+       ld  a,(hl)              ;load new counter
+       or  a                   ;has it reached zero?
+       jr  nz,firing_done      ;finished if not
+
+       add a,64                ;re-set counter for next blast
+       ld  (hl),a              ;save
+       call Enemy_fires        ;fires bullet
+
+firing_done:
+       push de                 ;save registers for firing-use
+       call putsprite          ;display sprite @ix
+       pop  de                 ;restore (destroyed by putsprite)
 
-remove_enemy:
-       pop hl
-       ld  (hl),$0000          ;bye bye enemy
-       push hl
 next_enemy:
        pop hl
        ld  bc,$0004
@@ -587,6 +770,12 @@ next_enemy:
        djnz handle_enemy
        ret
 
+remove_enemy:
+       pop hl
+       ld  (hl),$0000          ;bye bye enemy
+       push hl
+       jr  next_enemy
+
 exploding_enemy:
        inc  hl
        push hl
@@ -601,6 +790,39 @@ exploding_enemy:
        ld  (hl),a              ;next frame
        jr  next_enemy
 
+;--------------------------- moving enemies -----------------------------------
+
+moving_enemy:
+movetype_updown:
+       ld  bc,add2enemy
+       add hl,bc
+
+       ld  a,(hl)
+       dec a
+       jr  nz,move_updated
+       add a,128
+move_updated:
+       ld  (hl),a
+
+       or  a                   ;reset carry flag
+       sbc hl,bc
+       and %00100000
+       jr  z,movedown
+
+moveup:
+       ld  a,(hl)              ;load y-position
+       dec a                   ;decrease y-pos (=move up)
+       ret m                   ;don't move off the screen (y<0)
+       ld  (hl),a              ;save new y-pos
+       ret                     ;finish
+movedown:
+       ld  a,(hl)              ;load current y
+       inc a                   ;increase y-pos
+       cp  55                  ;compare with bottom
+       ret nc                  ;return if it has passed that line (>40)
+       ld  (hl),a              ;otherwise save new position
+       ret                     ;and return
+
 ;--------------------------- check collision ----------------------------------
 
 Enemies_hit:
@@ -615,12 +837,26 @@ check_collision:
        push hl
        ld  a,(hl)
        and %00000010
-       jr  z,check_next        ;2/3 = ok
-
+       jr  z,check_next        ;2 or 3 = ok
        inc hl
+
+collide_enemy:
+;      push hl
+;      push bc
+;      ld  hl,enemy00          ;enemy 1 specs
+;      add a,a                 ;a=type*2
+;      add a,a                 ;a=type*4
+;      ld  c,a                 ;c=type
+;      ld  b,0                 ;bc = 4 * enemy nr.
+;      add hl,bc               ;hl = enemy specs
+;      ld  a,(hl)              ;load size byte
+;      pop bc
+;      pop hl
+;      ld  c,a                 ;save size in c
+
        inc hl
        ld  a,(hl)              ;check x match
-       sub e
+       sub e                   ;enemy position minus yours
        add a,6
        jp  m,check_next
        cp  12
@@ -628,14 +864,37 @@ check_collision:
 
        inc hl
        ld  a,(hl)              ;check y match
-       sub d
+       sub d                   ;same as with x-check
        add a,6
        jp  m,check_next
        cp  12
        jr  nc,check_next
-
        dec hl
        dec hl
+
+take_pickup:
+       ld  a,(hl)              ;load enemy type
+       or  a
+       jr  nz,collide          ;enemy when <>0
+
+       push hl
+       ld  hl,your_pickup      ;your pickups
+       ld  a,(hl)              ;current
+       inc a                   ;go to next
+       cp  3                   ;pickups >3
+       jr  c,not_maxpickup
+       ld  a,1                 ;yes: reset to pickup 1
+not_maxpickup:
+       ld  (hl),a              ;save new
+       call disp_icons         ;display altered pickupicons
+       pop hl
+
+       dec hl                  ;to enemy occ
+       xor a                   ;set to 0 = gone
+       ld  (hl),a              ;remove
+       jr  check_next          ;all done, next..
+
+collide:
        xor a
        ld  (hl),a              ;explosionFrame 0
        dec hl
@@ -652,21 +911,187 @@ check_next:
        djnz check_collision
        ret
 
+;--------------------------- show icon ----------------------------------------
+
+disp_icons:
+       ld  hl,VIDEO_MEM+(16*57);57 rows down = seven rows from bottom
+       ld  b,16*7              ;draw 16x (screen width) 7x (height)
+cleanline:
+       ld  a,%00000000         ;blank line mask
+       ld  (hl),a              ;draw one piece of the divider-line
+       inc hl                  ;move right (8 pixels = 1 byte)
+       djnz cleanline          ;repeat (16bytes * 7rows * 8pixels)
+
+       ld  hl,VIDEO_MEM+(56*16)
+       ld  (PutWhere),hl
+
+       call disp_lives
+
+       ld  ix,spr_icon01       ;armorIcon
+       ld  de,$1a01            ;icon #1
+       call putwidesprite      ;display icon
+       call disp_armor         ;display value
+
+       ld  ix,spr_icon00
+       ld  a,(torp_occ)
+       or  a
+       jr  z,no_torp
+       ld  ix,spr_icon02       ;torpedoIcon
+no_torp:
+       ld  de,$2a01            ;icon #2
+       call putwidesprite      ;display
+
+       ld  ix,spr_icon00       ;
+       ld  de,$3a01            ;icon #3
+       call putwidesprite
+       ld  ix,spr_icon00       ;emptyIcon
+       ld  de,$4a01            ;icon #4
+       call putwidesprite
+       ld  ix,spr_icon00       ;emptyIcon
+       ld  de,$5a01            ;icon #5
+       call putwidesprite
+
+       ld  a,(your_pickup)     ;pickups taken
+       add a,a                 ;picks*2
+       ret z                   ;return if no pickups
+       add a,a                 ;picks*4
+       add a,a                 ;picks*8
+       add a,a                 ;picks*$10
+       add a,$0a               ;add 0ah
+       ld  d,a                 ;y-pos = picks * $10 + $0a (1a,2a,3a,4a,5a)
+       ld  e,$01               ;x-pos = bottom (1a01,2a01,3a01,4a01,5a01)
+
+       ld  ix,spr_icon
+       call putwidesprite
+       ret
+
+disp_armor:
+       ld  hl,$3926            ;Display Armor left
+       ld  (_penCol),hl        ;place @ armorIcon
+       ld  a,(your_armor)      ;load armor left
+       add a,'0'               ;make digit
+       call _vputmap           ;display char
+       ret
+
+disp_lives:
+       ld  hl,$3900            ;display Lives
+       ld  (_penCol),hl        ;bottom left
+       ld  hl,savestr+2
+       ld  (hl),'L'
+       inc hl
+       ld  (hl),'x'
+       inc hl
+
+       ld  a,(lives)           ;nr of lives in a
+       add a,'0'               ;make digit
+       ld  (hl),a
+       dec hl \ dec hl
+       call _vputs             ;display on screen
+       ret
+
+;--------------------------- game over / new game / death ---------------------
+
+game_over:
+       call _clrLCD            ;clear screen
+       ld  hl,$0603
+       ld  (_curRow),hl        ;center
+       ld  hl,txt_gameover
+       call _puts              ;display "GAME OVER"
+
+       ld  b,$20
+wait2: halt \ halt
+       djnz wait2              ;delay
+       call _getkey            ;wait for keypress
+
+       pop hl                  ;=ret (game_over was called from a procedure)
+       ret                     ;quit to TI-OS or shell
+
+New_game:
+       xor a                   ;score 0
+       ld  (score),a           ;reset score
+       inc a                   ;level #1
+       ld  (level),a           ;reset level nr
+       ld  hl,level01          ;set level pointer to level#1
+       ld  (levelp),hl         ;reset level pointer
+       ld  hl,lives            ;starting lives
+       ld  (hl),4              ;3 lives (will be decreased @ You_die)
+
+You_die:
+       ld  hl,lives
+       dec (hl)                ;decrease lives
+       ld  a,(hl)              ;load lives left
+       inc a                   ;if lives=0ffh then a=0
+       jr  z,game_over         ;if so, game's over
+
+       xor a                   ;a=0
+       ld  (your_armor),a      ;no armor
+       ld  (torp_occ),a        ;no torpedoes
+       ld  (your_pickup),a     ;reset pickups
+       jr  nonext_level
+
 ;--------------------------- next level ---------------------------------------
 
 Next_level:
-       ld  hl,Leveldata+1      ;reset level data
-       ld  (curevent),hl
+       ld  hl,level            ;level number
+       inc (hl)                ;increase it
+       ld  hl,(levelp)         ;level pointer
+       inc hl
+       inc hl
+       inc hl                  ;update to point to next level
+       ld  (levelp),hl         ;save
+
+nonext_level:
+       ld  a,80
+       ld  (nextevent),a       ;time to first enemy appearance
+
+       ld  hl,(levelp)         ;level pointer
+       ld  a,(hl)              ;load new level-enemy type
+       ld  (eventenemy),a      ;set level-enemy
+       inc hl
+       ld  a,(hl)              ;load new appearance-time
+       ld  (eventtime),a       ;set
+       inc hl
+       ld  a,(hl)              ;load nr of enemies in this level
+       ld  (eventleft),a       ;set nr of events left
 
+       xor a
+       ld  (timer),a           ;reset time
+       ld  hl,your_occ         ;hl = your_occ
+       ld  (hl),a              ;reset your ship (not exploding)
+       inc hl                  ;hl = your_inv
+       ld  (hl),50             ;set 50 frames invulnerable
+       ld  hl,x                ;begin position x=...
+       ld  (hl),a              ;...=a=0=left
+       inc hl                  ;y=...
+       ld  (hl),24             ;...=24=middle
+
+;--------------------------- setup game ---------------------------------------
+
+game_setup:
        call _clrLCD            ;clear screen
+       ld a,%10111011
+       ld  hl,VIDEO_MEM        ;screen location (top left)
+       ld  b,0                 ;b = 0 (loop 0-1 = 0FFh = 256 times)
+clearloop2:
+       inc a
+       ld  (hl),a              ;clear four times (total = 256*4 = 1024 bytes)
+       inc hl
+       ld  (hl),a
+       inc hl
+       xor $ff
+       ld  (hl),a
+       inc hl
+       ld  (hl),a
+       inc hl
+       xor $ff
+       djnz clearloop2         ;repeat 256x
+
        ld  hl,$0703
        ld  (_curRow),hl        ;center
        ld  hl,txt_level
        call _puts              ;display "LEVEL "
 
        ld  a,(level)
-       inc a                   ;increase level nr.
-       ld  (level),a
        ld  l,a
        ld  h,$00
 
@@ -677,87 +1102,64 @@ Next_level:
        add a,'0'
        call _putc              ;display second digit
        ld  a,b
-       call _putc              ;display first digit
+       call _putmap            ;display first digit
+
+       ld  hl,$0904
+       ld  (_curRow),hl        ;display lives left below level nr
+       ld  hl,txt_lives        ;bar text: "Lx0"...
+       ld  a,(lives)           ;lives left
+       add a,'0'               ;make value
+       ld  (txt_lives+3),a     ;add to text
+       call _puts              ;display the string
 
        ld  b,$20
 wait:  halt \ halt
        djnz wait               ;delay
        call _getkey            ;wait for keypress
-       jr  game_setup          ;prepare display and vars
-       ret
-
-;--------------------------- game over ----------------------------------------
-
-game_over:
-       ld  hl,Leveldata+1      ;reset level data
-       ld  (curevent),hl
 
        call _clrLCD            ;clear screen
-       ld  hl,$0603
-       ld  (_curRow),hl        ;center
-       ld  hl,txt_gameover
-       call _puts              ;display "GAME OVER"
-
-       ld  b,$20
-wait2: halt \ halt
-       djnz wait2              ;delay
-       call _getkey            ;wait for keypress
-       jr  game_setup          ;prepare display and vars
-       ret
+       call disp_icons         ;display bottom icons
 
-;---------------------- setup game --------------------------------------------
-
-game_setup:
-       call _clrLCD
-       ld  hl,$1005
-       ld  (_curRow),hl
-       ld  hl,txt_score        ;display "SCORE"
-       call _puts                      ;display texts
-
-       xor a
-       ld  (timer),a                   ;reset time
-       ld  (level),a                   ;level 1
-       ld  hl,Leveldata+1
-       ld  (curevent),hl               ;reset level
-       ld  hl,(Leveldata)
-       ld  (nextevent),hl
-                                       ;ret
-;---------------------- exit --------------------------------------------------
-
-exit_game:
-       ret
+       ld  hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom
+       ld  b,16                ;draw 16x (screen width)
+drawline:
+       ld  a,%11111111         ;horizontal line mask
+       ld  (hl),a              ;draw one piece of the divider-line
+       inc hl                  ;move right (8 pixels = 1 byte)
+       djnz drawline           ;repeat (16bytes * 8pixels =128= screen width)
+        ret
 
 ;--------------------------- putsprite ----------------------------------------
+;--------------------------- de =(X,Y) ----------------------------------------
 
 offsets_table:
-       .db 128,64,32,16,8,4,2,1
-drw_spr:
-       ld  a,d
-       and 7
-       ld  hl,offsets_table
-       ld  c,a
-       ld  b,0
-       add hl,bc
-       ld  a,(hl)
-       ld  (_smc1+1),a
-
-       ld  (_smc1+1),a
-       ld  hl,GRAPH_MEM
-       ld  a,e
-       add a,a
-       add a,e
-       add a,a
-       rl  b
-       add a,a
-       rl  b
-       srl d
-       srl d
-       srl d
-       add a,d
-       jr  nc,_n1
-       inc b
-_n1:   ld  c,a
-       add hl,bc
+       .db 128,64,32,%10000,%01000,%00100,%00010,%00001
+putsprite:
+       ld  a,d                 ;a = X
+       and %00000111           ;a = X mod 8 = bit nr. to mask
+       ld  hl,offsets_table    ;pixel mask table
+       ld  c,a                 ;bit nr.
+       ld  b,0                 ;word
+       add hl,bc               ;add to table
+       ld  a,(hl)              ;a = pixel mask
+       ld  (_smc1+1),a         ;alter pixel mask
+
+       ld  hl,GRAPH_MEM        ;save-location
+       ld  a,e                 ;y-coord
+       add a,a                 ;y*2
+       add a,a                 ;y*4
+       add a,a                 ;y*8
+       rl  b                   ;b (=0) =b*2+overflow (if y>32 then bc=bc+256)
+       add a,a                 ;y*16 (width of screen)
+       rl  b                   ;b=b*2+overflow (if y>64 then bc=bc+512)
+       srl d                   ;d/2
+       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
+       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
           
        ld  d,(ix)
        ld  b,(ix+1)
@@ -773,115 +1175,167 @@ _iloop:        sla c                   ;Test leftmost pixel
        or  (hl)
        ld  (hl),a
        ld  a,e
-_noplot: rrca
+_noplot:rrca
        jr  nc,_notedge         ;Test if edge of byte reached
        inc hl                  ;Go to next byte
-_notedge:djnz _iloop
+_notedge:
+       djnz _iloop
        pop hl                  ;Restore address
-       ld  bc,12               ;Go to next line
+       ld  bc,16               ;Go to next line
        add hl,bc
        pop bc                  ;Restore data
        djnz _oloop
        ret
 
-;---------------------- random ------------------------------------------------
-
-Random:               ; Creates a random number 0 <= x < A
- push bc
- push de
- push hl
- ld b,a
- ld a,r
- add a,a
- ld hl,0
- ld d,0
- ld e,a
-RMul:
- add hl,de
- djnz RMul
- ld a,h
- pop hl
- pop de
- pop bc
- ret
-
-;------------------------
-
-_D_HL_DECI:
-         push     bc
-         ld       de,up_data+4
-         ld       b,5
-ldhld:   call     UNPACK_HL
-         add      a,'0'
-         ld       (de),a
-         dec      de
-         djnz     ldhld
-         ld       hl,up_data
-         ld       b,4
-lis:     ld       a,(hl)
-         cp       '0'
-         jr       nz,dis
-         ld       (hl),' '
-         inc      hl
-         djnz     lis
-dis:     ld       hl,up_data
-         call     _puts
-         pop      bc
-         ret
-
-up_data: .db      "PAD98",0
-
-
+;--------------------------- putbigsprite -------------------------------------
+
+putwidesprite:
+       ld       a,d
+       and      7
+       ld       hl,offsets_table
+       ld       c,a
+       ld       b,0
+       add      hl,bc
+       ld       a,(hl)
+       ld       (wsmc1+1),a
+       ld       (wsmc2+1),a
+       ld       hl,(PutWhere)
+
+       ld       a,e
+       add      a,a
+       add      a,a
+       add      a,a
+
+       rl       b
+       add      a,a
+       rl       b
+       srl      d
+       srl      d
+       srl      d
+       add      a,d
+       jr       nc,n1
+       inc      b
+n1:    ld       c,a
+       add      hl,bc                                    
+          
+       ld       d,(ix)       
+       ld       b,(ix+1)        
+woloop:        push     bc                         ;Save # of rows
+       push     hl                         ;Save screen address
+       ld       b,d                        ;Load width
+       ld       c,(ix+2)                   ;Load one line of image
+       inc      ix
+wsmc1: ld       a,1                        ;Load pixel mask
+wiloop:        sla      c                          ;Test leftmost pixel
+       jr       nc,wnoplot                 ;See if a plot is needed
+       ld       e,a                        ;OR pixel with screen
+       or       (hl)
+       ld       (hl),a
+       ld       a,e
+wnoplot:
+       rrca
+       jr       nc,wnotedge                ;Test if edge of byte reached
+       inc      hl                         ;Go to next byte
+wnotedge:
+wsmc2: cp       1
+       jr       z,wover_1
+
+       djnz     wiloop
+       pop      hl                         ;Restore address
+       ld       bc,16                      ;Go to next line
+       add      hl,bc
+       pop      bc                         ;Restore data
+       djnz     woloop
+       ret
+wover_1:
+       ld       c,(ix+2)
+       inc      ix
+       djnz     wiloop
+       dec      ix
+       pop      hl
+       ld       bc,16
+       add      hl,bc
+       pop      bc
+       djnz     woloop
+       ret
 
+;------------------------------------------------------------------------------
 ;------------------------------- sprites --------------------------------------
+;------------------------------------------------------------------------------
 
 spr_ship:
        .db 9,1         ;ship icon
        .db %11100000   ; â–ˆâ–ˆâ–ˆ
-       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
        .db %00111110   ;   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %11111001   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
-       .db %11111101   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ â–ˆ
-       .db %11111001   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
+       .db %01111001   ;  â–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
+       .db %01111001   ;  â–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
+       .db %01111001   ;  â–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
        .db %00111110   ;   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
        .db %11100000   ; â–ˆâ–ˆâ–ˆ
 
 spr_ship01:
        .db 7,7         ;ship alpha class
-       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
        .db %11100000   ; â–ˆâ–ˆâ–ˆ
        .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
        .db %11110010   ; â–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
        .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
        .db %11100000   ; â–ˆâ–ˆâ–ˆ
-       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
+spr_ship01i:
+       .db 7,7         ;ship alpha class
+       .db %01010000   ;  â–ˆ â–ˆ
+       .db %10100000   ; â–ˆ â–ˆ
+       .db %01010100   ;  â–ˆ â–ˆ â–ˆ
+       .db %10100010   ; â–ˆ â–ˆ   â–ˆ
+       .db %01010100   ;  â–ˆ â–ˆ â–ˆ
+       .db %10100000   ; â–ˆ â–ˆ
+       .db %01010000   ;  â–ˆ â–ˆ
+
 spr_ship02:
        .db 7,7         ;ship beta class
-       .db %11000000   ; â–ˆâ–ˆ
+       .db %11100000   ; â–ˆâ–ˆâ–ˆ
        .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
        .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
        .db %01110010   ;  â–ˆâ–ˆâ–ˆ  â–ˆ
        .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
        .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
-       .db %11000000   ; â–ˆâ–ˆ
+       .db %11100000   ; â–ˆâ–ˆâ–ˆ
+spr_ship02i:
+       .db 7,7         ;ship beta class
+       .db %01000000   ;  â–ˆ
+       .db %10100000   ; â–ˆ â–ˆ
+       .db %01010100   ;  â–ˆ â–ˆ â–ˆ
+       .db %00100010   ;   â–ˆ   â–ˆ
+       .db %01010100   ;  â–ˆ â–ˆ â–ˆ
+       .db %10100000   ; â–ˆ â–ˆ
+       .db %01000000   ;  â–ˆ
 
 spr_bullet01:
        .db 5,3         ;your bullets
-       .db %00110000   ;   â–‘▒▓█��
-       .db %11111000   ; â–‘▒▓████��
-       .db %00110000   ;   â–‘▒▓█��
+       .db %00110000   ;   â–‘▒▓█��
+       .db %11111000   ; â–‘▒▓████��
+       .db %00110000   ;   â–‘▒▓█��
 spr_bullet02:
-       .db 5,3         ;your bullets
-       .db %11110000   ; â–‘▒▓████
-       .db %11111000   ; â–‘▒▓█████
-       .db %11110000   ; â–‘▒▓████
+       .db 5,3
+       .db %11110000   ; â–‘▒▓███▒
+       .db %11111000   ; â–‘▒▓████▒
+       .db %11110000   ; â–‘▒▓███▒
+spr_bullett1:
+       .db 4,3         ;â–’â–’â–’
+       .db %11100000   ;▒███
+       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
 
-spr_bullet11:
-       .db 3,3         ;enemy bullets
-       .db %01000000   ;  â–ˆâ–“â–’â–‘
-       .db %11100000   ; â–ˆâ–ˆâ–ˆâ–“â–’â–‘
-       .db %01000000   ;  â–ˆâ–“â–’â–‘
+spr_bullete1:
+       .db 4,3         ;enemy bullets
+       .db %01100000   ;  â–’█▓▒░
+       .db %11110000   ; â–’███▓▒░
+       .db %01100000   ;  â–’█▓▒░
+
+;---------------------------------------- explosion -------------------------------------------
 
 spr_explosion:                               
        .db 8,6         ;1
@@ -901,23 +1355,23 @@ spr_explosion:
        .db %00011010   ;    â–ˆâ–ˆ â–ˆ
 
        .db 8,6         ;3
-       .db %10110011   ; â–ˆ â–ˆâ–ˆ  â–ˆâ–ˆ
+       .db %10110000   ; â–ˆ â–ˆâ–ˆ
        .db %01001110   ;  â–ˆ  â–ˆâ–ˆâ–ˆ
        .db %10110101   ; â–ˆ â–ˆâ–ˆâ–’█▒█
        .db %01000101   ;  â–ˆ  â–’█▒█
        .db %00111110   ;   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %11011010   ; â–ˆâ–ˆ â–ˆâ–ˆ â–ˆ
+       .db %01011010   ;  â–ˆ â–ˆâ–ˆ â–ˆ
 
        .db 8,6         ;4
-       .db %00101010   ; â–’ â–ˆâ–’â–ˆ â–ˆâ–’
+       .db %00101010   ; â–’ â–ˆâ–’â–ˆ â–ˆ
        .db %01000110   ;  â–ˆ  â–’██
        .db %10110101   ; â–ˆ â–ˆâ–ˆ â–ˆ â–ˆ
        .db %01100110   ;  â–ˆâ–ˆ  â–ˆâ–ˆâ–’
        .db %00111100   ;   â–ˆâ–ˆâ–ˆâ–ˆâ–’
-       .db %01011001   ; â–’â–ˆ â–ˆâ–ˆ â–’â–ˆ
+       .db %01011001   ;  â–ˆ â–ˆâ–ˆ â–’â–ˆ
 
        .db 8,6         ;5
-       .db %01000001   ;  â–ˆâ–’ â–’ â–’â–ˆ
+       .db %01000000   ;  â–ˆâ–’ â–’ â–’
        .db %00100101   ;  â–’â–ˆ  â–ˆâ–’â–ˆ
        .db %00010100   ; â–’ â–’â–ˆ â–ˆ â–’
        .db %01000100   ;  â–ˆâ–’  â–ˆ
@@ -925,7 +1379,7 @@ spr_explosion:
        .db %10011010   ; â–ˆâ–’ â–ˆâ–ˆ â–ˆâ–’
 
        .db 8,6         ;6
-       .db %01000100   ;  â–ˆ   â–ˆ â–’
+       .db %01000100   ;  â–ˆ   â–ˆ
        .db %00100000   ;   â–’â–ˆ â–’ â–’
        .db %00000001   ;    â–’ â–’ â–ˆ
        .db %01000100   ;  â–ˆ   â–ˆ
@@ -948,63 +1402,139 @@ spr_explosion:
        .db %00000010   ;       â–ˆâ–’
        .db %00100100   ;   â–ˆâ–’ â–ˆ
 
+;--------------------------------------- bar -----------------------------------
+
+spr_icon:
+       .db 16,7        ;unused   .......:.......:
+       .db %11111111,%11111111 ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11000000,%00000001 ; â–ˆâ–ˆ             â–ˆ
+       .db %11000000,%00000001 ; â–ˆâ–ˆ             â–ˆ
+       .db %11000000,%00000001 ; â–ˆâ–ˆ             â–ˆ
+       .db %11000000,%00000001 ; â–ˆâ–ˆ             â–ˆ
+       .db %11000000,%00000001 ; â–ˆâ–ˆ             â–ˆ
+       .db %11111111,%11111111 ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+spr_icon00:
+       .db 16,7        ;unused   .......:.......:
+       .db %10101010,%10101010 ; â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
+       .db %11010101,%01010101 ; â–ˆâ–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
+       .db %10101010,%10101010 ; â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
+       .db %11010101,%01010101 ; â–ˆâ–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
+       .db %10101010,%10101010 ; â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
+       .db %11010101,%01010101 ; â–ˆâ–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
+       .db %10101010,%10101010 ; â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
 spr_icon01:
-       .db 5,4
-       .db %00100000   ;   â–ˆ
-       .db %10101000   ; â–ˆ â–ˆ â–ˆ
-       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
+       .db 16,7        ;armor  ; .......:.......:
+       .db %10001111,%10000000 ; â–ˆ   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %10010000,%01000000 ; â–ˆ  â–ˆ     â–ˆ  â–’â–’â–’
+       .db %10101110,%00100000 ; â–ˆ â–ˆ â–ˆâ–ˆâ–ˆ   â–ˆ â–’â–’â–’
+       .db %10100111,%10100000 ; â–ˆ â–ˆ  â–ˆâ–ˆâ–ˆâ–ˆ â–ˆ â–’â–’â–’
+       .db %10101110,%00100000 ; â–ˆ â–ˆ â–ˆâ–ˆâ–ˆ   â–ˆ â–’â–’â–’
+       .db %10010000,%01000000 ; â–ˆ  â–ˆ     â–ˆ  â–’â–’â–’
+       .db %10001111,%10000000 ; â–ˆ   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
 spr_icon02:
-       .db 5,4
-       .db %00000000   ;  â–ˆâ–ˆâ–ˆ
-       .db %00000000   ; â–ˆâ–ˆ â–ˆâ–ˆ
-       .db %00000000   ; â–ˆ   â–ˆ
-       .db %00000000   ;
+       .db 16,7        ;torpedo  .......:.......:
+       .db %10111000,%00010101 ; â–ˆ â–ˆâ–ˆâ–ˆ      â–ˆ â–ˆ â–ˆ
+       .db %10011100,%00010101 ; â–ˆ  â–ˆâ–ˆâ–ˆ     â–ˆ â–ˆ â–ˆ
+       .db %10111000,%01001010 ; â–ˆ â–ˆâ–ˆâ–ˆ    â–ˆ  â–ˆ â–ˆ
+       .db %10000000,%11101010 ; â–ˆ       â–ˆâ–ˆâ–ˆ â–ˆ â–ˆ
+       .db %11100001,%11100101 ; â–ˆâ–ˆâ–ˆ    â–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ â–ˆ
+       .db %10011000,%11110101 ; â–ˆ  â–ˆâ–ˆ   â–ˆâ–ˆâ–ˆâ–ˆ â–ˆ â–ˆ
+       .db %11100110,%00110010 ; â–ˆâ–ˆâ–ˆ  â–ˆâ–ˆ   â–ˆâ–ˆ  â–ˆ
+spr_icon03:
+       .db 16,7        ;laser    ........:.......:
+       .db %10000000,%00000000 ; â–ˆ
+       .db %10110001,%01000000 ; â–ˆ â–ˆâ–ˆ   â–ˆ â–ˆ
+       .db %10111011,%10000000 ; â–ˆ â–ˆâ–ˆâ–ˆ â–ˆâ–ˆâ–ˆ
+       .db %10011101,%11111111 ; â–ˆ  â–ˆâ–ˆâ–ˆ â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %10111011,%10000000 ; â–ˆ â–ˆâ–ˆâ–ˆ â–ˆâ–ˆâ–ˆ
+       .db %10110001,%01000000 ; â–ˆ â–ˆâ–ˆ   â–ˆ â–ˆ
+       .db %10000000,%00000000 ; â–ˆ
+spr_icon04:
+       .db 16,7        ;invulnerable....:.......:
+       .db %10000000,%01010100 ; â–ˆ        O O O
+       .db %10011110,%00101010 ; â–ˆ  OOOO   O O O
+       .db %10111000,%00010101 ; â–ˆ OOO      O O O
+       .db %10111111,%10101010 ; â–ˆ OOOOOOO O O O
+       .db %10111111,%00010101 ; â–ˆ OOOOOOO  O O O
+       .db %10111000,%00101010 ; â–ˆ OOO     O O O
+       .db %10011110,%01010100 ; â–ˆ  OOOO  O O O
 
 ;---------------------------- texts -------------------------------------------
 
-txt_title:     .db "* * NEMESIS * *",0
+txt_about:     .db "v0.9.94 ","by Shiar  "
+               .db "(ICQ#43840958)",0
+txt_1player:   .db "1 PLAYER",0
+txt_2players:  .db "2 PLAYERS",0
 txt_level:     .db "LEVEL ",0
 txt_gameover:  .db "GAME OVER!",0
-txt_score:     .db "SCORE",0
+txt_lives:     .db "Lx0?",0
 
 ;---------------------------- save data ---------------------------------------
 
 stored_data_start:
 
-level          .db $00                 ;level number
+PutWhere       .dw GRAPH_MEM           ;where to put the wide sprites
+
 timer          .db $00                 ;frame counter
-curevent       .dw Leveldata+1         ;next event
-nextevent      .db (Leveldata)         ;time to next event
+level          .db $00                 ;level number
+levelp         .dw level01             ;pointer to level data
+
+eventenemy     .db $02                 ;enemy type
+eventtime      .db $15                 ;enemy frequency
+eventleft      .db $00                 ;nr. of enemies still to come
+nextevent      .db $50                 ;time to next event
 
 score          .dw $0000
 
+your_pickup    .db $00
 your_occ       .db $00                 ;0=normal 1..16=exploding
-;lives         .dw $0003       ;unused
+your_inv       .db $50                 ;invincibility left
+your_armor     .db $13                 ;HP left
+lives          .db $04                 ;
 x              .db $16                 ;x-pos
 y              .db $46                 ;think about it..
 hp             .db $00                 ;hitpoints left
 
+torp_occ       .db $00                 ;torp.state: 0=unavail 1=avail 2=presnt
+torp_pos       .dw $0000               ;torpedo position (x,y)
+
 ybullets       .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0       ;10 x (state,x,y)
 ebullets       .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0       ;10 x (state,x,y)
 
-nrenemies      = 32
+nrenemies      = 10
 enemies                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
 
+enemiesxtra    .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
                .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
-               .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
+add2enemy      = 40
 
 ; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
-; %111 (move ptrn) 11111 (ship or explosion frame)  %11111111 (x) %11111111 (y)
-
+; %11111111 (ship type or explosion frame)  %11111111 (x) %11111111 (y)
 
 ;---------------------------- enemy data --------------------------------------
 
+sprites:
+       .db $00
+       .db spr_enemy01-spr_enemy00
+       .db spr_enemy02-spr_enemy00
+       .db spr_enemy03-spr_enemy00
+       .db spr_enemy04-spr_enemy00
+       .db spr_enemy05-spr_enemy00
+       .db spr_enemy06-spr_enemy00
+       .db spr_enemy07-spr_enemy00
+
+spr_enemy00:
+       .db 7,5         ;pickup
+       .db %11111110   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %10011010   ; â–ˆ  â–ˆâ–ˆ â–ˆ
+       .db %11111110   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %10011010   ; â–ˆ  â–ˆâ–ˆ â–ˆ
+       .db %11111110   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
 spr_enemy01:
        .db 6,6         ;enemy type one
        .db %00111100   ;   â–ˆâ–ˆâ–ˆâ–ˆ
@@ -1014,13 +1544,13 @@ spr_enemy01:
        .db %01110000   ;  â–ˆâ–ˆâ–ˆ
        .db %00111100   ;   â–ˆâ–ˆâ–ˆâ–ˆ
 spr_enemy02:
-       .db 6,6         ;enemy type two
-       .db %00111000   ;   â–ˆâ–ˆâ–ˆ
-       .db %01100000   ;  â–ˆâ–ˆ
+       .db 8,6         ;enemy type two
+       .db %00111111   ;    â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
        .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
        .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %01100000   ;  â–ˆâ–ˆ
-       .db %00111000   ;   â–ˆâ–ˆâ–ˆ
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %00111111   ;    â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
 spr_enemy03:
        .db 6,6         ;enemy type three
        .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
@@ -1037,147 +1567,151 @@ spr_enemy04:
        .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
        .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
        .db %00111000   ;   â–ˆâ–ˆâ–ˆ
-
-enemy01:                               ;HP:1  move:- fire:-
-       .db %00000010,%00000000,%00000000               ;first two enemy bytes
-enemy02:                               ;HP:1  move:1 fire:1.5%
-       .db %00000011,%00100001,%01111111
-enemy03:                               ;HP:2  move:- fire:3%
-       .db %00000110,%00000010,%00001111
-enemy04:                               ;HP:5  move:- fire:6%
-       .db %00010010,%00000011,%00000011
-enemy05:                               ;HP:10 move:- fire:25%
-       .db %00100111,%00000100,%00000011
-
-;---------------------------- level data --------------------------------------
-
-Leveldata:                     ;time,enemyclass,ypos
-       .db $0d,$00,$38                 ;first wave (bottom)
-       .db $00,$00,$40
-       .db $00,$00,$48
-       .db $1e,$00,$10                 ;second wave (top)
-       .db $00,$00,$18
-       .db $00,$00,$20
-       .db $1e,$00,$24                 ;third wave (middle)
-       .db $00,$02,$2c
-       .db $00,$00,$34
-
-       .db $0d,$00,$10                 ;top & bottom
-       .db $00,$00,$4a
-       .db $2a,$01,$2d                 ;middle: moving
-       .db $0c,$02,$2d                 ;        3HP
-       .db $0b,$02,$2d                 ;        3HP
-       .db $09,$00,$27                 ;two 1HP behind him
-       .db $00,$00,$33
-       .db $09,$02,$21                 ;two 3HP behind them
-       .db $00,$02,$39
-       .db $09,$02,$1b                 ;and two 3HP behind them
-       .db $00,$02,$3f
-
-       .db $15,$03,$11                 ;one vertical line of 8HPs
-       .db $00,$03,$19
-       .db $00,$03,$21
-       .db $00,$03,$29
-       .db $00,$03,$31
-       .db $00,$03,$39
-       .db $00,$03,$41
-       .db $00,$03,$49
-
-       .db $0c,$02,$11                 ;one vertical line of 3HPs
-       .db $00,$02,$19
-       .db $00,$02,$21
-       .db $00,$02,$29
-       .db $00,$02,$31
-       .db $00,$02,$39
-       .db $00,$02,$41
-       .db $00,$02,$49
-
-       .db $0c,$00,$11                 ;one vertical line of 1HPs
-       .db $00,$00,$19
-       .db $00,$00,$21
-       .db $00,$00,$29
-       .db $00,$00,$31
-       .db $00,$00,$39
-       .db $00,$00,$41
-       .db $00,$00,$49
-
-
-
-
-
-
-
-       .db $f1,$01,$40
-       .db $10,$00,$30
-       .db $10,$02,$20
-       .db $40,$01,$10
-       .db $01,$00,$44
-       .db $15,$01,$31
-       .db $04,$02,$38
-       .db $05,$00,$40
-       .db $03,$00,$2f
-       .db $04,$00,$3a
-       .db $12,$02,$10
-       .db $10,$03,$18
-       .db $0e,$03,$20
-       .db $0c,$03,$28
-       .db $0a,$02,$30
-       .db $08,$02,$38
-       .db $06,$01,$40
-       .db $04,$00,$48
-       .db $2a,$00,$20
-       .db $ff,$ff,$ff
+spr_enemy05:
+       .db 7,6         ;enemy type four
+       .db %00011110   ;    â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111110   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111110   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %00011110   ;    â–ˆâ–ˆâ–ˆâ–ˆ
+spr_enemy06:
+       .db 7,6         ;enemy type four
+       .db %00011100   ;    â–ˆâ–ˆâ–ˆ
+       .db %01111110   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %10111000   ; â–ˆ â–ˆâ–ˆâ–ˆ
+       .db %10111000   ; â–ˆ â–ˆâ–ˆâ–ˆ
+       .db %01111110   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %00011100   ;    â–ˆâ–ˆâ–ˆ
+spr_enemy07:
+       .db 8,6         ;enemy type four
+       .db %00011110   ;    â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111111   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+enemy00:.db %10011100  ; â–ˆ  â–ˆâ–ˆâ–ˆ
+       .db %10011100   ; â–ˆ  â–ˆâ–ˆâ–ˆ
+       .db %01111111   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %00011110   ;    â–ˆâ–ˆâ–ˆâ–ˆ
+
+       ;enemyInfo:     %000000:HP %10:occ $00:type $00:app $00:unused
+enemy01:                       ;#1     HP:1    app:random
+       .db %00000010,1,1,0
+enemy02:                       ;#2     HP:1    app:halflure
+       .db %00000010,2,3,0
+enemy03:                       ;#3     HP:1    app:random      moving
+       .db %00000011,3,1,0
+enemy04:                       ;#4     HP:2    app:lure
+       .db %00000110,4,2,0
+enemy05:                       ;#5     HP:2    app:random      moving
+       .db %00000111,5,1,0
+enemy06:                       ;#6     HP:2    app:lure        moving
+       .db %00000111,6,2,0
+enemy07:                       ;#7     HP:4    app:halflure    moving
+       .db %00001111,7,3,0
+
+;----------------------------- level info -------------------------------------
+
+level01:
+       .db $01,$1b,$2f                 ;enemy nr ; enemy frequency ; next lvl
+level02:                               ;frequency must be odd if halfluring!
+       .db $02,$11,$4b
+level03:
+       .db $03,$1d,$3f
+level04:
+       .db $04,$0d,$4f
+level05:
+       .db $05,$25,$3d
+level06:
+       .db $06,$23,$39
+level07:
+       .db $07,$1f,$f9
+
+;----------------------------- logo -------------------------------------------
+
+logo_nemesis:
+.db %11111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00001011,%11111111,%11111111,%11111111,%11111000
+.db %01111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00011011,%11111111,%11111111,%11111111,%11110000
+.db %00111111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%00111011,%11111111,%11111111,%11111111,%11100000
+.db %00011111,%11111111,%11111111,%11111110,%11111111,%11110111,%11111111,%11111110,%11111111,%111101111,%11111111,%01111011,%11111111,%11111111,%11111111,%11000000
+.db %00000000,%00000000,%00000001,%00011110,%00010000,%00000000,%10000001,%00011110,%00010000,%000000001,%00000000,%00001000,%01000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00000011,%00011110,%00110000,%00000001,%10000011,%00011110,%00110000,%000000011,%00000000,%00011000,%11000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00000111,%00011110,%01110000,%00000011,%10000111,%00011110,%01110000,%000000111,%00000000,%00111001,%11000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%00000111,%10001111,%00011110,%11111111,%000001111,%11111111,%01111011,%11111111,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11110000,%00000111,%10001111,%00011110,%11110000,%000000000,%00001111,%01111000,%00000011,%11000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000111,%11010001
+.db %00000000,%00000000,%00001111,%00011110,%11111111,%11110111,%10001111,%00011110,%11111111,%111101111,%11111111,%01111011,%11111111,%11000000,%00000001,%00011011
+.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
 
+;----------------------------- NEMESIS'86 by Shiar ----------------------------
 
+;Game Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· NEMESIS
+;Version  Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â·  0.9.94
+;Latest modification  Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· 4.IX.99
+;Calc Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â·  TI-86 only
+;Size Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â·  2694 bytes on calc
 
+;Author Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· SHIAR
+;ICQ Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â·  #43840958
+;E-mail Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â·  shiar0@hotmail.com
+;Homepage Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· coming soon (www.wish.net/~shiar)
 
-;----------------------------- NEMESIS'86 by Shiar ----------------------------
+;Notes:
+;  <*> This game is not yet finished (BETA) and there may still be some bugs.
+;  <*> Source will be released when the game has been finished.
+;  <*> Have fun, and have even more fun with the completed version of NEMESIS!
 
 ;----------------------------- version history --------------------------------
 
-;0.01.717 -- 17.VII.99 -- size 984
+;0.01.717 -- 17.VII.99 -- size 909
 ;
-;      + movement of ship over whole screen
+;      + used "Galaxian"-game engine (drawings, movement, enemy-routines)
+;      + movement of ship over 3/4 screen (96 pixels; 32 pixels for score)
 ;      + enemies moving from right to left, appearing right at specified times
 ;
-; 0.1.718 -- 18.VII.99 -- size 907
+; 0.1.718 -- 18.VII.99 -- size 832
 ;
 ;      # no crash when level restarts for the third time
 ;      * exit-procedure updated, unnecessary stuff/keychecks removed
-;      * alot of unused code removed
+;      - alot of unused code removed
 ;      + different types of enemies (just look different)
 ;      + collision detection!! enemy ships disappear when you hit them
 ;
-; 0.2.718 -- 18.VII.99 -- size 1153
+; 0.2.718 -- 18.VII.99 -- size 1078
 ;
 ;      + ability to fire bullets (F1). Enemies disappear on impact
 ;      * enemies explode instead of disappearing
 ;
-; 0.3.719 -- 19.VII.99 -- size 1401
+; 0.3.719 -- 19.VII.99 -- size 1326
 ;
 ;      * bullets appear correctly (not INSIDE your ship)
 ;      + some enemies can take multiple hits (differs per class)
 ;      + all enemies fire bullets at random
 ;      + if you're hit by bullet/enemy, you'll lose one hitpoint
 ;
-; 0.4.720 -- 20.VII.99 -- size 1481
+; 0.4.720 -- 20.VII.99 -- size 1406
 ;
 ;      # collision detection fixed and optimized (much faster now!)
 ;      + shell-icon added (YAS type)
 ;      * code optimizations, some data "compression"
 ;      * explosion looks better, and some vars removed/smaller
-;      # enemies are removed if at left side (instead of becoming invisible)
+;      # enemies are removed when at left side (instead of becoming invisible)
 ;      + displays level number before each level begins
 ;
-; 0.5.725 -- 25.VII.99 -- size 1778
+; 0.5.725 -- 25.VII.99 -- size 1703
 ;
 ;      * waits a sec at level display (in case of accidental keypress)
-;      * moving enemies (move up&down)
+;      * moving enemies (move up+down)
 ;      # bullets removed correctly so they can be used again later
 ;      * first level made
 ;      # enemy weaponfire is fired from correct positions
@@ -1185,5 +1719,71 @@ Leveldata:                       ;time,enemyclass,ypos
 ;      * game over screen will be displayed just *after* your ship's gone
 ;      + frame counter onscreen
 ;
+; 0.6.820 -- 20.IIX.99 -- size 2077
+;
+;      * play field increased to full screen instead of 3/4
+;      + bottom eight lines used for score (etc) display
+;      - no more solid levels, enemies are placed at random
+;      + enemies appear every x turns (depends on level)
+;      # fixed bullets so they don't disappear at 3/4 of the screen
+;      * A LOT of optimizations both in speed and size!!
+;      + enemy type, frequency, and number specified per level
+;      + bottom score bar displays score, lives and icons (to be used later)
+;      * smarter enemy handling (so enemies have different sizes)
+;      + bottom bar divided from playing field by a horizontal line
+;      + five levels (and five enemies) made
+;      # game vars reset at start and game over
+;      + NEMESIS LOGO displayed at startup!! (also, program grew 350bytes ):
+;      + version/credits string displayed below logo: v0.6.820 by shiar (ICQ#)
+;
+; 0.6.825 -- 25.IIX.99 -- size 2085
+;
+;      # pointer to fifth ship corrected (ships in level 5 weren't displayed)
+;      # calc doesn't crash anymore when game is continued after game over!!
+;      + lives are decreased when ship is destroyed
+;      # last eight pixels of divider line are shown correctly now
+;
+;  0.7.92 -- 02.IX .99 -- size 2303
+;
+;      + contrast is increased one level at startup (and restored on exit)
+;      + invulnerable for a sec when you enter the game (inv-pickup later)
+;      + when in invulnerable-mode, your ship look different!
+;      + at the beginning you get three *hitpoints* so you can be hit 3 times
+;      * bottomline icons are now 16 pixels wide and 7 pixels high!
+;      + hitpoint icon added: displays nr. of hps left next to a nice picture
+;      * maximum invulnerability-time is increased (can last upto 1024 frames)
+;      + when invulnerable-mode has nearly expired, your ship flashes!
+;      * again a lot of optimizations esp. in size ('bout 100 bytes)
+;      + pickups! 10% chance a destroyed enemy changes into an armor-pickup
+;      # code optimization caused some bullets to reappear as "fake" bullets
+;      * pickups can't be destroyed by bullets (they pass right through it)
+;
+;  0.8.93 -- 03.IX .99 -- size 2433
+;
+;      + enemies move individually, not all at the same time!! Looks very nice
+;      # titlescreen background is cleared (looked weird in Rascall and TI-OS)
+;      + enemies fire at a ### rate instead of firing at will (too random)
+;      # moving enemies don't move off the screen top/bottom (they wait there)
+;      + seven playable levels going easy to hard (including moving enemies)
+;      # xtraInfo data wasn't reset when a moving enemy entered the game
+;      * longer delay when level is completed (NextLevel screen came too soon)
+;
+;  0.9.94 -- 04.IX .99 -- size 2693
+;
+;      # pickups no longer fire bullets like normal enemies
+;      + <halt>s added so the game runs slower and looks better
+;      + TORPEDOES!!! Bullets that fire downwards! Just like in Nemesis
+;      * a pickup selects the next icon on bottom bar instead of increasing hp
+;      + an icon can be taken by pressing F2. second icon selects torpedoes
+;      + first icon increases armor, icon 3 and 4 are unused for now
+;      * selecting an unused icon (3+4) resets pickups like icon 1 and 2
+;      * when you're destroyed, you loose one life instead of going game over
+;        you also loose all upgrades and pickups, but remain in the same level
+;      * random is more randomized, no more "tricks" to fool the randomizer
+;      # after game over the game is terminated instead of continuing+crashing
+;      - no more armor to start with. you'll have to collect them on your own
+;      * of course optimizations and a few tiny bug fixes (not important)
+;      * increased the size of the enemy bullets so they're better to see
+
 
 ;       + added        - removed       * changed       # bug fixed