wormy 0.98.227
[wormy.git] / wormy.z80
index 18efe0cc6bdaff4a1d604d71d9d796c39e14fccf..0aba3e5c163e710a33901241408092ec0724e774 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
 ;    �����     �����       �������     ��       ���              �����������
 ;_______________________________________________________________________________
 ;
 ;    �����     �����       �������     ��       ���              �����������
 ;_______________________________________________________________________________
 ;
-; Version                  :                                      97% (0.97.116)
-; Release Date             :                                     2002 January 16
+; Version                  :                                      98% (0.98.227)
+; Release Date             :                                    2002 February 27
 ; Author(s)                :                                               Shiar
 ; Email Address            :                                     wormy@shiar.org
 ; Web Page                 :                                       www.shiar.org
 ; Author(s)                :                                               Shiar
 ; Email Address            :                                     wormy@shiar.org
 ; Web Page                 :                                       www.shiar.org
-; Description              :       perfect Nibbles game with free movement, nine
-;                                                    game modes, for 1-4 players
-; Where to get this game   :                                       www.shiar.org
+; Description              :  perfect Nibbles game with free movement, nine game
+;                                 modes, for 1-4 players, many levels and editor
+; Where to get this game   :                                     wormy.shiar.org
 ; Other games by author(s) :                                        Nemesis beta
 ; Additional Credits to    : Matthew Shepcar  :   wrote original Peaworm, end'98
 ;                            Jonah Cohen      :              helped writing worm
 ; Other games by author(s) :                                        Nemesis beta
 ; Additional Credits to    : Matthew Shepcar  :   wrote original Peaworm, end'98
 ;                            Jonah Cohen      :              helped writing worm
 ;                            wormy.86p (6512) : efef32a8c541b4585087f55deb31f51d
 ;_______________________________________________________________________________
 
 ;                            wormy.86p (6512) : efef32a8c541b4585087f55deb31f51d
 ;_______________________________________________________________________________
 
-;--- notes ---
-
-;     * Use for LEARNING practises ONLY!
-;        Don't _ever_ release altered code w/o permission!
-;         Please notify me of using code, and give me credits!
-;     * Code was originally by Scabby (Matthew Shepcar),
-;        a few lines by Jonah Cohen,
-;         and everything else by me - Shiar (Mischa Poslawsky).
-;     * Although I've commented & labeled quite some stuff, I can't guarantee
-;        everybody will understand it. This is probably not the best source
-;         to learn z80 from. w00t the Shyer Way (tm).
-;     * Also read wormy.txt please, thank you
-;     * Don't scroll down if you get scared easily.
+;--- notes ---------------------------------------------------------------------
+
+; * Game README is wormy.txt
+;  * Use for LEARNING practises ONLY!
+;   * Don't _ever_ release altered code w/o permission!
+;    * Give me credits when you use any of this stuff
+;     * I'm not responsible for any damage this might cause, yada yada...
+;      * Although I've commented & labeled quite some stuff, due to
+;         crazy optimizations and weird coding, it may be harder to
+;          understand than the average blob of code. This is probably _not_
+;           the best source to learn z80 from. w00t the Shyer Way (tm).
+;          * Email me. If you've got suggestions, tell me.
+;           * Don't scroll down if you get scared easily.
+
+;--- index ---------------------------------------------------------------------
+
+;-* TO_DO
+; | future features
+;--* #INCLUDE
+;---* STORAGE
+;   | permanent
+;   | temporary
+;   | layout
+;----* PROG_START
+;    | search levels
+;-----* LEV_SELECT
+;------* MORE_INIT
+;      | trig tables
+;-------* MAIN_MENU
+;       | draw menu
+;       | options menu
+;       | main menu
+;       | display current settings
+;       | handle menukeys
+;       | change name
+;--------* MISC_PROCS
+;---------* START_GAME
+;         | link
+;         | client
+;         | set/send worms
+;         | host
+;         | load game
+;         | draw level
+;         | prepare
+;----------* GAME_LOOP
+;-----------* KEYS
+;           | pause menu
+;------------* GAME_OVER
+;            | who won?
+;            | display worms
+;            | quit
+;-------------* WORM_STUFF
+;--------------* WORM_ALIVE
+;              | move worm
+;              | draw worm
+;---------------* BOUNCYBALL
+;----------------* WORMY_HIT
+;                | multifood
+;                | ctf
+;                | main
+;                | foodmatch|SP
+;                | take pea
+;                | misc
+;-----------------* PROCS
+;------------------* SCORE
+;-------------------* DISPLAY
+;--------------------* DRAW
+;                    | pixel
+;                    | findpixel
+;                    | objects
+;                    | circle
+;                    | box
+;                    | fatline
+;                    | line
+;---------------------* LINK!
+;                     | multiple bytes
+;                     | foo
+;                     | send
+;                     | recv
+;                     | common
+;----------------------* INT_LEVELS
+;-----------------------* DATA
+;                       | graphics
+;                       | menus
+;                       | text
+;                       | foo
+;                       | game settings
+;------------------------* THAT'S_ALL
 
 ;_______________________________________________________________________________
 ; _______  _____       ______   _____
 
 ;_______________________________________________________________________________
 ; _______  _____       ______   _____
 ;    |    |_____| ____ |_____/ |_____|
 ;_______________________________________________________________________________
 
 ;    |    |_____| ____ |_____/ |_____|
 ;_______________________________________________________________________________
 
