version 0.61: lives, bug fixes
[nemesis.git] / nemesis.z80
index b735b9c0860f4c417e9a3ccdcf11f75c1efa555a..00d0554d621d140c3435375e79c2951ae0e1e328 100644 (file)
@@ -1,66 +1,56 @@
        .include "asm86.h"
        .include "ti86asm.inc"
-       .include "ti86abs.inc"
 
        .org _asm_exec_ram
 
        nop
        jp  Start
-       .dw $0000
+       .dw $0001
        .dw Title
-Title: .db "Nemesis v0.3.719 by Shiar",0
-Start:
-       jr init
+       .dw spr_ship
+Title: .db "Nemesis v0.6.825 by Shiar",0
+Start: jr init
 
 just_fired     = $c0f9         ;byte
 temp1          = $c100         ;word
 
-;-------------------- init ----------------------------------------------------
+;---------------------- init --------------------------------------------------
 
 init:
        call _runindicoff
 
-;-------------------- main menu -----------------------------------------------
-
-       jp play_game
-
-;-------------------- exit ----------------------------------------------------
-
-exit_game:
-       ret
-
-;----------------------- game setup -------------------------------------------
-
-play_game:
-       ld  hl,stored_data_start
-       ld  bc,variables_end-stored_data_start-1
-
-;---------------------- display setup ----------------------------------------
-
-set_up_display:
-       call _clrLCD
-
-       ld  hl,in_game_text
-       ld  b,3
-l11:   ld  a,(hl)
-       ld  (_curCol),a
-       inc hl
-       ld  a,(hl)
-       ld  (_curRow),a
-       inc hl
+;---------------------- main menu ---------------------------------------------
+
+LogoPut:
+       ld hl,logo_nemesis      ;from...
+       ld de,$FC00+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
-       djnz l11
-
-in_game_text:
-       .db 16,0,"LIVES",0
-       .db 16,3,"LEVEL",0
-       .db 16,6,"SCORE",0
 
-str_question:
-       .db "-----",0
+       call _getkey            ;wait for keypress
+       call New_level          ;prepare level
 
 ;------------------------------------------------------------------------------
-;-------------------------- game loop -----------------------------------------
+;---------------------- game loop ---------------------------------------------
 ;------------------------------------------------------------------------------
 
 game_main_loop:
@@ -68,24 +58,24 @@ game_main_loop:
        inc (hl)
 
 Clear_screen:
-       xor a
-       ld  hl,GRAPH_MEM+(16*12)
-       ld  b,a
- ld a,(background)
+       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
@@ -94,14 +84,13 @@ game_stuff:
        call Level_event        ;insert enemies
        call Handle_Ship        ;move you
        call Fire_bullet        ;check for fire
-       call Handle_bullets     ;move bullets
        call Handle_enemies     ;move enemies
-       call Enemy_fires        ;check for enemy fire
-       call Enemy_bullets      ;move bullets
+       call Handle_bullets     ;move your bullets
+       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
@@ -109,23 +98,20 @@ quit:      ret
 ;---------------------- 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,$fc00            ;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  hl,$1007            ;Display Score
-;      ld  (_curRow),hl
-;      ld  hl,(score)
-;      jp  _D_HL_DECI
+       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,$3a6b            ;Display Score
+       ld  (_penCol),hl
+       ld  hl,(timer)
+       ld  h,0
+       jp  _D_HL_DECI
        ret
 
 ;------------------------- handle ship ----------------------------------------
@@ -135,27 +121,28 @@ Handle_Ship:
        or  a
        jr  z,ok                ;0 = normal stat
 
-;      dec a
-;      ld  (your_status),a
-;      ld  hl,(lives)
-;      ld  a,l
-;      or  h
-;      jr  nz,ok
-;      pop af
-;      ret
+       inc a                   ;next (explosion)frame
+       ld  (your_occ),a        ;save
+
+       cp  34                  ;last explosion frame?
+       jr  c,exploding_you     ;not yet: display explosion
+       cp  40                  ;delay finished?
+       jp  z,game_over         ;yes = game over
+       ret                     ;don't display anything
 
 ok:
        ld  a,%01111110
        out (1),a
-       ld  hl,y
+       nop \ nop
        in  a,(1)
+       ld  hl,y
        rra
        ld  b,a
 
        jr  c,no_down
        ld  a,(hl)
        inc a
-       cp  73                  ;y < 73
+       cp  50                  ;56-6 = bottom of screen
        jr  z,no_down
        ld  (hl),a
 no_down:
