version 0.99: armor pickups, bullet hit, finishing touches
authorMischa Poslawsky <nemesis@shiar.org>
Sat, 9 Sep 2000 21:38:22 +0000 (23:38 +0200)
committerMischa Poslawsky <nemesis@shiar.org>
Wed, 18 Mar 2009 04:08:13 +0000 (05:08 +0100)
* 10 bytes off by optimizing main menu a little
* and optimizations to hiscore name handling saved another 17 bytes!
* score increased by 1 per placed enemy, instead of time (otherwise
   you could just evade bosses for a long time for very high score)
* findpixel optimized (or rather un-unoptimized: restored to original)
# ground fixed again (and optimized for tunnel only)
# prevents exploding more than once (not dieing while inside ground)
* some unneccessary pushes removed
+ final boss also fires moving mines (just up/down-enemies)
* on collision less damage to enemy, more to you (bosses too simple)
* normal pickups will increase armor and shield directly (no [alpha])
+ a large pickup'll appear at the end of a level which will select
   your next upgrade: beamweapon, laser, multiple/tailbeam/up-double
+ a small explosion is displayed when enemy's hit but not destroyed
# _all_ multiples appear at your position at start of level
# bug in selecting multiples fixed (recent bug)
+ getting passed 3rd upgrade (4 pickups) increases score by 250!
- second icon integrated in 5th, first two icons removed (unused now)
* the armor bar is now 5 pixels in height; very visible
# if selecting upgrade or starting level, charge bar wasn't displayed

nemesis.txt
nemesis.z80

index d7afe9821f4d13024b1e3a2059f76366df98020f..fae34882795865c811b886e1d5dac0b7abb4665b 100644 (file)
@@ -1,11 +1,10 @@
 ------------------------------------------------------------------------------
  Title                         : Nemesis
 ------------------------------------------------------------------------------
  Title                         : Nemesis
- Version                       : 0.99.829 Beta
- Release Date                  : 29.VIII.00
- Filename                      : nemesis.86p (size 7kB)
+ Version                       : 0.99.99 Beta
+ Release Date                  : 9.IX.00
+ Filename                      : nemesis.86p (size 6939)
  Author(s)                     : Shiar
  Email Address                 : shiar0@hotmail.com
  Author(s)                     : Shiar
  Email Address                 : shiar0@hotmail.com
- ICQ                           : #43840958
  Web Page                      : http://www.shiar.org
  Description                   : cool arcade-shoot-em-up-game
  Where to get this game        : www.shiar.org | ticalc.org
  Web Page                      : http://www.shiar.org
  Description                   : cool arcade-shoot-em-up-game
  Where to get this game        : www.shiar.org | ticalc.org
@@ -15,7 +14,7 @@
 >>>>>>> NOTE ON V.99 ---------------------------------------------------------
 
   Dear betatester, please do not give this game away to others. This beta has
 >>>>>>> NOTE ON V.99 ---------------------------------------------------------
 
   Dear betatester, please do not give this game away to others. This beta has
-ten levels, and should not crash your calc. Report any bugs or imperfections
+ten levels, and should never crash your calc. Report any bugs or imperfections
 to me. Thanks, and have fun!
 
 
 to me. Thanks, and have fun!
 
 
@@ -36,6 +35,7 @@ the last two are HARDCORE-ships, which have a lot less armor than the others.
 CONTINUE GAME later, you'll start at that level.
 
   In the game itself you just have to keep yourself from getting destroyed.
 CONTINUE GAME later, you'll start at that level.
 
   In the game itself you just have to keep yourself from getting destroyed.
+The following keys might come in handy:
 
   ARROWS : move your ship
      2nd : fire weapons
 
   ARROWS : move your ship
      2nd : fire weapons
@@ -44,38 +44,38 @@ CONTINUE GAME later, you'll start at that level.
    GRAPH : teacher/boss! (press graph again to resume)
     EXIT : whooo, what does _this_ button do?
 
    GRAPH : teacher/boss! (press graph again to resume)
     EXIT : whooo, what does _this_ button do?
 
-  After destroying several enemies, pickups will appear. Collect them to
-upgrade your vessel. The highlighted icon in the score bar (bottom) can be
-activated by pressing ALPHA (see next section).
-
-  The upper bar on the left shows your hitpoints left (armor). The bar below
-that shows the current power of your weapon.
+  At the bottom you can see the current power of your weapon, your lives left,
+armor left, your upgrades and score.
 
 
 >>>>>>> UPGRADES -------------------------------------------------------------
 
 
 
 >>>>>>> UPGRADES -------------------------------------------------------------
 
-  ARMOR+SHIELD
-Will increase your armor and activate the shield for a short time. The shield
-will reduce any damage, and completely absorb enemy bullets in normal mode.
+  Flying over a small pickup will increase your armor and activate the shield
+for a short time. The shield will reduce any damage, and completely absorb
+enemy bullets in normal mode.
+
+  After defeating a boss, a larger pickup will appear, which you can use to
+upgrade your ship. These upgrades are:
 
 
+  1 - BEAM: The standard weapon all vessels are equipped with. Selecting this
+icon will upgrade your weapon to a more powerful one. This can only be done
+nine times.
 
 
-  TAILBEAM / UP DOUBLE
-Depending on the vessel you fly with, this activates either a tail beam (a
-bullet going backwards) or up double (bullet going up 45 degrees). This extra
-weapon can not be selected when you have lasers.
+  2 - LASER: A direct weapon which replaces the beam-weapon. Can also be
+upgraded upto nine times.
 
 
-  BEAM
-The standard weapon all vessels are equipped with. Selecting this icon will
-upgrade your weapon to a more powerful one. This can only be done nine times.
+  3 - TAILBEAM / UP DOUBLE: Depending on the vessel you fly with, this
+activates either a tail beam (a bullet going backwards) or up double (bullet
+going up 45 degrees). This extra weapon is only available when your ship is
+equipped with a beam weapon.
 
 
-  LASER
-A direct weapon which replaces the beam-weapon. Can also be upgraded upto
-nine times.
+    - MULTIPLES: or "options". Will be selected if you've got lasers. These
+will follow your ship and fire when you do, effectively doubling your damage.
+You can have four of them.
 
 
-  MULTIPLES
-Or "options". Can only be selected together with lasers. These will follow
-your ship and fire when you do, effectively doubling your damage. You can
-have four of them.
+  4 - SCORE: If you collect four pickups, your score will be increased by 250
+points. This is for the real hardcore shmuppers who don't need no skinkin'
+upgrades,
 
 
 >>>>>>> BETA STUFF -----------------------------------------------------------
 
 
 >>>>>>> BETA STUFF -----------------------------------------------------------
index 63dd1449b62e2361e5ccd8896796ee028c4aa7d7..3cbb88ea324d8c49739394a1e1d2ec5f05b4b58b 100644 (file)
@@ -7,15 +7,13 @@
 ;!!! This source should only be used for learning practises, do not !!!
 ;!!! alter it, and certainly never  distribute an altered version!! !!!
 
 ;!!! This source should only be used for learning practises, do not !!!
 ;!!! alter it, and certainly never  distribute an altered version!! !!!
 
-;TO DO:  levels 11,12,13 | draw bosses 12 and 13 (41/42)
-;       store B<>W mode | ship info at ship selection screen
-;       store ship sprite pointers as word | look over &&& markings
+;TO DO:  levels 12 and 13 | draw bosses 12 and 13 (41/42)
 
 ;---------------------- nemesis.z80 start -----------------------------------
 
 #include       "asm86.h"
 #include       "ti86asm.inc"   ;standard ti86 romcalls
 
 ;---------------------- nemesis.z80 start -----------------------------------
 
 #include       "asm86.h"
 #include       "ti86asm.inc"   ;standard ti86 romcalls
-#include       "ti86abs.inc"   ;used to save hiscores and so
+#include       "ti86abs.inc"   ;used to save hiscores and stuff
 
        .org _asm_exec_ram
 
 
        .org _asm_exec_ram
 
@@ -23,8 +21,9 @@
 #define                  psh   push    ; ^:D
 #define                  dnz   djnz    ;Dec&Jump while NonZero becomes Do w.Non-Zero
 
 #define                  psh   push    ; ^:D
 #define                  dnz   djnz    ;Dec&Jump while NonZero becomes Do w.Non-Zero
 
-dispbuffer     = $81FA ;= $C9FA                ;virtual screen
-;VIDEO_MEM     = $FC00         ;tha big scareen
+#define          teacherkey    ;compiled with teacher key: 88 bytes extra
+
+dispbuffer     = $8400 ;$C9FA  ;virtual screen (MUST be mod$400=0!!)
 
 _clrWindow     = $4a86         ;_clrLCD and _clrScrn
 _ex_ahl_bde    = $45f3         ;exchange values between AHL and BDE
 
 _clrWindow     = $4a86         ;_clrLCD and _clrScrn
 _ex_ahl_bde    = $45f3         ;exchange values between AHL and BDE
@@ -85,7 +84,7 @@ lvlenemies    = ebullets+(nrebuls*3)  ;-1032
        .dw Title               ;pointer to description (all shells)
        .dw Icon                ;pointer to YAS icon
 
        .dw Title               ;pointer to description (all shells)
        .dw Icon                ;pointer to YAS icon
 
-Title: .db "Nemesis v0.99.829 by SHIAR",0
+Title: .db "Nemesis v0.99.99 by SHIAR",0
 
 Icon:  .db 8,1                 ;icon for YAS: width = 1byte; height = 7bytes
        .db %11100000           ; ███
 
 Icon:  .db 8,1                 ;icon for YAS: width = 1byte; height = 7bytes
        .db %11100000           ; ███
@@ -171,52 +170,47 @@ underline:
 dispmenu:
        ld  de,$0304
        ld  (_curRow),de
 dispmenu:
        ld  de,$0304
        ld  (_curRow),de
-       ld  hl,txt_menu1
+       ld  hl,txt_menu1        ;NEW GAME
        cal _puts
        ld  de,$0305
        ld  (_curRow),de
        cal _puts
        ld  de,$0305
        ld  (_curRow),de
-       ld  hl,txt_menu2
+       ld  hl,txt_menu2        ;CONTINUE GAME
        cal _puts
 
 menuloop:
        ld  a,0                 ;current menu item (0 or 1); 0 by default
 menuitem =$-1
        cal _puts
 
 menuloop:
        ld  a,0                 ;current menu item (0 or 1); 0 by default
 menuitem =$-1
-       ld  h,$01
+       ld  h,$01               ;selector (*) x-coord. = 1
        add a,4
        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
+       ld  l,a                 ;y-coord. = sel menu item + 4 = 4/5
+       ld  (_curRow),hl        ;set position
+       ld  a,5                 ;'*'
+       cal _putmap             ;mark selected menu item
+
+       ld  a,l                 ;y-pos 4/5
+       xor 1                   ;invert (4=5; 5=4)
+       ld  (_curRow),a         ;set new row position
+       ld  a,32                ;' ' (empty, just remove any * present)
        cal _putc
 
        cal getsomekeys         ;read keys (z if enter/2nd pressed)
        cal _putc
 
        cal getsomekeys         ;read keys (z if enter/2nd pressed)
+       ld  hl,menuitem
        jr  z,start_tha_freakin_game
        cp  K_EXIT
        jr  z,start_tha_freakin_game
        cp  K_EXIT
-       jr  z,menuexit
+       jr  z,menuexit          ;exit goes to the g/o screen (first score=0)
        cp  K_UP
        cp  K_UP
-       jr  z,menuchange
-       cp  K_DOWN
-       jr  nz,menuloop
+       jr  z,menuchange        ;up changes selected menu item
+       cp  K_DOWN              ;down as well
+       jr  nz,menuloop         ;anything else just loops
 menuchange:
 menuchange:
-       ld  hl,menuitem
-       ld  a,(hl)
+       ld  a,(hl)              ;(menuitem)
        xor 1                   ;0=1; 1=0
        ld  (hl),a              ;set new menu item
        xor 1                   ;0=1; 1=0
        ld  (hl),a              ;set new menu item
-       jr  menuloop
+       jr  menuloop            ;continue looping
 
 start_tha_freakin_game:
 
 start_tha_freakin_game:
-       ld  a,(menuitem)
-       dec a
+       ld  a,(hl)              ;(menuitem)
+       dec a                   ;new game=0; so that gives -1 = NZ
        cal nz,New_game         ;NEW GAME
        jp  samelevel           ;CONTINUE: game_main_loop
 
        cal nz,New_game         ;NEW GAME
        jp  samelevel           ;CONTINUE: game_main_loop
 
@@ -255,10 +249,6 @@ mode_invert:
 game_main_loop:                        ;REPEATS FROM HERE EVERY FRAME
        ld  hl,timer            ;update time
        inc (hl)                ;increase by 1
 game_main_loop:                        ;REPEATS FROM HERE EVERY FRAME
        ld  hl,timer            ;update time
        inc (hl)                ;increase by 1
-       ld  a,(hl)
-       and %11111
-       ld  hl,1                ;once every 32 frames, increase score by 1
-       cal z,scoreInc          ;do it
 
 Clear_screen:
        ld  hl,dispbuffer       ;move from (hl) = top left
 
 Clear_screen:
        ld  hl,dispbuffer       ;move from (hl) = top left