-; 97% = DONE
-;     X [15] lives >9 dispay
-;     X [15] sp modes not configurable
-;     X [16] LVL: episode #2: 10 sp levels
-;     X [17] lives stats for every liveslimited game (also !dm)
-;     X [18] LINK: fix transmit game/level data
-;     X [19] datalevels+nrlevels not in program if !intlevels
-;     X [19] mem at worm #4 (still 12 bytes or so.. or more? or less?)
-;     X [19] alter level editor to use new address and set level id #97
-;     X [19A] team score!
-;     X [19A] autogrowth doesn't always work -> init (turn)
-;     X [111] ED: disabled objects counted causing CRASH when writing hiscore!
-;     X [111] LINK: init+multiple pea transmit seems to work..
-;     X [111] LINK: host/client swapped (host now sends level config)
-;     X [111] LINK: optimize transmit (most initcode same for client+host)
-;     X [113] menu limit in multifm not x10
-;     X [113] wormhit procedure seperate (called now)
-;     X [114] LINK: peas sent again :P
-;     X [114] internal level check and sprite storage removed
-;     X [115] layout data stuff at bottom
-;     X [115] ED: init place bar fixed
-;     X [115] ED: keys also usable together with mouse
-;     X [115] ED: improved version handling
-;     X [115] LINK: receive message not needed anymore afaik
-;     X [115A] $D8 used for spacing at g/o screen. i rule B)
-;     X [115A] exit at g/o goes back to menu
-;     X [115A] more in menu lets you reselect the levelfile
-;     X [115A] LINK: fixed waiting mode (minor display problem)
-;     X [116] incs at skiplevels effectively replaced by add (-4 bytes)
-;     X [116] another 2 bytes shaved off
-;     X [116] LINK: received gamemode now displayed correctly at g/o
-;     X [116] gamecar right after gametype saves about 20 bytes
-;     X [116] LINK: minimize sent data
-;     X [116] remove +input in worm storage
-;     X [116] head position init uses same data as tail (-4 bytes)
-;     * word-value display storage in chartable hole??
-;  1% * misc (bugs, &&&, pollish, &&, &)
-;     * look at init-z in line routine again
-;     * rare pea|wall overwrite <- apply stopworm fix?
+; 98% = CURRENT
+;     X [119] ED: new 53 file format with support for 128 objects instead of 32
+;     X [119] LVL: episode #4: 10 hard sp levels (ordered XO-XO-XO-X)
+;     X [120] fixed greymask (and it now ands instead of ors)
+;     X [120] fixed growth set after death
+;     X [121] fixed linkplay (couldn't turn it on anymore..)
+;     X [121] LVL: Wormage + Wormage ][ (2x 10 sp levels)
+;     X [121] pea randomizer doesn't give x>128
+;     X [121] mixed single-/multipea singleplayer levels (re)set correctly
+;     X [126] circles left|above 0,0 drawn correctly now!
+;     X [126] fixed multiple pages of levelfiles
+;     X [29]  optimized a few more bytes (less empty bytes so prettier binary ;)
+;     X [225] ED: ctf/race level copy/move fix
+;     X [225] LVL: episode #1: 5 ctf+5 race; episode #3 removed (all in #1 now)
+;     X [225] add v2 id (yas2)
+;     X [227] redundant calls removed or moved
+;     X [227] fixed: ctf score increased by taking _any_ pea
+;     X [227] no more points in race for dieing on the second half
+;     X [227] no score decrease for dieing in race (no longer needed, see above)
 ;  1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh*
 ;  1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh*
-;     * LVL: episode #3: at least 5 lvls for each mp mode
-;     * LVL: episode #4: 10 sp levels, including multipeas
-;  1% * LVL: episode #5: ...
-;     * LVL: Wormage
+;     * LVL: episode #5: 10 easy sp levels (do i _have_ to?)
+;     * LVL: Eric's Yumworms (ep#5?)
 ;     * LVL: Free Bird
 ;     * LVL: Jonah?
 ;     * LVL: Free Bird
 ;     * LVL: Jonah?
+;     * scorebar last digit (at 128-3) not displayed by _vputs
+;  1% * fix any bugs that come up
+
+;--- future features -----------------------------------------------------------
+
+;just a maybe-list; NO guarantees!
 ;
 ;
-;100% = bugs fixed + levels done
-;     * correct team winners
-;     * arrow to offscreen peas
-;110% * sound
-;     * startpos
-;120% * coop (DON'T COUNT ON IT)
-;     * pause in linkplay
+; * correct team winners
+;  * level compression
+;   * ubersized bouncies ;)
+;    * arrow to offscreen peas
+;     * w00t AI
+;      * sound
+;       * startpos
+;        * pause in linkplay
+;         * coop (DON'T COUNT ON IT)
 
 ;_______________________________________________________________________________
 ;  _/_/_____ __   _ _______        _     _ ______  _______
 
 ;_______________________________________________________________________________
 ;  _/_/_____ __   _ _______        _     _ ______  _______
@@ -131,11 +192,11 @@ _MOV4B             = $429B ;4x ld (de),(hl)
 _MOV5B             = $4297 ;5x ld (de),(hl)
 _mov9b             = $4283 ;9x ld (de),(hl)
 _ldHLind           = $4010 ;ld hl,(hl)
 _MOV5B             = $4297 ;5x ld (de),(hl)
 _mov9b             = $4283 ;9x ld (de),(hl)
 _ldHLind           = $4010 ;ld hl,(hl)
-_swapt_            = $45F3 ;ex_ahl_bde
+_swapt_            = $45F3 ;ex ahl,bde (doesn't work?)
 _Get_Word_ahl      = $521D ;ld de,(ahl)
 _Set_Word_ahl      = $5221 ;ld (ahl),de
 _Get_Word_ahl      = $521D ;ld de,(ahl)
 _Set_Word_ahl      = $5221 ;ld (ahl),de
-_INC_PTR_AHL       = $4637 ;ahl=ahl+1
-_AHL_PLUS_2_PG3    = $4C3F ;ahl=ahl+2
+_INC_PTR_AHL       = $4637 ;inc ahl
+_AHL_PLUS_2_PG3    = $4C3F ;add ahl,2
 _SET_ABS_SRC_ADDR  = $4647 ;set source for mm.ldir =ahl
 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
 _SET_ABS_SRC_ADDR  = $4647 ;set source for mm.ldir =ahl
 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
@@ -150,15 +211,19 @@ _writeb_inc_ahl    = $5567 ;ld (ahl++),c
 _jforce            = $409C ;TI-OS stack restored
 _EXLP              = $4493 ;swap (hl),(de) b times
 _GETB_AHL          = $46C3 ;a=(ahl) \ hl=ahl
 _jforce            = $409C ;TI-OS stack restored
 _EXLP              = $4493 ;swap (hl),(de) b times
 _GETB_AHL          = $46C3 ;a=(ahl) \ hl=ahl
+_OP1TOOP6          = $4263
 
 
- #define buffer     ;use display buffer (otherwise write directly to screen)
- #define readymask  ;"greys" out the field before starting a level
- #define coolzgfx   ;nice graphics for game over screen
+ #define id2        ;yas2 level identifier - this'll add (65) bytes
+ #define buffer     ;use display buffer, otherwise write directly to screen (11)
+ #define readymask  ;"greys" out the field before starting a level (20)
+;#define readytext  ;-displays "prepare" before level starts (42)
+ #define coolzgfx   ;nice graphics for game over screen (98)
  #define spprotect  ;options not changable for singleplayer modes
 ;#define intlevels  ;-internal levels
  #define spprotect  ;options not changable for singleplayer modes
 ;#define intlevels  ;-internal levels
-;#define readytext  ;-displays "prepare" before level starts
-;#define invincible ;-worms cannot die =)
-;#define optdie     ;-in race games worms dont die when they run into each other
+                    ;-to become invincible, define the magic word :D
+
+levelhead   = 'w'
+levelhead2  = 97 ;wormy levels header = "0"
 
 ;_______________________________________________________________________________
 ; _______ _______  _____   ______ _______  ______ _______
 
 ;_______________________________________________________________________________
 ; _______ _______  _____   ______ _______  ______ _______
@@ -166,7 +231,7 @@ _GETB_AHL          = $46C3 ;a=(ahl) \ hl=ahl
 ; ______|    |    |_____| |    \_ |     | |_____| |______
 ;_______________________________________________________________________________
 
 ; ______|    |    |_____| |    \_ |     | |_____| |______
 ;_______________________________________________________________________________
 
-;--- permanent ---
+;--- permanent -----------------------------------------------------------------
 
 ScrBuffer   = $8420 ;-A3FF (20*FF=1FE0)
 worm4p      = $A400 ;-A5FF (200)      %101001O0
 
 ScrBuffer   = $8420 ;-A3FF (20*FF=1FE0)
 worm4p      = $A400 ;-A5FF (200)      %101001O0
@@ -179,7 +244,7 @@ worm3       = $AD3D ;-AD5A (1E)
 worm4       = $AD5B ;-AD78 (1E)
 balls       = $AD79 ;-AE00 (<=3x2D) (bb<=45)
 turn10      = $AE01 ;-AE01 (1)     (counter)
 worm4       = $AD5B ;-AD78 (1E)
 balls       = $AD79 ;-AE00 (<=3x2D) (bb<=45)
 turn10      = $AE01 ;-AE01 (1)     (counter)
-peaspos     = $AE02 ;-AF05 (4-260)    (peas)
+peaspos     = $AE02 ;-AF05 (4-104)    (peas)
 ;free       = $AF06 ;-AFFF (F9)
 worm1p      = $B000 ;-B7FF (800)      %1011O000
 worm3p      = $B800 ;-BBFF (400)      %10111O00
 ;free       = $AF06 ;-AFFF (F9)
 worm1p      = $B000 ;-B7FF (800)      %1011O000
 worm3p      = $B800 ;-BBFF (400)      %10111O00
@@ -197,7 +262,7 @@ defspr      = $F078 ;-F07F (8)
 ;   |..[------]||[]|......[-----]|[].| ;if you still understand    < OUTDATED <
 ;   |   SCREEN 2* 13      PRGM   4LV | ;after looking at this
 
 ;   |..[------]||[]|......[-----]|[].| ;if you still understand    < OUTDATED <
 ;   |   SCREEN 2* 13      PRGM   4LV | ;after looking at this
 
-;--- temporary ---
+;--- temporary -----------------------------------------------------------------
 
 namelength  = $BC00 ;(1)         @menu
 datalink    = $BC00 ;(8)        @init
 
 namelength  = $BC00 ;(1)         @menu
 datalink    = $BC00 ;(8)        @init
@@ -211,9 +276,9 @@ lefttotalb  = $BF91 ;(1)         @game
 drawctfpea1 = peaspos+4
 drawctfpea2 = peaspos+6
 
 drawctfpea1 = peaspos+4
 drawctfpea2 = peaspos+6
 
-;--- layout ---
+;--- layout --------------------------------------------------------------------
 
 
-;(wormN)             set:
+;(wormN)      offs:  set:
 heading     =   0   ;level*
 pos         =   2   ;level*
 pos2        =   4   ;level
 heading     =   0   ;level*
 pos         =   2   ;level*
 pos2        =   4   ;level
@@ -244,9 +309,18 @@ wormsize    =   30 ;^mark^
 start:         ;turn back NOW!
   nop      ;and so it begins...
   jp  Start
 start:         ;turn back NOW!
   nop      ;and so it begins...
   jp  Start
+#ifndef id2
   ld  bc,$5242
   rst 10h
  .dw  WormIcon
   ld  bc,$5242
   rst 10h
  .dw  WormIcon
+#else
+  ld  (bc),a
+  nop
+  ld  d,h
+  rst 10h
+ .dw  WormIcon
+ .dw  WormData
+#endif
   ld  d,a
   ld  c,a
   ld  d,d
   ld  d,a
   ld  c,a
   ld  d,d
@@ -260,7 +334,7 @@ start:              ;turn back NOW!
  .db  %1010010
   jr  nz,$+47
   dec l
  .db  %1010010
   jr  nz,$+47
   dec l
- .db  " 97% .116",0
+ .db  " 98% .227",0
 WormIcon:
  .db  8,2
  .db  %00000000,%00111100
 WormIcon:
  .db  8,2
  .db  %00000000,%00111100
@@ -271,9 +345,54 @@ WormIcon:
  .db  %10011001,%00011001
  .db  %01000010,%11000001
  .db  %00111100,%00111110
  .db  %10011001,%00011001
  .db  %01000010,%11000001
  .db  %00111100,%00111110
-
-levelhead  = 'w'
-levelhead2 = 97 ;wormy levels header = "97"
+#ifdef id2
+WormData:
+ .db  1
+ .dw  wormlevel
+wormlevel:
+ .db  4        ;priority
+ .db  12       ;string
+ .db  "wor"    ;description
+ .dw  yasexec  ;execution routine
+ .dw  yascomment-yasdetect
+ .dw  yasdetect-$-1    ;detection routine
+ .dw  yasicon-yascomment
+ .dw  yascomment-$-1   ;comment routine
+ .dw  yasdataend-yasicon
+ .dw  yasicon-$-1      ;icon routine
+yasexec:
+  rst 10h
+  ex  de,hl
+  ld  a,b
+  cal skiptitle ;title (plus size+header <- all non-0)
+; cal skiptitle ;description
+  jp  leveldataAHL-3
+yasdetect:
+  cal _AHL_PLUS_2_PG3  ;skip past length bytes
+  cal _Get_Word_ahl
+  ld  hl,levelhead+(levelhead2*256)
+  call _cphlde
+  ret z
+  scf
+  ret
+yascomment:
+  inc hl
+  inc hl ;skip header
+  ret
+yasicon:
+  ld  hl,$F400+levelicon-yasicon
+  ld  bc,6+(256*1)
+  or  a
+  ret
+levelicon:
+ .db %00011100 ;..XXX...  ...XXX..
+ .db %00011110 ;.X...X..  ...XXXX.
+ .db %00000011 ;.X..X...  ......XX
+ .db %10000001 ;X..X..XX  X......X
+ .db %01011011 ;X..X..XX  .X.XX.XX
+ .db %01101110 ;X...XXX.  .XX.XXX.
+yasdataend:
+#endif
 
 int_handler:
   ex  af,af'
 
 int_handler:
   ex  af,af'
@@ -285,32 +404,9 @@ int_handler:
   jp  $0039
 int_end:
 
   jp  $0039
 int_end:
 
-Start:
-  ld  (SpSave),sp
-  cal _runindicoff
-  cal _flushallmenus
+;--- search levels -------------------------------------------------------------
 
 
-  im  1
-  ld  a,$D4
-  ld  h,a
-  ld  l,0 ;ld hl,$D400
-  ld  d,a
-  ld  e,1 ;ld de,$D401
-  ld  b,e
-  ld  c,l ;ld bc,$0100
-  dec a   ;ld a,$D3
-  ld  (hl),a
-  ldir
-  ld  hl,int_handler
-  ld  d,a
-  ld  e,a ;ld de,$D3D3
-  ld  bc,int_end-int_handler
-  ldir
-  inc a   ;ld a,$D4
-  ld  i,a
-  im  2 ;...it *does* work ;)
-
-restart:
+Start:
   cal _RAM_PAGE_7
   ld  hl,$BFFF ;VAT start
   ld  ix,templevels
   cal _RAM_PAGE_7
   ld  hl,$BFFF ;VAT start
   ld  ix,templevels
@@ -350,15 +446,12 @@ stringfound:
   cp  e
   jr  nz,_searchnext ;not worm
   ld  a,levelhead2
   cp  e
   jr  nz,_searchnext ;not worm
   ld  a,levelhead2
-  cp  d
+  cp  d ;=0
   jr  nz,_searchnext
   jr  nz,_searchnext
-  inc ix ;save level's ahl
-  ld a,h
-  ld (ix),a
-  inc ix
-  ld a,l
-  ld (ix),a
-  inc ix
+  ld (ix+1),h ;save level's ahl
+  ld (ix+2),l
+  ld  de,3 ;&&&d=0
+  add ix,de
 _searchnext:
   cal _RAM_PAGE_7
   jr  searchnext
 _searchnext:
   cal _RAM_PAGE_7
   jr  searchnext
@@ -412,16 +505,21 @@ levelselectmenu: ;load next page
   cal menuinvloop
   ld  hl,$FC00+$380 ;(*,56)
   cal hr
   cal menuinvloop
   ld  hl,$FC00+$380 ;(*,56)
   cal hr
-  ld  hl,$0601 ;x=1
+  ld  hl,$0C01 ;x=1
   ld  (_penCol),hl
 dispnextlevel:
   ld  de,3
   ld  (_penCol),hl
 dispnextlevel:
   ld  de,3
-  add ix,de
+  add ix,de ;goto next
   ld  a,(ix)
   ld  a,(ix)
-  ld  b,a
+  ld  h,(ix+1)
+  ld  l,(ix+2)
+  cal _load_ram_ahl ;hl=ahl
+  cal _vputs
+  ld  hl,availevels
+  inc (hl)
+  ld  a,(ix+3) ;next
   inc a ;cp 255
   jr  z,__levselect
   inc a ;cp 255
   jr  z,__levselect
-displevel:
   ld  hl,_penCol
   ld  (hl),$01 ;x=1
   inc hl
   ld  hl,_penCol
   ld  (hl),$01 ;x=1
   inc hl
@@ -430,13 +528,6 @@ displevel:
   ld  (hl),a ;y+6
   cp  49 ;bottom of screen
   jr  nc,_levselect
   ld  (hl),a ;y+6
   cp  49 ;bottom of screen
   jr  nc,_levselect
-  ld  hl,availevels
-  inc (hl)
-  ld  a,b ;(ix+0)
-  ld  h,(ix+1)
-  ld  l,(ix+2) ;ahl=(ix)
-  cal _load_ram_ahl ;hl=ahl
-  cal _vputs
   jr  dispnextlevel
 
 loadlevel1:
   jr  dispnextlevel
 
 loadlevel1:
@@ -506,7 +597,7 @@ levdescclearloop:
   cp  d ;de>$FFFF (offscreen)
   jr  nz,levdescclearloop
   cal _vputs
   cp  d ;de>$FFFF (offscreen)
   jr  nz,levdescclearloop
   cal _vputs
-  jr  levselectmenu+1
+  jr  levselectmenuloop+1
 __levselect:
 #ifdef intlevels
   ld  ix,templevels-6 ;reset 2 1st page
 __levselect:
 #ifdef intlevels
   ld  ix,templevels-6 ;reset 2 1st page
@@ -516,7 +607,7 @@ __levselect:
 _levselect:
   ld  b,-2 ;level selected
   jr  levselect
 _levselect:
   ld  b,-2 ;level selected
   jr  levselect
-levselectmenu:
+levselectmenuloop:
   psh hl
   psh bc
   cal ubergetkey
   psh hl
   psh bc
   cal ubergetkey
@@ -533,7 +624,7 @@ levselectmenu:
   sub K_EXIT-K_RIGHT
   jp  z,ExitNoStats
   inc a ;cp K_SECOND
   sub K_EXIT-K_RIGHT
   jp  z,ExitNoStats
   inc a ;cp K_SECOND
-  jr  nz,levselectmenu
+  jr  nz,levselectmenuloop
 ; jr  z,loadlevel
 
 loadlevel:
 ; jr  z,loadlevel
 
 loadlevel:
@@ -543,7 +634,7 @@ loadlevel:
   jr  z,levelloaded
 #endif
   cal skiptitle ;skip description
   jr  z,levelloaded
 #endif
   cal skiptitle ;skip description
-
+leveldataAHL:
   cal _Get_Word_ahl
   ld  (leveldataSize),de
 
   cal _Get_Word_ahl
   ld  (leveldataSize),de
 
@@ -575,6 +666,36 @@ leveldataSize =$-2
 levelloaded:
   cal _RAM_PAGE_1
 
 levelloaded:
   cal _RAM_PAGE_1
 
+;_______________________________________________________________________________
+; _______  _____   ______ _______       _____ __   _ _____ _______
+; |  |  | |     | |_____/ |______         |   | \  |   |      |
+; |  |  | |_____| |    \_ |______ _____ __|__ |  \_| __|__    |
+;_______________________________________________________________________________
+
+  ld  (SpSave),sp
+  cal _runindicoff
+  cal _flushallmenus
+
+  im  1
+  ld  a,$D4
+  ld  h,a
+  ld  l,0 ;ld hl,$D400
+  ld  d,a
+  ld  e,1 ;ld de,$D401
+  ld  b,e
+  ld  c,l ;ld bc,$0100
+  dec a   ;ld a,$D3
+  ld  (hl),a
+  ldir
+  ld  hl,int_handler
+  ld  d,a
+  ld  e,a ;ld de,$D3D3
+  ld  bc,int_end-int_handler
+  ldir
+  inc a   ;ld a,$D4
+  ld  i,a
+  im  2 ;...it *does* work ;)
+
   res 2,(iy+13) ;appAutoScroll
   ld  a,r
   ld  (Seed),a
   res 2,(iy+13) ;appAutoScroll
   ld  a,r
   ld  (Seed),a
@@ -587,13 +708,7 @@ setdeflevels:
   add hl,de ;next
   dnz setdeflevels
 
   add hl,de ;next
   dnz setdeflevels
 
-;_______________________________________________________________________________
-; _______  _____   ______ _______       _____ __   _ _____ _______
-; |  |  | |     | |_____/ |______         |   | \  |   |      |
-; |  |  | |_____| |    \_ |______ _____ __|__ |  \_| __|__    |
-;_______________________________________________________________________________
-
-;--- trig tables ---
+;--- trig tables ---------------------------------------------------------------
 
   ld  hl,trigtable   ;I believe this
   ld  de,SinCosTable  ;is one of the few
 
   ld  hl,trigtable   ;I believe this
   ld  de,SinCosTable  ;is one of the few
@@ -624,14 +739,25 @@ NegativeSineWave:
 ; |  |  | |     | __|__ |  \_| _____ |  |  | |______ |  \_| |_____|
 ;_______________________________________________________________________________
 
 ; |  |  | |     | __|__ |  \_| _____ |  |  | |______ |  \_| |_____|
 ;_______________________________________________________________________________
 
-;---draw menu---
+;--- draw menu -----------------------------------------------------------------
 
 DisplayMenu:
   cal linkok
   cal _clrWindow
   ld  de,$FC40 ;(0,4)
   ld  hl,wtPicture
 
 DisplayMenu:
   cal linkok
   cal _clrWindow
   ld  de,$FC40 ;(0,4)
   ld  hl,wtPicture
-  ld  bc,16*16
+  ld  a,3
+optimize__w00t: ;may look like crap, but actually saves 3 bytes!
+  ldi
+  ld  bc,6
+  ex  de,hl
+  add hl,bc
+  ex  de,hl ;add de,6
+  ld  c,16-7 ;=bc
+  ldir
+  dec a
+  jr  nz,optimize__w00t
+  ld  c,13*16 ;=bc
   ldir
   ld  hl,$FC00+$010 ;(*,01)
   cal hr
   ldir
   ld  hl,$FC00+$010 ;(*,01)
   cal hr
@@ -656,14 +782,11 @@ dispmenucommon:
   ld  de,$FD80 ;begin pos
   xor a
 clroldmenuloop:
   ld  de,$FD80 ;begin pos
   xor a
 clroldmenuloop:
+  ld  c,4
   ld  (de),a
   inc de
   ld  (de),a
   inc de
-  ld  (de),a
-  inc de
-  ld  (de),a
-  inc de
-  ld  (de),a
-  inc de
+  dec c
+  jr  nz,clroldmenuloop+2
   dnz clroldmenuloop
 
   ld  b,(ix)
   dnz clroldmenuloop
 
   ld  b,(ix)
@@ -687,7 +810,7 @@ hrloop:
   dnz hrloop
   ret
 
   dnz hrloop
   ret
 
-;--- options menu ---
+;--- options menu --------------------------------------------------------------
 
 dispoptionmenu:
   ld  hl,txtoMenu
 
 dispoptionmenu:
   ld  hl,txtoMenu
@@ -699,7 +822,7 @@ dispomenusets:
 #ifdef spprotect
   ld  a,(gamecar)
   and _datasingl
 #ifdef spprotect
   ld  a,(gamecar)
   and _datasingl
-  jp  nz,LetsGetThisPartyOn
+  jp  nz,LetsGetThisPartyOn ;SP -> start game
 #endif
   cal clrold
 
 #endif
   cal clrold
 
@@ -910,7 +1033,7 @@ bchangegrowth:
   jr  z,__optionMenu ;<-1
   jr  changedgrowth
 
   jr  z,__optionMenu ;<-1
   jr  changedgrowth
 
-;--- main menu ---
+;--- main menu -----------------------------------------------------------------
 
 mainMenu:
   cal menupos
 
 mainMenu:
   cal menupos
@@ -941,7 +1064,7 @@ notselect
   cp  K_EXIT
   jp  z,ExitNoStats
   cp  K_MORE
   cp  K_EXIT
   jp  z,ExitNoStats
   cp  K_MORE
-  jp  z,restart
+  jp  z,Start
   psh af
   cal menupos
   cal loadgamecar
   psh af
   cal menupos
   cal loadgamecar
@@ -1096,7 +1219,7 @@ changekeys:
   cal getcustomkey ;right
 ; jr  dispmenusets
 
   cal getcustomkey ;right
 ; jr  dispmenusets
 
-;--- display current settings ---
+;--- display current settings --------------------------------------------------
 
 dispmenusets:
   ld  de,$183E
 
 dispmenusets:
   ld  de,$183E
@@ -1165,7 +1288,7 @@ curworm =$-1
   cal _vputs
   jp  mainMenu
 
   cal _vputs
   jp  mainMenu
 
-;--- handle menukeys ---
+;--- handle menukeys -----------------------------------------------------------
 
 menucall:
   psh bc
 
 menucall:
   psh bc
@@ -1226,8 +1349,7 @@ menunewok:
   ld  b,a
   jr  menupos
 
   ld  b,a
   jr  menupos
 
-;--- change name ---
-; of worm#(curworm)
+;--- change name ---------------------------------------------------------------
 
 getwormname: ;of (curworm)
   ld  a,(curworm)
 
 getwormname: ;of (curworm)
   ld  a,(curworm)
@@ -1264,9 +1386,8 @@ enternameloop:
   ld  (_penCol),hl
   pop hl
   psh hl
   ld  (_penCol),hl
   pop hl
   psh hl
-  ld  (ix),0
+  ld  (ix),a ;clroldcustom -> a=0
   cal __vputs
   cal __vputs
-  ld  (ix),' '
   ld  a,'_'
   cal __vputmap
 nokeypressed:
   ld  a,'_'
   cal __vputmap
 nokeypressed:
@@ -1285,6 +1406,7 @@ backspace:
   dec ix
   jr  enternameloop
 continue:
   dec ix
   jr  enternameloop
 continue:
+  ld  d,0
   cp  K_ENTER
   jr  z,nameentered
   cp  K_EXIT
   cp  K_ENTER
   jr  z,nameentered
   cp  K_EXIT
@@ -1292,9 +1414,8 @@ continue:
 
   dec (hl) ;(namelength)
   jr  z,nameentered
 
   dec (hl) ;(namelength)
   jr  z,nameentered
-  ld  hl,chartable
-  ld  e,a
-  ld  d,0
+  ld  hl,chartable-1
+  ld  e,a ;d=0
   add hl,de
   ld  a,(hl)
   or  a
   add hl,de
   ld  a,(hl)
   or  a
@@ -1304,20 +1425,19 @@ continue:
   cal releasekeys
   jr  enternameloop
 
   cal releasekeys
   jr  enternameloop
 
-savestr:
-  .db "00000" ;,0      ;&&&somehow put in chartable's 5-byte hole
-chartable:
-  .db 0,".<>!",0,0,0,0 ;down|L|R|up|-|-|-|-
-  .db -1,"XTOJE0",0    ;enter|+|-|*|/|^|clear|-
-  .db " WSNID9",0      ;(-)|3|6|9|)|tan|custom|-
-  .db "ZVRMHC8",-1     ;.|2|5|8|(|cos|prgm|del
+chartable: ;("!@#$%,0" also used in _D_HL_DECI)
+  .db ".<>!"           ;down|L|R|up|-|-|-|-
+  .db "w00t!"          ;(makes code look way better)
+  .db "XTOJE0",-2      ;enter|+|-|*|/|^|clear|-
+  .db " WSNID9",-3     ;(-)|3|6|9|)|tan|custom|-
+  .db "ZVRMHC8",-4     ;.|2|5|8|(|cos|prgm|del
   .db "YUQLGB7#"       ;0|1|4|7|ee|sin|table|xvar
   .db $D9,"-PKFA6'"    ;on|sto|,|x2|ln|log|graph|alpha
   .db "YUQLGB7#"       ;0|1|4|7|ee|sin|table|xvar
   .db $D9,"-PKFA6'"    ;on|sto|,|x2|ln|log|graph|alpha
-  .db "54321*",-1,$D0  ;F5|F4|F3|F2|F1|2nd|exit|more
+  .db "54321*",-5,$D0  ;F5|F4|F3|F2|F1|2nd|exit|more
 
 
-nameentered:
+nameentered: ;d=0
   pop ix ;stringbegin
   pop ix ;stringbegin
-  ld  (ix+8),0 ;end mark
+  ld  (ix+8),d ;end mark
   jp  DisplayMenu
 
 ;_______________________________________________________________________________
   jp  DisplayMenu
 
 ;_______________________________________________________________________________
@@ -1489,7 +1609,7 @@ OhMyGodItsALabel:  ;pj34r my coding skillz
   rra ;and _datalink
   jr  nc,_StartLevel
 
   rra ;and _datalink
   jr  nc,_StartLevel
 
-;--- link ---
+;--- link ----------------------------------------------------------------------
 
 wormVhost   = 095
 wormVclient = 195
 
 wormVhost   = 095
 wormVclient = 195
@@ -1505,7 +1625,7 @@ linkmatch:
   cp  wormVclient
   jr  nz,host
 
   cp  wormVclient
   jr  nz,host
 
-;--- client ---
+;--- client --------------------------------------------------------------------
 
 client:
 ; ld  hl,txtReceiv
 
 client:
 ; ld  hl,txtReceiv
@@ -1545,7 +1665,7 @@ linkerror:
   pop hl ;error
   jp  DisplayMenu ;return to menu
 
   pop hl ;error
   jp  DisplayMenu ;return to menu
 
-;--- set/send worms ---
+;--- set/send worms ------------------------------------------------------------
 
 moveworm2:
   ld  hl,worm2+left
 
 moveworm2:
   ld  hl,worm2+left
@@ -1575,7 +1695,7 @@ sendworm: ;hl=wormN+name
   ld  b,9
   jp  sendstuff
 
   ld  b,9
   jp  sendstuff
 
-;--- host ---
+;--- host ----------------------------------------------------------------------
 
 host:
   cp  wormVhost
 
 host:
   cp  wormVhost
@@ -1609,7 +1729,7 @@ host:
   ld  b,168
   cal sendstuff ;level
 
   ld  b,168
   cal sendstuff ;level
 
-;--- load level ---
+;--- load level ----------------------------------------------------------------
 
 StartLevel:
   pop hl ;loadgamecar
 
 StartLevel:
   pop hl ;loadgamecar
@@ -1642,7 +1762,7 @@ teamset:
   ld  l,(hl)
   ld  h,0
   ld  a,(gamecar)
   ld  l,(hl)
   ld  h,0
   ld  a,(gamecar)
-  rla
+  rla ;and _dataPmult
   ld  a,h ;(Left)=256
   jr  nc,setscorelimit
   ld  a,l
   ld  a,h ;(Left)=256
   jr  nc,setscorelimit
   ld  a,l
@@ -1670,29 +1790,32 @@ Nextlevel:
   inc hl   ;location of ending-code
   jp  (hl) ;go there ("call")
 donextlevel:
   inc hl   ;location of ending-code
   jp  (hl) ;go there ("call")
 donextlevel:
-  ld  bc,gametype
-  ld  a,(bc)
+  ld  de,gametype
+  ld  a,(de)
   or  a ;gamesingle
   psh af
   or  a ;gamesingle
   psh af
-  cal nz,skiplvltitle
+  jr  nz,customnrpeas
+;--sp--
+  inc de
+  ld  a,(de) ;gamecar
+  rla ;prepare a
+  rlc (hl) ;bit 7 of (hl)...
+  rra ;...to bit 7 of (gamecar)
+  rrc (hl) ;restore (hl)
+  ld  (de),a
   ld  a,(hl)
   ld  a,(hl)
-  and 127
-  jr  nz,setleft
-customleft =$+1
+  and 127 ;actual #peas
+  jr  setnrpeas
+;--!sp--
+customnrpeas:
+  cal skiplvltitle
   ld  a,0
   ld  a,0
-setleft:
+customleft =$-1
+
+setnrpeas:
   ld  (Left),a
   inc a
   ld  (lefttotal),a
   ld  (Left),a
   inc a
   ld  (lefttotal),a
-  dec a
-  xor (hl) ;bit (hl),7
-  inc bc ;gamecar
-  ld  a,(bc)
-  jr  z,leftloaded
-  or  128+32
-leftloaded:
-  ld  (bc),a
-  inc de
   inc hl
   ld  de,Speed
   ld  a,0
   inc hl
   ld  de,Speed
   ld  a,0
@@ -1707,13 +1830,8 @@ setspeed:
   inc hl
   ld  de,peagrowth
   ldi
   inc hl
   ld  de,peagrowth
   ldi
-  ld  a,(hl)
-  ld  (worm1+grow),a ;&&sh
-  ld  (worm2+grow),a
-  ld  (worm3+grow),a
-  ld  (worm4+grow),a
-  ld  (beginsize),a
-  inc hl
+  ld  de,growsize
+  ldi
 
   ld  a,(hl)
   inc hl
 
   ld  a,(hl)
   inc hl
@@ -1765,20 +1883,23 @@ toobad_noballs:
 worminit:
   psh bc ;>1
   ex  de,hl
 worminit:
   psh bc ;>1
   ex  de,hl
-  ldi        ;d
+  ldi        ;+d
   ld  a,SinCosTable/256
   ld  (de),a
   inc de
   ld  a,SinCosTable/256
   ld  (de),a
   inc de
-  ldi        ;y
-  ldi        ;x
+  ldi        ;+y
+  ldi        ;+x
   ex  de,hl
   xor a
   ex  de,hl
   xor a
-  ld  (hl),a ;y2
+  ld  (hl),a ;+y2
   inc hl
   inc hl
-  ld  (hl),a ;x2
+  ld  (hl),a ;+x2
   inc hl
   inc hl
+  ld  a,(growsize)
+  ld  (hl),a ;+growL
   inc hl
   inc hl
-  ld  (hl),a ;growH=0
+  xor a
+  ld  (hl),a ;+growH=0
 
   ld  bc,(worm2-worm1)-7
   add hl,bc
 
   ld  bc,(worm2-worm1)-7
   add hl,bc
@@ -1787,10 +1908,9 @@ worminit:
 
   inc a ;ld a,1
   ld  (turn10),a
 
   inc a ;ld a,1
   ld  (turn10),a
-  inc a ;ld a,2
   ld  (flashtime),a
 
   ld  (flashtime),a
 
-;--- draw level ---
+;--- draw level ----------------------------------------------------------------
 
 initlevel:
   ld  a,(de)
 
 initlevel:
   ld  a,(de)
@@ -1811,13 +1931,7 @@ setfieldy:
   psh de                        ; >> levelp
   ld  a,l ;pop
   sub 5
   psh de                        ; >> levelp
   ld  a,l ;pop
   sub 5
-  ld  l,a
-  ld  h,0
-  add hl,hl
-  add hl,hl
-  add hl,hl
-  add hl,hl
-  add hl,hl ;32=scr.width
+  cal ldhl32a
   ex  de,hl
 
   ld  hl,ScrBuffer
   ex  de,hl
 
   ld  hl,ScrBuffer
@@ -1888,28 +2002,36 @@ levelhasbeensetup:
 
   cal drawstuff
 
 
   cal drawstuff
 
-;--- prepare ---
+;--- prepare -------------------------------------------------------------------
 
 leveldone:
   psh hl                        ; >> levelp new
   cal forceshowstats
 
 
 leveldone:
   psh hl                        ; >> levelp new
   cal forceshowstats
 
+  ld  a,(gamecar)
+  rla ;and _dataPmult
+  cal c,multnewpea ;a=0
+  rla ;and _datafood
+  cal nc,NewPea
+nofood:
+  ld  bc,(worm1+pos)
+  cal DisplayField
+
 #ifdef readymask
   ld  hl,$FC70
 #ifdef readymask
   ld  hl,$FC70
-  ld  d,%10101010
-  ld  c,56
+  ld  de,57*256+%10101010
 maskloop:
 maskloop:
-  ld  a,d
-  xor %11111111
-  ld  d,a
+  ld  a,e
+  cpl
+  ld  e,a
   ld  b,$10
 maskline:
   ld  a,(hl)
   ld  b,$10
 maskline:
   ld  a,(hl)
-  or  d
+  and e
   ld  (hl),a
   inc hl
   dnz maskline
   ld  (hl),a
   inc hl
   dnz maskline
-  dec c
+  dec d
   jr  nz,maskloop
 #endif
 #ifdef readytext
   jr  nz,maskloop
 #endif
 #ifdef readytext
@@ -1926,15 +2048,6 @@ maskline:
   res 3,(iy+5)
 #endif
 
   res 3,(iy+5)
 #endif
 
-  ld  a,(gamecar)
-  rla ;bit __bitPmult,a
-  cal c,multnewpea ;a=0
-  rla ;bit __bitfood,a
-  cal nc,NewPea
-nofood:
-  ld  bc,(worm1+pos)
-  cal DisplayField
-
   ld  b,startdelay
 ReadyDelay:
   halt
   ld  b,startdelay
 ReadyDelay:
   halt
@@ -2052,9 +2165,9 @@ CheckExit:
   rla  ;=$17 (c=EXIT-key)
       ;or$A7 (c=0)
   jp  c,GameLoop
   rla  ;=$17 (c=EXIT-key)
       ;or$A7 (c=0)
   jp  c,GameLoop
-  jp  Exit ;jr?
+  jr  Exit
 
 
-;--- pause menu ---
+;--- pause menu ----------------------------------------------------------------
 
 disppausemenu:
   ld  hl,txtpMenu
 
 disppausemenu:
   ld  hl,txtpMenu
@@ -2192,7 +2305,7 @@ CURtxtGame =$-2
   ld  de,$0004
   ld  (_curRow),de
 
   ld  de,$0004
   ld  (_curRow),de
 
-;--- who won? ---
+;--- who won? ------------------------------------------------------------------
 
 findwinner:
   ld  hl,(worm1+score)
 
 findwinner:
   ld  hl,(worm1+score)
@@ -2232,7 +2345,7 @@ nonewdmwinner:
   dnz finddmwinner
   ld  (dmwinner),a
 
   dnz finddmwinner
   ld  (dmwinner),a
 
-;--- display worms ---
+;--- display worms -------------------------------------------------------------
 
 ;x123456789012345678901
 ;>>>>>> GAME OVER <<<<<
 
 ;x123456789012345678901
 ;>>>>>> GAME OVER <<<<<
@@ -2331,34 +2444,33 @@ hilevelcheckdone:
   and _datasingl
   jr  z,hiscorecheckdone ;no SP
 checkhiscore:
   and _datasingl
   jr  z,hiscorecheckdone ;no SP
 checkhiscore:
-  cal loadhiscoreposinahl
+  cal loadhiscoreposinahl ;cf=0 (and)
   cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile)
   cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile)