@@ -163,15 +150,15 @@ no_down:
        rr  b
        jr  c,no_left
        ld  a,(hl)
-       dec a
-       jr  z,no_left           ;x > 0
+       sub 1                   ;<dec 1> doesn't affect c-flag
+       jr  c,no_left           ;-1 = left side
        ld  (hl),a
 no_left:
        rr b   
        jr  c,no_right
        ld  a,(hl)
        inc a
-       cp  89                  ;x < 89
+       cp  122                 ;128-6 = right side
        jr  z,no_right
        ld  (hl),a
 no_right:
@@ -180,24 +167,19 @@ no_right:
        rr  b
        jr  c,no_up
        ld  a,(hl)
-       dec a
-       cp  15                  ;y > 15
-       jr  z,no_up
+       sub 1                   ;<dec a> doesn't affect carry-flag
+       jr  c,no_up             ;-1 = top of screen
        ld  (hl),a
-no_up: ld  ix,spr_ship
+no_up: ld  ix,spr_ship01
 
 display_common:
        ld  e,(hl)
-       jp  drw_spr
+       jp  drw_spr             ;ret
 
-;you_not_normal:
-;      ld       a,(your_status)
-;      dec      a
-;      ld       (your_status),a
-;      inc      a
-;      and      14
-;      xor      14
-;      ld       hl,x-1
+exploding_you:
+       srl a                   ;half the framerate
+       dec a                   ;first frame is 1>inc>srl>dec = 0
+       ld  hl,x-1
 
 explosion_stuff:
        rra
@@ -214,8 +196,8 @@ explosion_stuff:
        jr  display_common
 
 damage_you:
-       or  %10101010
-       ld  (background),a
+       ld  a,1                 ;set to explode (1st frame)
+       ld  (your_occ),a
        ret
 
 ;------------------------- fire bullet ----------------------------------------
@@ -289,10 +271,10 @@ scan_bullets:
 bullet_type1:
        ld  a,(hl)              ;d = X
        inc a                   ;move right
-       cp  $5a                 ;off screen?
+       cp  121                 ;off screen? (x=127-5-1)
        jr  z,remove_bullet
        inc a                   ;move right
-       cp  $5a                 ;off screen?
+       cp  121                 ;off screen?
        jr  z,remove_bullet
        ld  (hl),a              ;save new pos.
        ld  d,a
@@ -302,15 +284,15 @@ bullet_type1:
        push de
        call drw_spr            ;display bullet
        pop de
-       ld  b,20
+       ld  b,nrenemies
        ld  hl,enemies
 
 hit_enemies:                   ;Hits with normal enemies
        push hl
 
        ld  a,(hl)
-       and %00000001
-       jr  z,nohit             ;no hit when enemy_occ <> 1
+       and %00000010
+       jr  z,nohit             ;no hit when enemy_occ <> 2/3
 
        inc hl
        inc hl
@@ -339,20 +321,20 @@ hit_enemies:                      ;Hits with normal enemies
        dec hl
        dec hl
        ld  a,(hl)              ;occ
-       srl a
-       srl a                   ;occ/4 = HP left
-       jr  nz,hpleft
-       ld  (hl),2              ;set to explode
+       ld  b,a                 ;push occ
+       and %11111100           ;occ/4 = HP left        ;<srl a\srl a
+       jr  nz,hpleft           ;not zero -> jump
+       ld  (hl),%01            ;set to explode
        inc hl
+       ld  b,(hl)              ;save enemy type
        ld  (hl),a              ;explosionFrame 0
+
        pop hl
        ret
 
 hpleft:
-       dec a
-       add a,a
-       add a,a 
-       inc a                   ;HP*4+1 = occ 1
+       ld  a,b                 ;pop occ
+       sub %00000100           ;decrease HP by one
        ld  (hl),a              ;save
        pop hl
        ret
@@ -368,14 +350,27 @@ nohit:    pop hl
 ;--------------------------- 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),109            ;set delay
+       ret                     ;don't place any more enemies
 
 do_event:
-       ld  hl,(curevent)
        ld  de,enemies-4
 chk_noenemy:
        inc de
@@ -383,73 +378,38 @@ chk_noenemy:
        inc de
        inc de
        ld  a,(de)
-       or  a
+       or  a                   ;0 = no enemy present
        jr  nz,chk_noenemy
 
-       inc de
-       ld  a,(hl)
-       ld  (de),a              ;type
-       ld  hl,enemy01
+       ld  a,(eventenemy)      ;enemy type to place (lvl)
+       ld  hl,enemy01          ;enemy 1 specs
        ld  c,a
