version 0.94 (major beta): stars, ground, more enemy abilities, menu
[nemesis.git] / nemesis.z80
index 1400114e922b272dc283accebccc81c0859cafae..76a0b6c892c56f2b81210d3500304b5cfd118a5c 100644 (file)
+;------------------------------------------------------------------------------
+;---------------------- NEMESIS -----------------------------------------------
+;------------------------------------------------------------------------------
+
+;      >>> NEMESIS <<<         Version 0.94 BETA       by SHIAR
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+;  SHIAR  ***  shiar0@hotmail.com  ***  ICQ#43840958  ***  come.to/shiar
+; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+; DESCRIPTION:                Fast+cool arcade-game based on the old MSX-game
+; CALC:                                                                    TI-86 only
+; FILES:                                              86P (3624)  Z80 (62443)
+; BETA:                          I hope to release the full game around december 1999
+; ABOUT:       This source should only be used for learning practises, do not
+;              alter it, and certainly do not distribute an altered version!!
+;                              &&& marks uncertainties or things to optimize
+
+;---------------------- nemesis.z80 start -------------------------------------
+
        .include "asm86.h"
        .include "ti86asm.inc"
-       .include "ram86.inc"
        .include "ti86abs.inc"
 
        .org _asm_exec_ram
 
-TEXT_MEM = _textShadow
-DELC_LEN = _undelBufLen                ;$64 bytes long
-_dispahl = $4a33
-
-        nop
-        jp init
-       .dw $0001               ;description type 2 (= +YASicon)
-       .dw Title               ;pointer to description
-       .dw spr_ship            ;pointer to YAS icon
-
-Title: .db "Nemesis v0.93.911 by Shiar",0
-
-just_fired     = TEXT_MEM      ;byte
-temp1          = TEXT_MEM+1    ;word
-RanPos         = TEXT_MEM+3    ;byte
-firex          = TEXT_MEM+4    ;byte
-firey          = firex+1       ;byte
-mx             = TEXT_MEM+6    ;byte
-my             = mx+1          ;byte
-your_locpos    = TEXT_MEM+8    ;byte
-your_prevpos   = TEXT_MEM+9    ;16 words
+#define                  cal   call    ;just to make it harder for you to understand
+#define                  psh   push    ; ^:D
+
+_dispahl       = $4A33
+
+TEXT_MEM       = $C0F9 ;-$C1A0 ;_textShadow    ;167 bytes ($A7)
+DELC_LEN       = $C012 ;-$C076 ;_undelBufLen   ;100 bytes ($64)
+
+;---------------------- in-game vars ------------------------------------------
+
+just_fired     = TEXT_MEM      ;$C0F9          ;counts how long a blast lasts
+curline                = TEXT_MEM      ;$C0F9          ;used to display SFX
+menuitem       = TEXT_MEM      ;$C0F9
+temp1          = TEXT_MEM+1    ;$C0FA-C0FB     ;(2 bytes)
+RanPos         = TEXT_MEM+3    ;$C0FC          ;used for making random values
+timer          = TEXT_MEM+4    ;$C0FD          ;frame counter
+
+x              = TEXT_MEM+5    ;$C0FE          ;your ship's position
+y              = x+1           ;$C0FF          ;your y-pos
+firex          = TEXT_MEM+7    ;$C100          ;(1 byte)
+firey          = firex+1       ;$C101          ;(1 byte)
+mx             = TEXT_MEM+9    ;$C102          ;position of multiple#1
+my             = mx+1          ;$C103          ;multiple y-pos
+
+bossx          = $8001
+bossy          = bossx+1
+bossmy         = bossy+1
+
+level_enemy    = TEXT_MEM+11   ;$C104          ;enemy type
+eventtime      = TEXT_MEM+12   ;$C105          ;enemy frequency
+eventleft      = TEXT_MEM+13   ;$C106          ;nr. of enemies still to come
+nextevent      = TEXT_MEM+14   ;$C107          ;time to next event
+pickuptimer    = TEXT_MEM+15   ;$C108          ;counts when to place a pickup
+level_occ      = TEXT_MEM+16   ;$C109
+level_move     = $8010
+level_fire     = $8011
+
+spacespace     = $8012
+groundinfo     = spacespace+1  ;$8013
+groundpos      = groundinfo+1  ;$8014  $10
+ceilingpos     = groundpos+16  ;$8023  $10
+stars1         = ceilingpos+16 ;$8033
+stars2         = stars1+1      ;$8034
 
 nrybullets     = 20
-ybullets       = your_prevpos+32                       ;20 x (state,x,y)
+ybullets       = TEXT_MEM+17   ;$C10A          ;60 bytes = 20(state,x,y)
 nrebullets     = 10
-ebullets       = ybullets+(nrybullets*3)               ;10 x (state,x,y)
+ebullets       = ybullets+(nrybullets*3)       ;30 bytes = 10(state,x,y)
+
+your_locpos    = ebullets+(nrebullets*3)       ;position in your_prevpos table
+your_prevpos   = your_locpos+1                 ;saves previous positions (32d)
+
+nrstars1       = 7
+starx1         = your_prevpos+32               ;ends at C192
+nrstars2       = 7
+starx2         = starx1+(nrstars1*2)           ;ends at C1A0
 
 nrenemies      = 10
-enemies                = DELC_LEN
-       ; %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
-       ; %11111111 (ship type or explosion frame)  %11111111 (x) %11111111 (y)
+enemies                = DELC_LEN+1
 add2enemy      = nrenemies*4
 enemiesxtra    = enemies+add2enemy
-       ; $11 (move) $11 (fire)
+
+;enemies:
+;      %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
+;      %11111111 (ship type or explosion frame)  %11111111 (x) %11111111 (y)
+;enemiesxtra:
+;      $11 (move) $11 (fire) $11 (bullettype)
+
+;---------------------- introduction ------------------------------------------
+
+        nop                    ;hello yas/ase/rascall/whathever
+        jp init                ;here's the program, but first: a description
+       .dw $0001               ;description type 2 (description + YASicon)
+       .dw Title               ;pointer to description (all shells)
+       .dw Icon                ;pointer to YAS icon
+
+Title: .db "Nemesis v0.94 by Shiar",0
+
+Icon:  .db 8,1                 ;icon for YAS: width = 1byte; height = 9bytes
+       .db %11100000           ; ███
+       .db %01111000           ;  ████
+       .db %00111110           ;   █████
+       .db %01111001           ;  ████  █
+       .db %00111110           ;   █████
+       .db %01111000           ;  ████
+       .db %11100000           ; ███             ;recommend 80x50 screen mode
+       .DB 0   ;clear stupid YAS-line
 
 ;---------------------- init --------------------------------------------------
 
 init:
-       call _runindicoff       ;turn the run-indicator off, obviously
-       call _clrLCD            ;clean the screen
-       ld  (iy+13),0
-       xor a
-       ld  (DELC_LEN),a
+       cal BUSY_OFF            ;turns the run-indicator off, obviously
+       cal CLEARLCD            ;clean the screen
+       xor a                   ;<ld a,0>: reset:
+       ld  (iy+13),a           ;>system vars
+       ld  (DELC_LEN),a        ;>buffer so we can use the space to store vars
 
        ld  a,(CONTRAST)        ;load current contrast level
        cp  $1f                 ;if already at maximum...
@@ -59,37 +129,102 @@ skipdarken:
 ;---------------------- main menu ---------------------------------------------
 
 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
+       xor a                   ;white bitmask (a=0)
+       ld  b,16                ;one line
+       ld  hl,logo_nemesis     ;from...
+       ld  de,VIDEO_MEM+16     ;...to one line from top
+AboveLogo:
+       ld  (de),a              ;clear/n byte
+       inc de                  ;next
+       djnz AboveLogo          ;repeat for the first line
+
+       ld  bc,16*19            ;logo size
+       ldir                    ;display one line of logo
+
+;      ld  hl,GRAPH_MEM        ;cleared line
+;      ld  bc,16               ;size=one line
+;      ldir                    ;also clear one line below the logo
+
+;      ld  a,-1                ;first line is -1+1=0
+;      ld  b,21                ;with first 21 lines:
+;      cal DoSFX               ;do special effect &&&skip
 
        ld  hl,VIDEO_MEM+(16*$39)+4     ;$39 rows down, 4 cols right (4*8=$20)
-       ld  b,$8                ;draw 8x one byte = 8*8 = 64 pixels wide
+       ld  b,                ;draw 8x one byte = 8*8 = 64 pixels wide
        ld  a,%11111111         ;horizontal line mask
 underline:
        ld  (hl),a              ;draw one piece of the divider-line
        inc hl                  ;move right (8 pixels = 1 byte)
-       djnz underline          ;repeat (16bytes * 8pixels =128= screen width)
+       djnz underline          ;repeat
 
-       set 3,(iy+5)
+       set 3,(iy+5)            ;set white on black
        ld  hl,$3320            ;near the bottom of the screen
        ld  (_penCol),hl
        ld  hl,txt_about        ;display version and author (yes, that's me!)
-       call _vputs
-       res 3,(iy+5)
+       cal _vputs              ;useful procedure if you want to display somtn
+       res 3,(iy+5)            ;return to default black on white
 
        ld  hl,$3a1e            ;below previous stuff
        ld  (_penCol),hl
        ld  hl,txt_email        ;hey, my e-mail address so SEND ME SOMETHING!!
-       call _vputs             ;VERY important, so display in small font ?:}
+       cal _vputs              ;VERY important, so display in small font ?:}
+
+dispmenu:
+       ld  de,$0304
+       ld  (_curRow),de
+       ld  hl,txt_menu1
+       cal _puts
+       ld  de,$0305
+       ld  (_curRow),de
+       ld  hl,txt_menu2
+       cal _puts
 