+;-wild insertation-
   xor a
   xor a
-  ld  hl,highsave
+  ;Be Root to fix a Unix problem
+  ld  hl,savestr
+  ;ReBoot to fix a Windows problem
   cal _SET_ABS_DEST_ADDR ;to local
   cal _SET_ABS_DEST_ADDR ;to local
-  ld  hl,5 ;5 bytes
-  cal _MM_LDIR_SET_SIZE ;get old score+name
-  cal _RAM_PAGE_1
-
-  ld  de,(highsave)    ;de=prev. hiscore
+  ;W00t W00t to fix an assembly problem
+  cal mmldir5 ;get old score+name
+  ld  de,(savestr)     ;de=prev. hiscore
   ld  hl,(worm1+score) ;hl=worm1's score
   cal _cphlde ;sub hl,de
   jr  c,NotNewHigh ;new<old
   jr  z,NotNewHigh ;new<=old
   ld  hl,(worm1+score) ;hl=worm1's score
   cal _cphlde ;sub hl,de
   jr  c,NotNewHigh ;new<old
   jr  z,NotNewHigh ;new<=old
-newhigh:            ;New>Old
-  ld  (highsave),hl ;store new hiscore
-  ld  de,highsave+2 ;to
+newhigh:           ;New>Old
+  ld  (savestr),hl  ;store new hiscore
+  ld  de,savestr+2  ;to
   ld  hl,worm1+name ;from
   ld  bc,3 ;3 chars
   ldir ;store new hiname
   ld  hl,worm1+name ;from
   ld  bc,3 ;3 chars
   ldir ;store new hiname