-       ld  b,0
-       add hl,bc
-       add hl,bc
+       ld  b,0                 ;bc = enemy nr.
+       add hl,bc               ;add 2*bc
        add hl,bc               ;hl = enemy specs
-       dec de
-       ld  a,(hl)              ;load hitpoints
-       or  1                   ;set type 1 (normal) enemy
+       ld  a,(hl)              ;load hitpoints+occ of this enemy class
        ld  (de),a              ;occ
 
-       inc de
-       inc de
-       ld  a,$5a
-       ld  (de),a              ;x
-       inc de
-
-       ld  hl,(curevent)
-       inc hl
-       ld  a,(hl)
-       ld  (de),a              ;y
-
-       inc hl                  ;+0
-       ld  a,(hl)
-       cp  $ff
-       jp  z,Next_level
-       ld  (nextevent),a
-
        inc hl
-       ld  (curevent),hl
+       inc de
+       ld  a,(hl)              ;load movement+type of this enemy class
+       ld  (de),a              ;enemy type
+
+       inc de                  ;_________
+       ld  a,122               ;appear at right edge of screen (128-6)
+       ld  (de),a              ;= x-position
+       inc de                  ;_________
+       ld  a,51                ;random number <51
+       call Random             ;create!
+       ld  (de),a              ;= y-position
        ret
 
 ;--------------------------- enemy fires --------------------------------------
 
-Enemy_fires:
-       ld  a,r
-       and %01111111
-       cp  19
-       ret p
-
-       add a,a
-       add a,a
-       ld  c,a
-       ld  b,0                 ;bc = a*4
-       ld  hl,enemies
-       add hl,bc               ;hl = enemy
-       ld  a,(hl)
-       or  a
-       ret z                   ;return if no enemy
-       dec a
-       dec a
-       ret z                   ;or exploding enemy
-       inc hl
-       inc hl
-       ld  c,(hl)              ;enemy x-pos
-       dec c
-       dec c                   ;c = x-2
-       inc hl
-       ld  a,(hl)              ;y-pos
-       add a,5
-       ld  e,a                 ;e = y+5
+Enemy_fires:                   ;de = x,y
+       dec d
+       dec d                   ;d = x-2
+       inc e                   ;e = y+1
 
        ld  b,10
        ld  hl,ebullets
@@ -466,7 +426,7 @@ find_ebullet:
 found_ebullet:
        ld  (hl),1              ;use bullet
        inc hl
-       ld  (hl),c              ;set x-pos
+       ld  (hl),d              ;set x-pos
        inc hl
        ld  (hl),e              ;set y-pos
        ret         
@@ -491,7 +451,6 @@ next_bullet:
        djnz handle_bullet
        ret
 
-
 enemy_bullet:
        inc hl
        ld  a,(hl)              ;bullet x
@@ -529,9 +488,7 @@ enemy_bullet:
        jr  nc,next_bullet
 
        call damage_you         ;HIT!!
-
 remove_ebullet:
-       dec hl
        dec hl
        ld   (hl),0             ;bullet > unused
        jr   next_bullet
@@ -540,7 +497,7 @@ remove_ebullet:
 
 Handle_enemies:
        ld  hl,enemies
-       ld  b,20
+       ld  b,nrenemies         ;handle all enemies
 
 handle_enemy:
        push bc
@@ -549,44 +506,82 @@ handle_enemy:
        ld  a,(hl)
        and %00000011
        jr  z,next_enemy        ;occ "no enemy" 0
-       and %00000001
-       jr  z,exploding_enemy   ;occ "exploding" 2
+       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
 
-normal_enemy:                  ;occ "normal" 1
+normal_enemy:
        inc hl
-       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  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_enemy01      ;first enemy sprite
+       add ix,de               ;add offset for current enemy
+       pop hl
+
        inc hl
-       ld  d,(hl)              ;x
+       ld  a,(hl)              ;x
+       dec a                   ;move left
+       jp  m,remove_enemy      ;off screen
+       jr  z,remove_enemy      ;"
+       ld  d,a
+
        inc hl
        ld  e,(hl)              ;y
-
-       ld  a,d
-       or  a
-       jr  z,next_enemy
+       ld  a,b                 ;%xxx00001=moving -0=normal
        dec a
