game over screen mockup
[wormy.git] / wormy.z80
index 386a5bcbd32a1b630ee7c134ebea9a5790023edb..6ed5a09dfdc5329daa4672abb5140d3034744374 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
@@ -1,6 +1,6 @@
 ; Title                      : Wormy
-; Version                    : 92%
-; Release Date               : june 2000
+; Version                    : 93%
+; Release Date               : summer 2001
 ; Filename                   : wormy.86p (5kb)
 ; Author(s)                  : Shiar
 ; Email Address              : shiar0@hotmail.com
 ;----------- TO-DO -----------
 ;-----------------------------
 
-; 92% = DONE
+; 93% = DONE
 
-;     * customizable keys
-;     * internal levels
-;       * check levels/gametype
-;       * enough hiscore saves!
-;     * complete readme
-;  2% * misc (pollish, bugs, &&&)
+;    [* internal levels         ]
+;    [  * check levels/gametype ]
+;    [  * enough hiscore saves! ]
+;    [* complete readme         ]
+;  1% * misc (pollish, bugs, &&&)
 ;   * LINK
-;  2% * fix deaths linkplay and transmit game/level data
-;  2% * make linkplay available for all gametypes (not just deathmatch)
+;     * fix first packet loss
+;  1% * transmit game/level data
+;  1% * get g/o signal (l&l) working
+;  2% * send new peas' positions
 ;   * CTF
-;  1% * fix pea XOR problem in ctf (+dom?)
-;     * fix wormstop
-;  1% * domination?: take control points by running over them and hold them
+;  1% * fix pea XOR problem in ctf
+;  1% * fix wormstop in race
 
 ;100% = bugs fixed + levels done
 
 ;-----------------------------
 
 #define buffer      ;use display buffer (otherwise write directly to screen)
