wormy 0.97.116
[wormy.git] / wormy.z80
index 22fc9186eee1171cdf216892eebe266110189862..18efe0cc6bdaff4a1d604d71d9d796c39e14fccf 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
-; Title                      : Wormy
-; Version                    : 96% (0.96.C14)
-; Release Date               : UUHHhhh... soon?!?
-; Filename                   : wormy.86p (5kb)
-; Author(s)                  : Shiar
-; Email Address              : wormy@shiar.org
-; Web Page                   : www.shiar.org
-; Description                : ruling Nibbles-like game 1-4 players
-; Where to get this game     : www.shiar.org (home of Wormy)
-; Other games by author(s)   : Nemesis beta
-; Additional Credits to      : Matthew Shepcar (wrote original Peaworm, end'98)
-;                              Jonah Cohen (helped writing worm)
-
-;-----------------------------
-;----------- TO-DO -----------
-;-----------------------------
-
-; 96% = DONE
-
-;    [* internal levels         ]
-;    [  * check levels/gametype ]
-;    [  * enough hiscore saves! ]
-;    [* complete readme         ]
-;  1% * misc (pollish, bugs, &&&)
-;  1% * long length save (level#6)
-;     * mem at worm #4
-;   * LINK
-;  1% * transmit game/level data
-;      Xfirst packet loss?? or vti onlyXXXXX
-;      X1/3 worms over linkXXXX
-;      Xsend new peas' positionsXXXXX
-
+;___����________________________________________________________����____________
+;  ����                                                         �����
+; ���                                                            ����     ����
+;���      �����          ��������       �����     ����  ����      ���     �����
+;���     �������       �����������     �������   �������������     ��    ��� ���
+;��     ���   ���     �����    ����   ����  ��� ���  ����  ���     ���  ���� ���
+;��     ��     ��     ��  �      ��� ����      ���  ������  ���    ���  ���   ��
+;��     ��     ��     �� ��      ��� ���       ��� ���� ��� ���    ��� ����   ��
+;��     ���   ���     �� ��       �� ���       �������   ��� ��     �������   ��
+;��     ���   ���    ��� ��       �� ��        �� ���    ��� ���     �����   ���
+;���     ��� ���     ��� ��       �� ���       �� ����  ���� ���             ���
+;���      �����     ���  ���     ��� ���       ��  ��������  ���            ���
+; ���      ���      ���  ���     ��� ���       ���  ������   ���            ���
+;  ����  �������  ����    ���   ���  ����      ���            �����       ����
+;   �������� ��������     ���������   ���      ���             ���������������
+;    �����     �����       �������     ��       ���              �����������
+;_______________________________________________________________________________
+;
+; Version                  :                                      97% (0.97.116)
+; Release Date             :                                     2002 January 16
+; 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
+; Other games by author(s) :                                        Nemesis beta
+; Additional Credits to    : Matthew Shepcar  :   wrote original Peaworm, end'98
+;                            Jonah Cohen      :              helped writing worm
+; Files                    : wormy.z80 (89kB) : 515ad14b922572bdc8a96e780b8b24ca
+;                            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.
+
+;_______________________________________________________________________________
+; _______  _____       ______   _____
+;    |    |     |      |     \ |     |
+;    |    |_____| ____ |_____/ |_____|
+;_______________________________________________________________________________
+
+; 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?
+;  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: Free Bird
+;     * LVL: Jonah?
+;
 ;100% = bugs fixed + levels done
-
-; MAYBE: sound
-; NO:   coop
-
-;-----------------------------
-;-----------------------------
-;-------  W O R M Y  ---------
-;-----------------------------
-;-----------------------------
-
-#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 readytext  ;displays "prepare" before level starts
-;#define invincible ;worms cannot die =)
-;#define optdie     ;in race games worms don't die when they run into each other
-
-#define cal call
-#define psh push
-#define dnz djnz
+;     * correct team winners
+;     * arrow to offscreen peas
+;110% * sound
+;     * startpos
+;120% * coop (DON'T COUNT ON IT)
+;     * pause in linkplay
+
+;_______________________________________________________________________________
+;  _/_/_____ __   _ _______        _     _ ______  _______
+; _/_/   |   | \  | |       |      |     | |     \ |______
+; / /  __|__ |  \_| |_____  |_____ |_____| |_____/ |______
+;_______________________________________________________________________________
 
 #include "asm86.h"
 #include "ti86asm.inc"
 
+ #define cal call
+ #define psh push
+ #define dnz djnz
+
 _SHRACC            = $4383 ;4x srl a
 _SHLACC            = $438B ;4x sll a
 _divHLby10         = $4044 ;hl=hl/10
@@ -86,38 +149,55 @@ _load_ram_ahl      = $462F ;ahl->page+hl
 _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
-
-;-----------------------------
-;------- data  storage -------
-;-----------------------------
-
-;--- permanent
-
-ScrBuffer   = $8820 ;-A7FF (20*FF=1FE0)
+_GETB_AHL          = $46C3 ;a=(ahl) \ hl=ahl
+
+ #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 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
+
+;_______________________________________________________________________________
+; _______ _______  _____   ______ _______  ______ _______
+; |______    |    |     | |_____/ |_____| |  ____ |______
+; ______|    |    |_____| |    \_ |     | |_____| |______
+;_______________________________________________________________________________
+
+;--- permanent ---
+
+ScrBuffer   = $8420 ;-A3FF (20*FF=1FE0)
+worm4p      = $A400 ;-A5FF (200)      %101001O0
+;free       = $A600 ;-A7FF (200)
 worm2p      = $A800 ;-ABFF (400)      %10101O00
-worm1       = $AC00 ;-AC1D (31d)
-worm2       = $AC1F ;-AC3B (1F)
-worm3       = $AC3E ;-AC59 (1F)
-worm4       = $AC5D ;-AC77 (1F)
-balls       = $AC7C ;-ACFF (3x43d)
-SinCosTable = $AD00 ;-AE00 (4*40)
-        ;free $AE01 ;-AFFF (1FF)
+SinCosTable = $AC00 ;-AD00 (4*40)
+worm1       = $AD01 ;-AD1E (1E)
+worm2       = $AD1F ;-AD3C (1E)
+worm3       = $AD3D ;-AD5A (1E)
+worm4       = $AD5B ;-AD78 (1E)
+balls       = $AD79 ;-AE00 (<=3x2D) (bb<=45)
+turn10      = $AE01 ;-AE01 (1)     (counter)
+peaspos     = $AE02 ;-AF05 (4-260)    (peas)
+;free       = $AF06 ;-AFFF (F9)
 worm1p      = $B000 ;-B7FF (800)      %1011O000
 worm3p      = $B800 ;-BBFF (400)      %10111O00
-        ;free $BF91 ;-BFFF (6F)
-     ;program $D748 ;-EFFF (186D+4A)
-worm4p      = $F000 ;-F3FF (400)      %11110O00
-leveldata   = $F400 ;-FA70 (<=671)
-
-turn10      = $AE01 ;      (1) (counter)
-peaspos     = $AE02 ;-AE05 (4) (peas)
+;buffer     = $BC00 ;-BF90 (390)
+;free       = $BF91 ;-BFFF (6F)
+;program    = $D748 ;-EFFF (186D+4A)           ;6327
+leveldata   = $F080 ;-F9FF (<=97F)
+#ifndef intlevels
+datalevels  = $FA00 ;-FA11 (12) (>=$C000)
+nrlevels    = $FA12 ;-FA1B (A)   (<$FA70)
+defspr      = $F078 ;-F07F (8)
+#endif
 
-;MEM|8---9---A---B---C---D---E---F---|
-;   |..[------]||[]|......[-----]|[].|
-;   |   SCREEN 2* 13      PRGM   4LV |
+;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong
+;   |..[------]||[]|......[-----]|[].| ;if you still understand    < OUTDATED <
+;   |   SCREEN 2* 13      PRGM   4LV | ;after looking at this
 
-;--- temporary
+;--- temporary ---
 
 namelength  = $BC00 ;(1)         @menu
 datalink    = $BC00 ;(8)        @init
@@ -126,39 +206,74 @@ DispBuffer  = $BC00 ;(10x57d)    @game
 #else
 DispBuffer  = $FC70
 #endif
-
-;-----------------------------
-;------- program start -------
-;-----------------------------
-
-.org _asm_exec_ram
-
-wormVhost   = 095
-wormVclient = 195
-
-start:
-  nop
+linklevel   = $AECC ;(<=134)     @game+init
+lefttotalb  = $BF91 ;(1)         @game
+drawctfpea1 = peaspos+4
+drawctfpea2 = peaspos+6
+
+;--- layout ---
+
+;(wormN)             set:
+heading     =   0   ;level*
+pos         =   2   ;level*
+pos2        =   4   ;level
+grow        =   6   ;level
+died        =   8   ;game:
+score       =   9
+delay       =   11
+lives       =   12
+head        =   13
+                    ; �15B (wormNset)
+tail        =   15  ; |also@next level
+storepos    =   17  ; |
+reserv      =   18  ; |loop (race:lap|ctf:pea)
+left        =   19  ; |
+right       =   20  ; |
+name        =   21  ; |_
+
+wormsize    =   30 ;^mark^
+
+;_______________________________________________________________________________
+;  _____   ______  _____   ______       _______ _______ _______  ______ _______
+; |_____] |_____/ |     | |  ____       |______    |    |_____| |_____/    |
+; |       |    \_ |_____| |_____| _____ ______|    |    |     | |    \_    |
+;_______________________________________________________________________________
+
+ .org %1101011101001000
+
+start:         ;turn back NOW!
+  nop      ;and so it begins...
   jp  Start
-  .db 1
-  nop
-  .dw WormTxt
-  .dw WormIcon
-
-WormTxt:
-  .db "WORMY by SHIAR -- 96% C14",0
+  ld  bc,$5242
+  rst 10h
+ .dw  WormIcon
+  ld  d,a
+  ld  c,a
+  ld  d,d
+  ld  c,l
+  ld  e,c
+  jr  nz,$+100
+  ld  a,c
+  jr  nz,$+$55
+  ld  c,b
+ .dw  16713
+ .db  %1010010
+  jr  nz,$+47
+  dec l
+ .db  " 97% .116",0
 WormIcon:
 .db 8,2
 .db %00000000,%00111100
 .db %00000000,%01010010
 .db %00000000,%01100001
 .db %01100011,%10011001
 .db %10010100,%01101001
 .db %10011001,%00011001
 .db %01000010,%11000001
 .db %00111100,%00111110
.db  8,2
.db  %00000000,%00111100
.db  %00000000,%01010010
.db  %00000000,%01100001
.db  %01100011,%10011001
.db  %10010100,%01101001
.db  %10011001,%00011001
.db  %01000010,%11000001
.db  %00111100,%00111110
 
 levelhead  = 'w'
-levelhead2 = 95 ;wormy levels header = "95"
+levelhead2 = 97 ;wormy levels header = "97"
 
 int_handler:
   ex  af,af'
@@ -193,8 +308,9 @@ Start:
   ldir
   inc a   ;ld a,$D4
   ld  i,a
-  im  2
+  im  2 ;...it *does* work ;)
 
+restart:
   cal _RAM_PAGE_7
   ld  hl,$BFFF ;VAT start
   ld  ix,templevels
@@ -210,11 +326,8 @@ searchloop:
   jr  z,stringfound
 searchnext:
   pop hl
-  dec hl ;5x
-  dec hl
-  dec hl
-  dec hl
-  dec hl
+  ld  de,-5
+  add hl,de
   ld  b,(hl) ;name size
   inc b
 skipname:
@@ -248,7 +361,7 @@ stringfound:
   inc ix
 _searchnext:
   cal _RAM_PAGE_7
-  jr searchnext
+  jr  searchnext
 
 loadgametype:
   psh de
@@ -262,16 +375,30 @@ loadgametype:
   inc bc
   pop af
   pop de ;counter
-  dec d ;8x
+  dec d ;9x
   jr  nz,loadgametype
   ret
 
+;_______________________________________________________________________________
+;        _______ _    _       _______ _______        _______ _______ _______
+; |      |______  \  /        |______ |______ |      |______ |          |
+; |_____ |______   \/   _____ ______| |______ |_____ |______ |_____     |
+;_______________________________________________________________________________
+
 searchcomplete:
   ld  a,255
   ld  (ix),a ;end mark
 
+#ifdef intlevels
   ld  ix,templevels-6
-levelselectmenu:
+#else
+  ld  ix,templevels-3
+#endif
+  cp  (ix+3) ;1st=255
+  jp  z,ExitNoStats ;->no lvls
+  cp  (ix+6) ;2nd=255
+  jr  z,loadlevel1 ;->1 lvl
+levelselectmenu: ;load next page
   psh ix ;offset
   ld  a,-2
   ld  (availevels),a
@@ -283,12 +410,14 @@ levelselectmenu:
   ld  hl,$FC00+(2*16)
   ld  b,16*9
   cal menuinvloop
-  ld  hl,$FC00+(56*16)
+  ld  hl,$FC00+$380 ;(*,56)
   cal hr
   ld  hl,$0601 ;x=1
   ld  (_penCol),hl
 dispnextlevel:
-  ld  a,(ix+3)
+  ld  de,3
+  add ix,de
+  ld  a,(ix)
   ld  b,a
   inc a ;cp 255
   jr  z,__levselect
@@ -301,8 +430,6 @@ displevel:
   ld  (hl),a ;y+6
   cp  49 ;bottom of screen
   jr  nc,_levselect
-  ld  de,3
-  add ix,de
   ld  hl,availevels
   inc (hl)
   ld  a,b ;(ix+0)
@@ -312,8 +439,14 @@ displevel:
   cal _vputs
   jr  dispnextlevel
 
+loadlevel1:
+  psh ix
+  pop hl
+  ld  b,-2
+  jr  loadlevel
+
 readylevelfile: ;selected level at ahl
-; ld  hl,templevels-3
+; ld  hl,templevels-3/0
   ld  a,b
   add a,3 ;sellev+3 (#0==-3)
   ld  e,a
@@ -375,7 +508,11 @@ levdescclearloop:
   cal _vputs
   jr  levselectmenu+1
 __levselect:
+#ifdef intlevels
   ld  ix,templevels-6 ;reset 2 1st page
+#else
+  ld  ix,templevels-3
+#endif
 _levselect:
   ld  b,-2 ;level selected
   jr  levselect
@@ -401,19 +538,21 @@ levselectmenu:
 
 loadlevel:
   cal readylevelfile
+#ifdef intlevels
   or  a ;levelfile on page 0 (=internal)
   jr  z,levelloaded
+#endif
   cal skiptitle ;skip description
 
   cal _Get_Word_ahl
   ld  (leveldataSize),de
 
-  ld  d,8 ;counter
+  ld  d,9 ;counter
   ld  bc,datalevels
   cal loadgametype
   ld  (hilvlposa),a ;singleplayer levels
   ld  (hilvlposhl),hl
-  ld  d,4
+  ld  d,5
   cal loadgametype
 
   cal _SET_ABS_SRC_ADDR ;levelsstart
@@ -448,15 +587,19 @@ setdeflevels:
   add hl,de ;next
   dnz setdeflevels
 
-;-----------------------------
-;----- build trig tables -----
-;-----------------------------
+;_______________________________________________________________________________
+; _______  _____   ______ _______       _____ __   _ _____ _______
+; |  |  | |     | |_____/ |______         |   | \  |   |      |
+; |  |  | |_____| |    \_ |______ _____ __|__ |  \_| __|__    |
+;_______________________________________________________________________________
 
-  ld  hl,TrigPrecalc
-  ld  de,SinCosTable
-  psh de
-  ld  bc,65
-  ldir
+;--- trig tables ---
+
+  ld  hl,trigtable   ;I believe this
+  ld  de,SinCosTable  ;is one of the few
+  psh de              ;pieces of original
+  ld  bc,65            ;Peaworm code still
+  ldir                  ;left intact..
   dec hl
   ld  b,63
 MirrorSineWave:
@@ -475,11 +618,15 @@ NegativeSineWave:
   inc de
   dnz NegativeSineWave
 
-;-----------------------------
-;---------- menu -------------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _______ _____ __   _       _______ _______ __   _ _     _
+; |  |  | |_____|   |   | \  |       |  |  | |______ | \  | |     |
+; |  |  | |     | __|__ |  \_| _____ |  |  | |______ |  \_| |_____|
+;_______________________________________________________________________________
+
+;---draw menu---
 
-DisplayMenu: ;---draw menu---
+DisplayMenu:
   cal linkok
   cal _clrWindow
   ld  de,$FC40 ;(0,4)
@@ -493,16 +640,14 @@ DisplayMenu: ;---draw menu---
   ld  hl,$FC00+$3E0 ;(*,62)
   cal hr
 dispmainmenu:
-  ld  hl,Gametype
-  ld  a,(hl)
+  ld  a,(gametype)
   dec a ;will be inced @changegame
-  and 7
-  ld  (hl),a
+  cal changedgame
   ld  hl,changegame ;dispmenusets ;mainMenu
   psh hl ;jump here after ret
   ld  hl,txtMenu
   ld  ix,posMenu
-;Mode|Level|Limit|Worms|worm #|controls
+;Mode|Level|Link|Worms|worm #|controls
 ; jr  dispmenucommon ;cal
 
 dispmenucommon_:
@@ -533,19 +678,16 @@ dispmenuloop:
 ; ld  b,0 ;b=menu#
   ret
 
-;hr: ;draw horizontal line at hl
-;  ld  b,16
-;  jp  menuinvloop
-
-hr:
+hr: ;draw horizontal line at hl
   ld  b,16
+; jp  menuinvloop ;shorter but not good for pausescreen
 hrloop:
   ld  (hl),-1
   inc hl
   dnz hrloop
   ret
 
-;--- menu loop ---
+;--- options menu ---
 
 dispoptionmenu:
   ld  hl,txtoMenu
@@ -554,13 +696,18 @@ dispoptionmenu:
   cal dispmenucommon_
 
 dispomenusets:
+#ifdef spprotect
+  ld  a,(gamecar)
+  and _datasingl
+  jp  nz,LetsGetThisPartyOn
+#endif
   cal clrold
 
   ld  hl,$1E3E
   ld  (_penCol),hl
   cal loadgamecar
   psh hl
-  cal cshowA0 ;lives
+  cal cshowA ;lives
 
   ld  hl,$2A3E
   ld  (_penCol),hl
@@ -574,7 +721,7 @@ dispomenusets:
   cal _vputs
   jr  dispspeeddone
 dispspeed:
-  cal cshowA0
+  cal cshowA
 dispspeeddone:
 
   ld  hl,$363E
@@ -584,7 +731,7 @@ dispspeeddone:
   psh hl
   ld  a,(hl) ;(growth)
   inc a ;-1=None; 0..98->1..99
-  cal cshowA0
+  cal cshowA
 
   ld  hl,$303E
   ld  (_penCol),hl
@@ -598,7 +745,7 @@ dispspeeddone:
   cal _vputs
   jr  dispturndone
 dispturn:
-  cal cshowA0 ;turn speed
+  cal cshowA ;turn speed
 dispturndone:
 
   ld  hl,$243E
@@ -608,9 +755,12 @@ dispturndone:
   ld  a,(hl) ;(scorelimit)
   or  a
   psh af
-  cal cshowA0 ;limit
+  cal cshowA ;limit
   pop af ;a==0?
   jr  z,optionMenu ;do not display 0 behind 'None'
+  ld  a,c ;(gamecar)
+  rla ;and _dataPmult
+  jr  nz,optionMenu ;in multifood limit == #peas
   ld  a,'0'
   cal _vputmap ;x10
 
@@ -760,7 +910,7 @@ bchangegrowth:
   jr  z,__optionMenu ;<-1
   jr  changedgrowth
 
-;---
+;--- main menu ---
 
 mainMenu:
   cal menupos
@@ -776,9 +926,22 @@ select:   ;2nd/enter
   dec a ;6th: controls
   jp  z,changekeys
   jp  LetsGetThisPartyOn ;otherwise
+
+changenrworms:
+  cal change4spOnly
+  ld  a,(hl) ;hl=nrworms
+  inc a
+  cp  7
+  jr  nc,mainMenu ;may not be >4+2
+changednrworms:
+  ld  (hl),a
+  jr  _dispmenusets ;mainMenu
+
 notselect
   cp  K_EXIT
   jp  z,ExitNoStats
+  cp  K_MORE
+  jp  z,restart
   psh af
   cal menupos
   cal loadgamecar
@@ -803,13 +966,11 @@ selright:
 ; jr  z,changecurworm
 
 changecurworm:
-; hl=nrworms
-  ld  a,(curworm)
-  cp  (hl)
-  jr  nc,mainMenu ;may not become >(nrworms)
-  inc a
-changedcurworm:
-  ld  (curworm),a
+  ld  hl,curworm
+  ld  a,(hl)
+  cp  4
+  jr  nc,mainMenu ;may not become >4
+  inc (hl)
   jr  _dispmenusets ;mainMenu
 
 selleft:
@@ -826,36 +987,24 @@ selleft:
 ; jr  z,bchangecurworm
 
 bchangecurworm:
-  ld  a,(curworm)
-  dec a ;0-3
-  jr  nz,changedcurworm ;save >0
+  ld  hl,curworm
+  ld  a,(hl)
+  dec (hl) ;0-3
+  jr  nz,_dispmenusets ;save >0
+  inc (hl)
+_mainMenu:
   jr  mainMenu
 
-changenrworms:
-  cal change4spOnly
-  ld  a,(hl) ;hl=nrworms
-  inc a
-  cp  5
-  jr  nc,mainMenu ;may not be >4
-changednrworms:
-  ld  (hl),a
-  jr  _dispmenusets ;mainMenu
-changenrwormsInit:
-  ld  a,(Gametype)
-  cp  3
-  ld  a,(hl) ;hl=nrworms
-  ret
 bchangenrworms:
   cal change4spOnly
   ld  a,(hl) ;hl=nrworms
-  dec a ;0-3
+  dec a ;0-(3+2)
   cp  2
   jr  nc,changednrworms ;save >=2
-_mainMenu:
-  jr  mainMenu
+  jr  _mainMenu
 
 change4spOnly:
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  3
   ret nc
   pop hl ;cal
@@ -865,7 +1014,7 @@ changelink:
 bchangelink:
   cal change4spOnly
   dec hl ;inced earlier
-  dec hl ;gameCar
+  dec hl ;gamecar
   ld  a,1 ;change LS-bit (=link)
   xor (hl) ;0=1; 1=0
   ld  (hl),a
@@ -873,20 +1022,25 @@ _dispmenusets:
   jr  dispmenusets ;mainMenu
 
 changegame:
-  ld  a,(Gametype)
+  ld  a,(gametype)
   inc a
   cal changedgame
   jr  z,changegame
   jr  dispmenusets ;mainMenu
 changedgame:
-  and 7 ;mod 8
-  ld  (Gametype),a
+  cp  9
+  jr  c,changedgameok
+  sub 255-8 ;-1 -> 8
+  jr  nc,changedgameok
+  xor a ;9 -> 0
+changedgameok:
+  ld  (gametype),a
   cal getnrlevels
   xor a
   cp  (hl)
   ret
 bchangegame:
-  ld  a,(Gametype)
+  ld  a,(gametype)
   dec a
   cal changedgame
   jr  z,bchangegame
@@ -912,7 +1066,7 @@ bchangelevel:
   jr  _mainMenu
 
 getnrlevels: ;for current gametype at hl
-  ld  hl,Gametype
+  ld  hl,gametype
   ld  d,0
   ld  e,(hl)
   ld  hl,nrlevels
@@ -937,28 +1091,19 @@ waitcustomkey:
 
 changekeys:
   cal getwormname
-  ld  hl,txtKeyleft
+  ld  hl,txtKleft
   cal getcustomkey ;left
   cal getcustomkey ;right
 ; jr  dispmenusets
 
-;---display current settings---
+;--- display current settings ---
 
 dispmenusets:
-  cal clrold
   ld  de,$183E
   ld  (_penCol),de
-  ld  d,0
-  ld  a,(Gametype)
-  ld  e,a
-  ld  hl,posGame
-  add hl,de ;hl=posGame+(Gametype)
-  ld  a,(hl) ;str.offset
-  ld  e,a ;^d=0^
-  ld  hl,txtGame
-  add hl,de ;txtGameX
-  ld  (CURtxtGame),hl ;save for g/o
-  cal _vputs ;Singleplayer
+  cal clrold
+  cal loadtxtgame
+  cal _vputs ;Singleplayer or smtn
 
   ld  hl,$2A3E ;worms
   ld  (_penCol),hl
@@ -966,12 +1111,19 @@ dispmenusets:
   psh hl
   inc hl
   ld  a,(hl)
+  dec a ;0-5
+  and 3 ;0-3
+  inc a ;1-4
   add a,'0'
   cal _vputmap
+  ld  a,(hl)
+  cp  5
+  ld  hl,txtteamed
+  cal nc,_vputs
 
   ld  hl,$243E
   ld  (_penCol),hl
-  rr  c ;(gameCar)
+  rr  c ;(gamecar)
   ld  hl,txtNo
   jr  nc,displink
   ld  hl,txtYes
@@ -984,11 +1136,11 @@ displink:
   psh bc
   ld  d,0
   cal hlatlevel
-  ld  a,(Gametype)
+  ld  a,(gametype)
   or  a ;gamesingle
   jr  nz,displvlname
   ld  a,(Level)
-  cal cshowA0
+  cal cshowA00
   jr  lvldisped
 displvlname:
   cal _vputs
@@ -1079,16 +1231,16 @@ menunewok:
 
 getwormname: ;of (curworm)
   ld  a,(curworm)
-  add a,a  ;2x
   ld  e,a
+  add a,a  ;2x
   add a,a  ;4x
   add a,a  ;8x
   add a,a ;16x
-  add a,e ;18x
+  sub e   ;15x
   ld  e,a
   ld  d,0 ;de=a
 
-  ld  ix,worm1name-18
+  ld  ix,worm1name-15
   add ix,de
   ret
 
@@ -1102,7 +1254,7 @@ emptyname:
   ld  (hl),' '
   inc hl
   dnz emptyname
-  ld  a,maxnamelength
+  ld  a,maxnamesize
   ld  (namelength),a
 enternameloop:
   ld  hl,$FF07 ;begin pos
@@ -1127,7 +1279,7 @@ nokeypressed:
   jr  nz,continue
 backspace:
   ld  a,(hl)
-  cp  maxnamelength
+  cp  maxnamesize
   jr  nc,nokeypressed
   inc (hl)
   dec ix
@@ -1152,30 +1304,34 @@ continue:
   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 0,"XTOJE0",0      ;enter..clear
-  .db " WSNID9",0       ;(-)..custom
-  .db "ZVRMHC8",0       ;dot..del
-  .db "YUQLGB7#"        ;0..xvar
-  .db $D9,"-PKFA6'"     ;on..alpha
-  .db "54321*",0,$D0    ;F5..more
+  .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
+  .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
 
 nameentered:
   pop ix ;stringbegin
   ld  (ix+8),0 ;end mark
   jp  DisplayMenu
 
-;-----------------------------
-;------- procs-n-stuff -------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _____ _______ _______        _____   ______  _____  _______ _______
+; |  |  |   |   |______ |             |_____] |_____/ |     | |       |______
+; |  |  | __|__ ______| |_____  _____ |       |    \_ |_____| |_____  ______|
+;_______________________________________________________________________________
 
 ubergetkey:
   halt ;woo hoo
   halt ;save them batteries! yeah!
   jp  GET_KEY
 
-clrold:
+clrold: ;destr:acdehl (acd=0)
   ld  hl,$FD97 ;begin pos
   ld  a,35 ;nr of lines
 clroldcustom:
@@ -1194,22 +1350,21 @@ clroldsetsloop:
 
 hlatlevel: ;d must be 0
   psh hl ;loadgamecar
-  ld  a,(Gametype) ;8bytes -> 7bytes
-  ld  e,a
-  add a,a ;nc
-  add a,e
-  add a,a ;8->2bytes
-  add a,24+1 ;go to datalevels
+  ld  a,(gametype)
+  add a,a
   ld  e,a ;=de
-  sbc hl,de ;datalevels
+  ld  hl,datalevels
+  add hl,de ;+2*mode
   cal _ldHLind ;ld hl,(hl)
-  pop de ;de=loadgamecar
-  inc de \ inc de
-  ld  a,(de) ;(curlevel)
+  ex  (sp),hl ;hl=loadgamecar
+  ld  e,2 ;=de
+  add hl,de
+  ld  a,(hl) ;(curlevel)
   ld  (Level),a
-  ld  d,a ;begin level
+  ld  c,a ;begin level
+  pop hl ;@level1
 skiplevelloop:
-  dec d ;levels to skip
+  dec c ;levels to skip
   ret z
   cal skiplevel
   jr  skiplevelloop
@@ -1222,15 +1377,13 @@ skiplvltitle: ;zf=singleplayer
   jr  nz,skiplvltitle
   ret
 
-skiplevel: ;@hl - destr:ab - alter:hl
-  ld  a,(Gametype)
+skiplevel: ;@hl; de=2 - destr:ab - alter:hl
+  ld  a,(gametype)
   or  a ;gamesingle
   psh af
   cal nz,skiplvltitle
-  inc hl
-  inc hl
-  inc hl
-  inc hl ;skip 4
+  add hl,de
+  add hl,de ;skip 4
   ld  b,(hl) ;spritesize
   inc b
 skipsprite:
@@ -1239,49 +1392,39 @@ skipsprite:
   ld  b,(hl) ;balls
   inc b
   inc b ;skip 6
-  pop af ;cp (Gametype),0
-  jr  z,skipworms
+  pop af ;cp (gametype),0
+  jr  z,skipstuff
   inc b ;multiplayer lvl
   inc b
   inc b ;skip other 3 worms (9 bytes)
-skipworms:
-  ld  a,b
-  add a,a
-  add a,b
-  ld  b,a ;3x(balls+2)
-skipballs:
-  inc hl
-  dnz skipballs
-
-skipflags:
-  ld  a,(Gametype)
-  cp  gamectf
-  jr  nz,noflagstoskip
-  inc hl
-  inc hl
-  inc hl
-  inc hl
-noflagstoskip:
-
+skipstuff:
+  add hl,de
+  inc hl ;3x(balls+2)
+  dnz skipstuff
+  sub gamerace ;a=(gametype)
+  jr  z,skiplaps
+  dec a ;gamectf
+  jr  nz,skipobjects
+  add hl,de
+skiplaps:
+  add hl,de
 skipobjects:
   xor a
   or  (hl)
   inc hl ;nf
   ret z ;0=end
-  inc hl
-  inc hl
-  inc hl
-  inc hl
+  add hl,de
+  add hl,de
   jr  skipobjects
 
 loadgamecar:
-;in:    (Gametype)
+;in:    (gametype)
 ;out:   hl=dataTYPE
-;build: c=(gameCar)=(hl-1)
+;build: c=(gamecar)=(hl-1)
 ;       a=(wormbeglives)=(hl)
 ;destr: acdehl
   ld  hl,datasingle
-  ld  a,(Gametype)
+  ld  a,(gametype)
   add a,a
   add a,a
   add a,a ;8 bytes per mode
@@ -1289,147 +1432,200 @@ loadgamecar:
   ld  d,0
   add hl,de
   ld  a,(hl)
-  ld  (gameCar),a
+  ld  (gamecar),a
   ld  c,a
   inc hl
   ld  a,(hl)
   ld  (wormbeglives),a
   ret
 
-;-----------------------------
-;-------- start game ---------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _______ _______  ______ _______        ______ _______ _______ _______
+; |______    |    |_____| |_____/    |          |  ____ |_____| |  |  | |______
+; ______|    |    |     | |    \_    |    _____ |_____| |     | |  |  | |______
+;_______________________________________________________________________________
 
 LetsGetThisPartyOn:
   ld  a,$17 ;no exit
   ld  (CheckExit),a ;set exit state
 
+setupworms:
+  ld  hl,worm1set
+  ld  de,worm1
+  ld  a,4 ;4x (all worms)
+createwormsloop:
+  ex  de,hl
+  ld  bc,died ;0008
+  add hl,bc
+; ld  b,0
+  ld  (hl),b ;+died=0
+  inc hl
+  ld  (hl),b ;+score=0
+  inc hl
+  ld  (hl),b ;+score+1=0
+  inc hl
+  ld  c,2
+  ld  (hl),c ;+delay=2
+  inc hl
+  ld  (hl),3 ;+lives=x
+wormbeglives =$-1
+  inc hl
+  ex  de,hl  ;de=wormX+head
+  ldir       ;+head=+tail (2)
+  dec hl
+  dec hl
+  ld  c,wormsize-tail ;=bc
+  ldir       ;copy 15 bytes
+  dec a      ;loop
+  jr  nz,createwormsloop
+
+OhMyGodItsALabel:  ;pj34r my coding skillz
   cal loadgamecar
-  psh hl
+  psh hl ;datatype
   cal hlatlevel
   ex  (sp),hl ;pop \ psh leveldata
   psh hl ;psh loadgamecar
-  ld  a,0
-gameCar =$-1
+  ld  a,(gamecar)
   rra ;and _datalink
-  jp  nc,StartLevel ;&&&jr
+  jr  nc,_StartLevel
+
+;--- link ---
 
-;--------- link ------------
+wormVhost   = 095
+wormVclient = 195
 
 linkmatch:
   cal _clrWindow
   ld  c,wormVhost
   cal Qsend
-  ld  hl,txtWaiting
+  ld  hl,txtWaitn
   cal _puts
   cal Crecv
   ld  a,c
   cp  wormVclient
-  jr  z,client
-  cp  wormVhost
-  jr  z,host
+  jr  nz,host
+
+;--- client ---
+
+client:
+; ld  hl,txtReceiv
+; cal _puts ;shouldnt be necessary since this part always seems to work afaik
+
+ ;name/keys: wormy#1 = worm #1 = ok
+ ;                 2 = link    = 0  + link (name1)
+ ;                 3 = worm #2 = #2 + local(name2)
+ ;                 4 = link    = 0  + link (name2)
+  ld  e,worm3+left&255
+  cal moveworm2 ;3=2
+  ld  l,worm1+name&255
+  cal sendworm
+  ld  l,worm2+left&255
+  cal linkworm ;worm2+4 over link
+  pop hl ;loadgamecar
+  pop de ;leveldata
+  ld  de,linklevel
+  ld  hl,datalink
+  psh de
+  psh hl ;loadgamecar
+  ld  b,8
+  cal recvstuff ;game setup
+  ld  hl,gametype ;+gamecar
+  ld  b,2
+  cal recvstuff ;transmit game
+  ex  de,hl
+  ld  b,168
+  cal recvstuff ;level
+  ld  d,b
+  cal loadtxtgame ;set CURtxtGame
+
+_StartLevel:
+  jr  StartLevel
+
+linkerror:
   pop hl ;error
   jp  DisplayMenu ;return to menu
 
+;--- set/send worms ---
+
+moveworm2:
+  ld  hl,worm2+left
+moveworm: ;hl=wormN+left
+  ld  d,worm1/256
+  ld  bc,11
+  ldir ;keys+name worm(de) = worm(hl)
+  ret
+linkworm: ;hl=wormN+left
+  ld  (hl),0 ;worm1|2+left
+  inc hl
+  inc hl ;+name
+  ld  b,9
+  cal recvstuff
+  ld  bc,worm3-worm1-11 ;+2
+  add hl,bc ;b=0
+  ld  (hl),b ;worm3|4+left
+  inc hl
+  inc hl ;+name
+  ld  b,9
+  jp  recvstuff
+sendworm: ;hl=wormN+name
+  ld  b,9
+  cal sendstuff
+  ld  bc,worm3-worm1-9
+  add hl,bc ;worm(N+2)+name
+  ld  b,9
+  jp  sendstuff
+
+;--- host ---
+
 host:
+  cp  wormVhost
+  jr  nz,linkerror
   ld  c,wormVclient
   cal Qsend
-  jr  sethost
-client:
-  ld  hl,txtReceive
-  cal _puts
-setclient:
+
  ;name/keys: wormy#1 = link    = 0  + link (name1)
  ;                 2 = worm #1 = #1 + local(name1)
  ;                 3 = link    = 0  + link (name2)
  ;                 4 = worm #2 = #2 + local(name2)
-  ld  de,worm2+left
+  ld  e,worm4+left&255
+  cal moveworm2 ;4=2
+  ld  e,worm2+left&255
   ld  hl,worm1+left
-  ldi ;keys worm#2 = worm#1
-  ldi ;+right
-  ld  de,worm4+left
-  ldi ;keys worm#4 = worm#2
-  ldi
-  xor a
-  ld  (worm1+left),a ;worm 1...
-  ld  (worm3+left),a ;and worm 3 via link
-  ld  hl,worm1+name
-  ld  b,9
-  cal recvstuff
-  ld  hl,worm2+name
-  ld  b,9
-  cal sendstuff
-  pop hl
-  pop de
+  cal moveworm ;2=1
+  ld  l,worm1+left&255
+  cal linkworm ;worm1+3 over link
+  ld  l,worm2+name&255
+  cal sendworm
+  pop hl ;loadgamecar
+  pop de ;leveldata
   psh de
-  psh hl
-  ld  b,168
-  cal sendstuff
-  ex  de,hl
+  psh hl ;loadgamecar
   ld  b,8
-  cal sendstuff
-  jr  StartLevel
-sendstuff:
-  psh de
-sendstuffloop:
-  psh bc
-  ld  c,(hl)
-  inc hl
-  cal Qsend
-  pop bc
-  dnz sendstuffloop
-  pop de
-  ret
-recvstuff:
-  psh de
-recvstuffloop:
-  psh bc
-  cal Qrecv
-  ld  (hl),c
-  inc hl
-  pop bc
-  dnz recvstuffloop
-  pop de
-  ret
-sethost:
- ;name/keys: wormy#1 = worm #1 = ok
- ;                 2 = link    = 0  + link (name1)
- ;                 3 = worm #2 = #2 + local(name2)
- ;                 4 = link    = 0  + link (name2)
-  ld  de,worm3+left
-  ld  hl,worm2+left
-  ldi ;keys worm#3 = worm#2
-  ldi ;+right
-  xor a
-  ld  (worm2+left),a ;worm 2+4..
-  ld  (worm4+left),a ;..over link
-  ld  hl,worm1+name
-  ld  b,9
-  cal sendstuff
-  ld  hl,worm2+name
-  ld  b,9
-  cal recvstuff
-  pop hl
-  pop de
-  ld  hl,templevels
-  ld  de,datalink
-  psh de
-  psh hl
-  ld  b,168
-  cal recvstuff
+  cal sendstuff ;setup
+  ld  hl,gametype ;+gamecar
+  ld  b,2
+  cal sendstuff ;game
   ex  de,hl
-  ld  b,8
-  cal recvstuff
+  ld  b,168
+  cal sendstuff ;level
 
-;-------- load level ---------
+;--- load level ---
 
 StartLevel:
   pop hl ;loadgamecar
   ld  a,(hl)
   ld  (wormbeglives),a
   inc hl ;nrworms
+  ld  b,$11 ;=ignore (ld)
   ld  a,(hl)
+  cp  5
+  jr  c,teamset
+  sub 2
+  ld  b,$CD ;=continue (call)
+teamset:
   ld  (nrworms),a
+  ld  a,b
+  ld  (doteam),a ;do team score (CD) or not (11)
   inc hl ;level
   inc hl
   ld  a,(hl)
@@ -1437,6 +1633,7 @@ StartLevel:
   inc hl
   ld  a,(hl)
   ld  (growspeed),a
+  ld  (turn),a
   inc hl
   ld  a,(hl)
   ld  (turnleft),a
@@ -1444,35 +1641,17 @@ StartLevel:
   inc hl
   ld  l,(hl)
   ld  h,0
+  ld  a,(gamecar)
+  rla
+  ld  a,h ;(Left)=256
+  jr  nc,setscorelimit
+  ld  a,l
+  ld  l,h
+setscorelimit:
+  ld  (customleft),a
   cal _HLTIMES10 ;hl=10*(hl)
   ld  (scorelimit),hl
 
-setupworms:
-  ld  hl,worm1set
-  ld  de,worm1
-  ld  a,4 ;4x (all worms)
-createwormsloop:
-  ex  de,hl
-  ld  bc,died ;8
-  add hl,bc
-; ld  b,0
-  ld  (hl),b ;died=0
-  inc hl
-  ld  (hl),b ;score=0
-  inc hl
-  ld  (hl),b ;score+1=0
-  inc hl
-  ld  (hl),2 ;delay=2
-  inc hl
-  ld  (hl),3 ;lives=x
-wormbeglives =$-1
-  inc hl
-  ex  de,hl  ;de=wormX+head
-  ld  bc,18
-  ldir       ;copy 18 bytes
-  dec a      ;loop
-  jr  nz,createwormsloop
-
 Nextlevel:
   cal _clrWindow
   pop hl ;begin of current level
@@ -1491,12 +1670,30 @@ Nextlevel:
   inc hl   ;location of ending-code
   jp  (hl) ;go there ("call")
 donextlevel:
-  ld  a,(Gametype)
+  ld  bc,gametype
+  ld  a,(bc)
   or  a ;gamesingle
   psh af
   cal nz,skiplvltitle
-  ld  de,Left
-  ldi
+  ld  a,(hl)
+  and 127
+  jr  nz,setleft
+customleft =$+1
+  ld  a,0
+setleft:
+  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
 customspeed =$-1
@@ -1511,7 +1708,7 @@ setspeed:
   ld  de,peagrowth
   ldi
   ld  a,(hl)
-  ld  (worm1+grow),a
+  ld  (worm1+grow),a ;&&sh
   ld  (worm2+grow),a
   ld  (worm3+grow),a
   ld  (worm4+grow),a
@@ -1529,10 +1726,14 @@ setspeed:
   add hl,bc ;hl=behind sprite
   jr  setsprite
 defaultsprite:
-  ld  a,defspritesz
+#ifndef intlevels
+  ld  a,42 ;always overwritten
+#else
+  ld  a,defsprsz
+#endif
 defsprsize =$-1
 defsprite  =$+1
-  ld  de,defspriteimg
+  ld  de,defspr
 setsprite: ;de=@sprite ;a=sprsize
   ld  (sprsize),a
   ld  (spritepos),de
@@ -1557,7 +1758,7 @@ toobad_noballs:
 #endif
 
   ld  hl,worm1
-  pop af ;cp (Gametype),0
+  pop af ;cp (gametype),0
   ld  b,1
   jr  z,worminit
   ld  b,4
@@ -1575,8 +1776,11 @@ worminit:
   ld  (hl),a ;y2
   inc hl
   ld  (hl),a ;x2
+  inc hl
+  inc hl
+  ld  (hl),a ;growH=0
 
-  ld  bc,(worm2-worm1)-5
+  ld  bc,(worm2-worm1)-7
   add hl,bc
   pop bc ;<0
   dnz worminit
@@ -1586,7 +1790,7 @@ worminit:
   inc a ;ld a,2
   ld  (flashtime),a
 
-;-------- draw level ---------
+;--- draw level ---
 
 initlevel:
   ld  a,(de)
@@ -1668,7 +1872,7 @@ NoVertShift:
 
 
   pop hl                         ; << levelp
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  gamerace ;or gamectf
   jr  c,levelhasbeensetup
   ld  de,peaspos
@@ -1684,7 +1888,7 @@ levelhasbeensetup:
 
   cal drawstuff
 
-;--------- prepare -----------
+;--- prepare ---
 
 leveldone:
   psh hl                        ; >> levelp new
@@ -1722,11 +1926,11 @@ maskline:
   res 3,(iy+5)
 #endif
 
-  ld  a,(gameCar)
-  and _datafood
-  jr  z,nofood
-  ld  ix,worm1
-  cal NewPea
+  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
@@ -1737,9 +1941,11 @@ ReadyDelay:
   dnz ReadyDelay
   cal releasekeys
 
-;-----------------------------
-;----------- LOOP ------------
-;-----------------------------
+;_______________________________________________________________________________
+;  ______ _______ _______ _______               _____   _____   _____
+; |  ____ |_____| |  |  | |______       |      |     | |     | |_____]
+; |_____| |     | |  |  | |______ _____ |_____ |_____| |_____| |
+;_______________________________________________________________________________
 
 GameLoop:
   ld  bc,(worm1+pos) ;camera worm #1