-       ld  d,a
-       jr  z,remove_enemy
-
-       ld  (hl),e
-       dec hl
-       ld  (hl),d
-       ld  ix,spr_enemy01
-       ld  b,$00
-       add ix,bc
-       call drw_spr
-       jr  next_enemy
+       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
+
+ymove_done:
+       dec hl                  ;@x
+       ld  (hl),d              ;store new x
+
+       push de                 ;save registers
+       call drw_spr            ;display sprite @ix
+       pop  de                 ;restore (destroyed by drw_spr)
+
+       ld   a,$ff              ;fire frequency
+       call Random             ;random value < a
+       dec  a                  ;fire if 1
+       call z,Enemy_fires      ;fires bullet
+       jr   next_enemy         ;finished
 
 remove_enemy:
-       dec hl
-       dec hl
-enemy_gone:
-       dec hl
+       pop hl
        ld  (hl),$0000          ;bye bye enemy
-
+       push hl
 next_enemy:
        pop hl
        ld  bc,$0004
@@ -604,7 +599,7 @@ exploding_enemy:
 
        ld  a,(hl)
        cp  15
-       jr  z,enemy_gone        ;remove when at last frame
+       jr  z,remove_enemy      ;remove when at last frame
        inc a
        ld  (hl),a              ;next frame
        jr  next_enemy
@@ -613,88 +608,249 @@ exploding_enemy:
 
 Enemies_hit:
        ld  a,(your_occ)
-       or  a
+       or  a                   ;0 = you're normal
        ret nz
 
        ld  de,(x)              ;e = X, d = Y
-       ld  hl,enemies-4
-check_next:
-       ld  bc,$0004
-       add hl,bc
-
-       ld  a,(hl)
-       cp  $ff
-       ret z                   ;-1 = no more enemies
+       ld  hl,enemies
+       ld  b,nrenemies         ;check all 20 enemies
+check_collision:
        push hl
-       cp  1
-       jr  nz,nocrash          ;1 = enemy
+       ld  a,(hl)
+       and %00000010
+       jr  z,check_next        ;2 or 3 = ok
 
        inc hl
        inc hl
        ld  a,(hl)              ;check x match
        sub e
        add a,6
-       jp  m,nocrash
+       jp  m,check_next
        cp  12
-       jr  nc,nocrash
+       jr  nc,check_next
 
        inc hl
        ld  a,(hl)              ;check y match
        sub d
        add a,6
-       jp  m,nocrash
+       jp  m,check_next
        cp  12
-       jr  nc,nocrash
+       jr  nc,check_next
 
        dec hl
        dec hl
-       ld  (hl),0              ;explosionFrame 0
+       xor a
+       ld  (hl),a              ;explosionFrame 0
        dec hl
-       ld  (hl),2              ;set to explode
-       call damage_you
+       inc a
+       ld  (hl),a              ;set to explode
+       call damage_you         ;auch!
 
-nocrash:
+check_next:
        pop hl
-       jr  check_next
+       inc hl
+       inc hl
+       inc hl
+       inc hl
+       djnz check_collision
+       ret
+
+;--------------------------- game over ----------------------------------------
+
+game_over:
+       call _clrLCD            ;clear screen
+       ld  hl,$0603
+       ld  (_curRow),hl        ;center
+       ld  hl,txt_gameover
+       call _puts              ;display "GAME OVER"
+
+       ld  hl,lives
+       dec (hl)                ;decrease lives
+
+       ld  b,$20
+wait2: halt \ halt
+       djnz wait2              ;delay
+       call _getkey            ;wait for keypress
+
+;--------------------------- new game -----------------------------------------
+
+New_level:
+       xor a                   ;a=0
+       ld  hl,x                ;begin position x=...
+       ld  (hl),a              ;...=a=0=left
+       inc hl                  ;y=...
+       ld  (hl),24             ;...=24=middle
+       ld  (level),a           ;reset level nr
+       ld  (score),a           ;reset score
+       ld  hl,level01-3        ;set level pointer to level#1
+       ld  (levelp),hl         ;reset level pointer
 
 ;--------------------------- next level ---------------------------------------
 
 Next_level:
-       ld  hl,Leveldata+1
-       ld  (curevent),hl
+       ld  hl,level
+       inc (hl)                ;increase level nr.
+       ld  a,80
+       ld  (nextevent),a       ;time to first enemy appearance
+
+       ld  hl,(levelp)         ;level pointer
+       inc hl
+       inc hl
+       inc hl                  ;update to point to next level
+       ld  (levelp),hl         ;save
+
+       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  (your_occ),a        ;reset your ship (not exploding)
+
+;--------------------------- setup game ---------------------------------------
+
+game_setup:
+       call _clrLCD            ;clear screen
+       ld a,%10111011
+       ld  hl,$fc00            ;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)
+       ld  l,a
+       ld  h,$00
+
+       call UNPACK_HL
+       add a,'0'
+       ld  b,a
+       call UNPACK_HL
+       add a,'0'
+       call _putc              ;display second digit
+       ld  a,b
+       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
+
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$1802            ;bottom left
+       call drw_spr
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$2002            ;bottom left
+       call drw_spr
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$2802            ;bottom left
+       call drw_spr
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$3002            ;bottom left
+       call drw_spr
+       ld  ix,spr_icon00       ;display icons
+       ld  de,$3802            ;bottom left
+       call drw_spr
+
+       ld  hl,GRAPH_MEM        ;from storage (top left)
+       ld  de,$fc00+(56*16)    ;to screen (top left)
+       ld  a,8                 ;display height = 64 bytes (minus 8 for bar)
+displayloop3:
+       ld  bc,16               ;display width = 16 bytes (16*8bits=256pixels)
+       ldir                    ;16x de >> hl
+       dec a                   ;next line
+       jr  nz,displayloop3     ;loop 8x
+
+       ld  hl,$3a00            ;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
+
+       ld  hl,$fc00+(16*57)    ;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
+;--------------------------- exit ---------------------------------------------
+
+exit_game:
        ret
 
 ;--------------------------- putsprite ----------------------------------------
+;--------------------------- de =(X,Y) ----------------------------------------
 
 offsets_table:
-       .db 128,64,32,16,8,4,2,1
+       .db 128,64,32,16,%1000,%0100,%0010,%0001
 drw_spr:
-       ld  a,d
-       and 7
-       ld  hl,offsets_table
-       ld  c,a
-       ld  b,0
-       add hl,bc
-       ld  a,(hl)
+       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  (_smc1+1),a
 
-       ld  (_smc1+1),a
-       ld  hl,GRAPH_MEM
-       ld  a,e
-       add a,a
-       add a,e
-       add a,a
+       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
+ ;b=0
        rl  b
-       add a,a
+       add a,a                 ;y*16 (width of screen)
        rl  b
-       srl d
-       srl d
-       srl d
-       add a,d
-       jr  nc,_n1
-       inc b
-_n1:   ld  c,a
-       add hl,bc
+       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
+               ;optimize tip: reverse hl <-> bc (??)
           
        ld  d,(ix)
        ld  b,(ix+1)
@@ -710,249 +866,379 @@ _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
 
+;---------------------- display 5digit number ---------------------------------
 
 _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
+       push bc                 ;save bc
+       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
+dis:   ld   hl,savestr
+       call _vputs
+       pop  bc
+       ret
 
+savestr:
+       .db "PAD98",0
 
 
+;------------------------------------------------------------------------------
 ;------------------------------- sprites --------------------------------------
+;------------------------------------------------------------------------------
 
 spr_ship:
-       .db 7,7         ;your ship:
-       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
+       .db 9,1         ;ship icon
+       .db %11100000   ; â–ˆâ–ˆâ–ˆ
+       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %00111110   ;   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111001   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
+       .db %11111001   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
+       .db %11111001   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
+       .db %00111110   ;   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11100000   ; â–ˆâ–ˆâ–ˆ
+
+spr_ship01:
+       .db 7,7         ;ship alpha class
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
        .db %11100000   ; â–ˆâ–ˆâ–ˆ
        .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
        .db %11110010   ; â–ˆâ–ˆâ–ˆâ–ˆ  â–ˆ
        .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
        .db %11100000   ; â–ˆâ–ˆâ–ˆ
-       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
+spr_ship02:
+       .db 7,7         ;ship beta class
+       .db %11000000   ; â–ˆâ–ˆ
+       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01110010   ;  â–ˆâ–ˆâ–ˆ  â–ˆ
+       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11000000   ; â–ˆâ–ˆ
 
 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 %11110000   ; â–‘▒▓███��
+       .db %11111000   ; â–‘▒▓████��
+       .db %11110000   ; â–‘▒▓███��
 
 spr_bullet11:
        .db 3,3         ;enemy bullets
-       .db %01000000   ;  ï¿½ï¿½â–“â–’â–‘
-       .db %11100000   ; ï¿½ï¿½â–ˆâ–ˆâ–“â–’â–‘
-       .db %01000000   ;  ï¿½ï¿½â–“â–’â–‘
+       .db %01000000   ;  ï¿½ï¿½â–“â–’â–‘
+       .db %11100000   ; ï¿½ï¿½â–ˆâ–ˆâ–“â–’â–‘
+       .db %01000000   ;  ï¿½ï¿½â–“â–’â–‘
 