-       call _getkey            ;wait for keypress
-       call New_game           ;prepare level
+       xor a
+       ld  (menuitem),a
+
+menuloop:
+       ld  a,(menuitem)
+       ld  h,$01
+       add a,4
+       ld  l,a
+
+       ld  a,5
+       ld  (_curRow),hl
+       cal _putc
+
+       ld  a,(menuitem)
+       ld  h,$01
+       sub 5
+       neg
+       ld  l,a
+
+       ld  a,32
+       ld  (_curRow),hl
+       cal _putc
+
+       halt \ halt \ halt \ halt
+
+       cal GET_KEY             ;wait for keypress
+       cp  K_UP
+       jr  z,menuchange
+       cp  K_DOWN
+       jr  z,menuchange
+       cp  K_EXIT
+       jp  z,game_over_nopop
+       cp  K_ENTER
+       jr  nz,menuloop
+
+       ld  a,(menuitem)
+       dec a
+       cal z,Story
+       cal New_game            ;prepare level
+       jr  game_main_loop
+
+menuchange:
+       ld  a,(menuitem)
+       xor 1
+       ld  (menuitem),a
+       jr  menuloop
 
 ;------------------------------------------------------------------------------
 ;---------------------- game loop ---------------------------------------------
@@ -101,13 +236,14 @@ game_main_loop:                   ;REPEATS FROM HERE EVERY FRAME
        ld  b,(hl)              ;new time, save for rand# upd. (no flag change)
        jr  nz,updaterandom     ;continue when new time <> 0
        ld  hl,1                ;once every 256 frames, increase score by 1
-       call scoreInc           ;do it
+       cal scoreInc            ;do it
 
 updaterandom:
        ld  hl,RanPos           ;random counter
-       ld  a,(hl)              ;random value
+       ld  a,r
+       add a,(hl)              ;random value
        add a,b                 ;even more random by adding timer
-.db    $80+7                   ;<add a,r>
+;.db   $80+7                   ;<add a,r>
        ld  (hl),a              ;save even more random value back
 
 Clear_screen:
@@ -117,55 +253,352 @@ Clear_screen:
        ld  bc,896              ;loop 896 times = (128/8) * (64-8 for scorebar)
        ldir                    ;clear!
 
+       ld  a,(timer)
+       and %11
+       jr  z,movestarsdone
+
+       cal movestars1          ;move the stars on the FRONT layer
+       cal movestars2          ;move the distant stars far, far away
+
+movestarsdone:
+       ld  a,(stars1)          ;star positions (the missing byte...)
+       ld  b,nrstars1          ;how many stars? now we know.
+       ld  hl,starx1           ;points to the position of the stars
+       cal DisplayStars        ;display front layer stars
+
+       ld  a,(stars2)          ;weren't you paying attention five lines ago?
+       ld  b,nrstars2          ;that many?! whow!
+       ld  hl,starx2           ;and there they are
+       cal DisplayStars        ;use the same procedure to display back layer
+
+       ld  a,(level_move)      ;level info
+       and %01100000           ;isolate ground&ceiling
+       jr  z,game_stuff        ;both non-present
+       and %00100000           ;bit representing the presence of any ceiling
+       cal nz,Handle_ceiling   ;scroll the ceiling (if any)
+       cal Handle_ground       ;scroll the ground
+
+game_stuff:
+       ld  a,(your_occ)        ;are you 100% OK?
+       or  a                   ;a=0??
+       jr  nz,_gamestuff1      ;then don't check for movements/fires/...
+
+       ld  a,(level_move)      ;the same level info
+       and %01100000           ;isolate ground&ceiling again
+       jr  z,check_keys        ;no ceiling nor ground
+       and %00100000           ;this bit will tell us if there is a ceiling
+       cal nz,CheckCeiling     ;if there is, check it
+       cal CheckGround         ;check for collision with the ground
+
 check_keys:
        ld  a,%00111111         ;function keys (MORE,EXIT,2ND,F1,F2,F3,F4,F5)
        out (1),a               ;ask for them
        nop \ nop               ;delay 8 clocks
        in  a,(1)               ;get zem!
 
-check_exitkey:
+check_exitkey:                 ;why give it a label? i dunno, i'm just crazy
        bit 6,a                 ;test bit 6 = exit-key = EXIT
        jp  z,game_over_nopop   ;<exit> pressed, so be it
-check_morekey:
+check_morekey:                 ;again, another unused label... poor compiler
        bit 7,a                 ;test bit 7 = more-key = PAUSE
-       call z,Pause            ;yes, go to pause
+       cal z,Pause             ;yes, go to pause
 
 check_firekey:
        bit 5,a                 ;test bit 5 = 2nd-key = FIRE
-       ld  hl,game_stuff       ;where to continue after executing Fire_bullet
-       push hl                 ;push hl on stack (instead of call Fire_bullet)
-       jp  z,Fire_bullet       ;fire smtn (bulletstorplasersmultiples+stuff..)
-       pop hl                  ;no call to Fire_bullet made, so pop stack
+       ld  hl,check_selkey     ;where to continue after executing Fire_bullet
+       psh hl                  ;push hl on stack (instead of cal Fire_bullet)
+       jp  z,Fire_bullet       ;fire smtn (bulletstorplasermultiples+stuff..)
+       pop hl                  ;no cal to Fire_bullet made, so pop stack
        ld  hl,just_fired       ;no:
        ld  (hl),0              ;reset just_fired
 
-game_stuff:
-       call Level_event        ;insert enemies
-       call Handle_Ship        ;move you
-       call Handle_enemies     ;move enemies
-
-       ld  a,(your_occ)        ;are you 100% OK?
-       or  a                   ;a=0??
-       jr  nz,activesdone      ;then don't check for movements/fires/...
-
+check_selkey:
        ld  a,%01011111         ;look at first column of keys (ALPHA to STO)
        out (1),a               ;gimme gimme
        nop \ nop               ;what's taking you so long
        in  a,(1)               ;at last... our precious keyzzz...
-                               ;old: <bit 7,a \ call z,select> now see this:
-       rla                     ;test bit 7 so we know f ALPHA has been pressed
-       call nc,select          ;yeppy, select the currently selected upgrade
-       call Enemies_hit        ;check for collision with enemies
+                               ;old: <bit 7,a \ cal z,select> now see this:
+       rla                     ;test bit7 so we know f ALPHA has been pressed
+       cal nc,select           ;yeppy, select the currently selected upgrade
+
+       cal Enemies_hit         ;check for collision with enemies
+
+_gamestuff1:
+       cal Handle_Ship         ;move you
+       cal Handle_bullets      ;move your bullets
+       cal Handle_torp         ;move your torpedo
+
+        cal Handle_enemies     ;move enemies
+       cal Enemy_bullets       ;move enemy bullets
+
+;      ld   a,(level_occ)
+;      or   a
+;      jr   nz,bosslevel       ;levelocc<>0 so no
+
+       cal Level_event         ;insert enemies
+       jr   _gamestuff2
+bosslevel:
+       cal Handle_boss
+_gamestuff2:
+       cal Display_Screen      ;display all
+       halt                    ;delay
 
-activesdone:
-       call Handle_bullets     ;move your bullets
-       call Handle_torp        ;move your torpedo
-       call Enemy_bullets      ;move enemy bullets
+       jp   game_main_loop     ;LOOP
 
-       call Display_Screen     ;display all
-       halt                    ;delay
+;--------------------------- ground -------------------------------------------
+
+Handle_ground:
+       ld  a,(timer)
+       and %111                ;once every 8 frames
+       jr  nz,Display_ground   ;otherwise skip the scroll
+       ld  bc,15               ;scroll all 16 bytes minus one (teh new byte)
+       ld  hl,groundpos+1      ;from..
+       ld  de,groundpos        ;to (one byte to the left)
+;      ld  a,(de)              ;load byte on left (will be lost after scroll)
+       ldir                    ;LoaDIncreaseRepeat = scroll!
+
+       ld  a,(groundinfo)      ;what kind of ground
+       dec a                   ;type 1:
+       jr  z,ground_tunnel     ;tunnel effect
+       jr  ground_boring
+
+ground_tunnel:
+ ld  a,(groundpos+14)
+ ld  (groundpos+15),a
+ ld  hl,spacespace
+
+ ld  a,(RanPos)
+ ld  b,a
+ bit 1,a
+ jr  z,ground_previous
+ bit 2,a
+ jr  z,gtunneldown
+gtunnelup:
+ ld  a,(hl)
+ or  a
+ jr  z,ground_previous         ;a>=0 (a=0 actually, because a<0 = a>0)
+ inc (hl)
+ ld  a,(groundpos+15)
+ inc a
+ jr  newground
+gtunneldown:
+ ld  a,(groundpos+15)
+ dec a
+ jr  z,ground_previous
+ dec (hl)
+ jr  newground
+
+ground_previous:
+       ld  a,(groundpos+14)    ;type 1
+       jr  newground
+ground_boring:
+       ld  a,(groundpos)       ;type 0
+newground:
+       ld  (groundpos+15),a    ;save new byte on the right
+       ld  a,(hl)
+       cp  -25
+       jr  nc,Display_ground
+       ld  a,b
+       and %1
+       ld  b,0
+       jr  nz,gtunnelup
+
+Display_ground:
+       ld  b,16                ;screen width
+       ld  de,groundpos-1      ;height of current byte (previous actually)
+       psh de                  ;use later
+       ld  hl,GRAPH_MEM+(56*16)-1 ;screen position
+       psh hl
+
+groundloopright:
+       ld  c,b                 ;push b for groundloopup
+       pop hl \ inc hl         ;get screen position and go one right
+       pop de \ inc de         ;get height info and set to the next byte
+       psh de \ psh hl         ;save these for the next time
+       ld  a,(de)              ;height of current byte
+       ld  b,a                 ;save in b
+
+       ld  de,16               ;to substract to go one line up
+       ld  a,%11111111         ;bitmask black
+       or  a
+groundloopup:
+       ld  (hl),a              ;display black byte
+       sbc hl,de               ;go up (sbc must be used for 16-bit sub)
+       djnz groundloopup       ;and loop >groundpos< times
+
+       ld  b,c                 ;pop b used by groundloopup
+       djnz groundloopright    ;loop right for entire screen (16x)
+       pop hl \ pop hl         ;restore stack
+       ret
+
+CheckGround:                   ;check for collision with the ground
+       ld  a,(x)
+       srl a
+       srl a
+       srl a
+       inc a
+       ld  l,a
+       ld  h,0
+       ld  de,groundpos
+       add hl,de
+       ld  a,(y)
+       sub 57-7
+       neg
+       cp  (hl)
+       ret nc
+       jp  damage_you
 
