version 0.94 (major beta): stars, ground, more enemy abilities, menu
authorMischa Poslawsky <nemesis@shiar.org>
Fri, 8 Oct 1999 20:55:52 +0000 (22:55 +0200)
committerMischa Poslawsky <nemesis@shiar.org>
Wed, 18 Mar 2009 02:24:51 +0000 (03:24 +0100)
+ 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

nemesis.txt
nemesis.z80

index d7b2e48f0a162996800927c687ae38dc4437f1e6..a918efb70f3efdb28cda5a47f367162892d4bff9 100644 (file)
              ╔═══════════════════╗
-             ║   N E M E S I S   ║██     Game: Nemesis  version 0.93.911 BETA!!
-             ║───────────────────║██     By:   SHIAR  shiar0@hotmail.com
-             ║ 0.93BETA by SHIAR ║██                  ICQ #43840958
-             ╚═══════════════════╝██                  http://come.to/shiar
-               █████████████████████     Calc: TI-86 only, for now..
-                                         Size: 3098 bytes on calc
-                           Description: Arcade-game based on an old MSX-game.
+             ║   N E M E S I S   ║██   Game: Nemesis  version 0.94.1004 BETA!
+             ║───────────────────║██   By:   SHIAR  shiar0@hotmail.com
+             ║ 0.94BETA by SHIAR ║██                ICQ #43840958
+             ╚═══════════════════╝██                http://come.to/shiar
+               █████████████████████   Calc: TI-86 only, for now..
+                                       Size: 3549 bytes on calc
+                          Description: Arcade-game based on an old MSX-game.
 
 
 
->>>>>>> INTRO TO NEMESIS ------------------------------------------------------
+>>>>>>> NOTE ON V.94 ---------------------------------------------------------
+
+  The 0.94 version took a bit longer because I'm a very busy at school.
+Anyways, here it is. You might've noticed the game's now in TWO versions:
+normal black on white, and a new *WHITE on BLACK* (like real space) version.
+
+  PLEASE TELL ME WHAT YOU THINK: is this better or should I stick to B on W??
+I've included a short version history in this readme so you can see what's new
+and what's not (TI-News hadn't got a clue last update).
+
+
+>>>>>>> INTRO TO NEMESIS -----------------------------------------------------
 
   Nemesis is an old arcade-game for the MSX. It was a really good game,