-spr_enemy01:
-       .db 6,6         ;enemy type one
-       .db %00111100   ;   â–ˆâ–ˆâ–ˆâ–ˆ
-       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
-       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
-       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
-       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
-       .db %00111100   ;   â–ˆâ–ˆâ–ˆâ–ˆ
-spr_enemy02:
-       .db 6,6         ;enemy type two
-       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
-       .db %10111000   ; â–ˆ â–ˆâ–ˆâ–ˆ
-       .db %10111000   ; â–ˆ â–ˆâ–ˆâ–ˆ
-       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
-       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-spr_enemy03:
-       .db 6,6         ;enemy type three
-       .db %00111000   ;   â–ˆâ–ˆâ–ˆ
-       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %00111000   ;   â–ˆâ–ˆâ–ˆ
-spr_enemy03:
-       .db 6,6         ;enemy type three
-       .db %00111000   ; â–ˆâ–ˆâ–ˆ
-       .db %01111100   ;   â–ˆâ–ˆ
-       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
-       .db %00111000   ; â–ˆâ–ˆâ–ˆ
+;---------------------------------------- explosion -------------------------------------------
 
 spr_explosion:                               
        .db 8,6         ;1
        .db %00000000
-       .db %00011100
-       .db %00111110
-       .db %01010110
-       .db %00111000
+       .db %00011100   ;    â–ˆâ–ˆâ–ˆ
+       .db %00111110   ;   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01010110   ;  â–ˆ â–ˆ â–ˆâ–ˆ
+       .db %00111000   ;   â–ˆâ–ˆâ–ˆ
        .db %00000000
 
        .db 8,6         ;2
-       .db %00110000
-       .db %01001110
-       .db %10111110
-       .db %01001111
-       .db %00111000
-       .db %00011010
+       .db %00110000   ;   â–ˆâ–ˆ
+       .db %01001110   ;  â–ˆ â–’███
+       .db %10111110   ; â–ˆ â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01001111   ;  â–ˆ â–’████
+       .db %00111000   ;   â–ˆâ–ˆâ–ˆ
+       .db %00011010   ;    â–ˆâ–ˆ â–ˆ
 
        .db 8,6         ;3
-       .db %11110011
-       .db %01001110
-       .db %10110101
-       .db %01000101
-       .db %00111110
-       .db %11011010
+       .db %10110011   ; â–ˆ â–ˆâ–ˆ  â–ˆâ–ˆ
+       .db %01001110   ;  â–ˆ  â–ˆâ–ˆâ–ˆ
+       .db %10110101   ; â–ˆ â–ˆâ–ˆâ–’█▒█
+       .db %01000101   ;  â–ˆ  â–’█▒█
+       .db %00111110   ;   â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11011010   ; â–ˆâ–ˆ â–ˆâ–ˆ â–ˆ
 
        .db 8,6         ;4
-       .db %11110010
-       .db %01001110
-       .db %10110101
-       .db %01000101
-       .db %00111110
-       .db %01011010
+       .db %00101010   ; â–’ â–ˆâ–’â–ˆ â–ˆâ–’
+       .db %01000110   ;  â–ˆ  â–’██
+       .db %10110101   ; â–ˆ â–ˆâ–ˆ â–ˆ â–ˆ
+       .db %01100110   ;  â–ˆâ–ˆ  â–ˆâ–ˆâ–’
+       .db %00111100   ;   â–ˆâ–ˆâ–ˆâ–ˆâ–’
+       .db %01011001   ; â–’â–ˆ â–ˆâ–ˆ â–’â–ˆ
 
        .db 8,6         ;5
-       .db %01000001
-       .db %00100110
-       .db %00010101
-       .db %01000100
-       .db %00010010
-       .db %10011010
+       .db %01000001   ;  â–ˆâ–’ â–’ â–’â–ˆ
+       .db %00100101   ;  â–’â–ˆ  â–ˆâ–’â–ˆ
+       .db %00010100   ; â–’ â–’â–ˆ â–ˆ â–’
+       .db %01000100   ;  â–ˆâ–’  â–ˆ
+       .db %00010010   ;   â–’█▒▒█
+       .db %10011010   ; â–ˆâ–’ â–ˆâ–ˆ â–ˆâ–’
 
        .db 8,6         ;6