@@ -1783,13 +1989,13 @@ NoDelay:
   inc a ;-1
   jr  z,nextturnok
   dec (hl)
-  dec a ;0 (now <0)
+  dec a ;>=0
   jr  nz,nextturnok
 growspeed =$+1
-  ld  (hl),$FF
+  ld  (hl),$FF ;reset
 nextturnok:
 
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datatime
   jr  z,nodispupdate
   ld  hl,turn10
@@ -1799,7 +2005,7 @@ nextturnok:
   cal forceshowstats ;update score
 nodispupdate:
 
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  gamectf
   jr  nz,noctfpeas2draw
   ld  de,drawctfpea1
@@ -1830,9 +2036,11 @@ handleworms:
   inc (hl) ;0..nrworms-1
   dnz handleworms
 
-;-----------------------------
-;---------- keys -------------
-;-----------------------------
+;_______________________________________________________________________________
+; _     _ _______ __   __ _______
+; |____/  |______   \_/   |______
+; |    \_ |______    |    ______|
+;_______________________________________________________________________________
 
 HandleKeys:
   ld  a,%10111111
@@ -1846,7 +2054,7 @@ CheckExit:
   jp  c,GameLoop
   jp  Exit ;jr?
 
-;------- pause menu -------
+;--- pause menu ---
 
 disppausemenu:
   ld  hl,txtpMenu
