version 1.0 rc1: minor improvements, laser hit
[nemesis.git] / nemesis.z80
index 63dd1449b62e2361e5ccd8896796ee028c4aa7d7..495d581bc5298180ca76eaab912e02fd8c311ebd 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 v1.0.A23 by SHIAR",0
 
 Icon:  .db 8,1                 ;icon for YAS: width = 1byte; height = 7bytes
        .db %11100000           ; ███
@@ -171,53 +170,48 @@ 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
-       cal nz,New_game         ;NEW GAME
+       ld  a,(hl)              ;(menuitem)
+       dec a                   ;new game=0; so that gives -1 = NZ
+       jp  nz,New_game         ;NEW GAME
        jp  samelevel           ;CONTINUE: game_main_loop
 
 menuexit:
@@ -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 -------------------------------------------
 
@@ -777,8 +754,9 @@ Handle_Ship:
        cp  64+1                ;last explosion frame? (1-16=1st;49-64=4th)
        jp  c,exploding_you     ;not yet: display explosion
        cp  64+16               ;delay finished?
+       ret nz                  ;no, don't display anything (&return)
+       pop hl                  ;restore stack (cuzzof call)
        jp  z,You_die           ;yes = game over
-       ret                     ;don't display anything
 
 ;----move----
 ok:                            ;we are
@@ -907,8 +885,7 @@ dispmultiplesloop:
 
 exploding_you:
        srl a                   ;half the framerate
-       srl a                   ;half that framerate
-       srl a                   ;and half again that framerate
+       srl a                   ;and half that framerate
        ld  hl,x-1
        ld  ix,spr_yexplosion   ;base sprite
 
@@ -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
-       ld  (hl),a              ;reset pickups
+
+       ld  (hl),0              ;reset pickups
+       jr  nz,selectlaser      ;no, carry on again
+selectbeam:
        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?
+       jr  nz,selectextra      ;no, carry on
        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,65 +1051,54 @@ 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  ix,spr_icon00       ;emptyIcon
        ld  a,(your_weapon)     ;ur weapon
-       cp  maxweapon           ;laser?
+       cp  maxweapon           ;bullets?
        psh af                  ;a=(your_weapon); cf=bullets
        jr  nc,no_bullets       ;=laser
        ld  hl,$3945            ;position to display bullet-type digit
-       pop af                  ;digit=(your_weapon)
-       psh af
        inc a                   ;1 = weapon #1 (=0)
        ld  (_penCol),hl        ;set location
        add a,'0'               ;make digit
        cal _vputmap            ;display char
-       ld  ix,spr_icon03       ;bulletIcon
+       ld  ix,spr_icon04       ;bulletIcon
 no_bullets:
-       ld  de,$3901            ;icon #3
-       cal putwidesprite       ;display icon
+       ld  de,$3939            ;icon #2
+       cal putwidesprite       ;(beamweap)
 
-       ld  ix,spr_icon00       ;emptyIcon
-       pop af                  ;ld a,(your_weapon)
-       ld  b,a
+       ld  ix,spr_icon00
+       pop af                  ;ld a,(your_weapon) \ cp maxweapon
        jr  c,no_laser          ;popped carry
-       ld  hl,$3955            ;position to display bullet-type digit
+       ld  hl,$3955            ;position to display laser-type digit
        ld  (_penCol),hl        ;set location
-       ld  a,b                 ;(your_weapon)  ;load = faster than push
-       sub maxweapon-1         ;1 = laser #1 (=maxweapon)
+       sub maxweapon-1         ;1 = laser #1 (=maxweapon)
        add a,'0'               ;make digit
        cal _vputmap            ;display char
-       ld  ix,spr_icon04       ;laserIcon
+       ld  ix,spr_icon03       ;laserIcon
 no_laser:
-       ld  de,$4901            ;icon #4
-       cal putwidesprite
+       ld  de,$4939            ;icon #1
+       cal putwidesprite       ;display icon (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,68 +1107,88 @@ 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
+drawline:
+       ld  (hl),a              ;draw one piece of the divider-line
+       inc hl                  ;move right (8 pixels = 1 byte)
+       dnz drawline            ;repeat (16bytes * 8pixels =128= screen width)
        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,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
-       ret
+       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)
 
