version 0.3: shooting enemies (hitpoints)
[nemesis.git] / nemesis.z80
index 259db9b11754c13527b904fa60951722f6f6484d..b735b9c0860f4c417e9a3ccdcf11f75c1efa555a 100644 (file)
@@ -1,25 +1,24 @@
-       .include "asm86.h"           
+       .include "asm86.h"
        .include "ti86asm.inc"
        .include "ti86abs.inc"
+
        .org _asm_exec_ram
+
        nop
        jp  Start
        .dw $0000
        .dw Title
-Title: .db "Nemesis v0.01 by Shiar",0
-Start: call _runindicoff
-
-TEXT_MEM = $c0f9
-temp1 = $c120
-StringPlace = $c180
-jpf1 = $c200
+Title: .db "Nemesis v0.3.719 by Shiar",0
+Start:
+       jr init
 
+just_fired     = $c0f9         ;byte
+temp1          = $c100         ;word
 
 ;-------------------- init ----------------------------------------------------
 
 init:
-       set 0,(iy+3)
-       ld  (iy+13),0
+       call _runindicoff
 
 ;-------------------- main menu -----------------------------------------------
 
@@ -41,18 +40,16 @@ play_game:
 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
-       call     _puts
-       djnz     l11
-
-;------------------------ in-game texts ---------------------------------------
+       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
+       call _puts
+       djnz l11
 
 in_game_text:
        .db 16,0,"LIVES",0
@@ -62,164 +59,310 @@ in_game_text:
 str_question:
        .db "-----",0
 
+;------------------------------------------------------------------------------
 ;-------------------------- game loop -----------------------------------------
+;------------------------------------------------------------------------------
 
 game_main_loop:
-       ld  hl,timer
+       ld  hl,timer            ;update time
        inc (hl)
 
+Clear_screen:
        xor a
        ld  hl,GRAPH_MEM+(16*12)
        ld  b,a
-csl:   ld  (hl),a
+ ld a,(background)
+clearloop:
+       ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
        ld  (hl),a
        inc hl
-       djnz csl
+       djnz clearloop
 
-       call Level_event
-       call Handle_Ship
-       call Handle_enemies
-       call Display_Screen
-       call Misc_Keys
-       jr  game_main_loop
+check_exitkey:
+       ld  a,%00111111         ;<exit> pressed?
+       out (1),a
+       nop
+       nop
+       in  a,(1)
+       bit 6,a
+       jr  z,quit              ;yes: quit game
+
+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 Enemies_hit        ;check for collision with enemies
+
+       call Display_Screen     ;display all
+       halt \ halt \ halt      ;delay
+       jr   game_main_loop     ;loop
+
+quit:  ret
 
 ;---------------------- display -----------------------------------------------
 
 Display_Screen:
-       ld  a,64                       ;Display Image
+       ld  a,64                ;Display Image
        ld  hl,GRAPH_MEM+(16*12)
        ld  de,$fc00
-dsl:   ld  bc,12
+displayloop:
+       ld  bc,12
        ldir
        inc de
        inc de
        inc de
        inc de
        dec a
-       jr  nz,dsl
+       jr  nz,displayloop
 
-       ld  hl,$1007                   ;Display Score
-       ld  (_curRow),hl
-       ld  hl,(score)
-;       jp  _D_HL_DECI
+;      ld  hl,$1007            ;Display Score
+;      ld  (_curRow),hl
+;      ld  hl,(score)
+;      jp  _D_HL_DECI
        ret
 
 ;------------------------- handle ship ----------------------------------------
 
 Handle_Ship:
-         ld       a,(your_status)
-         bit      4,a
-         jr       nz,you_not_normal
-         or       a
-         jr       z,ok
-         dec      a
-         ld       (your_status),a
-         ld       hl,(lives)
-         ld       a,l
-         or       h
-         jr       nz,ok
-         pop      af
-         ret
+       ld  a,(your_occ)
+       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
+
 ok:
-         ld       a,%01111110
-         out      (1),a
-         ld       hl,y
-         in       a,(1)
-         rra
-         ld       b,a
-
-         jr       c,no_down
-         ld       a,(hl)
-         inc      a
-         cp       73                   ;y < 73
-         jr       z,no_down
-         ld       (hl),a
-no_down: dec      hl
-         rr       b
-         jr       c,no_left
-         ld       a,(hl)
-         dec      a
-         jr       z,no_left            ;x > 0
-         ld       (hl),a
-no_left: rr       b   
-         jr       c,no_right
-         ld       a,(hl)
-         inc      a
-         cp       89                   ;x < 89
-         jr       z,no_right
-         ld       (hl),a
-no_right: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_ship
+       ld  a,%01111110
+       out (1),a
+       ld  hl,y
+       in  a,(1)
+       rra
+       ld  b,a
+
+       jr  c,no_down
+       ld  a,(hl)
+       inc a
+       cp  73                  ;y < 73
+       jr  z,no_down
+       ld  (hl),a
+no_down:
+       dec hl
+       rr  b
+       jr  c,no_left
+       ld  a,(hl)
+       dec a
+       jr  z,no_left           ;x > 0
+       ld  (hl),a
+no_left:
+       rr b   
+       jr  c,no_right
+       ld  a,(hl)
+       inc a
+       cp  89                  ;x < 89
+       jr  z,no_right
+       ld  (hl),a
+no_right:
+       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_ship
 
 display_common:
-         ld       e,(hl)
-         jp       drw_spr
-
-you_not_normal:
-
-         ld       hl,(score)
-         ld       de,-6
-         add      hl,de    
-         ld       a,255
-         cp       h
-         jr       nz,_ok_
-         ld       hl,0
-_ok_:    ld       (score),hl
-         ld       a,(your_status)
-         dec      a
-         ld       (your_status),a
-         inc      a
-         and      14
-         xor      14
-         ld       hl,x-1
+       ld  e,(hl)
+       jp  drw_spr
+
+;you_not_normal:
+;      ld       a,(your_status)
+;      dec      a
+;      ld       (your_status),a
+;      inc      a
+;      and      14
+;      xor      14
+;      ld       hl,x-1
 
 explosion_stuff:
-         rra
-         add      a,a
-         add      a,a
-         add      a,a
-         ld       c,a
-         ld       b,0
-         ld       ix,spr_explosion
-         add      ix,bc
-         inc      hl
-         ld       d,(hl)
-         inc      hl
-         jr       display_common
+       rra
+       add a,a
+       add a,a
+       add a,a
+       ld  c,a
+       ld  b,0
+       ld  ix,spr_explosion
+       add ix,bc
+       inc hl
+       ld  d,(hl)
+       inc hl
+       jr  display_common
 
-;---------------------------- handle keys -------------------------------------
+damage_you:
+       or  %10101010
+       ld  (background),a
+       ret
 
-Misc_Keys:
-         ld       a,$BF
-         out      (1),a
-       nop
-       nop
-         in       a,(1)
-         rla
-         rla
-         jr       nc,e_exit
+;------------------------- fire bullet ----------------------------------------
 