-       .db %01000100
-       .db %00100000
-       .db %00000001
-       .db %01000100
-       .db %00100010
-       .db %10001000
+       .db %01000100   ;  â–ˆ   â–ˆ â–’
+       .db %00100000   ;   â–’â–ˆ â–’ â–’
+       .db %00000001   ;    â–’ â–’ â–ˆ
+       .db %01000100   ;  â–ˆ   â–ˆ
+       .db %00100010   ;   â–ˆâ–’  â–ˆ
+       .db %01001000   ; â–’â–ˆ â–’â–ˆ â–’
 
        .db 8,6         ;7
-       .db %00001000
-       .db %11000010
-       .db %00000000
-       .db %00100000
-       .db %00000001
-       .db %00110000
+       .db %00001000   ;  â–’  â–ˆâ–’
+       .db %11000010   ; â–ˆâ–ˆ â–’  â–ˆ
+       .db %00000000   ;        â–’
+       .db %00100000   ;  â–’â–ˆ  â–’
+       .db %00000001   ;   â–’   â–’â–ˆ
+       .db %00110000   ;  â–’██▒
 
        .db 8,6         ;8
-       .db %00000100
-       .db %00000000
-       .db %01000000
-       .db %00000000
-       .db %00000001
-       .db %00100100
-
-;---------------------------- enemy types -------------------------------------
-
-enemy01:       .db %00000000,$ff,$ff           ;$hits   $fire frequency
-enemy02:       .db %00000100,$ff,$ff
-enemy03:       .db %00001000,$ff,$ff
-
-;---------------------------- level data --------------------------------------
-
-Leveldata:
-       .db $01,$01,$40         ;$time (ff=end)    $type    $y-pos
-       .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,$00,$10
-       .db $10,$00,$18
-       .db $0e,$00,$20
-       .db $0c,$00,$28
-       .db $0a,$00,$30
-       .db $08,$00,$38
-       .db $06,$00,$40
-       .db $04,$00,$48
-       .db $2a,$00,$20
-       .db $ff,$ff,$ff
+       .db %00000100   ;     â–’â–ˆ
+       .db %00000000   ; â–’â–’    â–’
+       .db %01000000   ;  â–ˆ
+       .db %00000000   ;   â–’
+       .db %00000010   ;       â–ˆâ–’
+       .db %00100100   ;   â–ˆâ–’ â–ˆ
+
+;--------------------------------------- bar -----------------------------------
+
+spr_icon00:
+       .db 8,7
+       .db %10101010   ; â–ˆ â–ˆ â–ˆ â–ˆ
+       .db %11010101   ; â–ˆâ–ˆ â–ˆ â–ˆ â–ˆ
+       .db %10101010   ; â–ˆ â–ˆ â–ˆ â–ˆ
+       .db %11010101   ; â–ˆâ–ˆ â–ˆ â–ˆ â–ˆ
+       .db %10101010   ; â–ˆ â–ˆ â–ˆ â–ˆ
+       .db %11010101   ; â–ˆâ–ˆ â–ˆ â–ˆ â–ˆ
+       .db %10101010   ; â–ˆ â–ˆ â–ˆ â–ˆ
+spr_icon01:
+       .db 8,7
+       .db %10000000   ; â–ˆ.......
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+spr_icon02:
+       .db 8,7
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
+       .db %10000000   ; â–ˆ
 
 ;---------------------------- texts -------------------------------------------
 
-title_message:
-         .db      "* * NEMESIS * *",0
+txt_about:     .db "v0.6.825 ","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_lives:     .db "Lx0?",0
 
 ;---------------------------- save data ---------------------------------------
 
 stored_data_start:
 
-level          .dw $0000               ;level number
-background     .db %00000001           ;level background
-timer          .dw $0000
-curevent       .dw Leveldata+1         ;next event
-nextevent      .db (Leveldata)         ;time to next event
+timer          .db $00                 ;frame counter
+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_occ       .db $00                 ;0=normal 1=exploding 2=gone
+your_occ       .db $00                 ;0=normal 1..16=exploding
 lives          .dw $0003       ;unused
 x              .db $16                 ;x-pos
 y              .db $46                 ;think about it..
 hp             .db $00                 ;hitpoints left
-your_status    .db $00,$00     ;unused
 
 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      = 20
 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
-               .dw $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
-; 0011 2233 >> 0=occupation (and %00000011: 0=no enemy 1=normal 2=exploding)
-;              1=frame/ship 2=x 3=y
 
