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
- 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
- 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
@@ -15,7 +14,7 @@
 >>>>>>> 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!
 
 
@@ -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.
+The following keys might come in handy:
 
   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?
 
-  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 -------------------------------------------------------------
 
-  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 -----------------------------------------------------------
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!! !!!
 
-;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
-#include       "ti86abs.inc"   ;used to save hiscores and so
+#include       "ti86abs.inc"   ;used to save hiscores and stuff
 
        .org _asm_exec_ram
 
@@ -23,8 +21,9 @@
 #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
@@ -85,7 +84,7 @@ lvlenemies    = ebullets+(nrebuls*3)  ;-1032
        .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           ; ███
@@ -171,52 +170,47 @@ underline:
 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
-       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
-       ld  h,$01
+       ld  h,$01               ;selector (*) x-coord. = 1
        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)
+       ld  hl,menuitem
        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
-       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:
-       ld  hl,menuitem
-       ld  a,(hl)
+       ld  a,(hl)              ;(menuitem)
        xor 1                   ;0=1; 1=0
        ld  (hl),a              ;set new menu item
-       jr  menuloop
+       jr  menuloop            ;continue looping
 
 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
 
@@ -255,10 +249,6 @@ mode_invert:
 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
@@ -326,8 +316,10 @@ check_selkey:
        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?!?
+#endif
 
        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
-       ld  hl,(59*16)+VIDEO_MEM+3
+       ld  hl,(58*16)+VIDEO_MEM+3
        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  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
-       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  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)
-       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:
@@ -469,12 +451,11 @@ groundloopright:
        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
-       or  a
 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
@@ -510,12 +491,6 @@ Handle_ceiling:
        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
@@ -551,7 +526,7 @@ Display_ceiling:
        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
@@ -564,13 +539,13 @@ ceilingloopright:
 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
 
-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
@@ -675,6 +650,8 @@ setcontrast:
 
 ;--------------------------- 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
@@ -693,16 +670,16 @@ teacherloop:
        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  (_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 -------------------------------------------
 
@@ -928,6 +905,10 @@ explosion_stuff:           ;in:a=frame*2+(0 to 1); (hl)=xpos-- ix=sprite
 ;----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
@@ -959,7 +940,7 @@ newarmor:
 
 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
@@ -972,9 +953,9 @@ place_multiples:
 
 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
-       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
@@ -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)
-       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
-       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
-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
-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?
@@ -1035,13 +998,10 @@ upgradelaser:
        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?
-       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
@@ -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
-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 --------------------------------------
 
-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  (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
@@ -1074,7 +1034,7 @@ disp_icons:
        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
@@ -1091,22 +1051,6 @@ displivesloop:
 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?
@@ -1121,8 +1065,8 @@ no_tail:
        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)
@@ -1136,20 +1080,29 @@ no_bullets:
        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  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
-       ld  de,$6901
+       ld  de,$6939
        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,$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  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
-       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
-       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
-       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
 
+
 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 ------------------------------------
 
-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
@@ -1433,9 +1391,12 @@ scan_bullets:
        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
 
-move_bullet:
+;move_bullet
        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
 
+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
@@ -1558,9 +1546,9 @@ bulletysize =$-1
        psh hl
        ld  hl,0                ;@bulletType
 temp1 =$-2
-       ld  (hl),0              ;remove bullet
        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:
@@ -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
-       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:
@@ -1642,11 +1630,14 @@ standby_event:
        ld  de,enemysize
        xor a
 chk_enemyleft:
-       add hl,de
+       add hl,de               ;go to next enemy
        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)
@@ -1654,6 +1645,8 @@ enemyleft:
 
 
 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
@@ -1751,7 +1744,7 @@ find_ebullet:
 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
@@ -1760,8 +1753,26 @@ found_ebullet:
        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
@@ -1775,7 +1786,7 @@ bulletdquad:
        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
@@ -1784,7 +1795,7 @@ bulletquad:
        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
@@ -1793,9 +1804,9 @@ bulletdouble:
        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
@@ -1803,26 +1814,28 @@ bullettriple:
        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  c,5                 ;go slightly down
+       ld  (hl),5              ;go slightly down
        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:
-       ld  c,1                 ;normal bullet...
+       ld  (hl),1              ;normal bullet...
        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...
-       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
+
 bulletok:
        ld  (hl),c              ;set bullet direction
+_bulletok:
        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