@@ -326,8 +316,10 @@ check_selkey:
        out (1),a
        in  a,(1)               ;our precious keys
 
        out (1),a
        in  a,(1)               ;our precious keys
 
+#ifdef teacherkey              ;should we check for the teacherkey?
        bit 6,a                 ;'bout the GRAPH key...
        cal z,Teacher           ;you didn't _press_ it, did you?!?
        bit 6,a                 ;'bout the GRAPH key...
        cal z,Teacher           ;you didn't _press_ it, did you?!?
+#endif
 
        rla                     ;test bit7 so we know f ALPHA has been pressed
        cal nc,select           ;yeppy, select the currently selected upgrade
 
        rla                     ;test bit7 so we know f ALPHA has been pressed
        cal nc,select           ;yeppy, select the currently selected upgrade
@@ -376,7 +368,7 @@ weapdamage =$-1
 
 
 disp_charge:                   ;display charge bar
 
 
 disp_charge:                   ;display charge bar
-       ld  hl,(59*16)+VIDEO_MEM+3
+       ld  hl,(58*16)+VIDEO_MEM+3
        ld  b,3
 chargebarclr:
        dec hl
        ld  b,3
 chargebarclr:
        dec hl
@@ -421,33 +413,23 @@ Handle_ground:
        ld  de,groundpos        ;to (one byte to the left)
        ldir                    ;LoaDIncreaseRepeat = scroll!
 
        ld  de,groundpos        ;to (one byte to the left)
        ldir                    ;LoaDIncreaseRepeat = scroll!
 
-       ld  a,(groundinfo)      ;what kind of ground
-       dec a                   ;type 1:
-       jr  z,ground_tunnel     ;tunnel effect
-ground_boring:
-       ld  a,(groundpos)       ;type 0
-       jr  newground+1
-
-ground_tunnel:
-       ld  a,(groundpos+14)
-       ld  d,a
+       ld  a,(groundpos+14)    ;last ground on right
+       ld  d,a                 ;as default ground
        ld  hl,spacespace
        ld  bc,$500             ;range=0..4
        cal Random              ;a=0..4
        dec a                   ;a=-1..3
        dec a                   ;a=-2..2
        ld  b,a
        ld  hl,spacespace
        ld  bc,$500             ;range=0..4
        cal Random              ;a=0..4
        dec a                   ;a=-1..3
        dec a                   ;a=-2..2
        ld  b,a
-       add a,(hl)              ;add to spacesize (so +2..-2)
-       cp  10
-       jr  c,newground         ;>=0 then don't change
+       add a,(hl)              ;substract to spacesize
+       cp  57
+       jr  nc,newground        ;if nothing left then don't change
        ld  c,a
        ld  c,a
-       ld  a,d
-       add a,b                 ;new position
-       or  a
+       add a,b                 ;add offset (2 higher/lower) => new position
+       or  a                   ;=0?
        jr  z,newground         ;may not be 0 (=256)
        jr  z,newground         ;may not be 0 (=256)
-       cp  -10
-       jr  nc,newground        ;and not be <0 (>246)
-diffground:
+       cp  -10                 ;>246?
+       jr  nc,newground        ;and not be <0
        ld  d,a
        ld  (hl),c
 newground:
        ld  d,a
        ld  (hl),c
 newground:
@@ -469,12 +451,11 @@ groundloopright:
        ld  a,(de)              ;height of current byte
        ld  b,a                 ;save in b
 
        ld  a,(de)              ;height of current byte
        ld  b,a                 ;save in b
 
-       ld  de,16               ;to substract to go one line up
+       ld  de,-16              ;to substract to go one line up
        ld  a,%11111111         ;bitmask black
        ld  a,%11111111         ;bitmask black
-       or  a
 groundloopup:
        ld  (hl),a              ;display black byte
 groundloopup:
        ld  (hl),a              ;display black byte
-       sbc hl,de               ;go up (sbc must be used for 16-bit sub)
+       add hl,de               ;go up (sbc must be used for 16-bit sub)
        dnz groundloopup        ;and loop >groundpos< times
 
        ld  b,c                 ;pop b used by groundloopup
        dnz groundloopup        ;and loop >groundpos< times
 
        ld  b,c                 ;pop b used by groundloopup
@@ -510,12 +491,6 @@ Handle_ceiling:
        ld  de,ceilingpos       ;to (one byte to the left)
        ldir                    ;LoaDIncreaseRepeat = scroll!
 
        ld  de,ceilingpos       ;to (one byte to the left)
        ldir                    ;LoaDIncreaseRepeat = scroll!
 
-       ld  a,(groundinfo)      ;what kind of ceiling
-       dec a                   ;type 1:
-       jr  z,ceiling_tunnel    ;tunnel effect
-ceiling_boring:
-
-ceiling_tunnel:
        ld  a,(ceilingpos+14)
        ld  d,a                 ;d=new ceiling
        ld  hl,spacespace
        ld  a,(ceilingpos+14)
        ld  d,a                 ;d=new ceiling
        ld  hl,spacespace
@@ -551,7 +526,7 @@ Display_ceiling:
        psh hl
 
 ceilingloopright:
        psh hl
 
 ceilingloopright:
-       ld  c,b                 ;push b for groundloopup
+       ld  c,b                 ;push b for ceilingloopdown
        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
        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
@@ -564,13 +539,13 @@ ceilingloopright:
 ceilingloopdown:
        ld  (hl),a              ;display black byte
        add hl,de               ;go down
 ceilingloopdown:
        ld  (hl),a              ;display black byte
        add hl,de               ;go down
-       dnz ceilingloopdown     ;and loop >groundpos< times
+       dnz ceilingloopdown     ;and loop >ceilingpos< times
 
 
-       ld  b,c                 ;pop b used by groundloopup
+       ld  b,c                 ;pop b used by ceilingloopdown
        dnz ceilingloopright    ;loop right for entire screen (16x)
        pop hl \ pop hl         ;restore stack
 
        dnz ceilingloopright    ;loop right for entire screen (16x)
        pop hl \ pop hl         ;restore stack
 
-CheckCeiling:                  ;check for collision with the ground
+CheckCeiling:                  ;check for collision with the ceiling
        ld  a,(x)               ;your x
        srl a                   ;x/2
        srl a                   ;x/4
        ld  a,(x)               ;your x
        srl a                   ;x/2
        srl a                   ;x/4
@@ -675,6 +650,8 @@ setcontrast:
 
 ;--------------------------- teacher ----------------------------------------
 
 
 ;--------------------------- teacher ----------------------------------------
 
+#ifdef teacherkey              ;can be disabled to save space if not needed
+                       ;DO NOT RELEASE NEMESIS COMPILED W/O TEACHERKEY!!!!!
 Teacher:
        ld  (iy+12),5           ;enable flashing cursor
        cal _clrWindow          ;top left
 Teacher:
        ld  (iy+12),5           ;enable flashing cursor
        cal _clrWindow          ;top left
@@ -693,16 +670,16 @@ teacherloop:
        cal releasekeys
        jp  disp_icons          ;+ret
 
        cal releasekeys
        jp  disp_icons          ;+ret
 
-teacherans:
-       ld  a,' '
-       cal _putc
+teacherans:                    ;enter displays the answer
+       ld  a,' '               ;the cursor could still be displayed (█)
+       cal _putc               ;so remove it by displaying a ' ' over it
 
        ld  hl,$0701
 
        ld  hl,$0701
-       ld  (_curRow),hl
-       ld  hl,txt_teacherans
-       cal _puts
-       jr  teacherloop
-
+       ld  (_curRow),hl        ;below the equation, aligned right
+       ld  hl,txt_teacherans   ;the answer text
+       cal _puts               ;display
+       jr  teacherloop         ;and continue loop
+#endif
 
 ;--------------------------- exit -------------------------------------------
 
 
 ;--------------------------- exit -------------------------------------------
 
@@ -928,6 +905,10 @@ explosion_stuff:           ;in:a=frame*2+(0 to 1); (hl)=xpos-- ix=sprite
 ;----hit----
 
 damage_you:                    ;damages you B points
 ;----hit----
 
 damage_you:                    ;damages you B points
+       ld  a,(your_occ)        ;return if already dead (prevents exploding
+       or  a                   ; twice, or stucking in exploding state)
+       ret nz                  ;0 = you're normal
+
        ld  a,(hardcore)        ;hardcore mode?
        or  a
        jr  z,damageok          ;0 = no  = don't modify
        ld  a,(hardcore)        ;hardcore mode?
        or  a
        jr  z,damageok          ;0 = no  = don't modify
@@ -959,7 +940,7 @@ newarmor:
 
 Place_multiples:
        ld  hl,your_prevpos     ;place all previous positions
 
 Place_multiples:
        ld  hl,your_prevpos     ;place all previous positions
-       ld  b,mm*7+1            ;all saved positions of them (14 per multiple)
+       ld  b,mm*7+2            ;all saved positions of them (14 per multiple)
 place_multiples:
        ld  (hl),e              ;set prev-x to d
        inc hl                  ;next
 place_multiples:
        ld  (hl),e              ;set prev-x to d
        inc hl                  ;next
@@ -972,9 +953,9 @@ place_multiples:
 
 inc_armor:
        ld  a,(your_armor)      ;load current armor
 
 inc_armor:
        ld  a,(your_armor)      ;load current armor
-       cp  50-6                ;may not become >=50
+       cp  maxarmor-5          ;may not become >=maxarmor
        jr  c,doincarmor        ;ok then just add 6
        jr  c,doincarmor        ;ok then just add 6
-       ld  a,49-6              ;set to maximum (6 will be added below)
+       ld  a,maxarmor-6        ;set to maximum (6 will be added below)
 doincarmor:
        add a,6                 ;add 6 to armor
        ld  (your_armor),a      ;change armor
 doincarmor:
        add a,6                 ;add 6 to armor
        ld  (your_armor),a      ;change armor
@@ -986,43 +967,25 @@ select:
        ld  a,(hl)              ;load pickups taken so far
        dec a                   ;is it 1?
        ret m                   ;return if it's 0 (no pickups)
        ld  a,(hl)              ;load pickups taken so far
        dec a                   ;is it 1?
        ret m                   ;return if it's 0 (no pickups)
-       jr  nz,select2          ;no, carry on
-select1:
-       ld  (hl),a              ;reset pickups
-       cal inc_armor           ;increase armor (like at end of level)
-       ld  a,30                ;activate shield for 30*4=120 frames
-       ld  (your_shield),a
-       jr  disp_icons          ;display and return
-select2:
-       dec a                   ;is it 2?
-       jr  nz,select3          ;no, carry on
-       ld  (hl),a              ;reset (otherwise could be used to cheat)
-       ld  a,(de)              ;(your_weapon)
-       cp  maxweapon
-       jr  nc,disp_icons       ;no beam with laser
-       ld  a,(your_extramode)  ;indicates whether this is tailbeam/double
-       ld  (your_extra),a      ;ready extra beam
-       jr  disp_icons          ;display 'n return
-select3:
-       dec a                   ;is it 3?
-       jr  nz,select4          ;no, carry on
+
+       jr  nz,selectlaser      ;no, carry on
        ld  (hl),a              ;reset pickups
        ld  a,(de)              ;(your_weapon)
        inc a                   ;next
        cp  maxweapon
        ld  (hl),a              ;reset pickups
        ld  a,(de)              ;(your_weapon)
        inc a                   ;next
        cp  maxweapon
-       jr  c,selected3         ;weapon OK
+       jr  c,selectedbeam      ;weapon OK
        jr  z,disp_icons        ;weapon maxed out
        xor a                   ;laser was selected: set to first weapon
        jr  z,disp_icons        ;weapon maxed out
        xor a                   ;laser was selected: set to first weapon
-selected3:
+selectedbeam:
        ld  (de),a              ;set new weapon
         cal loadweapon         ;load it (damage and stuff)
        xor a
        ld  (your_multiples),a  ;no multiples with beam
        jr  disp_icons          ;display n return
        ld  (de),a              ;set new weapon
         cal loadweapon         ;load it (damage and stuff)
        xor a
        ld  (your_multiples),a  ;no multiples with beam
        jr  disp_icons          ;display n return
-select4:
-       dec a                   ;is it 4?
-       jr  nz,select5          ;no, carry on again
-       ld  (hl),a              ;reset pickups
+selectlaser:
+       dec a                   ;is it 2?
+       ld  (hl),0              ;reset pickups
+       jr  nz,selectextra      ;no, carry on again
        ld  (your_extra),a      ;no extra beams (tailbeam/up-double)
        ld  a,(de)              ;(your_weapon)
        cp  maxweapon           ;upgrade from bullet?
        ld  (your_extra),a      ;no extra beams (tailbeam/up-double)
        ld  a,(de)              ;(your_weapon)
        cp  maxweapon           ;upgrade from bullet?
@@ -1035,13 +998,10 @@ upgradelaser:
        ld  (de),a
        cal loadweapon
        jr  disp_icons          ;display + return
        ld  (de),a
        cal loadweapon
        jr  disp_icons          ;display + return