@@ -1927,6 +2135,12 @@ donepausing:
   cal releasekeys
   jp  GameLoop
 
+;_______________________________________________________________________________
+;  ______ _______ _______ _______        _____  _    _ _______  ______
+; |  ____ |_____| |  |  | |______       |     |  \  /  |______ |_____/
+; |_____| |     | |  |  | |______ _____ |_____|   \/   |______ |    \_
+;_______________________________________________________________________________
+
 Exit:
   cal releasekeys
   ld  sp,0 ;pop all
@@ -1942,9 +2156,9 @@ SpSave = $-2
   ld  hl,$FC10
   ld  b,16*11
   cal menuinvloop ;invert
-  ld  hl,$FD80
+  ld  hl,$FC00+$180
   cal hr ;menuinvloop w/ b=16
-  ld  hl,$FCE0
+  ld  hl,$FC00+$E0
   cal hr
   ld  hl,_curRow
   ld  (hl),2
@@ -1954,9 +2168,9 @@ SpSave = $-2
   ld  hl,$FC00
   ld  b,16*8
   cal menuinvloop ;invert
-  inc h ;$FD80
+  inc h ;$FC00+$180
   cal hr ;menuinvloop w/ b=16
-  ld  hl,$FCE0
+  ld  hl,$FC00+$E0
   cal hr
   ld  hl,_curRow
   inc (hl)