-       inc hl                  ;enemy#
+       inc hl                  ;@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:
-       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
-
-       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
-       cp  6                   ;pickups >=6
+       cp  4                   ;pickups >=4?
        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
+       psh de
        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..
 
+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
@@ -2227,11 +2247,11 @@ enemydamaged:                   ;damage to enemy delivered
        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 ------------------------------------------
@@ -2271,14 +2291,14 @@ storyLine:
        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                          ;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 --------------------------------------------
 
@@ -2426,14 +2446,14 @@ findenemyspecs:                 ;enemy #a specs in (hl); in:b=0; out:ac=?
 
 ;--------------------------- 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
@@ -2481,79 +2501,71 @@ game_over:                      ;stack=+0
        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:
-       ld  a,'_'
-       cal _putc
-       ld  hl,_curCol
-       dec (hl)
+       ld  a,'_'               ;cursor appearance
+       cal _putmap             ;display (do not advance cursorpos)
 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
 
-       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  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
-       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
-
 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
-       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
@@ -2664,16 +2676,16 @@ selectshiploop:
        pop bc
        cp  K_DOWN
        jr  nz,selnotdown
-       inc b
+       inc b                   ;move selection down
 selnotdown:
        cp  K_UP
        jr  nz,selnotup
-       dec b
+       dec b                   ;move selection up
 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)
@@ -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  c,10
+       ld  c,9
        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  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:
@@ -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  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!
@@ -3041,9 +3054,6 @@ findpixel:
        xor a
 FPbit =$+1
        set 0,a
-       ld  de,dispbuffer       ;screen base position (where x+y=0)
-PutWhere =$-2
-       add hl,de
        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_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
@@ -3151,70 +3161,102 @@ spr_multiple2:
 
 ;-------------------------------- 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:
-       .db 8,6         ;1
+       .db 8,5         ;1
        .db %00000000
-       .db %00011100   ;    ███
-       .db %00111110   ;   █████
-       .db %01010110   ;  █ █ ██
-       .db %00111000   ;   ███
+       .db %00011100   ;   ███
+       .db %00111110   ;  █████
+       .db %01010110   ; █ █ ██
+       .db %00111000   ;  ███
        .db %00000000
 
        .db 8,6         ;2
-       .db %00110000   ;   ██
-       .db %01001110   ;  █ ▒███
-       .db %10111110   ; █ █████
-       .db %01001111   ;  █ ▒████
-       .db %00111000   ;   ███
-       .db %00011010   ;    ██ █
+       .db %00110000   ;  ██
+       .db %01001110   ; █ ▒███
+       .db %10111110   ;█ █████
+       .db %01001111   ; █ ▒████
+       .db %00111000   ;  ███
+       .db %00011010   ;   ██ █
 
        .db 8,6         ;3
-       .db %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 %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 %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 %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 %00001000   ;  ▒  █▒
-       .db %11000010   ; ██ ▒  █
-       .db %00000000   ;        
-       .db %00100000   ;  ▒█  ▒
-       .db %00000001   ;   ▒   ▒█
-       .db %00110000   ;  ▒██▒
+       .db %00001000   ; ▒  █▒
+       .db %11000010   ;██ ▒  █
+       .db %00000000   ;       ▒
+       .db %00100000   ; ▒█  ▒
+       .db %00000001   ;  ▒   ▒█
+       .db %00110000   ; ▒██▒
 
        .db 8,6         ;8
-       .db %00000100   ;     ▒█
-       .db %00000000   ; ▒▒    ▒
-       .db %01000000   ;  
-       .db %00000000   ;   
-       .db %00000010   ;       █▒
-       .db %00100100   ;   █▒ █
+       .db %00000100   ;    ▒█
+       .db %00000000   ;▒▒    ▒
+       .db %01000000   ; █
+       .db %00000000   ;  ▒
+       .db %00000010   ;      █▒
+       .db %00100100   ;  █▒ █
 
 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_bullet13-spr_bullet01) ;52
-       .db (spr_bullet13-spr_bullet01) ;56
-       .db (spr_bullet13-spr_bullet01) ;60
 
 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)
 
-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
-       .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
@@ -3444,6 +3483,7 @@ spr_icon01:
        .db %01111010
        .db %11110010
        .db %11100100
+maxarmor = 63                          ;maximum HPs you can get
 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_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