-#define readymask   ;"grays" out the field before starting a level
-
+#define readymask   ;"greys" out the field before starting a level
+;#define hlines     ;horizontal-line routine for more speed drawing boxes
+                       ;^^(doesn't work properly)^^
 ;#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
 #include "asm86.h"
 #include "ti86asm.inc"
 
-_SHRACC            = $4383
-_SHLACC            = $438B
+_SHRACC            = $4383 ;4x srl a
+_SHLACC            = $438B ;4x sll a
 _divHLby10         = $4044 ;hl=hl/10
 _divAby10          = $4DAF ;a=a/10
 _HLTIMES10         = $41BF ;hl=hl*10
-_cphlde            = $403C
+_cphlde            = $403C ;cp hl,de
 _clrWindow         = $4A86 ;clear screen
 _asapvar           = $D6FC ;own name (worm)
 _MOV4B             = $429B ;4x ld (de),(hl)
@@ -75,13 +77,15 @@ _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
 _SET_MM_NUM_BYTES  = $464F ;number of bytes for mm.ldir = ahl
 _mm_ldir           = $52ED ;24bit ldir
+_MM_LDIR_SET_SIZE  = $524D ;_SET_MM_NUM_BYTES + _mm_ldir
 _RAM_PAGE_1        = $47E3 ;set $8000+ to page 1
-_RAM_PAGE_7        = $47F3
+_RAM_PAGE_7        = $47F3 ;"""" 7
 _PTEMP_END         = $D29A ;end of VAT
 _load_ram_ahl      = $462F ;ahl->page+hl
-_writeb_inc_ahl    = $5567 ;ld (ahl),c
+_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 -------
@@ -107,7 +111,8 @@ worm3p      = $B800 ;-BBFF (400)      %10111O00
 worm4p      = $F000 ;-F3FF (400)      %11110O00
 leveldata   = $F400 ;-FA70 (<=671)
 
-peaspos = $AE01
+turn10  = $AE01
+peaspos = $AE02
 
 ;--- temporary
 
@@ -124,32 +129,31 @@ DispBuffer  = $FC70
 
 .org _asm_exec_ram
 
-wormVhost   = 092
-wormVclient = 192
+wormVhost   = 093
+wormVclient = 193
 
 start:
   nop
   jp Start
   .dw 1
-  .dw WormMsg
+  .dw WormTxt
   .dw WormIcon
 
-WormMsg:
-  .db "WORMY by SHIAR -- alpha 92%",0
+WormTxt:
+  .db "WORMY by SHIAR -- beta 93%",0
 WormIcon:
-  .db 9,2
-  .db %10010110,%01101111
-  .db %10110101,%01001011
-  .db %01110011,%01001001
-  .db %00000011,%10000000
-  .db %00000001,%11100000
-  .db %00111000,%11111000
-  .db %01111110,%00111111
-  .db %11101111,%00001111
-  .db %11000011,%10000000
+  .db 8,2
+  .db %00110000,%00111100
+  .db %01110000,%00111110
+  .db %11100000,%00000111
+  .db %11000011,%11000011
+  .db %11000111,%11100011
+  .db %11101110,%01100111
+  .db %01111100,%01111110
+  .db %00111000,%00111100
 
 levelhead  = 'w'
-levelhead2 = 92 ;wormy levels header = "92"
+levelhead2 = 94 ;wormy levels header = "93"
 
 int_handler:
   ex af,af'
@@ -188,7 +192,7 @@ Start:
 
   cal _RAM_PAGE_7
   ld  hl,$BFFF ;VAT start
-  ld  bc,templevels
+  ld  ix,templevels
 searchloop:
   ld  de,(_PTEMP_END+1) ;VAT end
   or  a ;nc
@@ -200,20 +204,17 @@ searchloop:
   cp  $0C ;string
   jr  z,stringfound
 searchnext:
- cal _RAM_PAGE_7
   pop hl
   dec hl ;5x
   dec hl
   dec hl
   dec hl
   dec hl
- psh bc
   ld  b,(hl) ;name size
   inc b
 skipname:
   dec hl
   dnz skipname
- pop bc
   jr  searchloop
 
 stringfound:
@@ -226,40 +227,34 @@ stringfound:
   ex  de,hl ;ld ahl,(hl)
   cal _AHL_PLUS_2_PG3 ;string id
   cal _Get_Word_ahl ;ld de,(ahl)
- cal _RAM_PAGE_1
- ld (bc),a
+  ld (ix),a
   ld  a,levelhead
   cp  e
-  jr  nz,searchnext ;not worm
+  jr  nz,_searchnext ;not worm
   ld  a,levelhead2
   cp  d
-  jr  nz,searchnext
-
- inc bc
- ld a,h
- ld (bc),a
- inc bc
- ld a,l
- ld (bc),a
- inc bc
- jr 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
+_searchnext:
+  cal _RAM_PAGE_7
+  jr searchnext
 
 loadgametype:
   psh de
-  inc bc
-  inc bc
   cal _Get_Word_ahl ;ld de,(ahl++)
   psh af
-  ld  a,d
-  or  e
-  jr  z,defaultlevels
   ld  a,e ;set new level
   ld  (bc),a
   inc bc
   ld  a,d
   ld  (bc),a
-  dec bc
-defaultlevels:
+  inc bc
   pop af
   pop de ;counter
   dec d ;8x
@@ -267,77 +262,123 @@ defaultlevels:
   ret
 
 searchcomplete:
-  cal _RAM_PAGE_1
   ld  a,255
-  ld  (bc),a ;end mark
+  ld  (ix),a ;end mark
+
+  cal _clrWindow
   ld  hl,templevels-3
-dispnextlevel:
-  cal _RAM_PAGE_1
   psh hl
-  cal _clrWindow
-  ld  a,2
-  ld  (_curRow),a
+  ld  hl,$0020
+  ld  (_penCol),hl
   ld  hl,txtLevsel
-  cal _puts ;"< Select levels: >"
-  ld  hl,$0004
-  ld  (_curRow),hl
+  cal _vputs ;"< Select levels: >"
+  ld  hl,$0601 ;x=1
+  ld  (_penCol),hl
   pop hl
+dispnextlevel:
   ld  a,(hl)
-  cp  255 ;&&
-  jr  nz,displevel
-  ld  hl,templevels-3
-  ld  a,(hl)
+  inc a ;cp 255
+  jr  z,_levselect
+  ld  a,(hl) ;ade=(hl)
 displevel:
   inc hl
   ld  d,(hl)
   inc hl
   ld  e,(hl)
-  inc hl  ;ade=(hl)
-  psh hl  ;HL
-  ld  c,a
-  ld  h,d
-  ld  l,e ;cde=ahl=(hl)
+  inc hl
+  psh hl
+  ex  de,hl ;ahl=ade=(hl)
   cal _load_ram_ahl ;hl=ahl
   ld  b,(hl) ;b=title size
-  psh bc
-  cal _putps ;destr=abchl
-  pop bc  ;cde=hl
-  pop hl  ;HL
+  cal _vputs
+  ld  hl,_penCol
+  ld  (hl),$01 ;x=1
+  inc hl
+  ld  a,(hl)
+  add a,6
+  ld  (hl),a ;y+6
+  ld  hl,availevels
+  inc (hl)
+  pop hl
+  jr  dispnextlevel
+
+levup:
+  cal menupos
+  dec b ;up
+  ld  a,b
+  cp  -4
+  jr  nz,levselected
+  inc b ;undo
+  jr  levselected
+levdown:
+  cal menupos
+  inc b ;down
+  ld  a,b
+  cp  -3
+availevels =$-1
+  jr  nz,levselected
+  dec b ;back up
+levselected:
+  jp  menupos
+
+_levselect:
+  ld  b,-3 ;level selected
+  cal menupos
 levselect:
-  halt
-  psh hl
-  psh de
+  halt \ halt
   psh bc
   cal GET_KEY
-  pop bc
-  pop de
-  pop hl
-  cp  K_RIGHT
-  jr  z,dispnextlevel
-  sub K_SECOND
+  pop bc ;GET_KEY destr. b
+  cp  K_UP
+  cal z,levup
+  dec a ;K_DOWN
+  cal z,levdown
+  cp  K_SECOND-1
   jr  z,loadlevel
-  dec a ;K_EXIT
-  ret z
-  cp  K_ENTER-K_EXIT+256
+  cp  K_EXIT-1
+  jp  z,ExitNoStats
+  cp  K_ENTER-1
   jr  nz,levselect
+; jr  z,loadlevel
 
 loadlevel:
-  ld  a,c
+  ld  a,b
+  add a,3 ;sellev+3 (#0==-3)
+  ld  e,a
+  add a,a ;*2
+  add a,e ;*3
+  ld  e,a
+  ld  d,0 ;de=sellev*3
+  ld  hl,templevels-3
+  add hl,de
+  ld  a,(hl) ;ade=(hl)
   or  a ;levelfile on page 0 (=internal)
   jr  z,levelloaded
 
-  ex  de,hl ;ahl=cde
-  inc b ;b=titlesize+1
+  inc hl
+  ld  d,(hl)
+  inc hl
+  ld  e,(hl)
+  ex  de,hl ;ahl=ade
 skiptitle:
-  cal _INC_PTR_AHL
-  dnz skiptitle
+  ld  b,a ;psh ahl
+  psh hl
+  cal _GETB_AHL ;ld a,(ahl)
+  pop hl
+  or  a
+  ld  a,b ;pop ahl
+  psh af
+  cal _INC_PTR_AHL ;ahl++
+  pop af ;cp 0
+  jr  nz,skiptitle ;goto #0-terminator
 
   cal _Get_Word_ahl
   ld  (leveldataSize),de
+
   ld  d,8 ;counter
-  ld  bc,datalevels-2
+  ld  bc,datalevels
   cal loadgametype
-  ld  (hilvlposa),a
+  ld  (hilvlposa),a ;singleplayer levels
   ld  (hilvlposhl),hl
   ld  d,4
   cal loadgametype
@@ -348,8 +389,7 @@ skiptitle:
   cal _SET_ABS_DEST_ADDR ;store in mem.
   ld  hl,0
 leveldataSize =$-2
-  cal _SET_MM_NUM_BYTES
-  cal _mm_ldir
+  cal _MM_LDIR_SET_SIZE
 
   cal _LOAD_ABS_SRC_ADDR ;->ahl
   ld  (hiscrposa),a
@@ -367,6 +407,14 @@ levelloaded:
   ld  a,r
   ld  (Seed),a
 
+  ld  hl,datasingle+3
+  ld  b,8
+  ld  de,8
+setdeflevels:
+  ld  (hl),1 ;def=level#1
+  add hl,de ;next
+  dnz setdeflevels
+
 ;-----------------------------
 ;----- build trig tables -----
 ;-----------------------------
@@ -398,61 +446,298 @@ NegativeSineWave:
 ;---------- menu -------------
 ;-----------------------------
 
-  ld  a,1
-  ld  (curlevel),a
-
-;--- draw menu ---
-
-DisplayMenu:
+DisplayMenu: ;---draw menu---
+  cal linkok
   cal _clrWindow
-  ld  de,$FC42 ;(10,2)
+  ld  de,$FC40 ;(0,4)
   ld  hl,wtPicture
-  ld  a,16 ;height
-disptitleloop:
-  ld  bc,8 ;width
+  ld  bc,16*16
   ldir
-  ex  de,hl
-  ld  bc,8 ;next line
-  add hl,bc
-  ex  de,hl
-  dec a
-  jr  nz,disptitleloop
+  ld  hl,$FC00+$160
+  cal hr
+  ld  hl,$FC00+$3E0
+  cal hr
+dispmainmenu:
+  ld  hl,Gametype
+  ld  a,(hl)
+  dec a ;will be inced @changegame
+  and 7
+  ld  (hl),a
+  ld  hl,changegame ;dispmenusets ;mainMenu
+  psh hl ;jump here after ret
   ld  hl,txtMenu
-  ld  de,$0D5A
-  ld  (_penCol),de
-  cal _vputs ;by Shiar
-
-  ld  de,$0207
-  ld  (_curRow),de
-  cal _puts ;Level <00>
-  dec e ;$0206
-  ld  (_curRow),de
-  cal _puts ;Limit <00>
-  dec e ;$0205
-  ld  (_curRow),de
-  cal _puts ;Worms <2>
-  dec e ;$0204
-  ld  (_curRow),de
-  ld  hl,(CURtxtGame)
-  cal _puts ;Singleplayer
+  ld  ix,posMenu
+;Mode|Level|Limit|Worms|worm #|controls
+; jr  dispmenucommon ;cal
 
+dispmenucommon:
+  ld  de,$FD80 ;begin pos
+  ld  b,36*16/3
   xor a
-  cal menudraw
-  jr  howmanyworms
+clroldmenuloop:
+  ld  (de),a
+  inc de
+  ld  (de),a
+  inc de
+  ld  (de),a
+  inc de
+  dnz clroldmenuloop
+
+  ld  b,6
+dispmenuloop:
+  ld  d,(ix)
+  inc ix
+  ld  e,(ix)
+  inc ix
+  ld  (_penCol),de
+  cal _vputs
+  dnz dispmenuloop
+; ld  b,0 ;b=menu#
+  ret
+
+hr: ;draw horizontal line at hl
+  ld  b,16
+  jp  menuinvloop
 
 ;--- menu loop ---
 
+dispoptionmenu:
+  ld  hl,txtoMenu
+  ld  ix,posoMenu
+;Back|Lives|Limit|Speed|Rotation|Growth
+  cal dispmenucommon
+
+dispomenusets:
+  cal clrold
+
+  ld  hl,$1E3E
+  ld  (_penCol),hl
+  cal loadgamecar
+  psh hl
+  cal cshowA ;lives
+
+  ld  hl,$2A3E
+  ld  (_penCol),hl
+  pop hl ;loadgamecar
+  inc hl \ inc hl \ inc hl
+  psh hl
+  ld  a,(hl) ;(Speed)
+  inc a ;1..99
+  jr  nz,dispspeed
+  ld  hl,txtDef
+  cal _vputs
+  jr  dispspeeddone
+dispspeed:
+  cal cshowA
+dispspeeddone:
+
+  ld  hl,$363E
+  ld  (_penCol),hl
+  pop hl ;loadgamecar
+  inc hl
+  psh hl
+  ld  a,(hl) ;(growth)
+  inc a ;-1=None; 0..98->1..99
+  cal cshowA
+
+  ld  hl,$303E
+  ld  (_penCol),hl
+  pop hl ;loadgamecar
+  inc hl
+  psh hl
+  ld  a,(hl)
+  cp  8
+  jr  nz,dispturn
+  ld  hl,txtDef
+  cal _vputs
+  jr  dispturndone
+dispturn:
+  cal cshowA ;turn speed
+dispturndone:
+
+  ld  hl,$243E
+  ld  (_penCol),hl
+  pop hl ;loadgamecar
+  inc hl
+  ld  a,(hl) ;(scorelimit)
+  or  a
+  psh af
+  cal cshowA ;limit
+  pop af ;a==0?
+  jr  z,optionMenu ;do not display 0 behind 'None'
+  ld  a,'0'
+  cal _vputmap ;x10
+
+optionMenu:
+  cal menupos
+  cal menucall
+  jr  nz,notoselect
+oselect:
+  cal menupos
+  ld  a,b
+  or  a ;1st item?
+  jp  z,dispmainmenu ;mainMenu
+  jr  optionMenu
+notoselect
+  cp  K_EXIT
+  jp  z,dispmainmenu
+  psh af
+  cal menupos
+  cal loadgamecar
+  inc hl
+  pop af
+  cp  K_LEFT
+  jr  z,seloleft
+  cp  K_RIGHT
+  ld  a,b
+  jr  nz,optionMenu
+
+seloright:
+  dec a
+  jr  z,changelives
+  dec a
+  jr  z,changelimit
+  dec a
+  jr  z,changespeed
+  dec a
+  jr  z,changeturn
+  dec a
+  jr  z,changegrowth
+
+seloleft:
+  ld  a,b
+  dec a
+  jr  z,bchangelives
+  dec a
+  jr  z,bchangelimit
+  dec a
+  jr  z,bchangespeed
+  dec a
+  jr  z,bchangeturn
+  dec a
+  jr  z,bchangegrowth
+_optionMenu:
+  jr  optionMenu
+
+changelives:
+  cal loadgamecar ;a=(hl)
+  inc a
+  cp  100
+  jr  nc,optionMenu ;>99
+changedlives:
+  ld  (hl),a
+_dispomenusets:
+  jp  dispomenusets ;optionMenu
+bchangelives:
+  cal loadgamecar
+  sub 1 ;dec does not set cf
+  jr  c,optionMenu ;<0
+  jr  changedlives
+
+changelimit:
+  cal changelimitInit
+  inc a
+  cp  100
+  jr  nc,optionMenu ;>99
+changedlimit:
+  ld  (hl),a
+  jr  _dispomenusets ;optionMenu
+bchangelimit:
+  cal changelimitInit
+  sub 1 ;dec does not set cf
+  jr  c,optionMenu ;<0
+  jr  changedlimit
+changelimitInit:
+  cal loadgamecar
+  ld  de,6
+  add hl,de
+  ld  a,(hl) ;(scorelimit)
+  ret
+
+changespeed:
+  cal changespeedInit
+  inc a
+  cp  99
+  jr  nc,_optionMenu ;>98
+changedspeed:
+  dec hl ;(Speed)
+  ld  (hl),a
+  jr  _dispomenusets ;optionMenu
+bchangespeed:
+  cal changespeedInit
+  dec a
+  cp  -2
+__optionMenu: ;w/ zf
+  jr  z,_optionMenu ;<-1
+  jr  changedspeed
+changespeedInit:
+  cal loadgamecar
+  ld  de,3
+  add hl,de
+  ld  a,(hl) ;(Speed)
+  inc hl ;=saves 2 bytes :P
+  ret
+
+changeturn:
+  cal changespeedInit
+  inc hl ;(turnspeed)
+  ld  a,(hl)
+  inc a
+  cp  26
+  jr  nc,_optionMenu ;>25
+changedturn:
+  ld  (hl),a
+  jr  _dispomenusets ;optionMenu
+bchangeturn:
+  cal changespeedInit
+  inc hl
+  ld  a,(hl)
+  dec a
+  cp  3
+  jr  c,_optionMenu ;<3
+  jr  changedturn
+
+changegrowth:
+  cal changespeedInit
+  ld  a,(hl)
+  inc a
+  cp  99
+  jr  nc,_optionMenu ;>98
+changedgrowth:
+  ld  (hl),a
+  jr  _dispomenusets ;optionMenu
+bchangegrowth:
+  cal changespeedInit
+  ld  a,(hl)
+  dec a
+  cp  -2
+  jr  z,__optionMenu ;<-1
+  jr  changedgrowth
+
+;---
+
 mainMenu:
+  cal menupos
   cal menucall
   jr  nz,notselect
 select:   ;2nd/enter
+  cal menupos
   ld  a,b
-  dec a   ;2nd item
+  dec a ;2nd item: level
+  jp  z,dispoptionmenu
+  sub 3 ;5th item: wormname
   jp  z,changeworms
-  jp  LetsGetThisPartyOn ;1/3/4
+  dec a ;6th: controls
+  jp  z,changekeys
+  jp  LetsGetThisPartyOn ;otherwise
 notselect
   cp  K_EXIT
   jp  z,ExitNoStats
+  psh af
+  cal menupos
+  cal loadgamecar
+  inc hl
+  pop af
   cp  K_LEFT
   jr  z,selleft
   cp  K_RIGHT
@@ -463,141 +748,215 @@ selright:
   or  a
   jr  z,changegame
   dec a
-  jr  z,changenrworms
+  jr  z,changelevel
+  dec a
+  jr  z,changelink
   dec a
-  jp  z,changelives
+  jr  z,changenrworms
+; dec a
+; jr  z,changecurworm
 
-changelevel:
-  ld  hl,Gametype
-  ld  d,0
-  ld  e,(hl)
-  ld  hl,nrlevels
-  add hl,de
-  ld  d,(hl) ;max level for sel.game
-curlevel =$+1
-  ld  a,1
+changecurworm:
+; hl=nrworms
+  ld  a,(curworm)
+  cp  (hl)
+  jr  nc,mainMenu ;may not become >(nrworms)
   inc a
-  cp  d
-  jr  c,changedlevel
-  ld  a,d
-changedlevel:
-  ld  (curlevel),a
-_dispcurlevel:
-  ld  hl,$0807
-  ld  (_curRow),hl
-  cal showA
-  jp  displives ;mainMenu
+changedcurworm:
+  ld  (curworm),a
+  jr  _dispmenusets ;mainMenu
 
 selleft:
   ld  a,b
+  or  a
+  jr  z,bchangegame
   dec a
-  jr  z,bchangenrworms
+  jr  z,bchangelevel
   dec a
-  jp  z,bchangelives
+  jr  z,bchangelink
   dec a
-  jr  nz,mainMenu
+  jr  z,bchangenrworms
+; dec a
+; jr  z,bchangecurworm
 
-bchangelevel:
-  ld  a,(curlevel)
-  dec a
-  jr  nz,changedlevel
+bchangecurworm:
+  ld  a,(curworm)
+  dec a ;0-3
+  jr  nz,changedcurworm ;save >0
+  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
+_dispmenusets:
+  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
+  cp  2
+  jr  nc,changednrworms ;save >=2
 _mainMenu:
   jr  mainMenu
 
+change4spOnly:
+  ld  a,(Gametype)
+  cp  3
+  ret nc
+  pop hl ;cal
+  jr  _mainMenu ;don't change for singleplayer
+
+changelink:
+bchangelink:
+  cal change4spOnly
+  dec hl ;inced earlier
+  dec hl ;gameCar
+  ld  a,1 ;change LS-bit (=link)
+  xor (hl) ;0=1; 1=0
+  ld  (hl),a
+  jr  dispmenusets ;mainMenu
+
 changegame:
-  ld  a,1
-  ld  (curlevel),a
-  ld  a,0
-Gametype =$-1
-  ld  hl,txtGame2
-NEXTtxtGame =$-2
+  ld  a,(Gametype)
   inc a
+  cal changedgame
+  jr  z,changegame
+  jr  dispmenusets ;mainMenu
+changedgame:
   and 7 ;mod 8
-  jr  nz,okilydokily
-  ld  hl,txtGame
-okilydokily:
   ld  (Gametype),a
-  ld  de,$0204
-  ld  (_curRow),de
-  ld  (CURtxtGame),hl
-  cal _puts
-  ld  (NEXTtxtGame),hl
-howmanyworms:
-  ld  hl,nrworms
+  cal getnrlevels
+  xor a
+  cp  (hl)
+  ret
+bchangegame:
   ld  a,(Gametype)
-  cp  2
-  ld  (hl),1
-  jr  c,dispnrworms
-  inc (hl) ;2
-  jr  dispnrworms ;mainMenu
+  dec a
+  cal changedgame
+  jr  z,bchangegame
+  jr  dispmenusets ;mainMenu
 
-changenrworms:
+changelevel:
+  inc hl ;hl=loadgamecar+2
+  psh hl
+  ld  a,(hl) ;(curlevel)
+  cal getnrlevels
+  cp  (hl) ;max level for sel.game
+  pop hl
+  jr  z,_mainMenu
+  inc a
+changedlevel:
+  ld  (hl),a
+  jr  dispmenusets ;mainMenu
+bchangelevel:
+  inc hl
+  ld  a,(hl) ;(curlevel)
+  dec a
+  jr  nz,changedlevel
+  jr  _mainMenu
+
+getnrlevels: ;for current gametype at hl
+  ld  hl,Gametype
+  ld  d,0
+  ld  e,(hl)
+  ld  hl,nrlevels
+  add hl,de
+  ret
+
+getcustomkey:
+  cal _vputs
+  dec ix
+waitcustomkey:
+  halt \ halt
+  psh hl
+  cal GET_KEY
+  pop hl
+  or  a
+  jr  z,waitcustomkey
+  cp  K_EXIT
+  ret z
+  cp  K_MORE
+  jr  z,waitcustomkey
+  ld  (ix),a
+  ret
+
+changekeys:
+  cal getwormname
+  ld  hl,txtKeyleft
+  cal getcustomkey ;left
+  cal getcustomkey ;right
+; jr  dispmenusets
+
+;---display current settings---
+
+dispmenusets:
+  cal clrold
+  ld  de,$183E
+  ld  (_penCol),de
+  ld  d,0
   ld  a,(Gametype)
-  cp  2 ;&&
-  jr  c,_mainMenu ;type 0/1
+  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
 
-  ld  hl,nrworms
+  ld  hl,$2A3E ;worms
+  ld  (_penCol),hl
+  cal loadgamecar
+  inc hl
+  psh hl
   ld  a,(hl)
-  inc a
-  cp  5
-  jr  nc,dispcurlevel
-changednrworms:
-  ld  (hl),a
-dispnrworms:
-  ld  a,(hl) ;hl=nrworms
-  ld  hl,$0805
-  ld  (_curRow),hl
   add a,'0'
-  cal _putc
-dispcurlevel:
-  ld  a,(curlevel)
-  jr  _dispcurlevel ;mainMenu
+  cal _vputmap
 
-bchangenrworms:
-  ld  hl,nrworms
-  ld  a,(hl)
-  dec a ;1-3
-  jr  nz,changednrworms
-  jr  dispcurlevel
+  ld  hl,$243E
+  ld  (_penCol),hl
+  rr  c ;(gameCar)
+  ld  hl,txtNo
+  jr  nc,displink
+  ld  hl,txtYes
+displink:
+  cal _vputs
 
+  ld  hl,$1E3E ;level
+  ld  (_penCol),hl
+  pop hl ;loadgamecar; hl++
+  inc hl
+  ld  a,(hl) ;(curlevel)
+  cal cshowA
 
-changelives:
-  cal changelivesInit
-  inc a
-  cp  100
-  jr  nc,displives
-changedlives:
-  ld  (hl),a
-displives:
-  cal loadgamecar
-  ld  hl,$0806
-  ld  (_curRow),hl
-  cal showA ;liveslimit
-  sub '0' ;original A
-  ld  l,a
-  ld  a,c
-  and _datascore
-  ld  a,' '
-  jr  z,limitok
-  ld  a,'0'
-limitok:
-  cal _putc ;x10
+  ld  hl,$3032
+  ld  (_penCol),hl
+  ld  a,1
+curworm =$-1
+  add a,'0'
+  cal _vputmap
+  ld  hl,$303E
+  ld  (_penCol),hl
+  cal getwormname
+  psh ix ;wormNname
+  pop hl ;ld hl,ix
+  cal _vputs
+  ld  hl,$363E ;controls
+  ld  (_penCol),hl
+  ld  hl,txtMenuR
+  cal _vputs
   jp  mainMenu
-bchangelives:
-  cal changelivesInit
-  dec a
-  jr  z,displives
-  jr  changedlives
-
-changelivesInit:
-  cal loadgamecar  ;c=(gameCar)
-;a=(hl)=(Gametype+1)=(wormbeglives)
-  ld  a,(Gametype) ;&&&
-  cp  3
-  ld  a,(hl)
-  ret nc           ;change lives
-  pop hl           ;restore stack
-  jr  displives
 
 ;--- handle menukeys ---
 
@@ -608,7 +967,7 @@ menuwaitkey:
   cal GET_KEY
   or  a
   jr  z,menuwaitkey
-  pop bc ;pop a as b
+  pop bc ;GET_KEY destr. b
   cp  K_UP
   cal z,menuup
   cp  K_DOWN
@@ -617,113 +976,117 @@ menuwaitkey:
   ret z
   cp  K_SECOND
   ret ;z=select
-menupos:
+
+menupos: ;highlight #b
+  ld  c,b ;psh b
   ld  a,b
-  add a,4
-  ld  h,0
+  add a,3
+  add a,a
+  add a,a
+  sub b
+  add a,a
+  add a,a
+  add a,a ;*24
+  ld  h,$FC/4
   ld  l,a
-  ld  (_curRow),hl
-  ret
-menuclr:
-  cal menupos
-  ld  a,' '
-  jp  _putc
+  add hl,hl
+  add hl,hl ;$FD20+item*96
+  ld  b,16*7
+menuinvloop:
+  ld  a,(hl)
+  cpl
+  ld  (hl),a
+  inc hl
+  dnz menuinvloop
+  ld  b,c ;pop b
+  ret ;a=-1
 menudown:
-  cal menuclr
+  cal menupos
   inc b
   jr  menuupdown
 menuup:
-  cal menuclr
+  cal menupos
   dec b
 menuupdown:
   ld  a,b
-  and %11 ;4=0;-1=3
-menudraw:
+  cp  6
+  jr  nz,menunewchk
+  xor a ;6=0
+menunewchk:
+  inc b
+  jr  nz,menunewok
+  ld  a,5 ;-1=5
+menunewok:
   ld  b,a
-  cal menupos
-  ld  a,'*'
-  jp  _putc ;a=K_STO
+  jr  menupos
 
 ;--- change name ---
-; of worm#(nrworms)
-;or #1 if Gametype<2
+; of worm#(curworm)
 
-changeworms:
-  cal _clrWindow
-  ld  hl,txtName
-  cal _puts ;"Enter name player "
-  ld  a,(Gametype)
-  cp  2
-  ld  a,1
-  jr  c,wormnrname
-nrworms =$+1
-  ld  a,1
-wormnrname:
-  add a,'0'
-  cal _putc
-  sub '0'
-
-  ld  d,a  ;1x
+getwormname: ;of (curworm)
+  ld  a,(curworm)
   add a,a  ;2x
   ld  e,a
   add a,a  ;4x
   add a,a  ;8x
   add a,a ;16x
   add a,e ;18x
-  add a,d ;19x
   ld  e,a
   ld  d,0 ;de=a
 
-  ld  ix,worm1name-19
+  ld  ix,worm1name-18
   add ix,de
-  ld  a,maxnamelength
-  cal entername
-  ld  (ix),0
-  jp  DisplayMenu
+  ret
 
-entername:
-  ld  h,1
-  ld  l,h ;)
-  ld  (_curRow),hl
+changeworms:
+  cal getwormname
+  psh ix
+  pop hl ;ld hl,ix
+  psh hl
+  ld  b,8
+emptyname:
+  ld  (hl),' '
+  inc hl
+  dnz emptyname
+  ld  a,maxnamelength
   ld  (namelength),a
 enternameloop:
+  ld  hl,$FF07 ;begin pos
+  ld  a,6 ;nr of lines
+  cal clroldcustom
+  ld  hl,$303E
+  ld  (_penCol),hl
+  pop hl
+  psh hl
+  ld  (ix),0
+  cal __vputs
+  ld  (ix),' '
   ld  a,'_'
-  cal _putc
-  ld  hl,_curCol
-  dec (hl)
+  cal __vputmap
 nokeypressed:
   halt
   cal GET_KEY
   or  a
   jr  z,nokeypressed
 
+  ld  hl,namelength
   cp  K_DEL
   jr  nz,continue
 backspace:
-  ld  hl,namelength
   ld  a,(hl)
   cp  maxnamelength
   jr  nc,nokeypressed
   inc (hl)
-
   dec ix
-  ld  a,' '
-  ld  (ix),a
-  cal _putc
-  ld  hl,_curCol
-  dec (hl)
-  dec (hl)
   jr  enternameloop
 continue:
   cp  K_ENTER
-  ret z
+  jr  z,nameentered
   cp  K_EXIT
-  ret z
-
-  ld  hl,namelength
-  dec (hl)
-  ret z
+  jr  z,nameentered
 
+  dec (hl) ;(namelength)
+  jr  z,nameentered
   ld  hl,chartable
   ld  e,a
   ld  d,0
@@ -731,14 +1094,11 @@ continue:
   ld  a,(hl)
   or  a
   jr  z,nokeypressed
-
   ld  (ix),a
-  cal _putc
   inc ix
   cal releasekeys
   jr  enternameloop
 
-
 chartable:
   .db 0,".<>!",0,0,0,0  ;down,L,R,up
   .db 0,"XTOJE0",0      ;enter..clear
@@ -748,8 +1108,30 @@ chartable:
   .db $D9,"-PKFA6'"     ;on..alpha
   .db "54321*",0,$D0    ;F5..more
 
+nameentered:
+  pop ix ;stringbegin
+  ld  (ix+8),0 ;end mark
+  jp  DisplayMenu
+
 ;--proc
 
+clrold:
+  ld  hl,$FD97 ;begin pos
+  ld  a,35 ;nr of lines
+clroldcustom:
+  ld  de,7 ;bytes to add
+clroldsettings:
+  ld  c,9 ;bytes to clear
+clroldsetsloop:
+  ld  (hl),d ;=0
+  inc hl
+  dec c
+  jr  nz,clroldsetsloop
+  add hl,de
+  dec a
+  jr  nz,clroldsettings
+  ret
+
 skiplevel: ;@hl - destr:ab - alter:hl
   inc hl
   inc hl
@@ -763,8 +1145,8 @@ skipsprite:
   ld  b,(hl) ;balls
   inc b
   inc b ;skip 6
-  ld  a,c
-  cp  _datasp
+  ld  a,(Gametype)
+  cp  gamesingle
   jr  z,skipworms
   inc b ;multiplayer lvl
   inc b
@@ -801,13 +1183,15 @@ skipobjects:
 
 loadgamecar:
 ;in:    (Gametype)
-;out:   Gametype+1=hl
+;out:   hl=dataTYPE
 ;build: c=(gameCar)=(hl-1)
 ;       a=(wormbeglives)=(hl)
 ;destr: acdehl
   ld  hl,datasingle
   ld  a,(Gametype)
   add a,a
+  add a,a
+  add a,a ;8 bytes per mode
   ld  e,a
   ld  d,0
   add hl,de
@@ -828,30 +1212,43 @@ LetsGetThisPartyOn:
   ld  (CheckExit),a ;set exit state
 
   cal loadgamecar
-  ld  l,a
-  ld  h,0             ;hl=a
-  cal _HLTIMES10      ;hl=10*(hl)
-  ld  (scorelimit),hl ;set limit
+  psh hl
+  ld  (wormbeglives),a
+  inc hl ;nrworms
+  ld  a,(hl)
+  ld  (nrworms),a
+  inc hl ;level
+  inc hl
+  ld  a,(hl)
+  ld  (customspeed),a
+  inc hl
+  ld  a,(hl)
+  ld  (growspeed),a
+  inc hl
+  ld  a,(hl)
+  ld  (turnleft),a
+  ld  (turnright),a ;more efficient
+  inc hl
+  ld  l,(hl)
+  ld  h,0
+  cal _HLTIMES10       ;hl=10*(hl)
+  ld  (scorelimit),hl
 
-  cal loadgamecar ;nc
-  ld  e,24+1 ;=de
+  pop hl ;loadgamecar
+  psh hl
+  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  e,a ;=de
   sbc hl,de ;datalevels
 
-  ld  a,c ;(gameCar)
-  and _datasingl
-  jr  z,notsingle
-  ld  a,1
-  ld  (nrworms),a
-notsingle:
-  ld  a,c
-  and _datascore
-  jr  nz,scorelimitset
-  dec a ;ld a,$FF ;=no_limit
-  ld  (scorelimit),a
-scorelimitset:
-
   cal _ldHLind ;ld hl,(hl)
-  ld  a,(curlevel)
+  pop de ;de=loadgamecar
+  inc de \ inc de
+  ld  a,(de) ;(curlevel)
   ld  (Level),a
   ld  d,a ;begin level
 skiplevelloop:
@@ -862,9 +1259,9 @@ skiplevelloop:
 levelsskipped:
 
   psh hl  ;1st level
-  ld  a,c
-  and _datalink
-  jr  z,GameOver
+  ld  a,(gameCar)
+  rra ;and _datalink
+  jr  nc,GameOver
 
 linkmatch:
   cal _clrWindow
@@ -873,28 +1270,27 @@ linkmatch:
   ld  hl,txtWaiting
   cal _puts
   cal Crecv
-;  ld  a,c
+  ld  a,c
   cp  wormVclient
   jr  z,client
   cp  wormVhost
-  jr  nz,linkiniterror
+  jr  z,host
+  pop hl ;error
+  jp  DisplayMenu ;return to menu
 
 host:
   ld  c,wormVclient
   cal Qsend
   ld  a,$18
   jr  multiplayer
-
-linkiniterror:
-  pop hl
-  jp  DisplayMenu
-
 client:
   ld  hl,txtReceive
   cal _puts
-
-  ld  a,$f6
+  ld  a,$E6
 multiplayer:
+;  cal linkok
+;  ld a,D0LD1L
+;  out (7),a
   ld  (SwapPos),a
   ld  a,2
   ld  (nrworms),a
@@ -904,7 +1300,6 @@ multiplayer:
 ;-----------------------------
 
 GameOver:
-  cal _clrLCD
   ld  hl,worm1set
   ld  de,worm1
   ld  a,4 ;4x (all worms)
@@ -912,11 +1307,12 @@ createwormsloop:
   ex  de,hl
   ld  bc,died
   add hl,bc
-  ld  (hl),0 ;died=0
+  ld  b,0
+  ld  (hl),b ;died=0
   inc hl
-  ld  (hl),0 ;score=0
+  ld  (hl),b ;score=0
   inc hl
-  ld  (hl),0 ;score+1=0
+  ld  (hl),b ;score+1=0
   inc hl
   ld  (hl),2 ;delay=2
   inc hl
@@ -929,17 +1325,18 @@ wormbeglives =$-1
   dec a      ;loop
   jr  nz,createwormsloop
 
-  pop hl ;begin of current level
-
 StartLevel:
+  cal _clrWindow
+  pop hl ;begin of current level
   ld  de,Left
   ld  a,(hl)
   inc a ;=255?
   jp  nz,nextlevel
 
   psh hl
+  ld  hl,Level
+  dec (hl) ;curlevel-- (not beyond last lvl)
   cal releasekeys
-  cal _clrWindow
   pop hl
 ;show end msg or smtn
   ld  bc,Exit
@@ -948,6 +1345,13 @@ StartLevel:
   jp  (hl) ;go there ("call")
 nextlevel:
   ldi
+  ld  a,0
+customspeed =$-1
+  inc a ;$FF=def
+  jr  z,defspeed
+  dec a
+  ld  (hl),a ;store new speed
+defspeed:
   ld  de,Speed
   ldi
   ld  de,peagrowth
@@ -999,51 +1403,63 @@ toobad_noballs:
 #endif
 
   ld  hl,worm1
-  ld  a,(gameCar)
-  cp  _datasp
+  ld  a,(Gametype)
+  cp  gamesingle
   ld  b,1
   jr  z,worminit
   ld  b,4
 worminit:
-  psh bc                        ; >> 1
+  psh bc ;>1
   ex  de,hl
-  ldi          ;d
+  ldi        ;d
   ld  a,SinCosTable/256
   ld  (de),a
   inc de
-  ldi          ;y
-  ldi          ;x
+  ldi        ;y
+  ldi        ;x
   ex  de,hl
-
   xor a
-  ld  (hl),a   ;y2
+  ld  (hl),a ;y2
   inc hl
-  ld  (hl),a   ;x2
+  ld  (hl),a ;x2
 
   ld  bc,(worm2-worm1)-5
   add hl,bc
-  pop bc                         ; << 0k
+  pop bc ;<0
   dnz worminit
 
+  inc a ;ld a,1
+  ld  (turn10),a
+  ld  a,2
+  ld  (flashtime),a
+
 ;-------- draw level ---------
 
   ld  a,(de)
   inc de
   sub 128
+  jr  nc,setfieldx
+  xor a ;fieldx<128
+setfieldx:
   ld  (FieldWidth),a
   ld  a,(de)
   inc de
+  ld  l,a
   sub 57
+  jr  nc,setfieldy
+  xor a ;fieldy<57
+setfieldy:
   ld  (FieldHeight),a
-  add a,57-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
+  add hl,hl ;32=scr.width
   ex  de,hl
 
   ld  hl,ScrBuffer
@@ -1114,7 +1530,7 @@ noctf:
 ;-----------------------------
 
   psh hl                        ; >> levelp new
-  cal showstats
+  cal forceshowstats
   ld  a,(gameCar)
   and _datafood
   jr  z,nofood
@@ -1158,27 +1574,44 @@ maskline:
 
   ld  a,0
 gameCar =$-1
-  and _datalink
-  jr  z,initfinished ;no link
-
+  rra ;and _datalink
+  jr  nc,initfinished ;no link
   xor a
-  ld  (worm2+input),a ;worm 2 via link
-  ld  (worm2+left),a
-  ld  (Speed),a ;max.speed
-SwapPos: ;$18 xx -> $F6 xx
-         ; jr xx ->  or xx
+SwapPos: ;$18 xx -> $E6 xx
+         ; jr xx -> and xx
+  jr  sethost
+setclient:
+  ld  (worm1+left),a ;worm 1...
+  ld  (worm3+left),a ;and worm 3 via link
+  cal Qrecv
+  ld  a,c
+  ld  (worm2+name+0),a
+  cal Qrecv
+  ld  a,c
+  ld  (worm2+name+1),a
+  cal Qrecv
+  ld  a,c
+  ld  (worm2+name+2),a
+  cal Qrecv
+  ld  a,c
+  ld  (worm2+name+3),a
+  cal Qrecv
+  ld  a,c
+  ld  (worm2+name+4),a
   jr  initfinished
-  inc a
-  ld  (worm2+left),a ;1
-  ld  hl,worm1
-  ld  de,worm2
-  ld  b,4 ;+heading +pos
-  cal _EXLP ;swap positions
-;&&& over link
-  ld  hl,worm1+name
-  ld  de,worm2+name
-  ld  b,maxnamelength
-  cal _EXLP ;swap positions
+sethost:
+  ld  (worm2+left),a ;worm 2+4..
+  ld  (worm4+left),a ;..over link
+  ld  c,'T'
+  cal Qsend
+  ld  c,'e'
+  cal Qsend
+  ld  c,'s'
+  cal Qsend
+  ld  c,'t'
+  cal Qsend
+  ld  c,0
+  cal Qsend
 initfinished:
 
   ld  b,startdelay
@@ -1192,8 +1625,13 @@ ReadyDelay:
 ;-----------------------------
 
 GameLoop:
-  ld  bc,(worm1+pos)
-  cal DisplayField
+  ld  bc,(worm1+pos) ;camera worm #1
+  ld  a,(worm1+left)
+  or  a ;if #1 not over link
+  jr  nz,showfield
+  ld  bc,(worm2+pos) ;otherwise view from #2
+showfield:
+  cal DisplayField ;display piece of level
 
   ld  a,1
 flashtime =$-1
@@ -1207,7 +1645,7 @@ screeninvertloop:
   ld  (hl),a
   inc hl
   xor a
-  cp  h
+  cp  h ;end at >$FFFF
   jr  nz,screeninvertloop
 noflash:
 
@@ -1221,13 +1659,50 @@ Delay:
   jr  nz,Delay
 NoDelay:
 
+  ld  (handledworm),a ;reset
+
+  ld  hl,turn
+  ld  a,(hl)
+  inc a ;-1
+  jr  z,nextturnok
+  dec (hl)
+  dec a ;0 (now <0)
+  jr  nz,nextturnok
+growspeed =$+1
+  ld  (hl),$FF
+nextturnok:
+
+  ld  a,(gameCar)
+  and _datatime
+  jr  z,nodispupdate
+  ld  hl,turn10
+  dec (hl)
+  jr  nz,nodispupdate ;just once every 10 turns
+  ld  (hl),10 ;reset counter
+  cal forceshowstats ;update score
+nodispupdate:
+
+drawctfpea1:
+  jr  drawctfpea2
+  ld  bc,drawctfpea1
+  ld  hl,(peaspos)
+  cal tryDrawPea
+drawctfpea2:
+  jr  noctfpeas2draw
+  ld  bc,drawctfpea2
+  ld  hl,(peaspos+2)
+  cal tryDrawPea
+noctfpeas2draw:
+
+
   ld  a,0
 nrballs =$-1
   or  a
   cal nz,handlethoseneatlittleballs
 
   ld  ix,worm1
-  ld  a,(nrworms)
+  ld  a,1
+nrworms =$-1
   ld  b,a
 handleworms:
   psh bc
@@ -1235,6 +1710,8 @@ handleworms:
   ld  bc,worm2-worm1
   add ix,bc
   pop bc
+  ld  hl,handledworm
+  inc (hl) ;1..nrworms
   dnz handleworms
 
 ;-----------------------------
@@ -1268,15 +1745,23 @@ WormDead:
   ld  (ix+delay),respawndelay
 
 thislevel =$+1
+  ld  hl,0
   ld  de,0
-  ld  a,(de)
-  inc de
+handledworm =$-2
+  add hl,de
+  add hl,de
+  add hl,de
+  ld  a,(hl)
+  inc hl
   ld  (ix+heading),a
-  ld  a,(de)
-  ld  (ix+pos),a
-  inc de
-  ld  a,(de)
-  ld  (ix+pos+1),a
+  ld  a,(hl)
+  ld  (ix+pos),a ;y
+  inc hl
+  ld  a,(hl)
+  ld  (ix+pos+1),a ;x
+  xor a
+  ld  (ix+pos2),a ;y2
+  ld  (ix+pos2+1),a ;x2
 
   inc (ix+died)
   dec (ix+lives)
@@ -1285,83 +1770,169 @@ thislevel =$+1
   cal DecScore
   pop af
   ret nz ;HandleWorm done
+  ld  a,(wormbeglives)
+  or  a ;0=no live limit
+  ret z ;don't end game
   ld  a,(gameCar)
-  and _datalivel
-  ret z
+  and _datatime
+  jr  z,anyworm ;quit at any worm's death
+  ld  a,(nrworms) ;livematch: all worms must've died
+  ld  b,a ;# of worms
+  ld  hl,worm1+lives-(worm2-worm1)
+  ld  de,worm2-worm1
+  xor a ;check for 0 lives
+checklives:
+  add hl,de ;next worm
+  cp  (hl) ;lives==0?
+  ret nz ;any >0: don't exit
+  dnz checklives
+anyworm:
   ld  a,$A7 ;exit@end of turn
   ld  (CheckExit),a ;set exit state
   ret ;finish turn
 #endif
 
 Exit:
+  cal releasekeys
   ld  sp,0 ;pop all
 SpSave = $-2
-  ld  a,D0HD1H
-  out (7),a
+  ld  a,D0LD1L
+  out (7),a    ;both wires low = game over signal
   cal _clrWindow
   ld  hl,txtGO
   cal _puts
+  ld  hl,$FC00
+  ld  b,16*8
+  cal menuinvloop ;invert
+  inc h ;$FD80
+  cal hr ;menuinvloop w/ b=16
+  ld  hl,$FCE0
+  cal hr
+; ld  l,$74
+; ld  b,8
+; cal menuinvloop
+  ld  hl,_curRow
+  inc (hl)
   ld  hl,txtGame
 CURtxtGame =$-2
   cal _puts
-  ld  de,0002
-  ld  (_curRow),de
+  ld  a,$0D ;$0D02
+  ld  (_curCol),a
   cal showLevel
-  ld  de,$0B03
+
+  ld  de,$1901
+  ld  (_penCol),de
+  ld  hl,txtName
+  cal _vputs ;Name
+  ld  a,$3D
+  ld  (_penCol),a
+  cal _vputs ;Died    Score
+  ld  de,$0004
   ld  (_curRow),de
-  ld  hl,txtDied
-  cal _puts
-  cal _puts ;txtScore
-  xor a
-  ld  (_curCol),a
+
+findwinner:
+  ld  hl,(worm1+score)
+  ld  (winnerscore),hl
+  ld  b,3 ;(nrworms)-1
+  ld  hl,worm2+score
+findwinnerloop:
+  psh hl
+  cal _ldHLind
+  ld  de,(winnerscore)
+  ld  a,h
+  cp  d
+  jr  c,nonewwinner ;h<d
+  jr  nz,newwinner  ;h>d
+  ld  a,e
+  cp  l
+  jr  nc,nonewwinner ;l<e
+newwinner:
+  ld  (winnerscore),hl
+nonewwinner:
+  pop hl
+  ld  de,worm2-worm1
+  add hl,de
+  dnz findwinnerloop
+
+  ld  a,(nrworms)
+  ld  b,a
+  cpl ;high value (>$FB)
+  ld  hl,worm1+died
+finddmwinner:
+  cp  (hl)
+  jr  c,nonewdmwinner
+  ld  a,(hl) ;less deaths
+nonewdmwinner:
+  ld  de,worm2-worm1
+  add hl,de
+  dnz finddmwinner
+  ld  (dmwinner),a
+
+;---display worms---
 
   ld  a,(nrworms)
   ld  b,a
   ld  hl,worm1+died
 displayWormStats:
   psh bc
-  psh hl
 
-  ld  bc,input-died
-  add hl,bc ;+input
+  psh hl
+  ld  bc,left-died
+  add hl,bc ;+left
   xor a
   cp  (hl)  ;input=0 = link
   jr  nz,NoLinkIndic
-  ld  b,7 ;{DOWN}
-  inc hl ;+left
-  cp  (hl)
-  jr  z,hostLinkIndic
-  dec b   ;{UP}
-hostLinkIndic:
-  ld  a,8
+  ld  a,9
   ld  (_curCol),a
-  ld  a,b
+  ld  a,$DC ;-O
   cal _putc
   xor a
   ld  (_curCol),a
-  dec hl
 NoLinkIndic:
-  inc hl
   inc hl
   inc hl ;+name
   cal _puts
-
   pop hl
+
   psh hl
   ld  a,13
   ld  (_curCol),a
   ld  a,(hl) ;worm+died
   cal showA
   pop hl
-  psh hl
 
-  ld  a,16
+  psh hl
+  ld  a,10
   ld  (_curCol),a
+  ld  a,(Gametype)
+  cp  gamedeathm
+  jr  nz,nodmwinner ;deathmatch?
+  ld  a,0 ;winner's deaths
+dmwinner =$-1
+  cp  (hl) ;equals this worm?
+  jr  nz,notwinner
+  jr  iswinner
+nodmwinner:
+  jr  c,notwinner ;no singleplayer winners
   inc hl ;worm+score
   cal _ldHLind ;ld hl,(hl)
-  cal showHL ;worm+score
-
+  ld  de,0
+winnerscore =$-2
+  cal _cphlde ;==highest score..
+  jr  nz,notwinner
+iswinner:
+  ld  a,'*'
+  cal _putc ;..then put *
+notwinner:
+  ld  a,16
+  ld  (_curCol),a
+  pop hl
+  psh hl
+  inc hl ;worm+score
+  cal _ldHLind
+  cal showHL
   pop hl
+
   ld  bc,worm2-worm1
   add hl,bc
   pop bc
@@ -1375,7 +1946,7 @@ checkhilevel:
   ld  a,(Level)
   cp  (hl)
   jr  c,hilevelcheckdone
-  ld  (hl),a    ;save local
+  ld  (hl),a ;save local
   ld  c,a
   ld  a,0
 hilvlposa =$-1
@@ -1386,41 +1957,50 @@ hilevelcheckdone:
 
   ld  a,(gameCar)
   and _datasingl
-
-  jr  z,hiscorecheckdone
+  jr  z,hiscorecheckdone ;no SP
 checkhiscore:
   cal loadhiscoreposinahl
-  cal _Get_Word_ahl ;de=old_hi
- psh de
- cal _RAM_PAGE_1 ;&&
- pop de
-  ld  hl,(worm1+score)
-
-  ld  a,h           ;New
-  cp  d             ;Old
-  jr  c,NotNewHigh  ;New<Old
-  jr  nz,newhigh    ;New>Old
-
-  ld  a,e           ;old
-  cp  l             ;new
-  jr  nc,NotNewHigh ;new<old
+  cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile)
+  xor a
+  ld  hl,highsave
+  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
 
-newhigh:            ;New>=Old
-  ex  de,hl
+  ld  de,(highsave)    ;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
+newhigh:            ;New>Old
+  ld  (highsave),hl ;store new hiscore
+  ld  de,highsave+2 ;to
+  ld  hl,worm1+name ;from
+  ld  bc,3 ;3 chars
+  ldir ;store new hiname
   cal loadhiscoreposinahl
-  cal _Set_Word_ahl ;de->(ahl)
- cal _RAM_PAGE_1
+  cal _SET_ABS_DEST_ADDR ;to ahl
+  xor a
+  ld hl,highsave
+  cal _SET_ABS_SRC_ADDR ;from local
+  ld  hl,5
+  cal _MM_LDIR_SET_SIZE ;save new
+  cal _RAM_PAGE_1
 
-NotNewHigh: ;de=current hiscore
-  ld  hl,$0807
-  ld  (_curRow),hl
+NotNewHigh:
+  ld  hl,$3149
+  ld  (_penCol),hl
   ld  hl,txthiscore
+  cal _vputs
+  ld  hl,$0C07
+  ld  (_curRow),hl
+  ld  hl,highsave+2
   cal _puts
-  ex  de,hl ;pop
+  ld  hl,(highsave)
   cal showHL
 hiscorecheckdone:
 
-  cal releasekeys
 waitkey:
   halt
   halt
@@ -1433,7 +2013,7 @@ waitkey:
   jr  nz,waitkey
 
 ;x123456789012345678901
-;1----- GAME OVER -----
+;>>>>>> GAME OVER <<<<<
 ;2Multiplayer
 ;3Level 01
 ;4           Died Score:
@@ -1443,6 +2023,7 @@ waitkey:
 ;8Snaky   @    00 04820
 
 ExitNoStats:
+  cal linkok
   ld  hl,_asapvar
   rst 20h ;_ABS_MOV10TOOP1
   rst 10h ;_FINDSYM
@@ -1456,8 +2037,7 @@ ExitNoStats:
   ld  hl,savestart
   cal _SET_ABS_SRC_ADDR
   ld  hl,saveend-savestart
-  cal _SET_MM_NUM_BYTES
-  cal _mm_ldir
+  cal _MM_LDIR_SET_SIZE
 
   cal releasekeys
   res 4,(iy+9)
@@ -1466,37 +2046,34 @@ ExitNoStats:
   jp  _clrWindow
 
 loadhiscoreposinahl:
-  ld  a,(Level)
-  ld  b,a
-
-  ld  h,0            ;hl=
-  ld  a,(nrlevels+1) ;# peaworm lvls
-  add a,a
-  ld  l,a
-
+  ld  hl,0 ;for peaworm and singleplayer
   ld  a,(Gametype)
-  dec a
-  ld  c,a
-  dec a              ;z=(Gametype)=2
-  jr  z,tronhi
-  ld  l,h            ;hl=0
-tronhi:
-
-  xor a              ;ahl=0(+x)
-  psh bc
+  or  a ;Singleplayer?
+  jr  z,hi__
+  dec a ;peaworm?
+  jr  z,hi_
+  ld  a,(nrlevels+1) ;skip peaworm slots if tron mode
+hi_:
+  ld  bc,(Level)
+  add a,c
+  ld  b,a ;levels to skip (including 1 for singleplayer)
+addlevelposition:
+  inc hl
+  inc hl ;add one word per level
+  inc hl
+  inc hl
+  inc hl ;plus 3 bytes for name
+  dnz addlevelposition
+hi__:
+  xor a ;ahl=0(+hl)
   ld  bc,defhiscrpos
 hiscrposhl =$-2
   add hl,bc
-  pop bc
-  adc a,0
-hiscrposa =$-1       ;ahl=saveloc
-
-  inc c
-  ret z              ;(Gametype)=0
-addlevelposition:
-  cal _AHL_PLUS_2_PG3
-  dnz addlevelposition
+hiscrposa =$+1
+  adc a,0 ;ahl=saveloc
   ret
+highsave:
+  .db 0,0,"WOR ",0
 
 ;-----------------------------
 ;----------- worm ------------
@@ -1546,7 +2123,6 @@ unnamedlabel:
 respawndue:
   ld  l,a
   cal inputcall
-  ld  (sendbyte),a
   ld  a,h ;previous
   cp  l   ;changed?
   ret z
@@ -1555,77 +2131,93 @@ respawndue:
 saverespawncounter:
   ld  (ix+delay),a
   jr  inputcall
-;  ld  a,(ix+input)
-;  or  a
-;  jr  z,inlink
-;  ret
 
-inkeys: ;use jp not call!
-  out (1),a ;nop\nop
-  in  a,(1)
+chkkey: ;key=a
+  dec a
   ld  b,a
-  and (ix+right)
-  jr  z,notright
+  srl b
+  srl b
+  srl b ;b=a/8
+  and 7 ;a=a\8
+  ld  c,a ;push keybit
+  ld  a,-1
+  out (1),a
+  inc b
+  ld  a,%01111111 ;default
+bitmask:
+  rlca ;rotate left
+  dnz bitmask ;a/8 times
+  out (1),a ;send bitmask
+  in  a,(1) ;input keys
+  ld  b,c ;pop keybit
+  inc b
+keybit:
+  rra
+  dnz keybit ;check match (cf set)
+  ret
+
+inkeys: ;use jp not call!
+  cal chkkey
+  jr  nc,notright
   ld  a,l
   add a,8
+turnright =$-1
   ld  l,a
 notright:
-  ld  a,b
-  and (ix+left)
-  ret z
+  ld  a,(ix+right)
+  cal chkkey
+  ret nc
   ld  a,l
   sub 8
+turnleft =$-1
   ld  l,a
   ret
-
 inputcall:
-  ld  a,(ix+input)
+  ld  a,(ix+left)
   or  a
-  jr  nz,inkeys
-
+  jr  z,inlink ;input by link
+  cal inkeys ;input by keys
+  ld  a,(gameCar)
+  rra ;and _datalink
+  ret nc ;no link
+  ld  c,l ;send our keys
+  jp  Qsend
 inlink:
-  ld  b,(ix+left)
-  dec b
-  jr  z,receivefirst
-  psh hl
-  ld  c,0
-sendbyte =$-1
-  cal Csend
-  cal Crecv
-  pop hl
-  ld  l,c
-  ret
-receivefirst:
-  psh hl
-  cal Crecv
-  pop hl
+  cal Qrecv ;Crecv
   ld  l,c
-  psh hl
-  ld  a,(sendbyte)
-  ld  c,a
-  cal Csend
-  pop hl
   ret
 
 ;------- handle worm ---------
 
 HandleWorm:
+  xor a
+  cp  (ix+lives)
+  jr  nz,alive
+  ld  a,(wormbeglives)
+  or  a
+  ret nz ;live limit
+alive:
   ld  a,(ix+delay)
   dec a
   jp  nz,respawncheck
 
-  ld  a,(Gametype)
-  cp  gametron
-  jr  nz,notron
+  xor a
+  cp  0
+turn =$-1
+  jr  nz,nogrow
+  inc (ix+grow)
+nogrow:
+
+  ld  a,(gameCar)
+  and _datatime
+  jr  z,notimescore
   ld  de,1
   cal IncScore
-notron:
+notimescore:
 
   ld  l,(ix+heading)
   cal inputcall
 donediddelydone:
-  ld  a,l
-  ld  (sendbyte),a
   ld  (ix+heading),l
   ld  h,(ix+heading+1)
 
@@ -1704,11 +2296,13 @@ GotFour:
 Hitworm:
   ld  a,(gameCar)
   ld  h,a
+#ifdef optdie
   and _datadie
   cal z,checkhitotherworm
   ld  a,h
+#endif
   and _datamultpeas ;&&bit
-  jr  nz,multiple_peas
+  jr  nz,chkctfpeas
   ld  a,h
   and _datafood
   jp  z,WormDead ;no food
@@ -1751,11 +2345,10 @@ peagrowth =$-1
   cal removeworm
   pop hl                         ; << call
   pop hl                         ; << call
-  pop hl                         ; << levelp new
   ld  (ix+delay),2
   jp  StartLevel
 
-chkpeahit: ;hl=peapos
+chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
   ld  a,(sprsize)
   inc a
   ld  d,a
@@ -1766,74 +2359,59 @@ chkpeahit: ;hl=peapos
   ret nc ;nc=no pea
   ld  a,c
   sub l
-  inc a
-  cp  d
-  ret ;c=pea
-
-flagcaptured:
-  psh hl
-  ld  de,30
-  cal IncScore
-  pop hl
-sillylabel:
-  cal WormDead
-DrawAllPeas:
-  ld  hl,(peaspos)
-  cal DrawPea
-  ld  hl,(peaspos+2)
-  jp  DrawPea
+  inc a
+  cp  d
+  ret ;c=pea
 
-multiple_peas:
+chkctfpeas:
   ld  hl,(peaspos) ;1st pea
-  psh hl
   ld  a,(ix+reserv)
   ld  e,a ;push a
-  and %01
-  jr  nz,sel_ownpea
-  ld  hl,(peaspos+2) ;2nd pea
-sel_ownpea:
-  cal chkpeahit
-  pop hl ;(peapos) 1st pea
-  jp  c,stopworm ;own pea hit
-
-  ld  a,e ;peek a (that x86 asm for pop\push ;)
-  and %01
+  and %01 ;ourpea (0|1)
   jr  z,sel_otherpea
-  ld  hl,(peaspos+2) ;2nd pea
+  ld  hl,(peaspos+2) ;2nd pea ;&&&ex de,hl?
 sel_otherpea:
   cal chkpeahit
-  jp  c,hitflag
-
-;no peas hit
-  ld  a,e
-  cal flagtoken
-  jp  z,WormDead
-  ld  b,a ;%10
-  srl b   ;%01
-  add a,b ;%11
+  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
-  cal DrawPea ;restore own flag
-  jr  sillylabel ;inv both\die
+  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),$E6 ;and nn
+  ret
 
 hitflag: ;correct pea hit
   ld  a,e ;pop a
-  xor %01 ;0=1;1=0
+  xor %11 ;invert flag taken + ownflag
   ld  (ix+reserv),a
-  cal flagtoken
+  and %10 ;just returned?
   psh af ;safe z-flag
   cal DrawPea ;remove
   pop af
-  jr  z,flagcaptured
-  jr  stopworm
+  jr  nz,Drawworm ;flag taken, continue game
+  psh hl
+  ld  de,20 ;flag captured+returned
+  cal IncScore
+  pop hl
+  ld  a,$E6 ;and nn
+  ld  (drawctfpea1),a ;redraw..
+  ld  (drawctfpea2),a ;..both flags
+  jr  Drawworm
 
-flagtoken:
-  and %01 ;current
-  add a,a ;<< for cp
-  ld  b,a ;in b
-  ld  a,e
-  and %10 ;own
-  cp  b   ;same?
-  ret ;Z=yes: no flag taken
+DrawAllPeas:
+  ld  hl,(peaspos)
+  cal DrawPea
+  ld  hl,(peaspos+2)
+  jp  DrawPea
 
 ;-----------------------------
 
@@ -1878,6 +2456,7 @@ nolap:
   ld  (ix+reserv),a
   ret
 
+#ifdef optdie
 checkhitotherworm:
  .db  $dd,$7d ;ld a,lx
   cp  worm2&255
@@ -1897,6 +2476,7 @@ chkworm:
  pop ix
   ret z ;not hit
   pop bc ;call
+#endif
 stopworm:
   ld  bc,0
 previouspos =$-2
@@ -1914,14 +2494,13 @@ Drawworm:
   ld  b,(ix+pos+1)
 
   ld  a,(Gametype)
-  ld  d,a
   cp  gamerace
   cal z,checkhitlapline
 
   cal set4pixels
   dec c
-  ld  a,d
-  cp  gametron
+  ld  a,(growspeed)
+  or  a ;0=tron
   ret z ;keep tail in "Tron"
 
   ld  l,(ix+head)
@@ -2093,18 +2672,7 @@ Seed =$+1
   add a,2
   ret
 
-NewPea:
-  ld  a,(FieldWidth)
-  add a,127-4
-  cal randompos
-  ld  h,a
-  ld  a,(FieldHeight)
-  add a,56-4
-  cal randompos
-  ld  l,a
-  ld  (PeaY),hl
-
-CheckPea:
+CheckPea: ;@hl; destr:abcde
   ld  c,l
   ld  a,(sprsize)
   ld  e,a
@@ -2117,21 +2685,80 @@ chkloopx:
   cal FindPixel
   and (hl)
   pop hl
-  jr  nz,NewPea ;pixel found
+  ret nz ;nz=pixel found
   inc b
   dec d
   jr  nz,chkloopx
   inc c
   dec e
   jr  nz,chkloopy
-;all ok; empty space
+  ret ;z=empty space
+
+tryDrawPea: ;hl=peapos;bc=dopea
+  psh bc
+  cal CheckPea
+  pop bc
+  ret nz ;unsuccesful
+  ld  a,$18 ;jr
+  ld  (bc),a
+  jr  DrawPea
 
+NewPea:
+  ld  a,(FieldWidth)
+  add a,127-4
+  cal randompos
+  ld  h,a
+  ld  a,(FieldHeight)
+  add a,56-4
+  cal randompos
+  ld  l,a
+  ld  (PeaY),hl
+  cal CheckPea
+  jr  nz,NewPea
 DrawPea: ;hl=(PeaY)
   ld  b,h
   ld  c,l
   ld  de,0
 spritepos =$-2
-  jp  PutSprite ;||-ed
+; jp PutSprite
+
+PutSprite:  ;||@(b,c)
+  ;by SHIAR  only ix saved
+  cal FindPixel
+  ld  (beginbit),a
+  ld  a,0
+sprsize =$-1
+  ld  b,a ;rows
+sprloopy:
+  psh bc ;rows
+  psh hl
+  ld  a,(de)
+  ld  c,a
+  inc de
+  ld  a,(sprsize)
+  ld  b,a ;width
+beginbit =$+1
+  ld  a,1
+sprloopx:
+  sla c ;draw?
+  jr  nc,sprnodraw
+  psh af
+  xor (hl)
+  ld  (hl),a
+  pop af
+sprnodraw:
+  rrca ;next bit
+  jp  nc,nextbitok
+  inc hl ;next byte
+nextbitok:
+  dnz sprloopx
+
+  pop hl
+  ld  bc,32 ;next line
+  add hl,bc
+  pop bc
+  dnz sprloopy
+  ret
 
 ;----------- score -----------
 
@@ -2167,13 +2794,17 @@ scorecommon:
   ld  (ix+score),l
   ld  de,0
 scorelimit =$-2
-  inc e
-  jr  z,showstats ;de=$FF??=no limit
-  dec e
+  ld  a,d
+  or  e
+  jr  z,showstats ;de=0=no limit
   cal _cphlde
   jp  nc,Exit
 
 showstats:
+  ld  a,(gameCar)
+  and _datatime
+  ret nz ;no disp for timematches
+forceshowstats:
   psh ix
   ld  h,0
   ld  l,h
@@ -2182,36 +2813,52 @@ showstats:
   ld  b,a
   ld  ix,worm1
   ld  a,(gameCar)
-  and _datanextl
+  and _datasingl
   jr  nz,showstatsS
 showstatloop:
   psh bc
+#ifdef longnames
+  ld  b,3
+  psh ix
+shownameloop: ;1st 3 chars
+  ld  a,(ix+name)
+  or  a
+  jr  z,nameshown
+  cal __vputmap
+  inc ix
+  dnz shownameloop
+nameshown:
+  ld  a,':'
+  cal _vputmap
+  pop ix
+#else
+  ld  a,(ix+name)
+  cal __vputmap
+  ld  a,':'
+  cal __vputmap
+#endif
   cal showstat
   ld  de,worm2-worm1
-  add ix,de
+  add ix,de ;next
   ld  hl,_penCol
   ld  a,(hl)
-  add a,10
+  add a,4 ;div
   ld  (hl),a
   pop bc
   dnz showstatloop
   pop ix
   ret
 
-showstat:
-  ld  a,(gameCar)
-  and _datascore
+showstat: ;(multiplayer)
+  ld  a,(Gametype)
+  cp  gamedeathm
   jr  z,showlives
 showscore:
   ld  h,(ix+score+1)
   ld  l,(ix+score)
   cal _D_HL_DECI
-  jr __vputs
+  jr  __vputs
 showlives:
-  ld  a,(Gametype)
-  cp  gametron
-  jr  z,showscore
-
   ld  a,(ix+lives)
   add a,'0'
 __vputmap:
@@ -2220,7 +2867,7 @@ __vputmap:
   pop ix
   ret
 
-showstatsS:
+showstatsS: ;(singleplayer)
   ld  hl,txtLevel
   cal __vputs
   ld  a,0
@@ -2254,16 +2901,7 @@ showleft:
   ld  (_penCol),a
   ld  a,0
 Left =$-1
-  ld  l,a
-  ld  h,0
-  cal _divHLby10
-  psh af
-  ld  a,l
-  add a,'0'
-  cal __vputmap
-  pop af
-  add a,'0'
-  cal __vputmap
+  cal cshowA
 
   ld  hl,txtLeft
 __vputs:
@@ -2288,6 +2926,23 @@ showA:
   add a,'0'
   jp  _putc
 
+cshowA:
+  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
@@ -2585,47 +3240,6 @@ FP_Bit =$+1
   pop de
   ret
 
-;--- sprite ---
-
-PutSprite:  ;||@(b,c)
-  ;by SHIAR  only ix saved
-  cal FindPixel
-putspr:
-  ld  (beginbit),a
-  ld  a,0
-sprsize =$-1
-  ld  b,a ;rows
-sprloopy:
-  psh bc ;rows
-  psh hl
-  ld  a,(de)
-  ld  c,a
-  inc de
-  ld  a,(sprsize)
-  ld  b,a ;width
-beginbit =$+1
-  ld  a,1
-sprloopx:
-  sla c ;draw?
-  jr  nc,sprnodraw
-  psh af
-  xor (hl)
-  ld  (hl),a
-  pop af
-sprnodraw:
-  rrca ;next bit
-  jp  nc,nextbitok
-  inc hl ;next byte
-nextbitok:
-  dnz sprloopx
-
-  pop hl
-  ld  bc,32 ;next line
-  add hl,bc
-  pop bc
-  dnz sprloopy
-  ret
-
 ;--- objects ---
 
 drawstuff:
@@ -2643,20 +3257,59 @@ drawstuff:
   psh hl
   ld  l,(hl)
   ld  h,b
+  cal drawsmtn
+  pop hl
+  inc hl
+  jr  drawstuff
 
+drawsmtn:
   dec a ;1 = line
-  cal z,drawline
+  jp  z,drawline
   dec a ;2 = fatline
-  cal z,drawfatline
+  jp  z,drawfatline
   dec a ;3 = box
-  cal z,drawbox
-
-  pop hl
-  inc hl
-  jr  drawstuff
+  jp  z,drawbox
+  dec a ;4 = circle
+  jp  z,drawcircle
+  dec a ;5 = hline
+#ifdef hlines
+  jp  z,drawhline
+#else
+  jp  z,drawline
+#endif
 
 drawbox: ;(d,e)-(h,l)
   ld  b,l ;Delta-y
+#ifdef hlines
+boxloop:
+  cal drawhline
+  inc e
+  dnz boxloop
+  ret
+drawhline: ;(d,e)-(h,e)
+  psh bc
+  ld  b,d
+  ld  c,e
+  psh hl
+  cal FindPixel
+  ld  c,a ;starting mask
+  ld  a,h
+  sub b
+  ld  b,a
+  inc b ;1+x2-x1
+hlineloop:
+  ld  a,(hl)
+  or  c
+  ld  (hl),a
+  rrc c ;mask >>
+  jr  nc,hlinenext
+  inc hl ;next byte
+hlinenext:
+  dnz hlineloop
+  pop hl
+  pop bc
+  ret
+#else
   ld  l,e
 boxloop:
   cal drawline
@@ -2664,6 +3317,7 @@ boxloop:
   inc e
   dnz boxloop
   ret
+#endif
 
 drawfatline:
   cal drawline
@@ -2680,8 +3334,8 @@ drawfatline:
 ;LINE (d,e)-(h,l)
 ;destroyes a
 
-drawline:
-  psh bc
+drawline: ;(d,e)-(h,l)
+  psh bc  ;destr: a
   psh hl
   psh de
   ld  a,d
@@ -2781,53 +3435,123 @@ line4sm:
   dnz LineLoopSteep
   jr  DoneLine
 
+drawcircle: ;(d,e),h   ;de=x,y; h=z
+  ld  c,h              ;c=yy=z
+  ld  a,h
+  neg
+  ld  l,a              ;l=-z
+  xor a
+  ld  b,a              ;b=xx=0
+  dec a                ;-$00**
+  ld  h,a              ;hl=zz=-z
+circloop:
+  psh de               ;x,y
+  ex  (sp),hl          ;push zz \ pop x,y
+  cal circledraw       ;(x-xx,y+yy)-(x+xx,y+yy)
+                       ;(x-xx,y-yy)-(x+xx,y-yy)
+  cal circledraw       ;(x-yy,y+xx)-(x+yy,y+xx)
+                       ;(x-yy,y-xx)-(x+yy,y-xx)
+
+  ex  (sp),hl          ;push x,y \ pop zz
+  xor a
+  ld  d,a              ;d=0
+  dec a                ;-256<h<0 = $FF**
+  cp  h                ;h<0?
+  jr  z,circlenext     ;jump if zz<0
+
+  ld  a,c              ;yy
+  dec a                ;89<a<128
+  add a,a              ;a=2yy-2 ;nc
+  ld  e,a              ;de=a
+  sbc hl,de            ;zz=zz-2yy+2
+  dec c                ;yy--
+circlenext:
+  ld  a,b              ;xx
+  inc a                ;0<a<92
+  add a,a              ;2xx+2
+  inc a
+  ld  e,a              ;de=a
+  add hl,de            ;zz=zz+2xx+3
+
+  pop de               ;x,y
+  ld  a,b
+  cp  c
+  ret nc               ;xx>=yy
+  inc b                ;xx++
+  jr  circloop
+
+circledraw:            ;destr:de
+  psh hl
+  ld  a,h              ;hl=x,y
+  sub b                ;bc=xx,yy
+  ld  d,a              ;d=x-xx
+  add hl,bc            ;h=x+xx; l=y+yy
+  ld  e,l              ;e=y+yy
+  cal drawline         ;(h-b,l+c)-(h+b,l+c)
+  ld  a,l
+  sub c                ;a=y again
+  sub c
+  ld  l,a              ;l=y-yy
+  ld  e,l              ;e=l=y-yy
+  cal drawline         ;(h-b,l-c)-(h+b,l-c)
+  ld  a,b              ;swap xx and yy
+  ld  b,c
+  ld  c,a              ;ex b,c
+  pop hl
+  ret
+
+
 ;-----------------------------
 ;----------- link ------------
 ;-----------------------------
 
-timeout = $800
+linkok:
+  ld  a,D0HD1H
+  out (7),a    ;raise both wires = link ok
+  ret
+
+timeout = $8000
+lossout = 20
 
-checklink:
-  dec de
+checklink:             ;load wires in A and check for timeout
+  dec de               ;decrease timer
   ld  a,d
   or  e
-  jr  z,linkerror
-
-  ld  a,$BF
-  out (1),a
-  in  a,(1)
-  bit 6,a
-  jp  z,Exit
-
+  jr  nz,linkfine      ;ok if de>0
+;de==0 = timeout
+  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
+linkfine:
   in  a,(7)
   and %11
   ret
 
-linkerror:
-  scf
-  ld  a,%11
-  pop hl
-  ret
-
 ;--------------
 ;---- SEND ----
 ;--------------
 
-Csend:         ;--- send 8 bits in A --- destr:abcdehl ---
-  ld  c,a
-Csendloop:
+Csend:
+  ld  b,32
+csendwait:
+  nop
+  dnz csendwait
   cal Qsend
-  ret nc               ;NC = all ok
-  ld  a,D0HD1H
-  out (7),a            ;both high
-  jr  Csendloop        ;CF = error
+  jr  c,Csend
+  ret
 
-Qsend:         ;--- try to send 8 bits in C; CF=error --- destr:abcdehl ---
-  ld  de,timeout
-  cal checklink
-  cp  %11              ;are they?
-  scf
-  ret nz               ;nope, wait
+Qsend:         ;try to send 8 bits in C; CF=error --- destr:abcde
+  nop \ nop
+  in  a,(7)
+  and %11              ;both wires low = exit signal
+  jr  z,linkerr        ;error otherwise
   ld  b,8              ;bits to send
 sendloop:
   ld  de,timeout
@@ -2846,9 +3570,10 @@ sendfinish:
   cal checklink
   cp  %11              ;both raised (by other calc)
   jr  nz,sendfinish
-  nop \ nop
+; nop \ nop
   dnz sendloop         ;repeat for all bits
   xor a                        ;nc...
+  ld (linklosses),a    ;reset number of losses
   ret                  ;=ok
 
 ;--------------
@@ -2858,17 +3583,12 @@ sendfinish:
 Crecv:         ;--- receive 8 bits into A/C --- destr:abcdehl ---
   cal Qrecv
   ret nc               ;return if all went ok
-  ld  a,D0HD1H
-  out (7),a            ;raise both on error
   jr  Crecv            ;and try again
 
-Qrecv:         ;--- receive 8 bits into A/C; CF=error --- destr:abcdehl ---
-  ld  de,timeout
-  cal checklink
-  jp  z,Exit           ;both low = error, quit
-  cp  %11
-  scf
-  ret z                        ;both high = nothing yet, wait
+Qrecv:         ;--- receive 8 bits into A/C; CF=error --- destr:abcde ---
+  in  a,(7)
+  and %11
+  jr  z,linkerr        ;both low = error, quit
   ld  b,8              ;bits to receive
 recvloop:
   ld  de,timeout
@@ -2891,19 +3611,19 @@ recvwaitack:
 recvfinish:
   dnz recvloop         ;repeat for all bits
   xor a                        ;nc=no error
-  ld  a,c              ;result in a
+  ld (linklosses),a    ;reset number of losses
   ret
 
+
 ;-----------------------------
 ;---------- levels -----------
 ;-----------------------------
 
 LevelDef:
-  .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
-  .db 0,2,63        ;start d, y, x
-  .db 128,57        ;field width (128-255), height (57-255)
-  .db 0             ;no additional lines, boxes
-
+  .db 5,4,15,15,0,0    ;peas,speed,growth,begin_size,sprite,balls
+  .db 0,2,63           ;start d, y, x
+  .db 128,57           ;field width (128-255), height (57-255)
+  .db 0                ;no additional lines, boxes
   .db 255
    ret
 
@@ -2919,50 +3639,90 @@ LevelDefM:
   .db 128,57
   .db 0
 
-LevelDefT:
+  .db 8,5,18,12,0,0
+  .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
+  .db 128,57
+ .db 4,40,26,20,0
+ .db 4,90,40,11,0,0
+
+LevelDefT: ;tron=no delay
+  .db 8,4,18,12,5
+  .db %1110000,%10001000,%10001000,%10001000,%1110000,0
+  .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
+  .db 128,57
+  .db 0
+
+LevelDefC: ;ctf
   .db 8,4,18,12,5
   .db %1110000,%10001000,%10001000,%10001000,%1110000,0
   .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
   .db 128,57
+  .db 10,10,50,50
   .db 0
 
 ;-----------------------------
 ;---------- data -------------
 ;-----------------------------
 
+wdPicture = 16
 wtPicture:
-.db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
-.db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
-.db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
-.db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000
-.db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000
-.db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000
-.db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000
-.db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100
-.db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
-.db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
-.db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100
-.db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001100
-.db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00001100
-.db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00011100
-.db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00011000
-.db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00011000
-
-txtMenu:    .db "by Shiar",0
-            .db "Level 00",0      ;4th menu item
-            .db "Limit 00 ",0     ;3rd
-            .db "Worms 0",0       ;2nd
-txtGame:    .db "Singleplayer",0  ;0 (1st)
-txtGame2:   .db "Peaworm     ",0  ;1 (next 1st)
-            .db "Tron      ",0    ;2
-            .db "Deathmatch",0    ;3
-            .db "Foodmatch ",0    ;4
-            .db "LinkMatch",0     ;5
-            .db "Race     ",0     ;6
-            .db "CTF         ",0  ;7
-;            .db "Domination",0    ;8
-txtLevsel:  .db $CF," Select levels: ",5,0
-txtName:    .db "Enter name player ",0
+.db %00000000,%00000000,%00000111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00000000,%00000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00001111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01111000,%00000000,%00000000,%00000110,%01111011,%00100000
+.db %00000000,%00000000,%00011100,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00011100,%00001110,%00000000,%00001001,%00010011,%01000000
+.db %00000000,%00000000,%00011000,%00011111,%00000000,%01111111,%11000000,%00111100,%00011110,%01111000,%00001100,%00011111,%00000000,%10100111,%00110000,%10000000
+.db %00000000,%00000000,%00111000,%00111111,%10000000,%11111111,%11100000,%11111110,%00111111,%11111100,%00001100,%00111011,%00000000,%10100001,%00001001,%01100000
+.db %00000000,%00000000,%00110000,%01110001,%11000001,%11000000,%01110001,%11100110,%01110011,%11001110,%00001100,%00110001,%10000000,%01001110,%01110010,%01100000
+.db %00000000,%00000000,%00110000,%01100000,%11000001,%10000000,%00111001,%10000000,%01100111,%11100110,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00110000,%01100000,%11000001,%10110000,%00011011,%10000000,%11101110,%01110111,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00110000,%01110001,%11000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000111,%11100001,%10000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00110000,%00110001,%10000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000011,%11000011,%10000000,%00000000,%00000000,%00000000
+.db %00000000,%00000000,%00111000,%00111011,%10000011,%10110000,%00011011,%00000000,%11001110,%01110011,%00000000,%00000011,%00110101,%01001001,%10000000,%00000000
+.db %00000000,%00000000,%00011000,%00011111,%00000011,%00110000,%00011011,%00000000,%11000111,%11100011,%10000000,%00000011,%01000101,%00010101,%01000011,%01100011
+.db %00000000,%00000000,%00011100,%00001110,%00000111,%00111000,%00111011,%10000000,%11000011,%11000001,%10000000,%00000111,%01100101,%01010101,%01000101,%01010100
+.db %00000000,%00000000,%00001110,%00111111,%10001110,%00011100,%01110001,%10000000,%11100000,%00000001,%11100000,%00001110,%00110111,%01011101,%10010101,%01100101
+.db %00000000,%00000000,%00000111,%11111011,%11111100,%00001111,%11100001,%11000000,%01100000,%00000000,%11111111,%11111100,%00010101,%01010101,%01000101,%01010101
+.db %00000000,%00000000,%00000011,%11100000,%11111000,%00000111,%11000000,%11000000,%01100000,%00000000,%00111111,%11111000,%01100101,%01010101,%01000110,%01010011
+
+txtMenu:  .db "Mode",0  ;1st menu item
+         .db "Level",0 ;2nd
+         .db "Link",0  ;...
+         .db "Worms",0
+         .db "worm #",0
+         .db 0
+posMenu:  .dw $2418,$231E,$2824,$1F2A,$1730,$1936
+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: .dw $2618,$251E,$2524,$222A,$1A30,$1C36
+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
+txtLevsel:  .db $CF," Select levels ",5,0
 txtWaiting: .db "Waiting...",0
 txtReceive: .db "Receiving..." ;,0
 
@@ -2978,69 +3738,78 @@ TrigPrecalc:
 .db 127
 
 txtLevel:  .db "Level ",0
-txtWorms:  .db "Worms: 0",0 ;follows txtLevel
-txtDied:   .db "Died ",0
-txtScore:  .db "Score",0    ;follows txtDied
-txtLeft:   .db " left",0    ;follows txtScore
+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
 txtReady:  .db "Prepare!",0
 txtposReady = 7
-txtGO:     .db "----- GAME OVER -----",0
-
-_datalink  = %00000001 ;linkplay
-_datalivel = %00000010 ;lives=0 limit
-_datafoodl = %00000100 ;left=0 limit
-_datanextl = %00001000 ;next level if left=0
-_datasingl = %00001000 ;singleplayer=1
-                       ;1=hiscore+keep_length
-_datafood  = %00010000 ;food present
-_datadie   = %01000000 ;worm dies on impact
-_datascore = %10000000 ;score>=100 limit
-_datamultpeas = %00100000
-_datasp    = %01011110
+txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
 
 datalevels: .dw LevelDef, LevelDefM
             .dw LevelDefT,LevelDefM
             .dw LevelDefM,LevelDefM
-            .dw LevelDefM,LevelDefM
-nrlevels:   .db 1,2,2,2,2,2,2,1     ;=defaults
-
-savestart:
-
-gamesingle   =  0
-datasingle: .db %01011110,3 ;3 lives (<must b unique)
+            .dw LevelDefM,LevelDefC
+nrlevels:   .db 1,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 %01011010,1 ;1 "
+datapeas:   .db  %1100100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
 gametron     =  2
-datatron:   .db %01000010,1
-gamedeathm   =  3
-datadeathm: .db %01000010,3
+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 %11010000,10 ;10 score limit (=100)
-gamelinkm    =  5
-datalinkm:  .db %01000011,3
-gamerace     =  6
-datarace:   .db %10000000,10
-gamectf      =  7
-datactf:    .db %11100000,9
-;gamedomin    =  8
-;datadomin:  .db %01100000,3 ;==(8 modes)
+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, 9 ;CTF (90 score)
 
 worm1set:  .dw worm1p,worm1p
-           .db %11110111,%00,%01111110,%10,%100 ;< >
-worm1name: .db "worm #01",0
+           .db %11110111,%00,-01,K_RIGHT,K_LEFT
+worm1name: .db "WORMY   ",0
 worm2set:  .dw worm2p,worm2p
-           .db %11111011,%11,%00111111,%10000,%1000 ;f1 f2
-worm2name: .db "worm #02",0
+           .db %11111011,%01,-01,K_F2,K_F1
+worm2name: .db "VIPER   ",0
 worm3set:  .dw worm3p,worm3p
-           .db %11111011,0,%01011111,%10,%100 ;sto ,
-worm3name: .db "worm #03",0
+           .db %11111011,%00,-01,K_COMMA,K_STO
+worm3name: .db "NIBBLER ",0
 worm4set:  .dw worm4p,worm4p
-           .db %11111011,0,%01111101,%10,%1 ;enter +
-worm4name: .db "worm #04",0
+           .db %11111011,%01,-01,K_PLUS,K_ENTER
+worm4name: .db "JIM     ",0
 
 defhiscrpos:
-  .dw 0,0,0,0,0
+  .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:
 
@@ -3057,9 +3826,7 @@ lives    = 12
 head     = 13  ;4B (head=tail)
 tail     = 15  ;also@next level
 storepos = 17
-reserv   = 18  ;loop
- ;race:lap
- ;ctf:pea
+reserv   = 18  ;loop (race:lap|ctf:pea)
 input    = 19
 left     = 20
 right    = 21
@@ -3082,13 +3849,13 @@ maxnamelength = 8+1
 .db "   shiar0@hotmail.com",0
 
 defspritesz = 4
-defspriteimg: .db %01100000
-              .db %11110000
-              .db %11110000
-              .db %01100000
+defspriteimg:  .db %01100000
+               .db %11110000
+               .db %11110000
+               .db %01100000
 
 deflevels:
-  .db 15,"Internal Levels"
+  .db "Internal Levels" ;,0
 
   .db 0,deflevels/256,deflevels&255
 templevels:
@@ -3099,4 +3866,4 @@ templevels:
 
   .end
 
-.end
+.end
\ No newline at end of file