-         ld       a,$FD
-         out      (1),a
-       nop
-       nop
-       in       a,(1)
-       rra
-       bit      5,a
-       ret      nz
-e_exit:        pop      af
+Fire_bullet:
+       ld  a,%00111111
+       out (1),a
+       ld  a,(your_occ)
+       or  a
+       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  hl,ybullets
+       ld  de,3
+       ld  b,10
+find_ybullet:
+       ld  a,(hl)
+       or  a
+       jr  z,found_ybullet     ;0 = no bullet here
+       add hl,de
+       djnz find_ybullet       ;look next bullet
+       ret
+
+found_ybullet:
+       ld  (hl),1              ;use bullet
+       inc hl
+       ld  a,(x)
+       add a,5
+       ld  (hl),a              ;set x
+       ld  a,(y)
+       add a,2
+       inc hl
+       ld  (hl),a              ;set y
+       ret
+
+;------------------------ handle bullets --------------------------------------
+
+remove_bullet:
+       dec hl
+       ld  (hl),0              ;dump this bullet!
+       ret
+
+Handle_bullets:
+       ld  hl,ybullets
+       ld  b,10
+scan_bullets:
+       push bc
+       push hl
+       ld  (temp1),hl
+       ld  a,(hl)
+       inc hl
+       dec a
+       call z,bullet_type1
+       pop hl
+       pop bc
+       ld  de,3
+       add hl,de
+       djnz scan_bullets
+       ret
+
+bullet_type1:
+       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
+       ld  (hl),a              ;save new pos.
+       ld  d,a
+       inc hl
+       ld  e,(hl)              ;e = Y
+       ld  ix,spr_bullet01
+       push de
+       call drw_spr            ;display bullet
+       pop de
+       ld  b,20
+       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
+
+       inc hl
+       inc hl
+       ld  a,(hl)              ;check x
+       sub d
+       add a,5
+       jp  m,nohit
+       cp  8
+       jr  nc,nohit
+
+       inc hl
+       ld  a,(hl)              ;check y
+       sub e
+       add a,5
+       jp  m,nohit
+       cp  10
+       jr  nc,nohit
+
+       xor a
+       push hl
+       ld  hl,(temp1)
+       ld  (hl),a              ;remove bullet
+       pop hl
+
+       dec hl
+       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
+       inc hl
+       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  (hl),a              ;save
+       pop hl
+       ret
+
+nohit: pop hl
+       inc hl
+       inc hl
+       inc hl
+       inc hl
+       djnz hit_enemies        ;check next enemy
        ret
 
 ;--------------------------- level events -------------------------------------
@@ -233,40 +376,193 @@ Level_event:
 
 do_event:
        ld  hl,(curevent)
-       inc hl
-
-       ld  de,enemies
-       dec de
-       dec de
-search_noenemy:
+       ld  de,enemies-4
+chk_noenemy:
+       inc de
+       inc de
        inc de
        inc de
        ld  a,(de)
-       cp  $ff
-       jr  nz,search_noenemy
+       or  a
+       jr  nz,chk_noenemy
+
+       inc de
+       ld  a,(hl)
+       ld  (de),a              ;type
+       ld  hl,enemy01
+       ld  c,a
+       ld  b,0
+       add hl,bc
+       add hl,bc
+       add hl,bc               ;hl = enemy specs
+       dec de
+       ld  a,(hl)              ;load hitpoints
+       or  1                   ;set type 1 (normal) enemy
+       ld  (de),a              ;occ
 
+       inc de
+       inc de
        ld  a,$5a
-       ld  (de),a
+       ld  (de),a              ;x
        inc de
+
+       ld  hl,(curevent)
+       inc hl
        ld  a,(hl)
-       ld  (de),a
+       ld  (de),a              ;y
+
+       inc hl                  ;+0
+       ld  a,(hl)
+       cp  $ff
+       jp  z,Next_level
+       ld  (nextevent),a
 
        inc hl
        ld  (curevent),hl