@@ -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
+#ifdef teacherkey
 txt_teacher:   .db "(2",Lpi,"*.98)/sin 13",0 ;teacher
 txt_teacherans:        .db Lneg,"14.6549373495",0
+#endif
 
 ;---------------------------- save data -------------------------------------
 
@@ -3563,7 +3605,7 @@ hiscore           .dw 0                   ;default hiscore
 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
@@ -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_armor     .db 24                  ;HP left                        12
+your_armor     .db 24                  ;HP left                        24
 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
@@ -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]
-;      [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!
 
@@ -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
-level00:.db 5,2,4,2,1,1
+level00:.db 5,3,5,3,2,2
        .db 28,73,13
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .db 31 ;boss for level01
-level01:.db 2,2,4 ;enemies
+level01:.db 2,3,5 ;enemies
        .db 26,70,20
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .db 32
-level02:.db 3,2,3,4
+level02:.db 3,3,4,5
        .db 20,60,60
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .db 33
-level03:.db 4,3,4,5,6
+level03:.db 4,4,5,6,7
        .db 17,40,75
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .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
-level04:.db 5,7,7,8,10,11
+level04:.db 5,8,8,9,11,12
        .db 17,27,70
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
-;---- light asteroid belt
+;---- inside
        .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 %00,0,0,1,1
+       .db %00,0,1,1
 
-;---- inside asteroid belt
        .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 %00,0,0,1,1
+       .db %00,0,1,1
 
+;out
        .db 37
-level07:.db 4,15,16,17,5
+level07:.db 4,16,17,18,6
        .db 22,29,62
-       .db %00,0,0,1,1 ;-1=%11111111=line
+       .db %00,0,1,1 ;-1=%11111111=line
 
        .db 38
-level08:.db 5,15,16,17,18,18
+level08:.db 5,16,17,18,19,19
        .db 20,38,57
-       .db %00,0,0,1,1
+       .db %00,0,1,1
 
        .db 39
-level09:.db 3,18,19,20
+level09:.db 3,19,20,21
        .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
 
-endlevel = 10
+endlevel = 12
 
-pickupfreq = 10
+pickupfreq = 19
 
 ;------------------------------ 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%;
-;              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
-       .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 ;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    ,               ,               ,   , ,  ,  ,  ,
-       .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 ,               ,               ,   , ,  ,  ,  ,
-       .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_enemyP1:
        .db 10,8                        ;pickup
        .db %00111111                   ;  ██████
        .db %01100001                   ; ██    ██
@@ -3748,6 +3807,27 @@ spr_enemy00:
        .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
@@ -3993,6 +4073,16 @@ spr_enemyN5:
        .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                   ;     ████
@@ -4013,7 +4103,7 @@ spr_boss01:
        .db %00000000
        .db %00000000
        .db %10000000
-       .db %00000000
+       .db %00000000 ;...what a waste of space...
        .db %00000000
        .db %10000000
        .db %00000000
@@ -4139,7 +4229,7 @@ spr_bossA1:
        .db %11110000
        .db %11110000
        .db %11000000
-spr_boss06:
+spr_boss06:                            ;modelled after a Nemesis][MSX boss
        .db 16,15                       ;.......:.......:
        .db %00001111                   ;    █████
        .db %00111110                   ;  █████ █████
@@ -4156,7 +4246,7 @@ spr_boss06:
        .db %01111101                   ; █████ █ ███████
        .db %00111110                   ;  █████ █████
        .db %00001111                   ;    █████
-       .db 15                          ;modelled after a Nemesis][MSX boss
+       .db 15
        .db %10000000
        .db %11111000
        .db %01111111
@@ -4172,7 +4262,7 @@ spr_boss06:
        .db %01111111
        .db %11111000
        .db %10000000
-spr_boss07:
+spr_boss07:                            ;modelled after a Nemesis][MSX boss
        .db 16,18                       ;.......:.......:
        .db %00000000                   ;         █ █
        .db %00000111                   ;     ███ ███
@@ -4193,7 +4283,7 @@ spr_boss07:
        .db %00000011                   ;      ████ █
        .db %00000111                   ;     ███ ███
        .db 19                          ;         █ █
-       .db %01010000                   ;modelled after a Nemesis][MSX boss
+       .db %01010000
        .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)
 ;
-; 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,
@@ -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)
+;      * 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
 
-;bullet handling: (255/enemy)+419+putsprite cycles per bullet
+;bullet handling: (255/enemy)+419+putsprite cycles per bullet
\ No newline at end of file