track ti86 includes; rename to .z80
[wormy.git] / worm.z80
diff --git a/worm.z80 b/worm.z80
new file mode 100644 (file)
index 0000000..d8f61e0
--- /dev/null
+++ b/worm.z80
@@ -0,0 +1,2352 @@
+; Title                      : Worm
+; Version                    : 0.92
+; Release Date               : soon (I hope)
+; Filename                   : worm.86p (3404)
+; Author(s)                  : Shiar
+; Email Address              : shiar@mailroom.com
+; ICQ UIN                    : #43840958
+; Web Page                   : www.games3.net/shiar
+; Description                : ruling multiplayer game for 86 (most like Nibbles)
+; Where to get this game     : games3.net/shiar (home of Worm)
+; Other games by author(s)   : Shiar: Nemesis beta
+; Additional Credits to      : Matthew Shepcar (wrote original Peaworm, end'98)
+;                              Jonah Cohen (wrote some parts of worm)
+
+;-----------------------------
+;----------- TO-DO -----------
+;-----------------------------
+
+;       Shiar 3.III.00
+
+;Feel like doing something? (name indicates who's working on it)
+;  * linkplay
+;  * singleplay ending
+;  * titlescreen
+;  * make linkplay available for all gametypes (not just deathmatch)
+;  * two worms collide with heads -> both should die
+;  * game types:
+;1)  * ctf: take enemy flag (right-bottom) and return to your flag (left-top)
+;1)  * domination?: take control points by running over them and hold them
+;1)* sprites for picks instead of blocks
+
+;1) Working on a new pickup-system allowing more than one "food" and different pickup-handling
+
+#include "TI86.inc"
+
+;-----------------------------
+;------- program start -------
+;-----------------------------
+
+.org _asm_exec_ram
+start:
+  nop
+  jp Start
+  .dw 1
+  .dw WormMsg
+  .dw WormIcon
+
+WormIcon:
+  .db 9,2
+  .db %10010111,%01101111
+  .db %10110101,%01001011
+  .db %11110111,%01001001
+  .db %00000011,%10000000
+  .db %00000001,%11100000
+  .db %00111000,%11111000
+  .db %01111110,%00111111
+  .db %11101111,%00001111
+  .db %11000011,%10000000
+
+Start:
+  ld  (SpSave),sp
+  call _runIndicOff
+  call _flushAllMenus
+  call _clrLCD
+  res 2,(iy+13) ;appAutoScroll
+
+  ld  a,r
+  ld  (Seed),a
+
+;-----------------------------
+;----- build trig tables -----
+;-----------------------------
+
+  ld  hl,TrigPrecalc
+  ld  de,SinCosTable
+  push de                        ; >> 1
+  ld  bc,65
+  ldir
+  dec hl
+  ld  b,63
+MirrorSineWave:
+  dec hl
+  ld  a,(hl)
+  ld  (de),a
+  inc de
+  djnz MirrorSineWave
+  pop hl                         ; << 0k
+  ld  b,128+64
+NegativeSineWave:
+  xor a
+  sub (hl)
+  ld  (de),a
+  inc hl
+  inc de
+  djnz NegativeSineWave
+
+;-----------------------------
+;---------- menu -------------
+;-----------------------------
+
+DisplayMenu:
+  ld  a,2
+  ld  (nrworms),a
+gomainMenu:
+  call _clrWindow
+  ld  hl,txtWelcome
+  call _puts
+  ld  de,$0205
+  ld  (_curRow),de
+  call _puts ;txtOptions
+  dec e ;$0204
+  ld  (_curRow),de
+  ld  hl,(CURtxtGame)
+  call _puts
+
+  xor a
+mainMenu:
+  call menucall
+  jr  nz,notselect
+select:
+  ld  a,b
+  or  a
+  jr  nz,gooptionsMenu
+  jp  LetsGetThisPartyOn
+notselect
+  cp  K_EXIT
+  jp  z,ExitNoStats
+  cp  K_RIGHT
+  ld  a,b
+  jr  nz,mainMenu
+  or  a
+  jr  z,Variation
+
+gooptionsMenu:
+  call _clrWindow
+  ld  hl,txtWelcome
+  call _puts
+  ld  hl,txtLevel
+  ld  de,$0205
+  ld  (_curRow),de
+  call _puts ;txtLevel
+  dec e ;$0204
+  ld  (_curRow),de
+  call _puts ;txtWorms
+  ld  a,(nrworms)
+  add a,'0'
+  call _putc
+  xor a
+optionsMenu:
+  call menucall
+  jr  nz,notopselect
+opselect:
+  ld  a,b
+  or  a
+  jr  nz,changelevel
+changeworms:
+  ld  hl,nrworms
+  inc (hl)
+  ld  a,4
+  cp  (hl)
+  jr  nc,gooptionsMenu
+  ld  (hl),2
+  jr  gooptionsMenu
+changelevel:
+  jr  optionsMenu
+
+notopselect:
+  cp  K_EXIT
+  jr  z,gomainMenu
+  ld  a,b
+  jr  optionsMenu
+
+Variation:
+  ld  a,0
+Gametype =$-1
+  ld  hl,txtGame2
+NEXTtxtGame =$-2
+  inc a
+  and 7 ;mod 8
+  jr  nz,okilydokily
+  ld  hl,txtGame
+okilydokily:
+  ld  (Gametype),a
+  ld  de,$0204
+  ld  (_curRow),de
+  ld  (CURtxtGame),hl
+  call _puts
+  ld  (NEXTtxtGame),hl
+  ld  a,b
+  jp  mainMenu
+
+menucall:
+  push af
+  ld  hl,$0004
+  ld  (_curRow),hl
+  ld  a,' '
+  call _putc
+  ld  hl,$0005
+  ld  (_curRow),hl
+  call _putc
+  pop af
+  push af
+  ld  h,0
+  add a,4
+  ld  l,a
+  ld  (_curRow),hl
+  ld  a,'*'
+  call _putc
+  pop af
+  ld  b,a
+menukeys:
+  halt \ halt
+  call _getcsc
+  or  a
+  jr  z,menukeys
+  cp  K_UP
+  jr  nz,notup
+updown:
+  ld  a,b
+  xor 1
+  ld  b,a
+  inc a ;nz
+  ret
+notup:
+  cp  K_DOWN
+  jr  z,updown
+  cp  K_ENTER
+  ret z
+  cp  K_SECOND
+  ret ;z=select
+
+;-----------------------------
+;-------- start game ---------
+;-----------------------------
+
+LetsGetThisPartyOn:
+  ld  hl,Gametype
+  ld  a,(hl)
+  add a,a
+  add a,(hl)
+  ld  e,a
+  ld  d,0
+  ld  hl,gamesdata
+  add hl,de
+
+  ld  a,(hl)
+  push af
+  and _datasingl
+  jr  z,notsingle
+  ld  a,1
+  ld  (nrworms),a
+notsingle:
+  pop af
+  ld  (gameCar),a
+  push af
+
+  and _datascore
+  ld  de,$FF64 ;virt.infinate
+  jr  z,setscorelimit
+  ld  d,0 ;de=100
+setscorelimit:
+  ld  (scorelimit),de
+
+  inc hl
+  call _ldHLind
+  pop af
+  push hl
+  and _datalink
+  jr  z,GameOver
+
+linkmatch:
+  call _clrWindow
+
+
+; in  a,(7)
+; and %11
+; cp  %11
+  ld  a,WormVersion
+; jr  nz,host
+  call send
+  jr  c,host
+
+client:
+  ld  hl,txtReceive
+  call _puts
+  call receive
+  cp  WormVersion
+  ret nz
+  jr  multiplayer
+
+host:
+  ld  hl,txtWaiting
+  call _puts
+  call receive
+  cp  WormVersion
+  ret nz
+  call send
+  ld  hl,SwapPos
+  ld  (hl),$f6
+
+multiplayer:
+  ld  a,2
+  ld  (nrworms),a
+  ld  de,LevelsDM
+
+;-----------------------------
+;--------- game over ---------
+;-----------------------------
+
+GameOver:
+  call _clrLCD
+  ld  hl,0
+  ld  (worm1+died),hl
+;+died=0 \ +score1=0
+  ld  (worm2+died),hl
+  ld  (worm3+died),hl
+  ld  (worm4+died),hl
+  inc h
+  ld  (worm1+score+1),hl
+;+score2=0 \ +delay=1
+  ld  (worm2+score+1),hl
+  ld  (worm3+score+1),hl
+  ld  (worm4+score+1),hl
+  ld  a,l
+  ld  (Level),a
+  ld  hl,worm1set+4
+  ld  de,worm1+lives
+  call _MOV5B ;9xld(de),(hl)
+  call _mov9b
+  ld  hl,worm2set+4
+  ld  de,worm2+lives
+  call _MOV5B
+  call _mov9b
+  ld  hl,worm3set+4
+  ld  de,worm3+lives
+  call _MOV5B
+  call _mov9b
+  ld  hl,worm4set+4
+  ld  de,worm4+lives
+  call _MOV5B
+  call _mov9b
+  pop de
+
+StartLevel:
+  ex  de,hl
+  ld  de,Left
+  ldi
+  ld  de,Speed
+  ldi
+  ld  a,(hl)
+  ld  (worm1+grow),a
+  ld  (worm2+grow),a
+  ld  (worm3+grow),a
+  ld  (worm4+grow),a
+  ld  (beginsize),a
+  inc hl
+
+  ld  a,(hl)
+  inc hl
+  ld  (nrballs),a
+  or  a
+  jr  z,toobad_noballs
+  ld  de,ballpos
+  ldi
+  ldi
+toobad_noballs:
+
+#ifdef 0
+  ld  a,(gameCar)
+  and _datahunt
+  jr  z,nohunter
+  ld  a,huntersize
+  ld  (worm2+grow),a
+nohunter:
+#endif
+
+  ex  de,hl
+  ld  (thislevel),de
+  push de
+  ld  hl,worm1set
+  ld  de,worm1+head
+  call _MOV4B
+  ld  hl,worm2set
+  ld  de,worm2+head
+  call _MOV4B
+  ld  hl,worm3set
+  ld  de,worm3+head
+  call _MOV4B
+  ld  hl,worm4set
+  ld  de,worm4+head
+  call _MOV4B
+  pop de
+
+  ld  hl,worm1
+  ld  a,(gameCar)
+  and _datanextl
+  ld  b,1
+  jr  nz,worminit
+  ld  b,4
+worminit:
+  push bc                        ; >> 1
+  ld  a,(de)
+  ld  (hl),a   ;d
+  inc de
+  inc hl
+  ld  a,SinCosTable/256
+  ld  (hl),a
+  inc hl
+
+  ld  a,(de)
+  ld  (hl),a   ;y
+  inc de
+  inc hl
+  ld  a,(de)
+  ld  (hl),a   ;x
+  inc de
+  inc hl
+
+  xor a
+  ld  (hl),a   ;y2
+  inc hl
+  ld  (hl),a   ;x2
+
+  ld  bc,(worm2-worm1)-5
+  add hl,bc
+  pop bc                         ; << 0k
+  djnz worminit
+
+;-------- draw level ---------
+
+  ld  a,(de)
+  inc de
+  sub 128
+  ld  (FieldWidth),a
+  ld  a,(de)
+  inc de
+  sub 57
+  ld  (FieldHeight),a
+  add a,57-5
+  push de                        ; >> levelp
+  ld  l,a
+  ld  h,0
+  add hl,hl
+  add hl,hl
+  add hl,hl
+  add hl,hl
+  add hl,hl
+  ex  de,hl
+
+  ld  hl,ScrBuffer
+  push hl                        ; >> 1
+  push de                        ; >> 2
+  ld  de,ScrBuffer+1
+  ld  bc,63
+  ld  (hl),%11111111
+  ldir
+  inc hl
+  ld  (hl),%11000000
+  inc hl
+  ld  b,31
+ClearLine:
+  ld  (hl),c
+  inc hl
+  djnz ClearLine
+  push hl                        ; >> 3
+
+  ld  a,(FieldWidth)
+  add a,126
+  push af                        ; >> 4
+  and %11111000
+  rra
+  rra
+  rra
+  ld  l,a
+  ld  h,0
+  add hl,de
+  pop af                         ; << 3
+  and %00000111
+  ld  b,a
+  ld  c,0
+  ld  a,%11000000
+  jr  z,NoVertShift
+VertShift:
+  rra
+  rr  c
+  djnz VertShift
+NoVertShift:
+  ld  (hl),a
+  inc hl
+  ld  (hl),c
+
+  ex  de,hl
+  pop de                         ; << 2
+  pop bc                         ; << 1
+  ldir
+  pop hl                         ; << 0k
+  ld  c,64
+  ldir
+
+;-draw lines-
+
+  pop hl                         ; << levelp
+  ld  a,(hl)
+  inc hl
+  or  a
+  jr  z,NoLines
+DrawLines:
+  push af                        ; >> 1
+  call loaddrawdata
+  push hl                        ; >> 2
+  ld  l,(hl)
+  ld  h,a
+  call Line
+  inc d
+  inc h
+  call Line
+  inc e
+  inc l
+  call Line
+  dec d
+  dec h
+  call Line
+  pop hl                         ; << 1
+  inc hl
+  pop af                         ; << 0k
+  dec a
+  jr  nz,DrawLines
+NoLines:
+
+  ld  a,(hl)
+  inc hl
+  or  a
+  jr  z,noboxes
+drawboxes:
+  push af
+  call loaddrawdata
+  push hl
+  ld  l,(hl)
+  ld  h,a
+  call drawbox
+  pop hl
+  inc hl
+  pop af
+  dec a
+  jr  nz,drawboxes
+noboxes:
+
+;-----------------------------
+
+  push hl                        ; >> levelp new
+  call showstats
+  ld  a,(gameCar)
+  and _datafood
+  jr  z,nofood
+  call NewPea
+  call DrawPea
+nofood:
+  ld  bc,(worm1+pos)
+  call DisplayField
+  ld  hl,$FDE0
+  ld  de,$FDE1
+  ld  (hl),%11111111
+  ld  bc,$BF
+  ldir
+  ld  hl,4+(txtposReady*256)
+  ld  (_curRow),hl
+  set 3,(iy+5)
+  ld  hl,txtReady
+  call _puts
+  res 3,(iy+5)
+
+  ld  a,0
+gameCar =$-1
+  and _datalink
+  jr  z,SwapPos ;no link
+  xor a
+  ld  (worm2+input),a
+  ld  (worm2+left),a
+  ld  (Speed),a
+
+SwapPos: ;$18 xx -> $F6 xx
+  jr  initfinished
+  inc a
+  ld  (worm2+left),a
+  ld  hl,(worm1+pos)
+  ld  de,(worm2+pos)
+  ld  (worm2+pos),hl
+  ld  (worm1+pos),de
+  ld  a,(worm1+heading)
+  ld  b,a
+  ld  a,(worm2+heading)
+  ld  (worm1+heading),a
+  ld  a,b
+  ld  (worm2+heading),a
+initfinished:
+
+  ld  b,0
+ReadyDelay:
+  halt
+  djnz ReadyDelay
+
+;-----------------------------
+;----------- LOOP ------------
+;-----------------------------
+
+GameLoop:
+  ld  bc,(worm1+pos)
+  call DisplayField
+
+  ld  a,1
+flashtime =$-1
+  dec a
+  jr  z,noflash
+  ld  (flashtime),a
+  ld  hl,$fc00+(16*7)
+screeninvertloop:
+  ld  a,(hl)
+  cpl
+  ld  (hl),a
+  inc hl
+  xor a
+  cp  h
+  jr  nz,screeninvertloop
+noflash:
+
+  ld  a,0
+Speed =$-1
+  or  a
+  jr  z,NoDelay
+Delay:
+  halt
+  dec a
+  jr  nz,Delay
+NoDelay:
+
+  call handlethatneatlittleball
+
+  ld  ix,worm1
+  ld  a,(nrworms)
+  ld  b,a
+handleworms:
+  push bc
+  call HandleWorm
+  ld  bc,worm2-worm1
+  add ix,bc
+  pop bc
+  djnz handleworms
+
+;-----------------------------
+;---------- keys -------------
+;-----------------------------
+
+HandleKeys:
+  ld  a,%10111111
+  out (1),a
+  in  a,(1)
+  rla
+  jr  c,NotPaused
+  ld  bc,$0103
+  out (c),b
+  halt
+  ld  b,11
+  out (c),b
+
+NotPaused:
+  rla
+  jp  c,GameLoop
+  jr  Exit ;&&
+
+WormDead:
+  ld  a,2
+  ld  (flashtime),a
+
+  ld  h,(ix+tail+1)
+  ld  l,(ix+tail)
+  ld  d,(ix+head+1)
+  ld  e,(ix+head)
+  jr  DoesWormTailEqualsWormHead ;chk4 size=0
+removewormloop:
+  ld  c,(hl)
+  inc hl
+  ld  b,(hl)
+  inc hl
+  res resbit,h
+  push hl
+  call res4pixels
+  pop hl
+  inc (ix+grow)
+DoesWormTailEqualsWormHead:
+  call _cphlde
+  jr  nz,removewormloop
+
+  ld  a,(gameCar)
+  and _datasingl
+  jr  nz,safewormsizedone
+  ld  a,0
+beginsize =$-1
+  ld  (ix+grow),a
+safewormsizedone:
+
+  ;de=ix+head
+  ld  (ix+tail+1),d
+  ld  (ix+tail),e
+  ld  a,50
+  ld  (ix+delay),a
+
+thislevel =$+1
+  ld  de,0
+  ld  a,(de)
+  inc de
+  ld  (ix+heading),a
+  ld  a,(de)
+  ld  (ix+pos),a
+  inc de
+  ld  a,(de)
+  ld  (ix+pos+1),a
+
+  inc (ix+died)
+  dec (ix+lives)
+  push af
+  ld  de,10
+  call DecScore
+  pop af
+  ret nz ;HandleWorm done
+  ld  a,(gameCar)
+  and _datalivel
+  ret z
+
+Exit:
+  ld  sp,0 ;pop all
+SpSave = $-2
+  call _clrWindow
+  ld  hl,txtGO
+  call _puts
+  ld  hl,txtGame
+CURtxtGame =$-2
+  call _puts
+  ld  de,0002
+  ld  (_curRow),de
+  call showLevel
+  ld  de,$0B03
+  ld  (_curRow),de
+  ld  hl,txtDied
+  call _puts
+  call _puts ;txtScore
+  xor a
+  ld  (_curCol),a
+
+  ld  b,2
+nrworms =$-1
+  ld  hl,worm1+died
+displayWormStats:
+  push bc
+  push hl
+
+  ld  bc,input-died
+  add hl,bc ;+input
+  xor a
+  cp  (hl)
+  jr  nz,NoLinkIndic
+  ld  b,7
+  inc hl ;+left
+  cp  (hl)
+  jr  z,hostLinkIndic
+  dec b
+hostLinkIndic:
+  ld  a,8
+  ld  (_curCol),a
+  ld  a,b
+  call _putc
+  xor a
+  ld  (_curCol),a
+  dec hl
+NoLinkIndic:
+  inc hl
+  inc hl
+  inc hl ;+name
+  call _puts
+
+  pop hl
+  push hl
+  ld  a,13
+  ld  (_curCol),a
+  ld  a,(hl) ;worm+died
+  push hl
+  call showA
+  pop hl
+
+  ld  a,16
+  ld  (_curCol),a
+  inc hl ;worm+score
+  call _ldHLind ;ld hl,(hl)
+  call showHL ;worm+score
+
+  pop hl
+  ld  bc,worm2-worm1
+  add hl,bc
+  pop bc
+  djnz displayWormStats
+
+  ld  a,(gameCar)
+  and _datasingl
+  jr  z,hiscorecheckdone
+checkhiscore:
+  ld  de,(worm1+score)
+HiScore =$+1
+  ld  hl,0
+  ld  a,e
+  cp  l
+  jr  c,NotNewHigh
+  ld  a,d
+  cp  h
+  jr  c,NotNewHigh
+  ld  (HiScore),de
+  ex  de,hl ;disp.new hiscore
+NotNewHigh:
+  ex  de,hl
+  ld  hl,txthiscore
+  call _puts
+  ex  de,hl
+  call showHL
+hiscorecheckdone:
+
+waitkey:
+  halt
+  halt
+  call _getcsc
+  cp  K_ENTER
+  jp  z,DisplayMenu
+;  cp  K_EXIT
+  jr  nz,waitkey
+
+;x123456789012345678901
+;1----- GAME OVER -----
+;2Multiplayer
+;3Level 01
+;4           Died Score:
+;5NameName     03 00070
+;6Worm#02 @    05 00120
+;7Worm#03      15 00030
+;8Snaky   @    00 04820
+
+ExitNoStats:
+  ld  hl,_asapvar
+  rst 20h ;_ABS_MOV10TOOP1
+  rst 10h ;_FINDSYM
+  call _swapt_ ;_ex_ahl_bde
+  ld  de,4
+  add hl,de
+  adc a,0
+  call _SET_ABS_DEST_ADDR
+
+  xor a
+  ld  hl,start
+  call _SET_ABS_SRC_ADDR
+  ld  hl,end-start
+  call _SET_MM_NUM_BYTES
+  call _MM_LDIR
+
+;  xor a
+;  ld  (_asapvar+1),a
+  res 4,(iy+9)
+  set 2,(iy+13)
+  jp  _clrWindow
+
+;-----------------------------
+;----------- worm ------------
+;-----------------------------
+
+inlink:
+  ld  a,0
+sendbyte =$-1
+  ld  b,(ix+left)
+  dec b
+  jr  z,receivefirst
+  call send
+  call receive
+  ld  l,a
+  ret
+receivefirst:
+  push af
+  call receive
+  ld   l,a
+  pop  af
+  push hl
+  call send
+  pop  hl
+  ret
+
+inkeys: ;use jp not call!
+  out (1),a
+  in  a,(1)
+  ld  b,a
+  and (ix+right)
+  jr  z,notright
+  ld  a,l
+  add a,8
+  ld  l,a
+notright:
+  ld  a,b
+  and (ix+left)
+  jr  z,donediddelydone
+  ld  a,l
+  sub 8
+  ld  l,a
+  jr  donediddelydone
+
+;------- handle worm ---------
+
+HandleWorm:
+  dec (ix+delay)
+  ret nz
+  inc (ix+delay)
+  ld  l,(ix+heading)
+  ld  a,(ix+input)
+  or  a
+  jr  nz,inkeys
+  call inlink
+donediddelydone:
+  ld  a,l
+  ld  (sendbyte),a
+  ld  (ix+heading),l
+  ld  h,(ix+heading+1)
+
+  ld  c,(ix+pos)
+  ld  b,(ix+pos+1)
+  ld  e,(ix+pos2)
+  ld  d,(ix+pos2+1)
+
+;-------- move worm ----------
+
+Wormmove:
+  push bc                        ; >> pos
+  ld  a,(hl)
+  add a,a
+  add a,d
+  ld  d,a
+  bit 7,(hl)
+  jr  z,notnegX
+  dec b
+notnegX:
+  jr  nc,notmoveX
+  inc b
+notmoveX:
+  ld  a,l
+  add a,$40
+  ld  l,a
+  ld  a,(hl)
+  add a,a
+  add a,e
+  ld  e,a
+  bit 7,(hl)
+  jr  z,notnegY
+  dec c
+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
+
+;-check-
+  pop hl                         ; << pos (old)
+  ld  a,h
+  sub b
+  and 1
+  ld  h,a
+  ld  a,l
+  sub c
+  and 1
+  add a,h
+  ld  d,4
+  jr  z,GotFour
+  xor 3
+  ld  d,a
+GotFour:
+  call chk4pixels
+  rl  d
+  jp  nc,Drawworm
+
+;--------- worm hit ----------
+
+Hitworm:
+  ld  a,(gameCar)
+  ld  h,a
+  and _datafood
+  jp  z,WormDead
+  ld  a,h
+  and _datahunt
+  call nz,checkhitotherworm
+
+  ld  hl,0
+PeaY =$-2
+PeaX =$-1
+  ld  a,b
+  sub h
+  inc a
+  cp  4
+  jp  nc,WormDead
+  ld  a,c
+  sub l
+  inc a
+  cp  4
+  jp  nc,WormDead
+  call DrawPea
+  ld  a,(ix+grow)
+  add a,15
+  ld  (ix+grow),a
+  call NewPea
+  ld  hl,Left
+  dec (hl)
+  push af
+  ld  de,10
+  call IncScore
+  pop af
+  jr  nz,still_alive_not_dead
+  ld  a,(gameCar)
+  and _datafoodl
+  jr  z,still_alive_not_dead
+  ld  hl,Level
+  ld  a,(hl)
+  inc (hl)
+  pop hl                         ; << call
+  pop hl                         ; << call
+  pop de                         ; << levelp new
+  cp  NUM_LEVELS
+  jp  z,Exit
+  ld  a,(gameCar)
+  and _datanextl
+  jp  nz,StartLevel
+  jp  Exit
+
+;-----------------------------
+
+checkhitotherworm:
+  .db $dd,$7d ;ld a,lx
+  cp  worm2&255
+  ret nz
+ThisIsJustASillyUselessLabel:
+  ld  hl,(worm1+tail)
+  ld  de,(worm1+head)
+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
+  jr  c,otherwormHIT ;yes
+nothit1:
+  inc hl
+  res resbit,h
+  call _cphlde
+  jr  nz,nextotherwormbit
+  ret
+
+checkhitlapline:
+  ld  a,63
+  sub b
+  jr  z,nextlaphalf
+  inc a
+  ret nz
+nextlaphalf:
+  ld  a,c
+  and 32 ;y>=32?
+  jr  nz,nolap
+  cp  (ix+reserv)
+  jr  z,nolap
+  push bc
+  ld  de,20
+  call IncScore
+  pop bc
+  xor a
+nolap:
+  ld  (ix+reserv),a
+  ret
+
+otherwormHIT:
+  push ix
+  ld  de,10
+  call IncScore
+  ld  ix,worm1
+  call WormDead
+  pop ix
+  pop bc
+still_alive_not_dead:
+
+;-------- draw worm ----------
+
+Drawworm:
+  ld  a,(gameCar)
+  and _datahunt
+  call nz,HuntingTimeScore
+
+  ld  c,(ix+pos)
+  ld  b,(ix+pos+1)
+
+  ld  a,(gameCar)
+  and _datalaps
+  call nz,checkhitlapline
+
+  ld  l,(ix+head)
+  ld  h,(ix+head+1)
+  ld  (hl),c
+  inc hl
+  ld  (hl),b
+  inc hl
+  res resbit,h
+  ld  (ix+head),l
+  ld  (ix+head+1),h
+
+  call set4pixels
+
+  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
+  res resbit,h
+  ld  (ix+tail),l
+  ld  (ix+tail+1),h
+
+res4pixels:
+  call ResPixel
+  inc b
+  call ResPixel
+  inc c
+  call ResPixel
+  dec b
+ResPixel:
+  call FindPixel
+  cpl
+  and (hl)
+  ld  (hl),a
+  ret
+
+;-----------------------------
+;---------- ball -------------
+;-----------------------------
+
+handlethatneatlittleball:
+  ld  a,0
+nrballs =$-1
+  or  a
+  ret z
+ballpos =$+1
+  ld  bc,$0503
+  call res4pixels
+  dec c
+  ld  e,b
+ballxmove:
+  inc b ;=%000100 dec=%000101
+  call checkballhit
+  jr  z,ballxdone
+  ld  b,e
+  ld  hl,ballxmove
+  call letsmovetheotherway
+ballxdone:
+  ld  e,c
+ballymove:
+  inc c ;=%001100 dec=%001101
+  call checkballhit
+  jr  z,balldone
+  ld  c,e
+  ld  hl,ballymove
+  call letsmovetheotherway
+balldone:
+  ld  (ballpos),bc
+  jp  set4pixels
+
+letsmovetheotherway:
+  ld  a,1
+  xor (hl)
+  ld  (hl),a
+  ret
+
+checkballhit:
+  ld  d,0
+  call chk4pixels
+  xor a
+  cp  d
+  ret
+
+;-----------------------------
+;----------- procs -----------
+;-----------------------------
+
+NewPea:
+;random routine
+  ld hl,0
+  ld de,12345
+Seed =$-2
+  ld a,7921&255
+  ld bc,$1000+(7921/256)
+domult16:
+  add hl,hl
+  rla
+  rl  c
+  jr  nc,noadd16
+  add hl,de
+noadd16:
+  djnz domult16
+  inc hl
+  ld  (Seed),hl ;seed=(seed*7921+1)\65536
+
+  ld  a,(FieldWidth)
+  add a,123
+  cp  h
+  jr  c,NewPea
+  inc h
+  inc h
+  ld a,(FieldHeight)
+  add a,51
+  cp  l
+  jr  c,NewPea
+  inc l
+  inc l
+  ld  (PeaY),hl
+  ld  d,2 ;don't draw
+  push hl
+  call CheckPea
+  pop hl
+  dec d
+  jr  z,NewPea
+
+DrawPea: ;hl=(PeaY)
+  ld  d,0 ;draw
+CheckPea:
+  ld  b,h
+  ld  c,l
+  call PeaPixel
+  inc c
+  call PeaPixel
+  inc b
+  call PeaPixel
+  dec c
+PeaPixel:
+  push de
+  call FindPixel
+  pop de
+  ld  e,a ;>>
+  ld  a,d
+  or  a
+  ld  a,e ;<<
+  jr  z,DrawPeaPixel ;d=0:draw
+  and (hl) ;pixel?
+  ret z
+  ld  d,1 ;d=1:yes 2:no
+  ret
+DrawPeaPixel:
+  xor (hl) ;change pixel
+  ld  (hl),a
+  ret
+
+;-------- pixelprocs ---------
+
+set4pixels:
+  call SetPixel
+  inc b
+  call SetPixel
+  inc c
+  call SetPixel
+  dec b
+SetPixel: ;at bc
+  call FindPixel
+  or  (hl)
+  ld  (hl),a
+  ret
+
+chk4pixels: ;&&
+  call CheckPixel
+  inc b
+  call CheckPixel
+  inc c
+  call CheckPixel
+  dec b
+  call CheckPixel
+  dec c
+  ret
+CheckPixel: ;at bc in d
+  call FindPixel
+  and (hl)
+  ret z
+  dec d
+  ret
+
+;CLEM's FIND_PIXEL (131 cycles; 28 bytes)
+;            (b,c) to hl:a; destroyes: -)
+
+FindPixel:
+  ld  h,ScrBuffer/$800
+  ld  a,c
+  add a,a
+  add a,a
+  ld  l,a    ;hl=4*y + offset/8
+  ld  a,b
+  rra
+  add hl,hl
+  rra
+  add hl,hl
+  add hl,hl  ;hl=32*y + offset
+  rra        ;a=x/8
+  or  l
+  ld  l,a
+  ld  a,b
+  and 7
+  cpl
+  rlca
+  rlca
+  rlca
+  ld  (FP_Bit),a
+  xor a
+FP_Bit =$+1
+  set 0,a
+  ret
+
+;----------- score -----------
+
+HuntingTimeScore:
+  .db $dd,$7d ;ld a,lx
+  cp  worm2&255
+  ret z ;=worm#2
+  dec (ix+reserv)
+  ret nz
+  ld  de,10
+
+IncScore:
+  ld  h,(ix+score+1)
+  ld  l,(ix+score)
+  add hl,de
+  jr  scorecommon
+DecScore: ;&&&
+  ld  h,(ix+score+1)
+  ld  l,(ix+score)
+  or  a
+  sbc hl,de
+  ret c
+scorecommon:
+  ld  (ix+score+1),h
+  ld  (ix+score),l
+  ld  de,0
+scorelimit =$-2
+  call _cphlde
+  jp  nc,Exit
+
+showstats:
+  push ix
+  ld  h,0
+  ld  l,h
+  ld  (_penCol),hl
+  ld  a,(nrworms)
+  ld  b,a
+  ld  ix,worm1
+  ld  a,(gameCar)
+  and _datanextl
+  jr  nz,showstatsS
+showstatloop:
+  push bc
+  call showstat
+  ld  de,worm2-worm1
+  add ix,de
+  ld  hl,_penCol
+  ld  a,(hl)
+  add a,10
+  ld  (hl),a
+  pop bc
+  djnz showstatloop
+  pop ix
+  ret
+
+showstat:
+  ld  a,(gameCar)
+  and _datalivel
+  jr  nz,showlives
+showscore:
+  ld  h,(ix+score+1)
+  ld  l,(ix+score)
+  call _D_HL_DECI
+  jr __vputs
+showlives:
+  ld  a,(ix+lives)
+  add a,'0'
+__vputmap:
+  push ix
+  call _vputmap
+  pop ix
+  ret
+
+showstatsS:
+  ld  hl,txtLevel
+  call __vputs
+  ld  a,(Level)
+  cp  10
+  jr  c,tilllevel9
+  ld  l,a
+  ld  h,0
+  call _divHLby10
+  push af
+  ld  a,l
+  add a,'0'
+  call __vputmap
+  pop af
+tilllevel9:
+  add a,'0'
+  call __vputmap
+
+  ld  a,98
+  ld  (_penCol),a
+  call showscore
+  ld  a,123
+  ld  (_penCol),a
+  call showlives
+  ld  a,(gameCar)
+  and _datafoodl
+  pop ix
+  ret z
+showleft:
+  ld  a,31
+  ld  (_penCol),a
+  ld  a,0
+Left =$-1
+  push af
+  call _divAby10
+  add a,'0'
+  call __vputmap
+  pop af
+  add a,'0'
+  call __vputmap
+  ld  hl,txtLeft
+__vputs:
+  push ix
+  call _vputs
+  pop ix
+  ret
+
+showLevel:
+  ld  hl,txtLevel
+  call _puts
+  ld  a,(Level)
+showA:
+  cp  10
+  jr  c,LevelBelowTen
+  ld  l,a
+  ld  h,0
+  call _divHLby10
+  push af
+  ld  a,l
+  add a,'0'
+  call _putc
+  pop af
+LevelBelowTen:
+  add a,'0'
+  jp  _putc
+
+showHL:
+  call _D_HL_DECI
+  jp  _puts
+
+_D_HL_DECI:
+  ld  de,savestr+4
+  ld  b,5
+ldhld:
+  call _divHLby10
+  add a,'0'
+  ld  (de),a
+  dec de
+  djnz ldhld
+  ld  hl,savestr
+  ret
+savestr:
+  .db "00000",0
+
+;-----------------------------
+
+DisplayField:
+  ld  a,c
+  sub 29
+  jr  nc,NotMinYScroll
+  xor a
+NotMinYScroll:
+  cp  43
+FieldHeight =$-1
+  jr  c,NotMaxYScroll
+  ld  a,(FieldHeight)
+NotMaxYScroll:
+  ld  l,a
+  ld  h,0
+  add hl,hl
+  add hl,hl
+  add hl,hl
+  add hl,hl
+  add hl,hl
+  push bc                        ; >> 1
+  push de                        ; >> 2
+  ld  de,ScrBuffer
+  add hl,de
+  ld  a,b
+  sub 64
+  jr  nc,NotMinXScroll
+  xor a
+NotMinXScroll:
+  cp 128
+FieldWidth = $-1
+  jr c,NotMaxXScroll
+  ld a,(FieldWidth)
+NotMaxXScroll:
+  push af                        ; >> 3
+  and %11111000
+  rra
+  rra
+  rra
+  ld  c,a
+  ld  b,0
+  ld  de,DispBuffer
+  pop af                         ; << 2
+  and %00000111
+  push af                        ; >> 3
+  cp  6
+  jr  c,CopyScreen
+  inc c
+CopyScreen:
+  add hl,bc
+  ld b,57
+CopyScreenLoop:
+  push bc                        ; >> 4
+  ld bc,16
+  ldir
+  ld c,16
+  add hl,bc
+  pop bc                         ; << 3
+  djnz CopyScreenLoop
+  pop af                         ; << 2
+  ld  c,$b7 ;or a
+Bit0:
+  jr  nz,Bit1
+  halt
+  halt
+  jr  AfterShiftDelay
+Bit1:
+  dec a
+  jr nz,Bit2
+  call ShiftRight1
+  jr AfterShiftDelay
+Bit2:
+  dec a
+  jr nz,Bit3
+  ld a,2
+  call ShiftRight
+  jr AfterShiftDelay
+Bit3:
+  dec a
+  jr nz,Bit4
+  call Chunk
+  call ShiftLeft1
+  jr AfterShift
+Bit4:
+  dec a
+  jr nz,Bit5
+  call Chunk
+  jr AfterShiftDelay
+Bit5:
+  dec a
+  jr nz,Bit6
+  call Chunk
+  call ShiftRight1
+  jr AfterShift
+Bit6:
+  dec a
+  jr nz,Bit7
+  ld a,2
+  call ShiftLeft
+  jr AfterShift
+Bit7:
+  call ShiftLeft
+AfterShiftDelay:
+  halt
+AfterShift:
+  ld hl,DispBuffer
+  ld de,$fc00+$70
+  ld bc,1024-$70
+  ldir
+  pop de                         ; << 1
+  pop bc                         ; << 0k
+  ret
+
+ShiftRight1:
+  ld a,1
+ShiftRight:
+  ld (ShiftRightCounter),a
+  ld a,c
+  ld (ShiftRightChunk),a
+  ld c,16
+  add hl,bc
+  ld b,57
+ShiftRightLoop:
+  push bc
+  ld bc,-32
+  add hl,bc
+  ex de,hl
+  ld a,(de)
+ShiftRightChunk:
+  or a
+  call c,_SHLACC
+  ld c,0
+ShiftRightCounter = $-1
+ShiftRowsLeft:
+  push hl
+  rla
+  ld b,16
+ShiftRowLeft:
+  dec hl
+  rl (hl)
+  djnz ShiftRowLeft
+  pop hl
+  dec c
+  jr nz,ShiftRowsLeft
+  ld bc,-16
+  add hl,bc
+  ex de,hl
+  pop bc
+  djnz ShiftRightLoop
+  ret
+
+ShiftLeft1:
+  ld a,1
+ShiftLeft:
+  ld (ShiftLeftCounter),a
+  ld a,c
+  ld (ShiftLeftChunk),a
+  rla
+  jr nc,ShiftLeftSameByte
+  dec hl
+ShiftLeftSameByte:
+  ex de,hl
+  ld bc,-16
+  add hl,bc
+NewSprite:
+  ex de,hl
+  ld b,57
+ShiftLeftLoop:
+  push bc                        ; >> 1
+  ld bc,-32
+  add hl,bc
+  ex de,hl
+  ld a,(de)
+ShiftLeftChunk:
+  or a
+  call c,_SHRACC
+  ld c,0
+ShiftLeftCounter = $-1
+ShiftRowsRight:
+  push hl                        ; >> 2
+  rra
+  ld b,16
+ShiftRowRight:
+  rr (hl)
+  inc hl
+  djnz ShiftRowRight
+  pop hl                         ; << 1
+  dec c
+  jr nz,ShiftRowsRight
+  ld bc,-16
+  add hl,bc
+  ex de,hl
+  pop bc                         ; << 0k
+  djnz ShiftLeftLoop
+  ret
+
+Chunk:
+  push hl                        ; >> 1
+  push de                        ; >> 2
+  ld  c,16
+  add hl,bc
+  ld  b,57
+ChunkScreen:
+  push bc                        ; >> 3
+  ld  bc,-32
+  add hl,bc
+  ex  de,hl
+  ld  a,(de)
+  call _SHRACC
+  ld  b,16
+ChunkRow:
+  dec hl
+  rld
+  djnz ChunkRow
+  ex  de,hl
+  pop bc                         ; << 2
+  djnz ChunkScreen
+  pop de                         ; << 1
+  pop hl                         ; << 0k
+  ld  c,$37 ;scf
+  ret
+
+;----------- draw ------------
+
+loaddrawdata:
+  ld  d,(hl)
+  inc hl
+  ld  e,(hl)
+  inc hl
+  ld  a,(hl)
+  inc hl
+  ret
+
+Line: ;draw line from de to hl (d<h)
+  push hl
+  push de
+  ld a,d
+  cp h
+  jr c,lineOrdered
+  ex de,hl
+lineOrdered:
+  ld  b,d
+  ld  c,e
+  push hl
+  push bc
+  call FindPixel
+  pop bc
+  pop de
+connectedLine:
+  push 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  h,a
+  xor a
+  sub b
+  add a,a
+  ld  (line1sm+1),a
+  ld  a,h
+  sub b
+  pop hl
+LineLoopGentle:
+  push af
+  ld  a,(hl)
+  or  c
+  ld  (hl),a
+  rrc c
+  jr  nc,$+3
+  inc hl
+  pop af
+  jp  m,line2sm
+line1sm:
+  add a,0
+  add hl,de
+line2sm:
+  add a,0
+  djnz LineLoopGentle
+DoneLine:
+  ld  a,(hl)
+  or  c
+  ld  (hl),a
+  pop de
+  pop hl
+  ret
+SteepLine:
+  ld  h,a
+  neg
+  add a,a
+  ld  (line3sm+1),a
+  ld  a,b
+  add a,a
+  ld  (line4sm+1),a
+  sub h
+  ld  b,h
+  pop hl
+LineLoopSteep:
+  push af
+  ld  a,(hl)
+  or  c
+  ld  (hl),a
+  add hl,de
+  pop af
+  jp  m,line4sm
+line3sm:
+  add a,0
+  rrc c
+  jr  nc,$+3
+  inc hl
+line4sm:
+  add a,0
+  djnz LineLoopSteep
+  jr  DoneLine
+
+drawbox:
+ ld  b,h
+ ld  c,l
+ call FindPixel
+;  ld  b,a
+;makefirstbyte:
+;  or  b
+;  rr  b
+;  jr  nc,makefirstbyte
+;  or  (hl) ;()
+;  ld  (hl),a
+
+  ld  b,e ;yloop
+boxloopy:
+  push bc ;yloop
+  ld  b,d ;xloop
+boxloopx:
+  ld  a,%11111111
+  ld  (hl),a
+  inc hl
+  djnz boxloopx
+
+  ld  b,0
+  ld  a,16
+  sub d
+  ld  c,a
+  add hl,bc
+  pop bc ;yloop
+  djnz boxloopy
+  ret
+
+;-----------------------------
+;----------- link ------------
+;-----------------------------
+#ifdef 0
+TIMEOUT = $1200
+
+send:
+  push af ;ld b,a
+  call _getcsc
+  cp  K_EXIT
+  jp  z,Exit
+  pop af ;ld a,b
+  call SendByte
+;  jr  c,send
+  ret
+
+linkfail:
+  jp  Exit
+
+LinkPrep:
+  ex  (sp),hl
+  push bc
+  push de
+  set 2,(iy+$12) ;cursorblink
+  ld  b,8
+  jp  (hl)
+
+receive:
+  call checklink
+  jr  z,linkfail
+  cp  %11
+  jr  z,receive
+ReceiveByteCont:
+  call LinkPrep
+  jr  ReceiveCont
+ReceiveByte:
+  call LinkPrep
+ReceiveBits:
+ ld de,TIMEOUT
+WaitRecBit:
+  call checklink
+  jr  z,LinkFailed
+  cp  %11
+  jr  z,WaitRecBit
+ReceiveCont:
+  sub %10
+  ld  a,%10 
+  ld  d,D0lD1h
+  jr  c,ReceiveLow
+  rra
+  ld  d,D0hD1l
+ReceiveLow:
+  rr  c
+  ld  (AckBit),a
+  ld  a,d
+  out (7),a
+ ld de,TIMEOUT
+WaitAckRec:
+  call checklink
+  cp  0
+AckBit =$-1
+  jr  nz,WaitAckRec
+  ld  a,D0hD1h
+  out (7),a
+  ld  d,4
+WaitReadyRec:
+  dec d
+  jr  z,ReadyRec
+  in  a,(7)
+  cp  %11
+  jr  nz,WaitReadyRec
+ReadyRec:
+  djnz ReceiveBits
+  jr  LinkSuccess
+
+SendByte:
+  call LinkPrep
+  ld  c,a
+  inc b
+  jr  SendAcked
+SendBits:
+  rr  c
+
+sendbit:
+  ld  a,D0lD1h
+  jr  nc,sendselected
+  ld  a,D0hD1l
+sendselected:
+  out (7),a
+ ld de,TIMEOUT
+waitacknowledge:
+  call checklink
+  jr  nz,waitacknowledge
+SendAcked:
+  ld  a,D0hD1h
+  out (7),a
+ ld de,TIMEOUT
+waitsendready:
+  call checklink
+  cp  %11
+  jr  nz,waitsendready
+
+  djnz SendBits
+LinkSuccess: ;nc
+  .db $f6 ;first byte of "or n"
+LinkFailed:  ;c
+  scf
+  ld  a,c
+  res 2,(iy+$12) ;noblink
+  pop de
+  pop bc
+  pop hl
+  ret
+
+linkerror:
+  jp  Exit
+
+checklink:
+ pop hl
+ dec de
+ ld a,d
+ or e
+ jr z,LinkFailed
+  ld  a,$BF ;key
+  call _readkeypad
+  bit 6,a
+  jr  z,linkerror
+
+  in  a,(7)
+  and %11
+ jp (hl)
+  ret
+
+_readkeypad:
+  out (1),a
+  in  a,(1)
+  push af
+  ld  a,%11111111
+  out (1),a
+  pop af
+  ret
+#endif
+
+send:
+SendByte:
+  in  a,(7)
+  and %11
+  jr  z,nolink
+  ld  b,8
+sendloop:
+  ld  de,$8000
+  rl  c
+  ld  a,%11010100
+  jr  nc,sendbit
+  ld  a,%11101000
+sendbit:
+  out (7),a
+sendwait1:
+  call checklink
+  in  a,(7)
+  and  %11
+  jr  nz,sendwait1
+  ld  a,%11000000
+  out (7),a
+sendwait2:
+  call checklink
+  in  a,(7)
+  and %11
+  cp  %11
+  jr  nz,sendwait2
+  djnz sendloop
+  xor a
+  ret
+timeout:
+  scf
+  ret
+
+
+receive:
+  in  a,(7)
+  and %11
+  jr  z,nolink
+  cp  %11
+  jr  z,receive
+  ld  b,8
+receiveloop:
+  ld  de,$8000
+receivewait1:
+  call checklink
+  in  a,(7)
+  and %11
+  cp  %11
+  jr  z,receivewait1
+  rra
+  rl  c
+  rra
+  ld  a,%11010100
+  jr  nc,receivebit
+  ld  a,%11101000
+receivebit:
+  out (7),a
+receivewait2:
+  call checklink
+  in  a,(7)
+  and %11
+  jr  z,receivewait2
+  ld  a,%11000000
+  out (7),a
+  djnz receiveloop
+  xor a
+  ret
+
+checklink:
+  dec de
+  ld  a,d
+  or  e
+  jr  z,timeout
+  ld  a,$BF ;key
+  call _readkeypad
+  bit 6,a
+  jr  z,timeout
+  ret
+_readkeypad:
+  out (1),a
+  in  a,(1)
+  push af
+  ld  a,%11111111
+  out (1),a
+  pop af
+  ret
+nolink:
+  jp  Exit
+
+;-----------------------------
+;---------- levels -----------
+;-----------------------------
+
+LevelsDM:
+  .db 8,5,15,0
+  .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
+  .db 128,57
+  .db 0,0
+
+LevelsDM2:
+  .db 8,5,31,0
+  .db $40,28,2,$C0,28,125, $00,2,63,$80,54,63
+  .db 128,57
+  .db 0
+  .db 4             ;4 boxes
+  .db 4,19,16,14    ;xsize,ysize,xpos,ypos
+  .db 4,19,80,14
+  .db 4,19,16,34
+  .db 4,19,80,34
+
+LevelsR:
+  .db 8,5,24,0
+  .db $40,3,2,$40,6,2, $40,9,2,$40,12,2
+  .db 128,57
+  .db 0
+  .db 1
+  .db 8,29,32,20
+
+LevelsH:
+  .db 8,7,17,0
+#ifdef 0
+huntersize = 31
+#endif
+  .db $40,28,2,$C0,28,125, $00,2,63,$80,54,63
+  .db 128,57
+  .db 0
+  .db 4
+  .db 4,19,16,14
+  .db 4,19,80,14
+  .db 4,19,16,34
+  .db 4,19,80,34
+
+NUM_LEVELS = 10
+
+LevelsS:
+
+ .db 4,5,10,1 \ .dw $20F
+ .db 0,2,63
+ .db 128,57
+ .db 2
+ .db 28,14,100,41
+ .db 28,41,100,14
+ .db 0
+
+  .db 5,4,15,0      ;peas,speed,begin_size,balls
+  .db 0,2,63        ;d,y,x
+  .db 128,57        ;field width, height
+  .db 0             ;no additional lines
+  .db 0             ;no boxes
+
+  .db 8,4,15,0
+  .db $40,14,2
+  .db 128,57
+  .db 1
+  .db 28,28,100,28  ;line coords: x1,y1,x2,y2
+  .db 0
+
+  .db 9,4,15,0
+  .db $40,8,2
+  .db 128,57
+  .db 2
+  .db 28,14,100,14
+  .db 28,41,100,41
+  .db 0
+
+  .db 9,3,15,0
+  .db $40,8,2
+  .db 128,80
+  .db 2
+  .db 64,14,64,66
+  .db 20,40,108,40
+  .db 0
+
+  .db 10,3,15,0
+  .db 2,8,$40
+  .db 128,90
+  .db 3
+  .db 18,20,18,70
+  .db 110,20,110,70
+  .db 18,45,110,45
+  .db 0
+
+  .db 7,3,15,0
+  .db 64,4,0
+  .db 128,86
+  .db 6
+  .db 34,13,56,35
+  .db 34,71,56,49
+  .db 72,35,94,13
+  .db 72,49,94,71
+  .db 16,20,16,64
+  .db 110,20,110,64
+  .db 0
+
+  .db 9,2,15,0
+  .db 4,10,$40
+  .db 128,82
+  .db 3
+  .db 0,20,74,20
+  .db 54,40,128,40
+  .db 0,60,74,60
+  .db 0
+
+  .db 12,2,15,0
+  .db 64,4,0
+  .db 128,90
+  .db 6
+  .db 20,16,54,16
+  .db 74,16,110,16
+  .db 20,16,20,72
+  .db 110,16,110,72
+  .db 20,72,54,72
+  .db 74,72,110,72
+  .db 0
+
+  .db 8,2,15,0
+  .db 72,52,$c0
+  .db 128,128
+  .db 13
+  .db 34,56,56,34
+  .db 34,72,56,94
+  .db 72,34,94,56
+  .db 72,94,94,72
+  .db 46,64,80,64
+  .db 22,11,22,33
+  .db 11,22,33,22
+  .db 22,95,22,117
+  .db 11,106,33,106
+  .db 103,11,103,33
+  .db 91,22,115,22
+  .db 103,95,103,117
+  .db 91,106,115,106
+  .db 0
+
+
+;-----------------------------
+;---------- data -------------
+;-----------------------------
+
+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
+
+txtWelcome: .db "Welcome to Worm!! ",
+            .db "by Shiar",0
+txtOptions: .db "Options",0
+txtGame:    .db "Singleplayer",0  ;0
+txtGame2:   .db "Peaworm     ",0  ;1
+            .db "Deathmatch",0    ;2
+            .db "Foodmatch ",0    ;3
+            .db "LinkMatch",0     ;4 (>options)
+            .db "Hunting  ",0     ;5
+            .db "Race   ",0       ;6
+            .db "CTF ",0          ;7
+            .db "Domination",0    ;(>=8)
+txtWaiting: .db "Waiting...",0
+txtReceive: .db "Receiving...",0
+
+WormVersion = 092
+WormMsg:   .db "WORM by SHIAR -- test version",0
+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
+txthiscore:.db "HiScore:",0
+txtReady:  .db "Prepare!",0
+txtposReady = 7
+txtGO:     .db "----- GAME OVER -----",0
+
+gamesdata:
+
+_datalink  = %00000001
+_datasingl = %00001000 ;singleplayer=1
+_datalivel = %00000010 ;ix+lives=0 limit
+_datafoodl = %00000100 ;left=0 limit
+_datanextl = %00001000 ;next level if left=0
+_datafood  = %00010000 ;food present
+_datahunt  = %00100000
+_datalaps  = %01000000 ;give lap score
+_datascore = %10000000 ;score>=100 limit
+
+datasingle: .db %00011110
+            .dw LevelsS
+datapeas:   .db %00011010
+            .dw LevelsS
+datadeathm: .db %00000010
+            .dw LevelsDM2
+datafoodm:  .db %10010000
+            .dw LevelsDM
+datalinkm:  .db %00000011
+            .dw LevelsDM
+datahuntin: .db %10100000
+            .dw LevelsH
+datarace:   .db %11000000
+            .dw LevelsR
+datactf:    .db %00000000
+            .dw LevelsDM
+datadomin:  .db %00000000
+            .dw LevelsDM
+
+
+setdata = 18
+resbit  = 2             ;and%11111011
+worm1set:  .dw $B000,$B000 ;%10110000
+           .db 3,0,%01111110,%10,%100 ;< >
+           .db "Worm #1",0
+worm2set:  .dw $B800,$B800 ;%10111000
+           .db 3,0,%00111111,%10000,%1000 ;f1 f2
+           .db "Worm #2",0
+worm3set:  .dw $E800,$E800 ;%11101000 ;$D748+$1000+
+           .db 3,0,%01011111,%10,%100 ;sto ,
+           .db "Worm #3",0
+worm4set:  .dw $F000,$F000 ;%11110000
+           .db 3,0,%01111101,%10,%1 ;enter +
+           .db "Worm #4",0
+worm1 = $B400
+worm2 = $B430
+worm3 = $B460
+worm4 = $B490
+end:
+              ;set:
+heading = 0   ;level*
+pos     = 2   ;level*
+pos2    = 4   ;level
+grow    = 6   ;level
+died    = 8   ;game
+score   = 9   ;game
+delay   = 11  ;game
+
+head    = 12  ;level
+tail    = 14  ;level
+lives   = 16  ;game
+reserv  = 17  ;loop
+ ;race:lap
+ ;hunt:time
+input   = 18  ;&
+left    = 19  ;&
+right   = 20  ;&
+name    = 21  ;game
+
+Level =$+1
+DispBuffer =$+2 ;912 bytes
+
+ScrBuffer   = $8000 ;-$A1FF (32x256)
+SinCosTable = $A200 ;-$A300 (4x64)
+
+;-----------------------------
+;----------- end -------------
+;-----------------------------
+
+.end
\ No newline at end of file