-drawline:
-       ld  (hl),a              ;draw one piece of the divider-line
-       inc hl                  ;move right (8 pixels = 1 byte)
-       dnz drawline            ;repeat (16bytes * 8pixels =128= screen width)
+       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
+       dec hl
+       ld  (hl),0              ;empty byte before to remove any remainders
+       pop hl                  ;recall first byte
+       add hl,de               ;one down
+       pop bc                  ;recall yloop-counter
+       dnz armorbarloop1       ;display again
+
+
+       ld  hl,(56*16)+VIDEO_MEM+7
+       ld  a,%01010101
+armorbarY:
+       cal drawbarrow          ;display "grey" mask
+       cal drawbarrow          ;display "grey" mask
+       add hl,de
+       add hl,de
+       add hl,de
+       cal drawbarrow
+drawbarrow:                    ;ORs an entire row with A
+       add hl,de               ;one down
+       ld  b,4                 ;four bytes right
+       psh hl
+armorbarX:
+       dec hl                  ;next byte
+       psh af
+       or  (hl)
+       ld  (hl),a              ;clear
+       pop af
+       dnz armorbarX           ;4x
+       pop hl                  ;old position
        ret
 
 ;------------------------- fire bullet --------------------------------------
@@ -1399,8 +1368,21 @@ laserhits:                       ;hits with normal enemies
        add a,(ix+1)            ;add enemy height (according to sprite @ix)
        jp  m,nolashit          ;a-e>0 = hit
 enemy_lashit:
+       psh hl                  ;pointer to enemy destroyed by putsprite
+       psh bc                  ;safe enemy counter
+       psh de                  ; and Ur position (used for further compares)
+       dec e                   ;adjust y-position
+       dec e
+       dec e                   ;hit sprite centered at e (height=6)
+       dec hl                  ;@x
+       ld  d,(hl)              ;x-position of hit (enemy's x-pos)
+       ld  ix,spr_lashit       ;laserHit sprite
+       cal putsprite           ;display this frame only unlike bullethit ani
+       pop de                  ;restore regs
+       pop bc
+       pop hl
        ld  a,(curweapdamage)   ;damage
-       cal enemy_hit           ;hl=enemy+y
+       cal enemy_hit           ;inflict (hl=enemy+y)
 nolashit:
        pop hl                  ;enemy+1
        ld  a,b                 ;psh bc
@@ -1416,11 +1398,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 +1410,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 +1493,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 +1565,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 +1640,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 +1649,21 @@ 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
+       ld  a,(your_weapon)
+       cp  maxweapon           ;you have bullets?
+       jr  nc,placebigupgrade  ;if not just place the big upgrade
+       ld  a,(level)
+       rra                     ;if level&1=0 (even levels)
+       ret nc                  ;then dont place a pickup (=50%)
+placebigupgrade
+       ld  a,1                 ;no enemies left: place upgrade pickup
+       jr  place_enemy         ;place enemy #1(=a) = big pickup
 enemyleft:
        ld  hl,eventleft
        inc (hl)
@@ -1654,6 +1671,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
@@ -1669,7 +1688,7 @@ place_boss:
        dec hl                  ;points to leveldata\boss\enemynr
        ld  a,(hl)              ;load enemy# of boss
 
-place_enemy:                   ;places enemy #=a
+place_enemy:                   ;places enemy #=a (out:achl=?;b=0;de=@enemy+11)
        psh af
        ld  hl,enemies+1-enemysize
        ld  bc,enemysize
@@ -1685,22 +1704,28 @@ chk_noenemy:                    ;find an unused (no) enemy
        dec de                  ;goto hp64 (before occ)
        ldi                     ;set hp64
        ldi                     ;set hitpoints+occ of enemy class
-       ld  a,(hl)
-       .db $DD,$6F ;ld hx,a
+       ld  c,(hl)
        ldi                     ;set sprite
-       ld  a,(hl)
-       .db $DD,$67 ;ld lx,a
+       ld  b,(hl)              ;bc=@enemy_sprite
+       inc bc                  ;@sprite-height
+       ld  a,(bc)
+       ld  b,a                 ;b = sprite-height
        ldi                     ;set sprite + 1
        ldi                     ;set x-position
 
        ld  a,(hl)              ;load placeInfo
        inc hl
-       dec a                   ;is it 1?
+       inc a                   ;is it -1?
        jr  z,random_enemy      ;yes: create random value <51 in a
-       dec a                   ;is it 2?
+       inc a                   ;is it -2?
        jr  z,lure_enemy        ;yes: create a 100% luring enemy
+       inc a                   ;is it -3?
+       jr  z,lure_enemy        ;yes: pick one (50% lure)
                                ;otherwise?
-halflure_enemy:                        ;yes (of course it is): pick one (50% lure)
+yset_enemy:                    ;set 0+3..$FC+3 as y-position
+       ld  (de),a
+       jr  ypos_OK
+halflure_enemy:
        ld  a,(timer)           ;look at frame-number
        rra                     ;make random if odd frame nr.
        jr  nc,random_enemy     ;1st possibility: random enemy
@@ -1709,8 +1734,8 @@ lure_enemy:                       ;2nd possibility: luring enemy
        jr  ypos_OK
 random_enemy:
        ld  a,64-8              ;=57=screen height (8 is scorebar)
-       sub (ix+1)              ;minus sprite height=bottom
-       ld  c,b                 ;range=0 to...
+       sub b                   ;minus sprite height=bottom
+       ld  c,0                 ;range=0 to...
        ld  b,a                 ;...57-y
        cal Random              ;random value on screen
 ypos_OK:                       ;random value successfully created
@@ -1751,17 +1776,46 @@ 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
+       jp  z,bulletaiming      ;type #6 = aiming = type#2..5
        dec a
        jr  z,bullettriple      ;type #7 = triple
        dec a
        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
+       dec a
+       jr  z,firesenemies      ;type #12 = mine + Dquad
+
+basefiresenemies:              ;type #13 = base
+       ld  bc,$3A00
+       cal Random
+       ld  e,a
+       cal random14
+       ld  c,a
+       cal bulletok            ;find and fire bullet
+
+       ld  a,boss2enemy        ;otherwise place enemy #[boss2enemy]
+       jp  place_enemy
+
+firesenemies:                  ;type #12 = mine / Dquad
+       ld  a,(timer)
+       rra                     ;if odd turn (50% chance)
+       jr  c,bulletdquad       ;then fire 6x
+       ld  a,boss1enemy        ;otherwise place enemy #[boss1enemy]
+       jp  place_enemy
+
+bulletran:
+       cal random14
+       ld  (hl),a
+       jr  _bulletok
 
-bulletdquad:
+bulletdquad:                   ;type #10 = double-quad
        cal bulletquad          ;fire type #1 to 5
        inc hl
        ld  a,e
@@ -1773,9 +1827,10 @@ bulletdquad:
        ld  a,e
        add a,10
        ld  e,a                 ;offset 10 down (5 total)
+_enemy_fires_again:
        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,45 +1839,47 @@ 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
        inc hl                  ;next bullet position
        inc e
        inc e                   ;two px down
-       jr  enemy_fires_again   ;find and fire another bullet
+       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
        ld  c,5                 ;type #5 = up 50%
-       jr  enemy_fires_again
+       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
@@ -2053,6 +2110,8 @@ moving_enemy:
        jr  z,movetype_right    ;11 = (.5>)
        dec b
        jr  z,movetype_fright   ;12 = (1>)
+       dec b
+       ret z                   ;13 = (0)
 
 movetype_right:
        rra
@@ -2163,7 +2222,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 +2248,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 +2293,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,19 +2337,40 @@ 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 --------------------------------------------
 
 DoSFX:                         ;in:(curline)=beginLine;b=nrOfLines
-SFXloop:
+ jr sfxlaser
+       ld  hl,dispbuffer
+       ld  b,64
+sfxscrollloop:
+       psh bc
+       psh hl
+       ld  de,VIDEO_MEM
+       ld  hl,VIDEO_MEM+16
+       ld  bc,63*16
+       ldir
+       pop hl
+       ld  bc,16
+       ldir
+       ld  b,16
+sfxscrolldelay:
+       halt                    ;delay
+       dnz sfxscrolldelay      ;8x
+       pop bc
+       dnz sfxscrollloop
+       ret
+
+
+sfxlaser:
        psh bc
 
        ld  a,0                 ;get line number
@@ -2307,25 +2394,29 @@ curline =$-1
        ld  hl,dispbuffer       ;source of original
        add hl,bc               ;hl->source
 
-SFXdisp:                       ;display this frame on screen
+sfxlaserdisp:                  ;display this frame on screen
        ld  bc,16               ;one line (=16 bytes, you'd know by now)
        ldir                    ;display (copy actually)
        ld  bc,-16              ;go up one line (not on screen)
        add hl,bc               ;so the same line will be displayed
        dec a                   ;counter
-       jr  nz,SFXdisp          ;repeat until whole screen is displayed
+       jr  nz,sfxlaserdisp     ;repeat until whole screen is displayed
 
        ld  b,8
-SFXdelay:
+sfxlaserdelay:
        halt                    ;delay
-       dnz SFXdelay            ;8x
+       dnz sfxlaserdelay       ;8x
 
        pop bc                  ;counter
-       dnz SFXloop
+       dnz sfxlaser
        ret
 
 ;--------------------------- proc -------------------------------------------
 
+random14:                      ;random 1..1+4
+       ld  c,1
+       ld  b,4
+;      cal Random
 Random:                                ;a=c<random<b+c; destr:none
        psh hl
        ld  hl,rancount         ;amount to increase with (0-255)
@@ -2426,14 +2517,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 +2572,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
@@ -2605,10 +2688,10 @@ invshiploop:
        pop af
        ret
 
-New_game:                      ;stack must be +1 (so change the jp in cal :)
+New_game:                      ;start a new game (SP=+0)
        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
@@ -2655,25 +2738,26 @@ dispsbeam:
 selectship:
        psh bc
        cal invship
-selectshiploop:
        cal getsomekeys
        pop bc
        jr  z,startthenewgame   ;enter/2nd
+       cp  K_EXIT
+       jp  z,menuexit          ;go game over when exit was pressed
        psh bc
-       cal invship
+       cal invship             ;display selection bar on current ship
        pop bc
-       cp  K_DOWN
+       cp  K_DOWN              ;down pressed?
        jr  nz,selnotdown
-       inc b
+       inc b                   ;move selection down
 selnotdown:
-       cp  K_UP
+       cp  K_UP                ;up pressed?
        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)
@@ -2707,7 +2791,6 @@ searchyourship:
        ld  (pickuptimer),a     ;next pickup after 4 enemies destroyed
 
 You_die:                       ;stack must be +1
-       pop hl                  ;restore stack
        ld  a,24
        ld  (your_armor),a      ;24 HPs/shields
        ld  a,(your_lives)      ;load lives left
@@ -2734,7 +2817,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 +2869,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 +3104,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 +3125,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 +3209,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
@@ -3140,6 +3221,7 @@ spr_multiple:
        .db %01111100   ; █████
        .db %00111000   ;  ███
 spr_multiple2:
+spr_lashit:
        .db 7,7         ;multiples
        .db %00111000   ;  ███
        .db %01111100   ; █████
@@ -3151,70 +3233,112 @@ spr_multiple2:
 
 ;-------------------------------- explosions --------------------------------
 
+;spr_lashit:           ;the same as spr_multiple2
+;      .db 7,7
+;      .db %00111000   ;     ███
+;      .db %01111100   ;    █████
+;      .db %11111110   ;   ███████
+;      .db %11111110   ;▒▒▒███████
+;      .db %11111110   ;   ███████
+;      .db %01111100   ;    █████
+;      .db %00111000   ;     ███
+
+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
@@ -3226,6 +3350,22 @@ spr_yexplosion:
        .db %00000000
 
        .db 8,5         ;2
+       .db %00000000
+       .db %00010100   ;   █ █
+       .db %00111010   ;  ███ █
+       .db %01110110   ; ███ ██
+       .db %00011000   ;   ██
+       .db %00000000
+
+       .db 8,5         ;3
+       .db %00000000
+       .db %00101100   ;  █ ██
+       .db %01100110   ; ██  ██
+       .db %01001011   ; █  █ ██
+       .db %00111100   ;  ████
+       .db %00000000
+
+       .db 8,5         ;4
        .db %00111000   ;  ███
        .db %01011100   ; █ ███
        .db %10010111   ;█  █ ███
@@ -3233,7 +3373,7 @@ spr_yexplosion:
        .db %00111000   ;  ███
        .db %00000000
 
-       .db 8,6         ;3
+       .db 8,6         ;5
        .db %00111100   ;   ████
        .db %01001111   ; █  ████
        .db %10100011   ;█ █   ██
@@ -3241,14 +3381,30 @@ spr_yexplosion:
        .db %01110101   ; ███ █ █
        .db %00111000   ;  ███
 
-       .db 8,6         ;4
+       .db 8,6         ;6
+       .db %00101110   ;  █ ███
+       .db %10000011   ;█     ██
+       .db %01000101   ; █   █ █
+       .db %10100011   ;█ █   ██
+       .db %01000110   ; █   ██
+       .db %00110000   ;  ██
+
+       .db 8,6         ;7
        .db %00110110   ;  ██ ██
        .db %00000101   ;     █ █
-       .db %11000001   ;██     █
+       .db %10001001   ;█   █  █
        .db %01100001   ; ██    █
        .db %11000010   ;██    █
        .db %01010001   ; █ █   █
 
+       .db 8,6         ;8
+       .db %00000110   ;     ██
+       .db %00100001   ;  █    █
+       .db %10000000   ;█
+       .db %01000010   ; █    █
+       .db %01000000   ; █
+       .db %00010100   ;   █ █
+
 ;--------------------------------- bullets ----------------------------------
 
 bullettable:
@@ -3265,9 +3421,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 +3511,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     (1x2+1)  2
+       .db 3,1,%00110011,3,%00000000,0,%00000000,0     ;2 fast       (1x3+1)  3
+       .db 2,1,%00110010,0,%00110010,6,%00000000,0     ;3 double     (2x2+1)  4
+       .db 2,1,%01110010,2,%10010010,2,%00110010,2     ;4 triple     (3x2+1)  6
+       .db 3,2,%00110011,2,%10010010,2,%01110010,2     ;5            (3x3+2)  9
+       .db 4,2,%01110011,2,%10010011,2,%00110011,2     ;6            (3x4+2) 12
+       .db 5,3,%01110100,2,%10010100,2,%00110100,2     ;7            (3x5+3) 15
+       .db 7,4,%01110101,2,%10010101,2,%00110101,2     ;8            (3x7+4) 21
+       .db 9,6,%01110110,2,%10010110,2,%00110110,2     ;9            (3x9+6) 27
 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)  3