+       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)
-       ld  (nextevent),a
+       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
+
+       ld  b,10
+       ld  hl,ebullets
+find_ebullet:
+       ld  a,(hl)
+       or  a
+       jr  z,found_ebullet     ;0 = not used
+       inc hl
+       inc hl
+       inc hl
+       djnz find_ebullet       ;look next bullet
+       ret
+
+found_ebullet:
+       ld  (hl),1              ;use bullet
+       inc hl
+       ld  (hl),c              ;set x-pos
+       inc hl
+       ld  (hl),e              ;set y-pos
+       ret         
+
+;----------------------------- enemy bullets ----------------------------------
+
+Enemy_bullets:
+       ld  hl,ebullets
+       ld  b,10
+handle_bullet:
+       push bc
+       push hl
+       ld  a,(hl)
+       or  a
+       jr  nz,enemy_bullet
+next_bullet:
+       pop hl
+       pop bc
+       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  e,(hl)              ;e=y
+       ld  ix,spr_bullet11     ;display enemy bullet
+       call drw_spr
+
+       ld  a,(your_occ)
+       or  a
+       jr  nz,next_bullet      ;0 = you're normal
+
+       pop hl
+       push hl
+       inc hl                  ;check x
+       ld  a,(x)
+       sub (hl)
+       add a,6
+       jp  m,next_bullet
+       cp  9
+       jr  nc,next_bullet
+
+       inc hl                  ;check y
+       ld  a,(y)
+       sub (hl)
+       add a,6
+       jp  m,next_bullet
+       cp  9
+       jr  nc,next_bullet
+
+       call damage_you         ;HIT!!
+
+remove_ebullet:
+       dec hl
+       dec hl
+       ld   (hl),0             ;bullet > unused
+       jr   next_bullet
+
 ;--------------------------- handle enemies -----------------------------------
 
 Handle_enemies:
        ld  hl,enemies
+       ld  b,20
 
 handle_enemy:
+       push bc
        push hl
-       ld  d,(hl)
+
+       ld  a,(hl)
+       and %00000011
+       jr  z,next_enemy        ;occ "no enemy" 0
+       and %00000001
+       jr  z,exploding_enemy   ;occ "exploding" 2
+
+normal_enemy:                  ;occ "normal" 1
        inc hl
-       ld  e,(hl)
+       ld  a,(hl)              ;type
+       add a,a
+       add a,a
+       add a,a
+       ld  c,a                 ;type*8 = offset
+       inc hl
+       ld  d,(hl)              ;x
+       inc hl
+       ld  e,(hl)              ;y
 
        ld  a,d
        or  a
@@ -279,302 +575,371 @@ handle_enemy:
        dec hl
        ld  (hl),d
        ld  ix,spr_enemy01
+       ld  b,$00
+       add ix,bc
        call drw_spr
        jr  next_enemy
 
 remove_enemy:
        dec hl
-       ld  (hl),$0000
+       dec hl
+enemy_gone:
+       dec hl
+       ld  (hl),$0000          ;bye bye enemy
 
 next_enemy:
        pop hl
-       inc hl
-       inc hl
+       ld  bc,$0004
+       add hl,bc
+       pop bc
+       djnz handle_enemy
+       ret
+
+exploding_enemy:
+       inc  hl
+       push hl
+       ld   a,(hl)
+       call explosion_stuff    ;display explosion
+       pop  hl
+
+       ld  a,(hl)
+       cp  15
+       jr  z,enemy_gone        ;remove when at last frame
+       inc a
+       ld  (hl),a              ;next frame
+       jr  next_enemy
+
+;--------------------------- check collision ----------------------------------
+
+Enemies_hit:
+       ld  a,(your_occ)
+       or  a
+       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
-       jr  nz,handle_enemy
+       ret z                   ;-1 = no more enemies
+       push hl
+       cp  1
+       jr  nz,nocrash          ;1 = enemy
+
+       inc hl
+       inc hl
+       ld  a,(hl)              ;check x match
+       sub e
+       add a,6
+       jp  m,nocrash
+       cp  12
+       jr  nc,nocrash
+
+       inc hl
+       ld  a,(hl)              ;check y match
+       sub d
+       add a,6
+       jp  m,nocrash
+       cp  12
+       jr  nc,nocrash
+
+       dec hl
+       dec hl
+       ld  (hl),0              ;explosionFrame 0
+       dec hl
+       ld  (hl),2              ;set to explode
+       call damage_you
+
+nocrash:
+       pop hl
+       jr  check_next
+
+;--------------------------- next level ---------------------------------------
 
+Next_level:
+       ld  hl,Leveldata+1
+       ld  (curevent),hl
        ret
 
 ;--------------------------- putsprite ----------------------------------------
 
 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,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
           