@@ -1972,12 +2186,14 @@ CURtxtGame =$-2
   ld  (_penCol),de
   ld  hl,txtName
   cal _vputs ;Name
-  ld  a,$3D
+  ld  a,$3C
   ld  (_penCol),a
   cal _vputs ;Died    Score
   ld  de,$0004
   ld  (_curRow),de
 
+;--- who won? ---
+
 findwinner:
   ld  hl,(worm1+score)
   ld  (winnerscore),hl
@@ -2016,7 +2232,17 @@ nonewdmwinner:
   dnz finddmwinner
   ld  (dmwinner),a
 
-;---display worms---
+;--- display worms ---
+
+;x123456789012345678901
+;>>>>>> GAME OVER <<<<<
+;2Multiplayer
+;3Level 01
+;4           Died Score:
+;5NameName     03 00070
+;6Worm#02 @    05 00120
+;7Worm#03      15 00030
+;8Snaky   @    00 04820
 
   ld  a,(nrworms)
   ld  b,a
@@ -2028,7 +2254,7 @@ displayWormStats:
   ld  bc,left-died
   add hl,bc ;+left
   xor a
-  cp  (hl)  ;input=0 = link
+  cp  (hl)  ;left=0 = link
   jr  nz,NoLinkIndic
   ld  a,9
   ld  (_curCol),a
@@ -2050,7 +2276,7 @@ NoLinkIndic:
   pop hl
 
   psh hl
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  gamedeathm
   jr  nz,nodmwinner ;deathmatch?
   ld  a,0 ;winner's deaths
@@ -2073,7 +2299,8 @@ notwinner:
   psh hl
   inc hl ;worm+score
   cal _ldHLind
-  cal showHL
+  cal _D_HL_DECI
+  cal _puts ;showHL
   pop hl
 
   ld  bc,worm2-worm1
@@ -2081,7 +2308,8 @@ notwinner:
   pop bc
   dnz displayWormStats
 
-  ld  a,(Gametype)
+  ld  de,gametype
+  ld  a,(de)
   or  a ;singleplayer (0) only
   jr  nz,hilevelcheckdone
 checkhilevel:
@@ -2098,7 +2326,8 @@ hilvlposhl =$-2 ;save external
   cal _writeb_inc_ahl ;ld (ahl),c
 hilevelcheckdone:
 
-  ld  a,(gameCar)
+  inc de
+  ld  a,(de) ;gamecar
   and _datasingl
   jr  z,hiscorecheckdone ;no SP
 checkhiscore:
@@ -2144,54 +2373,26 @@ NotNewHigh:
   ld  hl,highsave+2
   cal _puts
   ld  hl,(highsave)
-  cal showHL
+  cal _D_HL_DECI
+  cal _puts ;showHL
 hiscorecheckdone:
 
 waitkey:
+  ld  hl,DisplayMenu
+  psh hl ;main menu
+waitkeyloop:
   cal ubergetkey
   cp  K_ENTER
-  jp  z,DisplayMenu
+  ret z
   cp  K_SECOND
-  jp  z,DisplayMenu
+  ret z
   cp  K_EXIT
