version 0.96 (beta): external levels, armor bar, continue
authorMischa Poslawsky <nemesis@shiar.org>
Sun, 31 Oct 1999 15:08:58 +0000 (16:08 +0100)
committerMischa Poslawsky <nemesis@shiar.org>
Wed, 18 Mar 2009 02:45:52 +0000 (03:45 +0100)
# if you were hit when armor-icon selected, prog did weird stuff
+ armor-bar (shows armor as a black line left at bottom)
# bugs involving armor-bar changing armor to a wrong value
# YES!!! the saving-bugs were caused by mmldir: it reset all data
  at mem $8000, so data is now stored at asmexecram+6000 instead!
* external levels. All leveldata is loaded from "nemesis0"-var
* some optimization (like cal\ret>jp + unused code removed/shortened)
* storyline is loaded from level-file (will be compressed later..)
+ story can be _between_ levels, not only at the start of a new game
* "new game" and "continue" in main menu are swapped (new comes 1st)
* enemy bullets can do more than one damage: differs per level
* collision does 4 damage, ground does 5, you start with 12 armor
# running the level-file no longer crashes your calc but just returns
* you now move 1.5 pixels per frame! this way you can outrun enemies
* hellofajob but enemy-data is now stored at one location in 6 bytes,
  instead of two 4-byte spaces 40 bytes apart! (cleaner code; faster)
* ground/ceiling/stars are continued when at boss (c00l level 3 boss)

nemesis.txt
nemesis.z80
nemesis0.z80

index 74693380a8aece077eccf654a03bdf140401d0e1..16ec69c25c640768624cdd4f14f057de28573fd5 100644 (file)
@@ -1,19 +1,19 @@
 ------------------------------------------------------------------------------
  Title                         : Nemesis
- Version                       : 0.95.A22 Beta
- Release Date                  : 22.X.99
- Filename                      : nemesis.86p (size 5321)
+ Version                       : 0.96.A31 Beta
+ Release Date                  : 31.X.99
+ Filename                      : nemesis.86p (size 4842)
  Author(s)                     : Shiar
- Email Address                 : shiar0@hotmail.com (mind the 0)
+ Email Address                 : shiar@mailroom.com
  ICQ                           : #43840958
- Web Page                      : come.to/shiar
+ Web Page                      : http://come.to/shiar
  Description                   : cool arcade-shoot-em-up-game
  Where to get this game        : www.ticalc.org
  Other games by author         : N/Y
- Additional credits to         : See below
+ Additional credits to         : See bottom
 
 
->>>>>>> NOTE ON V.95 ---------------------------------------------------------
+>>>>>>> NOTE ON V.96 ---------------------------------------------------------
 
   YES! NEMESIS was on the NEWS in TICALC.ORG! With a nice screenshot so you
 just couldn't ignore it!! And my, I received a lot of messages. Thanks to
@@ -21,17 +21,17 @@ everybody, I'm very happy!
 
   More happiness: a new update featuring alot of bug fixes (Nemesis has now
 got some good beta-testers!), bosses, weapon-upgrades, LEFT+DOWN-bug fixed
-(THANKS2 BRIAN KOROPOFF!), teacher key, hiscore name, much more. Again thank
-you all and keep sending me stuff! I really appreciate it!
+(THANKS2 BRIAN KOROPOFF!), teacher key, armor-bar, hiscorenames, external
+levels, and much more. Again thank you all and keep sending me stuff!
+I really appreciate it!
 
 
 >>>>>>> INTRO TO NEMESIS -----------------------------------------------------
 