-  cal loadhiscoreposinahl
+  cal loadhiscoreposinahl ;cf=0 (jr c)
   cal _SET_ABS_DEST_ADDR ;to ahl
   xor a
   cal _SET_ABS_DEST_ADDR ;to ahl
   xor a
-  ld hl,highsave
+  ld  hl,savestr
   cal _SET_ABS_SRC_ADDR ;from local
   cal _SET_ABS_SRC_ADDR ;from local
-  ld  hl,5
-  cal _MM_LDIR_SET_SIZE ;save new
-  cal _RAM_PAGE_1
+  cal mmldir5 ;save new score+name
   ld  hl,_curRow
   dec (hl)
   cal iswinner
   ld  hl,_curRow
   dec (hl)
   cal iswinner
@@ -2370,9 +2482,11 @@ NotNewHigh:
   cal _vputs
   ld  hl,$0C07
   ld  (_curRow),hl
   cal _vputs
   ld  hl,$0C07
   ld  (_curRow),hl
-  ld  hl,highsave+2
+  ld  hl,savestr+2
   cal _puts
   cal _puts
-  ld  hl,(highsave)
+  ld  hl,_curCol
+  inc (hl)
+  ld  hl,(savestr)
   cal _D_HL_DECI
   cal _puts ;showHL
 hiscorecheckdone:
   cal _D_HL_DECI
   cal _puts ;showHL
 hiscorecheckdone:
@@ -2391,7 +2505,7 @@ waitkeyloop:
   ret
 
 loadhiscoreposinahl:
   ret
 
 loadhiscoreposinahl:
-  ld  hl,0 ;for peaworm and singleplayer
+  sbc hl,hl ;cf=0
   ld  a,(gametype)
   or  a ;Singleplayer?
   jr  z,hi__
   ld  a,(gametype)
   or  a ;Singleplayer?
   jr  z,hi__
@@ -2414,8 +2528,8 @@ hiscrposhl =$-2
 hiscrposa =$+1
   adc a,0 ;ahl=saveloc
   ret
 hiscrposa =$+1
   adc a,0 ;ahl=saveloc
   ret
-highsave:
-  .db 0,0,"SHI ",0
+savestr: ;hiscore (00AAA) _D_HL_DECI (00000)
+  .db $BB,"w00t",0
 
 iswinner:
   ld  a,10
 
 iswinner:
   ld  a,10
@@ -2423,7 +2537,7 @@ iswinner:
   ld  a,'*'
   jp  _putc ;..then put *
 
   ld  a,'*'
   jp  _putc ;..then put *
 
-;--- quit ---
+;--- quit ----------------------------------------------------------------------
 
 ExitNoStats:
   cal linkok
 
 ExitNoStats:
   cal linkok
@@ -2459,39 +2573,31 @@ respawncheck:
   jr  nz,unnamedlabel
   cal saverespawncounter
 removeworm:
   jr  nz,unnamedlabel
   cal saverespawncounter
 removeworm:
-  ld  h,(ix+tail+1) ;&
+  ld  h,(ix+tail+1)
   ld  l,(ix+tail)
   ld  d,(ix+head+1)
   ld  e,(ix+head)
   jr  DoesWormTailEqualsWormHead ;chk4 size=0
 removewormloop:
   ld  l,(ix+tail)
   ld  d,(ix+head+1)
   ld  e,(ix+head)
   jr  DoesWormTailEqualsWormHead ;chk4 size=0
 removewormloop:
-  ld  c,(hl)
-  inc hl
-  ld  b,(hl)
-  inc hl
-  cal resbit
-  psh hl
-  cal res4pixels
-  pop hl
+  cal removetailbit
   inc (ix+grow)
   jr  nz,DoesWormTailEqualsWormHead
   inc (ix+grow+1) ;+256
 DoesWormTailEqualsWormHead:
   cal _cphlde
   inc (ix+grow)
   jr  nz,DoesWormTailEqualsWormHead
   inc (ix+grow+1) ;+256
 DoesWormTailEqualsWormHead:
   cal _cphlde
-  jr  nz,removewormloop
+  jr  nz,removewormloop ;head=tail/size=0
 
   ld  a,(gamecar)
   and _datasingl
 
   ld  a,(gamecar)
   and _datasingl
-  jr  nz,safewormsizedone
+  jr  nz,savetailpos
+  ld  (ix+grow+1),a ;=0
   ld  a,0
   ld  a,0
-beginsize =$-1
+growsize =$-1
   ld  (ix+grow),a
   ld  (ix+grow),a
-  ld  (ix+grow+1),0 ;high
-safewormsizedone:
 
 
-  ;de=ix+head
-  ld  (ix+tail+1),d
-  ld  (ix+tail),e ;head=tail/size=0
+savetailpos:
+  ld  (ix+tail+1),h
+  ld  (ix+tail),l
   ret
 
 unnamedlabel:
   ret
 
 unnamedlabel:
@@ -2608,23 +2714,9 @@ donediddelydone:
   ld  e,(ix+pos2)
   ld  d,(ix+pos2+1)
 
   ld  e,(ix+pos2)
   ld  d,(ix+pos2+1)
 
-#ifdef optdie
-  psh hl
-  ld  hl,previouspos
-  ld  (hl),c
-  inc hl
-  ld  (hl),b
-  inc hl
-  inc hl
-  ld  (hl),e
-  inc hl
-  ld  (hl),d
-  pop hl
-#endif
+;--- move worm -----------------------------------------------------------------
 
 
-;--- move worm ---
-
-Wormmove:
+wormmove:
   psh bc ;pos
   ld  a,(hl)
   add a,a
   psh bc ;pos
   ld  a,(hl)
   add a,a
@@ -2651,35 +2743,33 @@ notnegY:
   jr  nc,notmoveY
   inc c
 notmoveY: ;bc=newpos
   jr  nc,notmoveY
   inc c
 notmoveY: ;bc=newpos
-  ld  (ix+pos),c
-  ld  (ix+pos+1),b
   ld  (ix+pos2),e
   ld  (ix+pos2+1),d
 
 ;-check-
   pop hl ;pos (old)
   ld  a,h
   ld  (ix+pos2),e
   ld  (ix+pos2+1),d
 
 ;-check-
   pop hl ;pos (old)
   ld  a,h
-  sub b
-  and 1
+  sub b ;Xold-Xnew
+  and 1 ;abs
   ld  h,a
   ld  a,l
   sub c
   ld  h,a
   ld  a,l
   sub c
-  and 1
-  add a,h
-  ld  d,4
+  and 1 ;|Yold-Ynew|
+  add a,h ;pixels moved |Dx|+|Dy|
+  ld  d,4 ;same pos = 4of4 bytes drawn
   jr  z,GotFour
   jr  z,GotFour
-  xor 3
-  ld  d,a
+  xor 3 ;1 pixel = 2of4 blank; 2 pixels = 3of4 blank
+  ld  d,a ;#pixels that should be drawn
 GotFour:
 GotFour:
-  cal chk4pixels
-  rl  d
-  cal c,hitworm
+  cal chk4pixels ;d-=pixels at b,c
+  rl  d ;<0 meaning there were >d pixels
+  cal c,hitworm ;so that wasn't us
 
 
-;--- draw worm ---
+;--- draw worm -----------------------------------------------------------------
 
 
-Drawworm:
-  ld  c,(ix+pos)
-  ld  b,(ix+pos+1)
+drawworm:
+  ld  (ix+pos),c
+  ld  (ix+pos+1),b
 
   ld  a,(gametype)
   cp  gamerace
 
   ld  a,(gametype)
   cp  gamerace
@@ -2697,7 +2787,10 @@ Drawworm:
   inc hl
   ld  (hl),b
   inc hl
   inc hl
   ld  (hl),b
   inc hl
-  cal resbit
+  ;(resbit)
+  ld  a,h
+  and (ix+storepos)
+  ld  h,a
   ld  (ix+head),l
   ld  (ix+head+1),h
 
   ld  (ix+head),l
   ld  (ix+head+1),h
 
@@ -2714,20 +2807,26 @@ Drawworm:
 removetail:
   ld  l,(ix+tail)
   ld  h,(ix+tail+1)
 removetail:
   ld  l,(ix+tail)
   ld  h,(ix+tail+1)
+  cal removetailbit
+  cal savetailpos ;ld (ix+tail),hl
   ld  c,(hl)
   inc hl
   ld  b,(hl)
   ld  c,(hl)
   inc hl
   ld  b,(hl)
-  inc hl
-  cal resbit
-  ld  (ix+tail),l
-  ld  (ix+tail+1),h
-  psh hl
-  cal res4pixels
-  pop hl
+  jr  set4pixels ;redraw new last bit
+
+removetailbit:
   ld  c,(hl)
   inc hl
   ld  b,(hl)
   ld  c,(hl)
   inc hl
   ld  b,(hl)
-  jr  set4pixels
+  inc hl
+  ;(resbit)
+  ld  a,h
+  and (ix+storepos)
+  ld  h,a
+  psh hl
+  cal res4pixels ;rm last bit
+  pop hl
+  ret
 
 res4pixels:
   cal ResPixel
 
 res4pixels:
   cal ResPixel
@@ -2846,29 +2945,108 @@ checkballhit:
 ; |__|__| |_____| |    \_ |  |  |    |    _____ |     | __|__    |
 ;_______________________________________________________________________________
 
 ; |__|__| |_____| |    \_ |  |  |    |    _____ |     | __|__    |
 ;_______________________________________________________________________________
 