+       .db 2,3,%11100011,3,%00000000,0,%00000000,0     ;2 short      (2x1x2)  4
+       .db 1,2,%11100100,3,%11100000,4,%00000000,0     ;3 fat        (1x2x3)  6
+       .db 1,2,%11100101,0,%11100000,6,%00000000,0     ;4 double     (1x2x4)  8
+       .db 4,4,%11100011,3,%00000000,0,%00000000,0     ;5 short      (4x1x2)  8
+       .db 1,2,%11100100,3,%11100000,6,%11100000,0     ;6 triple     (1x3x3)  9
+       .db 1,3,%11101000,3,%11100000,6,%11100000,0     ;7 triple long(1x3x7) 21
+       .db 2,5,%11100101,2,%11100000,4,%00000000,0     ;8 double     (2x2x4) 32
+       .db 1,9,%11101100,3,%11100000,2,%11100000,4     ;9 big fat lng(1x3xB) 33
 maxlaser   = 18
 tailbeam   = %00101101 ;180 degrees
 doublebeam = %01010010 ;45 degrees
@@ -3411,6 +3564,23 @@ spr_icon:
        .db %00000001
        .db %11111111
 spr_icon00:
+       .db 15,7        ;unused  .......:.......:
+       .db %10000000           ;█
+       .db %10111111           ;█ █████████████
+       .db %10101010           ;█ █ █ █ █ █ █ █
+       .db %10110101           ;█ ██ █ █ █ █ ██
+       .db %10101010           ;█ █ █ █ █ █ █ █
+       .db %10111111           ;█ █████████████
+       .db %10000000           ;█
+       .db 6
+       .db %00000000
+       .db %11111110
+       .db %10101010
+       .db %01010110
+       .db %10101010
+       .db %11111110
+;      .db %00000000
+spr_icon00_:
        .db 16,7        ;unused  .......:.......:
        .db %10101010           ;█ █ █ █ █ █ █ █
        .db %11010101           ;██ █ █ █ █ █ █ █