-  jr  nz,waitkey
-
-;x123456789012345678901
-;>>>>>> GAME OVER <<<<<
-;2Multiplayer
-;3Level 01
-;4           Died Score:
-;5NameName     03 00070
-;6Worm#02 @    05 00120
-;7Worm#03      15 00030
-;8Snaky   @    00 04820
-
-ExitNoStats:
-  cal linkok
-  ld  hl,_asapvar
-  rst 20h ;_ABS_MOV10TOOP1
-  rst 10h ;_FINDSYM
-  ld  hl,savestart-_asm_exec_ram+4
-  xor a
-  add hl,de
-  adc a,b ;ahl=bde+4
-  cal _SET_ABS_DEST_ADDR
-
-  xor a
-  ld  hl,savestart
-  cal _SET_ABS_SRC_ADDR
-  ld  hl,saveend-savestart
-  cal _MM_LDIR_SET_SIZE
-
-  cal releasekeys
-  res 4,(iy+9)
-  set 2,(iy+13)
-  im  1 ;remove keyfix
-  jp  _clrWindow
+  jr  nz,waitkeyloop
+  ret
 
 loadhiscoreposinahl:
   ld  hl,0 ;for peaworm and singleplayer
-  ld  a,(Gametype)
+  ld  a,(gametype)
   or  a ;Singleplayer?
   jr  z,hi__
   dec a ;peaworm?
@@ -2214,7 +2415,7 @@ hiscrposa =$+1
   adc a,0 ;ahl=saveloc
   ret
 highsave:
-  .db 0,0,"WOR ",0
+  .db 0,0,"SHI ",0
 
 iswinner:
   ld  a,10
@@ -2222,12 +2423,39 @@ iswinner:
   ld  a,'*'
   jp  _putc ;..then put *
 
-;-----------------------------
-;----------- worm ------------
-;-----------------------------
+;--- quit ---
+
+ExitNoStats:
+  cal linkok
+  ld  hl,_asapvar
+  rst 20h ;_ABS_MOV10TOOP1
+  rst 10h ;_FINDSYM
+  ld  hl,savestart-_asm_exec_ram+4
+  xor a
+  add hl,de
+  adc a,b ;ahl=bde+4
+  cal _SET_ABS_DEST_ADDR
+
+  xor a
+  ld  hl,savestart
+  cal _SET_ABS_SRC_ADDR
+  ld  hl,saveend-savestart
+  cal _MM_LDIR_SET_SIZE
+
+  cal releasekeys
+  res 4,(iy+9)
+  set 2,(iy+13)
+  im  1 ;remove keyfix
+  jp  _clrWindow
+
+;_______________________________________________________________________________
+; _  _  _  _____   ______ _______       _______ _______ _     _ _______ _______
+; |  |  | |     | |_____/ |  |  |       |______    |    |     | |______ |______
+; |__|__| |_____| |    \_ |  |  | _____ ______|    |    |_____| |       |
+;_______________________________________________________________________________
 
 respawncheck:
-  cp  respawndelay-1
+  cp  rspawndelay-1
   jr  nz,unnamedlabel
   cal saverespawncounter
 removeworm:
@@ -2246,16 +2474,19 @@ removewormloop:
   cal res4pixels
   pop hl
   inc (ix+grow)
+  jr  nz,DoesWormTailEqualsWormHead
+  inc (ix+grow+1) ;+256
 DoesWormTailEqualsWormHead:
   cal _cphlde
   jr  nz,removewormloop
 
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datasingl
   jr  nz,safewormsizedone
   ld  a,0
 beginsize =$-1
   ld  (ix+grow),a
+  ld  (ix+grow+1),0 ;high
 safewormsizedone:
 
   ;de=ix+head
@@ -2324,7 +2555,7 @@ inputcall:
   or  a
   jr  z,inlink ;input by link
   cal inkeys ;input by keys
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   rra ;and _datalink
   ret nc ;no link
   ld  c,l ;send our keys
@@ -2334,9 +2565,11 @@ inlink:
   ld  l,c
   ret
 
-;-----------------------------
-;------- handle worm ---------
-;-----------------------------
+;_______________________________________________________________________________
+; _  _  _  _____   ______ _______       _______        _____ _    _ _______
+; |  |  | |     | |_____/ |  |  |       |_____| |        |    \  /  |______
+; |__|__| |_____| |    \_ |  |  | _____ |     | |_____ __|__   \/   |______
+;_______________________________________________________________________________
 
 HandleWorm:
   xor a
@@ -2357,7 +2590,7 @@ turn =$-1
   inc (ix+grow)
 nogrow:
 
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datatime
   jr  z,notimescore
   ld  e,1
@@ -2375,6 +2608,7 @@ donediddelydone:
   ld  e,(ix+pos2)
   ld  d,(ix+pos2+1)
 
+#ifdef optdie
   psh hl
   ld  hl,previouspos
   ld  (hl),c
@@ -2386,11 +2620,12 @@ donediddelydone:
   inc hl
   ld  (hl),d
   pop hl
+#endif
 
-;-------- move worm ----------
+;--- move worm ---
 
 Wormmove:
-  psh bc                        ; >> pos
+  psh bc ;pos
   ld  a,(hl)
   add a,a
   add a,d
@@ -2416,13 +2651,13 @@ notnegY:
   jr  nc,notmoveY
   inc c
 notmoveY: ;bc=newpos
-  ld  (ix+pos2),e
-  ld  (ix+pos2+1),d
   ld  (ix+pos),c
   ld  (ix+pos+1),b
+  ld  (ix+pos2),e
+  ld  (ix+pos2+1),d
 
 ;-check-
-  pop hl                         ; << pos (old)
+  pop hl ;pos (old)
   ld  a,h
   sub b
   and 1
@@ -2438,267 +2673,81 @@ notmoveY: ;bc=newpos
 GotFour:
   cal chk4pixels
   rl  d
-  jp  nc,Drawworm
+  cal c,hitworm
 
-;--------- worm hit ----------
+;--- draw worm ---
 
-Hitworm:
-  ld  a,(gameCar)
-  ld  h,a
-#ifdef optdie
-  and _datadie
-  cal z,checkhitotherworm
-  ld  a,h
-#endif
-  and _datamultpeas ;&&bit
-  jr  nz,chkctfpeas
-  ld  a,h
-  and _datafood
-  jp  z,WormDead ;no food
+Drawworm:
+  ld  c,(ix+pos)
+  ld  b,(ix+pos+1)
 
-  ld  hl,0
-PeaY =$-2
-PeaX =$-1
-  cal chkpeahit
-  jp  nc,WormDead
-  cal DrawPea ;remove pea
-  ld  a,(ix+grow)
-  add a,15
-peagrowth =$-1
-  ld  (ix+grow),a
-  cal NewPea
-  ld  hl,Left
-  dec (hl)
-  psh af
-  ld  e,10
-  cal IncScore
-  pop af
-  jp  nz,Drawworm ;continue
-  ld  a,(gameCar)
-  and _datafoodl
-  jp  z,Drawworm
-  ld  a,(Gametype)
-  or  a
-  jp  nz,Exit ;stack restored
+  ld  a,(gametype)
+  cp  gamerace
+  cal z,checkhitlapline
 
-  ld  hl,Level
-  ld  a,(hl)
-  inc (hl)
-  ld  l,a ;hl=Level
-  ld  h,0
-  add hl,hl
-  add hl,hl
-  cal _HLTIMES10
-  ex  de,hl
-  cal _IncScore ;score+(40*level)
-  cal removeworm
-  pop hl                         ; << call
-  pop hl                         ; << call
-  ld  (ix+delay),2
-  jp  Nextlevel
+  cal set4pixels
+  dec c
+  ld  a,(growspeed)
+  or  a ;0=tron
+  ret z ;keep tail in "Tron"
 
-chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
-  ld  a,(sprsize)
-  inc a
-  ld  d,a
-  ld  a,b
-  sub h
-  inc a
-  cp  d ;=(sprsize)+1
-  ret nc ;nc=no pea
-  ld  a,c
-  sub l
-  inc a
-  cp  d
-  ret ;c=pea
+  ld  l,(ix+head)
+  ld  h,(ix+head+1)
+  ld  (hl),c
+  inc hl
+  ld  (hl),b
+  inc hl
+  cal resbit
+  ld  (ix+head),l
+  ld  (ix+head+1),h
 
-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
-  ld  hl,drawctfpea2 ;restore #2
-nottheotherflag:
-  ld  (hl),3 ;draw delay 3 turns
+  ld  l,(ix+grow)
+  ld  h,(ix+grow+1)
+  dec hl
+  ld  a,h
+  or  l
+  jr  z,removetail
+  ld  (ix+grow),l
+  ld  (ix+grow+1),h
   ret
 
-drawctfpea1: .db 0
-drawctfpea2: .db 0
-
-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
-  jr  nz,Drawworm ;flag taken, continue game
+removetail:
+  ld  l,(ix+tail)
+  ld  h,(ix+tail+1)
+  ld  c,(hl)
+  inc hl
+  ld  b,(hl)
+  inc hl
+  cal resbit
+  ld  (ix+tail),l
+  ld  (ix+tail+1),h
   psh hl
-  ld  e,20 ;flag captured+returned
-  cal IncScore
+  cal res4pixels
   pop hl
-  ld  a,3 ;draw delay
-  ld  (drawctfpea1),a ;redraw..
-  ld  (drawctfpea2),a ;..both flags
-  jr  Drawworm
+  ld  c,(hl)
+  inc hl
+  ld  b,(hl)
+  jr  set4pixels
 
-;-----------------------------
+res4pixels:
+  cal ResPixel
+  inc b
+  cal ResPixel
+  inc c
+  cal ResPixel
+  dec b
+ResPixel:
+  cal FindPixel
+  cpl
+  and (hl)
+  ld  (hl),a
+  ret
 
-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
-
-checkhitlapline:
-  ld  a,(peaspos) ;63
-  sub b ;x==63
-  jr  z,nextlaphalf
-  inc a
-  ret nz
-nextlaphalf:
-  ld  a,(peaspos+1) ;yline
-  cp  c ;ypos
-  ld  a,1
-  jr  nc,checklap ;y>yline -> a=1
-  xor a ;y<yline -> a=0
-checklap:
-  cp  (ix+reserv)
-  ret z ;same as before
-  ld  (ix+reserv),a ;1st time
-  ld  e,a
-  ld  a,(handledworm)
-  and 1 ;group 0 (1,3) or 1 (2,4)
-  xor e
-  ret z ;(group 0 and y<yline) or (group 1 and y>yline)
-  psh bc
-  ld  e,20
-  cal IncScore ;lap!
-  pop bc
-  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
-#endif
-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
-
-;-------- draw worm ----------
-
-Drawworm:
-  ld  c,(ix+pos)
-  ld  b,(ix+pos+1)
-
-  ld  a,(Gametype)
-  cp  gamerace
-  cal z,checkhitlapline
-
-  cal set4pixels
-  dec c
-  ld  a,(growspeed)
-  or  a ;0=tron
-  ret z ;keep tail in "Tron"
-
-  ld  l,(ix+head)
-  ld  h,(ix+head+1)
-  ld  (hl),c
-  inc hl
-  ld  (hl),b
-  inc hl
-  cal resbit
-  ld  (ix+head),l
-  ld  (ix+head+1),h
-
-  ld  a,(ix+grow)
-  dec a
-  jr  z,removetail
-  ld  (ix+grow),a
-  ret
-
-removetail:
-  ld  l,(ix+tail)
-  ld  h,(ix+tail+1)
-  ld  c,(hl)
-  inc hl
-  ld  b,(hl)
-  inc hl
-  cal resbit
-  ld  (ix+tail),l
-  ld  (ix+tail+1),h
-
-res4pixels:
-  cal ResPixel
-  inc b
-  cal ResPixel
-  inc c
-  cal ResPixel
-  dec b
-ResPixel:
-  cal FindPixel
-  cpl
-  and (hl)
-  ld  (hl),a
-  ret
-
-;-----------------------------
-;---------- ball -------------
-;-----------------------------
+;_______________________________________________________________________________
+; ______   _____  _     _ __   _ _______ __   __ ______  _______
+; |_____] |     | |     | | \  | |         \_/   |_____] |_____| |      |
+; |_____] |_____| |_____| |  \_| |_____     |    |_____] |     | |_____ |_____
+;_______________________________________________________________________________
 
 handlethoseneatlittleballs:
   ld  hl,balls
@@ -2791,9 +2840,215 @@ checkballhit:
   pop de
   ret
 