-       jr   game_main_loop     ;LOOP
+;--------------------------- ceiling ------------------------------------------
+
+Handle_ceiling:
+       ld  a,(timer)
+       and %111                ;once every 8 frames
+       jr  nz,Display_ceiling  ;otherwise skip the scroll
+       ld  bc,15               ;scroll all 15 bytes (16th is new position)
+       ld  hl,ceilingpos+1     ;from..
+       ld  de,ceilingpos       ;to (one byte to the left)
+       ld  a,(de)              ;load byte on left (will be lost after scroll)
+       ldir                    ;LoaDIncreaseRepeat = scroll!
+
+       ld  a,(groundinfo)      ;what kind of ceiling
+       dec a                   ;type 1:
+       jr  z,ceiling_tunnel    ;tunnel effect
+       jr  ceiling_boring
+
+ceiling_tunnel:
+ ld  a,(ceilingpos+14)
+ ld  (ceilingpos+15),a
+ ld  hl,spacespace
+
+ ld  a,(RanPos)
+ ld  b,a
+ bit 4,a
+ jr  z,ceiling_previous
+ bit 5,a
+ jr  z,ctunnelup
+ctunneldown:
+ ld  a,(hl)
+ or  a
+ jr  z,ceiling_previous
+ inc (hl)
+ ld  a,(ceilingpos+15)
+ inc a
+ jr  newceiling
+ctunnelup:
+ ld  a,(ceilingpos+15)
+ dec a
+ jr  z,ceiling_previous
+ dec (hl)
+ jr  newceiling
+
+ceiling_previous:
+       ld  a,(ceilingpos+14)   ;type 1
+       jr  newceiling
+ceiling_boring:
+       ld  a,(ceilingpos)      ;type 0
+newceiling:
+       ld  (ceilingpos+15),a   ;save the new byte
+       ld  a,(hl)
+       cp  -25
+       jr  nc,Display_ceiling
+       ld  a,b
+       and %1
+       ld  b,0
+       jr  nz,ctunneldown
+
+Display_ceiling:
+       ld  b,16                ;screen width
+       ld  de,ceilingpos-1     ;height of current byte
+       psh de                  ;use later
+       ld  hl,GRAPH_MEM-17     ;screen position
+       psh hl
+
+ceilingloopright:
+       ld  c,b                 ;push b for groundloopup
+       pop hl \ inc hl         ;get screen position and go one right
+       pop de \ inc de         ;get height info and set to the next byte
+       psh de \ psh hl         ;save these for the next time
+       ld  a,(de)              ;height of current byte
+       ld  b,a                 ;save in b
+
+       ld  de,16               ;to substract to go one line up
+       ld  a,%11111111         ;bitmask black
+       or  a
+ceilingloopdown:
+       ld  (hl),a              ;display black byte
+       add hl,de               ;go down
+       djnz ceilingloopdown    ;and loop >groundpos< times
+
+       ld  b,c                 ;pop b used by groundloopup
+       djnz ceilingloopright   ;loop right for entire screen (16x)
+       pop hl \ pop hl         ;restore stack
+       ret
+
+CheckCeiling:                  ;check for collision with the ground
+       ld  a,(x)               ;your x
+       srl a                   ;x/2
+       srl a                   ;x/4
+       srl a                   ;x/8 (current ceiling-byte)
+ inc a
+       ld  l,a                 ;hl = a
+       ld  h,0                 ;"
+       ld  de,ceilingpos       ;first ceiling-byte
+       add hl,de               ;current ceiling-byte
+       ld  a,(y)               ;your y-pos
+       inc a
+       cp  (hl)                ;compare with ceiling
+       ret nc                  ;carry if ceiling is above you
+       jp  damage_you          ;otherwise you don't wanna be in that ship
+
+;--------------------------- move stars ---------------------------------------
+
+DisplayStars:                  ;inputs: hl=starx# a=stars# b=nrstars#
+       ld  e,(hl)
+       inc hl
+       ld  d,(hl)
+       ld  (de),a
+       inc hl
+       djnz DisplayStars
+       ret                     ;let's comment this: returns
+
+movestars2:
+       ld  ix,starx2
+       ld  a,(stars2)
+       rlca
+       ld  (stars2),a
+       ret nc
+       ld  b,nrstars2
+       jr  movestars_loop
+
+movestars1:
+       ld  ix,starx1
+       ld  a,(timer)
+       rra
+       ld  a,(stars1)
+       ret c
+       rlca
+       ld  (stars1),a
+       ret nc
+       ld  b,nrstars1
+
+movestars_loop:
+       ld  h,(ix+1)
+       ld  l,(ix)
+       dec hl
+
+       ld  a,l
+       and %00001111
+       cp  9                   ;(GRAPH_MEM&%00001111)-- = $C9FAand15-1 = $A-1
+       jr  nz,newstarok
+       ld  de,16
+       add hl,de
+
+newstarok:
+       ld  (ix),l
+       ld  (ix+1),h
+       inc ix \ inc ix
+       djnz movestars_loop
+       ret                     ;for stupid people, here's another comment...
 
 ;--------------------------- pause --------------------------------------------
 
@@ -173,9 +606,9 @@ Pause:
        ld  hl,$0200            ;top left
        ld  (_curRow),hl
        ld  hl,txt_pressenter   ;"Enter to continue"
-       call _puts              ;display message
+       cal _puts               ;display message
 pause:
-       call _getkey            ;enter low-power mode and wait for key
+       cal _getkey             ;enter low-power mode and wait for key
        cp  kEnter              ;keypressed = enter?
        jr  nz,pause            ;no, wait some more
        ret                     ;continue
@@ -183,8 +616,8 @@ pause:
 ;--------------------------- exit ---------------------------------------------
 
 quit:
-       call _clrLCD            ;clears screen
-       call _homeup            ;set cursor to top-left
+       cal CLEARLCD            ;clears screen
+       cal _homeup             ;set cursor to top-left
        ld  a,(CONTRAST)        ;load original contrast level
        out (2),a               ;and set it back
        ld  (iy+13),6           ;restore system-flags
@@ -195,41 +628,46 @@ quit:
 Display_Screen:
        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)
+       ld  c,56                ;display height = 64 bytes (minus 8 for bar)
 displayloop:
-       ld  bc,16               ;display width = 16 bytes (16*8bits=256pixels)
-       ldir                    ;16x de >> hl
-       dec a                   ;next line
+       ld  b,16                ;display width = 16 bytes (16*8bits=256pixels)
+displaytloop:
+       ld  a,(hl)              ;copy byte from (hl)
+;      xor $ff                 ;   }   ;invert byte (white<=>black) &&&&
+       ld  (de),a              ;to (de)
+       inc hl \ inc de         ;next byte
+       djnz displaytloop       ;16x hl >> de
+       dec c                   ;next line
        jr  nz,displayloop      ;loop 64x
 
        ld  hl,$396b            ;Display Score
        ld  (_penCol),hl        ;bottom right of screen
        ld  hl,(score)
 
-_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
+_D_HL_DECI:                    ;------- display 5-digit value -------
+       ld  de,savestr+4        ;savenr saves number string
+       ld  b,5                 ;five digits
+ldhld: cal 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
+       ld  hl,savestr          ;we (the program) saved the value righthere
+       cal _vputs              ;the only thing left to do is to display it
+       ret                     ;and we're done again
 
-savestr:
-       .db "00000",0
+savestr:                       ;@here the score will be stored
+       .db "00000",0           ;don't worry, it's just temporary
 
 ;------------------------- handle ship ----------------------------------------
 
 Handle_Ship:
-       ld  a,(your_occ)
-       or  a
-       jr  z,ok                ;0 = normal stat
+       ld  a,(your_occ)        ;are
+       or  a                   ;you
+       jr  z,ok                ;ok?
 
-       inc a                   ;next (explosion)frame
+       inc a                   ;no! next (explosion)frame
        ld  (your_occ),a        ;save
 
        cp  34                  ;last explosion frame?
@@ -238,26 +676,25 @@ Handle_Ship:
        jp  z,You_die           ;yes = game over
        ret                     ;don't display anything
 
-ok:
-       ld  a,%01111110
-       out (1),a
+ok:                            ;we are
+       ld  a,%01111110         ;get arrow keys
+       out (1),a               ;it's cold outside
        ld  hl,y                ;instead of nop\nop do something usefull
-       in  a,(1)
+       in  a,(1)               ;come back in
 
-       ld  b,a                 ;push a (keys)
+       ld  b,a                 ;psh a (keys)
        xor %11111111           ;inverted a = 0 if arrow-key has been pressed
        ld  a,(your_multiples)
        jr  z,no_adv            ;if so, leave the multiples where they are
        or  %100                ;set move bit
        jr  adv_ok
-no_adv:
-       and %11111011           ;reset move bit
-adv_ok:
-       ld  (your_multiples),a
+no_adv:        and %11111011           ;reset move bit
+
+adv_ok:        ld  (your_multiples),a
        ld  a,b                 ;pop a (keys)
 
        rra                     ;rotate right (put last bit in c)
-       ld  b,a                 ;we need a
+       ld  b,a                 ;we need a later
 
        jr  c,no_down
        ld  a,(hl)
@@ -314,7 +751,7 @@ no_flicker:
        ld  ix,spr_ship01i      ;display inv-ship (ld ix is faster than add ix)
 
 handle_multiples:
-       call putsprite          ;display your ship
+       cal putsprite           ;display your ship
 
        ld  a,(your_multiples)  ;do you have multiples
        ld  b,a                 ;save a for 2nd check