@@ -3444,15 +3614,16 @@ spr_icon01:
        .db %01111010
        .db %11110010
        .db %11100100
+maxarmor = 63                          ;maximum HPs you can get
 spr_icon02a:
-       .db 16,7        ;tailbeam.......:.......:
+       .db 16,6        ;tailbeam.......:.......:
        .db %10000000           ;█               ▒
        .db %10000011           ;█     ██        ▒
        .db %10000001           ;█      ███      ▒
        .db %10111011           ;█ ███ ███ ██  ██▒
        .db %10000001           ;█      ███      ▒
        .db %10000011           ;█     ██        ▒
-       .db %10000000           ;█               ▒
+;      .db %10000000           ;█               ▒
        .db 5
        .db %00000000
        .db %00000000
@@ -3475,6 +3646,20 @@ spr_icon02b:
        .db %00000000
        .db %00011110
 spr_icon03:
+       .db 16,7        ;laser   .......:.......:
+       .db %10000000           ;█               ▒
+       .db %10001010           ;█   █ █     ▒▒▒ ▒
+       .db %11101100           ;███ ██      ▒▒▒ ▒
+       .db %11110111           ;████ ███████▒▒▒█▒
+       .db %11101100           ;███ ██      ▒▒▒ ▒
+       .db %10001010           ;█   █ █     ▒▒▒ ▒
+       .db %10000000           ;█               ▒
+       .db 4
+       .db %00000000
+       .db %00000000
+       .db %00000000
+       .db %11111111
+spr_icon04:
        .db 11,7        ;bullets .......:.......:
        .db %10000000           ;█       ██      ▒
        .db %10000011           ;█     █████ ▒▒▒ ▒