-;-----------------------------
-;----------- procs -----------
-;-----------------------------
+;_______________________________________________________________________________
+; _  _  _  _____   ______ _______ __   __       _     _ _____ _______
+; |  |  | |     | |_____/ |  |  |   \_/         |_____|   |      |
+; |__|__| |_____| |    \_ |  |  |    |    _____ |     | __|__    |
+;_______________________________________________________________________________
+
+hitworm:
+#ifdef optdie
+; if race - originally
+  cal checkhitotherworm
+#endif
+  ld  a,(gamecar)
+  bit __bitPctf,a
+  jr  nz,chkctfpeas
+  rla ;and _dataPmult
+  jp  c,chkmultpeas
+  rla ;and _datafood
+  jp  c,wormdead ;no food
+
+  ld  hl,0
+PeaY =$-2
+PeaX =$-1
+  cal chkpeahit
+  jp  nc,wormdead
+pickpea:
+  cal DrawPea ;remove pea
+  cal NewPea
+pickpea_:
+  ld  a,(ix+grow)
+  add a,15
+peagrowth =$-1
+  ld  (ix+grow),a
+  jr  nc,wormset2grow
+  inc (ix+grow+1)
+wormset2grow:
+  ld  hl,Left
+  dec (hl) ;dec left before display
+  psh af
+  ld  e,10
+  cal IncScore
+  pop af
+  jp  nz,Drawworm ;continue
+  ld  a,(gametype)
+  or  a
+  jp  nz,Exit ;stack restored
+
+  ld  hl,Level
+  ld  a,(hl)
+  inc (hl)
+  ld  l,a ;hl=Level
+  ld  h,0
+  add hl,hl
+  add hl,hl
+  cal _HLTIMES10
+  ex  de,hl
+  cal _IncScore ;score+(40*level)
+  cal removeworm
+  pop hl ;<<$some call
+  pop hl ;<<call HandleWorm
+  pop hl ;<<call hitworm
+  ld  (ix+delay),2
+  jp  Nextlevel
+
+chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
+  ld  a,(sprsize)
+  inc a
+  ld  d,a
+  ld  a,b
+  sub h
+  inc a
+  cp  d ;=(sprsize)+1
+  ret nc ;nc=no pea
+  ld  a,c
+  sub l
+  inc a
+  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
+
+checkhitlapline:
+  ld  a,(peaspos) ;63
+  sub b ;x==63
+  jr  z,nextlaphalf
+  inc a
+  ret nz
+nextlaphalf:
+  ld  a,(peaspos+1) ;yline
+  cp  c ;ypos
+  ld  a,1
+  jr  nc,checklap ;y>yline -> a=1
+  xor a ;y<yline -> a=0
+checklap:
+  cp  (ix+reserv)
+  ret z ;same as before
+  ld  (ix+reserv),a ;1st time
+  ld  e,a
+  ld  a,(handledworm)
+  and 1 ;group 0 (1,3) or 1 (2,4)
+  xor e
+  ret z ;(group 0 and y<yline) or (group 1 and y>yline)
+  psh bc
+  ld  e,20
+  cal IncScore ;lap!
+  pop bc
+  ret
+
+;_______________________________________________________________________________
+;  _____   ______  _____  _______ _______
+; |_____] |_____/ |     | |       |______
+; |       |    \_ |_____| |_____  ______|
+;_______________________________________________________________________________
 
 releasekeys:
   halt
@@ -2824,13 +3079,15 @@ Seed =$+1
   add a,2
   ret
 
+wormdead:
+  pop hl ;<<call
 WormDead:
 #ifdef invincible
   jp  stopworm
-#else
+#endif
   ld  a,2
   ld  (flashtime),a
-  ld  (ix+delay),respawndelay
+  ld  (ix+delay),rspawndelay
 
 thislevel =$+1
   ld  hl,0
@@ -2854,16 +3111,15 @@ handledworm =$-2
   inc (ix+died)
   dec (ix+lives)
   psh af
-  ld  de,10
-  ld  a,(Gametype)
+  ld  a,(gametype)
   cp  gamectf ;ctf no death penalty
-  cal nz,DecScore
+  cal nz,DecScore10
   pop af
   ret nz ;HandleWorm done
   ld  a,(wormbeglives)
   or  a ;0=no live limit
   ret z ;don't end game
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datatime
   jr  z,anyworm ;quit at any worm's death
   ld  a,(nrworms) ;timematch: all worms must've died
@@ -2880,6 +3136,47 @@ anyworm:
   ld  a,$A7 ;exit@end of turn
   ld  (CheckExit),a ;set exit state
   ret ;finish turn
+
+loadtxtgame: ;in:d=0; out:hl=txtGame+(gametype); destr:ade
+  ld  a,(gametype)
+  ld  e,a
+  ld  hl,posGame
+  add hl,de ;hl=posGame+(gametype)
+  ld  a,(hl) ;str.offset
+  ld  e,a ;^d=0^
+  ld  hl,txtGame
+  add hl,de ;txtGameX
+  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
@@ -2918,22 +3215,21 @@ tryDrawPea: ;hl=peapos;bc=dopea
   jr  z,DrawPea
   ret
 
-sendnewpeaoverlink:
-  ld  a,(gameCar)
-  rra ;and _datalink
-  ret nc ;no link
-  ld  a,(ix+left)
-  or  a
-  jr  z,receivenewpeaoverlink
-  ld  c,l ;send pea's pos
-  cal Qsend
-  ld  c,h
-  jp  Qsend ;&&&possible jr
-receivenewpeaoverlink:
-  cal Qrecv ;Crecv
-  ld  l,c
-  cal Qrecv ;Crecv
-  ld  h,c
+multnewpea:
+  ld  de,peaspos
+  ld  a,(Left)
+  ld  b,a
+multpealoop:
+  psh bc
+  psh de
+  cal NewPea
+  pop de
+  ld  hl,PeaY
+  ldi
+  ldi
+  pop bc
+  dnz multpealoop
+  ld  a,-1
   ret
 
 NewPea:
@@ -2952,6 +3248,7 @@ NewPea:
 DrawPea: ;hl=(PeaY)
   ld  b,h
   ld  c,l
+drawpea_:
   ld  de,0
 spritepos =$-2
 ; jp PutSprite
@@ -2994,7 +3291,53 @@ nextbitok:
   dnz sprloopy
   ret
 
-;----------- score -----------
+;_______________________________________________________________________________
+; _______ _______  _____   ______ _______
+; |______ |       |     | |_____/ |______
+; ______| |_____  |_____| |    \_ |______
+;_______________________________________________________________________________
+
+addteamscore:
+  ld  a,(handledworm)
+  cp  2
+  ld  de,worm3-worm1
+  jr  c,bla
+  ld  de,worm1-worm3
+bla:
+  psh ix
+  add ix,de
+  ex  de,hl
+  cal ldscoreinhl
+  pop ix
+  add hl,de
+  ret
+
+_divHLby1000:
+  psh hl
+  ld  b,3
+divideagain: ;3x
+  cal _divHLby10
+  dnz divideagain
+  ld  a,l ;a=hl/1000
+  pop hl
+  ret
+
+DecScore10:
+  cal ldscoreinhl
+  ld  de,-10
+  add hl,de
+  jr  nc,showstats ;<0=0
+  jr  scorecommon
+
+extralives:
+  cal _divHLby1000
+  ld  c,a
+  add hl,de ;increase score
+  cal _divHLby1000
+  cp  c
+  jr  z,scorecommon ;hl/1000 not increased
+  inc (ix+lives)
+  jr  scorecommon
 
 timematchscore:
   ;piece of crap checking whether you've already won in timematch
@@ -3012,7 +3355,7 @@ chktimematchover:
   jr  z,nneexxtt ;yourself
   cp  (hl)
   ret nz ;someone else still alive
-  dec hl ;+delay
+  dec hl ;+del0ay
   dec hl ;+score+1
   ld  a,(hl)
   cp  (ix+score+1)
@@ -3032,46 +3375,19 @@ nneexxtt:
   dnz chktimematchover
   jp  anyworm ;g/o
 
-_divHLby1000:
-  psh hl
-  ld  b,3
-divideagain: ;3x
-  cal _divHLby10
-  dnz divideagain
-  ld  a,l ;a=hl/1000
-  pop hl
-  ret
-
-extralives:
-  cal _divHLby1000
-  ld  c,a
-  add hl,de ;increase score
-  cal _divHLby1000
-  cp  c
-  jr  z,scorecommon ;hl/1000 not increased
-  inc (ix+lives)
-  jr  scorecommon
-
-DecScore: ;&&&
-  ld  h,(ix+score+1)
-  ld  l,(ix+score)
-  or  a
-  sbc hl,de
-  jr  c,showstats ;<0=0
-  jr  scorecommon
-
 IncScore: ;inc score by e
   ld  d,0
 _IncScore ; inc by de
-  ld  h,(ix+score+1)
-  ld  l,(ix+score)
-  ld  a,(Gametype)
+  cal ldscoreinhl
+  ld  a,(gametype)
   or  a ;if singleplayer...
   jr  z,extralives
   add hl,de ;score+=de
 scorecommon:
   ld  (ix+score+1),h
   ld  (ix+score),l ;save
+doteam:
+  cal addteamscore ;cal=CD | ld de,*=11
   ld  de,0
 scorelimit =$-2
   ld  a,d
@@ -3081,13 +3397,14 @@ scorelimit =$-2
   jp  nc,Exit
 
 showstats:
-  ld  a,(gameCar)
+  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
+ ; ld  (hl),a ;=0
+ ;&&&&&&
   inc hl
   dnz clearstats
 forceshowstats:
@@ -3098,7 +3415,7 @@ forceshowstats:
   ld  a,(nrworms)
   ld  b,a
   ld  ix,worm1
-  ld  a,(gameCar)
+  ld  a,(gamecar)
   and _datasingl
   jr  nz,showstatsS
 showstatloop:
@@ -3136,19 +3453,23 @@ nameshown:
   ret
 
 showstat: ;(multiplayer)
-  ld  a,(Gametype)
-  cp  gamedeathm
-  jr  z,showlives
+  ld  a,(wormbeglives)
+  or  a
+  jr  nz,showlives
 showscore:
-  ld  h,(ix+score+1)
-  ld  l,(ix+score)
+  cal ldscoreinhl
   cal _D_HL_DECI
   jr  __vputs
 showlives:
   ld  a,(ix+lives)
-showA: ;small w/o leading 0 (&&&combine w/ cshowA0??)
-  cp  10
-  jr  c,showleastsign
+  jr  cshowA00
+
+cshowA: ;small w/ leading 0
+  or  a ;destr. ahl
+  jr  nz,cshowA00
+  ld  hl,txtNone
+  jp  _vputs
+cshowA00:
   ld  l,a
   ld  h,0
   cal _divHLby10
@@ -3157,7 +3478,7 @@ showA: ;small w/o leading 0 (&&&combine w/ cshowA0??)
   add a,'0'
   cal __vputmap
   pop af
-showleastsign:
+cshowA0:
   add a,'0'
 __vputmap:
   psh ix
@@ -3170,24 +3491,29 @@ showstatsS: ;(singleplayer)
   cal __vputs
   ld  a,0
 Level =$-1
-  cal showA
+  cp  10
+  psh af
+  cal c,cshowA0
+  pop af
+  cal nc,cshowA00
 
-  ld  a,98
+  ld  a,97
   ld  (_penCol),a
   cal showscore
   ld  a,123
   ld  (_penCol),a
-  cal showlives
-  ld  a,(gameCar)
+  ld  a,(ix+lives)
+  cal cshowA0 ;showlives
+  ld  a,(gamecar)
   and _datafoodl
   pop ix
   ret z
 showleft:
-  ld  a,31
+  ld  a,33
   ld  (_penCol),a
   ld  a,0
 Left =$-1
-  cal cshowA0
+  cal cshowA
 
   ld  hl,txtLeft
 __vputs:
@@ -3212,46 +3538,32 @@ showA0: ;big w/ leading 0
   add a,'0'
   jp  _putc
 
-cshowA0: ;small w/ leading 0
-  or  a
-  jr  nz,cshowavalue
-  ld  hl,txtNone
-  jp  _vputs
-cshowavalue:
-  ld  l,a
-  ld  h,0
-  cal _divHLby10
-  psh af
-  ld  a,l
-  add a,'0'
-  cal __vputmap
-  pop af
-  add a,'0'
-  jp  __vputmap
-
-showHL:
-  cal _D_HL_DECI
-  jp  _puts
-
 _D_HL_DECI:
-  ld  de,savestr+4
+  ld  de,savestr+5
   ld  b,5
 ldhld:
   cal _divHLby10
   add a,'0'
-  ld  (de),a
   dec de
+  ld  (de),a
   dnz ldhld
-  ld  hl,savestr
+  ex  de,hl ;ld hl,savestr
+  ret
+
+ldscoreinhl:
+  ld  h,(ix+score+1)
+  ld  l,(ix+score)
   ret
-savestr:
-  .db "00000",0
 
-;-----------------------------
+;_______________________________________________________________________________
+; ______  _____ _______  _____         _______ __   __
+; |     \   |   |______ |_____] |      |_____|   \_/
+; |_____/ __|__ ______| |       |_____ |     |    |
+;_______________________________________________________________________________
 