@@ -382,7 +819,7 @@ damage_you:
        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
+       cal disp_armor          ;and display new value
        ret                     ;and return
 no_armor:
        ld  a,%01               ;occ %xxxxxx01 = explode
@@ -391,7 +828,7 @@ no_armor:
 
 ;------------------------- place multiples ------------------------------------
 
-Place_multiples
+Place_multiples:
        ld  (mx),de             ;set last multiple-position
        ld  hl,your_prevpos     ;place all previous positions
        ld  b,16                ;all 16 of them
@@ -440,7 +877,7 @@ select5:
        inc a
        ld  (your_multiples),a
        ld  de,(x)
-       call Place_multiples
+       cal Place_multiples
        jp  disp_icons          ;display, return
 select6:
        ld  (hl),0              ;reset pickups
@@ -468,7 +905,7 @@ fireOK:
        ld  a,(your_multiples)  ;any multiples?
        and %11                 ;nope?
        jr  z,fireany           ;then just fire somethin'
-       call fireany            ;and blast
+       cal fireany             ;and blast
        ld  hl,(my)             ;then, fire from multiple position (mx)
        ld  a,(mx)              ;<ex h,l>
        ld  h,a                 ; ^^^^^^
@@ -507,7 +944,6 @@ _nolc:      ld  c,a                 ;c = (Y*16+X/8) mod 256
        ld  a,15                ;128/8=16=screen width ** minus one (inc a ^^)
        sub d                   ;minus x-start (d=X/8)
        ld  b,a
-       ld  c,0
 drawlaser:
        ld  (hl),%11111111
        inc hl                  ;Go to next byte
@@ -523,7 +959,7 @@ check_laserhits:            ;de = (x,y)
        ld  hl,enemies
 
 laserhits:                     ;Hits with normal enemies
-       push hl
+       psh hl
 
        ld  a,(hl)
        and %00000010
@@ -607,13 +1043,13 @@ Handle_bullets:
        ld  hl,ybullets
        ld  b,nrybullets
 scan_bullets:
-       push bc
-       push hl
+       psh bc
+       psh hl
        ld  (temp1),hl
        ld  a,(hl)
        inc hl
        dec a                   ;type 1?
-       call z,bullet_2left     ;yes: 2left
+       cal z,bullet_2left      ;yes: 2left
        pop hl
        pop bc
        ld  de,3
@@ -633,8 +1069,8 @@ bullet_2left:
        ld  e,(hl)              ;e = Y
 
        ld  ix,spr_bullet01
-       push de
-       call putsprite          ;display bullet
+       psh de
+       cal putsprite           ;display bullet
        pop de
 
 check_bullethits:              ;INPUT: de=X,Y
@@ -643,7 +1079,7 @@ check_bullethits:          ;INPUT: de=X,Y
        ld  ix,nohit
 
 hit_enemies:                   ;Hits with normal enemies
-       push hl
+       psh hl
 
        ld  a,(hl)
        and %00000010
@@ -670,7 +1106,7 @@ hit_enemies:                       ;Hits with normal enemies
        cp  10
        jr  nc,nohit
 
-       push hl
+       psh hl
        ld  hl,(temp1)
        ld  (hl),$00            ;remove bullet
        pop hl
@@ -680,7 +1116,7 @@ enemy_hit:
        dec hl
        dec hl
        ld  a,(hl)              ;occ
-       ld  c,a                 ;push occ
+       ld  c,a                 ;psh occ
        and %11111100           ;occ/4 = HP left        ;<srl a\srl a
        jr  nz,hpleft           ;not zero -> jump
        ld  (hl),%01            ;set to explode
@@ -696,7 +1132,7 @@ pickupdone:
        ld  (hl),$00            ;explosionFrame 0
 
        ld  hl,1                ;increase score by one
-       call scoreInc
+       cal scoreInc
        jp  (ix)
 
 hpleft:
@@ -738,8 +1174,8 @@ Handle_torp:
        ld  e,a
 
        ld  ix,spr_bullett1
-       push de
-       call putsprite          ;display torpedo
+       psh de
+       cal putsprite           ;display torpedo
        pop de
        jp  check_bullethits    ;check for hits with enemies
 
@@ -768,7 +1204,7 @@ Level_event:
        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
+       ld  (hl),123            ;set delay
        ret                     ;don't place any more enemies
 
 do_event:
@@ -783,7 +1219,7 @@ chk_noenemy:
        jr  nz,chk_noenemy
 
 place_enemy:
-       ld  a,(eventenemy)      ;enemy type to place (lvl)
+       ld  a,(level_enemy)     ;enemy type to place (lvl)
        ld  hl,enemy00          ;enemy 1 specs
        add a,a                 ;a=type*2
        add a,a                 ;a=type*4
@@ -819,7 +1255,7 @@ lure_enemy:                        ;2nd possibility: luring enemy
        jr  ypos_OK
 
 random_enemy:
-       call Random             ;make a (in a) random value 0-255
+       cal 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
@@ -833,7 +1269,22 @@ ypos_OK:                  ;random value successfully created
        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)
+
+       ld  a,(level_move)
+       and %00010000
+       jr  z,ffiredelayed
+       ld  a,1                 ;set time-to-fire to 1 frame (fires directly)
+       jr  ffireOK
+ffiredelayed:
+       ld  a,(level_fire)      ;set "ttf" to normal nr of frames
+ffireOK:
+       ld  (hl),a
+       inc hl                  ;hl to <xtra info: bullettype>
+       ld  (hl),1              ;type 1
+       inc hl                  ;hl to <xtra info: bullettype>
+       ld  a,(RanPos)
+       and %01111111
+       ld  (hl),a              ;type 1
        ret                     ;return
 
 Random:
@@ -848,7 +1299,6 @@ Random:
 ;--------------------------- enemy fires --------------------------------------
 
 Enemy_fires:                   ;de = x,y
-       push de
        dec d
        dec d                   ;d = x-2
        inc e                   ;e = y+1
@@ -864,13 +1314,40 @@ find_ebullet:
        ret
 
 found_ebullet:
-       ld  (hl),1              ;use bullet &&&
+       ld  b,%1100
+       ld  a,(level_move)
+       and %10000000
+       jr  z,bulletok
+
+       ld  a,(y)
+       sub e
+       add a,10
+       jp  p,bulletnotup
+       ld  b,%1011             ;yourY-bulY = negative (=bullet below you)
+       add a,10
+       jp  p,bulletnotup
+       ld  b,%1001             ;yourY-bulY = even more negative (going up)
+
+bulletnotup:
+       sub 20
+       jp  m,bulletok
+       ld  b,%1010             ;bullet going down
+       sub 10
+       jp  m,bulletok          ;even more going down
+       ld  b,%1000
+
+bulletok:
+;      ld  a,c                 ;load bullet type
+;      add a,a                 ;type*2                 %..Btype.
+;      add a,a                 ;type*4                 %.Btype..
+;      add a,a                 ;type*8                 %Btype...
+                               ;add bullet direction   %BtypeDir
+       ld  (hl),b              ;set bullet direction
        inc hl
        ld  (hl),d              ;set x-pos
        inc hl
        ld  (hl),e              ;set y-pos
-       pop de
-       ret         
+       ret
 
 ;----------------------------- enemy bullets ----------------------------------
 
@@ -878,8 +1355,8 @@ Enemy_bullets:
        ld  hl,ebullets
        ld  b,nrebullets
 handle_bullet:
-       push bc
-       push hl
+       psh bc
+       psh hl
        ld  a,(hl)              ;load bulletType in a
        or  a                   ;is it 0?
        jr  nz,enemy_bullet     ;no: handle bullet
@@ -902,19 +1379,40 @@ enemy_bullet:
        inc hl                  ;@y
 
        ld  a,b                 ;restore type
-       dec a                   ;type 1?
-       jr  z,ebullet_common    ;normal bullet
+       cp %1100                ;&&& use <bit ?,a>
+       jr  z,ebullet_common    ;type %1100: normal bullet
+       and %111
+       jr  z,ebullet_down      ;type %1000: moving down
+       dec a
+       jr  z,ebullet_up        ;type %1001: moving up
+       ld  b,a
 
-ebullet_down:
        ld  a,(timer)
        rra
        jr  c,ebullet_common
-       inc (hl)
+
+       ld  a,b
+       dec a
+       jr  z,ebullet_down      ;type %1010: moving down 50%
+                               ;type %1011: moving up 50%
+ebullet_up:
+       ld  a,(hl)
+       dec a
+       jp  m,ebullet_common
+       ld  (hl),a
+       jr  ebullet_common
+
+ebullet_down:
+       ld  a,(hl)
+       inc a
+       cp  55
+       jr  z,ebullet_common
+       ld  (hl),a
 
 ebullet_common:
        ld  e,(hl)              ;e=y
        ld  ix,spr_bullete1     ;display enemy bullet
-       call putsprite
+       cal putsprite
 
 ebullet_hits:
        ld  a,(your_occ)
@@ -922,7 +1420,7 @@ ebullet_hits:
        jr  nz,next_bullet      ;0 = you're normal
 
        pop hl
-       push hl
+       psh hl
        inc hl                  ;check x
        ld  a,(x)
        sub (hl)
@@ -939,7 +1437,7 @@ ebullet_hits:
        cp  9
        jr  nc,next_bullet
 
-       call damage_you         ;HIT!!
+       cal damage_you          ;HIT!!
 remove_ebullet:
        pop hl                  ;hl could be destroyed by damage_you
        ld  (hl),0              ;bullet > unused
@@ -952,8 +1450,8 @@ Handle_enemies:
        ld  b,nrenemies         ;handle all enemies
 
 handle_enemy:
-       push bc
-       push hl
+       psh bc
+       psh hl
 
        ld  a,(hl)
        and %00000011
@@ -964,7 +1462,7 @@ handle_enemy:
 
 normal_enemy:                  ;occ "normal" 2 or "moving" 3
        inc hl