@@ -3491,20 +3676,6 @@ spr_icon03:
        .db %11000000
        .db %11100000
        .db %11000000
-spr_icon04:
-       .db 16,7        ;laser   .......:.......:
-       .db %10000000           ;█               ▒
-       .db %10001010           ;█   █ █     ▒▒▒ ▒
-       .db %11101100           ;███ ██      ▒▒▒ ▒
-       .db %11110111           ;████ ███████▒▒▒█▒
-       .db %11101100           ;███ ██      ▒▒▒ ▒
-       .db %10001010           ;█   █ █     ▒▒▒ ▒
-       .db %10000000           ;█               ▒
-       .db 4
-       .db %00000000
-       .db %00000000
-       .db %00000000
-       .db %11111111
 spr_icon05:
        .db 16,7        ;multiple.......:.......:
        .db %10000011           ;█     ███       ▒
@@ -3530,7 +3701,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 "v1.0.A23 ",127," by Shiar",0 ;right behind txt_email
 _txt_about       = $3321
 txt_menu1:     .db "NEW GAME",0
 txt_menu2:     .db "CONTINUE",0
@@ -3553,17 +3724,19 @@ 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 -------------------------------------
 
 storehi_start:
 hiscore                .dw 0                   ;default hiscore
-hiname         .db "shiar.99",0        ;   "       "    name
+hiname         .db "by shiar",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 +3748,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  9                  ;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,34 +3763,36 @@ 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!
 
        .db 0   ;storyline ID
 levelstart:    ;[y-pos] [x-pos] [text,0] [SFX lines; 0=more text] [-1=end]