-select5:
-       dec a                   ;is it 5?
-       jr  nz,select6          ;no, carry on once more
-       ld  (hl),a              ;reset pickups
+selectextra:
        ld  a,(de)              ;(your_weapon)
        cp  maxweapon+1         ;laser or beams?
        ld  a,(de)              ;(your_weapon)
        cp  maxweapon+1         ;laser or beams?
-       jr  c,disp_icons        ;if beams used then no multiples
+       jr  c,selectXbeam       ;if beamweap then no multiples but extra beam
        ld  hl,your_multiples
        ld  a,(hl)              ;multiples you already got
        and %1111               ;reset movebit so (your_multiples)=real value
        ld  hl,your_multiples
        ld  a,(hl)              ;multiples you already got
        and %1111               ;reset movebit so (your_multiples)=real value
@@ -1054,17 +1014,17 @@ enoughmultiples:
        dec a                   ;if this is your first multiple then...
        cal z,Place_multiples   ;reset multiples positions
        jr  disp_icons          ;display, return
        dec a                   ;if this is your first multiple then...
        cal z,Place_multiples   ;reset multiples positions
        jr  disp_icons          ;display, return
-select6:
-       ld  (hl),0              ;reset pickups
-;      jr  disp_icons
+selectXbeam:
+       ld  a,(your_extramode)  ;indicates whether this is tailbeam/double
+       ld  (your_extra),a      ;ready extra beam
+;      jr  disp_icons          ;display 'n return
 
 ;--------------------------- show icon --------------------------------------
 
 
 ;--------------------------- show icon --------------------------------------
 
-disp_icons:
- psh bc \ psh de \ psh hl \ psh ix ;&&&
-
+disp_icons:                    ;destroyes: abcdehlix
+       ld  a,VIDEO_MEM/$400    ;directly on screen
+       ld  (PutWhere),a        ;place icons at normal screen
        ld  hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom
        ld  hl,VIDEO_MEM+(16*56);56 rows down = eight rows from bottom
-       ld  (PutWhere),hl       ;place icons at bottom of normal screen
        ld  b,16                ;draw 16x (screen width)
        ld  a,%11111111         ;horizontal line mask
        cal drawline            ;draw divider-line
        ld  b,16                ;draw 16x (screen width)
        ld  a,%11111111         ;horizontal line mask
        cal drawline            ;draw divider-line
@@ -1074,7 +1034,7 @@ disp_icons:
        cal drawline            ;clear scorebar
 
 disp_lives:
        cal drawline            ;clear scorebar
 
 disp_lives:
-       ld  de,5                ;(0,5)
+       ld  de,$003C            ;(0,4)
        ld  a,(your_lives)      ;nr of lives
        or  a
        jr  z,displivesdone     ;no lives
        ld  a,(your_lives)      ;nr of lives
        or  a
        jr  z,displivesdone     ;no lives
@@ -1091,22 +1051,6 @@ displivesloop:
 displivesdone:
        cal disp_armor          ;display bar
 
 displivesdone:
        cal disp_armor          ;display bar
 
-       ld  ix,spr_icon01       ;torpedoIcon
-       ld  de,$1901            ;icon #1
-       cal putwidesprite       ;display icon
-
-       ld  ix,spr_icon00
-       ld  a,(your_extra)
-       or  a
-       jr  z,no_tail
-       ld  ix,spr_icon02a      ;tailbeamIcon
-       dec a
-       jr  z,no_tail           ;(your_extra)=1 = tailbeam
-       ld  ix,spr_icon02b      ;updoubleIcon
-no_tail:
-       ld  de,$2901            ;icon #2
-       cal putwidesprite       ;display
-
        ld  ix,spr_icon00
        ld  a,(your_weapon)     ;ur weapon
        cp  maxweapon           ;laser?
        ld  ix,spr_icon00
        ld  a,(your_weapon)     ;ur weapon
        cp  maxweapon           ;laser?
@@ -1121,8 +1065,8 @@ no_tail:
        cal _vputmap            ;display char
        ld  ix,spr_icon03       ;bulletIcon
 no_bullets:
        cal _vputmap            ;display char
        ld  ix,spr_icon03       ;bulletIcon
 no_bullets:
-       ld  de,$3901            ;icon #3
-       cal putwidesprite       ;display icon
+       ld  de,$3939            ;icon #1
+       cal putwidesprite       ;display icon (beamweap)
 
        ld  ix,spr_icon00       ;emptyIcon
        pop af                  ;ld a,(your_weapon)
 
        ld  ix,spr_icon00       ;emptyIcon
        pop af                  ;ld a,(your_weapon)
@@ -1136,20 +1080,29 @@ no_bullets:
        cal _vputmap            ;display char
        ld  ix,spr_icon04       ;laserIcon
 no_laser:
        cal _vputmap            ;display char
        ld  ix,spr_icon04       ;laserIcon
 no_laser:
-       ld  de,$4901            ;icon #4
-       cal putwidesprite
+       ld  de,$4939            ;icon #2
+       cal putwidesprite       ;(laser)
 
        ld  ix,spr_icon00       ;emptyIcon
 
        ld  ix,spr_icon00       ;emptyIcon
-       ld  a,(your_multiples)
-       and %111
-       jr  z,no_multiples
-       ld  ix,spr_icon05
-no_multiples:
-       ld  de,$5901            ;icon #5
+       ld  a,(your_multiples)  ;number of multiples
+       and %111                ;<8
+       jr  z,no_multiples      ;none, check for beam extras
+       ld  ix,spr_icon05       ;multiples-icon
+       jr  no_tail             ;display
+no_multiples:                  ;no multiples
+       ld  a,(your_extra)      ;extra weapon
+       or  a                   ;0?
+       jr  z,no_tail           ;nothing
+       ld  ix,spr_icon02a      ;tailbeamIcon
+       dec a
+       jr  z,no_tail           ;(your_extra)=1 = tailbeam
+       ld  ix,spr_icon02b      ;updoubleIcon
+no_tail:                       ;display
+       ld  de,$5939            ;icon #3
        cal putwidesprite
 
        ld  ix,spr_dividerline
        cal putwidesprite
 
        ld  ix,spr_dividerline
-       ld  de,$6901
+       ld  de,$6939
        cal putwidesprite
 
        ld  a,(your_pickup)     ;pickups taken
        cal putwidesprite
 
        ld  a,(your_pickup)     ;pickups taken
@@ -1158,64 +1111,74 @@ no_multiples:
        add a,a                 ;picks*4
        add a,a                 ;picks*8
        add a,a                 ;picks*$10
        add a,a                 ;picks*4
        add a,a                 ;picks*8
        add a,a                 ;picks*$10
-       add a,$09               ;add 0ah
-       ld  d,a                 ;y-pos = picks * $10 + $0a (19,29,39,49,59)
-       ld  e,$01               ;x-pos = bottom (1a01,2a01,3a01,4a01,5a01)
+       add a,$29               ;add 29h
+       ld  d,a                 ;y-pos = picks * $10 + $29 (3a,4a,5a)
+       ld  e,$39               ;x-pos = bottom (3a39,4a39,5a39)
 
        ld  ix,spr_icon
        cal putwidesprite
 iconsdone:
 
        ld  ix,spr_icon
        cal putwidesprite
 iconsdone:
-       ld  hl,dispbuffer       ;normal game-screen
-       ld  (PutWhere),hl       ;set sprite-position to normal screen
+       ld  a,dispbuffer/$400   ;normal game-screen
+       ld  (PutWhere),a        ;set sprite-position to normal screen
+       jp  disp_charge         ;display weapon charge bar
 
 
- pop ix \ pop hl \ pop de \ pop bc
-       ret
 
 disp_armor:
        ld  de,16               ;line size
 
 disp_armor:
        ld  de,16               ;line size
-       ld  hl,(57*16)+VIDEO_MEM+3
-       ld  b,3
-armorbarclr:
-       dec hl
-       ld  (hl),0
-       add hl,de
-       ld  (hl),0
-       sbc hl,de
-       dnz armorbarclr
-
-       ld  a,(your_armor)      ;load your armor (<50)
-       srl a                   ;/2 (<25)
-       ld  c,a                 ;psh a
-       and %11111000           ;clear last three bits
-       rra                     ;so we can use rotate instead of shift right
-       rra                     ;which saves 3(-2) bytes and speed
-       rra                     ;/8: don't display last 3 bits of a (later)
-       jr  z,noarmorbar        ;if a=0 then it would loop 256x so skip it
-       ld  b,a                 ;loop b=a times
-armorbar:                      ;starting at ($39*16)+VIDEO_MEM
-       ld  (hl),%11111111      ;draw a piece of the bar
-       add hl,de               ;one down (resets carry)
-       ld  (hl),%11111111      ;same piece
-       sbc hl,de               ;up again
-       inc hl                  ;next position
-       dnz armorbar            ;loop it b times
-
-noarmorbar:
-       ld  a,c                 ;pop a
+       ld  hl,(58*16)+VIDEO_MEM+6
+       ld  c,5                 ;5 lines down
+armorbarclrY:
+       ld  b,4                 ;four bytes right
+       psh hl
+armorbarclrX:
+       ld  (hl),0              ;clear
+       dec hl                  ;next byte
+       dnz armorbarclrX        ;4x
+       pop hl                  ;old position
+       add hl,de               ;one pixel down
+       dec c                   ;5x
+       jr  nz,armorbarclrY     ;loop
+
+       ld  hl,VIDEO_MEM+(58*16)+6
+       ld  a,(your_armor)      ;load your armor (<maxarmor)
+       srl a                   ;divide by 2 (barsize halved)
+       psh af
        and %111                ;display last bits of armor
        and %111                ;display last bits of armor