-       push hl
+       psh hl
 
        ld  e,(hl)              ;e = enemy type
        ld  c,e                 ;c = e
@@ -988,7 +1486,7 @@ normal_enemy:                      ;occ "normal" 2 or "moving" 3
        ld  e,(hl)              ;y
        ld  a,b                 ;moving state was stored in b earlier
        dec a                   ;is it 1?
-       call nz,moving_enemy    ;2 = moving enemy
+       cal nz,moving_enemy     ;2 = moving enemy
 
        dec hl                  ;@x
        ld  (hl),d              ;store new x
@@ -1010,14 +1508,15 @@ check_enemyfire:
        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
-
+       ld  a,(level_fire)      ;re-set counter for next blast
+       ld  (hl),a              ;save time to fire
+       inc hl                  ;next byte = bullettype
+       ld  c,(hl)              ;c = bullet type
+       psh de                  ;save registers for firing-use
+       cal Enemy_fires         ;fires bullet
+       pop de                  ;restore (destroyed by Enemy_fires)
 firing_done:
-       push de                 ;save registers for firing-use
-       call putsprite          ;display sprite @ix
-       pop  de                 ;restore (destroyed by putsprite)
+       cal putsprite           ;display sprite @ix
 
 next_enemy:
        pop hl
@@ -1030,15 +1529,15 @@ next_enemy:
 remove_enemy:
        pop hl
        ld  (hl),$0000          ;bye bye enemy
-       push hl
+       psh hl
        jr  next_enemy
 
 exploding_enemy:
-       inc  hl
-       push hl
-       ld   a,(hl)
-       call explosion_stuff    ;display explosion
-       pop  hl
+       inc hl
+       psh hl
+       ld  a,(hl)
+       cal explosion_stuff     ;display explosion
+       pop hl
 
        ld  a,(hl)
        cp  15
@@ -1050,6 +1549,50 @@ exploding_enemy:
 ;--------------------------- moving enemies -----------------------------------
 
 moving_enemy:
+       ld  a,(level_move)
+       and %1111
+       jr  z,movetype_updown
+       dec a
+       jr  z,movetype_vslow
+       dec a
+       jr  z,movetype_fast
+       dec a
+       jr  z,movetype_vfast
+
+movetype_smart:
+       ld  bc,add2enemy
+       add hl,bc
+
+       ld  a,(timer)
+       and %1111
+       ld  a,(hl)
+       jr  nz,smartupdate
+       inc a
+smartupdate:
+       ld  (hl),a
+
+       or  a                   ;reset carry flag
+       sbc hl,bc
+       and %11111100
+       jr  z,movetype_fast
+
+movetype_vslow:
+       ld  a,(timer)
+       and %11
+       ret z
+       inc d
+       ret
+
+movetype_fast:
+       ld  a,(timer)
+       and %1
+       ret z
+movetype_vfast:
+       dec d                   ;move left
+       ret nz                  ;finished
+       pop hl                  ;restore stack (no ret used)
+       jr  remove_enemy        ;remove this enemy (off screen)
+
 movetype_updown:
        ld  bc,add2enemy
        add hl,bc
@@ -1064,16 +1607,14 @@ move_updated:
        or  a                   ;reset carry flag
        sbc hl,bc
        and %00100000
+       ld  a,(hl)              ;load current y-position
        jr  z,movedown
 
-moveup:
-       ld  a,(hl)              ;load y-position
-       dec a                   ;decrease y-pos (=move up)
+moveup:        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)
@@ -1087,15 +1628,15 @@ Enemies_hit:
        ld  hl,enemies
        ld  b,nrenemies         ;check all 20 enemies
 check_collision:
-       push hl
+       psh hl
        ld  a,(hl)
        and %00000010
        jr  z,check_next        ;2 or 3 = ok
        inc hl
 
 collide_enemy:
-;      push hl
-;      push bc
+;      psh hl
+;      psh bc
 ;      ld  hl,enemy00          ;enemy 1 specs
 ;      add a,a                 ;a=type*2
 ;      add a,a                 ;a=type*4
@@ -1128,15 +1669,15 @@ collide_enemy:
 take_pickup:
        ld  a,(hl)              ;load enemy type
 
-       push hl                 ;we need hl
-       ld   hl,2               ;increase score by 2
-       call scoreInc
-       pop  hl                 ;we're done
+       psh hl                  ;we need hl
+       ld  hl,2                ;increase score by 2
+       cal scoreInc
+       pop hl                  ;we're done
 
        or  a
        jr  nz,collide          ;enemy when <>0
 
-       push hl
+       psh hl
        ld  hl,your_pickup      ;your pickups
        ld  a,(hl)              ;current
        inc a                   ;go to next
@@ -1145,7 +1686,7 @@ take_pickup:
        ld  a,1                 ;yes: reset to pickup 1
 not_maxpickup:
        ld  (hl),a              ;save new
-       call disp_icons         ;display altered pickupicons
+       cal disp_icons          ;display altered pickupicons
        pop hl
 
        dec hl                  ;to enemy occ
@@ -1159,7 +1700,7 @@ collide:
        dec hl
        inc a
        ld  (hl),a              ;set to explode
-       call damage_you         ;auch!
+       cal damage_you          ;auch!
 
 check_next:
        pop hl
@@ -1170,10 +1711,134 @@ check_next:
        djnz check_collision
        ret
 