-       .db 25,33,"Imperial ships have",0,0
-       .db 31,9,"been sent to intercept you",0,31-25+6,-1
+       .db 1,33,"Imperial ships have",0,0
+       .db 7,9,"been sent to intercept you",0,0 ;,7-1+6,-1
+       .db 41,33,"Note STORYLINE and LEVELS",0,0
+       .db 48,38,"---- AINT DONE YET! ----",0,48-1+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 +3806,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 +3862,69 @@ 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
-       .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
-;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
-;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
+;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
+;29=final boss' enemy
+       .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,-3,01, 0, 0,1 ;moving
+       .db 0,%11110011,spr_enemyM1&255,spr_enemyM1/256,128,23,09, 0, 0,1 ;mid+lure
+boss1enemy = 28
+boss2enemy = 29
+;30-34=first bosses    ,               ,               ,   ,  ,  ,  ,  ,
+       .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 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
+       .db 9,%11011011,spr_boss0E &255,spr_boss0E /256,119,00,13,12,13,13
 
 spr_enemy00:
+spr_enemyP1:
        .db 10,8                        ;pickup
        .db %00111111                   ;  ██████
        .db %01100001                   ; ██    ██
@@ -3748,6 +3942,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 +4208,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 +4238,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 +4364,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 +4381,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 +4397,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 +4418,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
@@ -4284,6 +4509,59 @@ spr_boss09:
        .db %10100000
        .db %11111000
        .db %10000000
+spr_boss0E:
+       .db 8,51                        ;.......:.......:
+       .db %00111011                   ; ████ ██
+       .db %01100110                   ;█    ██
+       .db %01110011                   ;      ██
+       .db %00111011                   ;  ███ ██
+       .db %01000111                   ;     ███
+       .db %10101100                   ;    ██
+       .db %01110111                   ;  ██ ███
+       .db %00111011                   ; ████ ██
+       .db %01100100                   ;███  █
+       .db %01000001                   ;    ████
+       .db %01100100                   ;███  █
+       .db %01111011                   ; ████ ██
+       .db %01110111                   ;  ██ ███
+       .db %01001100                   ;    ██
+       .db %00100111                   ;     ███
+       .db %00111011                   ;  ███ ██
+       .db %01000011                   ;      ██
+       .db %10010110                   ;█    ██
+       .db %01111011                   ; ████ ██
+       .db %00110101                   ;       █
+       .db %00001011                   ;      ██
+       .db %00000000                   ;
+       .db %00000000                   ;
+       .db %00000000                   ;
+       .db %00000000                   ;
+       .db %00000000                   ;
+       .db %00000000                   ;
+       .db %00000000                   ;
+       .db %00000000                   ;
+       .db %00000011                   ;      ██
+       .db %00001101                   ;       █
+       .db %01111011                   ; ████ ██
+       .db %11000110                   ;█    ██
+       .db %01000011                   ;      ██
+       .db %01111011                   ;  ███ ██
+       .db %00100111                   ;     ███
+       .db %01011100                   ;    ██
+       .db %00110111                   ;  ██ ███
+       .db %01111011                   ; ████ ██
+       .db %11100100                   ;███  █
+       .db %00000001                   ;    ████
+       .db %11100100                   ;███  █
+       .db %01111011                   ; ████ ██
+       .db %00110111                   ;  ██ ███
+       .db %00101100                   ;    ██
+       .db %01000111                   ;     ███
+       .db %00111011                   ;  ███ ██
+       .db %01001011                   ;      ██
+       .db %10000110                   ;█    ██
+       .db %01111011                   ; ████ ██
+       .db %00001101                   ;    ████
 
 ;----------------------------------------------------------------------------
 ;----------------------------- logo ------------------------------------------
@@ -4320,80 +4598,7 @@ logo_nemesis:
 ;----------------------------------------------------------------------------
 ;----------------------------------------------------------------------------
 