-  Nemesis is an old arcade-game for the MSX. It was a really good game,
-that's why Konami made not only the three Nemesis games for the MSX
-(Nemesis I (1986), ][ (1987) and III ('88)) but also four more Nemesis-clones
-for the MSX as well as 36 versions for other systems including the Game Boy,
-(S)NES and Play Station (as far as I'm aware of).
+  Nemesis is an old arcade-game for many platforms, originally for arcades.
+I first played Nemesis III for the MSX (1988), but Konami made at least
+> 41 < Nemesis-games (mostly named Nemesis, Gradius, Salamander, Parodius)
+for systems including the Game Boy, (S)NES and Play Station.
 
 
 >>>>>>> CONTROLS -------------------------------------------------------------
@@ -45,7 +45,8 @@ MORE       : pause
 EXIT       : exit
 GRAPH      : teacher! (press graph again to resume)
 
-  In main menu you can press F1 to toggle b<>w (not saved yet).
+  In main menu you can press F1 to toggle b<>w (will not be saved... yet).
+  A game can be saved by pressing F1 at the level-screen.
 
 
 >>>>>>> PICKUPS AND SO -------------------------------------------------------
@@ -63,17 +64,17 @@ This icon can be chosen more than once, to increase your shield-points.
   There are just seven levels for now, don't try to get to level eight.
 Things to come:
 
+* compressed level-files
 * different enemies in one level
 * save options (like b<>w)
-* save game
-* more LEVELS!! more enemies more upgrades
-* storyline
+* boss key (saves game and quits)
+* more LEVELS!! more enemies more upgrades more story
 * maybe obstacles?
 * source code release
 ? grayscale, sounds, multiplayer-option: probably not
 
   Continue to send me any IDEAS and BUGS found!! Or send me you like this
-program, or even send me something if you don't. Again: shiar0@hotmail.com,
+program, or even send me something if you don't. Again: shiar@mailroom.com,
 or ICQ #43840958! PLEASE!
 
   Tested on TI86es (and emulators) with ROM 1.4 and 1.6 using YAS, Rascall and
@@ -82,10 +83,11 @@ Asm(. Nemesis will NOT run correctly under RASCALL with the memory LOCKED!
 
 >>>>>>> CREDITS --------------------------------------------------------------
 
-  SHIAR             programming and everything else. SHIAR0@HOTMAIL.COM
+  SHIAR             programming and everything else. SHIAR@MAILROOM.COM
   DAVE              betatester (if you need a bug, ask Dave :)
   BLACKBELT         betatester (the one and only..)
   JONAH COHEN       for teaching me z80 and stuff, also kinda betatester
+  FREE BIRD         working on the storyline
   MATTHEW DALE      betatester
   KONAMI            for writing the original Nemesises and more great games
   PATRICK DAVIDSON  wrote Galaxian; Nemesis uses his gfx-engine
@@ -163,5 +165,12 @@ Most significant version changes since version 0.61.
 * Graph cleared, unintended pixels removed, prog reload, major bugfixes
 * When you got a hiscore, you can enter your name
 
+  Version 0.96Beta  Size:4842  31.X
+
+* Armor-bar and enemy-bullets doing 1/4 damage (can vary per level)
+* External levels (in nemesis0.86p) storing level/enemy-data and story
+* You move faster, ground at boss, more bugs fixed, code optimized
+* Game can be saved at start of a level (continue game does work now)
+
 
 ---------------------------------------------------------------------- <<<<<<<
index 48f79a6b514064bddd24230a311b9cf8ef1b0305..323344414bba2471eefb78421d7a3db08144d5b1 100644 (file)
@@ -1,12 +1,12 @@
 ;------------------------------------------------------------------------------
 ;---------------------- NEMESIS -----------------------------------------------
 ;------------------------------------------------------------------------------
-;      >>> NEMESIS <<<         Version 0.95 BETA       by SHIAR
+;      >>> NEMESIS <<<         Version 0.96 BETA       by SHIAR
 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 ; Title                                : Nemesis
-; Version                      : 0.95
-; Release Date                 : 22.X.99
-; Filename                     : nemesis.86p (5321)
+; Version                      : 0.96
+; Release Date                 : 30.X.99
+; Filename                     : nemesis.86p (4836) nemesis0.86p (888)
 ; Author(s)                    : Shiar
 ; Email Address                        : shiar0@hotmail.com
 ; ICQ                          ; #43840958
 #include       "asm86.h"
 #include       "ti86asm.inc"   ;standard ti86 romcalls
 #include       "ti86abs.inc"   ;used to save hiscores and so
-#include       "ti86un .inc"   ;_dispahl and _shracc
 
        .org _asm_exec_ram
 
 #define                  cal   call    ;just to make it harder for you to understand
 #define                  psh   push    ; ^:D
+#define                  dnz   djnz    ;Dec&Jump while NonZero becomes Do w.Non-Zero
 
 TEXT_MEM       = _textShadow   ;167 bytes ($A7): C0F9-C1A0
-
-storepos       = $8000         ;120 OF 165
-storepos2      = $8100         ;141 OF 167
+_clrWindow     = $4a86         ;a new procedure from AsmStudio86 inc. files
+_ex_ahl_bde    = $45f3
+_shracc                = $4383
+_dispahl       = $4a33
+_asapvar       = $d6fc
+
+storepos       = _asm_exec_ram+6000            ;120 OF 165
+storepos2      = _asm_exec_ram+6200            ;141 OF 167
+exlevel                = _asm_exec_ram+6400            ;784+OF 2.7kb
+
+XLlevelsdata   = exlevel+8                     ;size: upto 1016 bytes
+XLweapondata   = exlevel+1024                  ;size: always 64 byte
+XLenemytable   = exlevel+1088                  ;size: always 16 byt
+XLenemyinfos   = exlevel+1104                  ;size: always 64 by
+XLsprenemies   = exlevel+1168                  ;size: like  128 b (upto 1kb)
 
 ;---------------------- in-game vars ------------------------------------------
 
-temp1          = storepos      ;$C0FA-C0FB     ;temp (2 bytes) bullet
+temp1          = storepos              ;+0+1   ;temp (2 bytes) bullet
 
 just_fired     = storepos+2            ; +2    ;counts how long a blast lasts
 curline                = storepos+2            ; +2    ;used to display SFX
@@ -56,9 +68,9 @@ firey         = firex+1               ; +8    ;(1 byte)
 eventtime      = storepos+10           ;+10    ;enemy frequency
 eventleft      = eventtime+1           ;+11    ;nr. of enemies still to come
 nextevent      = eventleft+1           ;+12    ;time to next event
-pickuptimer    = nextevent+1           ;+13    ;counts when to place a pickup
-level_enemy    = pickuptimer+1         ;+14            ;enemy type
-level_move     = level_enemy+1 ;=
+level_enemy    = nextevent+1           ;+13    ;enemy type
+level_info     = level_enemy+1         ;+14    ;info (see below)
+level_move     = level_info+1          ;+15    ;=
 level_fire     = level_move+1          ;+16
                                        ; **
                                                ;--------OBJECTS
@@ -84,25 +96,22 @@ your_prevpos        = your_locpos+1         ;+88    ;save previous positions (32d)
 ;^-----------------------------------<1        ;-120=$78
 
 nrenemies      = 10                            ;max. nr of enemies
-enemies                = storepos2             ; +0    ;info about each enemy (4byt)
-add2enemy      = nrenemies*4                   ;size of "enemies"
-enemiesxtra    = enemies+add2enemy     ;+40    ;more info 'bout enemies (4)
+enemysize      = 6
+enemies                = storepos2             ; +0    ;info about each enemy (6byt)
 
 nrybuls                = 10
-ybullets       = enemiesxtra+add2enemy ;+80    ;60 bytes = 20(state,x,y)
+ybullets       = enemies+(nrenemies*6) ;+80    ;60 bytes = 20(state,x,y)
 nrebuls                = 10
 ebullets       = ybullets+(nrybuls*3)  ;+110   ;30 bytes = 10(state,x,y)
 
 ybuls          = ebullets+(nrebuls*3)  ;+140
 
 ;^-----------------------------------<2        ;-141=$8D
-;level_move:
-;      %1 (directfire) 1 (ground) 1 (ceiling) 1 (diagfire) 1111 (move)
+;level_info:
+;      [0000:damage 0:directfire 0:ground 0:ceiling 0:diagfire]
 ;enemies:
-;      %111111 (HP left) 11 (00=no enemy 01=exploding 10=normal 11=moving)
-;      %11111111 (ship type or explosion frame)  %11111111 (x) %11111111 (y)
-;enemiesxtra:
-;      $11 (move) $11 (fire) $11 (bullettype)
+;      [000000:HP left 00:(00=no enemy 01=exploding 10=normal 11=moving)]
+;      [ship type or explosion frame] [x] [y] [move] [fire]
 
 ;---------------------- introduction ------------------------------------------
 
@@ -112,7 +121,7 @@ ybuls               = ebullets+(nrebuls*3)  ;+140
        .dw Title               ;pointer to description (all shells)
        .dw Icon                ;pointer to YAS icon
 
-Title: .db "Nemesis v0.95 by Shiar",0
+Title: .db "Nemesis v0.96 by Shiar",0
 
 Icon:  .db 8,1                 ;icon for YAS: width = 1byte; height = 9bytes
        .db %11100000           ; ███
@@ -126,6 +135,8 @@ Icon:       .db 8,1                 ;icon for YAS: width = 1byte; height = 9bytes
 
 ;---------------------- init --------------------------------------------------
 
+level_name: .db 8,"nemesis0"
+
 StartFix:
        im  1
        ld  hl,$D400
@@ -154,11 +165,38 @@ int_end:
 
 init:  cal BUSY_OFF            ;turns the run-indicator off, obviously
        cal _clrScrn            ;clean the screen
-       xor a                   ;<ld a,0>: reset:
+
+Loadlevel:
+       ld  hl,level_name-1     ;find own variable
+       rst 20h                 ;cal _ABS_MOV10TOOP1
+       rst 10h                 ;cal _FINDSYM
+       ret c                   ;not found? who cares...
+
+       cal _ex_ahl_bde
+       cal _SET_ABS_SRC_ADDR
+       xor a
+       ld  hl,exlevel
+       cal _SET_ABS_DEST_ADDR
+       ld  hl,4+4
+       cal _SET_MM_NUM_BYTES
+       cal _mm_ldir
+
+       ld  hl,(exlevel+4+2)
+       cal _SET_MM_NUM_BYTES
+       cal _mm_ldir
+
+       xor a
+       ld  hl,XLweapondata
+       cal _SET_ABS_DEST_ADDR
+       ld  hl,272
+       cal _SET_MM_NUM_BYTES
+       cal _mm_ldir            ;save done (cal \ ret)
+
+setup: xor a                   ;<ld a,0>: reset:
        ld (iy+13),a            ;don't affect TEXT_MEM and don't scroll screen
        ld (_asapvar+1),a       ;Asm( thinks it's the first time it runs Nems.
        cal StartFix
-
+setcontrast:
        ld  a,(CONTRAST)        ;load current contrast level
        cp  $1f                 ;if already at maximum...
        jr  z,skipdarken        ;...then skip level increase
@@ -176,7 +214,7 @@ LogoPut:
 AboveLogo:
        ld  (de),a              ;clear/n byte
        inc de                  ;next
-       djnz AboveLogo          ;repeat for the first line
+       dnz AboveLogo           ;repeat for the first line
 
        ld  bc,16*19            ;logo size
        ldir                    ;display one line of logo
@@ -195,7 +233,7 @@ AboveLogo:
 underline:
        ld  (hl),a              ;draw one piece of the divider-line
        inc hl                  ;move right (8 pixels = 1 byte)
-       djnz underline          ;repeat
+       dnz underline           ;repeat
 
        set 3,(iy+5)            ;set white on black
        ld  hl,$3320            ;near the bottom of the screen
@@ -261,8 +299,12 @@ menuloop:
 
        ld  a,(menuitem)
        dec a
-       cal z,Story
-       cal New_game            ;prepare level
+       jr  nz,startnewgame
+       cal Continue_game
+       jr  game_main_loop
+
+startnewgame:
+       cal New_game
        jr  game_main_loop
 
 menuchange:
@@ -322,10 +364,10 @@ movestarsdone:
        ld  hl,starx2           ;and there they are
        cal DisplayStars        ;use the same procedure to display back layer
 
-       ld  a,(level_move)      ;level info
-       and %01100000           ;isolate ground&ceiling
+       ld  a,(level_info)      ;level info
+       and %00000110           ;isolate ground&ceiling
        jr  z,game_stuff        ;both non-present
-       and %00100000           ;bit representing the presence of any ceiling
+       and %00000010           ;bit representing the presence of any ceiling
        cal nz,Handle_ceiling   ;scroll the ceiling (if any)
        cal Handle_ground       ;scroll the ground
 
@@ -334,10 +376,10 @@ game_stuff:
        or  a                   ;a=0??
        jr  nz,_gamestuff1      ;then don't check for movements/fires/...
 
-       ld  a,(level_move)      ;the same level info
-       and %01100000           ;isolate ground&ceiling again
+       ld  a,(level_info)      ;the same level info
+       and %00000110           ;isolate ground&ceiling again
        jr  z,check_keys        ;no ceiling nor ground
-       and %00100000           ;this bit will tell us if there is a ceiling
+       and %00000010           ;this bit will tell us if there is a ceiling
        cal nz,CheckCeiling     ;if there is, check it
        cal CheckGround         ;check for collision with the ground
 
@@ -470,10 +512,10 @@ groundloopright:
 groundloopup:
        ld  (hl),a              ;display black byte
        sbc hl,de               ;go up (sbc must be used for 16-bit sub)
-       djnz groundloopup       ;and loop >groundpos< times
+       dnz groundloopup        ;and loop >groundpos< times
 
        ld  b,c                 ;pop b used by groundloopup
-       djnz groundloopright    ;loop right for entire screen (16x)
+       dnz groundloopright     ;loop right for entire screen (16x)
        pop hl \ pop hl         ;restore stack
        ret
 
@@ -492,6 +534,7 @@ CheckGround:                        ;check for collision with the ground
        neg
        cp  (hl)
        ret nc
+       ld  b,5
        jp  damage_you
 
 ;--------------------------- ceiling ------------------------------------------
@@ -573,10 +616,10 @@ ceilingloopright:
 ceilingloopdown:
        ld  (hl),a              ;display black byte
        add hl,de               ;go down
-       djnz ceilingloopdown    ;and loop >groundpos< times
+       dnz ceilingloopdown     ;and loop >groundpos< times
 
        ld  b,c                 ;pop b used by groundloopup
-       djnz ceilingloopright   ;loop right for entire screen (16x)
+       dnz ceilingloopright    ;loop right for entire screen (16x)
        pop hl \ pop hl         ;restore stack
        ret
 
@@ -585,7 +628,8 @@ CheckCeiling:                       ;check for collision with the ground
        srl a                   ;x/2
        srl a                   ;x/4
        srl a                   ;x/8 (current ceiling-byte)
- inc a
+       inc a                   ;correction
+
        ld  l,a                 ;hl = a
        ld  h,0                 ;"
        ld  de,ceilingpos       ;first ceiling-byte
@@ -594,6 +638,7 @@ CheckCeiling:                       ;check for collision with the ground
        inc a
        cp  (hl)                ;compare with ceiling
        ret nc                  ;carry if ceiling is above you
+       ld  b,5
        jp  damage_you          ;otherwise you don't wanna be in that ship
 
 ;--------------------------- move stars ---------------------------------------
@@ -604,7 +649,7 @@ DisplayStars:                       ;inputs: hl=starx# a=stars# b=nrstars#
        ld  d,(hl)
        ld  (de),a
        inc hl
-       djnz DisplayStars
+       dnz DisplayStars
        ret                     ;let's comment this: returns
 
 movestars2:
@@ -642,7 +687,7 @@ newstarok:
        ld  (ix),l
        ld  (ix+1),h
        inc ix \ inc ix
-       djnz movestars_loop
+       dnz movestars_loop
        ret                     ;for stupid people, here's another comment...
 
 ;--------------------------- pause --------------------------------------------
@@ -662,21 +707,11 @@ pause:
 
 Teacher:
        ld  (iy+12),5           ;enable flashing cursor
-       cal _clrLCD
-       ld  hl,$0000            ;top left
-       ld  (_curRow),hl
+       cal _clrScrn
+       cal _homeup             ;top left
        ld  hl,txt_teacher
        cal _puts               ;display message
 
-       ld  hl,TEXT_MEM+15
-       ld  a,(hl)
-       psh af
-       ld  a,(TEXT_MEM+42)
-       psh af
-       ld  a,' '
-       ld  (hl),a
-       ld  (TEXT_MEM+42),a
-
 teacherloop:
        cal _getkey             ;enter low-power mode and wait for key
        cp  kEnter              ;enter pressed?
@@ -685,12 +720,7 @@ teacherloop:
        jr  nz,teacherloop      ;no, wait some more
 
        ld  (iy+12),0           ;disable cursor
-       pop af
-       ld  (TEXT_MEM+42),a
-       pop af
-       ld  (TEXT_MEM+15),a
-       cal disp_icons
-       ret                     ;continue
+       jp  disp_icons          ;+ret
 
 teacherans:
        ld  a,' '
@@ -717,10 +747,10 @@ quit:
        ld  bc,1024-1           ;do it 1024 times = entire screen
        ldir
 
-       cal _clrScrn            ;as _clrLCD but also clears TEXT_MEM
-       cal _homeup             ;set cursor to top-left
-       ret                     ;quit Nemesis :(
-
+       jp  _clrWindow          ;as _clrLCD but also clears TEXT_MEM (like the
+                               ;_clrScrn) AND also executes _homeup and ret
+; cal _clrScrn
+; jp  _homeup
 ;--------------------------- display ------------------------------------------
 
 Display_Screen:
@@ -732,10 +762,10 @@ displayloop:
 displaytloop:
        ld  a,(hl)              ;copy byte from (hl)
 _invert:
-       xor $ff                 ;   }   ;invert byte (white<=>black) &&&&
+       xor $ff                 ;   }   ;invert byte (white<=>black)
        ld  (de),a              ;to (de)
        inc hl \ inc de         ;next byte
-       djnz displaytloop       ;16x hl >> de
+       dnz displaytloop        ;16x hl >> de
        dec c                   ;next line
        jr  nz,displayloop      ;loop 64x
 
@@ -750,11 +780,10 @@ ldhld:    cal UNPACK_HL           ;one digit of hl
        add a,'0'               ;make number
        ld  (de),a              ;save into savenr
        dec de                  ;point to next digit
-       djnz ldhld              ;repeat for all digits
+       dnz ldhld               ;repeat for all digits
 
        ld  hl,savestr          ;we (the program) saved the value righthere
-       cal _vputs              ;the only thing left to do is to display it
-       ret                     ;and we're done again
+       jp  _vputs              ;the only thing left to do is to display it
 
 savestr:                       ;@here the score will be stored
        .db "00000",0           ;don't worry, it's just temporary
@@ -790,32 +819,37 @@ ok:                               ;we are
 no_adv:        and %11111011           ;reset move bit
 
 adv_ok:        ld  (your_multiples),a
-       ld  a,b                 ;pop a (keys)
 
+       ld  a,(timer)           ;framecounter
+       and %1                  ;switches 0<>1 each frame
+       inc a                   ;a = 1 or 2 (1.5 avg)
+       ld  c,a                 ;c = your_speed
+
+       ld  a,b                 ;pop a (keys)
        rra                     ;rotate right (put last bit in c)
        ld  b,a                 ;we need a later
 
        jr  c,no_down
        ld  a,(hl)
-       cp  49                  ;55-6 = bottom of screen
-       jr  z,no_down
-       inc a
+       add a,c
+       cp  50                  ;56-6 = bottom of screen
+       jr  nc,no_down
        ld  (hl),a
 no_down:
        dec hl
        rr  b                   ;because we now use b, it's rr instead of rra
        jr  c,no_left
        ld  a,(hl)
-       sub 1                   ;<dec a> doesn't affect c-flag
+       sub c                   ;<dec a> doesn't affect c-flag
        jr  c,no_left           ;-1 = left side
        ld  (hl),a
 no_left:
        rr  b
        jr  c,no_right
        ld  a,(hl)
-       cp  121                 ;127-6 = right side
-       jr  z,no_right
-       inc a
+       add a,c
+       cp  122                 ;128-6 = right side
+       jr  nc,no_right
        ld  (hl),a
 no_right:
        ld  d,(hl)
@@ -823,7 +857,7 @@ no_right:
        rr  b
        jr  c,no_up
        ld  a,(hl)
-       sub 1                   ;<dec a> doesn't affect carry-flag
+       sub c                   ;<dec a> doesn't affect carry-flag
        jr  c,no_up             ;-1 = top of screen
        ld  (hl),a              ;save new y
 
@@ -904,21 +938,22 @@ explosion_stuff:
        ld  e,(hl)
        jp  putsprite
 
-damage_you:
+damage_you:                    ;damages you B points
        ld  a,(your_inv)        ;invulnerability left?
        or  a
        ret nz                  ;return if inv>0
        ld  hl,your_armor       ;armor left
-       ld  a,(hl)              ;check
-       dec a                   ;is it 0?
-       jp  m,no_armor          ;yes, 0hp left so explode
+       ld  a,(hl)              ;load hp in A
+       sub b                   ;decrease hp by B
+       jp  m,no_armor          ;<0hp left so explode
        ld  (hl),a              ;no, so save decreased hp
        cal disp_armor          ;and display new value
 
        ld  a,(your_pickup)     ;how many pickups do you have?
        dec a                   ;is the armor-icon selected
        ret nz                  ;return if not
-       psh hl
+
+       psh de \ psh ix         ;&&& just2Bsave
        ld  hl,VIDEO_MEM+(16*56)
        ld  (PutWhere),hl
        ld  ix,spr_icon         ;if so, highlight armorIcon again
@@ -926,8 +961,9 @@ damage_you:
        cal putwidesprite       ;display icon
        ld  hl,GRAPH_MEM
        ld  (PutWhere),hl
-       pop hl
+       pop ix \ pop de
        ret                     ;and return
+
 no_armor:
        ld  a,%01               ;occ %xxxxxx01 = explode
        ld  (your_occ),a        ;set to explode
@@ -944,7 +980,7 @@ place_multiples:
        inc hl                  ;next
        ld  (hl),e              ;set prev-y to e
        inc hl                  ;next
-       djnz place_multiples    ;repeat
+       dnz place_multiples     ;repeat
        ret
 
 ;------------------------- select upgrade -------------------------------------
@@ -953,8 +989,14 @@ select:
        ld  hl,your_pickup      ;select pickups
        ld  a,(hl)              ;load pickups taken so far
        dec a                   ;is it 1?
+       ret m                   ;return if it's 0 (no pickups)
        jr  nz,select2          ;no, carry on
-       ld  (hl),a              ;reset pickups (a=0)
+select1:
+       ld  a,(your_armor)      ;load current armor
+       cp  24                  ;is it >=24
+       ret nc                  ;then return (armor may not be 25 or more)
+       xor a
+       ld  (your_pickup),a     ;reset pickups (a=0)
        ld  hl,your_armor       ;change armor
        inc (hl)                ;increase HPs by one
        jp  disp_icons          ;display and return
@@ -981,7 +1023,7 @@ select3:
        add a,a                 ;    *8
        ld  c,a
        ld  b,0
-       ld  hl,weapons-7
+       ld  hl,XLweapondata-7
        add hl,bc
        ld  a,(hl)
        ld  (ybuls),a
@@ -1013,10 +1055,13 @@ Fire_bullet:
        ld  hl,RanPos           ;random
        inc (hl)                ;update random counter
 
+;      ld  a,(laserlasts)
+;      ld  b,5
        ld  hl,just_fired
        ld  a,(hl)              ;just_fired
        cp  5                   ;already pressed?
        ret z                   ;return when already pressed (=5)
+
        inc (hl)                ;otherwise increase counter (0 to 4 >> 1 to 5)
        ld  a,(your_weapon)     ;if you have bullets.....
        dec a                   ;(1=laser)
@@ -1042,7 +1087,7 @@ fireany:
        dec a                   ;1=yes
        jr  z,fire_laser
 
-       ld  ix,weapons-6
+       ld  ix,XLweapondata-6
        add a,a                 ;weap*2
        add a,a                 ;    *4
        add a,a                 ;    *8
@@ -1108,11 +1153,11 @@ _nolc:  ld  c,a                 ;c = (Y*16+X/8) mod 256
 drawlaser:
        ld  (hl),%11111111
        inc hl                  ;Go to next byte
-       djnz drawlaser
+       dnz drawlaser
 
-       ld  a,(just_fired)      ;fired for how long
-       cp  4                   ;if 4th turn
-       ret nz                  ;then do damage, otherwise quit
+;      ld  a,(just_fired)      ;fired for how long
+;      cp  4                   ;if 4th turn
+;      ret nz                  ;then do damage, otherwise quit
 
 handle_laser:
        ld  a,(firex)
@@ -1149,11 +1194,11 @@ laserhits:                      ;Hits with normal enemies
 
 nolashit:
        pop hl
-       inc hl                  ;go to next enemy
-       inc hl
-       inc hl
-       inc hl
-       djnz laserhits          ;check all enemies
+       ld  a,b                 ;psh bc
+       ld  bc,enemysize
+       add hl,bc               ;go to next enemy
+       ld  b,a                 ;pop bc
+       dnz laserhits           ;check all enemies
        ret
 
 enemy_lashit:
@@ -1170,7 +1215,7 @@ find_ybullet:
        or  a
        jr  z,found_ybullet     ;0 = no bullet here
        add hl,de
-       djnz find_ybullet       ;look next bullet
+       dnz find_ybullet        ;look next bullet
        ret
 
 found_ybullet:
@@ -1189,13 +1234,13 @@ found_ybullet:
 ;------------------------ handle bullets --------------------------------------
 
 bullet_left:
-       ld  a,125
+       ld  a,124
        sub b
 
        cp  (hl)                ;off screen? (x>128-5)
        jr  c,remove_bullet
        ld  a,(hl)              ;a = X
-       add a,b                 ;move 2 2 the right
+       add a,b                 ;move b to the right
        ld  (hl),a              ;save new pos.
        ld  d,a                 ;d = X
 
@@ -1237,10 +1282,10 @@ bullet_noymove:
 remove_bullet:
        dec hl
        ld  (hl),0              ;dump this bullet!
-       pop hl ;&&&
+       pop hl
        jr  next_ybullet
 
-Handle_bullets:        ;&&&>>
+Handle_bullets:
        ld  hl,ybullets
        ld  a,(ybuls)
        ld  b,a
@@ -1273,7 +1318,7 @@ next_ybullet:
        inc hl
        inc hl
        inc hl
-       djnz scan_bullets       ;next bullet (loop)
+       dnz scan_bullets        ;next bullet (loop)
        ret
 
 ;--------------------------- check bullethits --------------------------------
@@ -1325,11 +1370,11 @@ hit_enemies:                    ;Hits with normal enemies
 
 nohit:
        pop hl
-       inc hl
-       inc hl
-       inc hl
-       inc hl
-       djnz hit_enemies        ;check next enemy
+       ld  a,b                 ;psh bc
+       ld  bc,enemysize
+       add hl,bc
+       ld  b,a                 ;pop bc
+       dnz hit_enemies ;check next enemy
        ret
 
 enemy_hit:
@@ -1353,8 +1398,7 @@ pickupdone:
        ld  (hl),$00            ;explosionFrame 0
 
        ld  hl,1                ;increase score by one
-       cal scoreInc
-       ret
+       jp  scoreInc            ;+ret
 
 hpleft:
        ld  a,c                 ;pop occ
@@ -1423,64 +1467,63 @@ Level_event:
        ld  (hl),123            ;set delay
        ret                     ;don't place any more enemies
 
-place_boss: ;&&&
-       ld  hl,(levelp)
-       dec hl
-       ld  a,(hl)
+place_boss:
+       ld  hl,(levelp)         ;the leveldata (including the boss)
+       dec hl                  ;points to leveldata\boss\enemynr
+       ld  a,(hl)              ;load it
        ld  (level_enemy),a     ;set new enemy (boss)
-       dec hl
-       ld  a,(hl)
-       ld  (level_move),a      ;set boss movement (very slow)
-       dec hl
-       ld  a,(hl)
-       ld  (level_fire),a      ;set rapid fire
-       cal do_event
-       ret
+       dec hl                  ;points to level\boss\movement
+       ld  a,(hl)              ;load
+       ld  (level_move),a      ;set boss movement
+       dec hl                  ;@level\boss\firefreq
+       ld  a,(hl)              ;load in a
+       ld  (level_fire),a      ;set firefrequency
+       jp  do_event            ;+ret
 
 standby_event:
        ld  b,nrenemies
-       ld  de,enemies-4
+       ld  hl,enemies-enemysize
+       ld  de,enemysize
 chk_enemyleft:
-       inc de
-       inc de
-       inc de
-       inc de
-       ld  a,(de)
+       add hl,de
+       ld  a,(hl)
        or  a                   ;0 = no enemy present
        jr  nz,enemyleft
-       djnz chk_enemyleft
+       dnz chk_enemyleft
        ret
 enemyleft:
+       ld  hl,eventleft
        inc (hl)
        ret
 
 
 do_event:
-       ld  de,enemies-4
+       ld  hl,enemies-enemysize
+       ld  bc,enemysize
+       xor a                   ;a=0
 chk_noenemy:
-       inc de
-       inc de
-       inc de
-       inc de
-       ld  a,(de)
-       or  a                   ;0 = no enemy present
-       jr  nz,chk_noenemy
+       add hl,bc
+       cp  (hl)                ;(hl) = 0 ??
+       jr  nz,chk_noenemy      ;jump if enemy present (non-0)
+
+       ld  d,h
+       ld  e,l
 
 place_enemy:
        ld  a,(level_enemy)     ;enemy type to place (lvl)
-       ld  hl,enemy00          ;enemy 1 specs
+       ld  hl,XLenemyinfos-4   ;enemy "0" specs (1 before enemy #1)
        add a,a                 ;a=type*2
        add a,a                 ;a=type*4
        ld  c,a                 ;c=type
-       ld  b,0                 ;bc = enemy nr.
+       ld  b,0                 ;bc = enemy nr.&&&XX
        add hl,bc               ;hl = enemy specs
        ld  a,(hl)              ;load hitpoints+occ of this enemy class
-       ld  (de),a              ;occ
+       ld  (de),a              ;save occ
 
        inc hl                  ;next enemyInfo byte
        inc de                  ;next byte of current enemy
        ld  a,(hl)              ;load enemy class (nr)
-       ld  (de),a              ;enemy type
+       ld  (de),a              ;save enemy type
 
        inc de                  ;set x-pos
        psh de
@@ -1488,7 +1531,7 @@ place_enemy:
        pop de
        ld  a,128               ;appear at right edge of screen
        sub (ix)                ;minus the width of this enemy (not offscreen)
-       ld  (de),a              ;= x-position
+       ld  (de),a              ;= x-position (save)
 
        inc de                  ;set y-pos
        inc hl                  ;where to place??
@@ -1513,26 +1556,16 @@ random_enemy:
 ypos_OK:                       ;random value successfully created
        ld  (de),a              ;save y-position
 
-       ld  hl,add2enemy-3      ;offset to xtra enemy info
-       add hl,de               ;hl points to <xtra info: move>
-       ld  (hl),1              ;set move-counter to 1
-       inc hl                  ;hl to <xtra info: fire>
+       inc de                  ;set move
+       ld  a,1                 ;movecounter = 1
+       ld  (de),a              ;&&&(hl),1 better?
 
-       ld  a,(level_move)
-       and %00010000
-       jr  z,ffiredelayed
-       ld  a,1                 ;set time-to-fire to 1 frame (fires directly)
-       jr  ffireOK
-ffiredelayed:
-       ld  a,(level_fire)      ;set "ttf" to normal nr of frames
-ffireOK:
-       ld  (hl),a
-       inc hl                  ;hl to <xtra info: bullettype>
-       ld  (hl),1              ;type 1
-       inc hl                  ;hl to <xtra info: bullettype>
-       ld  a,(RanPos)
-       and %01111111
-       ld  (hl),a              ;type 1
+       inc de                  ;set fire
+       ld  a,(level_info)
+       and %00000001           ;bit meaning directfire
+       jr  nz,ffireOK          ;(a=time-to-fire) = 1 frame (fires directly)
+       ld  a,(level_fire)      ;set ttf to normal nr of frames
+ffireOK:ld  (de),a             ;save fire
        ret                     ;return
 
 ;--------------------------- enemy fires --------------------------------------
@@ -1549,13 +1582,13 @@ find_ebullet:
        or  a
        jr  z,found_ebullet     ;0 = not used
        inc hl \ inc hl \ inc hl
-       djnz find_ebullet       ;look next bullet
+       dnz find_ebullet        ;look next bullet
        ret
 
 found_ebullet:
        ld  b,%1100
-       ld  a,(level_move)
-       and %10000000
+       ld  a,(level_info)
+       and %00001000
        jr  z,bulletok
 
        ld  a,(y)
@@ -1576,12 +1609,10 @@ bulletnotup:
        ld  b,%1000
 
 bulletok:
-;      ld  a,c                 ;load bullet type
-;      add a,a                 ;type*2                 %..Btype.
-;      add a,a                 ;type*4                 %.Btype..
-;      add a,a                 ;type*8                 %Btype...
-                               ;add bullet direction   %BtypeDir
-       ld  (hl),b              ;set bullet direction
+       ld  a,(level_info)
+       and %11110000
+       or  b
+       ld  (hl),a              ;set bullet direction
        inc hl
        ld  (hl),d              ;set x-pos
        inc hl
@@ -1597,17 +1628,17 @@ handle_bullet:
        psh bc
        psh hl
        ld  a,(hl)              ;load bulletType in a
-       or  a                   ;is it 0?
-       jr  nz,enemy_bullet     ;no: handle bullet
+       and %1111               ;select direction-bits
+       jr  nz,enemy_bullet     ;non-0: handle bullet
 next_bullet:
        pop hl                  ;do not move the <pop hl>
        pop bc
        inc hl \ inc hl \ inc hl
-       djnz handle_bullet
+       dnz handle_bullet
        ret
 
 enemy_bullet:
-       ld  b,a                 ;save type
+       ld  b,a                 ;save type&%1111
        inc hl                  ;bullet x
        ld  a,(hl)              ;check if it has reached the left side of scrn
        and %11111110           ;it is <2 (0 or 1)?
@@ -1618,9 +1649,9 @@ enemy_bullet:
        inc hl                  ;@y
 
        ld  a,b                 ;restore type
-       cp %1100                ;&&& use <bit ?,a>
+       cp %1100                ;is it a normal bullet? (cp = faster than bit)
        jr  z,ebullet_common    ;type %1100: normal bullet
-       and %111
+       and %111                ;isolate important bits
        jr  z,ebullet_down      ;type %1000: moving down
        dec a
        jr  z,ebullet_up        ;type %1001: moving up
@@ -1676,6 +1707,11 @@ ebullet_hits:
        cp  9
        jr  nc,next_bullet
 
+       pop hl                  ;points to bullettype again
+       psh hl                  ;and save it again (ivm call to damage_you)
+       ld  a,(hl)              ;load bullettype
+       cal _shracc             ;isolate damage-bits (%1111???? -> %00001111)
+       ld  b,a                 ;set damage-amount
        cal damage_you          ;HIT!!
 remove_ebullet:
        pop hl                  ;hl could be destroyed by damage_you
@@ -1731,36 +1767,35 @@ normal_enemy:                   ;occ "normal" 2 or "moving" 3
        jr  firing_done         ;continue
 
 check_enemyfire:
-       ld  bc,add2enemy+1-2    ;offset of <xtra enemy info: fire>
-       add hl,bc               ;go there (@hl)
+       inc hl                  ;go to <y>
+       inc hl                  ;go to <move>
+       inc hl                  ;go to <fire>
        dec (hl)                ;decrease counter till next blast
-       ld  a,(hl)              ;load new counter
+       ld  a,(hl)              ;&&&doesn't seem efficient to me
        or  a                   ;has it reached zero?
        jr  nz,firing_done      ;finished if not
 
        ld  a,(level_fire)      ;re-set counter for next blast
        ld  (hl),a              ;save time to fire
-       inc hl                  ;next byte = bullettype
-       ld  c,(hl)              ;c = bullet type
+       inc hl                  ;next byte = bullettype &&&
        psh de                  ;save registers for firing-use
        cal Enemy_fires         ;fires bullet
        pop de                  ;restore (destroyed by Enemy_fires)
 firing_done:
-       cal putwidesprite               ;display sprite @ix
+       cal putwidesprite       ;display sprite @ix
 
 next_enemy:
        pop hl
-       ld  bc,$0004
+       ld  bc,enemysize
        add hl,bc
        pop bc
-       djnz handle_enemy
+       dnz handle_enemy
        ret
 
 remove_enemy:
        pop hl
        ld  (hl),$0000          ;bye bye enemy
-       psh hl
-       jr  next_enemy
+       jr  next_enemy+1        ;continue AFTER pop hl (already done)
 
 exploding_enemy:
        inc hl
@@ -1780,7 +1815,7 @@ exploding_enemy:
 
 moving_enemy:
        ld  a,(level_move)
-       and %1111
+       and a
        jr  z,movetype_updown   ;type 0
        dec a
        jr  z,movetype_vslow    ;1
@@ -1836,19 +1871,17 @@ lure_up:
        ret
 
 movetype_smart:
-       ld  bc,add2enemy
-       add hl,bc
-
+       inc hl                  ;hl =@ <move>
        ld  a,(timer)
-       and %1111
-       ld  a,(hl)
+       and %1111               ;     |
+       ld  a,(hl)              ;&&& \|/
        jr  nz,smartupdate
        inc a
 smartupdate:
        ld  (hl),a
 
        or  a                   ;reset carry flag
-       sbc hl,bc
+       dec hl                  ;reset hl to <y>
        and %11111100
        jr  z,movetype_fast
 
@@ -1870,9 +1903,7 @@ movetype_vfast:
        jp  remove_enemy        ;remove this enemy (off screen)
 
 movetype_updown:
-       ld  bc,add2enemy
-       add hl,bc
-
+       inc hl                  ;@ <move>
        ld  a,(hl)
        dec a
        jr  nz,move_updated
@@ -1881,7 +1912,7 @@ move_updated:
        ld  (hl),a
 
        or  a                   ;reset carry flag
-       sbc hl,bc
+       dec hl                  ;@ <y>
        and %00100000
        ld  a,(hl);&&&ld a,e    ;load current y-position
        jr  z,movedown
@@ -1980,15 +2011,16 @@ collide:
        sub %00000100
        ld  (hl),a
 collide_done:
+       ld  b,4                 ;damage
        cal damage_you
 
 check_next:
        pop hl
-       inc hl
-       inc hl
-       inc hl
-       inc hl
-       djnz check_collision
+       ld  a,b                 ;psh bc
+       ld  bc,enemysize
+       add hl,bc
+       ld  b,a                 ;pop bc
+       dnz check_collision
        ret
 
 ;--------------------------- story -------------------------------------------
@@ -2028,19 +2060,18 @@ storyLine:
        pop hl
        ret
 
-Story:
-       ld  hl,story01-1
-       cal storyPage
-       cal storyPage
-       cal storyPage
-       ret
+dostory:
+       cal storyPage                   ;do some story
+       inc hl                          ;look at next hl
+       ld  a,(hl)                      ;load in a
+       dec hl                          ;restory hl
+       inc a                           ;set z-flag if a = $ff
+       jr  nz,dostory                  ;otherwise loop
 
-story01:
-       .db $21,$1d,"Cosmic year 6716"          ,0,0,$1d,$06
-       .db $1b,$1d,"storyline coming soon..."  ,0,0,$1d,$06
-       .db $09,$19,"the Nemesis saga continues",0,1
-       .db $2e,$21,"with NEMESIS 86"           ,0,1
-       .db $52,$36,"by Shiar"                  ,0,0,$19,$23
+       ld  bc,5                        ;story ends
+       add hl,bc                       ;set hl to beginning of the level
+       ld  (levelp),hl                 ;set the level-pointer
+       ret                             ;and return
 
 ;--------------------------- SFX ---------------------------------------------
 
@@ -2092,15 +2123,15 @@ SFXdisp:                        ;display this frame on screen
        ld  bc,-16              ;go up one line (not on screen)
        add hl,bc               ;so the same line will be displayed
        ld  b,a                 ;pop b
-       djnz SFXdisp            ;repeat until whole screen is displayed
+       dnz SFXdisp             ;repeat until whole screen is displayed
 
        ld  b,8
 SFXdelay:
        halt
-       djnz SFXdelay
+       dnz SFXdelay
 
        pop  bc
-       djnz SFXframe
+       dnz SFXframe
        ret
 
 ;--------------------------- show icon ----------------------------------------
@@ -2108,10 +2139,12 @@ SFXdelay:
 drawline:
        ld  (hl),a              ;draw one piece of the divider-line
        inc hl                  ;move right (8 pixels = 1 byte)
-       djnz drawline           ;repeat (16bytes * 8pixels =128= screen width)
+       dnz drawline            ;repeat (16bytes * 8pixels =128= screen width)
        ret
 
 disp_icons:
+ psh bc \ psh de \ psh hl \ psh ix ;&&&
+
        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)
@@ -2127,7 +2160,7 @@ disp_icons:
        ld  ix,spr_icon01       ;armorIcon
        ld  de,$1901            ;icon #1
        cal putwidesprite       ;display icon
-       cal disp_armor          ;display value
+       cal disp_armor          ;display bar
 
        ld  ix,spr_icon00
        ld  a,(torp_occ)
@@ -2144,7 +2177,9 @@ no_torp:
        ld  hl,$3945            ;position to display bullet-type digit
        ld  a,(your_weapon)     ;digit
        dec a                   ;minus one (1=laser)
-       cal _disp_armor         ;display digit
+       ld  (_penCol),hl        ;set location
+       add a,'0'               ;make digit
+       cal _vputmap            ;display char
 
        ld  ix,spr_icon00       ;emptyIcon
        ld  a,(your_weapon)
@@ -2183,19 +2218,46 @@ no_multiples:
 iconsdone:
        ld  hl,GRAPH_MEM        ;normal game-screen
        ld  (PutWhere),hl       ;set sprite-position to normal screen
+
+ pop ix \ pop hl \ pop de \ pop bc
        ret
 
 disp_armor:
-       ld  hl,$3925            ;Display Armor left
-       ld  a,(your_armor)      ;load armor left
-_disp_armor:
-       ld  (_penCol),hl        ;place @ armorIcon
-       add a,'0'               ;make digit
-       cal _vputmap            ;display char
+       ld  hl,(57*16)+VIDEO_MEM+3
+       ld  b,3
+armorbarclr:
+       dec hl
+       ld  (hl),0
+       dnz armorbarclr
+
+       ld  a,(your_armor)      ;load your armor
+       ld  c,a                 ;psh a
+       srl a                   ;/2
+       srl a                   ;/4
+       srl a                   ;/8: don't display last 2 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
+       inc hl                  ;next position
+       dnz armorbar            ;loop it b times
+
+noarmorbar:
+       ld  a,c                 ;pop a
+       and %111                ;display last bits of armor
+       ret z                   ;if armor=0 then bit = %00000000 (don't disp)
+       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
        ret
 
 disp_lives:
-       ld  hl,$3900            ;display Lives
+       ld  hl,$3A00            ;display Lives
        ld  (_penCol),hl        ;bottom left
        ld  hl,savestr+2
        ld  (hl),'L'
@@ -2207,8 +2269,7 @@ disp_lives:
        add a,'0'               ;make digit
        ld  (hl),a
        dec hl \ dec hl
-       cal _vputs              ;display on screen
-       ret
+       jp  _vputs              ;display on screen +ret
 
 ;--------------------------- proc ---------------------------------------------
 
@@ -2257,12 +2318,12 @@ find_sprite:                    ;destroyed: de ix
        psh hl
        ld  e,(hl)              ;e = enemy type
        ld  d,0                 ;de = e
-       ld  hl,sprites          ;hl = @sprites offset-table
+       ld  hl,XLenemytable     ;hl = @sprites offset-table
        add hl,de               ;points to offset of current enemy offset
        ld  e,(hl)              ;de = @enemy offset
        ld  d,0
 
-       ld  ix,spr_enemy00      ;first enemy sprite
+       ld  ix,XLsprenemies     ;first enemy sprite
        add ix,de               ;add offset for current enemy
        add ix,de               ;twice (offset stored as offset/2)
        pop hl
@@ -2284,17 +2345,17 @@ waitnokeypressed:
        jr  nz,waitnokeypressed
        ret
 
-Decompress:
+Decompress:                    ;hl=source(compressed) de=dest(decompressed)
        ld  a,(hl)
        bit 7,a
-       jr  z,Compressed
+       jr  z,compressed
        inc hl
-       and 01111111b
+       and %01111111
        ld  b,0
        ld  c,a
        ldir
        jr  Decompress
-Compressed:
+compressed:
        psh af
        or  %11111100
        ld  b,a
@@ -2339,17 +2400,36 @@ save_hi:
        ret c                   ;not found? who cares...
 
        xor a
-        ld  hl,4+stored_data_start-_asm_exec_ram
+        ld  hl,4+storehi_start-_asm_exec_ram
         add hl,de              ;hl=pointer to data in original prog
         adc a,b
         cal _SET_ABS_DEST_ADDR
         xor a
-        ld  hl,stored_data_start
+        ld  hl,storehi_start
         cal _SET_ABS_SRC_ADDR
-        ld  hl,stored_data_end-stored_data_start
+        ld  hl,storehi_end-storehi_start
         cal _SET_MM_NUM_BYTES
         jp  _mm_ldir           ;save done (cal \ ret)
 
+save_lvl:
+       ld  hl,own_name-1       ;find own variable
+       rst 20h                 ;cal _ABS_MOV10TOOP1
+       rst 10h                 ;cal _FINDSYM
+       ret c                   ;not found? who cares...
+
+       xor a
+       ld  hl,4+storesave_start-_asm_exec_ram
+       add hl,de               ;hl=pointer to data in original prog
+       adc a,b
+       cal _SET_ABS_DEST_ADDR
+       xor a
+       ld  hl,storesave_start
+       cal _SET_ABS_SRC_ADDR
+       ld  hl,storesave_end-storesave_start
+       cal _SET_MM_NUM_BYTES
+       jp  _mm_ldir            ;save done (cal \ ret)
+       ret
+
 game_over:
        pop hl                  ;=ret (game_over was called from a procedure)
 game_over_nopop:
@@ -2466,34 +2546,39 @@ hiscoredone:
 restore_line:
        set 1,(hl)
        add hl,de
-       djnz restore_line
+       dnz restore_line
 
        cal _getkey             ;wait for keypress
        jp  quit                ;restore some things and return to TI-OS/shell
 
+Continue_game:
+       jr  nonext_level
+
 New_game:
-       xor a                   ;score 0
+       xor a                   ;ld a,0
        ld  (score),a           ;reset score
-       ld  (score+1),a         ;reset score
+       ld  (score+1),a         ;reset score (0)
        ld  (torp_occ),a        ;no torpedoes
        ld  (your_weapon),a     ;no laser
        ld  (your_pickup),a     ;reset pickups
        ld  (your_multiples),a  ;no multiples
-       inc a                   ;level #1
-       ld  (level),a           ;reset level nr
-       ld  hl,level01          ;set level pointer to level#1
+       inc a                   ;ld a,1
+       ld  (level),a           ;reset level nr (#1)
+       ld  hl,XLlevelsdata     ;set level pointer to level#1
        ld  (levelp),hl         ;reset level pointer
        inc a                   ;ld a,2
        ld  (your_weapon),a     ;default weapon
        ld  a,4
        ld  (your_lives),a      ;3 lives (4 will be decreased @ You_die)
        ld  (pickuptimer),a     ;next pickup after 4 enemies destroyed
-       inc a                   ;ld a,5
-       ld  (your_armor),a
-       ld  a,(weapons+1)       ;max number of bullets (varies per weap.class)
-       ld  (ybuls),a
+
+       xor a
+       cp  (hl)
+       cal z,dostory
 
 You_die:
+       ld  a,12
+       ld  (your_armor),a      ;5 HPs/shields
        ld  hl,your_lives
        dec (hl)                ;decrease lives
        ld  a,(hl)              ;load lives left
@@ -2509,18 +2594,35 @@ Next_level:
        inc a
        ld  (hl),a
 
-       ld  hl,(levelp)         ;level pointer
-       ld  bc,5+32+4+3         ;advance one level
-       add hl,bc               ;update to point to next level
-       ld  (levelp),hl         ;save
-
+       add a,a
+       add a,a
        ld  h,0                 ;increase score....
-       ld  l,a                 ;by level number
+       ld  l,a                 ;by level number * 4
        ld  bc,20
        add hl,bc               ;plus 20
        cal scoreInc            ;update score
 
+       ld  hl,(levelp)         ;level pointer
+       ld  bc,5+32+4+4         ;advance one level
+       add hl,bc               ;update to point to next level
+       ld  (levelp),hl         ;save
+
+       xor a
+       cp  (hl)
+       cal z,dostory
+
 nonext_level:
+       ld  a,(your_weapon)
+       add a,a                 ;weap*2
+       add a,a                 ;    *4
+       add a,a                 ;    *8
+       ld  c,a
+       ld  b,0
+       ld  hl,XLweapondata-7
+       add hl,bc
+       ld  a,(hl)
+       ld  (ybuls),a           ;max number of bullets (varies per weap.class)
+
        ld  a,80
        ld  (nextevent),a       ;time to first enemy appearance
 
@@ -2534,6 +2636,9 @@ nonext_level:
        ld  a,(hl)              ;load nr of enemies in this level
        ld  (eventleft),a       ;set nr of events left
        inc hl
+       ld  a,(hl)              ;
+       ld  (level_info),a      ;
+       inc hl
        ld  a,(hl)              ;movement of enemies in this level
        ld  (level_move),a      ;do it
        inc hl
@@ -2578,8 +2683,8 @@ torpsclear:
        ld  hl,enemies          ;remove all enemies and bullets
        ld  (hl),0              ;clear first byte
        ld  de,enemies+1        ;copy this to the next byte
-       ld  bc,(add2enemy*2)+((nrybuls+nrebuls)*3)-1
-       ldir                    ;clear enemy-info + enemiesxtra + all bullets
+       ld  bc,(nrenemies*enemysize)+((nrybuls+nrebuls)*3)-1
+       ldir                    ;clear enemies + bullets (y/e)
 
 ;--------------------------- setup game ---------------------------------------
 
@@ -2613,10 +2718,11 @@ game_setup:
        res 3,(iy+5)            ;set white on black
 
        cal _getkey             ;wait for keypress
+       cp  kF1
+       cal z,save_lvl
 
-       cal CLEARLCD            ;clear screen
-       cal disp_icons          ;display bottom icons
-       ret
+       cal _clrLCD             ;clear screen
+       jp  disp_icons          ;display bottom icons +ret
 
 placestars:
        cal Random5016          ;a = (0..50)*16 = random y-pos
@@ -2629,7 +2735,7 @@ placestars:
        ld  (ix),l              ;save x-pos (l)
        ld  (ix+1),h            ;save y-pos (h)
        inc ix \ inc ix         ;next star
-       djnz placestars         ;repeat for all stars
+       dnz placestars          ;repeat for all stars
        ret
 
 ;--------------------------- putsprite ----------------------------------------
@@ -2659,7 +2765,7 @@ putsprite:
        srl d                   ;d/4
        srl d                   ;d/8 (8 bits in byte) ** c is set when overflow
        add a,d                 ;a = (Y*16+X/8) mod 256
-       jr  nc,_n1              ;jump if no carry = no overflow = a<=255
+       jp  nc,_n1              ;jump if no carry = no overflow = a<=255
        inc b                   ;a>255 so increase bc by 256
 _n1:   ld  c,a                 ;c = (Y*16+X/8) mod 256
        add hl,bc               ;bc = Y*16+X/8
@@ -2673,93 +2779,93 @@ _oloop: psh bc                  ;Save # of rows
        inc ix
 _smc1: ld  a,1                 ;Load pixel mask
 _iloop:        sla c                   ;Test leftmost pixel
-       jr  nc,_noplot          ;See if a plot is needed
+       jp  nc,_noplot          ;See if a plot is needed
        ld  e,a                 ;OR pixel with screen
        or  (hl)
        ld  (hl),a
        ld  a,e
 _noplot:rrca
-       jr  nc,_notedge         ;Test if edge of byte reached
+       jp  nc,_notedge         ;Test if edge of byte reached
        inc hl                  ;Go to next byte
 _notedge:
-       djnz _iloop
+       dnz _iloop
        pop hl                  ;Restore address
        ld  bc,16               ;Go to next line
        add hl,bc
        pop bc                  ;Restore data
-       djnz _oloop
-       ret
+       dnz _oloop
+       ret                     ;<jp>s are used instead of <jr> = faster
 
 ;--------------------------- putbigsprite -------------------------------------
 
 putwidesprite:
-       ld       a,d
-       and      7
-       ld       hl,offsets_table
-       ld       c,a
-       ld       b,0
-       add      hl,bc
-       ld       a,(hl)
-       ld       (wsmc1+1),a
-       ld       (wsmc2+1),a
-       ld       hl,(PutWhere)
-
-       ld       a,e
-       add      a,a
-       add      a,a
-       add      a,a
-
-       rl       b
-       add      a,a
-       rl       b
-       srl      d
-       srl      d
-       srl      d
-       add      a,d
-       jr       nc,n1
-       inc      b
-n1:    ld       c,a
-       add      hl,bc
-          
-       ld       d,(ix)
-       ld       b,(ix+1)
-woloop:        psh      bc                         ;Save # of rows
-       psh      hl                         ;Save screen address
-       ld       b,d                        ;Load width
-       ld       c,(ix+2)                   ;Load one line of image
-       inc      ix
-wsmc1: ld       a,1                        ;Load pixel mask
-wiloop:        sla      c                          ;Test leftmost pixel
-       jr       nc,wnoplot                 ;See if a plot is needed
-       ld       e,a                        ;OR pixel with screen
-       or       (hl)
-       ld       (hl),a
-       ld       a,e
+       ld  a,d
+       and 7
+       ld  hl,offsets_table
+       ld  c,a
+       ld  b,0
+       add hl,bc
+       ld  a,(hl)
+       ld  (wsmc1+1),a
+       ld  (wsmc2+1),a
+       ld  hl,(PutWhere)
+
+       ld  a,e
+       add a,a
+       add a,a
+       add a,a
+
+       rl  b
+       add a,a
+       rl  b
+       srl d
+       srl d
+       srl d
+       add a,d
+       jr  nc,n1
+       inc b
+n1:    ld  c,a
+       add hl,bc
+
+       ld  d,(ix)
+       ld  b,(ix+1)
+woloop:        psh bc                  ;Save # of rows
+       psh hl                  ;Save screen address
+       ld  b,d                 ;Load width
+       ld  c,(ix+2)            ;Load one line of image
+       inc ix
+wsmc1: ld  a,1                 ;Load pixel mask
+wiloop:        sla c                   ;Test leftmost pixel
+       jr  nc,wnoplot          ;See if a plot is needed
+       ld  e,a                 ;OR pixel with screen
+       or  (hl)
+       ld  (hl),a
+       ld  a,e
 wnoplot:
        rrca
-       jr       nc,wnotedge                ;Test if edge of byte reached
-       inc      hl                         ;Go to next byte
+       jr  nc,wnotedge         ;Test if edge of byte reached
+       inc hl                  ;Go to next byte
 wnotedge:
-wsmc2: cp       1
-       jr       z,wover_1
-
-       djnz     wiloop
-       pop      hl                         ;Restore address
-       ld       bc,16                      ;Go to next line
-       add      hl,bc
-       pop      bc                         ;Restore data
-       djnz     woloop
+wsmc2: cp  1
+       jr  z,wover_1
+
+       dnz wiloop
+       pop hl                  ;Restore address
+       ld  bc,16               ;Go to next line
+       add hl,bc
+       pop bc                  ;Restore data
+       dnz woloop
        ret
 wover_1:
-       ld       c,(ix+2)
-       inc      ix
-       djnz     wiloop
-       dec      ix
-       pop      hl
-       ld       bc,16
-       add      hl,bc
-       pop      bc
-       djnz     woloop
+       ld  c,(ix+2)
+       inc ix
+       dnz wiloop
+       dec ix
+       pop hl
+       ld  bc,16
+       add hl,bc
+       pop bc
+       dnz woloop
        ret
 
 ;------------------------------------------------------------------------------
@@ -2948,13 +3054,13 @@ spr_icon00:
        .db %10101010,%10101010 ; █ █ █ █ █ █ █ █
 spr_icon01:
        .db 16,7        ;armor  ; .......:.......:
-       .db %10001111,%10000000 ; █   █████
-       .db %10010000,%01000000 ; █  █     █  ▒▒▒
-       .db %10101110,%00100000 ; █ █ ███   █ ▒▒▒
-       .db %10100111,%10100000 ; █ █  ████ █ ▒▒▒
-       .db %10101110,%00100000 ; █ █ ███   █ ▒▒▒
-       .db %10010000,%01000000 ; █  █     █  ▒▒▒
-       .db %10001111,%10000000 ; █   █████
+       .db %10000111,%11110000 ; █    ███████
+       .db %10011000,%00001100 ; █  ██       ██
+       .db %10110011,%11000110 ; █ ██  ████   ██
+       .db %10110000,%11110110 ; █ ██    ████ ██
+       .db %10110011,%11000110 ; █ ██  ████   ██
+       .db %10011000,%00001100 ; █  ██       ██
+       .db %10000111,%11110000 ; █    ███████
 spr_icon02:
        .db 16,7        ;torpedo  .......:.......:
        .db %10111000,%00010101 ; █ ███      █ █ █
@@ -2997,10 +3103,10 @@ spr_dividerline:
 
 ;---------------------------- texts -------------------------------------------
 
-txt_about:     .db " v0.95.A22",127,"by Shiar",0
+txt_about:     .db " v0.96.A30",127,"by Shiar",0
 txt_email:     .db "shiar0@hotmail.com",0
-txt_menu1:     .db "CONTINUE",0
-txt_menu2:     .db "NEW GAME",0
+txt_menu1:     .db "NEW GAME",0
+txt_menu2:     .db "CONTINUE",0
 
 txt_level:     .db "LEVEL ",0
 txt_gameover:  .db "GAME OVER!",0
@@ -3015,28 +3121,30 @@ txt_teacherans: .db Lneg,"14.2063168184",0
 ;---------------------------- save data ---------------------------------------
 
 PutWhere       .dw GRAPH_MEM           ;where to put the wide sprites
-level          .db $00                 ;level number
-levelp         .dw $0000               ;pointer to level data
-
-score          .dw $0000
+laserlasts     .db 5
 
-stored_data_start:
+storehi_start:
 hiscore                .dw $0000
-hiname         .db "Shiar.95",0
-stored_data_end:
+hiname         .db "Shiar.96",0
+storehi_end:
+
+storesave_start:
+level          .db $01                 ;level number
+levelp         .dw XLlevelsdata+4      ;pointer to level data
+pickuptimer    .db $04                 ;counts when to place a pickup
+score          .dw $0000
 
 your_pickup    .db $00
 your_occ       .db $00                 ;0=normal 1..16=exploding
 your_inv       .db $00                 ;invincibility left
-your_armor     .db $05                 ;HP left
-your_lives     .db $00                 ;
+your_armor     .db $0a                 ;HP left
+your_lives     .db $03                 ;
 
-your_weapon    .db $00                 ;laser avail: 0=no, 1=yes
+your_weapon    .db $02                 ;laser avail: 0=no, 1=yes
 your_multiples .db $00                 ;multiples present
 torp_occ       .db $00                 ;torp.state: 0=unavail 1=avail 2=presnt
 torp_pos       .dw $0000               ;torpedo position (x,y)
-
-#include nemesis0.z80
+storesave_end:
 
 ;----------------------------- logo -------------------------------------------
 
@@ -3069,58 +3177,6 @@ logo_nemesis:
 
 ;------------------------------------------------------------------------------
 
-; 0.94.A08 -- 08.X.99 -- size 4531 (4456)
-;
-;      + starfield background scrolling left (2 layers (front and back))
-;      * enemies aim their bullets towards you: 5 different directions!
-;      # removed some unintended <add a,a> instructions
-;      * gamefield is now white on black instead of normal black on white!
-;      + enemies can also move slowly, fast, very fast, or 1st fast then slow
-;      # you can't fire when you're exploding
-;      + GROUND scrolling at bottom. You die if you hit the ground (!!!)
-;        (unlike the ground in version 0.925test there are NO bugs)
-;      + ceiling scrolling at top, just like the ground
-;      * ground and ceiling profile are different each level
-;      * ground and/or ceiling can be non-present (speeding up cause skipped)
-;      # no more BIG crash if enemies fire too much bullets ( >10)
-;      + frequency of enemies firing bullets differs per level
-;      * stars scroll at alternate speeds, different than any ship/pick (3/4)
-;      + special effect displaying titlescreen (stole from Spaze Invaders'83)
-;      * enemies can fire either directly on entering the level, or not
-;      + "tunnel" (playfield) can narrow/grow at random (depending on level)
-;      * minimum size of "tunnel" can be different per level
-;      + menu at startup. select "NEW GAME" and "LOAD GAME" with up/down
-;      - nemesis doesn't use the SpazeInvaders effect anymore (took too long)
-;      + choosing new game will display a demo first (text will be displayed
-;        with special effect [SI] saying the storyline will come soon)
-;      * levels altered to be more challenging and different (seven levels)
-;      # the usual bugs that come with new features removed (i think?)
-;      * you get 5 shield-points at start and after death
-;
-; 0.95.A13 -- 13.X.99 -- size 4656
-;
-;      + BOSSES! at the end of a level a huge enemy will appear
-;      * bosses will move towards you, slowly. level=done when boss destroyed
-;      + normal enemies can also try to ram your ship (like bosses do)
-;      * when colliding with an enemy, his armor will decrease (if any)
-;
-; 0.95.A17 -- 17.X.99 -- size 4965
-;
-;      # fix: bullets at right side weren't removed on time (1pix too late)
-;      * each level has it's own boss
-;      + your bullets can have different speeds/directions
-;      + third icon selects bullet-upgrade: single, faster, double, triple
-;      * number of bullets varies per bullet-class (type 1 is max. 2 bullets)
-;      * all temp. vars are stored in TEXT_MEM and TEXT_MEM2 (anti-crash:)
-;
-; 0.95.A18 -- 18.X.99 -- size 5052
-;
-;      # vertical line next to score at game over screen removed (minor)
-;      # some unintended pixels at icon bar now gone (joy, joy)
-;      # number of bullets of a new weapon is loaded correctly
-;      # cleans GRAPH_MEM (Graph-screen) and TEXT_MEM (calculate screen)!
-;      # data not stored at TEXT_MEM2 but now at _asm_exec_ram+5100
-;
 ; 0.95.A22 -- 22.X.99 -- size 5321
 ;
 ;      * total size of enemy-sprites can now be 510 bytes (space = doubled!)
@@ -3137,7 +3193,27 @@ logo_nemesis:
 ;        spread all over screen. y is still random and changes during game
 ;      * make_random functions smaller and used by different procs
 ;      # MAJOR BUG! a "random" value was placed somewhere in mem thus
-;        creating bugs like unexplained loss of armor and stuff!
+;        creating bugs like unexplained loss of armor and stuff! (I think)
+;
+; 0.96.A31 -- 31.X.99 -- size 4836 + 888
+;
+;      # if you were hit when armor-icon selected, prog did weird stuff
+;      + armor-bar (shows armor as a black line left at bottom)
+;      # bugs involving armor-bar changing armor to a wrong value
+;      # YES!!! the saving-bugs were caused by mmldir: it reset all data
+;        at mem $8000, so data is now stored at asmexecram+6000 instead!
+;      * external levels. All leveldata is loaded from "nemesis0"-var
+;      * some optimization (like cal\ret>jp + unused code removed/shortened)
+;      * storyline is loaded from level-file (will be compressed later..)
+;      + story can be _between_ levels, not only at the start of a new game
+;      * "new game" and "continue" in main menu are swapped (new comes 1st)
+;      * enemy bullets can do more than one damage: differs per level
+;      * collision does 4 damage, ground does 5, you start with 12 armor
+;      # running the level-file no longer crashes your calc but just returns
+;      * you now move 1.5 pixels per frame! this way you can outrun enemies
+;      * hellofajob but enemy-data is now stored at one location in 6 bytes,
+;        instead of two 4-byte spaces 40 bytes apart! (cleaner code; faster)
+;      * ground/ceiling/stars are continued when at boss (c00l level 3 boss)
 ;
 ;
 ;       + added        - removed       * changed       # bug fixed
index ca96ca6462408c55f7fad08f6e1611728be40fe5..93816e97e39f5d10b59ae7d4326ab2804fa6b39b 100644 (file)
-;---------------------------- enemy data --------------------------------------
-
-sprites:
-       .db $00
-       .db (spr_enemy01-spr_enemy00)/2
-       .db (spr_enemy02-spr_enemy00)/2
-       .db (spr_enemy03-spr_enemy00)/2
-       .db (spr_enemy04-spr_enemy00)/2
-       .db (spr_enemy05-spr_enemy00)/2
-       .db (spr_enemy06-spr_enemy00)/2
-       .db (spr_enemy07-spr_enemy00)/2
-       .db (spr_boss01 -spr_enemy00)/2
-       .db (spr_boss02 -spr_enemy00)/2
-       .db (spr_enemy08-spr_enemy00)/2
+;header:----------------------------------------------------------------------
+
+       .db $c9,0                       ;ret \ nop = nemesis-header
+       .dw lend-lstart                 ;levelsdata-size = 134h = 308d < 505d
+
+;XLlevelsdata:----------------------------------------------------------------
+
+;format:[enemy nr] [enemy frequency] [next lvl] [level_info] [level_move]
+;      [level_fire] [tunnel size] [groundtype] [16_ground] [16_ceiling]
+;      [stars1] [stars2]
+
+lstart:
+       .db 0
+       .db $21,$1d,"Cosmic year 6716"          ,0,0,$1d,$06
+       .db $1b,$1d,"storyline coming soon..."  ,0,0,$1d,$06
+       .db $09,$19,"the Nemesis saga continues",0,1
+       .db $2e,$21,"with NEMESIS 86"           ,0,1
+       .db $52,$36,"by Shiar"                  ,0,0,$19,$23
+       .db $ff
+
+       .db $15,$07,$08                 ;fireFreq; moveType; enemyType
+level01:                               ;efrequency must be odd if halfluring!
+       .db $01,$1b,$2f,%00010001,0,255,0,0 ;0f>>2f             ; 7
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1                     ;16
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1                     ;16
+       .db 1,1                                                 ; 2
+       .db $10,$07,$09                                         ; 3
+
+       .db 0
+       .db $01,01,"And the storyline conti",
+                       .db "nues.....",0,1
+       .db $01,09,"You decide to fly close",
+                       .db " to the",0,1
+       .db $01,15,"surface of a nearby pl",
+                       .db "anet =)",0,0,1,20
+       .DB $FF
+
+       .db $10,$07,$09                                         ; 3
+level02:                                                       ;44
+       .db $02,$13,$4b,%00100101,0,064,0,0
+       .db 1,2,3,4,5,6,6,5,4,3,4,5,4,3,2,1
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
+       .db $0E,$07,$09
 
-spr_enemy00:
-       .db 7,5                         ;pickup
-       .db %11111110                   ; ███████
-       .db %11111110                   ; ███████
-       .db %11000110                   ; ██   ██
-       .db %11111110                   ; ███████
-       .db %11111110                   ; ███████
        .db 0
+       .db $01,01,"Blablabla...",0,1
+       .db $01,34,"this storyline sux",0,0,1,39
+       .DB $FF
+
+       .db $0E,$07,$09
+level03:
+       .db $03,$2d,$3f,%00000110,0,255,-9,1
+       .db 3,2,4,3,2,2,1,1,1,1 ,1,1,21,17,18,20
+       .db 1,1,1,1,1,1,1,3,6,12,9,1,21,19,18,18
+       .db -1,-1
+
+       .db $0D,$07,$08
+level04:
+       .db $04,$11,$41,%00000001,0,057,0,0
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
+       .db $0C,$07,$09
+level05:
+       .db $05,$11,$45,%00000101,%10,031,-7,1
+       .db 14,12,11,9,10,7,7,5,4,3,4,4,2,3,1,2
+       .db 1, 1, 1, 1,1, 1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
+       .db $0B,$07,$08
+level06:
+       .db $06,$19,$3a,%00000111,0,255,-4,1
+       .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
+       .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
+
+       .db $08,$07,$09
+level07:
+       .db $07,$09,$ff,%00000001,0,043,0,0
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
+       .db 1,1
+lend:
+
+;XLweapondata:----------------------------------------------------------------
+
+;format:[unused] [ybuls(max.bullets)] [0000:direction 0000:speed] [offset]
+
+       .db 0,3,%00000010,2,%00000000,0,%00000000,0     ;single fire
+       .db 0,3,%00000011,2,%00000000,0,%00000000,0     ;fast single fire
+       .db 0,6,%00000010,0,%00000010,5,%00000000,0     ;double fire
+       .db 0,9,%00010010,2,%00110010,2,%01000010,2     ;triple fire
+       .db 0,10,%00010011,2,%00110011,2,%01000011,2    ;triple fire
+       .db 0,10,%00010011,2,%00110011,2,%01000100,2    ;triple fire
+       .db 0,10,%00010100,2,%00110100,2,%01000101,2    ;triple fire
+       .db 0,10,%00010100,2,%00110100,2,%01000101,2    ;triple fire
+
+;XLenemytable:----------------------------------------------------------------
+
+       .db $00                         ;00
+       .db (spr_enemy01-spr_enemy00)/2 ;01
+       .db (spr_enemy02-spr_enemy00)/2 ;02
+       .db (spr_enemy03-spr_enemy00)/2 ;03
+       .db (spr_enemy04-spr_enemy00)/2 ;04
+       .db (spr_enemy05-spr_enemy00)/2 ;05
+       .db (spr_enemy06-spr_enemy00)/2 ;06
+       .db (spr_enemy07-spr_enemy00)/2 ;07
+       .db (spr_boss01 -spr_enemy00)/2 ;08
+       .db (spr_boss02 -spr_enemy00)/2 ;09
+       .db (spr_enemy08-spr_enemy00)/2 ;0A
+       .db (spr_enemy00-spr_enemy00)/2 ;0B
+       .db (spr_enemy00-spr_enemy00)/2 ;0C
+       .db (spr_enemy00-spr_enemy00)/2 ;0D
+       .db (spr_enemy00-spr_enemy00)/2 ;0E
+       .db (spr_enemy00-spr_enemy00)/2 ;0F
+
+;XLenemyinfos:----------------------------------------------------------------
+
+;format: [000000:HP 00:occ] [type] [appearance(ypos)] [unused]
+
+       .db %00000010,1,1,0     ;#1     HP:1    app:random
+       .db %00000010,2,3,0     ;#2     HP:1    app:halflure
+       .db %00001111,3,2,0     ;#3     HP:1    app:lure
+
+       .db %00000110,4,2,0     ;#4     HP:2    app:lure
+       .db %00000111,5,3,0     ;#5     HP:2    app:random      moving
+       .db %00001011,6,2,0     ;#6     HP:3    app:lure        moving
+
+       .db %00011011,7,3,0     ;#7     HP:7    app:halflure    moving
+
+       .db %00110011,8,1,0     ;boss1
+       .db %00111011,9,3,0     ;boss2
+
+       .db %00000000,0,0,0
+       .db %00000000,0,0,0
+       .db %00000000,0,0,0
+       .db %00000000,0,0,0
+       .db %00000000,0,0,0
+       .db %00000000,0,0,0
+       .db %00000000,0,0,0
+
+;XLsprenemies:----------------------------------------------------------------
+
+spr_enemy00:
+       .db 8,8                         ;pickup
+       .db %00011000                   ;    ██
+       .db %00011000                   ;    ██
+       .db %00011000                   ;    ██
+       .db %11111111                   ; ████████
+       .db %11111111                   ; ████████
+       .db %00011000                   ;    ██
+       .db %00011000                   ;    ██
+       .db %00011000                   ;    ██
 
 spr_enemy01:
        .db 6,6                         ;enemy type one
@@ -109,90 +239,12 @@ spr_enemy08:
        .db 8,6         ;enemy type eight
        .db %00011110   ;    ████
        .db %01111111   ;  ███████
-enemy00:.db %10011100  ; █  ███
+       .db %10011100   ; █  ███
        .db %10011100   ; █  ███
        .db %01111111   ;  ███████
        .db %00011110   ;    ████
 
-       ;enemyInfo:     %000000:HP %10:occ $00:type $00:app $00:unused
-enemy01:                       ;#1     HP:1    app:random
-       .db %00000010,1,1,0
-enemy02:                       ;#2     HP:1    app:halflure
-       .db %00000010,2,3,0
-enemy03:                       ;#3     HP:1    app:lure
-       .db %00001111,3,2,0
-
-enemy04:                       ;#4     HP:2    app:lure
-       .db %00000110,4,2,0
-enemy05:                       ;#5     HP:2    app:random      moving
-       .db %00000111,5,3,0
-enemy06:                       ;#6     HP:3    app:lure        moving
-       .db %00001011,6,2,0
-
-enemy07:                       ;#7     HP:7    app:halflure    moving
-       .db %00011011,7,3,0
-
-boss01:
-       .db %00110011,8,1,0
-boss02:
-       .db %00111011,9,3,0
-
-;----------------------------- level info -------------------------------------
-
-       ;format: enemy nr; enemy frequency; next lvl; level_move; level_fire
-       ;tunnel size; groundtype; 17_ground; 17_ceiling; stars1; stars2
-
-       .db $15,$07,$08                 ;fireFreq; moveType; enemyType
-level01:                               ;efrequency must be odd if halfluring!
-       .db $01,$1b,$2f,%00010000,255,0,0 ;0f>>2f
-       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-       .db 1,1
-       .db $10,$07,$09
-level02:
-       .db $02,$13,$4b,%01010000,064,0,0
-       .db 1,2,3,4,5,6,6,5,4,3,4,5,4,3,2,1
-       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-       .db 1,1
-       .db $0E,$07,$09
-level03:
-       .db $03,$2d,$3f,%01100000,255,-9,1
-       .db 3,2,4,3,2,2,1,1,1,1 ,1,1,21,17,18,20
-       .db 1,1,1,1,1,1,1,3,6,12,9,1,21,19,18,18
-       .db -1,-1
-
-       .db $0D,$07,$08
-level04:
-       .db $04,$11,$41,%00010000,057,0,0
-       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-       .db 1,1
-       .db $0C,$07,$09
-level05:
-       .db $05,$11,$45,%01010010,031,-7,1
-       .db 14,12,11,9,10,7,7,5,4,3,4,4,2,3,1,2
-       .db 1, 1, 1, 1,1, 1,1,1,1,1,1,1,1,1,1,1
-       .db 1,1
-       .db $0B,$07,$08
-level06:
-       .db $06,$19,$3a,%01110000,255,-4,1
-       .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
-       .db 20,22,18,15,9,1,1,1,1,1,1,1,1,1,1,1
-       .db 1,1
-
-       .db $08,$07,$09
-level07:
-       .db $07,$09,$ff,%00010000,043,0,0
-       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-       .db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
-       .db 1,1
-
-weapons:
- .db 0,3,%00000010,2,%00000000,0,%00000000,0   ;single fire
- .db 0,3,%00000011,2,%00000000,0,%00000000,0   ;fast single fire
- .db 0,6,%00000010,0,%00000010,5,%00000000,0   ;double fire
- .db 0,9,%00010010,2,%00110010,2,%01000010,2   ;triple fire
- .db 0,10,%00010011,2,%00110011,2,%01000011,2  ;triple fire
- .db 0,10,%00010011,2,%00110011,2,%01000100,2  ;triple fire
- .db 0,10,%00010100,2,%00110100,2,%01000101,2  ;triple fire
+;-----------------------------------------------------------------------------
 
+       .end
+.end
\ No newline at end of file