-;--------------------------- update score -------------------------------------
+;--------------------------- story -------------------------------------------
+
+storyPage:
+       psh hl
+       cal _clrLCD
+       pop hl
+storyLine:
+       inc hl
+       ld  e,(hl)
+       inc hl
+       ld  d,(hl)
+       ld  (_penCol),de
+       inc hl
+       cal _vputs
+
+       ld  a,(hl)
+       dec a
+       jr  z,storyLine
+
+       psh hl
+       ld  hl,VIDEO_MEM
+       ld  de,GRAPH_MEM
+       ld  bc,1024
+       ldir
+       cal _clrLCD
+       pop hl
+
+       inc hl
+       ld  a,(hl)
+       inc hl
+       ld  b,(hl)
+       psh hl
+       cal DoSFX
+       cal _getkey
+       pop hl
+       ret
+
+Story:
+       ld  hl,story01-1
+       cal storyPage
+       cal storyPage
+       cal storyPage
+       ret
+
+story01:
+       .db $21,$1d,"Cosmic year 6716"          ,0,0,$1d,$06
+       .db $1b,$1d,"storyline coming soon..."  ,0,0,$1d,$06
+       .db $09,$19,"the Nemesis saga continues",0,1
+       .db $2e,$21,"with NEMESIS 86"           ,0,1
+       .db $52,$36,"by Shiar"                  ,0,0,$19,$23
+
+;--------------------------- SFX ---------------------------------------------
+
+CDoSFX:
+       ld  hl,VIDEO_MEM
+       ld  de,GRAPH_MEM
+       ld  bc,1024
+       ldir
+       ld  b,64
+       ld  a,-1
+
+DoSFX:                         ;ins: a=beginLine b=nrOfLines
+       ld  (curline),a
+SFXframe:
+       psh bc
+
+       ld  a,(curline)         ;get line number
+       inc a                   ;go to the next line
+       ld  (curline),a         ;update
+
+       ld  l,a
+       ld  h,0
+       add hl,hl
+       add hl,hl
+       add hl,hl
+       add hl,hl
+
+       ld  b,h                 ;save hl for later
+       ld  c,l
+
+       ld  de,VIDEO_MEM
+       add hl,de               ;go to ymin
+       ld  d,h
+       ld  e,l
+
+       ld  hl,GRAPH_MEM
+       add hl,bc               ;hl->logo
+
+       ld  a,(curline)         ;Calculate how many lines to draw
+       ld  c,a
+       ld  a,64
+       sub c
+       ld  b,a
+
+SFXdisp:                       ;display this frame on screen
+       ld  a,b                 ;psh b (a will not be used)
+       ld  bc,16               ;one line (=16 bytes, you'd know by now)
+       ldir                    ;display (copy actually)
+       ld  bc,-16              ;go up one line (not on screen)
+       add hl,bc               ;so the same line will be displayed
+       ld  b,a                 ;pop b
+       djnz SFXdisp            ;repeat until whole screen is displayed
+
+       ld  b,8
+SFXdelay:
+       halt
+       djnz SFXdelay
+
+       pop  bc
+       djnz SFXframe
+       ret
+
+;--------------------------- handle boss -------------------------------------
+
+Handle_boss:
+       ld  hl,GRAPH_MEM
+       ld  (PutWhere),hl
+       ld  ix,spr_boss01
+       ld  hl,bossx
+        ld  d,(hl)
+       inc hl
+       ld  e,(hl)
+       jp  putwidesprite
+
+;--------------------------- update score ------------------------------------
 
 scoreInc:
-       push bc
+       psh bc
        ld  bc,(score)
        add hl,bc
        ld  (score),hl
@@ -1194,12 +1859,12 @@ cleanline:
        ld  hl,VIDEO_MEM+(56*16)
        ld  (PutWhere),hl
 
-       call disp_lives
+       cal disp_lives
 
        ld  ix,spr_icon01       ;armorIcon
        ld  de,$1901            ;icon #1
-       call putwidesprite      ;display icon
-       call disp_armor         ;display value
+       cal putwidesprite       ;display icon
+       cal disp_armor          ;display value
 
        ld  ix,spr_icon00
        ld  a,(torp_occ)
@@ -1208,11 +1873,11 @@ cleanline:
        ld  ix,spr_icon02       ;torpedoIcon
 no_torp:
        ld  de,$2901            ;icon #2
-       call putwidesprite      ;display
+       cal putwidesprite       ;display
 
        ld  ix,spr_icon03       ;emptyIcon
        ld  de,$3901            ;icon #3
-       call putwidesprite
+       cal putwidesprite
 
        ld  ix,spr_icon00       ;emptyIcon
        ld  a,(your_laser)
@@ -1221,7 +1886,7 @@ no_torp:
        ld  ix,spr_icon04       ;laserIcon
 no_laser:
        ld  de,$4901            ;icon #4
-       call putwidesprite
+       cal putwidesprite
 
        ld  ix,spr_icon00       ;emptyIcon
        ld  a,(your_multiples)
@@ -1230,14 +1895,14 @@ no_laser:
        ld  ix,spr_icon05
 no_multiples:
        ld  de,$5901            ;icon #5
-       call putwidesprite
+       cal putwidesprite
 
        ld  ix,spr_icon03
        ld  de,$6901
-       call putwidesprite
+       cal putwidesprite
 
        ld  a,(your_pickup)     ;pickups taken
-       add a,a                 ;picks*2
+       add a,a                 ;picks*2 (sets z-flag)
        ret z                   ;return if no pickups
        add a,a                 ;picks*4
        add a,a                 ;picks*8
@@ -1247,7 +1912,7 @@ no_multiples:
        ld  e,$01               ;x-pos = bottom (1a01,2a01,3a01,4a01,5a01)
 
        ld  ix,spr_icon
-       call putwidesprite
+       cal putwidesprite
        ret
 
 disp_armor:
@@ -1255,7 +1920,7 @@ disp_armor:
        ld  (_penCol),hl        ;place @ armorIcon
        ld  a,(your_armor)      ;load armor left
        add a,'0'               ;make digit
-       call _vputmap           ;display char
+       cal _vputmap            ;display char
        ret
 
 disp_lives:
@@ -1267,11 +1932,22 @@ disp_lives:
        ld  (hl),'x'
        inc hl
 
-       ld  a,(lives)           ;nr of lives in a
+       ld  a,(your_lives)      ;nr of lives in a
        add a,'0'               ;make digit
        ld  (hl),a
        dec hl \ dec hl
-       call _vputs             ;display on screen
+       cal _vputs              ;display on screen
+       ret
+
+;--------------------------- proc ---------------------------------------------
+
+BLACKLCD:
+       ld  hl,VIDEO_MEM        ;screen location (top left)
+       ld  de,VIDEO_MEM+1
+       ld  (hl),%11111111
+       ld  bc,1024             ;loop 1024 times = entire screen
+       ldir
+       set 3,(iy+5)            ;set white on black
        ret
 
 ;--------------------------- game over / new game / death ---------------------
@@ -1279,70 +1955,70 @@ own_name:
        .db $12,7,"nemesis"
 
 save_hi:
-       ld   hl,own_name        ; Find own variable
-       xor  a
-       call _ABS_MOV10TOOP1
-       call _FINDSYM
-       ret  c                  ; If not found, give up
+       ld  hl,own_name         ;find own variable
+       xor a
+       cal _ABS_MOV10TOOP1
+       cal _FINDSYM
+       ret c                   ;not found? who cares...
 
-        ld  a,b                        ; Save the stored section
+        ld  a,b                        ;save the stored section
         ld  h,d
         ld  l,e
         ld  b,0
         ld  de,4+stored_data_start-_asm_exec_ram
         add hl,de
         adc a,b
-        call _SET_ABS_DEST_ADDR
-        ld   a,0
-        ld   hl,stored_data_start
-        call _SET_ABS_SRC_ADDR
-        ld   hl,stored_data_end-stored_data_start
-        call _SET_MM_NUM_BYTES
-        call _mm_ldir
-
-       ret
+        cal _SET_ABS_DEST_ADDR
+        ld  a,0
+        ld  hl,stored_data_start
+        cal _SET_ABS_SRC_ADDR
+        ld  hl,stored_data_end-stored_data_start
+        cal _SET_MM_NUM_BYTES
+        cal _mm_ldir
+       ret                     ;save done
 
 game_over:
        pop hl                  ;=ret (game_over was called from a procedure)
 game_over_nopop:
-       call _clrLCD            ;clear screen
+       cal BLACKLCD            ;clear screen
        ld  hl,$0603
        ld  (_curRow),hl        ;center
        ld  hl,txt_gameover
-       call _puts              ;display "GAME OVER"
+       cal _puts               ;display "GAME OVER"
 
-       xor  a                  ;clear a (AHL will be displayed)
-       ld   hl,$1006           ;bottom-1 right
-       ld   (_curRow),hl       ;set
-       ld   hl,(score)         ;your score
-       call _dispahl           ;display it (a=0)
+       xor                   ;clear a (AHL will be displayed)
+       ld  hl,$1006            ;bottom-1 right
+       ld  (_curRow),hl        ;set
+       ld  hl,(score)          ;your score
+       cal _dispahl            ;display it (a=0)
        ld  hl,$314b            ;bottom-1 right before score ^^
        ld  (_penCol),hl        ;set
        ld  hl,txt_score        ;"Score"
-       call _vputs             ;display (small)
+       cal _vputs              ;display (small)
 
-       ld   hl,$1007           ;bottom right
-       ld   (_curRow),hl       ;set
-       ld   hl,(hiscore)       ;hi-score
-       call _dispahl           ;display
+       ld  hl,$1007            ;bottom right
+       ld  (_curRow),hl        ;set
+       ld  hl,(hiscore)        ;hi-score
+       cal _dispahl            ;display
        ld  hl,$3946            ;bottom right before hiscore ^^
        ld  (_penCol),hl        ;set
        ld  hl,txt_hiscore      ;"Hiscore"
-       call _vputs             ;display (small)
+       cal _vputs              ;display (small)
+       res 3,(iy+5)
 
        ld  de,(score)
        ld  hl,(hiscore)
-       call CP_HL_DE
+       cal CP_HL_DE
        jr  nc,no_hiscore
        ld  (hiscore),de
 
 no_hiscore:
-       call save_hi
+       cal save_hi
 
        ld  b,$20
 wait2: halt \ halt
        djnz wait2              ;delay
-       call _getkey            ;wait for keypress
+       cal _getkey             ;wait for keypress
        jp  quit                ;restore some things and return to TI-OS/shell
 
 New_game:
@@ -1353,22 +2029,25 @@ New_game:
        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)
+       ld  a,4
+       ld  (your_lives),a      ;3 lives (4 will be decreased @ You_die)
+       ld  (pickuptimer),a     ;next pickup after 4 enemies destroyed
 
 You_die:
-       ld  hl,lives
+       ld  hl,your_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
+       jp  z,game_over         ;if so, game's over
 
        xor a                   ;a=0
-       ld  (your_armor),a      ;no armor
+;      ld  (your_armor),a      ;no armor
        ld  (torp_occ),a        ;no torpedoes
        ld  (your_laser),a      ;no laser
        ld  (your_pickup),a     ;reset pickups
        ld  (your_multiples),a  ;no multiples
+ ld a,5 ;&&& betatest; remove when released!
+ ld (your_armor),a
        jr  nonext_level
 
 ;--------------------------- next level ---------------------------------------
@@ -1380,16 +2059,15 @@ Next_level:
        ld  (hl),a
 
        ld  hl,(levelp)         ;level pointer
-       inc hl
-       inc hl
-       inc hl                  ;update to point to next level
+       ld  bc,5+32+4           ;advance four bytes (=one level)
+       add hl,bc               ;update to point to next level
        ld  (levelp),hl         ;save
 
        ld  h,0                 ;increase score....
        ld  l,a                 ;by level number
        ld  bc,20
        add hl,bc               ;plus 20
-       call scoreInc           ;update score
+       cal scoreInc            ;update score
 
 nonext_level:
        ld  a,80
@@ -1397,13 +2075,36 @@ nonext_level:
 
        ld  hl,(levelp)         ;level pointer
        ld  a,(hl)              ;load new level-enemy type
-       ld  (eventenemy),a      ;set level-enemy
+       ld  (level_enemy),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
+       inc hl
+       ld  a,(hl)              ;movement of enemies in this level
+       ld  (level_move),a      ;do it
+       inc hl
+       ld  a,(hl)              ;how frequent the enemies fire a bullet
+       ld  (level_fire),a      ;consider it done
+
+       inc hl
+       ld  de,spacespace
+       ld  bc,36
+       ldir
+
+;      xor a
+;      ld  (level_occ),a       ;no boss (yet)
+
+       ld  ix,starx1
+       ld  b,nrstars1
+       cal placestars
+       ld  hl,RanPos
+       inc (hl)
+       ld  ix,starx2
+       ld  b,nrstars2
+       cal placestars
 
        xor a
        ld  (timer),a           ;reset time
@@ -1414,7 +2115,11 @@ nonext_level:
        ld  hl,x                ;begin position x=...
        ld  (hl),a              ;...=a=0=left
        inc hl                  ;y=...
-       ld  (hl),24             ;...=24=middle
+       ld  a,24                ;...=24=middle
+       ld  (hl),a              ;your y
+       ld  (bossy),a           ;and y of boss
+       ld  a,80
+       ld  (bossx),a
 
        ld  a,(torp_occ)
        or  a                   ;no torpedoes?
@@ -1423,7 +2128,7 @@ nonext_level:
 torpsclear:
 
        ld  de,$0018            ;x=0, y=24 (like you..)
-       call Place_multiples    ;place all multiple-positions at (0,24)
+       cal Place_multiples     ;place all multiple-positions at (0,24)
 
        ld  hl,ybullets         ;clear your/enemy bullets
        ld  (hl),a              ;clear first byte
@@ -1440,57 +2145,41 @@ torpsclear:
 ;--------------------------- 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
-
+       cal BLACKLCD
        ld  hl,$0703
        ld  (_curRow),hl        ;center
        ld  hl,txt_level
-       call _puts              ;display "LEVEL "
+       cal _puts               ;display "LEVEL "
 
        ld  a,(level)
        ld  l,a
        ld  h,$00
 
-       call UNPACK_HL
+       cal UNPACK_HL
        add a,'0'
        ld  b,a
-       call UNPACK_HL
+       cal UNPACK_HL
        add a,'0'
-       call _putc              ;display second digit
+       cal _putc               ;display second digit
        ld  a,b