-that's why Konami made three Nemesis games, named Nemesis (1986), Nemesis ][
-(1987) and Nemesis III ('88).
+that's why Konami made not only the three Nemesis games for the MSX
+(Nemesis I (1986), ][ (1987) and III ('88)) but also four more Nemesis-clones
+for the MSX (Salamander, Parodius, Space Manbow and Life Force) as well as
+versions for the: ZX Spectrum (2 versions); MSX (4x); Comodore 64 (2x);
+arcades (2x); PC Engine (4x); Game Boy (3x); NES (4x); SNES (4x); and
+Play Station (11x) (as far as I'm aware of).
 
 
->>>>>>> CONTROLS --------------------------------------------------------------
+>>>>>>> CONTROLS -------------------------------------------------------------
 
   You control a hi-tech upgradable vessel (storyline coming soon) and you have
 blast 'n evade your way through a lot of enemies. Some enemies leave pickups
-which you can collect in order to power-up your ship. Keys are:
+which you can collect in order to power-up your ship. Keys* are:
 
 Arrow keys: stupid question, self-destructs your ship of course
-2nd: fire your weapon (disruptor as default, upgradable to laserbeam)
+2nd: fire your weapon(s) (disruptor as default, upgradable to laserbeam)
 ALPHA: enable the currently selected upgrade
 MORE: pause, press Enter to continue
-EXIT: resets your calc and clears your ROM memory
+EXIT: resets your calc and clears your ROM memory (just keep playing :)
+
+                               * tried to use the universal TI-86 key meanings
 
 
->>>>>>> PICKUPS AND SO --------------------------------------------------------
+>>>>>>> PICKUPS AND SO -------------------------------------------------------
 
   Collect the pickups enemies leave after they're destroyed to upgrade your
 ship. The highlighted icon in the score bar (bottom) can be activated by
 pressing ALPHA. The number in the first icon shows your shield-points left.
 This icon can be chosen more than once, to increase your shield-points.
 
-  Other upgrades: ┌───────┬─────────┬───────┬───────┬───────────┐
-                  │ ARMOR │ TORPEDO │ EMPTY │ LASER │ MULTIPLES │
-                  └───────┴─────────┴───────┴───────┴───────────┘
-
+  Other upgrades:  _____________________________________________
+                  | ARMOR | TORPEDO | EMPTY | LASER | MULTIPLES |
+                  `~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
   All upgrades and pickups will be lost when your ship is destroyed!
 
 
->>>>>>> BETA STUFF ------------------------------------------------------------
+>>>>>>> HISTORY --------------------------------------------------------------
+
+Some version changes (not all) from version 0.61.
+
+  Version 0.7 Beta  Size:2303  02.IX
+
+* contrast is increased at startup
+* invulerable when entering the game (your ship looks different too)
+* hitpoints/shield. some enemies leave pickups which increase your shield
+* fixed the fake bullets-bug
+
+  Version 0.8 Beta  Size:2433  03.IX
+
+* enemies move individually, not all at the same time
+* enemies fire once every x time instead of randomized
+* changed: enemies removed correctly, screen cleared at quit, enemies don't
+  move off screen (above or below edge), levels rebuild
+
+  Version 0.9 Beta  Size:2693  04.IX   (first major release)
 
-  There are just eight levels for now, don't try to get to level nine.
+* multiple pickups can be collected, and activated by pressing F2
+* two pickups select torpedo, one selects shield increase
+* you have 4 lives. Dieing will decrease lives and restart in the same level
+* fixes: pickups no longer fire bullets, randomizer fixed, game over quits
+
+  Version 0.91Beta  Size:2797  05.IX
+
+* fourth icon selects laser
+* fifth icon selects multiples (like the shadow multiples in Nemesis)
+* most data no longer stored in program, saving a lot of bytes
+
+  Version 0.92Beta  Size:2831  08.IX
+
+* Laserbeam lasts for five turns, making it more powerfull
+* Bullets and enemies are removed at the beginning of a level
+* Pickups don't appear random anymore, but after destroying x enemies
+* Bugs fixed: fifth icon select, firing bullets, invulerability
+
+  Version 0.93Beta  Size:3098  11.IX   (second major release)
+
+* Pickups move slower
+* Keys changed to 2nd and Alpha
+* Counts score and saves highest score
+* Multiples move only when you move (like in MSX-Nemesis)
+* A lot of small fixes and changes (really a lot of them)
+
+  Version 0.94Beta  Size:4456  08.X    (yet another release)
+
+* Two-layer starfield scrolling in the background
+* Some enemies aim their bullets towards you
+* Bugfixes etc. (like the fire-when-already-destroyed-bug)
+* Enemies can move at different speeds or move patterns
+* Ground scrolling at bottom and ceiling scrolling at top
+* Tunnel effect in some levels
+* Main menu (choose continue or start new game)
+* Levels changed, bugs fixed, enemy firing rate differs, and more
+
+
+>>>>>>> BETA STUFF -----------------------------------------------------------
+
+  There are just seven levels for now, don't try to get to level eight.
 Things to come:
 
-* more LEVELS!! more enemies more pickups
+* more LEVELS!! more enemies more upgrades
 * maybe obstacles?
 * storyline
-* teacher-key or save game
+* save game
 * save names with hi-score
 * source code release
+* bosses at the end of a level!
+* different enemies in one level
+- NO greyscale
 
   Send me any IDEAS and BUGS found!! Or send me you like this program, or even
 send me something if you don't. Again: shiar0@hotmail.com, or ICQ #43840958!
@@ -62,21 +139,26 @@ PLEASE!
   Tested on TI86es (and emulators) with ROM 1.4 and 1.6 using YAS, Rascall and
 Asm(.
 
+  BUG: When you go to the next level, and you are running under RASCALL with
+the memory LOCKED, you lose all upgrades and go to level 3. Thanks to TomTTBH!
+
 
->>>>>>> CREDITS ---------------------------------------------------------------
+>>>>>>> CREDITS --------------------------------------------------------------
 
   SHIAR                programming and everything else. SHIAR0@HOTMAIL.COM
+> PATRICK DAVIDSON        wrote GALAXIAN, nemesis uses the same gfx-engine
   KONAMI           for writing the original Nemesises and more great games
   FRAGGIE            beta tester #1 and being very positive about the game
   FREE BIRD             beta tester #2, will help me writing the storyline
   ELEANOR GILES     for sending me mail / reporting a bug / making my day!
   JAMES RUBINGH                          sent me an ICQ message, thank you
+  TOMTTBH                            another ICQ message and a BUG report!
 
 
->>>>>>> DISCLAIMER AND END ----------------------------------------------------
+>>>>>>> DISCLAIMER AND END ---------------------------------------------------
 
-  Take any program and read the disclaimer. The same thing applies here. Now go
-and play Nemesis and SEND ME SOMETHING!
+  Take any program and read the disclaimer. The same thing applies here. Now
+go and play Nemesis and SEND ME SOMETHING!
 
 
------------------------------------------------------------------------ <<<<<<<
\ No newline at end of file
+---------------------------------------------------------------------- <<<<<<<
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
+