-       ret z                   ;if armor=0 then bit = %00000000 (don't disp)
+       jr  z,armorbarbitok     ;if b=0 then prevent looping 256x
        ld  b,a                 ;into B
        xor a                   ;bit = %00000000
 armorbarbit:
        scf                     ;set carry flag
        ld  b,a                 ;into B
        xor a                   ;bit = %00000000
 armorbarbit:
        scf                     ;set carry flag
-       rra                     ;rotates A right and sets bit 7 (c-flag)
-       dnz armorbarbit         ;repeat B times (so if B=6 then a=%11111100)
-armorbarready:                 ;               (an if B=3 then a=%11100000)
-       ld  (hl),a              ;draw this last byte
-       add hl,de
-       ld  (hl),a              ;and just below
+       rla                     ;rotates A left and sets bit 0 (c-flag)
+       dnz armorbarbit         ;repeat B times (so if B=6 then a=%00111111)
+armorbarbitok:                 ;               (an if B=3 then a=%00000111)
+       ld  c,a                 ;save last bit in c
+       pop af                  ;now we'll make the byte
+       and %11111000           ;clear last three bits
+       rra                     ;so we can use rotate instead of shift right
+       rra                     ;which saves 3(-2) bytes and speed
+       rra                     ;/8: don't display last 3 bits of a (later)
+
+       ld  b,5                 ;bar height
+armorbarloop1:
+       psh bc                  ;yloop counter
+       psh hl                  ;begin x-position
+       ld  b,a                 ;loop b=a times per line
+       or  a                   ;<1 bytes
+       jr  z,lastarmorbit      ;then don't display bytes (would be 256x)
+armorbarbyte:
+       ld  (hl),%11111111      ;draw a piece of the bar
+       dec hl                  ;next position
+       dnz armorbarbyte        ;loop it b times
+lastarmorbit:
+       ld  (hl),c              ;draw the last byte
+       pop hl                  ;recall first byte
+       add hl,de               ;one down
+       pop bc                  ;recall yloop-counter
+       dnz armorbarloop1       ;display again
        ret
 
        ret
 
+
 drawline:
        ld  (hl),a              ;draw one piece of the divider-line
        inc hl                  ;move right (8 pixels = 1 byte)
 drawline:
        ld  (hl),a              ;draw one piece of the divider-line
        inc hl                  ;move right (8 pixels = 1 byte)
@@ -1416,11 +1379,6 @@ nolashit:
 
 ;------------------------ handle bullets ------------------------------------
 
 
 ;------------------------ handle bullets ------------------------------------
 
-remove_bullet:
-       pop hl                  ;enemy+type
-       ld  (hl),0              ;dump this bullet!
-       jr  next_ybullet+1      ;+1:skip pop hl at next_ybullet
-
 Handle_bullets:
        ld  hl,ybullets
        ld  b,nrybuls
 Handle_bullets:
        ld  hl,ybullets
        ld  b,nrybuls
@@ -1433,9 +1391,12 @@ scan_bullets:
        psh hl                  ;save enemy+type
        ld  (temp1),hl          ;needed for check_bullethits
        inc hl                  ;@damage
        psh hl                  ;save enemy+type
        ld  (temp1),hl          ;needed for check_bullethits
        inc hl                  ;@damage
+       ld  c,(hl)              ;damage
+       dec c                   ;c=damage-1
+       jp  m,bullethitbullet   ;damage<=0 (=no bullet)
        inc hl                  ;@x
 
        inc hl                  ;@x
 
-move_bullet:
+;move_bullet
        ld  c,a                 ;c=type
        and %11111              ;pixels to move
        add a,(hl)              ;a = X + (hl) to the right
        ld  c,a                 ;c=type
        and %11111              ;pixels to move
        add a,(hl)              ;a = X + (hl) to the right
@@ -1513,6 +1474,33 @@ next_ybullet:
        dnz scan_bullets        ;next bullet (loop)
        ret
 
        dnz scan_bullets        ;next bullet (loop)
        ret
 
+remove_bullet:
+       pop hl                  ;enemy+type
+       ld  (hl),0              ;dump this bullet!
+       jr  next_ybullet+1      ;+1:skip pop hl at next_ybullet
+
+bullethitbullet:               ;"bullet" just displaying a bullet hit
+       inc c                   ;restore damage (to -5..0)
+       jp  z,remove_bullet     ;if it's 0 remove it
+       inc c                   ;increase to next frame
+       ld  (hl),c              ;save new
+       ld  a,c
+       neg                     ;make positive value (frame nr. 0..4)
+       add a,a                 ;*2
+       ld  e,a
+       add a,a                 ;*4
+       add a,e                 ;*6
+       ld  e,a
+       ld  d,0                 ;de=a
+       ld  ix,spr_hit          ;first hit sprite
+       add ix,de               ;add frame nr*8 (goto correct sprite)
+       inc hl                  ;@x
+       ld  d,(hl)
+       inc hl                  ;@y
+       ld  e,(hl)              ;load position into de
+       cal putsprite           ;display hit-sprite
+       jr  next_ybullet        ;handle the other bullets
+
 ;--------------------------- check bullethits -------------------------------
 
 check_bullethits:              ;INPUT: de=X,Y; (temp1)=bullet
 ;--------------------------- check bullethits -------------------------------
 
 check_bullethits:              ;INPUT: de=X,Y; (temp1)=bullet
@@ -1558,9 +1546,9 @@ bulletysize =$-1
        psh hl
        ld  hl,0                ;@bulletType
 temp1 =$-2
        psh hl
        ld  hl,0                ;@bulletType
 temp1 =$-2
-       ld  (hl),0              ;remove bullet
        inc hl                  ;@damage
        inc hl                  ;@damage
-       ld  a,(hl)              ;set damage
+       ld  a,(hl)              ;damage to inflict on enemy
+       ld  (hl),-(hitsprites+1);make this bullet exploding (damage = -5)
        pop hl                  ;enemy+y
        cal enemy_hit
 nohit:
        pop hl                  ;enemy+y
        cal enemy_hit
 nohit:
@@ -1633,7 +1621,7 @@ eventtime =$-2
        dec a                   ;has it reached 3?
        jr  nz,place_ranenemy   ;nope: >3 = place an enemy
        inc hl                  ;nextevent located behind eventleft
        dec a                   ;has it reached 3?
        jr  nz,place_ranenemy   ;nope: >3 = place an enemy
        inc hl                  ;nextevent located behind eventleft
-       ld  (hl),193            ;set delay
+       ld  (hl),193            ;3: set delay for next boss to appear
        ret                     ;don't place any more enemies
 
 standby_event:
        ret                     ;don't place any more enemies
 
 standby_event:
@@ -1642,11 +1630,14 @@ standby_event:
        ld  de,enemysize
        xor a
 chk_enemyleft:
        ld  de,enemysize
        xor a
 chk_enemyleft:
-       add hl,de
+       add hl,de               ;go to next enemy
        cp  (hl)                ;0 = no enemy present
        cp  (hl)                ;0 = no enemy present
-       jr  nz,enemyleft
-       dnz chk_enemyleft
-       ret
+       jr  nz,enemyleft        ;if enemy present (<>0) then quit checking
+       dnz chk_enemyleft       ;loop for all enemies
+       ld  hl,nextevent        ;time 'til next event
+       ld  (hl),157            ;next time to check is in 157 turns/frames
+       inc a                   ;no enemies left: place upgrade pickup
+       jr  place_enemy         ;place enemy #1(=a) = big pickup
 enemyleft:
        ld  hl,eventleft
        inc (hl)
 enemyleft:
        ld  hl,eventleft
        inc (hl)
@@ -1654,6 +1645,8 @@ enemyleft:
 
 
 place_ranenemy:
 
 
 place_ranenemy:
+       ld  hl,1                ;increase score by 1
+       cal scoreInc
        ld  bc,0                ;0..nrlvlenemies
 nrlvlenemies =$-1              ;=nr of enemies minus 1
        cal Random              ;random enemy b..b+c = 0..nrenemies-1
        ld  bc,0                ;0..nrlvlenemies
 nrlvlenemies =$-1              ;=nr of enemies minus 1
        cal Random              ;random enemy b..b+c = 0..nrenemies-1
@@ -1751,7 +1744,7 @@ find_ebullet:
 found_ebullet:
        ld  a,c
        sub 6
 found_ebullet:
        ld  a,c
        sub 6
-       jr  c,bulletok          ;type #0-5 = done (normal/diag)
+       jp  c,bulletok          ;type #0-5 = done (normal/diag)
        or  a
        jr  z,bulletaiming      ;type #6 = aiming = type#2..5
        dec a
        or  a
        jr  z,bulletaiming      ;type #6 = aiming = type#2..5
        dec a
@@ -1760,8 +1753,26 @@ found_ebullet:
        jr  z,bulletdouble      ;type #8 = double
        dec a
        jr  z,bulletquad        ;type #9 = quad
        jr  z,bulletdouble      ;type #8 = double
        dec a
        jr  z,bulletquad        ;type #9 = quad
+       dec a
+       jr  z,bulletdquad       ;type #10 = double-quad
+       dec a
+       jr  z,bulletran         ;type #11 = random
 
 
-bulletdquad:
+firesenemies:                  ;type #12 = mine / Dquad
+       ld  a,(timer)
+       rra                     ;if odd turn (50% chance)
+       jr  c,bulletdquad       ;then fire 6x
+       ld  a,bossenemy         ;otherwise place enemy #[bossenemy]
+       jp  place_enemy
+
+bulletran:
+       ld  c,1
+       ld  b,4
+       cal Random
+       ld  (hl),a
+       jr  _bulletok
+
+bulletdquad:                   ;type #10 = double-quad
        cal bulletquad          ;fire type #1 to 5
        inc hl
        ld  a,e
        cal bulletquad          ;fire type #1 to 5
        inc hl
        ld  a,e
@@ -1775,7 +1786,7 @@ bulletdquad:
        ld  e,a                 ;offset 10 down (5 total)
        jr  enemy_fires_again
 
        ld  e,a                 ;offset 10 down (5 total)
        jr  enemy_fires_again
 
-bulletquad:
+bulletquad:                    ;type #9 = quad
        cal bullettriple        ;fire type #1, 4 and 5
        inc hl                  ;next bullet
        ld  c,2                 ;type #2 = down
        cal bullettriple        ;fire type #1, 4 and 5
        inc hl                  ;next bullet
        ld  c,2                 ;type #2 = down
@@ -1784,7 +1795,7 @@ bulletquad:
        ld  c,3                 ;type #3 = up
        jr  enemy_fires_again
 
        ld  c,3                 ;type #3 = up
        jr  enemy_fires_again
 
-bulletdouble:
+bulletdouble:                  ;type #8 = double
        dec e                   ;one up
        ld  c,1                 ;type #1
        cal bulletok            ;fire bullet
        dec e                   ;one up
        ld  c,1                 ;type #1
        cal bulletok            ;fire bullet
@@ -1793,9 +1804,9 @@ bulletdouble:
        inc e                   ;two px down
        jr  enemy_fires_again   ;find and fire another bullet
 
        inc e                   ;two px down
        jr  enemy_fires_again   ;find and fire another bullet
 
-bullettriple:
-       ld  c,1                 ;type #1 = normal
-       cal bulletok            ;fire
+bullettriple:                  ;type #7 = triple
+       ld  (hl),1              ;type #1 = normal
+       cal _bulletok           ;fire
        inc hl                  ;next bullet
        ld  c,4                 ;type #4 = down 50%
        cal enemy_fires_again
        inc hl                  ;next bullet
        ld  c,4                 ;type #4 = down 50%
        cal enemy_fires_again
@@ -1803,26 +1814,28 @@ bullettriple:
        ld  c,5                 ;type #5 = up 50%
        jr  enemy_fires_again
 
        ld  c,5                 ;type #5 = up 50%
        jr  enemy_fires_again
 
-bulletaiming:
+bulletaiming:                  ;type #6 = aiming = type#2..5
        ld  a,(y)
        sub e                   ;a = yourY-bulY = pixels bullet is above you
        add a,10
        jp  p,bulletnotup       ;jump when 10 pixels below you or higher
        ld  a,(y)
        sub e                   ;a = yourY-bulY = pixels bullet is above you
        add a,10
        jp  p,bulletnotup       ;jump when 10 pixels below you or higher
-       ld  c,5                 ;go slightly down
+       ld  (hl),5              ;go slightly down
        add a,10                ;10 to 20 pixels below you
        add a,10                ;10 to 20 pixels below you
-       jp  p,bulletok          ;yes: all done.
-       ld  c,3                 ;otherwise move down even more
-       jr  bulletok
+       jp  p,_bulletok         ;yes: all done.
+       ld  (hl),3              ;otherwise move down even more
+       jr  _bulletok
 bulletnotup:
 bulletnotup:
-       ld  c,1                 ;normal bullet...
+       ld  (hl),1              ;normal bullet...
        sub 20                  ;...when...
        sub 20                  ;...when...
-       jp  m,bulletok          ;...10 pixels below you to 20 pixels above
-       ld  c,4                 ;bullet going slightly up...
+       jp  m,_bulletok         ;...10 pixels below you to 20 pixels above
+       ld  (hl),4              ;bullet going slightly up...
        sub 10                  ;...when...
        sub 10                  ;...when...
-       jr  c,bulletok          ;...20 to 30 pixels above you
+       jr  c,_bulletok         ;...20 to 30 pixels above you
        ld  c,2                 ;else (more than 30 pixels) move up more
        ld  c,2                 ;else (more than 30 pixels) move up more
+
 bulletok:
        ld  (hl),c              ;set bullet direction
 bulletok:
        ld  (hl),c              ;set bullet direction
+_bulletok:
        inc hl
        ld  (hl),d              ;set x-pos
        inc hl
        inc hl
        ld  (hl),d              ;set x-pos
        inc hl
@@ -2163,7 +2176,7 @@ check_collision:
        ld  a,(hl)
        and %10                 ;enemy status (%11=normal; %10=pickup)
        jr  z,check_next        ;2 or 3 = ok, otherwise: next enemy
        ld  a,(hl)
        and %10                 ;enemy status (%11=normal; %10=pickup)
        jr  z,check_next        ;2 or 3 = ok, otherwise: next enemy
-       inc hl                  ;enemy#
+       inc hl                  ;@sprite
 
 collide_enemy:                 ;&&& include in Handle_enemy proc
        cal find_sprite
 
 collide_enemy:                 ;&&& include in Handle_enemy proc
        cal find_sprite
@@ -2189,31 +2202,38 @@ collide_enemy:                  ;&&& include in Handle_enemy proc
        dec hl                  ;@occ
 
 take_pickup:
        dec hl                  ;@occ
 
 take_pickup:
-       psh hl                  ;we need hl
-       ld  hl,2                ;increase score by 2
-       cal scoreInc
-       pop hl                  ;we're done
-
        ld  a,(hl)              ;load enemy occ
        rra                     ;if occ = %10 (can't be %00) then pickup
        jr  c,collide           ;otherwise normal enemy so you collide
        ld  a,(hl)              ;load enemy occ
        rra                     ;if occ = %10 (can't be %00) then pickup
        jr  c,collide           ;otherwise normal enemy so you collide
-
-       psh hl
+       ld  (hl),0              ;remove
+       rra                     ;skip this bit (=%1)
+       rra                     ;this bit specifies the pickup ID (big/small)
+       jr  nc,armorpickup      ;%0 = pickup increases armor and shield
+                               ;%1 = pickup selects (next) upgrade
        ld  hl,your_pickup      ;your pickups
        ld  a,(hl)              ;current
        inc a                   ;go to next
        ld  hl,your_pickup      ;your pickups
        ld  a,(hl)              ;current
        inc a                   ;go to next
-       cp  6                   ;pickups >=6
+       cp  4                   ;pickups >=4?
        jr  c,not_maxpickup
        jr  c,not_maxpickup
-       ld  a,1                 ;yes: reset to pickup 1
+       psh hl                  ;too much pickups
+       ld  hl,250
+       cal scoreInc            ;increase score by 250
+       pop hl
+       ld  a,1                 ;and reset to pickup #1
 not_maxpickup:
        ld  (hl),a              ;save new
 not_maxpickup:
        ld  (hl),a              ;save new
+       psh de
        cal disp_icons          ;display altered pickupicons
        cal disp_icons          ;display altered pickupicons
-       pop hl
-
-       xor a                   ;set to 0 = gone
-       ld  (hl),a              ;remove
+       pop de                  ;ld de,$0707
        jr  check_next          ;all done, next..
 
        jr  check_next          ;all done, next..
 
+armorpickup:
+       cal inc_armor           ;increase armor (like at end of level)
+       ld  a,30                ;activate shield for 30*4=120 frames
+       ld  (your_shield),a
+       cal disp_icons          ;display status bar (new armor value)
+        jr  check_next
+
 collide:
        ld  a,(hl)
        sub auch_ecollide
 collide:
        ld  a,(hl)
        sub auch_ecollide
@@ -2227,11 +2247,11 @@ enemydamaged:                   ;damage to enemy delivered
        cal damage_you
 
 check_next:
        cal damage_you
 
 check_next:
-       pop hl
-       ld  bc,enemysize
-       add hl,bc
-       pop bc
-       dnz check_collision
+       pop hl                  ;current enemy base (unaltered)
+       ld  bc,enemysize        ;bytes per enemy
+       add hl,bc               ;pointer to next enemy
+       pop bc                  ;restore counter
+       dnz check_collision     ;loop for all enemies
        ret
 
 ;--------------------------- story ------------------------------------------
        ret
 
 ;--------------------------- story ------------------------------------------
@@ -2271,14 +2291,14 @@ storyLine:
        ret
 
 dostory:
        ret
 
 dostory:
-       cal storyPage                   ;do some story
-       ld  a,(hl)                      ;load next byte in a
-       inc a                           ;set z-flag if a = $ff
-       jr  nz,dostory                  ;otherwise loop
+       cal storyPage           ;do some story
+       ld  a,(hl)              ;load next byte in a
+       inc a                   ;set z-flag if a = $ff
+       jr  nz,dostory          ;otherwise loop
        inc hl
        inc hl
-       inc hl                          ;set hl to beginning of the level
-       ld  (levelp),hl                 ;set the level-pointer
-       ret                             ;and return
+       inc hl                  ;set hl to beginning of the level
+       ld  (levelp),hl         ;set the level-pointer
+       ret                     ;and return
 
 ;--------------------------- SFX --------------------------------------------
 
 
 ;--------------------------- SFX --------------------------------------------
 
@@ -2426,14 +2446,14 @@ findenemyspecs:                 ;enemy #a specs in (hl); in:b=0; out:ac=?
 
 ;--------------------------- game over / new game / death -------------------
 
 
 ;--------------------------- game over / new game / death -------------------
 
-chartable:
-       .db 0,".<>!",0,0,0,0  ;down,L,R,up
-       .db 0,"xtoje0",0      ;enter..clear
-       .db " wsnid9",0       ;(-)..custom
-       .db "zvrmhc8",0       ;dot..del
-       .db "yuqlgb7#"        ;0..xvar
-       .db $D9,"-pkfa6'"     ;on..alpha
-       .db "54321*",0,$D0    ;F5..more
+chartable:                     ;use chartable-1 and add GET_KEY scancode
+       .db ".<>!",0,0,0,0      ;down,L,R,up
+       .db 0,"xtoje0",0        ;enter..clear
+       .db " wsnid9",0         ;(-)..custom
+       .db "zvrmhc8",0         ;dot..del
+       .db "yuqlgb7#"          ;0..xvar
+       .db $D9,"-pkfa6'"       ;on..alpha
+       .db "54321",$D0,0,'*'   ;F5..F1,2nd,exit,more
 
 save_lvl:
        ld  hl,storesave_end-storesave_start
 
 save_lvl:
        ld  hl,storesave_end-storesave_start
@@ -2481,79 +2501,71 @@ game_over:                      ;stack=+0
        ld  hl,$0007
        ld  (_curRow),hl
 
        ld  hl,$0007
        ld  (_curRow),hl
 
-       ld  de,(your_score)
-       ld  hl,(hiscore)
-       cal CP_HL_DE
-       jr  nc,no_hiscore
-       ld  (hiscore),de
+       ld  de,(your_score)     ;current score
+       ld  hl,(hiscore)        ;hiscore
+       cal CP_HL_DE            ;de<=hl means no hiscore (or same)
+       jr  nc,no_hiscore       ;skip the new hiscore part
+       ld  (hiscore),de        ;otherwise save current score as new hiscore
 
 
-ask_hiname:
-       ld  ix,hiname
-       ld  a,9
-       ld  (hiscorepos),a
+ask_hiname:                    ;and ask for new hiscore name
+       ld  ix,hiname           ;where to store the hiscore name
+       ld  a,9                 ;max. length <9
+       ld  (hiscorepos),a      ;current char (counts backwards 9-1)
 enter_name_loop:
 enter_name_loop:
-       ld  a,'_'
-       cal _putc
-       ld  hl,_curCol
-       dec (hl)
+       ld  a,'_'               ;cursor appearance
+       cal _putmap             ;display (do not advance cursorpos)
 nokeypressed:
 nokeypressed:
-       cal getsomekeys
-       jr  z,nomore
-       or  a
-       jr  z,nokeypressed
+       cal getsomekeys         ;wait for any key
+       jr  z,nomore            ;if [enter] or [2nd] pressed we're all done
 
 
-       cp  K_DEL
-       jr  z,backup
-       cp  K_EXIT
+       ld  hl,hiscorepos       ;string position
+       cp  K_DEL               ;[DEL] functions as "backspace"
+       jr  z,backup            ;delete previous char if pressed
+       cp  K_EXIT              ;exit also ends name
        jr  z,nomore
 
        jr  z,nomore
 
-       ld  hl,hiscorepos
-       ld  b,(hl)
-       dec b
-       jr  z,nokeypressed
-       ld  (hl),b
+       ld  b,(hl)              ;(hiscorepos)
+       dec b                   ;next position (counts backwards)
+       jr  z,nokeypressed      ;if it's 1 (became 0) then don't add no more
+       ld  (hl),b              ;otherwise save new string position
 
 
-       ld  hl,chartable
+       ld  hl,chartable-1      ;chars to add for each key
        ld  e,a
        ld  e,a
-       ld  d,0
-       add hl,de
-       ld  a,(hl)
-       or  a
-       jr  z,nokeypressed
-
-       ld  (ix),a
-       cal _putc
-       inc ix
-       cal releasekeys
-       jr  enter_name_loop
-
-backup:
-       ld  hl,hiscorepos
-       ld  a,(hl)
-       cp  9
-       jr  nc,nokeypressed
-       inc (hl)
-
-       dec ix
-       ld  (ix),' '
-       ld  a,32
-       cal _putc
+       ld  d,0                 ;de = key pressed
+       add hl,de               ;add so we know which char to add for this key
+       ld  a,(hl)              ;load in a
+       or  a                   ;if it's 0 then
+       jr  z,nokeypressed       ;don't add anything afterall
+
+       ld  (ix),a              ;save new char
+       cal _putc               ;and also display on screen
+       inc ix                  ;goto next char
+       cal releasekeys         ;wait for the key to be released
+       jr  enter_name_loop     ;and continue the loop
+
+backup:                                ;backspace
+       ld  a,(hl)              ;(hiscorepos)
+       cp  9                   ;9 means begin (0 total chars)
+       jr  nc,nokeypressed     ;nothing to remove so continue loop
+       inc (hl)                ;otherwise pos one back
+
+       dec ix                  ;and string to previous char as well
+       ld  a,32                ;remove cursor
+       cal _putmap             ;by replacing it by ' '
        ld  hl,_curCol
        ld  hl,_curCol
-       dec (hl)
-       dec (hl)
-       jr  enter_name_loop
-
-nomore:
-       ld  a,' '
-       cal _putc
-       ld  (ix),0
-       cal save_hi
-       jr  hiscoredone
-
-no_hiscore:
-       ld  hl,hiname
+       dec (hl)                ;cursor one back
+       jr  enter_name_loop     ;continue name loop
+
+nomore:                                ;name's done
+       ld  a,' '               ;remove cursor
+       cal _putc               ;(or actually replace with ' ')
+       ld  (ix),0              ;end of string marker (zero-terminated)
+       cal save_hi             ;store hiscore with name in real program
+       jr  hiscoredone         ;continue with game over screen
+
+no_hiscore:                    ;no new hiscore
+       ld  hl,hiname           ;just display old name
        cal _puts
        cal _puts
-
 hiscoredone:
        xor a                   ;clear a (Ahl will be displayed)
        ld  hl,$1006            ;bottom-1 right
 hiscoredone:
        xor a                   ;clear a (Ahl will be displayed)
        ld  hl,$1006            ;bottom-1 right
@@ -2607,8 +2619,8 @@ invshiploop:
 
 New_game:                      ;stack must be +1 (so change the jp in cal :)
        cal _clrLCD
 
 New_game:                      ;stack must be +1 (so change the jp in cal :)
        cal _clrLCD
-       ld  hl,VIDEO_MEM
-       ld  (PutWhere),hl       ;will be reset after displaying iconbar
+       ld  a,VIDEO_MEM/$400
+       ld  (PutWhere),       ;will be reset after displaying iconbar
        ld  ix,spr_ship01       ;first ship: sprite
        ld  de,$0105            ;position
        ld  b,4                 ;number of ships to display
        ld  ix,spr_ship01       ;first ship: sprite
        ld  de,$0105            ;position
        ld  b,4                 ;number of ships to display
@@ -2664,16 +2676,16 @@ selectshiploop:
        pop bc
        cp  K_DOWN
        jr  nz,selnotdown
        pop bc
        cp  K_DOWN
        jr  nz,selnotdown
-       inc b
+       inc b                   ;move selection down
 selnotdown:
        cp  K_UP
        jr  nz,selnotup
 selnotdown:
        cp  K_UP
        jr  nz,selnotup
-       dec b
+       dec b                   ;move selection up
 selnotup:
 selnotup:
-       ld  a,b
-       and %11
-       ld  b,a
-       jr  selectship
+       ld  a,b                 ;new selection
+       and %11                 ;must be 0..3
+       ld  b,a                 ;in b again
+       jr  selectship          ;loop
 
 startthenewgame:
        ld  hl,spr_ship01-(spr_ship02-spr_ship01)
 
 startthenewgame:
        ld  hl,spr_ship01-(spr_ship02-spr_ship01)
@@ -2734,7 +2746,7 @@ Next_level:                       ;stack must be +1
        ld  b,0                 ;advance one level
        ld  c,(hl)
        add hl,bc               ;passed the enemies
        ld  b,0                 ;advance one level
        ld  c,(hl)
        add hl,bc               ;passed the enemies
-       ld  c,10
+       ld  c,9
        add hl,bc               ;update to point to next level
        ld  (levelp),hl         ;save
 
        add hl,bc               ;update to point to next level
        ld  (levelp),hl         ;save
 
@@ -2786,8 +2798,8 @@ samelevel:
        ld  (eventleft),a       ;set nr of events left
        inc hl
        ld  de,level_info
        ld  (eventleft),a       ;set nr of events left
        inc hl
        ld  de,level_info
-       ld  c,5                 ;5xLDI:  loads (level_info) (spacespace)
-       ldir                    ;              (groundinfo) (stars1) (stars2)
+       ld  c,4                 ;5xLDI:  loads (level_info) (spacespace)
+       ldir                    ;              (stars1) (stars2)
        ld  a,1
        ld  b,32                ;fill (groundpos) and (ceilingpos)
 fillground:
        ld  a,1
        ld  b,32                ;fill (groundpos) and (ceilingpos)
 fillground:
@@ -3021,7 +3033,8 @@ findpixel:
        ld  a,e                 ;a=e=Y
        add a,a
        add a,a                 ;add a,a is 7 cycles faster than add hl,hl
        ld  a,e                 ;a=e=Y
        add a,a
        add a,a                 ;add a,a is 7 cycles faster than add hl,hl
-       ld  h,0                 ;switch to hl now (Y<64)
+       ld  h,dispbuffer/$400   ;switch to hl (Y<64) & set base to dispbuffer
+PutWhere =$-1                  ;screen base position/$400 (where x+y=0)
        ld  l,a                 ;hl=4*Y
        ld  a,d                 ;a=d=X
        rra                     ;RRA: carry flag must be reset!
        ld  l,a                 ;hl=4*Y
        ld  a,d                 ;a=d=X
        rra                     ;RRA: carry flag must be reset!
@@ -3041,9 +3054,6 @@ findpixel:
        xor a
 FPbit =$+1
        set 0,a
        xor a
 FPbit =$+1
        set 0,a
-       ld  de,dispbuffer       ;screen base position (where x+y=0)
-PutWhere =$-2
-       add hl,de
        ret
 
 ;----------------------------------------------------------------------------
        ret
 
 ;----------------------------------------------------------------------------
@@ -3128,8 +3138,8 @@ spr_ship04i:
 
 auch_bullet  = 1       ;damage to you when hit by an enemy bullet
 auch_ground  = 5       ;the same when you hit the ground/ceiling
 
 auch_bullet  = 1       ;damage to you when hit by an enemy bullet
 auch_ground  = 5       ;the same when you hit the ground/ceiling
-auch_collide = 3       ;when you hit an enemy
-auch_ecollide = 2*4    ;damage to both the enemy that hit you (skip bit 0/1)
+auch_collide = 4       ;when you hit an enemy
+auch_ecollide = 2*4    ;damage to the enemy that hit you (skip bit 0/1)
 
 spr_multiple:
        .db 6,6         ;multiples
 
 spr_multiple:
        .db 6,6         ;multiples
@@ -3151,70 +3161,102 @@ spr_multiple2:
 
 ;-------------------------------- explosions --------------------------------
 
 
 ;-------------------------------- explosions --------------------------------
 
+spr_hit:
+hitsprites = 5         ;btw: sprites stored backwards
+       .db 5,4         ;5
+       .db %10101000   ;█▒█ █
+       .db %00001000   ;▒  ▒█
+       .db %10000000   ;█ ▒ ▒
+       .db %10101000   ;█▒█▒█
+
+       .db 5,4         ;4
+       .db %01001000   ; █▒▒█
+       .db %11010000   ;██ █▒
+       .db %00101000   ;▒ █ █
+       .db %11010000   ;██▒█
+
+       .db 5,4         ;3
+       .db %00110000   ;  ██
+       .db %10011000   ;█  ██
+       .db %10001000   ;█ ▒▒█
+       .db %00110000   ; ▒██
+
+       .db 5,4         ;2
+       .db %00100000   ;▒ █▒
+       .db %00001000   ; ▒▒ █
+       .db %10110000   ;█▒██
+       .db %01000000   ;▒█ ▒
+
+       .db 4,4         ;1
+       .db %10010000   ;█  █
+       .db %01100000   ; ██
+       .db %01100000   ; ██
+       .db %10010000   ;█  █
+
 spr_explosion:
 spr_explosion:
-       .db 8,6         ;1
+       .db 8,5         ;1
        .db %00000000
        .db %00000000
-       .db %00011100   ;    ███
-       .db %00111110   ;   █████
-       .db %01010110   ;  █ █ ██
-       .db %00111000   ;   ███
+       .db %00011100   ;   ███
+       .db %00111110   ;  █████
+       .db %01010110   ; █ █ ██
+       .db %00111000   ;  ███
        .db %00000000
 
        .db 8,6         ;2
        .db %00000000
 
        .db 8,6         ;2
-       .db %00110000   ;   ██
-       .db %01001110   ;  █ ▒███
-       .db %10111110   ; █ █████
-       .db %01001111   ;  █ ▒████
-       .db %00111000   ;   ███
-       .db %00011010   ;    ██ █
+       .db %00110000   ;  ██
+       .db %01001110   ; █ ▒███
+       .db %10111110   ;█ █████
+       .db %01001111   ; █ ▒████
+       .db %00111000   ;  ███
+       .db %00011010   ;   ██ █
 
        .db 8,6         ;3
 
        .db 8,6         ;3
-       .db %10110000   ; █ ██
-       .db %01001110   ;  █  ███
-       .db %10110101   ; █ ██▒█▒█
-       .db %01000101   ;  █  ▒█▒█
-       .db %00111110   ;   █████
-       .db %01011010   ;  █ ██ █
+       .db %10110000   ;█ ██
+       .db %01001110   ; █  ███
+       .db %10110101   ;█ ██▒█▒█
+       .db %01000101   ; █  ▒█▒█
+       .db %00111110   ;  █████
+       .db %01011010   ; █ ██ █
 
        .db 8,6         ;4
 
        .db 8,6         ;4
-       .db %00101010   ; ▒ █▒█ █
-       .db %01000110   ;  █  ▒██
-       .db %10110101   ; █ ██ █ █
-       .db %01100110   ;  ██  ██▒
-       .db %00111100   ;   ████▒
-       .db %01011001   ;  █ ██ ▒█
+       .db %00101010   ;▒ █▒█ █
+       .db %01000110   ; █  ▒██
+       .db %10110101   ;█ ██ █ █
+       .db %01100110   ; ██  ██▒
+       .db %00111100   ;  ████▒
+       .db %01011001   ; █ ██ ▒█
 
        .db 8,6         ;5
 
        .db 8,6         ;5
-       .db %01000000   ;  █▒ ▒ ▒
-       .db %00100101   ;  ▒█  █▒█
-       .db %00010100   ; ▒ ▒█ █ ▒
-       .db %01000100   ;  █▒  █
-       .db %00010010   ;   ▒█▒▒█
-       .db %10011010   ; █▒ ██ █▒
+       .db %01000000   ; █▒ ▒ ▒
+       .db %00100101   ; ▒█  █▒█
+       .db %00010100   ;▒ ▒█ █ ▒
+       .db %01000100   ; █▒  █
+       .db %00010010   ;  ▒█▒▒█
+       .db %10011010   ;█▒ ██ █▒
 
        .db 8,6         ;6
 
        .db 8,6         ;6
-       .db %01000100   ;  █   █
-       .db %00100000   ;   ▒█ ▒ ▒
-       .db %00000001   ;    ▒ ▒ █
-       .db %01000100   ;  █   █
-       .db %00100010   ;   █▒  █
-       .db %01001000   ; ▒█ ▒█ ▒
+       .db %01000100   ; █   █
+       .db %00100000   ;  ▒█ ▒ ▒
+       .db %00000001   ;   ▒ ▒ █
+       .db %01000100   ; █   █
+       .db %00100010   ;  █▒  █
+       .db %01001000   ;▒█ ▒█ ▒
 
        .db 8,6         ;7
 
        .db 8,6         ;7
-       .db %00001000   ;  ▒  █▒
-       .db %11000010   ; ██ ▒  █
-       .db %00000000   ;        
-       .db %00100000   ;  ▒█  ▒
-       .db %00000001   ;   ▒   ▒█
-       .db %00110000   ;  ▒██▒
+       .db %00001000   ; ▒  █▒
+       .db %11000010   ;██ ▒  █
+       .db %00000000   ;       ▒
+       .db %00100000   ; ▒█  ▒
+       .db %00000001   ;  ▒   ▒█
+       .db %00110000   ; ▒██▒
 
        .db 8,6         ;8
 
        .db 8,6         ;8
-       .db %00000100   ;     ▒█
-       .db %00000000   ; ▒▒    ▒
-       .db %01000000   ;  
-       .db %00000000   ;   
-       .db %00000010   ;       █▒
-       .db %00100100   ;   █▒ █
+       .db %00000100   ;    ▒█
+       .db %00000000   ;▒▒    ▒
+       .db %01000000   ; █
+       .db %00000000   ;  ▒
+       .db %00000010   ;      █▒
+       .db %00100100   ;  █▒ █
 
 spr_yexplosion:
        .db 8,5         ;1
 
 spr_yexplosion:
        .db 8,5         ;1
@@ -3265,9 +3307,6 @@ bullettable:
        .db (spr_bullet11-spr_bullet01) ;40
        .db (spr_bullet12-spr_bullet01) ;44
        .db (spr_bullet13-spr_bullet01) ;48
        .db (spr_bullet11-spr_bullet01) ;40
        .db (spr_bullet12-spr_bullet01) ;44
        .db (spr_bullet13-spr_bullet01) ;48
-       .db (spr_bullet13-spr_bullet01) ;52
-       .db (spr_bullet13-spr_bullet01) ;56
-       .db (spr_bullet13-spr_bullet01) ;60
 
 spr_bullet01:
        .db 2,1
 
 spr_bullet01:
        .db 2,1
@@ -3358,26 +3397,26 @@ spr_bullete1:
 ;direction: 001=straight forward; 010=up; 011=1/2up; 100=down; 101=1/2down
 ;           111=laser (speed=duration 00010-00000)
 
 ;direction: 001=straight forward; 010=up; 011=1/2up; 100=down; 101=1/2down
 ;           111=laser (speed=duration 00010-00000)
 
-weapondata:
-       .db  1,1,%00110010,3,%00000000,0,%00000000,0    ;1 single beam
-       .db  3,1,%00110011,3,%00000000,0,%00000000,0    ;2 fast single
-       .db  1,1,%00110010,0,%00110010,6,%00000000,0    ;3 double
-       .db  1,1,%01110010,2,%10010010,2,%00110010,2    ;4 triple
-       .db  3,2,%01110011,2,%10010011,2,%00110011,2    ;5
-       .db  6,2,%01110011,2,%10010100,2,%00110011,2    ;6
-       .db  9,3,%01110100,2,%10010100,2,%00110100,2    ;7
-       .db 13,3,%01110110,2,%10010110,2,%00110110,2    ;8
-       .db 18,4,%01110110,2,%10010110,2,%00110110,2    ;9
+weapondata:    ;max = 9x6; 15x5; 21x4; 27x3
+       .db 2,1,%00110010,3,%00000000,0,%00000000,0     ;1 single
+       .db 3,1,%00110011,3,%00000000,0,%00000000,0     ;2 fast
+       .db 2,1,%00110010,0,%00110010,6,%00000000,0     ;3 double
+       .db 2,1,%01110010,2,%10010010,2,%00110010,2     ;4 triple
+       .db 3,2,%00110011,2,%10010010,2,%01110010,2     ;5
+       .db 4,2,%01110011,2,%10010011,2,%00110011,2     ;6
+       .db 5,3,%01110100,2,%10010100,2,%00110100,2     ;7
+       .db 7,4,%01110101,2,%10010101,2,%00110101,2     ;8
+       .db 9,6,%01110110,2,%10010110,2,%00110110,2     ;9
 maxweapon  = 9
 maxweapon  = 9
-       .db  1,1,%11100100,3,%00000000,0,%00000000,0    ;1 single laser
-       .db  2,3,%11100011,3,%00000000,0,%00000000,0    ;2 short
-       .db  1,2,%11100100,3,%11100000,4,%00000000,0    ;3 fat
-       .db  1,2,%11100101,0,%11100000,6,%00000000,0    ;4 double
-       .db  3,4,%11100011,3,%00000000,0,%00000000,0    ;5 short
-       .db  1,2,%11100100,3,%11100000,6,%11100000,0    ;6 triple
-       .db  1,3,%11101010,3,%11100000,6,%11100000,0    ;7 triple long
-       .db  2,4,%11100101,2,%11100000,4,%00000000,0    ;8 double
-       .db  2,1,%11101011,3,%11100000,2,%11100000,4    ;9 big fat long
+       .db 1,1,%11100100,3,%00000000,0,%00000000,0     ;1 single       (1x1x3)
+       .db 2,3,%11100011,3,%00000000,0,%00000000,0     ;2 short        (2x1x2)
+       .db 1,2,%11100100,3,%11100000,4,%00000000,0     ;3 fat          (1x2x3)
+       .db 1,2,%11100101,0,%11100000,6,%00000000,0     ;4 double       (1x2x4)
+       .db 4,4,%11100011,3,%00000000,0,%00000000,0     ;5 short        (4x1x2)
+       .db 1,2,%11100100,3,%11100000,6,%11100000,0     ;6 triple       (1x3x3)
+       .db 1,3,%11101000,3,%11100000,6,%11100000,0     ;7 triple long  (1x3x7)
+       .db 2,5,%11100101,2,%11100000,4,%00000000,0     ;8 double       (2x2x4)
+       .db 1,8,%11101011,3,%11100000,2,%11100000,4     ;9 big fat long (1x3x10)
 maxlaser   = 18
 tailbeam   = %00101101 ;180 degrees
 doublebeam = %01010010 ;45 degrees
 maxlaser   = 18
 tailbeam   = %00101101 ;180 degrees
 doublebeam = %01010010 ;45 degrees
@@ -3444,6 +3483,7 @@ spr_icon01:
        .db %01111010
        .db %11110010
        .db %11100100
        .db %01111010
        .db %11110010
        .db %11100100
+maxarmor = 63                          ;maximum HPs you can get
 spr_icon02a:
        .db 16,7        ;tailbeam.......:.......:
        .db %10000000           ;█               ▒
 spr_icon02a:
        .db 16,7        ;tailbeam.......:.......:
        .db %10000000           ;█               ▒
@@ -3530,7 +3570,7 @@ spr_dividerline:
 txt_email:     .db "www.shiar.org ",127 ;title screen
                .db " shiar0@hotmail.com",0
 _txt_email       = $3A01 ;$3A1E=just email
 txt_email:     .db "www.shiar.org ",127 ;title screen
                .db " shiar0@hotmail.com",0
 _txt_email       = $3A01 ;$3A1E=just email
-txt_about:     .db "v0.99.829 ",127," by Shiar",0 ;right behind txt_email
+txt_about:     .db "v0.99.99 ",127," by Shiar",0 ;right behind txt_email
 _txt_about       = $3321
 txt_menu1:     .db "NEW GAME",0
 txt_menu2:     .db "CONTINUE",0
 _txt_about       = $3321
 txt_menu1:     .db "NEW GAME",0
 txt_menu2:     .db "CONTINUE",0
@@ -3553,8 +3593,10 @@ txt_pause:       .db " ",6,"/",7," ",$1C,"contrast; "
 _txt_pause       = $020B
 txt_pressenter:        .db "Enter to continue",0 ;pause
 _txt_pressenter          = $0201
 _txt_pause       = $020B
 txt_pressenter:        .db "Enter to continue",0 ;pause
 _txt_pressenter          = $0201
+#ifdef teacherkey
 txt_teacher:   .db "(2",Lpi,"*.98)/sin 13",0 ;teacher
 txt_teacherans:        .db Lneg,"14.6549373495",0
 txt_teacher:   .db "(2",Lpi,"*.98)/sin 13",0 ;teacher
 txt_teacherans:        .db Lneg,"14.6549373495",0
+#endif
 
 ;---------------------------- save data -------------------------------------
 
 
 ;---------------------------- save data -------------------------------------
 
@@ -3563,7 +3605,7 @@ hiscore           .dw 0                   ;default hiscore
 hiname         .db "shiar.99",0        ;   "       "    name
 storehi_end:
 
 hiname         .db "shiar.99",0        ;   "       "    name
 storehi_end:
 
-invertmode:     cpl                    ;saves B<>W mode setting        cpl
+invertmode:     cpl ;/or a             ;saves B<>W mode setting        cpl
 
 storesave_start:                       ;--SAVED GAME--                 defs:
 your_ship      .dw spr_ship01          ;your sprite (^invertmode^)     sprs1
 
 storesave_start:                       ;--SAVED GAME--                 defs:
 your_ship      .dw spr_ship01          ;your sprite (^invertmode^)     sprs1
@@ -3575,9 +3617,9 @@ your_score        .dw  0                  ;current score                  0
 your_pickup    .db  0                  ;pickups already picked up      0
 your_occ       .db  0                  ;0=normal 1..16=exploding       0
 your_shield    .db  0                  ;invincibility left             0
 your_pickup    .db  0                  ;pickups already picked up      0
 your_occ       .db  0                  ;0=normal 1..16=exploding       0
 your_shield    .db  0                  ;invincibility left             0
-your_armor     .db 24                  ;HP left                        12
+your_armor     .db 24                  ;HP left                        24
 your_lives     .db  3                  ;lives left                     3
 your_lives     .db  3                  ;lives left                     3
-your_weapon    .db  3                  ;current weapon upgrade         0
+your_weapon    .db 17                  ;current weapon upgrade         0
 your_multiples .db  0                  ;multiples present              0
 your_extra     .db  0                  ;extra beam present             0
 hardcore       .db  0                  ;hardcore mode if non-0         0
 your_multiples .db  0                  ;multiples present              0
 your_extra     .db  0                  ;extra beam present             0
 hardcore       .db  0                  ;hardcore mode if non-0         0
@@ -3590,7 +3632,7 @@ time2invert:      .db 0                   ;time until b<>w switch (0 at startup)
 ;format:boss: [moveType] [enemyType]
 ;      @level: [nr.dif.enemies]x [enemy nr]
 ;      [min. enemy frequency] [enemy frequency max.inc]
 ;format:boss: [moveType] [enemyType]
 ;      @level: [nr.dif.enemies]x [enemy nr]
 ;      [min. enemy frequency] [enemy frequency max.inc]
-;      [next lvl (=nrenemies+4)] [level_info: 1:ceiling 1:ground]
+;      [next lvl (=nrenemies+4)] [level_info: 000000 1:ceiling 1:ground]
 ;      [tunnel size] [groundtype] [stars1] [stars2]
 ;efrequency must be odd if halfluring!
 
 ;      [tunnel size] [groundtype] [stars1] [stars2]
 ;efrequency must be odd if halfluring!
 
@@ -3600,24 +3642,24 @@ levelstart:     ;[y-pos] [x-pos] [text,0] [SFX lines; 0=more text] [-1=end]
        .db 31,9,"been sent to intercept you",0,31-25+6,-1
 
        .db 30
        .db 31,9,"been sent to intercept you",0,31-25+6,-1
 
        .db 30
-level00:.db 5,2,4,2,1,1
+level00:.db 5,3,5,3,2,2
        .db 28,73,13
        .db 28,73,13
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .db 31 ;boss for level01
 
        .db 31 ;boss for level01
-level01:.db 2,2,4 ;enemies
+level01:.db 2,3,5 ;enemies
        .db 26,70,20
        .db 26,70,20
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .db 32
 
        .db 32
-level02:.db 3,2,3,4
+level02:.db 3,3,4,5
        .db 20,60,60
        .db 20,60,60
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .db 33
 
        .db 33
-level03:.db 4,3,4,5,6
+level03:.db 4,4,5,6,7
        .db 17,40,75
        .db 17,40,75
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .db 0
        .db 1,1,"Long-Range scanners are ",
 
        .db 0
        .db 1,1,"Long-Range scanners are ",
@@ -3631,43 +3673,54 @@ level03:.db 4,3,4,5,6
 
 ;---- approaching asteroid belt
        .db 34
 
 ;---- approaching asteroid belt
        .db 34
-level04:.db 5,7,7,8,10,11
+level04:.db 5,8,8,9,11,12
        .db 17,27,70
        .db 17,27,70
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
 
-;---- light asteroid belt
+;---- inside
        .db 35
        .db 35
-level05:.db 7,9,10,8,10,11,11,13
+level05:.db 7,10,11,9,11,12,12,14
        .db 12,24,80
        .db 12,24,80
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
 
-;---- inside asteroid belt
        .db 36
        .db 36
-level06:.db 10,9,10,11,11,13,12,12,13,14,14
+level06:.db 10,10,11,12,12,14,13,13,14,15,15
        .db 7,18,180
        .db 7,18,180
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
 
+;out
        .db 37
        .db 37
-level07:.db 4,15,16,17,5
+level07:.db 4,16,17,18,6
        .db 22,29,62
        .db 22,29,62
-       .db %00,0,0,1,1 ;-1=%11111111=line
+       .db %00,0,1,1 ;-1=%11111111=line
 
        .db 38
 
        .db 38
-level08:.db 5,15,16,17,18,18
+level08:.db 5,16,17,18,19,19
        .db 20,38,57
        .db 20,38,57
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .db 39
 
        .db 39
-level09:.db 3,18,19,20
+level09:.db 3,19,20,21
        .db 19,63,57
        .db 19,63,57
-       .db %00,0,0,1,1
+       .db %00,0,1,1
+
+       .db 40
+level10:.db 7,22,23,24,24,24,25,26
+       .db 20,22,63
+       .db %00,0,1,1
+
+;endlevel
+       .db 41
+level11:.db 1,26
+       .db 20,20,80
+       .db %00,0,1,1
 
        .db 0,1,1,"That`s all folks...",0,0
        .db 20,50,"for now...",0,20-0+6,-1
 
 
        .db 0,1,1,"That`s all folks...",0,0
        .db 20,50,"for now...",0,20-0+6,-1
 
-endlevel = 10
+endlevel = 12
 
 
-pickupfreq = 10
+pickupfreq = 19
 
 ;------------------------------ enemies -------------------------------------
 
 
 ;------------------------------ enemies -------------------------------------
 
@@ -3676,61 +3729,67 @@ pickupfreq = 10
 ;occ:          00=no enemy; 01=exploding (sprite=frame); 10=pickup; 11=enemy
 ;appearances:  1=random; 2=lure; 3=halflure
 ;movetypes:    1=updown; 2=1/4x; 3=1/2x; 4=3/4x; 5=3/2x; 6=2x; 7=ylure50%;
 ;occ:          00=no enemy; 01=exploding (sprite=frame); 10=pickup; 11=enemy
 ;appearances:  1=random; 2=lure; 3=halflure
 ;movetypes:    1=updown; 2=1/4x; 3=1/2x; 4=3/4x; 5=3/2x; 6=2x; 7=ylure50%;
-;              7=ylure; 8=ylure50%; 9=x; 10=x+y-lure 50%; 11=-1/2x; 12=-1x
-;firetypes:    1=normal; 6=aiming; 7=triple; 8=double
+;              8=ylure; 9=ylure50%; 10=x+y-lure 50%; 11=-1/2x; 12=-1x
+;firetypes:    1=normal; 6=aiming; 7=triple; 8=double; 9=quad; 10=dquad; 11=ran
 
 enemyspecs:  ;10 bytes/enemy | max.enemies <64 | sprites use <768 bytes
 
 enemyspecs:  ;10 bytes/enemy | max.enemies <64 | sprites use <768 bytes
-       .db 0,%00000110,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;pickup
-;1-6=basic enemies     ,               ,               ,   , ,  ,  ,  ,
-       .db 0,%00000111,spr_enemyE0&255,spr_enemyE0/256,128,1,00,12, 0,1 ;intro
-       .db 0,%00010011,spr_enemyE1&255,spr_enemyE1/256,128,1,00,10, 0,1 ;weak
-       .db 0,%00110011,spr_enemyE4&255,spr_enemyE4/256,128,1,03, 6,50,1 ;slow
-       .db 0,%00100111,spr_enemyE2&255,spr_enemyE2/256,128,1,00, 1, 0,1
-       .db 0,%00101111,spr_enemyE3&255,spr_enemyE3/256,128,3,00,19,39,8 ;heavy
-       .db 0,%00101011,spr_enemyE5&255,spr_enemyE5/256,128,3,05, 1, 0,1 ;fast
-;7-9=backwards enemies ,               ,               ,   , ,  ,  ,  ,
-       .db 0,%00011111,spr_enemyB1&255,spr_enemyB1/256,000,3,11,19,92,1
-       .db 0,%00101111,spr_enemyB2&255,spr_enemyB2/256,000,1,12,11,45,1
-       .db 0,%00110111,spr_enemyB3&255,spr_enemyB3/256,000,1,11,10,41,8 ;small
-;10-14=asteroid        ,               ,               ,   , ,  ,  ,  ,
-       .db 0,%00100111,spr_enemyA1&255,spr_enemyA1/256,128,1,04, 0, 0,1
-       .db 0,%00111111,spr_enemyA2&255,spr_enemyA2/256,128,1,00, 0, 0,1
-       .db 0,%01011011,spr_enemyA3&255,spr_enemyA3/256,128,1,05, 0, 0,1
-       .db 1,%00001011,spr_enemyA4&255,spr_enemyA4/256,128,1,03, 0, 0,1 ;slow+hard
-       .db 0,%00111111,spr_enemyA4&255,spr_enemyA4/256,128,1,06, 0, 0,1
-;15-20=improved enemies,               ,               ,   , ,  ,  ,  ,
-       .db 0,%01001011,spr_enemyG1&255,spr_enemyG1/256,128,3,00, 3,40,1
-       .db 0,%01011111,spr_enemyG2&255,spr_enemyG2/256,128,3,00, 1,36,1
-       .db 0,%00110011,spr_enemyG5&255,spr_enemyG5/256,128,1,01, 9,52,1 ;updown
-       .db 0,%01111011,spr_enemyG3&255,spr_enemyG3/256,128,3,04, 7,99,7 ;3x
-       .db 0,%10110111,spr_enemyG4&255,spr_enemyG4/256,128,2,01,17, 0,7 ;updown3x
-       .db 0,%10001011,spr_enemyG6&255,spr_enemyG6/256,128,2,07,62,60,8 ;lure
-;21-29=unused,         ,               ,               ,   , ,  ,  ,  ,
-       .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;21
-       .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;22
-       .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;23
-       .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;24
-       .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;25
-       .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;26
+;0-1=pickups
+       .db 0,%00000010,spr_enemyP1&255,spr_enemyP1/256,128,2,03, 0, 0,1 ;pickup
+       .db 0,%00000110,spr_enemyP2&255,spr_enemyP2/256,128,2,03, 0, 0,1 ;bigpickup
+;2-7=basic enemies     ,               ,               ,   , ,  ,  ,  ,
+       .db 0,%00001011,spr_enemyE0&255,spr_enemyE0/256,128,1,00,12, 0,1 ;intro
+       .db 0,%00100011,spr_enemyE1&255,spr_enemyE1/256,128,1,00,10, 0,1 ;weak
+       .db 0,%01100011,spr_enemyE4&255,spr_enemyE4/256,128,1,03, 6,50,1 ;slow
+       .db 0,%01001011,spr_enemyE2&255,spr_enemyE2/256,128,1,00, 1, 0,1
+       .db 0,%01011011,spr_enemyE3&255,spr_enemyE3/256,128,3,00,19,39,8 ;heavy
+       .db 0,%01010011,spr_enemyE5&255,spr_enemyE5/256,128,3,05, 1, 0,1 ;fast
+;8-10=backwards enemies,               ,               ,   , ,  ,  ,  ,
+       .db 0,%00111011,spr_enemyB1&255,spr_enemyB1/256,000,3,11,19,92,1
+       .db 0,%01011011,spr_enemyB2&255,spr_enemyB2/256,000,1,12,11,45,1
+       .db 0,%01101011,spr_enemyB3&255,spr_enemyB3/256,000,1,11,10,41,8 ;small
+;11-15=asteroid        ,               ,               ,   , ,  ,  ,  ,
+       .db 0,%01001011,spr_enemyA1&255,spr_enemyA1/256,128,1,04, 0, 0,1
+       .db 0,%01111011,spr_enemyA2&255,spr_enemyA2/256,128,1,00, 0, 0,1
+       .db 0,%10110011,spr_enemyA3&255,spr_enemyA3/256,128,1,05, 0, 0,1
+       .db 1,%00010011,spr_enemyA4&255,spr_enemyA4/256,128,1,03, 0, 0,1 ;slow+hard
+       .db 0,%01111011,spr_enemyA4&255,spr_enemyA4/256,128,1,06, 0, 0,1
+;16-21=improved enemies,               ,               ,   , ,  ,  ,  ,
+       .db 0,%10010011,spr_enemyG1&255,spr_enemyG1/256,128,3,00, 3,40,1
+       .db 0,%10111011,spr_enemyG2&255,spr_enemyG2/256,128,3,00, 1,36,1
+       .db 0,%01100011,spr_enemyG5&255,spr_enemyG5/256,128,1,01, 9,52,1 ;updown
+       .db 0,%11110011,spr_enemyG3&255,spr_enemyG3/256,128,3,04, 7,99,7 ;3x
+       .db 1,%01101011,spr_enemyG4&255,spr_enemyG4/256,128,2,01,17, 0,7 ;updown3x
+       .db 1,%00010011,spr_enemyG6&255,spr_enemyG6/256,128,2,07,62,60,8 ;lure
+;22-26=hi-speed        ,               ,               ,   , ,  ,  ,  ,
+       .db 1,%00010011,spr_enemyS2&255,spr_enemyS2/256,128,2,05, 3,32,8 ;fast
+       .db 0,%11111011,spr_enemyS1&255,spr_enemyS1/256,128,3,07, 2,28,1 ;lure
+       .db 1,%00101011,spr_enemyS4&255,spr_enemyS4/256,128,3,06, 0, 0,1 ;vfast+nofire
+       .db 1,%01110011,spr_enemyS3&255,spr_enemyS3/256,128,1,07, 1,20,8 ;lure
+       .db 0,%11011011,spr_enemyS2&255,spr_enemyS2/256,128,2,01, 3,7,11 ;updown+ran
+;27-28=unused,         ,               ,               ,   , ,  ,  ,  ,
        .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;27
        .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;28
        .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;27
        .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;28
-       .db 0,%00000011,spr_enemy00&255,spr_enemy00/256,128,2,03, 0, 0,1 ;29
+;29=final boss' enemy
+       .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,3,01, 0, 0,1 ;lure
+bossenemy = 29
 ;30-34=first bosses    ,               ,               ,   , ,  ,  ,  ,
 ;30-34=first bosses    ,               ,               ,   , ,  ,  ,  ,
-       .db 1,%00100011,spr_boss01 &255,spr_boss01 /256,127,1,09,35,50,7 ;triple
-       .db 1,%00101011,spr_boss02 &255,spr_boss02 /256,127,1,09,20,12,1 ;small
-       .db 1,%00111111,spr_boss03 &255,spr_boss03 /256,127,1,09,15,11,8 ;normal
-       .db 1,%01001111,spr_boss04 &255,spr_boss04 /256,127,3,10,10,11,1 ;moving
-       .db 0,%11111111,spr_boss05 &255,spr_boss05 /256,127,2,10, 1, 4,1 ;weak+rapidfire
+       .db 2,%01000111,spr_boss01 &255,spr_boss01 /256,127,1,09,35,50,7 ;triple
+       .db 2,%01010011,spr_boss02 &255,spr_boss02 /256,127,1,09,20,12,1 ;small
+       .db 2,%01111011,spr_boss03 &255,spr_boss03 /256,127,1,09,15,11,8 ;normal
+       .db 2,%10011111,spr_boss04 &255,spr_boss04 /256,127,3,10,10,11,1 ;moving
+       .db 1,%11111011,spr_boss05 &255,spr_boss05 /256,127,2,10, 1, 4,1 ;weak+rapidfire
 ;35-36=asteroid bosses ,               ,               ,   , ,  ,  ,  ,
 ;35-36=asteroid bosses ,               ,               ,   , ,  ,  ,  ,
-       .db 2,%00001011,spr_bossA1 &255,spr_bossA1 /256,127,1,10,36,14,6
-       .db 2,%00110011,spr_bossA1 &255,spr_bossA1 /256,127,2,10,28,12,6
-;37-40=big bosses      ,               ,                   ,   , ,  ,  ,  ,
-       .db 2,%00000011,spr_boss07 &255,spr_boss07 /256,127,3,08,31, 8,7
-       .db 2,%00100111,spr_boss06 &255,spr_boss06 /256,127,3,08,13, 7,7
-       .db 2,%00100111,spr_boss08 &255,spr_boss08 /256,127,1,08,18, 8,9  ;quad
-       .db 2,%10010011,spr_boss09 &255,spr_boss09 /256,127,1,08,21, 9,10 ;6x
+       .db 4,%00010111,spr_bossA1 &255,spr_bossA1 /256,127,1,10,36,14,6
+       .db 4,%01101111,spr_bossA1 &255,spr_bossA1 /256,127,2,10,28,12,6
+;37-41=big bosses      ,               ,                   ,   , ,  ,  ,  ,
+       .db 4,%00010111,spr_boss07 &255,spr_boss07 /256,127,3,08,31, 8,7
+       .db 5,%00101011,spr_boss06 &255,spr_boss06 /256,127,3,08,13, 7,7
+       .db 6,%10001111,spr_boss08 &255,spr_boss08 /256,127,1,08,18, 8,9  ;quad
+       .db 7,%00101011,spr_boss09 &255,spr_boss09 /256,127,1,08,21, 9,10 ;6x
+       .db 9,%11011011,spr_boss09 &255,spr_boss09 /256,127,1,08,12,11,12 ;enemies
 
 spr_enemy00:
 
 spr_enemy00:
+spr_enemyP1:
        .db 10,8                        ;pickup
        .db %00111111                   ;  ██████
        .db %01100001                   ; ██    ██
        .db 10,8                        ;pickup
        .db %00111111                   ;  ██████
        .db %01100001                   ; ██    ██
@@ -3748,6 +3807,27 @@ spr_enemy00:
        .db %01000000
        .db %01000000
        .db %10000000
        .db %01000000
        .db %01000000
        .db %10000000
+spr_enemyP2:
+       .db 11,9                        ;big pickup
+       .db %00111111                   ;  ███████
+       .db %01100000                   ; ██     ██
+       .db %10001110                   ;█   ███   █
+       .db %10111011                   ;█ ███ ███ █
+       .db %10100000                   ;█ █     █ █
+       .db %10111011                   ;█ ███ ███ █
+       .db %10001110                   ;█   ███   █
+       .db %01100000                   ; ██     ██
+       .db %00111111                   ;  ███████
+       .db 9
+       .db %10000000
+       .db %11000000
+       .db %00100000
+       .db %10100000
+       .db %10100000
+       .db %10100000
+       .db %00100000
+       .db %11000000
+       .db %10000000
 
 spr_enemyE0:
        .db 6,7                         ;weak
 
 spr_enemyE0:
        .db 6,7                         ;weak
@@ -3993,6 +4073,16 @@ spr_enemyN5:
        .db %01010010                   ; █ █  █
        .db %01111100                   ;  ████
 
        .db %01010010                   ; █ █  █
        .db %01111100                   ;  ████
 
+spr_enemyM1:
+       .db 8,7                         ;mine
+       .db %00111100                   ;  ████
+       .db %01011010                   ; █ ██ █
+       .db %11111111                   ;████████
+       .db %01001010                   ; █  █ █
+       .db %11111111                   ;████████
+       .db %01011010                   ; █ ██ █
+       .db %00111100                   ;  ████
+
 spr_boss01:
        .db 9,12                        ;.......:.2.....:
        .db %00000111                   ;     ████
 spr_boss01:
        .db 9,12                        ;.......:.2.....:
        .db %00000111                   ;     ████
@@ -4013,7 +4103,7 @@ spr_boss01:
        .db %00000000
        .db %00000000
        .db %10000000
        .db %00000000
        .db %00000000
        .db %10000000
-       .db %00000000
+       .db %00000000 ;...what a waste of space...
        .db %00000000
        .db %10000000
        .db %00000000
        .db %00000000
        .db %10000000
        .db %00000000
@@ -4139,7 +4229,7 @@ spr_bossA1:
        .db %11110000
        .db %11110000
        .db %11000000
        .db %11110000
        .db %11110000
        .db %11000000
-spr_boss06:
+spr_boss06:                            ;modelled after a Nemesis][MSX boss
        .db 16,15                       ;.......:.......:
        .db %00001111                   ;    █████
        .db %00111110                   ;  █████ █████
        .db 16,15                       ;.......:.......:
        .db %00001111                   ;    █████
        .db %00111110                   ;  █████ █████
@@ -4156,7 +4246,7 @@ spr_boss06:
        .db %01111101                   ; █████ █ ███████
        .db %00111110                   ;  █████ █████
        .db %00001111                   ;    █████
        .db %01111101                   ; █████ █ ███████
        .db %00111110                   ;  █████ █████
        .db %00001111                   ;    █████
-       .db 15                          ;modelled after a Nemesis][MSX boss
+       .db 15
        .db %10000000
        .db %11111000
        .db %01111111
        .db %10000000
        .db %11111000
        .db %01111111
@@ -4172,7 +4262,7 @@ spr_boss06:
        .db %01111111
        .db %11111000
        .db %10000000
        .db %01111111
        .db %11111000
        .db %10000000
-spr_boss07:
+spr_boss07:                            ;modelled after a Nemesis][MSX boss
        .db 16,18                       ;.......:.......:
        .db %00000000                   ;         █ █
        .db %00000111                   ;     ███ ███
        .db 16,18                       ;.......:.......:
        .db %00000000                   ;         █ █
        .db %00000111                   ;     ███ ███
@@ -4193,7 +4283,7 @@ spr_boss07:
        .db %00000011                   ;      ████ █
        .db %00000111                   ;     ███ ███
        .db 19                          ;         █ █
        .db %00000011                   ;      ████ █
        .db %00000111                   ;     ███ ███
        .db 19                          ;         █ █
-       .db %01010000                   ;modelled after a Nemesis][MSX boss
+       .db %01010000
        .db %01110000
        .db %11010000
        .db %10110000
        .db %01110000
        .db %11010000
        .db %10110000
@@ -4393,7 +4483,7 @@ logo_nemesis:
 ;      # after pause weapon will not be fired
 ;      # teacher key fixed (waits for GRAPH to be release before&after)
 ;
 ;      # after pause weapon will not be fired
 ;      # teacher key fixed (waits for GRAPH to be release before&after)
 ;
-; 0.99.829 -- 29.VIII.00 -- size 6861
+; 0.99.99 -- 9.IX.00 -- size 6936
 ;
 ;      + you can have upto FOUR multiples! (~20 pixels apart)
 ;      * some optimizations: keycall, menu handling, port nops removed,
 ;
 ;      + you can have upto FOUR multiples! (~20 pixels apart)
 ;      * some optimizations: keycall, menu handling, port nops removed,
@@ -4441,7 +4531,32 @@ logo_nemesis:
 ;      * enemy sprite pointers stored as words (thus increasing sprite table
 ;         length from 768B to 65kB, and increasing sprite calculation speed)
 ;      * hardcore mode does _more_ than doubled damage (bulletsdamage +1)
 ;      * enemy sprite pointers stored as words (thus increasing sprite table
 ;         length from 768B to 65kB, and increasing sprite calculation speed)
 ;      * hardcore mode does _more_ than doubled damage (bulletsdamage +1)
+;      * 10 bytes off by optimizing main menu a little
+;      * and optimizations to hiscore name handling saved another 17 bytes!
+;      * score increased by 1 per placed enemy, instead of time (otherwise
+;         you could just evade bosses for a long time for very high score)
+;      * findpixel optimized (or rather un-unoptimized: restored to original)
+;      # ground fixed again (and optimized for tunnel only)
+;      # prevents exploding more than once (not dieing while inside ground)
+;      * some unneccessary pushes removed
+;      + final boss also fires moving mines (just up/down-enemies)
+;      * on collision less damage to enemy, more to you (bosses too simple)
+;      * normal pickups will increase armor and shield directly (no [alpha])
+;      + a large pickup'll appear at the end of a level which will select
+;         your next upgrade: beamweapon, laser, multiple/tailbeam/up-double
+;      + a small explosion is displayed when enemy's hit but not destroyed
+;      # _all_ multiples appear at your position at start of level
+;      # bug in selecting multiples fixed (recent bug)
+;      + getting passed 3rd upgrade (4 pickups) increases score by 250!
+;      - second icon integrated in 5th, first two icons removed (unused now)
+;      * the armor bar is now 5 pixels in height; very visible
+;      # if selecting upgrade or starting level, charge bar wasn't displayed
+;
+; 1.00.99 -- 9.IX.00 -- size 6936
+;
+;      + ...
+;
 ;
 ;       + added        - removed       * changed       # bug fixed
 
 ;
 ;       + added        - removed       * changed       # bug fixed
 
-;bullet handling: (255/enemy)+419+putsprite cycles per bullet
+;bullet handling: (255/enemy)+419+putsprite cycles per bullet
\ No newline at end of file