-       call _putmap            ;display first digit
+       cal _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
+       ld  a,(your_lives)      ;lives left
        add a,'0'               ;make value
        ld  (txt_lives+3),a     ;add to text
-       call _puts              ;display the string
+       cal _puts               ;display the string
+       res 3,(iy+5)            ;set white on black
 
        ld  b,$20
 wait:  halt \ halt
        djnz wait               ;delay
-       call _getkey            ;wait for keypress
+       cal _getkey             ;wait for keypress
 
-       call _clrLCD            ;clear screen
-       call disp_icons         ;display bottom icons
+       cal CLEARLCD            ;clear screen
+       cal disp_icons          ;display bottom icons
 
        ld  hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom
        ld  b,16                ;draw 16x (screen width)
@@ -1501,6 +2190,38 @@ drawline:
        djnz drawline           ;repeat (16bytes * 8pixels =128= screen width)
         ret
 
+
+placestars:
+       add a,b
+       rlca \ rlca
+       ld  hl,(RanPos)
+       add a,(hl)
+       xor %00100100
+       rlca
+       ld  (hl),a
+
+       ld  h,0                 ; l = 0
+       ld  l,a                 ;hl = 0..255
+       add hl,hl               ;hl = 0..510
+       ld  c,a                 ;hl = 0..765
+
+       ld  a,r                 ;a = 0..255
+       rra                     ;a = 0..127
+       ld  d,0
+       ld  e,a
+       add hl,de
+       ld  e,c
+       add hl,de
+
+       ld  de,GRAPH_MEM
+       add hl,de
+
+       ld  (ix),l
+       ld  (ix+1),h
+       inc ix \ inc ix
+       djnz placestars
+       ret
+
 ;--------------------------- putsprite ----------------------------------------
 ;--------------------------- de =(X,Y) ----------------------------------------
 
@@ -1535,8 +2256,8 @@ _n1:      ld  c,a                 ;c = (Y*16+X/8) mod 256
           
        ld  d,(ix)
        ld  b,(ix+1)
-_oloop:        push bc                 ;Save # of rows
-       push hl                 ;Save screen address
+_oloop:        psh bc                  ;Save # of rows
+       psh hl                  ;Save screen address
        ld  b,d                 ;Load width
        ld  c,(ix+2)            ;Load one line of image
        inc ix
@@ -1592,8 +2313,8 @@ n1:       ld       c,a
           
        ld       d,(ix)       
        ld       b,(ix+1)        
-woloop:        push     bc                         ;Save # of rows
-       push     hl                         ;Save screen address
+woloop:        psh      bc                         ;Save # of rows
+       psh      hl                         ;Save screen address
        ld       b,d                        ;Load width
        ld       c,(ix+2)                   ;Load one line of image
        inc      ix
@@ -1635,18 +2356,6 @@ wover_1:
 ;------------------------------- sprites --------------------------------------
 ;------------------------------------------------------------------------------
 
-spr_ship:
-       .db 9,1         ;ship icon
-       .db %11100000   ; ███
-       .db %01111000   ;  ████
-       .db %00111110   ;   █████
-       .db %01111001   ;  ████  █
-       .db %01111001   ;  ████  █
-       .db %01111001   ;  ████  █
-       .db %00111110   ;   █████
-       .db %01111000   ;  ████
-       .db %11100000   ; ███
-
 spr_ship01:
        .db 7,7         ;ship alpha class
        .db %01111000   ;  ████
@@ -1667,23 +2376,23 @@ spr_ship01i:
        .db %01010000   ;  █ █
 
 spr_ship02:
-       .db 7,7         ;ship beta class
-       .db %11100000   ; ███
-       .db %11110000   ; ████
-       .db %01111100   ;  █████
-       .db %01110010   ;  ███  █
-       .db %01111100   ;  █████
-       .db %11110000   ; ████
-       .db %11100000   ; ███
+;      .db 7,7         ;ship beta class
+;      .db %11100000   ; ███
+;      .db %11110000   ; ████
+;      .db %01111100   ;  █████
+;      .db %01110010   ;  ███  █
+;      .db %01111100   ;  █████
+;      .db %11110000   ; ████
+;      .db %11100000   ; ███
 spr_ship02i:
-       .db 7,7         ;ship beta class
-       .db %01000000   ;  █
-       .db %10100000   ; █ █
-       .db %01010100   ;  █ █ █
-       .db %00100010   ;   █   █
-       .db %01010100   ;  █ █ █
-       .db %10100000   ; █ █
-       .db %01000000   ;  █
+;      .db 7,7         ;ship beta class
+;      .db %01000000   ;  █
+;      .db %10100000   ; █ █
+;      .db %01010100   ;  █ █ █
+;      .db %00100010   ;   █   █
+;      .db %01010100   ;  █ █ █
+;      .db %10100000   ; █ █
+;      .db %01000000   ;  █
 
 spr_multiple:
        .db 6,4         ;multiples
@@ -1820,14 +2529,14 @@ spr_icon02:
        .db %10011000,%11110101 ; █  ██   ████ █ █
        .db %11100110,%00110010 ; ███  ██   ██  █
 spr_icon03:
-       .db 16,7        ;empty    .......:.......:
-       .db %10000000,%00000000 ; █
-       .db %10000000,%00000000 ; █
-       .db %10000000,%00000000 ; █
-       .db %10000000,%00000000 ; █
-       .db %10000000,%00000000 ; █
-       .db %10000000,%00000000 ; █
-       .db %10000000,%00000000 ; █
+       .db 8,7         ;empty    .......:
+       .db %10000000 ;00000000 ; █
+       .db %10000000 ;00000000 ; █
+       .db %10000000 ;00000000 ; █
+       .db %10000000 ;00000000 ; █
+       .db %10000000 ;00000000 ; █
+       .db %10000000 ;00000000 ; █
+       .db %10000000 ;00000000 ; █
 spr_icon04:
        .db 16,7        ;laser    .......:.......:
        .db %10000000,%00000000 ; █
@@ -1839,18 +2548,21 @@ spr_icon04:
        .db %10000000,%00000000 ; █
 spr_icon05:
        .db 16,7        ;multiple .......:.......:
-       .db %10000011,%10000000 ; █     ███      
-       .db %10000001,%11100110 ; █      ████  ██ 
-       .db %10000001,%11100000 ; █      ████    
-       .db %10000011,%10000000 ; █     ███      
-       .db %10011000,%00000000 ; █  ██          
+       .db %10000011,%10000000 ; █     ███
+       .db %10000001,%11100110 ; █      ████  ██
+       .db %10000001,%11100000 ; █      ████
+       .db %10000011,%10000000 ; █     ███
+       .db %10011000,%00000000 ; █  ██
        .db %10111100,%11000011 ; █ ████  ██    ██
-       .db %10011000,%00000000 ; █  ██          
+       .db %10011000,%00000000 ; █  ██
 
 ;---------------------------- texts -------------------------------------------
 
-txt_about:     .db " v0.93.911",127,"by Shiar",0
+txt_about:     .db " v0.94.A08",127,"by Shiar",0
 txt_email:     .db "shiar0@hotmail.com",0
+txt_menu1:     .db "CONTINUE",0
+txt_menu2:     .db "NEW GAME",0
+
 txt_level:     .db "LEVEL ",0
 txt_gameover:  .db "GAME OVER!",0
 txt_score:     .db "Score",0
@@ -1861,32 +2573,22 @@ txt_pressenter: .db "Enter to continue",0
 ;---------------------------- save data ---------------------------------------
 
 PutWhere       .dw GRAPH_MEM           ;where to put the wide sprites
-
-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
-pickuptimer    .db $04
+levelp         .dw $0000               ;pointer to level data
 
 score          .dw $0000
+
 stored_data_start:
 hiscore                .dw $0000
 stored_data_end:
 
 your_pickup    .db $00
 your_occ       .db $00                 ;0=normal 1..16=exploding
-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
-
-your_laser     .db $01                 ;laser avail: 0=no, 1=yes
+your_inv       .db $00                 ;invincibility left
+your_armor     .db $00                 ;HP left
+your_lives     .db $00                 ;
+
+your_laser     .db $00                 ;laser avail: 0=no, 1=yes
 your_multiples .db $00                 ;multiples present
 torp_occ       .db $00                 ;torp.state: 0=unavail 1=avail 2=presnt
 torp_pos       .dw $0000               ;torpedo position (x,y)
@@ -1902,64 +2604,87 @@ sprites:
        .db spr_enemy05-spr_enemy00
        .db spr_enemy06-spr_enemy00
        .db spr_enemy07-spr_enemy00
+       .db spr_enemy08-spr_enemy00
 
 spr_enemy00:
-       .db 7,5         ;pickup
-       .db %11111110   ; ███████
-       .db %11111110   ; ███████
-       .db %11000110   ; ██   ██
-       .db %11111110   ; ███████
-       .db %11111110   ; ███████
+       .db 7,5                         ;pickup
+       .db %11111110                   ; ███████
+       .db %11111110                   ; ███████
+       .db %11000110                   ; ██   ██
+       .db %11111110                   ; ███████
+       .db %11111110                   ; ███████
 spr_enemy01:
-       .db 6,6         ;enemy type one
-       .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 8,6         ;enemy type two
-       .db %00111111   ;    █████
-       .db %01111000   ;  ████
-       .db %11111100   ; ██████
-       .db %11111100   ; ██████
-       .db %01111000   ;  ████
-       .db %00111111   ;    █████
+       .db 8,6                         ;enemy type two
+       .db %00111111                   ;    █████
+       .db %01111000                   ;  ████
+       .db %11111100                   ; ██████
+       .db %11111100                   ; ██████
+       .db %01111000                   ;  ████
+       .db %00111111                   ;    █████
 spr_enemy03:
-       .db 6,6         ;enemy type three
-       .db %01111100   ;  █████
-       .db %11110000   ; ████
-       .db %11111000   ; █████
-       .db %11111000   ; █████
-       .db %11110000   ; ████
-       .db %01111100   ;  █████
+       .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   ;   ███
+       .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   ;    ████
+       .db 7,6                         ;enemy type five
+       .db %00011110                   ;    ████
+       .db %01111110                   ;  ██████
+       .db %11111100                   ; ██████
+       .db %11111100                   ; ██████
+       .db %01111110                   ;  ██████
+       .db %00011110                   ;    ████
 spr_enemy06:
-       .db 7,6         ;enemy type four
-       .db %00011100   ;    ███
-       .db %01111110   ;  ██████
-       .db %10111000   ; █ ███
-       .db %10111000   ; █ ███
-       .db %01111110   ;  ██████
-       .db %00011100   ;    ███
+       .db 7,6                         ;enemy type six
+       .db %00011100                   ;    ███
+       .db %01111110                   ;  ██████
+       .db %10111000                   ; █ ███
+       .db %10111000                   ; █ ███
+       .db %01111110                   ;  ██████
+       .db %00011100                   ;    ███
 spr_enemy07:
-       .db 8,6         ;enemy type four
+       .db 8,6                         ;enemy type seven
+       .db %00011110                   ;    ████
+       .db %01111111                   ;  ███████
+       .db %10011100                   ; █  ███
+       .db %10011100                   ; █  ███
+       .db %01111111                   ;  ███████
+       .db %00011110                   ;    ████
+spr_boss01:
+       .db 16,10                       ;boss type one
+       .db %00000001,%11111111         ;        █████████
+       .db %00001111,%11111110         ;     ███████████
+       .db %00111111,%11110000         ;   ██████████
+       .db %01011111,%10000000         ;  █ ██████
+       .db %10011111,%01000000         ; █  █████ █
+       .db %10011111,%01000000         ; █  █████ █
+       .db %01011111,%10000000         ;  █ ██████
+       .db %00111111,%11110000         ;   ██████████
+       .db %00001111,%11111110         ;     ███████████
+       .db %00000001,%11111111         ;        █████████
+
+
+spr_enemy08:
+       .db 8,6         ;enemy type eight
        .db %00011110   ;    ████
        .db %01111111   ;  ███████
 enemy00:.db %10011100  ; █  ███
@@ -1972,33 +2697,60 @@ 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
+enemy03:                       ;#3     HP:1    app:lure
+       .db %00001111,3,2,0
+
 enemy04:                       ;#4     HP:2    app:lure
        .db %00000110,4,2,0
 enemy05:                       ;#5     HP:2    app:random      moving
-       .db %00000111,5,1,0
+       .db %00000111,5,3,0
 enemy06:                       ;#6     HP:3    app:lure        moving
        .db %00001011,6,2,0
-enemy07:                       ;#7     HP:6    app:halflure    moving
-       .db %00010111,7,3,0
+
+enemy07:                       ;#7     HP:7    app:halflure    moving
+       .db %00011011,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
+       ;format: enemy nr; enemy frequency; next lvl; level_move; level_fire
+       ;tunnel size; groundtype; 17_ground; 17_ceiling; stars1; stars2
+level01:                               ;efrequency must be odd if halfluring!
+       .db $01,$1b,$2f,%00010000,255,0,0
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
+level02:
+       .db $02,$13,$4b,%01010000,064,0,0
+       .db 1,2,3,4,5,6,6,5,4,3,4,5,4,3,2,1
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
 level03:
-       .db $03,$1f,$3f
+       .db $03,$2d,$3f,%01100000,255,-9,1
+       .db 3,2,4,3,2,2,1,1,1,1 ,1,1,21,17,18,20
+       .db 1,1,1,1,1,1,1,3,6,12,9,1,21,19,18,18
+       .db -1,-1
+
 level04:
-       .db $04,$0d,$4f
+       .db $04,$11,$41,%00010000,057,0,0
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
 level05:
-       .db $05,$23,$3d
+       .db $05,$11,$45,%01010010,031,-7,1
+       .db 14,12,11,9,10,7,7,5,4,3,4,4,2,3,1,2
+       .db 1, 1, 1, 1,1, 1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
 level06:
-       .db $06,$1f,$39
+       .db $06,$19,$3a,%01110000,255,-4,1
+       .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
+       .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
+
 level07:
-       .db $07,$1d,$f9
+       .db $07,$09,$ff,%00010000,043,0,0
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
 
 ;----------------------------- logo -------------------------------------------
 
@@ -2028,175 +2780,37 @@ logo_nemesis:
        .end
 .end
 
-;----------------------------- NEMESIS'86 by Shiar ----------------------------
-
-;Game · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · NEMESIS
-;Version  · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·  0.93.911
-;Latest modification  · · · · · · · · · · · · · · · · · · · · · · · ·  11.IX.99
-;Calc · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·  TI-86 only
-;Size · · · · · · · · · · · · · · · · · · · · · · · · · · ·  3098 bytes on calc
-
-;Author · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · SHIAR
-;ICQ  · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · #43840958
-;E-mail · · · · · · · · · · · · · · · · · · · · · · · · · ·  shiar0@hotmail.com
-;Homepage · · · · · · · · · · · · · · · · · · · · · · · · · · · · come.to/shiar
-
-;Notes:
-;  <*> This game is not yet finished (BETA) and there may still be some bugs.
-;  <*> I'll probably release the source 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 909
-;
-;      + 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 832
-;
-;      # 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 1078
-;
-;      + ability to fire bullets (F1). Enemies disappear on impact
-;      * enemies explode instead of disappearing
-;
-; 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 1406
+;0.94.1008 -- 08.X.99 -- size 4531 (4456)
 ;
-;      # 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
+;      + starfield background scrolling left (2 layers (front and back))
+;      * enemies aim their bullets towards you: 5 different directions!
+;      # removed some unintended <add a,a> instructions
+;      * gamefield is now white on black instead of normal black on white!
+;      + enemies can also move slowly, fast, very fast, or 1st fast then slow
+;      # you can't fire when you're exploding
+;      + GROUND scrolling at bottom. You die if you hit the ground (!!!)
+;        (unlike the ground in version 0.925test there are NO bugs)
+;      + ceiling scrolling at top, just like the ground
+;      * ground and ceiling profile are different each level
+;      * ground and/or ceiling can be non-present (speeding up cause skipped)
+;      # no more BIG crash if enemies fire too much bullets ( >10)
+;      + frequency of enemies firing bullets differs per level
+;      * stars scroll at alternate speeds, different than any ship/pick (3/4)
+;      + special effect displaying titlescreen (stole from Spaze Invaders'83)
+;      * enemies can fire either directly on entering the level, or not
+;      + "tunnel" (playfield) can narrow/grow at random (depending on level)
+;      * minimum size of "tunnel" can be different per level
+;      + menu at startup. select "NEW GAME" and "LOAD GAME" with up/down
+;      - nemesis doesn't use the SpazeInvaders effect anymore (took too long)
+;      + choosing new game will display a demo first (text will be displayed
+;        with special effect [SI] saying the storyline will come soon)
+;      * levels altered to be more challenging and different (seven levels)
+;      # the usual bugs that come with new features removed (i think?)
+;      * you get 5 shield-points at start and after death
 ;
-; 0.5.725 -- 25.VII.99 -- size 1703
 ;
-;      * 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 2077 -- MAJOR UPGRADE first release (not on web)
-;
-;      * 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.61.825 -- 25.IIX.99 -- size 2085 -- small changes to v0.6
-;
-;      # 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 -- optimizations and pickups
-;
-;      + 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 -- small improvements and bugfixes
-;
-;      + 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 -- FIRST MAJOR (BETA) RELEASE; on websites
-;
-;      # 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
-;
-; 0.91.95 -- 05.IX .99 -- size 2797 -- good improvements (upgrades); beta rel.
-;
-;      + LASERS!!!!! four pickups and you fire laserbeams instead of bullets
-;      * multiple enemies can be hit at once, very usefull when firing lasers
-;      + MULTIPLE!! like the (shadow-)multiple from MSX-Nemesis. for 5 pickups
-;        you get an multiple following you, firing bullets and lasers like you
-;      * most data (enemy positions) stored at TEXT_MEM and DELC_LEN positions
-;        instead of in program, saving A LOT of bytes in program-size
-;      - at release of 0.91 bullets didn't work, laser is used instead
-;
-; 0.92.98 -- 08.IX .99 -- size 2831 -- beta released to testers
-;
-;      + all bullets and enemies are removed at the start of a level
-;      # you can fire bullets again (no more laser at startup)
-;      * pickups aren't given at random, but appear every x enemies destroyed
-;      # solved a minor bug in invulnerability flashing display
-;      * clearScreen procedure improved (faster and smaller)
-;      # fifth icon couldn't be selected (so no multiples selectable). fixed
-;      * laserbeam lasts 5 turns (laser wasnt good enough compared to bullets)
-;
-;0.93.911 -- 11.IX .99 -- size 3098
-;
-;      # torpedo-upgrade was cleared when firing torpedo at the end of a level
-;      * pickups move away half the speed of enemies (one pixel every 2 turns)
-;      # fixed a bug causing some calcs to crash on quit
-;      # contrast was not restored after game over (remained one step darker)
-;      * fire key changed from F1 to 2ND, select key changed from F2 to ALPHA
-;      * improved key-checking procedureS (much faster, smaller, better, yea)
-;      * changed title screen, displays version white on black and my e-mail
-;      + score count!! simple system: one point for an enemy destroyed, two
-;        for collision, and one point every 256 frames. plus level clear bonus
-;      + saves HISCORE!!! At game-over screen your- and hi-score are displayed
-;      * Game over screen will be displayed before quit after pressing <exit>
-;      + screen is cleared and cursor moved to top-left on quit
-;      * multiples move only when YOU move, just like the original MSX-Nemesis
-;      * multiple is placed at your position when selected/at start of level
-;      * minor changes in iconbar (3rd icon is empty, line between 5th/score)
-
-
 ;       + added        - removed       * changed       # bug fixed
+