-         ld       d,(ix)       
-         ld       b,(ix+1)        
-_oloop:  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
-_smc1    ld       a,1                        ;Load pixel mask
-_iloop:  sla      c                          ;Test leftmost pixel
-         jr       nc,_noplot                 ;See if a plot is needed
-         ld       e,a                        ;OR pixel with screen
-         or       (hl)
-         ld       (hl),a
-         ld       a,e
+       ld  d,(ix)
+       ld  b,(ix+1)
+_oloop:        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
+_smc1: ld  a,1                 ;Load pixel mask
+_iloop:        sla c                   ;Test leftmost pixel
+       jr  nc,_noplot          ;See if a plot is needed
+       ld  e,a                 ;OR pixel with screen
+       or  (hl)
+       ld  (hl),a
+       ld  a,e
 _noplot: rrca
-         jr       nc,_notedge                ;Test if edge of byte reached
-         inc      hl                         ;Go to next byte
-_notedge:djnz     _iloop
-         pop      hl                         ;Restore address
-         ld       bc,12                      ;Go to next line
-         add      hl,bc
-         pop      bc                         ;Restore data
-         djnz     _oloop
-         ret
+       jr  nc,_notedge         ;Test if edge of byte reached
+       inc hl                  ;Go to next byte
+_notedge:djnz _iloop
+       pop hl                  ;Restore address
+       ld  bc,12               ;Go to next line
+       add hl,bc
+       pop bc                  ;Restore data
+       djnz _oloop
+       ret
 
-;drw_sprw:
-         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,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                                    
-          
-         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,12                      ;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,12
-         add      hl,bc
-         pop      bc
-         djnz     woloop
-         ret
 
 
-HL_Decimal:
-       ld (_penCol),de                 ;set display position
-       ld de,StringPlace+4             ;end of location to store string
-       ld b,5                          ;digits
-ConvLoop:
-       call UNPACK_HL                  ;value to string
-       add a,'0'
-       ld (de),a                       ;store char
-       dec de
-       djnz ConvLoop                   ;loop
-       ld hl,StringPlace               ;display stored chars
-       call _vputs
-       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
 
 
 
 ;------------------------------- sprites --------------------------------------
 
 spr_ship:
-       .db 7,7
-       .db %11111000
-       .db %11000000
-       .db %11111100
-       .db %11111110
-       .db %11111100
-       .db %11000000
-       .db %11111000
+       .db 7,7         ;your ship:
+       .db %01110000   ;  ███
+       .db %11100000   ; ███
+       .db %11111100   ; ██████
+       .db %11110010   ; ████  █
+       .db %11111100   ; ██████
+       .db %11100000   ; ███
+       .db %01110000   ;  ███
 
 spr_bullet01:
-       .db 3,5
-       .db %01000000
-       .db %11100000
-       .db %11100000
-       .db %11100000
-       .db %11100000
-
+       .db 5,3         ;your bullets
+       .db %00110000   ;   ░▒▓██
+       .db %11111000   ; ░▒▓█████
+       .db %00110000   ;   ░▒▓██
 spr_bullet02:
-       .db 3,3
-       .db %01000000
-       .db %11100000
-       .db %01000000
+       .db 5,3         ;your bullets
+       .db %11110000   ; ░▒▓████
+       .db %11111000   ; ░▒▓█████
+       .db %11110000   ; ░▒▓████
+
+spr_bullet11:
+       .db 3,3         ;enemy bullets
+       .db %01000000   ;  █▓▒░
+       .db %11100000   ; ███▓▒░
+       .db %01000000   ;  █▓▒░
 
 spr_enemy01:
-       .db 6,6
-       .db %00111100
-       .db %01110000
-       .db %11110000
-       .db %11110000
-       .db %01110000
-       .db %00111100
+       .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   ; ███
 
 spr_explosion:                               