+;--- multifood -----------------------------------------------------------------
+
+chkmultpeas:
+  ld  de,peaspos-1
+  ld  hl,lefttotalb
+lefttotal =$+1
+  ld  (hl),0
+chkmultpealoop:
+  ex  de,hl
+  inc hl
+  ld  e,(hl)
+  inc hl
+  ld  d,(hl)
+  ex  de,hl
+  psh de
+  cal chkpeahit
+  pop de
+  jr  c,pickmultpea
+  ld  hl,lefttotalb
+  dec (hl)
+  jr  nz,chkmultpealoop
+  jr  _wormdead
+pickmultpea:
+  ld  a,247
+  ld  (de),a
+  dec de
+  ld  (de),a
+  jp  pickedpea
+
+;--- ctf -----------------------------------------------------------------------
+
+chkctfpeas: ;ctf
+  ld  hl,(peaspos) ;1st pea
+  ld  a,(ix+reserv)
+  ld  e,a ;push a
+  and %01 ;ourpea (0|1)
+  jr  z,sel_otherpea
+  ld  hl,(peaspos+2) ;2nd pea
+sel_otherpea:
+  cal chkpeahit
+  jr  c,hitflag
+;no peas hit:
+  ld  a,e ;peek a (that's x86asm for pop\push ;)
+  bit 1,a ;%1O = carrying flag?
+  jr  z,_wormdead ;if not just die
+  and %1 ;which flag?
+  ld  hl,drawctfpea1 ;restore #1
+  jr  nz,nottheotherflag
+  inc hl ;ld hl,drawctfpea2
+  inc hl ;restore #2
+nottheotherflag:
+  ld  (hl),3 ;draw delay 3 turns
+_wormdead:
+  jp  wormdead
+
+hitflag: ;correct pea hit
+  ld  a,e ;pop a
+  xor %11 ;invert flag taken + ownflag
+  ld  (ix+reserv),a
+  and %10 ;just returned?
+  psh bc ;safe position
+  psh af ;safe z-flag
+  cal DrawPea ;remove
+  pop af
+  pop bc
+  ret nz ;flag taken: continue game ;drawworm
+  ld  e,20 ;flag captured+returned
+  psh bc
+  cal IncScore
+  pop bc
+  ld  a,3 ;draw delay
+  ld  (drawctfpea1),a ;redraw..
+  ld  (drawctfpea2),a ;..both flags
+  ret ;drawworm
+
+;--- main ----------------------------------------------------------------------
+
 hitworm:
 hitworm:
-#ifdef optdie
-; if race - originally
-  cal checkhitotherworm
-#endif
   ld  a,(gamecar)
   bit __bitPctf,a
   jr  nz,chkctfpeas
   rla ;and _dataPmult
   ld  a,(gamecar)
   bit __bitPctf,a
   jr  nz,chkctfpeas
   rla ;and _dataPmult
-  jp  c,chkmultpeas
+  jr  c,chkmultpeas
   rla ;and _datafood
   rla ;and _datafood
-  jp  c,wormdead ;no food
+  jr  c,_wormdead ;no food
+
+;--- foodmatch|SP --------------------------------------------------------------
 
   ld  hl,0
 PeaY =$-2
 PeaX =$-1
   cal chkpeahit
   jp  nc,wormdead
 
   ld  hl,0
 PeaY =$-2
 PeaX =$-1
   cal chkpeahit
   jp  nc,wormdead
-pickpea:
-  cal DrawPea ;remove pea
+
+;--- take pea ------------------------------------------------------------------
+
+  psh hl
   cal NewPea
   cal NewPea
-pickpea_:
-  ld  a,(ix+grow)
+  pop hl
+pickedpea:
+  cal DrawPea ;remove pea
+  ld  a,(ix+grow) ;grow
   add a,15
 peagrowth =$-1
   ld  (ix+grow),a
   add a,15
 peagrowth =$-1
   ld  (ix+grow),a
@@ -2876,12 +3054,14 @@ peagrowth =$-1
   inc (ix+grow+1)
 wormset2grow:
   ld  hl,Left
   inc (ix+grow+1)
 wormset2grow:
   ld  hl,Left
-  dec (hl) ;dec left before display
+  dec (hl) ;dec left _before_ display
   psh af
   ld  e,10
   cal IncScore
   pop af
   psh af
   ld  e,10
   cal IncScore
   pop af
-  jp  nz,Drawworm ;continue
+  ld  c,(ix+pos) ;same position
+  ld  b,(ix+pos+1) ;we'll just leave pos2 - doubt anybody will care|notice..
+  ret nz ;(Left)>0 ;drawworm
   ld  a,(gametype)
   or  a
   jp  nz,Exit ;stack restored
   ld  a,(gametype)
   or  a
   jp  nz,Exit ;stack restored
@@ -2897,9 +3077,9 @@ wormset2grow:
   ex  de,hl
   cal _IncScore ;score+(40*level)
   cal removeworm
   ex  de,hl
   cal _IncScore ;score+(40*level)
   cal removeworm
-  pop hl ;<<$some call
-  pop hl ;<<call HandleWorm
   pop hl ;<<call hitworm
   pop hl ;<<call hitworm
+  pop hl ;<<call HandleWorm
+  pop hl ;<<$some other call
   ld  (ix+delay),2
   jp  Nextlevel
 
   ld  (ix+delay),2
   jp  Nextlevel
 
@@ -2918,112 +3098,15 @@ chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
   cp  d
   ret ;c=pea
 
   cp  d
   ret ;c=pea
 
-;--- other modes ---
-
-chkctfpeas:
-  ld  hl,(peaspos) ;1st pea
-  ld  a,(ix+reserv)
-  ld  e,a ;push a
-  and %01 ;ourpea (0|1)
-  jr  z,sel_otherpea
-  ld  hl,(peaspos+2) ;2nd pea ;&&&ex de,hl?
-sel_otherpea:
-  cal chkpeahit
-  jr  c,hitflag
-;no peas hit:
-  ld  a,e ;peek a (that's x86asm for pop\push ;)
-  bit 1,a ;%10 = carrying flag?
-  jp  z,wormdead ;if not just die
-  xor %11 ;drop flag
-  ld  (ix+reserv),a
-  psh af
-  cal wormdead
-  pop af ;which flag? (=and %1)
-  ld  hl,drawctfpea1 ;restore #1
-  jr  z,nottheotherflag
-  inc hl ;ld hl,drawctfpea2
-  inc hl ;restore #2
-nottheotherflag:
-  ld  (hl),3 ;draw delay 3 turns
-  ret
-
-hitflag: ;correct pea hit
-  ld  a,e ;pop a
-  xor %11 ;invert flag taken + ownflag
-  ld  (ix+reserv),a
-  and %10 ;just returned?
-  psh af ;safe z-flag
-  cal DrawPea ;remove
-  pop af
-  ret nz ;flag taken, continue game
-  psh hl
-  ld  e,20 ;flag captured+returned
-  cal IncScore
-  pop hl
-  ld  a,3 ;draw delay
-  ld  (drawctfpea1),a ;redraw..
-  ld  (drawctfpea2),a ;..both flags
-  ret ;Drawworm
-
-chkmultpeas:
-  ld  de,peaspos-1
-  ld  hl,lefttotalb
-lefttotal =$+1
-  ld  (hl),0
-chkmultpealoop:
-  ex  de,hl
-  inc hl
-  ld  e,(hl)
-  inc hl
-  ld  d,(hl)
-  ex  de,hl
-  psh de
-  cal chkpeahit
-  pop de
-  jr  c,pickmultpea
-  ld  hl,lefttotalb
-  dec (hl)
-  jr  nz,chkmultpealoop
-  jp  wormdead
-pickmultpea:
-  ld  a,247
-  ld  (de),a
-  dec de
-  ld  (de),a
-  cal DrawPea
-  jp  pickpea_
-
-;--- misc ---
-
-#ifdef optdie
-nextotherwormbit:
-  ld  a,c
-  sub (hl)
-  inc hl
-  inc a
-  cp  4
-  jr  nc,nothit1 ;no
-  ld  a,b
-  sub (hl)
-  inc a
-  cp  4
-  ret c ;nz ;yes
-nothit1:
-  inc hl
-  cal resbit
-ChkWorm:
-  cal _cphlde
-  jr  nz,nextotherwormbit
-  ret ;z
-#endif
+;--- misc ----------------------------------------------------------------------
 
 checkhitlapline:
 
 checkhitlapline:
-  ld  a,(peaspos) ;63
+  ld  a,(peaspos) ;63 usually
   sub b ;x==63
   jr  z,nextlaphalf
   sub b ;x==63
   jr  z,nextlaphalf
-  inc a
-  ret nz
-nextlaphalf:
+  inc a ;(more checkin' since wormies just have those _huge_ heads ;)
+  ret nz ;x!=62
+nextlaphalf: ;x==62|63; a=0
   ld  a,(peaspos+1) ;yline
   cp  c ;ypos
   ld  a,1
   ld  a,(peaspos+1) ;yline
   cp  c ;ypos
   ld  a,1
@@ -3050,21 +3133,15 @@ checklap:
 ; |       |    \_ |_____| |_____  ______|
 ;_______________________________________________________________________________
 
 ; |       |    \_ |_____| |_____  ______|
 ;_______________________________________________________________________________
 
-releasekeys:
-  halt
+releasekeys: ;---------->promise me you'll never let go...
+  halt ;-------------------->i won't let go....
   ld  a,%10000000    ;all key-masks
   out (1),a
   ld  a,%10000000    ;all key-masks
   out (1),a
-  in  a,(1)
+  in  a,(1) ;--------------->i'll never let go.....
   inc a              ;cp %11111111 (no keys pressed)
   jr  nz,releasekeys ;keep waitin
   cal GET_KEY        ;clear buffer
   inc a              ;cp %11111111 (no keys pressed)
   jr  nz,releasekeys ;keep waitin
   cal GET_KEY        ;clear buffer
-  ret
-
-resbit:
-  ld  a,h
-  and (ix+storepos)
-  ld  h,a
-  ret
+  ret ;--------------------->*die* (we are VICTORIOUS! muha)
 
 randompos:
   ld  b,a
 
 randompos:
   ld  b,a
@@ -3073,20 +3150,37 @@ Random: ;(2..b+2)
 Seed =$+1
   add a,0
   ld  (Seed),a
 Seed =$+1
   add a,0
   ld  (Seed),a
-  and %01111110
   cp  b
   jr  nc,Random
   add a,2
   ret
 
   cp  b
   jr  nc,Random
   add a,2
   ret
 
+ldhl32a:
+  ld  l,a
+  ld  h,0 ;=hl
+  add hl,hl
+  add hl,hl
+  add hl,hl
+  add hl,hl
+  add hl,hl ;32=scr.width
+  ret ;ld hl,32*a
+
+mmldir5:
+  ld  hl,5 ;=ahl
+  cal _MM_LDIR_SET_SIZE
+  jp  _RAM_PAGE_1
+
 wormdead:
   pop hl ;<<call
 WormDead:
 wormdead:
   pop hl ;<<call
 WormDead:
-#ifdef invincible
-  jp  stopworm
-#endif
   ld  a,2
   ld  (flashtime),a
   ld  a,2
   ld  (flashtime),a
+#ifdef w00t
+  ld  h,201
+ .org $-2
+  nop
+ .org $+1
+#endif
   ld  (ix+delay),rspawndelay
 
 thislevel =$+1
   ld  (ix+delay),rspawndelay
 
 thislevel =$+1
@@ -3108,11 +3202,16 @@ handledworm =$-2
   ld  (ix+pos2),a ;y2
   ld  (ix+pos2+1),a ;x2
 
   ld  (ix+pos2),a ;y2
   ld  (ix+pos2+1),a ;x2
 
+  ld  a,(handledworm) ;who are we? (1-4)
+  cpl ;invert (just bit 0 actually)
+  and 1 ;group 1 (1,3) or 0 (2,4)
+  ld  (ix+reserv),a ;reset halflap|flags to starting settings
+
   inc (ix+died)
   dec (ix+lives)
   psh af
   inc (ix+died)
   dec (ix+lives)
   psh af
-  ld  a,(gametype)
-  cp  gamectf ;ctf no death penalty
+  ld  a,(gamecar)
+  and _datadecs ;ctf and race no death penalty
   cal nz,DecScore10
   pop af
   ret nz ;HandleWorm done
   cal nz,DecScore10
   pop af
   ret nz ;HandleWorm done
@@ -3149,36 +3248,6 @@ loadtxtgame: ;in:d=0; out:hl=txtGame+(gametype); destr:ade
   ld  (CURtxtGame),hl ;save for g/o
   ret
 
   ld  (CURtxtGame),hl ;save for g/o
   ret
 
-#ifdef optdie
-checkhitotherworm:
- .db  $dd,$7d ;ld a,lx
-  cp  worm2&255
-  psh ix
-  jr  nz,chkworm2 ;ret nz
-  ld  ix,worm1
-  jr  chkworm
-chkworm2:
-  ld  ix,worm2
-chkworm:
-  ld  h,(ix+tail+1)
-  ld  l,(ix+tail)
-  ld  e,(ix+head)
-  ld  d,(ix+head+1)
-  cal ChkWorm
-  pop ix
-  ret z ;not hit
-  pop bc ;call
-stopworm:
-  ld  bc,0
-previouspos =$-2
-  ld  de,0
-  ld  (ix+pos),c
-  ld  (ix+pos+1),b
-  ld  (ix+pos2),e
-  ld  (ix+pos2+1),d
-  ret
-#endif
-
 CheckPea: ;@hl; destr:abcde
   ld  c,l
   ld  a,(sprsize)
 CheckPea: ;@hl; destr:abcde
   ld  c,l
   ld  a,(sprsize)
@@ -3400,17 +3469,10 @@ showstats:
   ld  a,(gamecar)
   and _datatime
   jr  nz,timematchscore ;no disp for timematches
   ld  a,(gamecar)
   and _datatime
   jr  nz,timematchscore ;no disp for timematches
-  ld  hl,$FC00 ;&&&only necessary in deathmatch
-  ld  b,6*16-1 
-clearstats:
- ; ld  (hl),a ;=0
- ;&&&&&&
-  inc hl
-  dnz clearstats
 forceshowstats:
   psh ix
 forceshowstats:
   psh ix
-  ld  h,0
-  ld  l,h
+  and a
+  sbc hl,hl ;hl=0
   ld  (_penCol),hl
   ld  a,(nrworms)
   ld  b,a
   ld  (_penCol),hl
   ld  a,(nrworms)
   ld  b,a
@@ -3419,8 +3481,9 @@ forceshowstats:
   and _datasingl
   jr  nz,showstatsS
 showstatloop:
   and _datasingl
   jr  nz,showstatsS
 showstatloop:
-  psh bc
+#ifdef gamenames
 #ifdef longnames
 #ifdef longnames
+  psh bc
   ld  b,3
   psh ix
 shownameloop: ;1st 3 chars
   ld  b,3
   psh ix
 shownameloop: ;1st 3 chars
@@ -3434,42 +3497,47 @@ nameshown:
   ld  a,':'
   cal _vputmap
   pop ix
   ld  a,':'
   cal _vputmap
   pop ix
+  pop bc
 #else
   ld  a,(ix+name)
   cal __vputmap
   ld  a,':'
   cal __vputmap
 #endif
 #else
   ld  a,(ix+name)
   cal __vputmap
   ld  a,':'
   cal __vputmap
 #endif
-  cal showstat
+#endif
+  ld  a,(wormbeglives)
+  or  a
+  cal nz,showlives ;lives when initlives>0
+  ld  a,' '
+  cal __vputmap ;small div
+  ld  a,(gametype)
+  cp  gamedeathm
+  cal nz,showscore ;score in !dm
+  ld  a,$D8
+  cal __vputmap ;div
+
   ld  de,worm2-worm1
   add ix,de ;next
   ld  de,worm2-worm1
   add ix,de ;next
-  ld  hl,_penCol
-  ld  a,(hl)
-  add a,4 ;div
-  ld  (hl),a
-  pop bc
   dnz showstatloop
   pop ix
   ret
 
   dnz showstatloop
   pop ix
   ret
 
-showstat: ;(multiplayer)
-  ld  a,(wormbeglives)
-  or  a
-  jr  nz,showlives
 showscore:
   cal ldscoreinhl
 showscore:
   cal ldscoreinhl
+  psh bc
   cal _D_HL_DECI
   cal _D_HL_DECI
+  pop bc
   jr  __vputs
   jr  __vputs
-showlives:
-  ld  a,(ix+lives)
-  jr  cshowA00
 
 
-cshowA: ;small w/ leading 0
+cshowA: ;small w/ leading 0; 0='none'
   or  a ;destr. ahl
   jr  nz,cshowA00
   ld  hl,txtNone
   jp  _vputs
   or  a ;destr. ahl
   jr  nz,cshowA00
   ld  hl,txtNone
   jp  _vputs
-cshowA00:
+
+showlives:
+  ld  a,(ix+lives)
+cshowA00: ;small w/ leading 0
   ld  l,a
   ld  h,0
   cal _divHLby10
   ld  l,a
   ld  h,0
   cal _divHLby10
@@ -3572,13 +3640,7 @@ FieldHeight =$-1
   jr  c,NotMaxYScroll
   ld  a,(FieldHeight)
 NotMaxYScroll:
   jr  c,NotMaxYScroll
   ld  a,(FieldHeight)
 NotMaxYScroll:
-  ld  l,a
-  ld  h,0
-  add hl,hl
-  add hl,hl
-  add hl,hl
-  add hl,hl
-  add hl,hl
+  cal ldhl32a
   psh bc                        ; >> 1
   psh de                        ; >> 2
   ld  de,ScrBuffer
   psh bc                        ; >> 1
   psh de                        ; >> 2
   ld  de,ScrBuffer
@@ -3789,9 +3851,9 @@ ChunkRow:
 ; |_____/ |    \_ |     | |__|__|
 ;_______________________________________________________________________________
 
 ; |_____/ |    \_ |     | |__|__|
 ;_______________________________________________________________________________
 
-;--- pixel ---
+;--- pixel ---------------------------------------------------------------------
 
 
-chk4pixels: ;&&
+chk4pixels:
   cal CheckPixel
   inc b
   cal CheckPixel
   cal CheckPixel
   inc b
   cal CheckPixel
@@ -3808,41 +3870,39 @@ CheckPixel: ;at bc in d
   dec d
   ret
 
   dec d
   ret
 
-;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
-;(b,c) to hl:a; "destroyes" ahl
+;--- findpixel -----------------------------------------------------------------
 
 
+;Based on Snake86's findpixel
+;160-262 cycles; 31 bytes
 FindPixel: ;(b,c) to hl:a
 FindPixel: ;(b,c) to hl:a
+  psh bc
   ld  h,0
   ld  h,0
-  ld  l,c    ;hl=y
+  ld  l,c   ;hl=y
   add hl,hl
   add hl,hl
   add hl,hl
   add hl,hl
-  ld  a,b    ;a=x
+  ld  a,b   ;a=x
   rra
   add hl,hl
   rra
   add hl,hl
   rra
   add hl,hl
   rra
   add hl,hl
-  add hl,hl  ;hl=32*y
-  rra        ;a=x/8
+  add hl,hl ;hl=32y
+  rra       ;a=x/8
   or  l
   ld  l,a
   or  l
   ld  l,a
-  ld  a,b
+  ld  a,b   ;x
   and 7
   and 7
-  cpl
-  rlca
-  rlca
-  rlca
-  ld  (FP_Bit),a
-  xor a
-FP_Bit =$+1
-  set 0,a
-
-  psh de ;&&& C`MON! THIS IS UGLY! *hit myself*
-  ld  de,ScrBuffer
-  add hl,de
-  pop de
+  inc a
+  ld  b,a
+  ld  a,1
+pixelloop:
+  rrca
+  dnz pixelloop
+  ld  bc,ScrBuffer
+  add hl,bc
+  pop bc ;destr:none
   ret
 
   ret
 
-;--- objects ---
+;--- objects -------------------------------------------------------------------
 
 drawstuff:
   ld  a,(hl)
 
 drawstuff:
   ld  a,(hl)
@@ -3874,7 +3934,7 @@ drawsmtn:
 ; dec a ;4 = circle
 ; jp  z,drawcircle
 
 ; dec a ;4 = circle
 ; jp  z,drawcircle
 
-;--- circle ---
+;--- circle --------------------------------------------------------------------
 
 ;IMHO, one weery nice routine. Oh lemme be proud just *once*.
 ;Not perfect since it uses a screwy lineroutine to draw stuff
 
 ;IMHO, one weery nice routine. Oh lemme be proud just *once*.
 ;Not perfect since it uses a screwy lineroutine to draw stuff
@@ -3931,6 +3991,8 @@ circledraw:               ;destr:de
   psh hl
   ld  a,h              ;hl=x,y
   sub b                ;bc=xx,yy
   psh hl
   ld  a,h              ;hl=x,y
   sub b                ;bc=xx,yy
+       jr  nc,$+3              ;x<xx
+       xor a                   ;left of screen -> x=0
   ld  d,a              ;d=x-xx
   add hl,bc            ;h=x+xx; l=y+yy
   ld  e,l              ;e=y+yy
   ld  d,a              ;d=x-xx
   add hl,bc            ;h=x+xx; l=y+yy
   ld  e,l              ;e=y+yy
@@ -3938,6 +4000,8 @@ circledraw:               ;destr:de
   ld  a,l
   sub c                ;a=y again
   sub c
   ld  a,l
   sub c                ;a=y again
   sub c
+       jr  nc,$+3              ;y<yy
+       xor a                   ;above screen -> y=0
   ld  l,a              ;l=y-yy
   ld  e,l              ;e=l=y-yy
   cal drawline         ;(h-b,l-c)-(h+b,l-c)
   ld  l,a              ;l=y-yy
   ld  e,l              ;e=l=y-yy
   cal drawline         ;(h-b,l-c)-(h+b,l-c)
@@ -3947,7 +4011,7 @@ circledraw:               ;destr:de
   pop hl
   ret                  ;thats it
 
   pop hl
   ret                  ;thats it
 
-;--- box ---
+;--- box -----------------------------------------------------------------------
 
 drawbox: ;(d,e)-(h,l)
   ld  b,l ;Delta-y
 
 drawbox: ;(d,e)-(h,l)
   ld  b,l ;Delta-y
@@ -3959,7 +4023,7 @@ boxloop:
   dnz boxloop
   ret
 
   dnz boxloop
   ret
 
-;--- fatline ---
+;--- fatline -------------------------------------------------------------------
 
 drawfatline:
   cal drawline
 
 drawfatline:
   cal drawline
@@ -3973,7 +4037,7 @@ drawfatline:
   dec h
 ; jp  drawline
 
   dec h
 ; jp  drawline
 
-;--- line ---
+;--- line ----------------------------------------------------------------------
 
 ;A lot like Scabby's line routine in Wonderworm (dunno whether he wrote it
 ;himself tho.) I did make a few optimizations and commented the thing.
 
 ;A lot like Scabby's line routine in Wonderworm (dunno whether he wrote it
 ;himself tho.) I did make a few optimizations and commented the thing.
@@ -4023,7 +4087,7 @@ lineYincs:                ;lets assume y incs as well
   pop hl               ;       :<hl
 
 linedrawxloop:
   pop hl               ;       :<hl
 
 linedrawxloop:
-  psh af               ;init z=dy-dx
+  psh af               ;init z=2dy-dx
   ld  a,(hl)
   or  c                        ;|c:hl
   ld  (hl),a
   ld  a,(hl)
   or  c                        ;|c:hl
   ld  (hl),a
@@ -4049,16 +4113,18 @@ DoneLine:
   ret
 
 SteepLine:
   ret
 
 SteepLine:
-  ld  h,a              ;h=deltay
-  neg                  ;a=-deltay
-  ld  (line3sm+1),a
+  ld  l,a
+  neg
+  ld  (line3sm+1),a    ;=-deltay
+  rra
+  ld  h,a              ;h=-deltay/2
   ld  a,b
   ld  a,b
-  ld  (line4sm+1),a    ;a=deltax
-  sub h                        ;a=deltax-deltay
-  ld  b,h              ;b=deltay
+  ld  (line4sm+1),a    ;=deltax
+  add a,h              ;a=deltax-deltay/2
+  ld  b,l              ;b=deltay
   pop hl               ;       :<hl
 linedrawyloop:
   pop hl               ;       :<hl
 linedrawyloop:
-  psh af               ;init z=2(dx-dy)
+  psh af               ;init z=2dx-dy
   ld  a,(hl)
   or  c                        ;|c:hl
   ld  (hl),a
   ld  a,(hl)
   or  c                        ;|c:hl
   ld  (hl),a
@@ -4086,7 +4152,7 @@ line4sm:
 timeout = $8000
 lossout = 20
 
 timeout = $8000
 lossout = 20
 
-;--- multiple bytes ---
+;--- multiple bytes ------------------------------------------------------------
 
 sendstuff:
   psh de
 
 sendstuff:
   psh de
@@ -4111,7 +4177,7 @@ recvstuffloop:
   pop de
   ret
 
   pop de
   ret
 
-;--- foo ---
+;--- foo -----------------------------------------------------------------------
 
 receivenewpeaoverlink:
   cal Qrecv ;Crecv
 
 receivenewpeaoverlink:
   cal Qrecv ;Crecv
@@ -4131,7 +4197,7 @@ sendnewpeaoverlink:
   ld  c,h
 ; jr  Qsend ;that's why it's here
 
   ld  c,h
 ; jr  Qsend ;that's why it's here
 
-;--- send ---
+;--- send ----------------------------------------------------------------------
 
 Qsend:         ;--- try to send 8 bits in C; CF=error --- destr:abcde ---
   nop \ nop
 
 Qsend:         ;--- try to send 8 bits in C; CF=error --- destr:abcde ---
   nop \ nop
@@ -4160,7 +4226,7 @@ sendfinish:
   ld (linklosses),a    ;reset number of losses
   ret                  ;=ok
 
   ld (linklosses),a    ;reset number of losses
   ret                  ;=ok
 
-;--- recv ---
+;--- recv ----------------------------------------------------------------------
 
 Crecv:         ;--- receive 8 bits into A/C --- destr:abCde ---
   cal Qrecv
 
 Crecv:         ;--- receive 8 bits into A/C --- destr:abCde ---
   cal Qrecv
@@ -4195,7 +4261,7 @@ recvfinish:
   ld (linklosses),a    ;reset number of losses
   ret
 
   ld (linklosses),a    ;reset number of losses
   ret
 
-;--- common ---
+;--- common --------------------------------------------------------------------
 
 linkok:
   ld  a,D0HD1H
 
 linkok:
   ld  a,D0HD1H
@@ -4300,12 +4366,13 @@ LevelDefC: ;ctf
 ; |_____/ |     |    |    |     |
 ;_______________________________________________________________________________
 
 ; |_____/ |     |    |    |     |
 ;_______________________________________________________________________________
 
-;--- graphics ---
+;--- graphics ------------------------------------------------------------------
 
 wtPicture: ;title
 
 wtPicture: ;title
-.db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
-.db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000
-.db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000
+;             %00000000,%00000000,%00000000,%00000000,%00000000,%00000000,
+.db %00011110,                                                            %00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
+.db %00111110,                                                            %00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000
+.db %01110000,                                                            %00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000
 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000,%00110000,%01111100,%00010001,%11001001,%00001000,%00100000,%10000010,%00010000
 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000,%00110000,%11101100,%00010001,%11000100,%10000001,%00000100,%10001110,%00001000
 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000,%00110000,%11000110,%00001100,%00000010,%01100010,%10011100,%00010001,%00001000
 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000,%00110000,%01111100,%00010001,%11001001,%00001000,%00100000,%10000010,%00010000
 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000,%00110000,%11101100,%00010001,%11000100,%10000001,%00000100,%10001110,%00001000
 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000,%00110000,%11000110,%00001100,%00000010,%01100010,%10011100,%00010001,%00001000
@@ -4320,6 +4387,7 @@ wtPicture: ;title
 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00000011,%11111111,%11110000,%00111110,%00011110,%00010111,%01011101,%10010101,%01100101
 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00000000,%11111111,%11100000,%00000000,%00000000,%11100101,%01010101,%01000110,%01010011
 
 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00000011,%11111111,%11110000,%00111110,%00011110,%00010111,%01011101,%10010101,%01100101
 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00000000,%11111111,%11100000,%00000000,%00000000,%11100101,%01010101,%01000110,%01010011
 
+#ifdef coolzgfx
 wtWormy: ;g/o
 .db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000
 .db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000
 wtWormy: ;g/o
 .db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000
 .db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000
@@ -4328,14 +4396,12 @@ wtWormy: ;g/o
 .db %01001100,%00011000,%00000000,%00000100,%00011000,%11011111,%01100010,%11001100,%00110011,%01101101,%10000111,%11000001,%00011100,%00111000,%00011000,%10000010
 .db %01010010,%00100100,%01100000,%00011000,%00011111,%11011011,%11101110,%11111100,%00011111,%01111000,%11110110,%11100000,%11000000,%11000110,%00101001,%10000010
 .db %01100001,%11000011,%10011111,%11100000,%00001111,%10001001,%11001100,%01111000,%00001110,%00110000,%01100110,%01100000,%00111111,%00000001,%11000110,%01111100
 .db %01001100,%00011000,%00000000,%00000100,%00011000,%11011111,%01100010,%11001100,%00110011,%01101101,%10000111,%11000001,%00011100,%00111000,%00011000,%10000010
 .db %01010010,%00100100,%01100000,%00011000,%00011111,%11011011,%11101110,%11111100,%00011111,%01111000,%11110110,%11100000,%11000000,%11000110,%00101001,%10000010
 .db %01100001,%11000011,%10011111,%11100000,%00001111,%10001001,%11001100,%01111000,%00001110,%00110000,%01100110,%01100000,%00111111,%00000001,%11000110,%01111100
-
 ;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000
 ;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000
-
-#ifndef coolzgfx
+#else
 txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
 #endif
 
 txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
 #endif
 
-;--- menus ---
+;--- menus ---------------------------------------------------------------------
 
 txtMenu:   .db                  "Mode",0 ;1st menu item
           .db                 "Level",0 ;2nd
 
 txtMenu:   .db                  "Mode",0 ;1st menu item
           .db                 "Level",0 ;2nd
@@ -4363,7 +4429,7 @@ txtpMenu:  .db                "Resume",0 ;1st menu item
 pospMenu:  .db 4
           .dw $3418,$331E,$2F24,$3A2A
 
 pospMenu:  .db 4
           .dw $3418,$331E,$2F24,$3A2A
 
-;--- text ---
+;--- text ----------------------------------------------------------------------
 
 txtGame:   .db          "Singleplayer",0
 txtGame1:  .db               "Peaworm",0
 
 txtGame:   .db          "Singleplayer",0
 txtGame1:  .db               "Peaworm",0
@@ -4408,7 +4474,7 @@ txtScore:  .db                 "Score",0 ;follows txtDied
 txtLeft:   .db                 " left",0 ;follows txtScore
 txthiscore:.db             "HiScore:";,0
 
 txtLeft:   .db                 " left",0 ;follows txtScore
 txthiscore:.db             "HiScore:";,0
 
-;--- foo ---
+;--- foo -----------------------------------------------------------------------
 
 trigtable: .db    0,  3,  6,  9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45
            .db   48, 51, 54, 57, 59, 62, 65, 67, 70, 73, 75, 78, 80, 82, 85, 87
 
 trigtable: .db    0,  3,  6,  9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45
            .db   48, 51, 54, 57, 59, 62, 65, 67, 70, 73, 75, 78, 80, 82, 85, 87
@@ -4417,26 +4483,16 @@ trigtable: .db    0,  3,  6,  9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45
            .db                                                              127
 
 #ifdef intlevels
            .db                                                              127
 
 #ifdef intlevels
-datalevels:.dw LevelDef,LevelDefM,LevelDefT,LevelDefM,LevelDefM
-           .dw          LevelDefM,LevelDefM,LevelDefR,LevelDefC
-nrlevels:  .db 2,3,1,3,3,3,3,3,1,0  ;=defaults
+datalevels:.dw  LevelDef,LevelDefM,LevelDefT,LevelDefM,LevelDefM
+           .dw           LevelDefM,LevelDefM,LevelDefR,LevelDefC
+nrlevels:  .db                               2,3,1,3,3,3,3,3,1,0
 defhiscrpos:
 defhiscrpos:
-           .db 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI"
+           .db 0,0,"SHI",0,0,"SHI",0,0,"SHI",0,0,"SHI",0,0,"SHI"
 #else
 #else
-defhiscrpos =  0
+defhiscrpos =  -42
 #endif
 
 #endif
 
-;--- game settings ---
-
-_datalink   =  %00000001 ;linkplay (1!)
-_datafoodl  =  %00000010 ;left=0 limit
-_datasingl  =  %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel) &&1?
-_dataPctf   =  %00001000 ;ctf peas=1
-__bitPctf   =  3
-_datatime   =  %00010000 ;time incs score (timematch)
-;reserved      %00100000 ;for future use
-_datafood   =  %01000000 ;food present=0 (6!)
-_dataPmult  =  %10000000 ;multiple peas=1 (no _datafood) (7!)
+;--- game settings -------------------------------------------------------------
 
 savestart:;---
 
 
 savestart:;---
 
@@ -4453,6 +4509,16 @@ worm4set:  .dw worm4p
            .db  %11111101,0,K_PLUS,K_ENTER
 worm4name: .db   "JIM     ",0
 
            .db  %11111101,0,K_PLUS,K_ENTER
 worm4name: .db   "JIM     ",0
 
+_datalink   =  %00000001 ;linkplay (1!)
+_datafoodl  =  %00000010 ;left=0 limit
+_datasingl  =  %00000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
+_dataPctf   =  %00001000 ;ctf peas=1
+__bitPctf   =  3
+_datatime   =  %00010000 ;time incs score (timematch)
+_datadecs   =  %00100000 ;decrease score on death=1
+_datafood   =  %01000000 ;food present=0 (6!)
+_dataPmult  =  %10000000 ;multiple peas=1 (no _datafood) (7!)
+
          ;            �game info (see above)
           ;           | �lives (0=unlimited)
            ;          | | �nrworms (can be altered by user)
          ;            �game info (see above)
           ;           | �lives (0=unlimited)
            ;          | | �nrworms (can be altered by user)
@@ -4462,19 +4528,19 @@ worm4name: .db   "JIM     ",0
                ;      | | | |  |  |  �turn speed (8=def)
                 ;     | | | |  |  |  |  �score limit (0=none)
 gamesingle  =  0 ;    | | | |  |  |  |  |
                ;      | | | |  |  |  �turn speed (8=def)
                 ;     | | | |  |  |  |  �score limit (0=none)
 gamesingle  =  0 ;    | | | |  |  |  |  |
-datasingle:.db %00000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
+datasingle:.db %00100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
 gamepeas    =  1
 gamepeas    =  1
-datapeas:  .db %00000100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth)
+datapeas:  .db %00100100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth)
 gametron    =  2
 gametron    =  2
-datatron:  .db %01010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
+datatron:  .db %01110100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
 gamedeathm  =  3
 gamedeathm  =  3
-datadeathm:.db %01000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
+datadeathm:.db %01100000,3,2,1,-1,42, 8, 0 ;Deathmatch (3 lives, 50 growth)
 gamefoodm   =  4
 gamefoodm   =  4
-datafoodm: .db %00000000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
+datafoodm: .db %00100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
 gamemfoodm  =  5
 gamemfoodm  =  5
-datamfoodm:.db %11000010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas)
+datamfoodm:.db %11100010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas)
 gametimem   =  6
 gametimem   =  6
-datatimem: .db %01010000,1,2,1,-1, 0, 8, 0 ;Timematch (1 live, cont.growth)
+datatimem: .db %01110000,1,2,1,-1, 0, 8, 0 ;Timematch (1 live, cont.growth)
 gamerace    =  7
 datarace:  .db %01000000,0,2,1,-1,-1, 8,10 ;Race (100 score)
 gamectf     =  8
 gamerace    =  7
 datarace:  .db %01000000,0,2,1,-1,-1, 8,10 ;Race (100 score)
 gamectf     =  8
@@ -4485,7 +4551,7 @@ gamecar:         ;made before needed (not saved)
 
 saveend:;---
 
 
 saveend:;---
 
-startdelay  =  17
+startdelay  =  42
 rspawndelay =  31
 maxnamesize =  8+1
 
 rspawndelay =  31
 maxnamesize =  8+1