-DisplayField:
-  ld  a,c
-  sub 29
+DisplayField:  ;all done by Jonah Cohen iirc. (-scrolling is scary-)
+  ld  a,c      ;not the fastest routine outthere, but it does get the job done.
+  sub 29       ;if something doesn't work, I probably _did_ alter it ;)
   jr  nc,NotMinYScroll
   xor a
 NotMinYScroll:
@@ -3471,7 +3783,11 @@ ChunkRow:
   ld  c,$37 ;scf
   ret
 
-;----------- draw ------------
+;_______________________________________________________________________________
+; ______   ______ _______ _  _  _
+; |     \ |_____/ |_____| |  |  |
+; |_____/ |    \_ |     | |__|__|
+;_______________________________________________________________________________
 
 ;--- pixel ---
 
@@ -3520,7 +3836,7 @@ FindPixel: ;(b,c) to hl:a
 FP_Bit =$+1
   set 0,a
 
-  psh de ;&&&
+  psh de ;&&& C`MON! THIS IS UGLY! *hit myself*
   ld  de,ScrBuffer
   add hl,de
   pop de
@@ -3558,6 +3874,14 @@ drawsmtn:
 ; dec a ;4 = circle
 ; jp  z,drawcircle
 
+;--- circle ---
+
+;IMHO, one weery nice routine. Oh lemme be proud just *once*.
+;Not perfect since it uses a screwy lineroutine to draw stuff
+;but, just _look_ at it. Ain't it grand? Z80 at its best.
+;Nice comments, also. So here we go: Shiar's Circle Routine:
+;(using the Bresenham method)
+
 drawcircle: ;(d,e),h   ;de=x,y; h=z
   ld  c,h              ;c=yy=z
   ld  a,h
@@ -3621,7 +3945,9 @@ circledraw:               ;destr:de
   ld  b,c
   ld  c,a              ;ex b,c
   pop hl
-  ret
+  ret                  ;thats it
+
+;--- box ---
 
 drawbox: ;(d,e)-(h,l)
   ld  b,l ;Delta-y
@@ -3633,6 +3959,8 @@ boxloop:
   dnz boxloop
   ret
 
+;--- fatline ---
+
 drawfatline:
   cal drawline
   inc d
@@ -3645,151 +3973,165 @@ drawfatline:
   dec h
 ; jp  drawline
 
-;LINE (d,e)-(h,l)
-;destroyes a
+;--- 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 nice routine (also Bresenham), but for Wormy not perfect since really
+;large lines (>128 pixels in length or something) won't be flawless.
 
 drawline: ;(d,e)-(h,l)
   psh bc  ;destr: a
   psh hl
   psh de
-  ld  a,d
-  cp  h
-  jr  c,lineOrdered
-  ex  de,hl
-lineOrdered:
+  ld  a,d              ;a=d=x
+  cp  h                        ;h=xx
+  jr  c,lineXincs      ;if x>xx
+  ex  de,hl            ;make x<xx
+lineXincs:             ;deltax=|deltax|
   ld  b,d
-  ld  c,e
-  psh hl
-  psh bc
-  cal FindPixel
-  pop bc
-  pop de
-connectedLine:
-  psh hl
-  ld  h,c
-  ld  c,a
-  ld  a,d
-  sub b
-  ld  b,a
-  ld  a,e
-  jr  nz,LineNotPoint
-  cp  h
-  jr  nz,LineNotPoint
-  pop hl
-  jr  DoneLine
-LineNotPoint:
-  sub h
-  ld  de,32
-  jr  nc,LinePositiveY
-  neg
-  ld  de,-32
-LinePositiveY:
-  cp  b
-  jr  nc,SteepLine
-  add a,a
-  ld  (line2sm+1),a
+  ld  c,e              ;bc=x,y
+  psh hl               ;hl=xx,yy
+  cal FindPixel                ;  (ahl=x+y)
+  ex  (sp),hl          ;       :hl>
+  ld  c,a              ;c=mask (always)
+  ld  a,h              ;a=xx
+  sub b                        ;xx-x
+  ld  b,a              ;b=deltax (always>0)
+  ld  a,l              ;a=yy
+  jr  nz,lineexists    ;deltax!=0
+  cp  e                        ;yy==y
+  jr  nz,lineexists    ;deltay!=0
+  pop hl               ;       :<hl
+  jr  DoneLine         ;line is 1 pixel
+lineexists:
+  sub e                        ;a=deltay
+  ld  de,32            ;go down (def)
+  jr  nc,lineYincs     ;cf = deltay<0
+  neg                  ;a=|deltay|
+  ld  de,-32           ;go up
+lineYincs:             ;lets assume y incs as well
+  cp  b                
+  jr  nc,SteepLine     ;deltay<deltax?
+  ld  (line2sm+1),a    ;a=deltay
   ld  h,a
   xor a
   sub b
-  add a,a
-  ld  (line1sm+1),a
-  ld  a,h
-  sub b
-  pop hl
-LineLoopGentle:
-  psh af
+  ld  (line1sm+1),a    ;a=-deltax
+  rra
+  add a,h              ;a=deltay-deltax/2
+  pop hl               ;       :<hl
+
+linedrawxloop:
+  psh af               ;init z=dy-dx
   ld  a,(hl)
-  or  c
+  or  c                        ;|c:hl
   ld  (hl),a
   rrc c
   jr  nc,$+3
-  inc hl
+  inc hl               ;(x++,y)
   pop af
-  jp  m,line2sm
+  jp  m,line2sm                ;z<0
 line1sm:
-  add a,0
-  add hl,de
+  add a,0              ;z-=deltax
+  add hl,de            ;(x,y++)
 line2sm:
-  add a,0
-  dnz LineLoopGentle
+  add a,0              ;z+=deltay
+  dnz linedrawxloop    ;|deltax| times
+
 DoneLine:
   ld  a,(hl)
-  or  c
-  ld  (hl),a
+  or  c                        ;|c:hl
+  ld  (hl),a           ;draw end
   pop de
   pop hl
   pop bc
   ret
+
 SteepLine:
-  ld  h,a
-  neg
-  add a,a
+  ld  h,a              ;h=deltay
+  neg                  ;a=-deltay
   ld  (line3sm+1),a
   ld  a,b
-  add a,a
-  ld  (line4sm+1),a
-  sub h
-  ld  b,h
-  pop hl
-LineLoopSteep:
-  psh af
+  ld  (line4sm+1),a    ;a=deltax
+  sub h                        ;a=deltax-deltay
+  ld  b,h              ;b=deltay
+  pop hl               ;       :<hl
+linedrawyloop:
+  psh af               ;init z=2(dx-dy)
   ld  a,(hl)
-  or  c
+  or  c                        ;|c:hl
   ld  (hl),a
-  add hl,de
+  add hl,de            ;(x,y++)
   pop af
-  jp  m,line4sm
+  jp  m,line4sm                ;z<0
 line3sm:
-  add a,0
+  add a,0              ;z-=deltay
   rrc c
   jr  nc,$+3
-  inc hl
+  inc hl               ;(x++,y)
 line4sm:
-  add a,0
-  dnz LineLoopSteep
+  add a,0              ;z+=deltax
+  dnz linedrawyloop    ;|deltay| times
   jr  DoneLine
 
+
 ;..and last but not least..:
-;-----------------------------
-;----------- link ------------
-;-----------------------------
+;_______________________________________________________________________________
+;        _____ __   _ _     _   /
+; |        |   | \  | |____/   /
+; |_____ __|__ |  \_| |    \_ .
+;_______________________________________________________________________________
 
 timeout = $8000
 lossout = 20
 
-linkok:
-  ld  a,D0HD1H
-  out (7),a            ;raise both wires = link ok
+;--- multiple bytes ---
+
+sendstuff:
+  psh de
+sendstuffloop:
+  psh bc
+  ld  c,(hl)
+  inc hl
+  cal Qsend
+  pop bc
+  dnz sendstuffloop
+  pop de
+  ret
+recvstuff:
+  psh de
+recvstuffloop:
+  psh bc
+  cal Qrecv
+  ld  (hl),c
+  inc hl
+  pop bc
+  dnz recvstuffloop
+  pop de
   ret
 
-checklink:             ;load wires in A and check for timeout
-  dec de               ;decrease timer
-  ld  a,d
-  or  e
-  jr  z,linktimeout    ;timeout if de==0
-linktest:
-  ld  a,$BF
-  out (1),a            ;select keys
-  in  a,(1)            ;input
-  bit 6,a              ;exit key
-  jp  z,Exit           ;break!
-linkfine:
-  in  a,(7)
-  and %11
+;--- foo ---
+
+receivenewpeaoverlink:
+  cal Qrecv ;Crecv
+  ld  l,c
+  cal Qrecv ;Crecv
+  ld  h,c
   ret
-linktimeout: ;de==0
-  cal linkok
-  ld a,0               ;losses so far
-linklosses =$-1
-  inc a                ;and this is another one
-  ld (linklosses),a
-  pop de               ;return from link
-  cp  lossout          ;quit if too many errors
-  ret c                ;otherwise just continue
-linkerr:
-  jp  Exit
+sendnewpeaoverlink:
+  ld  a,(gamecar)
+  rra ;and _datalink
+  ret nc ;no link
+  ld  a,(worm1+left)
+  or  a
+  jr  z,receivenewpeaoverlink
+  ld  c,l ;send pea's pos
+  cal Qsend
+  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
@@ -3818,7 +4160,7 @@ sendfinish:
   ld (linklosses),a    ;reset number of losses
   ret                  ;=ok
 
-;---- RECV ----
+;--- recv ---
 
 Crecv:         ;--- receive 8 bits into A/C --- destr:abCde ---
   cal Qrecv
@@ -3853,12 +4195,47 @@ recvfinish:
   ld (linklosses),a    ;reset number of losses
   ret
 
+;--- common ---
+
+linkok:
+  ld  a,D0HD1H
+  out (7),a            ;raise both wires = link ok
+  ret
+
+checklink:             ;load wires in A and check for timeout
+  dec de               ;decrease timer
+  ld  a,d
+  or  e
+  jr  z,linktimeout    ;timeout if de==0
+linktest:
+  ld  a,$BF
+  out (1),a            ;select keys
+  in  a,(1)            ;input
+  bit 6,a              ;exit key
+  jp  z,Exit           ;break!
+linkfine:
+  in  a,(7)
+  and %11
+  ret
+linktimeout: ;de==0
+  cal linkok
+  ld a,0               ;losses so far
+linklosses =$-1
+  inc a                ;and this is another one
+  ld (linklosses),a
+  pop de               ;return from link
+  cp  lossout          ;quit if too many errors
+  ret c                ;otherwise just continue
+linkerr:
+  jp  Exit
 
-;-----------------------------
-;---------- levels -----------
-;-----------------------------
+#ifdef intlevels
+;_______________________________________________________________________________
+; _____ __   _ _______              _______ _    _ _______        _______
+;   |   | \  |    |          |      |______  \  /  |______ |      |______
+; __|__ |  \_|    |    _____ |_____ |______   \/   |______ |_____ ______|
+;_______________________________________________________________________________
 
-;&&&&& 99%
 LevelDef:
   .db 5,4,15,15,0,0    ;peas,speed,growth,begin_size,sprite,balls
   .db 0,2,63           ;start d, y, x
@@ -3870,13 +4247,13 @@ LevelDef:
 
 LevelDefM:
   .db "Empty Arena",0
-  .db 8,4,15,15,0,0
+  .db 5,4,15,15,0,0
   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
   .db 128,57
   .db 0
 
   .db "Fast Fun :))",0
-  .db 8,0,18,12,5
+  .db 8+128,0,18,12,5
   .db %1110000,%10001000,%10001000,%10001000,%1110000,0
   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
   .db 128,57
@@ -3915,9 +4292,15 @@ LevelDefC: ;ctf
   .db 27,8,27,116
   .db 0
 
-;-----------------------------
-;---------- data -------------
-;-----------------------------
+#endif
+
+;_______________________________________________________________________________
+; ______  _______ _______ _______
+; |     \ |_____|    |    |_____|
+; |_____/ |     |    |    |     |
+;_______________________________________________________________________________
+
+;--- graphics ---
 
 wtPicture: ;title
 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
@@ -3948,221 +4331,184 @@ wtWormy: ;g/o
 
 ;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000
 
-txtMenu:  .db "Mode",0  ;1st menu item
-         .db "Level",0 ;2nd
-         .db "Link",0  ;...
-         .db "Worms",0
-         .db "worm #",0
-posMenu:  .db 5
-         .dw $2418,$231E,$2824,$1F2A,$1730
-txtMenuR: .db "controls",0
-txtoMenu: .db "Back",0  ;1st menu item
-         .db "Lives",0 ;2nd
-         .db "Limit",0 ;...
-         .db "Speed",0
-         .db "Rotation",0
-         .db "Growth",0
-posoMenu: .db 6
-         .dw $2618,$251E,$2524,$222A,$1A30,$1C36
-txtpMenu: .db "Resume",0  ;1st menu item
-         .db "Turn Off",0 ;2nd
-         .db "Contrast",$CF,5,0  ;...
-         .db "Exit",0
-pospMenu: .db 4
-         .dw $3418,$331E,$2F24,$3A2A
-txtGame:  .db "Singleplayer",0
-txtGame1: .db "Peaworm",0
-txtGame2: .db "Tron",0
-txtGame3: .db "Deathmatch",0
-txtGame4: .db "Foodmatch",0
-txtGame5: .db "Timematch",0
-txtGame6: .db "Race",0
-txtGame7: .db "CTF" ;,0
-
-posGame:  .db 0
-         .db txtGame1-txtGame
-         .db txtGame2-txtGame
-         .db txtGame3-txtGame
-         .db txtGame4-txtGame
-         .db txtGame5-txtGame
-         .db txtGame6-txtGame
-         .db txtGame7-txtGame
-
-txtNone:   .db "None",0
-txtDef:    .db "Default",0
-txtYes:    .db "Yes",0
-txtNo:     .db "No",0
-txtKeyleft: .db ":left",0
-txtKeyright:.db "/right",0
-posLevsel = $0320
-txtLevsel:  .db $CF," SELECT LEVELS ",5,0
-txtWaiting: .db "Waiting...",0
-txtReceive: .db "Receiving..." ;,0
-
-TrigPrecalc:
-.db   0,  3,  6,  9, 12, 15, 18, 21
-.db  24, 27, 30, 33, 36, 39, 42, 45
-.db  48, 51, 54, 57, 59, 62, 65, 67
-.db  70, 73, 75, 78, 80, 82, 85, 87
-.db  89, 91, 94, 96, 98,100,102,103
-.db 105,107,108,110,112,113,114,116
-.db 117,118,119,120,121,122,123,123
-.db 124,125,125,126,126,126,126,126
-.db 127
-
-txtLevel:  .db "Level ",0
-txtWorms:  .db "Worms: 0",0    ;follows txtLevel
-txtName:   .db "Name",0
-txtWinner: .db "Wins   "       ;follows txtName
-txtDied:   .db "Died    "      ;follows txtWinner
-txtScore:  .db "Score",0       ;follows txtDied
-txtLeft:   .db " left",0       ;follows txtScore
-txthiscore:.db "HiScore:",0
-#ifdef readytext
-txtReady:  .db "Prepare!",0
-txtposReady = 7
-#endif
 #ifndef coolzgfx
 txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
 #endif
 
-datalevels: .dw LevelDef, LevelDefM
-            .dw LevelDefT,LevelDefM
-            .dw LevelDefM,LevelDefM
-            .dw LevelDefR,LevelDefC
-nrlevels:   .db 0,3,1,3,3,3,3,1     ;=defaults
-
-_datalink      = %0000001 ;linkplay
-_datafoodl     = %0000010 ;left=0 limit
-_datasingl     = %0000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
-_datamultpeas  = %0001000 ;multiple peas=1
-_datatime      = %0010000 ;time incs score (timematch)
-_datafood      = %0100000 ;food present
-_datadie       = %1000000 ;worm dies on impact
-;reserved       %10000000 ;for future use
-
-savestart:        ;     �game info (see above)
-                  ;     | �lives (0=unlimited)
-                  ;     | | �nrworms (can be altered by user)
-                  ;     | | | �level (reset to 1 at startup)
-                  ;     | | | |  �speed/delay (-1=def)
-                  ;     | | | |  |  �grow speed (-1=none; 0=continuous)
-                  ;     | | | |  |  |  �turn speed (8=def)
-                  ;     | | | |  |  |  |  �score limit (0=none)
-gamesingle   =  0 ;used | | | |  |  |  |  |
-datasingle: .db  %1100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
-gamepeas     =  1
-datapeas:   .db  %1100100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
-gametron     =  2
-datatron:   .db  %1010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
-gamedeathm   =  3 ;used
-datadeathm: .db  %1000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
-gamefoodm    =  4
-datafoodm:  .db  %1100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
-gametimem    =  5
-datatimem:  .db  %1010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
-gamerace     =  6 ;used
-datarace:   .db  %0000000,0,2,1,-1,-1, 8,10 ;Race (100 score, no collision)
-gamectf      =  7 ;used
-datactf:    .db  %1001000,0,4,1,-1,-1, 8,10 ;CTF (100 score)
-
-worm1set:  .dw worm1p,worm1p
-           .db %11110111,1,-01,K_RIGHT,K_LEFT
-worm1name: .db "WORMY   ",0
-worm2set:  .dw worm2p,worm2p
-           .db %11111011,0,-01,K_F2,K_F1
-worm2name: .db "VIPER   ",0
-worm3set:  .dw worm3p,worm3p
-           .db %11111011,1,-01,K_COMMA,K_STO
-worm3name: .db "NIBBLER ",0
-worm4set:  .dw worm4p,worm4p
-           .db %11111011,0,-01,K_PLUS,K_ENTER
-worm4name: .db "JIM     ",0
+;--- menus ---
+
+txtMenu:   .db                  "Mode",0 ;1st menu item
+          .db                 "Level",0 ;2nd
+          .db                  "Link",0 ;...
+          .db                 "Worms",0
+          .db                "worm #",0
+posMenu:   .db 5
+          .dw $2418,$231E,$2824,$1F2A,$1730
+txtteamed: .db                 " vs 2",0 ;4th tail
+txtMenuR:  .db              "controls",0 ;6th
+
+txtoMenu:  .db                  "Back",0 ;1st menu item
+          .db                 "Lives",0 ;2nd
+          .db                 "Limit",0 ;...
+          .db                 "Speed",0
+          .db              "Rotation",0
+          .db                "Growth",0
+posoMenu:  .db 6
+          .dw $2618,$251E,$2524,$222A,$1A30,$1C36
+
+txtpMenu:  .db                "Resume",0 ;1st menu item
+          .db              "Turn Off",0 ;2nd
+          .db        "Contrast",$CF,5,0 ;...
+          .db                  "Exit",0
+pospMenu:  .db 4
+          .dw $3418,$331E,$2F24,$3A2A
+
+;--- text ---
+
+txtGame:   .db          "Singleplayer",0
+txtGame1:  .db               "Peaworm",0
+txtGame2:  .db                  "Tron",0
+txtGame3:  .db            "Deathmatch",0
+txtGame4:  .db             "Foodmatch",0
+txtGame5:  .db        "Multifoodmatch",0
+txtGame6:  .db             "Timematch",0
+txtGame7:  .db                  "Race",0
+txtGame8:  .db                  "CTF";,0
+posGame:   .db                         0
+          .db          txtGame1-txtGame
+          .db          txtGame2-txtGame
+          .db          txtGame3-txtGame
+          .db          txtGame4-txtGame
+          .db          txtGame5-txtGame
+          .db          txtGame6-txtGame
+          .db          txtGame7-txtGame
+          .db          txtGame8-txtGame
+
+txtNone:   .db                  "None",0
+txtDef:    .db               "Default",0
+txtYes:    .db                   "Yes",0
+txtNo:     .db                    "No",0
+txtKleft:  .db                 ":left",0
+txtKright: .db                "/right",0
+posLevsel   =  $0320
+txtLevsel: .db $CF," SELECT LEVELS ",5,0
+txtWaitn:  .db         "Waiting";"...",0
+txtReceiv: .db                   "...",0
 
+#ifdef readytext
+txtReady:  .db              "Prepare!",0
+txtposReady =  7
+#endif
+txtLevel:  .db                "Level ",0
+txtWorms:  .db              "Worms: 0",0 ;follows txtLevel
+txtName:   .db                  "Name",0
+txtWinner: .db                "Wins",$D8 ;follows txtName
+txtDied:   .db                "Died",$D8 ;follows txtWinner
+txtScore:  .db                 "Score",0 ;follows txtDied
+txtLeft:   .db                 " left",0 ;follows txtScore
+txthiscore:.db             "HiScore:";,0
+
+;--- 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
+           .db   89, 91, 94, 96, 98,100,102,103,105,107,108,110,112,113,114,116
+           .db  117,118,119,120,121,122,123,123,124,125,125,126,126,126,126,126
+           .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
 defhiscrpos:
-  .db 0,0,"SHI"
-  .db 0,0,"SHI"
-  .db 0,0,"SHI"
-  .db 0,0,"SHI"
-  .db 0,0,"SHI"
-
-Gametype:  .db 0 ;last gamemode
-
-saveend:
-
-               ;set:
-heading  = 0   ;level*
-pos      = 2   ;level*
-pos2     = 4   ;level
-grow     = 6   ;level
-died     = 8   ;game
-score    = 9   ;game
-delay    = 11  ;game
-               ;19B @game
-lives    = 12
-head     = 13  ;4B (head=tail)
-tail     = 15  ;also@next level
-storepos = 17
-reserv   = 18  ;loop (race:lap|ctf:pea)
-input    = 19 ;---currently unused afaik---
-left     = 20
-right    = 21
-name     = 22
-wormsize = 31
-
-startdelay    = 30
-respawndelay  = 30
-maxnamelength = 8+1
-
-;bla space (reserved for internal levels)
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
-.db "   wormy@shiar.org",0
-
-defspritesz = 4
-defspriteimg:  .db %01100000
-               .db %11110000
-               .db %11110000
-               .db %01100000
-
-deflevels:
-  .db "Internal Levels",0
-  .db "by SHIAR -- still t"
-  .db "o be added...." ;,0
-
-  .db 0,deflevels/256,deflevels&255
+           .db 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI", 0,0,"SHI"
+#else
+defhiscrpos =  0
+#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!)
+
+savestart:;---
+
+worm1set:  .dw worm1p
+           .db  %11110111,1,K_RIGHT,K_LEFT
+worm1name: .db   "WORMY   ",0 ;15 bytes
+worm2set:  .dw worm2p
+           .db  %11111011,0,K_F2,K_F1
+worm2name: .db   "VIPER   ",0
+worm3set:  .dw worm3p
+           .db  %11111011,1,K_COMMA,K_STO
+worm3name: .db   "NIBBLER ",0
+worm4set:  .dw worm4p
+           .db  %11111101,0,K_PLUS,K_ENTER
+worm4name: .db   "JIM     ",0
+
+         ;            �game info (see above)
+          ;           | �lives (0=unlimited)
+           ;          | | �nrworms (can be altered by user)
+            ;         | | | �level (reset to 1 at startup)
+             ;        | | | |  �speed/delay (-1=def)
+              ;       | | | |  |  �grow speed (-1=none; 0=continuous)
+               ;      | | | |  |  |  �turn speed (8=def)
+                ;     | | | |  |  |  |  �score limit (0=none)
+gamesingle  =  0 ;    | | | |  |  |  |  |
+datasingle:.db %00000110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
+gamepeas    =  1
+datapeas:  .db %00000100,1,1,1,-1,126,8, 0 ;Peaworm (SP; 1 live, 127 growth)
+gametron    =  2
+datatron:  .db %01010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
+gamedeathm  =  3
+datadeathm:.db %01000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
+gamefoodm   =  4
+datafoodm: .db %00000000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
+gamemfoodm  =  5
+datamfoodm:.db %11000010,0,2,1,-1,-1, 8,10 ;MuchFoodmatch (10 peas)
+gametimem   =  6
+datatimem: .db %01010000,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
+datactf:   .db %01001000,0,6,1,-1,-1, 8,10 ;CTF (100 score)
+
+gametype:  .db 0 ;last gamemode
+gamecar:         ;made before needed (not saved)
+
+saveend:;---
+
+startdelay  =  17
+rspawndelay =  31
+maxnamesize =  8+1
+
+#ifdef intlevels
+           .db $42 ;gamecar
+defsprsz    =  4
+defspr:    .db %01100000
+           .db %11110000
+           .db %11110000
+           .db %01100000
+
+deflevels: .db "Internal Levels",0
+           .db       "by Shiar";,0
+
+           .db 0,deflevels/256,deflevels&255
+#endif
 templevels:
 
-;-----------------------------
-;----------- end -------------
-;-----------------------------
+;_______________________________________________________________________________
+; _______ _     _ _______ _______ . _______       _______
+;    |    |_____| |_____|    |    ' |______       |_____| |      |
+;    |    |     | |     |    |      ______| _____ |     | |_____ |_____
+;_______________________________________________________________________________
 
   .end