-         .db      8,6
-         .db      %00000000
-         .db      %00011100
-         .DB      %00111110
-         .DB      %01010110
-         .DB      %00111000
-         .DB      %00000000
-         .db      8,6
-         .db      %00110000
-         .db      %01001110
-         .DB      %10111110
-         .DB      %01001111
-         .DB      %00111000
-         .DB      %00011010
-         .db      8,6
-         .db      %11110011
-         .db      %01001110
-         .DB      %10110101
-         .DB      %01000101
-         .DB      %00111110
-         .DB      %11011010
-         .db      8,6
-         .db      %11110011
-         .db      %01001110
-         .DB      %10110101
-         .DB      %01000101
-         .DB      %00111110
-         .DB      %11011010
-         .db      8,6
-         .db      %01000001
-         .db      %00100110
-         .DB      %00010101
-         .DB      %01000100
-         .DB      %00010010
-         .DB      %10011010
-         .db      8,6
-         .db      %01000010
-         .db      %00100000
-         .DB      %00000001
-         .DB      %01000100
-         .DB      %00100010
-         .DB      %10001010
-         .db      8,6
-         .db      %00001000
-         .db      %11000010
-         .DB      %00000000
-         .db      %00100000
-         .db      %00000001
-         .db      %00110000
-         .db      8,6
-         .db      %00000100
-         .DB      %00000000
-         .DB      %01000000
-         .DB      %00000000
-         .db      %00000001
-         .db      %00100100
-
-;---------------------------- level data -------------------------------------
-Leveldata:
-       .db $90,$40
-       .db $90,$30
-       .db $90,$20
-       .db $90,$10
-       .db $00,$00
+       .db 8,6         ;1
+       .db %00000000
+       .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 8,6         ;3
+       .db %11110011
+       .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 8,6         ;5
+       .db %01000001
+       .db %00100110
+       .db %00010101
+       .db %01000100
+       .db %00010010
+       .db %10011010
+
+       .db 8,6         ;6
+       .db %01000100
+       .db %00100000
+       .db %00000001
+       .db %01000100
+       .db %00100010
+       .db %10001000
+
+       .db 8,6         ;7
+       .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
 
-;---------------------------- texts ------------------------------------------
+;---------------------------- 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
+
+;---------------------------- texts -------------------------------------------
 
 title_message:
-         .db      "G A L A X I A N",0
+         .db      "* * NEMESIS * *",0
 
-;---------------------------- save data --------------------------------------
+;---------------------------- save data ---------------------------------------
 
 stored_data_start:
 
-curevent       .dw Leveldata           ;next event
+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
+
 score          .dw $0000
-lives          .dw $0003
-level          .dw $0003
-x              .db $46
-y              .db $46
-lasers         .db $03
-ybullets       .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-ebuls          .dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-enemies                .dw $3335,$2323,$4040,$ffff,$ffff
-               .dw $ffff,$ffff,$ffff,$ffff,$ffff
-               .dw 0,0,0,0,0
-               .dw 0,0,0,0,0
-               .dw 0,0,0,0,0,0,0,0,0,0
-               .dw 0,0,0,0,0,0,0,0,0,$ffff
-
-boss_status    .db 00
-boss_pwr          .db 00
-boss_x            .db 00
-boss_y            .db 00
-boss_2bytes       .dw 0000
 
-timer          .dw $0000
-your_status    .db $00
-               .db $00
-warped_status  .db $00
+your_occ       .db $00                 ;0=normal 1=exploding 2=gone
+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)
+
+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:
 
@@ -593,7 +958,25 @@ stored_data_end:
 ;
 ;      + movement of ship over whole screen
 ;      + enemies moving from right to left, appearing right at specified times
-
-
+;
+; 0.1.718 -- 18.VII.99 -- size 907
+;
+;      * 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)
+;      + collision detection!! enemy ships disappear when you hit them
+;
+; 0.2.718 -- 18.VII.99 -- size 1153
+;
+;      + ability to fire bullets (F1). Enemies disappear on impact
+;      * enemies explode instead of disappearing
+;
+; 0.3.719 -- 19.VII.99 -- size 1401
+;
+;      * 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