-; 0.98.77 -- 7.VII.00 -- size 6707
-;
-;      # bullets do damage in all levels
-;      * more armor at armor-upgrade and extra armor at end of a level
-;      - internal levels again (no need 4 external, safer/smaller)
-;      # some registers not correctly pushed/popped
-;      * several optimizations (init.procs some bytes smaller)
-;      # enemies hit with hitpoints left disappeared (one pop too much...)
-;      + bullets "charge up" (more damage) when not firing
-;      - removed contrast changes
-;      + more powerful bullets have different sprites (larger=more damage)
-;      # multiples appear at your position (begin level/just selected)
-;      # when invulnerable multiples acted weird
-;      # no more error at activation after APD off after running Nemesis
-;      # saves correctly if own name ain't "nemesis" + some bytes smaller
-;      # screen wasn't always entirely cleared after quit
-;      * waits until all keys have been released after death
-;      + different bullets sizes will miss if they're too small
-;      + at level start "press F1 to save"-text will be displayed
-;      * w3.shiar.org displayed at title screen, black bar behind version nr
-;      # score to 0 when exit pressed at main menu
-;      # no residual story-text in first frame of game
-;      # game doesn't continue again after death (stack messed up)
-;      # game over when lives<0 (didn't work in v0.96+)
-;      * using some self-modifiing code (so it's smaller)
-;      # new random procedure: stars don't appear on one line anymore
-;      * weapons appear centered at multiples
-;      * laser properties can be changed (damage, charge)
-;      + weapon can be combination of bullets/lasers (max. of 3 per weapon)
-;      * bullet-icon is removed when laser is selected
-;      * enemy sprite table integrated in enemy specs (-1 byte/enemy)
-;      + random enemy is chosen from any number of enemies per level
-;      * time to first enemy fire defined per enemy, not per level
-;      + CLIPPED sprites!! no more in/out popping enemies! wow...
-;      * bullets/enemies removed when _entirely_ off screen
-;      # enemies would sometimes be hit by bullets going right below them
-;      # size of the second bullet was too big (invisible hit)
-;      * the frequency an enemy fires bullets is defined per enemy
-;      + wide clipped sprites implemented (width 1-16 pixels)
-;      # bosses first move left until x=100, otherwise they'd be off-screen
-;      * at status bar left below ships are displayed for lives left
-;      * armor bar is two pixels high (better visible)
-;      # bullet overflow fixed again (>63 bullets fired)
-;      # correct weapon loaded when continuing a saved game
-;      # game freezed when generating a random value <=1
-;      * you explode in a different way than the enemies
-;      + screen inverts for a brief time when you are hit!
-;      # stats-bar was messed up when ya got 0 lives left
-;      * two new (big) bosses modeled after a common MSX Nemesis2-boss
-;      * score increased once every 32 frames (instead of every 256)
-;      # ground fixed for new random routine (smaller routine; incs -2 to 2)
-;      + laser will upgrade as well when you reselect it
-;      * 2nd can be used in main menu (wow!)
-;      # altered variable storage space because of Nemesis grew beyond 6kb
-;      # fixed armor bar display when at maximum
-;      + a few new enemies (asteroids) and remade 1st 4 levels; new pickup
-;      - torpedo since it was kinda useless
-;      + second icon now selects TAIL BEAM: bullet going backwards
-;      # armor increase at the end of a level doesn't overflow armorbar
-;      + you can choose your own ship out of four vessel after NEW GAME!
-;      + enemies can appear at any x-position and move both left and right
-;      + move patterns given per enemy, not per level
-;      * new (faster) enemy-move system; 10 basic moves (x2 left+right)
-;      # enemies can _never_ move above or below visible screen
-;      * "randomY"-enemies are placed entirely on screen (height calced)
-;      # the major TI-OS crash bug WAS afterall caused by sprites drawn
-;         (partially) outside screen memory. temporarily fixed by setting
-;         virtual screen buffer to $8200 (enough mem there)
-;      + upto 29 cool enemy sprites and redone first five levels
-;      * improved enemy-move routine; smooth luring, five speeds+backwards
-;      # 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 +4646,42 @@ 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.A23 -- 23.X.00 -- size 7212
+;
+;      * armor-bar background, empty upgrades sprites changed
+;      + shows sprite when laser hits an enemy (his "shield"?)
+;      + exit-key also quits out of ship selection screen
+;      # fixed direct-quit on death bug (bug since recent optimization)
+;      * armor-bar background changed (more elegant and smaller code)
+;      # "flash" when end-boss spawns mine fixed
+;      + enemy's y start position can be specified per enemy
+;      * first icon is now laser, second one's bullets
+;      + when bullets selected, upgrade icons won't appear half the time
+;      # remainder pixels in armor bar (appeared after heavy damage) removed
+;      + your ship's explosion is now also 8 frames (half enemy expl. speed)
+;
 ;
 ;       + 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