-variables_end:
+               .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
+
+; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
+; %11111111 (ship type or explosion frame)  %11111111 (x) %11111111 (y)
 
-stored_data_end:
+;---------------------------- enemy data --------------------------------------
 
+sprites:
+       .db $00
+       .db spr_enemy02-spr_enemy01
+       .db spr_enemy03-spr_enemy01
+       .db spr_enemy04-spr_enemy01
+       .db spr_enemy05-spr_enemy01
+
+spr_enemy01:
+       .db 6,6         ;enemy type one
+       .db %00111100   ;   â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
+       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01110000   ;  â–ˆâ–ˆâ–ˆ
+       .db %00111100   ;   â–ˆâ–ˆâ–ˆâ–ˆ
+spr_enemy02:
+       .db 8,7         ;enemy type two
+       .db %00111111   ;    â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111110   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111000   ;  â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %00111111   ;    â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+spr_enemy03:
+       .db 6,6         ;enemy type three
+       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11110000   ; â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+spr_enemy04:
+       .db 6,6         ;enemy type four
+       .db %00111000   ;   â–ˆâ–ˆâ–ˆ
+       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111000   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111100   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %00111000   ;   â–ˆâ–ˆâ–ˆ
+spr_enemy05:
+       .db 7,6         ;enemy type four
+       .db %00011110   ;    â–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111110   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %11111100   ; â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %01111110   ;  â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆ
+       .db %00011110   ;    â–ˆâ–ˆâ–ˆâ–ˆ
+
+enemy01:                               ;HP:1  move:- fire:-
+       .db %00000010,%00000000                 ;first two enemy bytes
+enemy02:                               ;HP:1  move:1 fire:1.5%
+       .db %00000010,%00000001
+enemy03:                               ;HP:2  move:- fire:3%
+       .db %00000110,%00000010
+enemy04:                               ;HP:5  move:- fire:6%
+       .db %00010010,%00000011
+enemy05:                               ;HP:10 move:- fire:25%
+       .db %00100111,%00000100
+
+;----------------------------- level info -------------------------------------
+
+level01:
+       .db $00,$15,$30                 ;enemy nr ; enemy frequency ; next lvl
+level02:
+       .db $01,$11,$4c
+level03:
+       .db $02,$19,$40
+level04:
+       .db $03,$0f,$50
+level05:
+       .db $04,$2e,$3e
+
+;----------------------------- 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.6.825
+;Latest modification  Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· 20.IIX.99
+;Calc Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â·  TI-86 only
+;Size Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â·  2077 bytes on calc
 
+;Author Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· SHIAR
+;ICQ Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â·  #43840958
+;E-mail Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â·  shiar@wishmail.net
+;Homepage Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· coming soon (www.wish.net/~shiar)
 
-;NEMESIS'86 by Shiar
+;Beta:  yes Â· Â·  still to come: lives, armor, powerups, more levels, enemies...
+;Sound:  no Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· Â· don't know if i'll make sounds... we'll see
+;Fun:   yes Â· Â· Â· Â· Â· although not yet finished, the game is playable: 5 levels
+;Bugs:  yes  crashes after death; press <EXIT> at GameOver-screen. Send me more
+;Source: no Â· Â· Â· Â· Â· Â· Â· Â·  not yet, will be released when Nemesis is finished
 
+;----------------------------- version history --------------------------------
 
 ;0.01.717 -- 17.VII.99 -- size 984
 ;
@@ -961,7 +1247,7 @@ stored_data_end:
 ;
 ; 0.1.718 -- 18.VII.99 -- size 907
 ;
-;      * no crash when level restarts for the third time
+;      # no crash when level restarts for the third time
 ;      * exit-procedure updated, unnecessary stuff/keychecks removed
 ;      * alot of unused code removed
 ;      + different types of enemies (just look different)
@@ -978,5 +1264,50 @@ stored_data_end:
 ;      + 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
+;
+;      # 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 when at left side (instead of becoming invisible)
+;      + displays level number before each level begins
+;
+; 0.5.725 -- 25.VII.99 -- size 1778
+;
+;      * waits a sec at level display (in case of accidental keypress)
+;      * 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
+;      + your ship explodes on impact with ships/bullets
+;      * game over screen will be displayed just *after* your ship's gone
+;      + frame counter onscreen
+;
+; 0.6.820 -- 20.IIX.99 -- size 2152 (2077 on calc)
+;
+;      * 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 2160 (2085 on calc)
+;
+;      # 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
 
 
+;       + added        - removed       * changed       # bug fixed