wormy 0.96.1C14
[wormy.git] / wormy.z80
1 ; Title                      : Wormy
2 ; Version                    : 96% (0.96.C14)
3 ; Release Date               : UUHHhhh... soon?!?
4 ; Filename                   : wormy.86p (5kb)
5 ; Author(s)                  : Shiar
6 ; Email Address              : wormy@shiar.org
7 ; Web Page                   : www.shiar.org
8 ; Description                : ruling Nibbles-like game 1-4 players
9 ; Where to get this game     : www.shiar.org (home of Wormy)
10 ; Other games by author(s)   : Nemesis beta
11 ; Additional Credits to      : Matthew Shepcar (wrote original Peaworm, end'98)
12 ;                              Jonah Cohen (helped writing worm)
13
14 ;-----------------------------
15 ;----------- TO-DO -----------
16 ;-----------------------------
17
18 ; 96% = DONE
19
20 ;    [* internal levels         ]
21 ;    [  * check levels/gametype ]
22 ;    [  * enough hiscore saves! ]
23 ;    [* complete readme         ]
24 ;  1% * misc (pollish, bugs, &&&)
25 ;  1% * long length save (level#6)
26 ;     * mem at worm #4
27 ;   * LINK
28 ;  1% * transmit game/level data
29 ;      Xfirst packet loss?? or vti onlyXXXXX
30 ;      X1/3 worms over linkXXXX
31 ;      Xsend new peas' positionsXXXXX
32
33 ;100% = bugs fixed + levels done
34
35 ; MAYBE: sound
36 ; NO:    coop
37
38 ;-----------------------------
39 ;-----------------------------
40 ;-------  W O R M Y  ---------
41 ;-----------------------------
42 ;-----------------------------
43
44 #define buffer      ;use display buffer (otherwise write directly to screen)
45 #define readymask   ;"greys" out the field before starting a level
46 #define coolzgfx    ;nice graphics for game over screen
47
48 ;#define readytext  ;displays "prepare" before level starts
49 ;#define invincible ;worms cannot die =)
50 ;#define optdie     ;in race games worms don't die when they run into each other
51
52 #define cal call
53 #define psh push
54 #define dnz djnz
55
56 #include "asm86.h"
57 #include "ti86asm.inc"
58
59 _SHRACC            = $4383 ;4x srl a
60 _SHLACC            = $438B ;4x sll a
61 _divHLby10         = $4044 ;hl=hl/10
62 _divAby10          = $4DAF ;a=a/10
63 _HLTIMES10         = $41BF ;hl=hl*10
64 _cphlde            = $403C ;cp hl,de
65 _clrWindow         = $4A86 ;clear screen
66 _asapvar           = $D6FC ;own name (worm)
67 _MOV4B             = $429B ;4x ld (de),(hl)
68 _MOV5B             = $4297 ;5x ld (de),(hl)
69 _mov9b             = $4283 ;9x ld (de),(hl)
70 _ldHLind           = $4010 ;ld hl,(hl)
71 _swapt_            = $45F3 ;ex_ahl_bde
72 _Get_Word_ahl      = $521D ;ld de,(ahl)
73 _Set_Word_ahl      = $5221 ;ld (ahl),de
74 _INC_PTR_AHL       = $4637 ;ahl=ahl+1
75 _AHL_PLUS_2_PG3    = $4C3F ;ahl=ahl+2
76 _SET_ABS_SRC_ADDR  = $4647 ;set source for mm.ldir =ahl
77 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
78 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
79 _SET_MM_NUM_BYTES  = $464F ;number of bytes for mm.ldir = ahl
80 _mm_ldir           = $52ED ;24bit ldir
81 _MM_LDIR_SET_SIZE  = $524D ;_SET_MM_NUM_BYTES + _mm_ldir
82 _RAM_PAGE_1        = $47E3 ;set $8000+ to page 1
83 _RAM_PAGE_7        = $47F3 ;"""" 7
84 _PTEMP_END         = $D29A ;end of VAT
85 _load_ram_ahl      = $462F ;ahl->page+hl
86 _writeb_inc_ahl    = $5567 ;ld (ahl++),c
87 _jforce            = $409C ;TI-OS stack restored
88 _EXLP              = $4493 ;swap (hl),(de) b times
89 _GETB_AHL          = $46C3 ;a=(ahl) \ hl=ahl
90
91 ;-----------------------------
92 ;------- data  storage -------
93 ;-----------------------------
94
95 ;--- permanent
96
97 ScrBuffer   = $8820 ;-A7FF (20*FF=1FE0)
98 worm2p      = $A800 ;-ABFF (400)      %10101O00
99 worm1       = $AC00 ;-AC1D (31d)
100 worm2       = $AC1F ;-AC3B (1F)
101 worm3       = $AC3E ;-AC59 (1F)
102 worm4       = $AC5D ;-AC77 (1F)
103 balls       = $AC7C ;-ACFF (3x43d)
104 SinCosTable = $AD00 ;-AE00 (4*40)
105         ;free $AE01 ;-AFFF (1FF)
106 worm1p      = $B000 ;-B7FF (800)      %1011O000
107 worm3p      = $B800 ;-BBFF (400)      %10111O00
108         ;free $BF91 ;-BFFF (6F)
109      ;program $D748 ;-EFFF (186D+4A)
110 worm4p      = $F000 ;-F3FF (400)      %11110O00
111 leveldata   = $F400 ;-FA70 (<=671)
112
113 turn10      = $AE01 ;      (1) (counter)
114 peaspos     = $AE02 ;-AE05 (4) (peas)
115
116 ;MEM|8---9---A---B---C---D---E---F---|
117 ;   |..[------]||[]|......[-----]|[].|
118 ;   |   SCREEN 2* 13      PRGM   4LV |
119
120 ;--- temporary
121
122 namelength  = $BC00 ;(1)         @menu
123 datalink    = $BC00 ;(8)         @init
124 #ifdef buffer
125 DispBuffer  = $BC00 ;(10x57d)    @game
126 #else
127 DispBuffer  = $FC70
128 #endif
129
130 ;-----------------------------
131 ;------- program start -------
132 ;-----------------------------
133
134 .org _asm_exec_ram
135
136 wormVhost   = 095
137 wormVclient = 195
138
139 start:
140   nop
141   jp  Start
142   .db 1
143   nop
144   .dw WormTxt
145   .dw WormIcon
146
147 WormTxt:
148   .db "WORMY by SHIAR -- 96% C14",0
149 WormIcon:
150   .db 8,2
151   .db %00000000,%00111100
152   .db %00000000,%01010010
153   .db %00000000,%01100001
154   .db %01100011,%10011001
155   .db %10010100,%01101001
156   .db %10011001,%00011001
157   .db %01000010,%11000001
158   .db %00111100,%00111110
159
160 levelhead  = 'w'
161 levelhead2 = 95 ;wormy levels header = "95"
162
163 int_handler:
164   ex  af,af'
165   in  a,($03)
166   bit 3,a
167   jp  z,$0039
168   res 0,a
169   out ($03),a
170   jp  $0039
171 int_end:
172
173 Start:
174   ld  (SpSave),sp
175   cal _runindicoff
176   cal _flushallmenus
177
178   im  1
179   ld  a,$D4
180   ld  h,a
181   ld  l,0 ;ld hl,$D400
182   ld  d,a
183   ld  e,1 ;ld de,$D401
184   ld  b,e
185   ld  c,l ;ld bc,$0100
186   dec a   ;ld a,$D3
187   ld  (hl),a
188   ldir
189   ld  hl,int_handler
190   ld  d,a
191   ld  e,a ;ld de,$D3D3
192   ld  bc,int_end-int_handler
193   ldir
194   inc a   ;ld a,$D4
195   ld  i,a
196   im  2
197
198   cal _RAM_PAGE_7
199   ld  hl,$BFFF ;VAT start
200   ld  ix,templevels
201 searchloop:
202   ld  de,(_PTEMP_END+1) ;VAT end
203   or  a ;nc
204   sbc hl,de ;hl<de?
205   jr  c,searchcomplete
206   add hl,de
207   psh hl
208   ld  a,(hl)
209   cp  $0C ;string
210   jr  z,stringfound
211 searchnext:
212   pop hl
213   dec hl ;5x
214   dec hl
215   dec hl
216   dec hl
217   dec hl
218   ld  b,(hl) ;name size
219   inc b
220 skipname:
221   dec hl
222   dnz skipname
223   jr  searchloop
224
225 stringfound:
226   dec hl
227   ld  e,(hl)
228   dec hl
229   ld  d,(hl)
230   dec hl
231   ld  a,(hl)
232   ex  de,hl ;ld ahl,(hl)
233   cal _AHL_PLUS_2_PG3 ;string id
234   cal _Get_Word_ahl ;ld de,(ahl)
235   ld (ix),a
236   ld  a,levelhead
237   cp  e
238   jr  nz,_searchnext ;not worm
239   ld  a,levelhead2
240   cp  d
241   jr  nz,_searchnext
242   inc ix ;save level's ahl
243   ld a,h
244   ld (ix),a
245   inc ix
246   ld a,l
247   ld (ix),a
248   inc ix
249 _searchnext:
250   cal _RAM_PAGE_7
251   jr searchnext
252
253 loadgametype:
254   psh de
255   cal _Get_Word_ahl ;ld de,(ahl++)
256   psh af
257   ld  a,e ;set new level
258   ld  (bc),a
259   inc bc
260   ld  a,d
261   ld  (bc),a
262   inc bc
263   pop af
264   pop de ;counter
265   dec d ;8x
266   jr  nz,loadgametype
267   ret
268
269 searchcomplete:
270   ld  a,255
271   ld  (ix),a ;end mark
272
273   ld  ix,templevels-6
274 levelselectmenu:
275   psh ix ;offset
276   ld  a,-2
277   ld  (availevels),a
278   cal _clrWindow
279   ld  hl,$0320
280   ld  (_penCol),hl
281   ld  hl,txtLevsel
282   cal _vputs ;"< SELECT LEVELS >"
283   ld  hl,$FC00+(2*16)
284   ld  b,16*9
285   cal menuinvloop
286   ld  hl,$FC00+(56*16)
287   cal hr
288   ld  hl,$0601 ;x=1
289   ld  (_penCol),hl
290 dispnextlevel:
291   ld  a,(ix+3)
292   ld  b,a
293   inc a ;cp 255
294   jr  z,__levselect
295 displevel:
296   ld  hl,_penCol
297   ld  (hl),$01 ;x=1
298   inc hl
299   ld  a,(hl)
300   add a,6
301   ld  (hl),a ;y+6
302   cp  49 ;bottom of screen
303   jr  nc,_levselect
304   ld  de,3
305   add ix,de
306   ld  hl,availevels
307   inc (hl)
308   ld  a,b ;(ix+0)
309   ld  h,(ix+1)
310   ld  l,(ix+2) ;ahl=(ix)
311   cal _load_ram_ahl ;hl=ahl
312   cal _vputs
313   jr  dispnextlevel
314
315 readylevelfile: ;selected level at ahl
316 ; ld  hl,templevels-3
317   ld  a,b
318   add a,3 ;sellev+3 (#0==-3)
319   ld  e,a
320   add a,a ;*2
321   add a,e ;*3
322   ld  e,a
323   ld  d,0 ;de=sellev*3
324   add hl,de
325   ld  a,(hl) ;ade=(hl)
326   inc hl
327   ld  d,(hl)
328   inc hl
329   ld  e,(hl)
330   ex  de,hl ;ahl=ade
331 skiptitle:
332   ld  d,a ;psh ahl
333   psh hl
334   cal _GETB_AHL ;ld a,(ahl)
335   pop hl
336   or  a
337   ld  a,d ;pop ahl
338   psh af
339   cal _INC_PTR_AHL ;ahl++
340   pop af ;cp 0
341   jr  nz,skiptitle ;goto #0-terminator
342   ret
343
344 levup:
345   cal menupos
346   dec b ;up
347   ld  a,b
348   cp  -3
349   jr  nz,levselect
350   inc b ;undo
351   jr  levselect
352 levdown:
353   cal menupos
354   inc b ;down
355   ld  a,b
356   cp  -2
357 availevels =$-1
358   jr  nz,levselect
359   dec b ;back up
360 levselect:
361   cal menupos
362   ld  hl,$3900
363   ld  (_penCol),hl
364   pop hl
365   psh hl
366   cal readylevelfile
367   cal _load_ram_ahl ;hl=ahl
368   ld  de,$FFA0 ;desc.text
369   xor a
370 levdescclearloop:
371   ld (de),a ;empty
372   inc de
373   cp  d ;de>$FFFF (offscreen)
374   jr  nz,levdescclearloop
375   cal _vputs
376   jr  levselectmenu+1
377 __levselect:
378   ld  ix,templevels-6 ;reset 2 1st page
379 _levselect:
380   ld  b,-2 ;level selected
381   jr  levselect
382 levselectmenu:
383   psh hl
384   psh bc
385   cal ubergetkey
386   pop bc ;GET_KEY destr. b
387   dec a ;cp K_DOWN
388   jr  z,levdown
389   sub K_UP-1
390   jr  z,levup
391   pop hl
392   inc a ;cp K_RIGHT
393   jp  z,levelselectmenu
394   cp  K_ENTER-K_RIGHT
395   jr  z,loadlevel
396   sub K_EXIT-K_RIGHT
397   jp  z,ExitNoStats
398   inc a ;cp K_SECOND
399   jr  nz,levselectmenu
400 ; jr  z,loadlevel
401
402 loadlevel:
403   cal readylevelfile
404   or  a ;levelfile on page 0 (=internal)
405   jr  z,levelloaded
406   cal skiptitle ;skip description
407
408   cal _Get_Word_ahl
409   ld  (leveldataSize),de
410
411   ld  d,8 ;counter
412   ld  bc,datalevels
413   cal loadgametype
414   ld  (hilvlposa),a ;singleplayer levels
415   ld  (hilvlposhl),hl
416   ld  d,4
417   cal loadgametype
418
419   cal _SET_ABS_SRC_ADDR ;levelsstart
420   xor a
421   ld  hl,leveldata
422   cal _SET_ABS_DEST_ADDR ;store in mem.
423   ld  hl,0
424 leveldataSize =$-2
425   cal _MM_LDIR_SET_SIZE
426
427   cal _LOAD_ABS_SRC_ADDR ;->ahl
428   ld  (hiscrposa),a
429   ld  (hiscrposhl),hl
430   cal _RAM_PAGE_1
431
432   ld  hl,leveldata
433   ld  de,defsprsize
434   ldi ;(de),(hl)\inc hl
435   ld  (defsprite),hl
436 levelloaded:
437   cal _RAM_PAGE_1
438
439   res 2,(iy+13) ;appAutoScroll
440   ld  a,r
441   ld  (Seed),a
442
443   ld  hl,datasingle+3
444   ld  b,8
445   ld  de,8
446 setdeflevels:
447   ld  (hl),1 ;def=level#1
448   add hl,de ;next
449   dnz setdeflevels
450
451 ;-----------------------------
452 ;----- build trig tables -----
453 ;-----------------------------
454
455   ld  hl,TrigPrecalc
456   ld  de,SinCosTable
457   psh de
458   ld  bc,65
459   ldir
460   dec hl
461   ld  b,63
462 MirrorSineWave:
463   dec hl
464   ld  a,(hl)
465   ld  (de),a
466   inc de
467   dnz MirrorSineWave
468   pop hl ;SinCosTable
469   ld  b,128+64
470 NegativeSineWave:
471   xor a
472   sub (hl)
473   ld  (de),a
474   inc hl
475   inc de
476   dnz NegativeSineWave
477
478 ;-----------------------------
479 ;---------- menu -------------
480 ;-----------------------------
481
482 DisplayMenu: ;---draw menu---
483   cal linkok
484   cal _clrWindow
485   ld  de,$FC40 ;(0,4)
486   ld  hl,wtPicture
487   ld  bc,16*16
488   ldir
489   ld  hl,$FC00+$010 ;(*,01)
490   cal hr
491   ld  hl,$FC00+$160 ;(*,22)
492   cal hr
493   ld  hl,$FC00+$3E0 ;(*,62)
494   cal hr
495 dispmainmenu:
496   ld  hl,Gametype
497   ld  a,(hl)
498   dec a ;will be inced @changegame
499   and 7
500   ld  (hl),a
501   ld  hl,changegame ;dispmenusets ;mainMenu
502   psh hl ;jump here after ret
503   ld  hl,txtMenu
504   ld  ix,posMenu
505 ;Mode|Level|Limit|Worms|worm #|controls
506 ; jr  dispmenucommon ;cal
507
508 dispmenucommon_:
509   ld  b,36*16/4
510 dispmenucommon:
511   ld  de,$FD80 ;begin pos
512   xor a
513 clroldmenuloop:
514   ld  (de),a
515   inc de
516   ld  (de),a
517   inc de
518   ld  (de),a
519   inc de
520   ld  (de),a
521   inc de
522   dnz clroldmenuloop
523
524   ld  b,(ix)
525 dispmenuloop:
526   ld  d,(ix+1)
527   inc ix
528   ld  e,(ix+1)
529   inc ix
530   ld  (_penCol),de
531   cal _vputs
532   dnz dispmenuloop
533 ; ld  b,0 ;b=menu#
534   ret
535
536 ;hr: ;draw horizontal line at hl
537 ;  ld  b,16
538 ;  jp  menuinvloop
539
540 hr:
541   ld  b,16
542 hrloop:
543   ld  (hl),-1
544   inc hl
545   dnz hrloop
546   ret
547
548 ;--- menu loop ---
549
550 dispoptionmenu:
551   ld  hl,txtoMenu
552   ld  ix,posoMenu
553 ;Back|Lives|Limit|Speed|Rotation|Growth
554   cal dispmenucommon_
555
556 dispomenusets:
557   cal clrold
558
559   ld  hl,$1E3E
560   ld  (_penCol),hl
561   cal loadgamecar
562   psh hl
563   cal cshowA0 ;lives
564
565   ld  hl,$2A3E
566   ld  (_penCol),hl
567   pop hl ;loadgamecar
568   inc hl \ inc hl \ inc hl
569   psh hl
570   ld  a,(hl) ;(Speed)
571   inc a ;1..99
572   jr  nz,dispspeed
573   ld  hl,txtDef
574   cal _vputs
575   jr  dispspeeddone
576 dispspeed:
577   cal cshowA0
578 dispspeeddone:
579
580   ld  hl,$363E
581   ld  (_penCol),hl
582   pop hl ;loadgamecar
583   inc hl
584   psh hl
585   ld  a,(hl) ;(growth)
586   inc a ;-1=None; 0..98->1..99
587   cal cshowA0
588
589   ld  hl,$303E
590   ld  (_penCol),hl
591   pop hl ;loadgamecar
592   inc hl
593   psh hl
594   ld  a,(hl)
595   cp  8
596   jr  nz,dispturn
597   ld  hl,txtDef
598   cal _vputs
599   jr  dispturndone
600 dispturn:
601   cal cshowA0 ;turn speed
602 dispturndone:
603
604   ld  hl,$243E
605   ld  (_penCol),hl
606   pop hl ;loadgamecar
607   inc hl
608   ld  a,(hl) ;(scorelimit)
609   or  a
610   psh af
611   cal cshowA0 ;limit
612   pop af ;a==0?
613   jr  z,optionMenu ;do not display 0 behind 'None'
614   ld  a,'0'
615   cal _vputmap ;x10
616
617 optionMenu:
618   cal menupos
619   cal menucall
620   jr  nz,notoselect
621 oselect:
622   cal menupos
623   ld  a,b
624   or  a ;1st item?
625   jp  z,dispmainmenu ;mainMenu
626   jr  optionMenu
627 notoselect
628   cp  K_EXIT
629   jp  z,dispmainmenu
630   psh af
631   cal menupos
632   cal loadgamecar
633   inc hl
634   pop af
635   sub K_LEFT
636   jr  z,seloleft
637   dec a ;K_RIGHT
638   ld  a,b
639   jr  nz,optionMenu
640
641 seloright:
642   dec a
643   jr  z,changelives
644   dec a
645   jr  z,changelimit
646   dec a
647   jr  z,changespeed
648   dec a
649   jr  z,changeturn
650   dec a
651   jr  z,changegrowth
652
653 seloleft:
654   ld  a,b
655   dec a
656   jr  z,bchangelives
657   dec a
658   jr  z,bchangelimit
659   dec a
660   jr  z,bchangespeed
661   dec a
662   jr  z,bchangeturn
663   dec a
664   jr  z,bchangegrowth
665 _optionMenu:
666   jr  optionMenu
667
668 changelives:
669   cal loadgamecar ;a=(hl)
670   inc a
671   cp  100
672   jr  nc,optionMenu ;>99
673 changedlives:
674   ld  (hl),a
675 _dispomenusets:
676   jp  dispomenusets ;optionMenu
677 bchangelives:
678   cal loadgamecar
679   sub 1 ;dec does not set cf
680   jr  c,optionMenu ;<0
681   jr  changedlives
682
683 changelimit:
684   cal changelimitInit
685   inc a
686   cp  100
687   jr  nc,optionMenu ;>99
688 changedlimit:
689   ld  (hl),a
690   jr  _dispomenusets ;optionMenu
691 bchangelimit:
692   cal changelimitInit
693   sub 1 ;dec does not set cf
694   jr  c,optionMenu ;<0
695   jr  changedlimit
696 changelimitInit:
697   cal loadgamecar
698   ld  de,6
699   add hl,de
700   ld  a,(hl) ;(scorelimit)
701   ret
702
703 changespeed:
704   cal changespeedInit
705   inc a
706   cp  20
707   jr  nc,_optionMenu ;>98
708 changedspeed:
709   dec hl ;(Speed)
710   ld  (hl),a
711   jr  _dispomenusets ;optionMenu
712 bchangespeed:
713   cal changespeedInit
714   dec a
715   cp  -2
716 __optionMenu: ;w/ zf
717   jr  z,_optionMenu ;<-1
718   jr  changedspeed
719 changespeedInit:
720   cal loadgamecar
721   ld  de,3
722   add hl,de
723   ld  a,(hl) ;(Speed)
724   inc hl ;=saves 2 bytes :P
725   ret
726
727 changeturn:
728   cal changespeedInit
729   inc hl ;(turnspeed)
730   ld  a,(hl)
731   inc a
732   cp  26
733   jr  nc,_optionMenu ;>25
734 changedturn:
735   ld  (hl),a
736   jr  _dispomenusets ;optionMenu
737 bchangeturn:
738   cal changespeedInit
739   inc hl
740   ld  a,(hl)
741   dec a
742   cp  3
743   jr  c,_optionMenu ;<3
744   jr  changedturn
745
746 changegrowth:
747   cal changespeedInit
748   ld  a,(hl)
749   inc a
750   cp  99
751   jr  nc,_optionMenu ;>98
752 changedgrowth:
753   ld  (hl),a
754   jr  _dispomenusets ;optionMenu
755 bchangegrowth:
756   cal changespeedInit
757   ld  a,(hl)
758   dec a
759   cp  -2
760   jr  z,__optionMenu ;<-1
761   jr  changedgrowth
762
763 ;---
764
765 mainMenu:
766   cal menupos
767   cal menucall
768   jr  nz,notselect
769 select:   ;2nd/enter
770   cal menupos
771   ld  a,b
772   dec a ;2nd item: level
773   jp  z,dispoptionmenu
774   sub 3 ;5th item: wormname
775   jp  z,changeworms
776   dec a ;6th: controls
777   jp  z,changekeys
778   jp  LetsGetThisPartyOn ;otherwise
779 notselect
780   cp  K_EXIT
781   jp  z,ExitNoStats
782   psh af
783   cal menupos
784   cal loadgamecar
785   inc hl
786   pop af
787   sub K_LEFT
788   jr  z,selleft
789   dec a ;K_RIGHT
790   ld  a,b
791   jr  nz,mainMenu
792
793 selright:
794   or  a
795   jr  z,changegame
796   dec a
797   jr  z,changelevel
798   dec a
799   jr  z,changelink
800   dec a
801   jr  z,changenrworms
802 ; dec a
803 ; jr  z,changecurworm
804
805 changecurworm:
806 ; hl=nrworms
807   ld  a,(curworm)
808   cp  (hl)
809   jr  nc,mainMenu ;may not become >(nrworms)
810   inc a
811 changedcurworm:
812   ld  (curworm),a
813   jr  _dispmenusets ;mainMenu
814
815 selleft:
816   ld  a,b
817   or  a
818   jr  z,bchangegame
819   dec a
820   jr  z,bchangelevel
821   dec a
822   jr  z,bchangelink
823   dec a
824   jr  z,bchangenrworms
825 ; dec a
826 ; jr  z,bchangecurworm
827
828 bchangecurworm:
829   ld  a,(curworm)
830   dec a ;0-3
831   jr  nz,changedcurworm ;save >0
832   jr  mainMenu
833
834 changenrworms:
835   cal change4spOnly
836   ld  a,(hl) ;hl=nrworms
837   inc a
838   cp  5
839   jr  nc,mainMenu ;may not be >4
840 changednrworms:
841   ld  (hl),a
842   jr  _dispmenusets ;mainMenu
843 changenrwormsInit:
844   ld  a,(Gametype)
845   cp  3
846   ld  a,(hl) ;hl=nrworms
847   ret
848 bchangenrworms:
849   cal change4spOnly
850   ld  a,(hl) ;hl=nrworms
851   dec a ;0-3
852   cp  2
853   jr  nc,changednrworms ;save >=2
854 _mainMenu:
855   jr  mainMenu
856
857 change4spOnly:
858   ld  a,(Gametype)
859   cp  3
860   ret nc
861   pop hl ;cal
862   jr  _mainMenu ;don't change for singleplayer
863
864 changelink:
865 bchangelink:
866   cal change4spOnly
867   dec hl ;inced earlier
868   dec hl ;gameCar
869   ld  a,1 ;change LS-bit (=link)
870   xor (hl) ;0=1; 1=0
871   ld  (hl),a
872 _dispmenusets:
873   jr  dispmenusets ;mainMenu
874
875 changegame:
876   ld  a,(Gametype)
877   inc a
878   cal changedgame
879   jr  z,changegame
880   jr  dispmenusets ;mainMenu
881 changedgame:
882   and 7 ;mod 8
883   ld  (Gametype),a
884   cal getnrlevels
885   xor a
886   cp  (hl)
887   ret
888 bchangegame:
889   ld  a,(Gametype)
890   dec a
891   cal changedgame
892   jr  z,bchangegame
893   jr  dispmenusets ;mainMenu
894
895 changelevel:
896   inc hl ;hl=loadgamecar+2
897   psh hl
898   ld  a,(hl) ;(curlevel)
899   cal getnrlevels
900   cp  (hl) ;max level for sel.game
901   pop hl
902   jr  z,_mainMenu
903   inc a
904 changedlevel:
905   ld  (hl),a
906   jr  dispmenusets ;mainMenu
907 bchangelevel:
908   inc hl
909   ld  a,(hl) ;(curlevel)
910   dec a
911   jr  nz,changedlevel
912   jr  _mainMenu
913
914 getnrlevels: ;for current gametype at hl
915   ld  hl,Gametype
916   ld  d,0
917   ld  e,(hl)
918   ld  hl,nrlevels
919   add hl,de
920   ret
921
922 getcustomkey:
923   cal _vputs
924   dec ix
925 waitcustomkey:
926   psh hl
927   cal ubergetkey
928   pop hl
929   or  a
930   jr  z,waitcustomkey
931   cp  K_EXIT
932   ret z
933   cp  K_MORE
934   jr  z,waitcustomkey
935   ld  (ix),a
936   ret
937
938 changekeys:
939   cal getwormname
940   ld  hl,txtKeyleft
941   cal getcustomkey ;left
942   cal getcustomkey ;right
943 ; jr  dispmenusets
944
945 ;---display current settings---
946
947 dispmenusets:
948   cal clrold
949   ld  de,$183E
950   ld  (_penCol),de
951   ld  d,0
952   ld  a,(Gametype)
953   ld  e,a
954   ld  hl,posGame
955   add hl,de ;hl=posGame+(Gametype)
956   ld  a,(hl) ;str.offset
957   ld  e,a ;^d=0^
958   ld  hl,txtGame
959   add hl,de ;txtGameX
960   ld  (CURtxtGame),hl ;save for g/o
961   cal _vputs ;Singleplayer
962
963   ld  hl,$2A3E ;worms
964   ld  (_penCol),hl
965   cal loadgamecar
966   psh hl
967   inc hl
968   ld  a,(hl)
969   add a,'0'
970   cal _vputmap
971
972   ld  hl,$243E
973   ld  (_penCol),hl
974   rr  c ;(gameCar)
975   ld  hl,txtNo
976   jr  nc,displink
977   ld  hl,txtYes
978 displink:
979   cal _vputs
980
981   ld  hl,$1E3E ;level
982   ld  (_penCol),hl
983   pop hl ;loadgamecar
984   psh bc
985   ld  d,0
986   cal hlatlevel
987   ld  a,(Gametype)
988   or  a ;gamesingle
989   jr  nz,displvlname
990   ld  a,(Level)
991   cal cshowA0
992   jr  lvldisped
993 displvlname:
994   cal _vputs
995 lvldisped:
996   pop bc
997
998   ld  hl,$3032
999   ld  (_penCol),hl
1000   ld  a,1
1001 curworm =$-1
1002   add a,'0'
1003   cal _vputmap
1004   ld  hl,$303E
1005   ld  (_penCol),hl
1006   cal getwormname
1007   psh ix ;wormNname
1008   pop hl ;ld hl,ix
1009   cal _vputs
1010   ld  hl,$363E ;controls
1011   ld  (_penCol),hl
1012   ld  hl,txtMenuR
1013   cal _vputs
1014   jp  mainMenu
1015
1016 ;--- handle menukeys ---
1017
1018 menucall:
1019   psh bc
1020 menuwaitkey:
1021   cal ubergetkey
1022   or  a
1023   jr  z,menuwaitkey
1024   pop bc ;GET_KEY destr. b
1025   cp  K_UP
1026   cal z,menuup
1027   cp  K_DOWN
1028   cal z,menudown
1029   cp  K_ENTER
1030   ret z
1031   cp  K_SECOND
1032   ret ;z=select
1033
1034 menupos: ;highlight #b
1035   ld  c,b ;psh b
1036   ld  a,b
1037   add a,3
1038   add a,a
1039   add a,a
1040   sub b
1041   add a,a
1042   add a,a
1043   add a,a ;*24
1044   ld  h,$FC/4
1045   ld  l,a
1046   add hl,hl
1047   add hl,hl ;$FD20+item*96
1048   ld  b,16*7
1049 menuinvloop:
1050   ld  a,(hl)
1051   cpl
1052   ld  (hl),a
1053   inc hl
1054   dnz menuinvloop
1055   ld  b,c ;pop b
1056   ret ;a=-1
1057 menudown:
1058   cal menupos
1059   inc b
1060   jr  menuupdown
1061 menuup:
1062   cal menupos
1063   dec b
1064 menuupdown:
1065   ld  a,b
1066   cp  6
1067   jr  nz,menunewchk
1068   xor a ;6=0
1069 menunewchk:
1070   inc b
1071   jr  nz,menunewok
1072   ld  a,5 ;-1=5
1073 menunewok:
1074   ld  b,a
1075   jr  menupos
1076
1077 ;--- change name ---
1078 ; of worm#(curworm)
1079
1080 getwormname: ;of (curworm)
1081   ld  a,(curworm)
1082   add a,a  ;2x
1083   ld  e,a
1084   add a,a  ;4x
1085   add a,a  ;8x
1086   add a,a ;16x
1087   add a,e ;18x
1088   ld  e,a
1089   ld  d,0 ;de=a
1090
1091   ld  ix,worm1name-18
1092   add ix,de
1093   ret
1094
1095 changeworms:
1096   cal getwormname
1097   psh ix
1098   pop hl ;ld hl,ix
1099   psh hl
1100   ld  b,8
1101 emptyname:
1102   ld  (hl),' '
1103   inc hl
1104   dnz emptyname
1105   ld  a,maxnamelength
1106   ld  (namelength),a
1107 enternameloop:
1108   ld  hl,$FF07 ;begin pos
1109   ld  a,6 ;nr of lines
1110   cal clroldcustom
1111   ld  hl,$303E
1112   ld  (_penCol),hl
1113   pop hl
1114   psh hl
1115   ld  (ix),0
1116   cal __vputs
1117   ld  (ix),' '
1118   ld  a,'_'
1119   cal __vputmap
1120 nokeypressed:
1121   cal ubergetkey
1122   or  a
1123   jr  z,nokeypressed
1124
1125   ld  hl,namelength
1126   cp  K_DEL
1127   jr  nz,continue
1128 backspace:
1129   ld  a,(hl)
1130   cp  maxnamelength
1131   jr  nc,nokeypressed
1132   inc (hl)
1133   dec ix
1134   jr  enternameloop
1135 continue:
1136   cp  K_ENTER
1137   jr  z,nameentered
1138   cp  K_EXIT
1139   jr  z,nameentered
1140
1141   dec (hl) ;(namelength)
1142   jr  z,nameentered
1143   ld  hl,chartable
1144   ld  e,a
1145   ld  d,0
1146   add hl,de
1147   ld  a,(hl)
1148   or  a
1149   jr  z,nokeypressed
1150   ld  (ix),a
1151   inc ix
1152   cal releasekeys
1153   jr  enternameloop
1154
1155 chartable:
1156   .db 0,".<>!",0,0,0,0  ;down,L,R,up
1157   .db 0,"XTOJE0",0      ;enter..clear
1158   .db " WSNID9",0       ;(-)..custom
1159   .db "ZVRMHC8",0       ;dot..del
1160   .db "YUQLGB7#"        ;0..xvar
1161   .db $D9,"-PKFA6'"     ;on..alpha
1162   .db "54321*",0,$D0    ;F5..more
1163
1164 nameentered:
1165   pop ix ;stringbegin
1166   ld  (ix+8),0 ;end mark
1167   jp  DisplayMenu
1168
1169 ;-----------------------------
1170 ;------- procs-n-stuff -------
1171 ;-----------------------------
1172
1173 ubergetkey:
1174   halt ;woo hoo
1175   halt ;save them batteries! yeah!
1176   jp  GET_KEY
1177
1178 clrold:
1179   ld  hl,$FD97 ;begin pos
1180   ld  a,35 ;nr of lines
1181 clroldcustom:
1182   ld  de,7 ;bytes to add
1183 clroldsettings:
1184   ld  c,9 ;bytes to clear
1185 clroldsetsloop:
1186   ld  (hl),d ;=0
1187   inc hl
1188   dec c
1189   jr  nz,clroldsetsloop
1190   add hl,de
1191   dec a
1192   jr  nz,clroldsettings
1193   ret
1194
1195 hlatlevel: ;d must be 0
1196   psh hl ;loadgamecar
1197   ld  a,(Gametype) ;8bytes -> 7bytes
1198   ld  e,a
1199   add a,a ;nc
1200   add a,e
1201   add a,a ;8->2bytes
1202   add a,24+1 ;go to datalevels
1203   ld  e,a ;=de
1204   sbc hl,de ;datalevels
1205   cal _ldHLind ;ld hl,(hl)
1206   pop de ;de=loadgamecar
1207   inc de \ inc de
1208   ld  a,(de) ;(curlevel)
1209   ld  (Level),a
1210   ld  d,a ;begin level
1211 skiplevelloop:
1212   dec d ;levels to skip
1213   ret z
1214   cal skiplevel
1215   jr  skiplevelloop
1216   ret ;hl=begin of correct level
1217
1218 skiplvltitle: ;zf=singleplayer
1219   ld  a,(hl)
1220   or  a ;null-terminator
1221   inc hl
1222   jr  nz,skiplvltitle
1223   ret
1224
1225 skiplevel: ;@hl - destr:ab - alter:hl
1226   ld  a,(Gametype)
1227   or  a ;gamesingle
1228   psh af
1229   cal nz,skiplvltitle
1230   inc hl
1231   inc hl
1232   inc hl
1233   inc hl ;skip 4
1234   ld  b,(hl) ;spritesize
1235   inc b
1236 skipsprite:
1237   inc hl
1238   dnz skipsprite
1239   ld  b,(hl) ;balls
1240   inc b
1241   inc b ;skip 6
1242   pop af ;cp (Gametype),0
1243   jr  z,skipworms
1244   inc b ;multiplayer lvl
1245   inc b
1246   inc b ;skip other 3 worms (9 bytes)
1247 skipworms:
1248   ld  a,b
1249   add a,a
1250   add a,b
1251   ld  b,a ;3x(balls+2)
1252 skipballs:
1253   inc hl
1254   dnz skipballs
1255
1256 skipflags:
1257   ld  a,(Gametype)
1258   cp  gamectf
1259   jr  nz,noflagstoskip
1260   inc hl
1261   inc hl
1262   inc hl
1263   inc hl
1264 noflagstoskip:
1265
1266 skipobjects:
1267   xor a
1268   or  (hl)
1269   inc hl ;nf
1270   ret z ;0=end
1271   inc hl
1272   inc hl
1273   inc hl
1274   inc hl
1275   jr  skipobjects
1276
1277 loadgamecar:
1278 ;in:    (Gametype)
1279 ;out:   hl=dataTYPE
1280 ;build: c=(gameCar)=(hl-1)
1281 ;       a=(wormbeglives)=(hl)
1282 ;destr: acdehl
1283   ld  hl,datasingle
1284   ld  a,(Gametype)
1285   add a,a
1286   add a,a
1287   add a,a ;8 bytes per mode
1288   ld  e,a
1289   ld  d,0
1290   add hl,de
1291   ld  a,(hl)
1292   ld  (gameCar),a
1293   ld  c,a
1294   inc hl
1295   ld  a,(hl)
1296   ld  (wormbeglives),a
1297   ret
1298
1299 ;-----------------------------
1300 ;-------- start game ---------
1301 ;-----------------------------
1302
1303 LetsGetThisPartyOn:
1304   ld  a,$17 ;no exit
1305   ld  (CheckExit),a ;set exit state
1306
1307   cal loadgamecar
1308   psh hl
1309   cal hlatlevel
1310   ex  (sp),hl ;pop \ psh leveldata
1311   psh hl ;psh loadgamecar
1312   ld  a,0
1313 gameCar =$-1
1314   rra ;and _datalink
1315   jp  nc,StartLevel ;&&&jr
1316
1317 ;--------- link ------------
1318
1319 linkmatch:
1320   cal _clrWindow
1321   ld  c,wormVhost
1322   cal Qsend
1323   ld  hl,txtWaiting
1324   cal _puts
1325   cal Crecv
1326   ld  a,c
1327   cp  wormVclient
1328   jr  z,client
1329   cp  wormVhost
1330   jr  z,host
1331   pop hl ;error
1332   jp  DisplayMenu ;return to menu
1333
1334 host:
1335   ld  c,wormVclient
1336   cal Qsend
1337   jr  sethost
1338 client:
1339   ld  hl,txtReceive
1340   cal _puts
1341 setclient:
1342  ;name/keys: wormy#1 = link    = 0  + link (name1)
1343  ;                 2 = worm #1 = #1 + local(name1)
1344  ;                 3 = link    = 0  + link (name2)
1345  ;                 4 = worm #2 = #2 + local(name2)
1346   ld  de,worm2+left
1347   ld  hl,worm1+left
1348   ldi ;keys worm#2 = worm#1
1349   ldi ;+right
1350   ld  de,worm4+left
1351   ldi ;keys worm#4 = worm#2
1352   ldi
1353   xor a
1354   ld  (worm1+left),a ;worm 1...
1355   ld  (worm3+left),a ;and worm 3 via link
1356   ld  hl,worm1+name
1357   ld  b,9
1358   cal recvstuff
1359   ld  hl,worm2+name
1360   ld  b,9
1361   cal sendstuff
1362   pop hl
1363   pop de
1364   psh de
1365   psh hl
1366   ld  b,168
1367   cal sendstuff
1368   ex  de,hl
1369   ld  b,8
1370   cal sendstuff
1371   jr  StartLevel
1372 sendstuff:
1373   psh de
1374 sendstuffloop:
1375   psh bc
1376   ld  c,(hl)
1377   inc hl
1378   cal Qsend
1379   pop bc
1380   dnz sendstuffloop
1381   pop de
1382   ret
1383 recvstuff:
1384   psh de
1385 recvstuffloop:
1386   psh bc
1387   cal Qrecv
1388   ld  (hl),c
1389   inc hl
1390   pop bc
1391   dnz recvstuffloop
1392   pop de
1393   ret
1394 sethost:
1395  ;name/keys: wormy#1 = worm #1 = ok
1396  ;                 2 = link    = 0  + link (name1)
1397  ;                 3 = worm #2 = #2 + local(name2)
1398  ;                 4 = link    = 0  + link (name2)
1399   ld  de,worm3+left
1400   ld  hl,worm2+left
1401   ldi ;keys worm#3 = worm#2
1402   ldi ;+right
1403   xor a
1404   ld  (worm2+left),a ;worm 2+4..
1405   ld  (worm4+left),a ;..over link
1406   ld  hl,worm1+name
1407   ld  b,9
1408   cal sendstuff
1409   ld  hl,worm2+name
1410   ld  b,9
1411   cal recvstuff
1412   pop hl
1413   pop de
1414   ld  hl,templevels
1415   ld  de,datalink
1416   psh de
1417   psh hl
1418   ld  b,168
1419   cal recvstuff
1420   ex  de,hl
1421   ld  b,8
1422   cal recvstuff
1423
1424 ;-------- load level ---------
1425
1426 StartLevel:
1427   pop hl ;loadgamecar
1428   ld  a,(hl)
1429   ld  (wormbeglives),a
1430   inc hl ;nrworms
1431   ld  a,(hl)
1432   ld  (nrworms),a
1433   inc hl ;level
1434   inc hl
1435   ld  a,(hl)
1436   ld  (customspeed),a
1437   inc hl
1438   ld  a,(hl)
1439   ld  (growspeed),a
1440   inc hl
1441   ld  a,(hl)
1442   ld  (turnleft),a
1443   ld  (turnright),a ;more efficient
1444   inc hl
1445   ld  l,(hl)
1446   ld  h,0
1447   cal _HLTIMES10 ;hl=10*(hl)
1448   ld  (scorelimit),hl
1449
1450 setupworms:
1451   ld  hl,worm1set
1452   ld  de,worm1
1453   ld  a,4 ;4x (all worms)
1454 createwormsloop:
1455   ex  de,hl
1456   ld  bc,died ;8
1457   add hl,bc
1458 ; ld  b,0
1459   ld  (hl),b ;died=0
1460   inc hl
1461   ld  (hl),b ;score=0
1462   inc hl
1463   ld  (hl),b ;score+1=0
1464   inc hl
1465   ld  (hl),2 ;delay=2
1466   inc hl
1467   ld  (hl),3 ;lives=x
1468 wormbeglives =$-1
1469   inc hl
1470   ex  de,hl  ;de=wormX+head
1471   ld  bc,18
1472   ldir       ;copy 18 bytes
1473   dec a      ;loop
1474   jr  nz,createwormsloop
1475
1476 Nextlevel:
1477   cal _clrWindow
1478   pop hl ;begin of current level
1479   ld  a,(hl)
1480   inc a ;=255?
1481   jp  nz,donextlevel
1482
1483   psh hl
1484   ld  hl,Level
1485   dec (hl) ;curlevel-- (not beyond last lvl)
1486   cal releasekeys
1487   pop hl
1488 ;show end msg or smtn
1489   ld  bc,Exit
1490   psh bc   ;where to go afterwards
1491   inc hl   ;location of ending-code
1492   jp  (hl) ;go there ("call")
1493 donextlevel:
1494   ld  a,(Gametype)
1495   or  a ;gamesingle
1496   psh af
1497   cal nz,skiplvltitle
1498   ld  de,Left
1499   ldi
1500   ld  de,Speed
1501   ld  a,0
1502 customspeed =$-1
1503   inc a ;$FF=def
1504   jr  nz,setspeed
1505   ld  a,(hl) ;speed from level
1506   inc a
1507 setspeed:
1508   dec a
1509   ld  (de),a ;custom speed
1510   inc hl
1511   ld  de,peagrowth
1512   ldi
1513   ld  a,(hl)
1514   ld  (worm1+grow),a
1515   ld  (worm2+grow),a
1516   ld  (worm3+grow),a
1517   ld  (worm4+grow),a
1518   ld  (beginsize),a
1519   inc hl
1520
1521   ld  a,(hl)
1522   inc hl
1523   or  a
1524   jr  z,defaultsprite
1525   ld  d,h
1526   ld  e,l ;ld de,hl
1527   ld  c,a
1528   ld  b,0 ;bc=sprite size
1529   add hl,bc ;hl=behind sprite
1530   jr  setsprite
1531 defaultsprite:
1532   ld  a,defspritesz
1533 defsprsize =$-1
1534 defsprite  =$+1
1535   ld  de,defspriteimg
1536 setsprite: ;de=@sprite ;a=sprsize
1537   ld  (sprsize),a
1538   ld  (spritepos),de
1539
1540   ld  a,(hl)
1541   inc hl
1542   ld  (nrballs),a
1543   or  a
1544   jr  z,toobad_noballs
1545   ld  c,a
1546   add a,a
1547   add a,c
1548   ld  c,a
1549   ld  b,0
1550   ld  de,balls
1551   ldir
1552 toobad_noballs:
1553
1554   ex  de,hl
1555 #ifndef invincible
1556   ld  (thislevel),de
1557 #endif
1558
1559   ld  hl,worm1
1560   pop af ;cp (Gametype),0
1561   ld  b,1
1562   jr  z,worminit
1563   ld  b,4
1564 worminit:
1565   psh bc ;>1
1566   ex  de,hl
1567   ldi        ;d
1568   ld  a,SinCosTable/256
1569   ld  (de),a
1570   inc de
1571   ldi        ;y
1572   ldi        ;x
1573   ex  de,hl
1574   xor a
1575   ld  (hl),a ;y2
1576   inc hl
1577   ld  (hl),a ;x2
1578
1579   ld  bc,(worm2-worm1)-5
1580   add hl,bc
1581   pop bc ;<0
1582   dnz worminit
1583
1584   inc a ;ld a,1
1585   ld  (turn10),a
1586   inc a ;ld a,2
1587   ld  (flashtime),a
1588
1589 ;-------- draw level ---------
1590
1591 initlevel:
1592   ld  a,(de)
1593   inc de
1594   sub 128
1595   jr  nc,setfieldx
1596   xor a ;fieldx<128
1597 setfieldx:
1598   ld  (FieldWidth),a
1599   ld  a,(de)
1600   inc de
1601   ld  l,a
1602   sub 57
1603   jr  nc,setfieldy
1604   xor a ;fieldy<57
1605 setfieldy:
1606   ld  (FieldHeight),a
1607   psh de                        ; >> levelp
1608   ld  a,l ;pop
1609   sub 5
1610   ld  l,a
1611   ld  h,0
1612   add hl,hl
1613   add hl,hl
1614   add hl,hl
1615   add hl,hl
1616   add hl,hl ;32=scr.width
1617   ex  de,hl
1618
1619   ld  hl,ScrBuffer
1620   psh hl                        ; >> 1
1621   psh de                        ; >> 2
1622   ld  de,ScrBuffer+1
1623   ld  bc,63 ;first 2 rows
1624   ld  (hl),%11111111
1625   ldir ;draw upper border
1626   inc hl
1627   ld  (hl),%11000000 ;first left border
1628   inc hl
1629   ld  b,31
1630 ClearLine:
1631   ld  (hl),c ;=0
1632   inc hl ;clear rest of line
1633   dnz ClearLine
1634   psh hl                        ; >> 3
1635
1636   ld  a,(FieldWidth)
1637   add a,126
1638   psh af                        ; >> 4
1639   and %11111000
1640   rra
1641   rra
1642   rra
1643   ld  l,a
1644   ld  h,c ;0
1645   add hl,de
1646   pop af                         ; << 3
1647   and %00000111
1648   ld  b,a
1649 ; ld  c,0
1650   ld  a,%11000000
1651   jr  z,NoVertShift
1652 VertShift:
1653   rra
1654   rr  c
1655   dnz VertShift
1656 NoVertShift:
1657   ld  (hl),a
1658   inc hl
1659   ld  (hl),c
1660
1661   ex  de,hl
1662   pop de                         ; << 2
1663   pop bc                         ; << 1
1664   ldir
1665   pop hl                         ; << 0k
1666   ld  c,64
1667   ldir
1668
1669
1670   pop hl                         ; << levelp
1671   ld  a,(Gametype)
1672   cp  gamerace ;or gamectf
1673   jr  c,levelhasbeensetup
1674   ld  de,peaspos
1675   ld  c,2 ;ld bc,2 (2 bytes)
1676   jr  z,loadextralevelstuff ;cp gamerace
1677   ld  c,4 ;ld bc,4 (2nd flag in ctf)
1678 loadextralevelstuff:
1679   ldir
1680   ld  a,1 ;draw delay
1681   ld  (drawctfpea1),a
1682   ld  (drawctfpea2),a
1683 levelhasbeensetup:
1684
1685   cal drawstuff
1686
1687 ;--------- prepare -----------
1688
1689 leveldone:
1690   psh hl                        ; >> levelp new
1691   cal forceshowstats
1692
1693 #ifdef readymask
1694   ld  hl,$FC70
1695   ld  d,%10101010
1696   ld  c,56
1697 maskloop:
1698   ld  a,d
1699   xor %11111111
1700   ld  d,a
1701   ld  b,$10
1702 maskline:
1703   ld  a,(hl)
1704   or  d
1705   ld  (hl),a
1706   inc hl
1707   dnz maskline
1708   dec c
1709   jr  nz,maskloop
1710 #endif
1711 #ifdef readytext
1712   ld  hl,$FDE0
1713   ld  de,$FDE1
1714   ld  (hl),%11111111
1715   ld  bc,$BF
1716   ldir
1717   ld  hl,4+(txtposReady*256)
1718   ld  (_curRow),hl
1719   set 3,(iy+5)
1720   ld  hl,txtReady
1721   cal _puts
1722   res 3,(iy+5)
1723 #endif
1724
1725   ld  a,(gameCar)
1726   and _datafood
1727   jr  z,nofood
1728   ld  ix,worm1
1729   cal NewPea
1730 nofood:
1731   ld  bc,(worm1+pos)
1732   cal DisplayField
1733
1734   ld  b,startdelay
1735 ReadyDelay:
1736   halt
1737   dnz ReadyDelay
1738   cal releasekeys
1739
1740 ;-----------------------------
1741 ;----------- LOOP ------------
1742 ;-----------------------------
1743
1744 GameLoop:
1745   ld  bc,(worm1+pos) ;camera worm #1
1746   ld  a,(worm1+left)
1747   or  a ;if #1 not over link
1748   jr  nz,showfield
1749   ld  bc,(worm2+pos) ;otherwise view from #2
1750 showfield:
1751   cal DisplayField ;display piece of level
1752
1753   ld  a,1
1754 flashtime =$-1
1755   dec a
1756   jr  z,noflash
1757   ld  (flashtime),a
1758   ld  hl,$fc00+(16*7)
1759 screeninvertloop:
1760   ld  a,(hl)
1761   cpl
1762   ld  (hl),a
1763   inc hl
1764   xor a
1765   cp  h ;end at >$FFFF
1766   jr  nz,screeninvertloop
1767 noflash:
1768
1769   ld  a,0
1770 Speed =$-1
1771   or  a
1772   jr  z,NoDelay
1773 Delay:
1774   halt
1775   dec a
1776   jr  nz,Delay
1777 NoDelay:
1778
1779   ld  (handledworm),a ;reset
1780
1781   ld  hl,turn
1782   ld  a,(hl)
1783   inc a ;-1
1784   jr  z,nextturnok
1785   dec (hl)
1786   dec a ;0 (now <0)
1787   jr  nz,nextturnok
1788 growspeed =$+1
1789   ld  (hl),$FF
1790 nextturnok:
1791
1792   ld  a,(gameCar)
1793   and _datatime
1794   jr  z,nodispupdate
1795   ld  hl,turn10
1796   dec (hl)
1797   jr  nz,nodispupdate ;just once every 10 turns
1798   ld  (hl),10 ;reset counter
1799   cal forceshowstats ;update score
1800 nodispupdate:
1801
1802   ld  a,(Gametype)
1803   cp  gamectf
1804   jr  nz,noctfpeas2draw
1805   ld  de,drawctfpea1
1806   ld  hl,(peaspos)
1807   cal tryDrawPea ;pea#1
1808   ld  de,drawctfpea2
1809   ld  hl,(peaspos+2)
1810   cal tryDrawPea ;pea#2
1811 noctfpeas2draw:
1812
1813
1814   ld  a,0
1815 nrballs =$-1
1816   or  a
1817   cal nz,handlethoseneatlittleballs
1818
1819   ld  ix,worm1
1820   ld  a,1
1821 nrworms =$-1
1822   ld  b,a
1823 handleworms:
1824   psh bc
1825   cal HandleWorm
1826   ld  bc,worm2-worm1
1827   add ix,bc
1828   pop bc
1829   ld  hl,handledworm
1830   inc (hl) ;0..nrworms-1
1831   dnz handleworms
1832
1833 ;-----------------------------
1834 ;---------- keys -------------
1835 ;-----------------------------
1836
1837 HandleKeys:
1838   ld  a,%10111111
1839   out (1),a
1840   in  a,(1)
1841   rla ;MORE?
1842   jr  nc,disppausemenu
1843 CheckExit:
1844   rla  ;=$17 (c=EXIT-key)
1845       ;or$A7 (c=0)
1846   jp  c,GameLoop
1847   jp  Exit ;jr?
1848
1849 ;------- pause menu -------
1850
1851 disppausemenu:
1852   ld  hl,txtpMenu
1853   ld  ix,pospMenu
1854 ;Resume|Turn Off|Contrast|Exit||
1855   ld  b,25*16/4
1856   cal dispmenucommon
1857   ld  hl,$FC00+$170 ;(*,23)
1858   cal hr
1859   ld  hl,$FC00+$310 ;(*,49)
1860   cal hr
1861   cal menupos
1862
1863 pauseMenu:
1864   psh bc
1865 pmenuwaitkey:
1866   cal ubergetkey
1867   or  a
1868   jr  z,pmenuwaitkey
1869   pop bc ;GET_KEY
1870   ld  d,b ;c=new b
1871   cp  K_UP
1872   jr  nz,pmenunotup
1873   dec d
1874 pmenunotup:
1875   cp  K_DOWN
1876   jr  nz,pmenunotdown
1877   inc d
1878 pmenunotdown:
1879   psh af
1880   cal menupos
1881   ld  a,d ;new pos
1882   and 3 ;0-3
1883   ld  b,a
1884   cal menupos
1885   pop af
1886   cp  K_ENTER
1887   jr  z,pselect
1888   cp  K_SECOND
1889   jr  nz,notpselect
1890 pselect:
1891   ld  a,b
1892   or  a ;1: continue
1893   jr  z,donepausing
1894   dec a ;2: off
1895   jr  z,turnoff
1896   dec a ;3: contrast
1897   jr  z,pauseMenu
1898   jr  Exit ;4: exit
1899 notpselect
1900   cp  K_EXIT
1901   jr  z,donepausing
1902   ld  hl,CONTRAST
1903   sub K_LEFT
1904   jr  z,contrastdown
1905   dec a ;K_RIGHT
1906   jr  nz,pauseMenu
1907 contrastup:
1908   inc (hl)
1909   jr  setcontrast
1910 contrastdown:
1911   dec (hl)
1912 setcontrast:
1913   ld  a,(hl)
1914   out (2),a
1915   jr  pauseMenu
1916
1917 turnoff:
1918   ld  bc,$0103
1919   out (c),b
1920   halt ;pause/off
1921   ld  b,11
1922   out (c),b
1923   ld  b,1
1924   jr  pauseMenu
1925
1926 donepausing:
1927   cal releasekeys
1928   jp  GameLoop
1929
1930 Exit:
1931   cal releasekeys
1932   ld  sp,0 ;pop all
1933 SpSave = $-2
1934   ld  a,D0LD1L
1935   out (7),a     ;both wires low = game over signal
1936   cal _clrWindow
1937 #ifdef coolzgfx
1938   ld  de,$FC30 ;(0,1)
1939   ld  hl,wtWormy
1940   ld  bc,16*7
1941   ldir
1942   ld  hl,$FC10
1943   ld  b,16*11
1944   cal menuinvloop ;invert
1945   ld  hl,$FD80
1946   cal hr ;menuinvloop w/ b=16
1947   ld  hl,$FCE0
1948   cal hr
1949   ld  hl,_curRow
1950   ld  (hl),2
1951 #else
1952   ld  hl,txtGO
1953   cal _puts
1954   ld  hl,$FC00
1955   ld  b,16*8
1956   cal menuinvloop ;invert
1957   inc h ;$FD80
1958   cal hr ;menuinvloop w/ b=16
1959   ld  hl,$FCE0
1960   cal hr
1961   ld  hl,_curRow
1962   inc (hl)
1963 #endif
1964   ld  hl,txtGame
1965 CURtxtGame =$-2
1966   cal _puts
1967   ld  a,$0D ;$0D02
1968   ld  (_curCol),a
1969   cal showLevel
1970
1971   ld  de,$1901
1972   ld  (_penCol),de
1973   ld  hl,txtName
1974   cal _vputs ;Name
1975   ld  a,$3D
1976   ld  (_penCol),a
1977   cal _vputs ;Died    Score
1978   ld  de,$0004
1979   ld  (_curRow),de
1980
1981 findwinner:
1982   ld  hl,(worm1+score)
1983   ld  (winnerscore),hl
1984   ld  b,3 ;(nrworms)-1
1985   ld  hl,worm2+score
1986 findwinnerloop:
1987   psh hl
1988   cal _ldHLind
1989   ld  de,(winnerscore)
1990   ld  a,h
1991   cp  d
1992   jr  c,nonewwinner ;h<d
1993   jr  nz,newwinner  ;h>d
1994   ld  a,e
1995   cp  l
1996   jr  nc,nonewwinner ;l<e
1997 newwinner:
1998   ld  (winnerscore),hl
1999 nonewwinner:
2000   pop hl
2001   ld  de,worm2-worm1
2002   add hl,de
2003   dnz findwinnerloop
2004
2005   ld  a,(nrworms)
2006   ld  b,a
2007   cpl ;high value (>$FB)
2008   ld  hl,worm1+died
2009 finddmwinner:
2010   cp  (hl)
2011   jr  c,nonewdmwinner
2012   ld  a,(hl) ;less deaths
2013 nonewdmwinner:
2014   ld  de,worm2-worm1
2015   add hl,de
2016   dnz finddmwinner
2017   ld  (dmwinner),a
2018
2019 ;---display worms---
2020
2021   ld  a,(nrworms)
2022   ld  b,a
2023   ld  hl,worm1+died
2024 displayWormStats:
2025   psh bc
2026
2027   psh hl
2028   ld  bc,left-died
2029   add hl,bc ;+left
2030   xor a
2031   cp  (hl)  ;input=0 = link
2032   jr  nz,NoLinkIndic
2033   ld  a,9
2034   ld  (_curCol),a
2035   ld  a,$DC ;-O
2036   cal _putc
2037   xor a
2038   ld  (_curCol),a
2039 NoLinkIndic:
2040   inc hl
2041   inc hl ;+name
2042   cal _puts
2043   pop hl
2044
2045   psh hl
2046   ld  a,13
2047   ld  (_curCol),a
2048   ld  a,(hl) ;worm+died
2049   cal showA0
2050   pop hl
2051
2052   psh hl
2053   ld  a,(Gametype)
2054   cp  gamedeathm
2055   jr  nz,nodmwinner ;deathmatch?
2056   ld  a,0 ;winner's deaths
2057 dmwinner =$-1
2058   cp  (hl) ;equals this worm?
2059   scf ;jr nz,notwinner
2060   cal z,iswinner
2061 nodmwinner:
2062   jr  c,notwinner ;no singleplayer winners
2063   inc hl ;worm+score
2064   cal _ldHLind ;ld hl,(hl)
2065   ld  de,0
2066 winnerscore =$-2
2067   cal _cphlde ;==highest score..
2068   cal z,iswinner
2069 notwinner:
2070   ld  a,16
2071   ld  (_curCol),a
2072   pop hl
2073   psh hl
2074   inc hl ;worm+score
2075   cal _ldHLind
2076   cal showHL
2077   pop hl
2078
2079   ld  bc,worm2-worm1
2080   add hl,bc
2081   pop bc
2082   dnz displayWormStats
2083
2084   ld  a,(Gametype)
2085   or  a ;singleplayer (0) only
2086   jr  nz,hilevelcheckdone
2087 checkhilevel:
2088   ld  hl,nrlevels
2089   ld  a,(Level)
2090   cp  (hl)
2091   jr  c,hilevelcheckdone
2092   ld  (hl),a ;save local
2093   ld  c,a
2094   ld  a,0
2095 hilvlposa =$-1
2096   ld  hl,nrlevels
2097 hilvlposhl =$-2 ;save external
2098   cal _writeb_inc_ahl ;ld (ahl),c
2099 hilevelcheckdone:
2100
2101   ld  a,(gameCar)
2102   and _datasingl
2103   jr  z,hiscorecheckdone ;no SP
2104 checkhiscore:
2105   cal loadhiscoreposinahl
2106   cal _SET_ABS_SRC_ADDR ;from ahl (lvlfile)
2107   xor a
2108   ld  hl,highsave
2109   cal _SET_ABS_DEST_ADDR ;to local
2110   ld  hl,5 ;5 bytes
2111   cal _MM_LDIR_SET_SIZE ;get old score+name
2112   cal _RAM_PAGE_1
2113
2114   ld  de,(highsave)    ;de=prev. hiscore
2115   ld  hl,(worm1+score) ;hl=worm1's score
2116   cal _cphlde ;sub hl,de
2117   jr  c,NotNewHigh ;new<old
2118   jr  z,NotNewHigh ;new<=old
2119 newhigh:            ;New>Old
2120   ld  (highsave),hl ;store new hiscore
2121   ld  de,highsave+2 ;to
2122   ld  hl,worm1+name ;from
2123   ld  bc,3 ;3 chars
2124   ldir ;store new hiname
2125   cal loadhiscoreposinahl
2126   cal _SET_ABS_DEST_ADDR ;to ahl
2127   xor a
2128   ld hl,highsave
2129   cal _SET_ABS_SRC_ADDR ;from local
2130   ld  hl,5
2131   cal _MM_LDIR_SET_SIZE ;save new
2132   cal _RAM_PAGE_1
2133   ld  hl,_curRow
2134   dec (hl)
2135   cal iswinner
2136
2137 NotNewHigh:
2138   ld  hl,$3149
2139   ld  (_penCol),hl
2140   ld  hl,txthiscore
2141   cal _vputs
2142   ld  hl,$0C07
2143   ld  (_curRow),hl
2144   ld  hl,highsave+2
2145   cal _puts
2146   ld  hl,(highsave)
2147   cal showHL
2148 hiscorecheckdone:
2149
2150 waitkey:
2151   cal ubergetkey
2152   cp  K_ENTER
2153   jp  z,DisplayMenu
2154   cp  K_SECOND
2155   jp  z,DisplayMenu
2156   cp  K_EXIT
2157   jr  nz,waitkey
2158
2159 ;x123456789012345678901
2160 ;>>>>>> GAME OVER <<<<<
2161 ;2Multiplayer
2162 ;3Level 01
2163 ;4           Died Score:
2164 ;5NameName     03 00070
2165 ;6Worm#02 @    05 00120
2166 ;7Worm#03      15 00030
2167 ;8Snaky   @    00 04820
2168
2169 ExitNoStats:
2170   cal linkok
2171   ld  hl,_asapvar
2172   rst 20h ;_ABS_MOV10TOOP1
2173   rst 10h ;_FINDSYM
2174   ld  hl,savestart-_asm_exec_ram+4
2175   xor a
2176   add hl,de
2177   adc a,b ;ahl=bde+4
2178   cal _SET_ABS_DEST_ADDR
2179
2180   xor a
2181   ld  hl,savestart
2182   cal _SET_ABS_SRC_ADDR
2183   ld  hl,saveend-savestart
2184   cal _MM_LDIR_SET_SIZE
2185
2186   cal releasekeys
2187   res 4,(iy+9)
2188   set 2,(iy+13)
2189   im  1 ;remove keyfix
2190   jp  _clrWindow
2191
2192 loadhiscoreposinahl:
2193   ld  hl,0 ;for peaworm and singleplayer
2194   ld  a,(Gametype)
2195   or  a ;Singleplayer?
2196   jr  z,hi__
2197   dec a ;peaworm?
2198   jr  z,hi_
2199   ld  a,(nrlevels+1) ;skip peaworm slots if tron mode
2200 hi_:
2201   ld  bc,(Level)
2202   add a,c
2203   ld  b,a ;levels to skip (including 1 for singleplayer)
2204   ld  de,5 ;to add per level
2205 addlevelposition:
2206   add hl,de ;one word+3 bytes for name
2207   dnz addlevelposition
2208 hi__:
2209   xor a ;ahl=0(+hl)
2210   ld  bc,defhiscrpos
2211 hiscrposhl =$-2
2212   add hl,bc
2213 hiscrposa =$+1
2214   adc a,0 ;ahl=saveloc
2215   ret
2216 highsave:
2217   .db 0,0,"WOR ",0
2218
2219 iswinner:
2220   ld  a,10
2221   ld  (_curCol),a
2222   ld  a,'*'
2223   jp  _putc ;..then put *
2224
2225 ;-----------------------------
2226 ;----------- worm ------------
2227 ;-----------------------------
2228
2229 respawncheck:
2230   cp  respawndelay-1
2231   jr  nz,unnamedlabel
2232   cal saverespawncounter
2233 removeworm:
2234   ld  h,(ix+tail+1) ;&
2235   ld  l,(ix+tail)
2236   ld  d,(ix+head+1)
2237   ld  e,(ix+head)
2238   jr  DoesWormTailEqualsWormHead ;chk4 size=0
2239 removewormloop:
2240   ld  c,(hl)
2241   inc hl
2242   ld  b,(hl)
2243   inc hl
2244   cal resbit
2245   psh hl
2246   cal res4pixels
2247   pop hl
2248   inc (ix+grow)
2249 DoesWormTailEqualsWormHead:
2250   cal _cphlde
2251   jr  nz,removewormloop
2252
2253   ld  a,(gameCar)
2254   and _datasingl
2255   jr  nz,safewormsizedone
2256   ld  a,0
2257 beginsize =$-1
2258   ld  (ix+grow),a
2259 safewormsizedone:
2260
2261   ;de=ix+head
2262   ld  (ix+tail+1),d
2263   ld  (ix+tail),e ;head=tail/size=0
2264   ret
2265
2266 unnamedlabel:
2267   cp  1
2268   ld  h,a
2269   jr  nz,saverespawncounter
2270 respawndue:
2271   ld  l,a
2272   cal inputcall
2273   ld  a,h ;previous
2274   cp  l   ;changed?
2275   ret z
2276   ld  (ix+delay),a ;=0
2277   ret
2278 saverespawncounter:
2279   ld  (ix+delay),a
2280   jr  inputcall
2281
2282 chkkey: ;key=a
2283   dec a
2284   ld  b,a
2285   srl b
2286   srl b
2287   srl b ;b=a/8
2288   and 7 ;a=a\8
2289   ld  c,a ;push keybit
2290   ld  a,-1
2291   out (1),a
2292   inc b
2293   ld  a,%01111111 ;default
2294 bitmask:
2295   rlca ;rotate left
2296   dnz bitmask ;a/8 times
2297   out (1),a ;send bitmask
2298   in  a,(1) ;input keys
2299   ld  b,c ;pop keybit
2300   inc b
2301 keybit:
2302   rra
2303   dnz keybit ;check match (cf set)
2304   ret
2305
2306 inkeys: ;use jp not call!
2307   cal chkkey
2308   jr  nc,notright
2309   ld  a,l
2310   add a,8
2311 turnright =$-1
2312   ld  l,a
2313 notright:
2314   ld  a,(ix+right)
2315   cal chkkey
2316   ret nc
2317   ld  a,l
2318   sub 8
2319 turnleft =$-1
2320   ld  l,a
2321   ret
2322 inputcall:
2323   ld  a,(ix+left)
2324   or  a
2325   jr  z,inlink ;input by link
2326   cal inkeys ;input by keys
2327   ld  a,(gameCar)
2328   rra ;and _datalink
2329   ret nc ;no link
2330   ld  c,l ;send our keys
2331   jp  Qsend
2332 inlink:
2333   cal Qrecv ;Crecv
2334   ld  l,c
2335   ret
2336
2337 ;-----------------------------
2338 ;------- handle worm ---------
2339 ;-----------------------------
2340
2341 HandleWorm:
2342   xor a
2343   cp  (ix+lives)
2344   jr  nz,alive
2345   ld  a,(wormbeglives)
2346   or  a
2347   ret nz ;live limit
2348 alive:
2349   ld  a,(ix+delay)
2350   dec a
2351   jp  nz,respawncheck
2352
2353   xor a
2354   cp  0
2355 turn =$-1
2356   jr  nz,nogrow
2357   inc (ix+grow)
2358 nogrow:
2359
2360   ld  a,(gameCar)
2361   and _datatime
2362   jr  z,notimescore
2363   ld  e,1
2364   cal IncScore
2365 notimescore:
2366
2367   ld  l,(ix+heading)
2368   cal inputcall
2369 donediddelydone:
2370   ld  (ix+heading),l
2371   ld  h,(ix+heading+1)
2372
2373   ld  c,(ix+pos)
2374   ld  b,(ix+pos+1)
2375   ld  e,(ix+pos2)
2376   ld  d,(ix+pos2+1)
2377
2378   psh hl
2379   ld  hl,previouspos
2380   ld  (hl),c
2381   inc hl
2382   ld  (hl),b
2383   inc hl
2384   inc hl
2385   ld  (hl),e
2386   inc hl
2387   ld  (hl),d
2388   pop hl
2389
2390 ;-------- move worm ----------
2391
2392 Wormmove:
2393   psh bc                        ; >> pos
2394   ld  a,(hl)
2395   add a,a
2396   add a,d
2397   ld  d,a
2398   bit 7,(hl)
2399   jr  z,notnegX
2400   dec b
2401 notnegX:
2402   jr  nc,notmoveX
2403   inc b
2404 notmoveX:
2405   ld  a,l
2406   add a,$40
2407   ld  l,a
2408   ld  a,(hl)
2409   add a,a
2410   add a,e
2411   ld  e,a
2412   bit 7,(hl)
2413   jr  z,notnegY
2414   dec c
2415 notnegY:
2416   jr  nc,notmoveY
2417   inc c
2418 notmoveY: ;bc=newpos
2419   ld  (ix+pos2),e
2420   ld  (ix+pos2+1),d
2421   ld  (ix+pos),c
2422   ld  (ix+pos+1),b
2423
2424 ;-check-
2425   pop hl                         ; << pos (old)
2426   ld  a,h
2427   sub b
2428   and 1
2429   ld  h,a
2430   ld  a,l
2431   sub c
2432   and 1
2433   add a,h
2434   ld  d,4
2435   jr  z,GotFour
2436   xor 3
2437   ld  d,a
2438 GotFour:
2439   cal chk4pixels
2440   rl  d
2441   jp  nc,Drawworm
2442
2443 ;--------- worm hit ----------
2444
2445 Hitworm:
2446   ld  a,(gameCar)
2447   ld  h,a
2448 #ifdef optdie
2449   and _datadie
2450   cal z,checkhitotherworm
2451   ld  a,h
2452 #endif
2453   and _datamultpeas ;&&bit
2454   jr  nz,chkctfpeas
2455   ld  a,h
2456   and _datafood
2457   jp  z,WormDead ;no food
2458
2459   ld  hl,0
2460 PeaY =$-2
2461 PeaX =$-1
2462   cal chkpeahit
2463   jp  nc,WormDead
2464   cal DrawPea ;remove pea
2465   ld  a,(ix+grow)
2466   add a,15
2467 peagrowth =$-1
2468   ld  (ix+grow),a
2469   cal NewPea
2470   ld  hl,Left
2471   dec (hl)
2472   psh af
2473   ld  e,10
2474   cal IncScore
2475   pop af
2476   jp  nz,Drawworm ;continue
2477   ld  a,(gameCar)
2478   and _datafoodl
2479   jp  z,Drawworm
2480   ld  a,(Gametype)
2481   or  a
2482   jp  nz,Exit ;stack restored
2483
2484   ld  hl,Level
2485   ld  a,(hl)
2486   inc (hl)
2487   ld  l,a ;hl=Level
2488   ld  h,0
2489   add hl,hl
2490   add hl,hl
2491   cal _HLTIMES10
2492   ex  de,hl
2493   cal _IncScore ;score+(40*level)
2494   cal removeworm
2495   pop hl                         ; << call
2496   pop hl                         ; << call
2497   ld  (ix+delay),2
2498   jp  Nextlevel
2499
2500 chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
2501   ld  a,(sprsize)
2502   inc a
2503   ld  d,a
2504   ld  a,b
2505   sub h
2506   inc a
2507   cp  d ;=(sprsize)+1
2508   ret nc ;nc=no pea
2509   ld  a,c
2510   sub l
2511   inc a
2512   cp  d
2513   ret ;c=pea
2514
2515 chkctfpeas:
2516   ld  hl,(peaspos) ;1st pea
2517   ld  a,(ix+reserv)
2518   ld  e,a ;push a
2519   and %01 ;ourpea (0|1)
2520   jr  z,sel_otherpea
2521   ld  hl,(peaspos+2) ;2nd pea ;&&&ex de,hl?
2522 sel_otherpea:
2523   cal chkpeahit
2524   jr  c,hitflag
2525 ;no peas hit:
2526   ld  a,e ;peek a (that's x86asm for pop\push ;)
2527   bit 1,a ;%10 = carrying flag?
2528   jp  z,WormDead ;if not just die
2529   xor %11 ;drop flag
2530   ld  (ix+reserv),a
2531   psh af
2532   cal WormDead
2533   pop af ;which flag? (=and %1)
2534   ld  hl,drawctfpea1 ;restore #1
2535   jr  z,nottheotherflag
2536   ld  hl,drawctfpea2 ;restore #2
2537 nottheotherflag:
2538   ld  (hl),3 ;draw delay 3 turns
2539   ret
2540
2541 drawctfpea1: .db 0
2542 drawctfpea2: .db 0
2543
2544 hitflag: ;correct pea hit
2545   ld  a,e ;pop a
2546   xor %11 ;invert flag taken + ownflag
2547   ld  (ix+reserv),a
2548   and %10 ;just returned?
2549   psh af ;safe z-flag
2550   cal DrawPea ;remove
2551   pop af
2552   jr  nz,Drawworm ;flag taken, continue game
2553   psh hl
2554   ld  e,20 ;flag captured+returned
2555   cal IncScore
2556   pop hl
2557   ld  a,3 ;draw delay
2558   ld  (drawctfpea1),a ;redraw..
2559   ld  (drawctfpea2),a ;..both flags
2560   jr  Drawworm
2561
2562 ;-----------------------------
2563
2564 nextotherwormbit:
2565   ld  a,c
2566   sub (hl)
2567   inc hl
2568   inc a
2569   cp  4
2570   jr  nc,nothit1 ;no
2571   ld  a,b
2572   sub (hl)
2573   inc a
2574   cp  4
2575   ret c ;nz ;yes
2576 nothit1:
2577   inc hl
2578   cal resbit
2579 ChkWorm:
2580   cal _cphlde
2581   jr  nz,nextotherwormbit
2582   ret ;z
2583
2584 checkhitlapline:
2585   ld  a,(peaspos) ;63
2586   sub b ;x==63
2587   jr  z,nextlaphalf
2588   inc a
2589   ret nz
2590 nextlaphalf:
2591   ld  a,(peaspos+1) ;yline
2592   cp  c ;ypos
2593   ld  a,1
2594   jr  nc,checklap ;y>yline -> a=1
2595   xor a ;y<yline -> a=0
2596 checklap:
2597   cp  (ix+reserv)
2598   ret z ;same as before
2599   ld  (ix+reserv),a ;1st time
2600   ld  e,a
2601   ld  a,(handledworm)
2602   and 1 ;group 0 (1,3) or 1 (2,4)
2603   xor e
2604   ret z ;(group 0 and y<yline) or (group 1 and y>yline)
2605   psh bc
2606   ld  e,20
2607   cal IncScore ;lap!
2608   pop bc
2609   ret
2610
2611 #ifdef optdie
2612 checkhitotherworm:
2613  .db  $dd,$7d ;ld a,lx
2614   cp  worm2&255
2615  psh ix
2616  jr nz,chkworm2 ; ret nz
2617   ld  ix,worm1
2618  jr chkworm
2619 chkworm2:
2620  ld ix,worm2
2621
2622 chkworm:
2623  ld h,(ix+tail+1)
2624  ld l,(ix+tail)
2625  ld e,(ix+head)
2626  ld d,(ix+head+1)
2627   cal ChkWorm
2628  pop ix
2629   ret z ;not hit
2630   pop bc ;call
2631 #endif
2632 stopworm:
2633   ld  bc,0
2634 previouspos =$-2
2635   ld  de,0
2636   ld  (ix+pos),c
2637   ld  (ix+pos+1),b
2638   ld  (ix+pos2),e
2639   ld  (ix+pos2+1),d
2640   ret
2641
2642 ;-------- draw worm ----------
2643
2644 Drawworm:
2645   ld  c,(ix+pos)
2646   ld  b,(ix+pos+1)
2647
2648   ld  a,(Gametype)
2649   cp  gamerace
2650   cal z,checkhitlapline
2651
2652   cal set4pixels
2653   dec c
2654   ld  a,(growspeed)
2655   or  a ;0=tron
2656   ret z ;keep tail in "Tron"
2657
2658   ld  l,(ix+head)
2659   ld  h,(ix+head+1)
2660   ld  (hl),c
2661   inc hl
2662   ld  (hl),b
2663   inc hl
2664   cal resbit
2665   ld  (ix+head),l
2666   ld  (ix+head+1),h
2667
2668   ld  a,(ix+grow)
2669   dec a
2670   jr  z,removetail
2671   ld  (ix+grow),a
2672   ret
2673
2674 removetail:
2675   ld  l,(ix+tail)
2676   ld  h,(ix+tail+1)
2677   ld  c,(hl)
2678   inc hl
2679   ld  b,(hl)
2680   inc hl
2681   cal resbit
2682   ld  (ix+tail),l
2683   ld  (ix+tail+1),h
2684
2685 res4pixels:
2686   cal ResPixel
2687   inc b
2688   cal ResPixel
2689   inc c
2690   cal ResPixel
2691   dec b
2692 ResPixel:
2693   cal FindPixel
2694   cpl
2695   and (hl)
2696   ld  (hl),a
2697   ret
2698
2699 ;-----------------------------
2700 ;---------- ball -------------
2701 ;-----------------------------
2702
2703 handlethoseneatlittleballs:
2704   ld  hl,balls
2705   ld  b,a ;a=(nrballs)
2706 handleballs
2707   psh bc
2708   psh hl
2709   ld  c,(hl)
2710   inc hl
2711   ld  b,(hl)
2712   inc hl
2713   ld  d,(hl)
2714   cal handleball
2715   dec c
2716   pop hl
2717   ld  (hl),c
2718   inc hl
2719   ld  (hl),b
2720   inc hl
2721   ld  (hl),d
2722   inc hl
2723   pop bc
2724   dnz handleballs
2725   ret
2726
2727 handleball:
2728   cal res4pixels
2729   dec c
2730
2731 ballxmove:
2732   bit 0,d ;1=L; 0=R
2733   jr  z,ballright
2734 ballleft:
2735   dec b
2736   cal checkballhit
2737   jr  z,ballymove
2738   inc b ;undo
2739   res 0,d ;go right
2740   jr  ballymove
2741 ballright:
2742   inc b
2743   cal checkballhit
2744   jr  z,ballymove
2745   dec b ;back
2746   set 0,d ;>left
2747
2748 ballymove:
2749   bit 1,d ;1=up; 0=down
2750   jr  z,balldown
2751 ballup:
2752   dec c
2753   cal checkballhit
2754   jr  z,balldone
2755   inc c
2756   res 1,d ;go down
2757   jr  balldone
2758 balldown:
2759   inc c
2760   cal checkballhit
2761   jr  z,balldone
2762   dec c
2763   set 1,d ;up
2764 balldone:
2765
2766 set4pixels: ;@(b,c)
2767   cal SetPixel
2768   inc b
2769   cal SetPixel
2770   inc c
2771   cal SetPixel
2772   dec b
2773 SetPixel: ;at bc
2774   cal FindPixel
2775   or  (hl)
2776   ld  (hl),a
2777   ret
2778
2779 letsmovetheotherway:
2780   ld  a,1
2781   xor (hl)
2782   ld  (hl),a
2783   ret
2784
2785 checkballhit:
2786   psh de
2787   ld  d,0
2788   cal chk4pixels
2789   xor a
2790   cp  d
2791   pop de
2792   ret
2793
2794 ;-----------------------------
2795 ;----------- procs -----------
2796 ;-----------------------------
2797
2798 releasekeys:
2799   halt
2800   ld  a,%10000000    ;all key-masks
2801   out (1),a
2802   in  a,(1)
2803   inc a              ;cp %11111111 (no keys pressed)
2804   jr  nz,releasekeys ;keep waitin
2805   cal GET_KEY        ;clear buffer
2806   ret
2807
2808 resbit:
2809   ld  a,h
2810   and (ix+storepos)
2811   ld  h,a
2812   ret
2813
2814 randompos:
2815   ld  b,a
2816 Random: ;(2..b+2)
2817   ld  a,r
2818 Seed =$+1
2819   add a,0
2820   ld  (Seed),a
2821   and %01111110
2822   cp  b
2823   jr  nc,Random
2824   add a,2
2825   ret
2826
2827 WormDead:
2828 #ifdef invincible
2829   jp  stopworm
2830 #else
2831   ld  a,2
2832   ld  (flashtime),a
2833   ld  (ix+delay),respawndelay
2834
2835 thislevel =$+1
2836   ld  hl,0
2837   ld  de,0
2838 handledworm =$-2
2839   add hl,de
2840   add hl,de
2841   add hl,de
2842   ld  a,(hl)
2843   inc hl
2844   ld  (ix+heading),a
2845   ld  a,(hl)
2846   ld  (ix+pos),a ;y
2847   inc hl
2848   ld  a,(hl)
2849   ld  (ix+pos+1),a ;x
2850   xor a
2851   ld  (ix+pos2),a ;y2
2852   ld  (ix+pos2+1),a ;x2
2853
2854   inc (ix+died)
2855   dec (ix+lives)
2856   psh af
2857   ld  de,10
2858   ld  a,(Gametype)
2859   cp  gamectf ;ctf no death penalty
2860   cal nz,DecScore
2861   pop af
2862   ret nz ;HandleWorm done
2863   ld  a,(wormbeglives)
2864   or  a ;0=no live limit
2865   ret z ;don't end game
2866   ld  a,(gameCar)
2867   and _datatime
2868   jr  z,anyworm ;quit at any worm's death
2869   ld  a,(nrworms) ;timematch: all worms must've died
2870   ld  b,a ;# of worms
2871   ld  hl,worm1+lives-(worm2-worm1)
2872   ld  de,worm2-worm1
2873   xor a ;check for 0 lives
2874 checklives:
2875   add hl,de ;next worm
2876   cp  (hl) ;lives==0?
2877   ret nz ;any >0: don't exit
2878   dnz checklives
2879 anyworm:
2880   ld  a,$A7 ;exit@end of turn
2881   ld  (CheckExit),a ;set exit state
2882   ret ;finish turn
2883 #endif
2884
2885 CheckPea: ;@hl; destr:abcde
2886   ld  c,l
2887   ld  a,(sprsize)
2888   ld  e,a
2889 chkloopy:
2890   ld  b,h
2891   ld  a,(sprsize)
2892   ld  d,a
2893 chkloopx:
2894   psh hl
2895   cal FindPixel
2896   and (hl)
2897   pop hl
2898   ret nz ;nz=pixel found
2899   inc b
2900   dec d
2901   jr  nz,chkloopx
2902   inc c
2903   dec e
2904   jr  nz,chkloopy
2905   ret ;z=empty space
2906
2907 tryDrawPea: ;hl=peapos;bc=dopea
2908   ld  a,(de)
2909   or  a ;0=drawn
2910   ret z
2911   psh de
2912   cal CheckPea
2913   pop de
2914   ret nz ;unsuccesful
2915   ex  de,hl
2916   dec (hl) ;hl=appeartime
2917   ex  de,hl ;hl=peaspos
2918   jr  z,DrawPea
2919   ret
2920
2921 sendnewpeaoverlink:
2922   ld  a,(gameCar)
2923   rra ;and _datalink
2924   ret nc ;no link
2925   ld  a,(ix+left)
2926   or  a
2927   jr  z,receivenewpeaoverlink
2928   ld  c,l ;send pea's pos
2929   cal Qsend
2930   ld  c,h
2931   jp  Qsend ;&&&possible jr
2932 receivenewpeaoverlink:
2933   cal Qrecv ;Crecv
2934   ld  l,c
2935   cal Qrecv ;Crecv
2936   ld  h,c
2937   ret
2938
2939 NewPea:
2940   ld  a,(FieldWidth)
2941   add a,127-4
2942   cal randompos
2943   ld  h,a
2944   ld  a,(FieldHeight)
2945   add a,56-4
2946   cal randompos
2947   ld  l,a
2948   cal CheckPea
2949   jr  nz,NewPea
2950   cal sendnewpeaoverlink
2951   ld  (PeaY),hl
2952 DrawPea: ;hl=(PeaY)
2953   ld  b,h
2954   ld  c,l
2955   ld  de,0
2956 spritepos =$-2
2957 ; jp PutSprite
2958
2959 PutSprite:  ;||@(b,c)
2960   ;by SHIAR  only ix saved
2961   cal FindPixel
2962   ld  (beginbit),a
2963   ld  a,0
2964 sprsize =$-1
2965   ld  b,a ;rows
2966 sprloopy:
2967   psh bc ;rows
2968   psh hl
2969   ld  a,(de)
2970   ld  c,a
2971   inc de
2972   ld  a,(sprsize)
2973   ld  b,a ;width
2974 beginbit =$+1
2975   ld  a,1
2976 sprloopx:
2977   sla c ;draw?
2978   jr  nc,sprnodraw
2979   psh af
2980   xor (hl)
2981   ld  (hl),a
2982   pop af
2983 sprnodraw:
2984   rrca ;next bit
2985   jp  nc,nextbitok
2986   inc hl ;next byte
2987 nextbitok:
2988   dnz sprloopx
2989
2990   pop hl
2991   ld  bc,32 ;next line
2992   add hl,bc
2993   pop bc
2994   dnz sprloopy
2995   ret
2996
2997 ;----------- score -----------
2998
2999 timematchscore:
3000   ;piece of crap checking whether you've already won in timematch
3001   ld  a,(nrworms)
3002   ld  b,a ;# of worms
3003   dec a
3004   ret z ;singleplayer
3005   ld  hl,worm1+lives
3006   ld  de,worm2-worm1
3007   ld  a,(handledworm)
3008   ld  c,a ;wormcounter
3009 chktimematchover:
3010   xor a
3011   cp  c
3012   jr  z,nneexxtt ;yourself
3013   cp  (hl)
3014   ret nz ;someone else still alive
3015   dec hl ;+delay
3016   dec hl ;+score+1
3017   ld  a,(hl)
3018   cp  (ix+score+1)
3019   jr  c,nneexxtt_ ;you>him
3020   ret nz ;not highest
3021   dec hl ;+score
3022   ld  a,(hl)
3023   cp  (ix+score)
3024   ret nc ;you<=him
3025   inc hl
3026 nneexxtt_:
3027   inc hl
3028   inc hl
3029 nneexxtt:
3030   dec c
3031   add hl,de
3032   dnz chktimematchover
3033   jp  anyworm ;g/o
3034
3035 _divHLby1000:
3036   psh hl
3037   ld  b,3
3038 divideagain: ;3x
3039   cal _divHLby10
3040   dnz divideagain
3041   ld  a,l ;a=hl/1000
3042   pop hl
3043   ret
3044
3045 extralives:
3046   cal _divHLby1000
3047   ld  c,a
3048   add hl,de ;increase score
3049   cal _divHLby1000
3050   cp  c
3051   jr  z,scorecommon ;hl/1000 not increased
3052   inc (ix+lives)
3053   jr  scorecommon
3054
3055 DecScore: ;&&&
3056   ld  h,(ix+score+1)
3057   ld  l,(ix+score)
3058   or  a
3059   sbc hl,de
3060   jr  c,showstats ;<0=0
3061   jr  scorecommon
3062
3063 IncScore: ;inc score by e
3064   ld  d,0
3065 _IncScore ; inc by de
3066   ld  h,(ix+score+1)
3067   ld  l,(ix+score)
3068   ld  a,(Gametype)
3069   or  a ;if singleplayer...
3070   jr  z,extralives
3071   add hl,de ;score+=de
3072 scorecommon:
3073   ld  (ix+score+1),h
3074   ld  (ix+score),l ;save
3075   ld  de,0
3076 scorelimit =$-2
3077   ld  a,d
3078   or  e
3079   jr  z,showstats ;de=0=no limit
3080   cal _cphlde
3081   jp  nc,Exit
3082
3083 showstats:
3084   ld  a,(gameCar)
3085   and _datatime
3086   jr  nz,timematchscore ;no disp for timematches
3087   ld  hl,$FC00 ;&&&only necessary in deathmatch
3088   ld  b,6*16-1 
3089 clearstats:
3090   ld  (hl),a ;=0
3091   inc hl
3092   dnz clearstats
3093 forceshowstats:
3094   psh ix
3095   ld  h,0
3096   ld  l,h
3097   ld  (_penCol),hl
3098   ld  a,(nrworms)
3099   ld  b,a
3100   ld  ix,worm1
3101   ld  a,(gameCar)
3102   and _datasingl
3103   jr  nz,showstatsS
3104 showstatloop:
3105   psh bc
3106 #ifdef longnames
3107   ld  b,3
3108   psh ix
3109 shownameloop: ;1st 3 chars
3110   ld  a,(ix+name)
3111   or  a
3112   jr  z,nameshown
3113   cal __vputmap
3114   inc ix
3115   dnz shownameloop
3116 nameshown:
3117   ld  a,':'
3118   cal _vputmap
3119   pop ix
3120 #else
3121   ld  a,(ix+name)
3122   cal __vputmap
3123   ld  a,':'
3124   cal __vputmap
3125 #endif
3126   cal showstat
3127   ld  de,worm2-worm1
3128   add ix,de ;next
3129   ld  hl,_penCol
3130   ld  a,(hl)
3131   add a,4 ;div
3132   ld  (hl),a
3133   pop bc
3134   dnz showstatloop
3135   pop ix
3136   ret
3137
3138 showstat: ;(multiplayer)
3139   ld  a,(Gametype)
3140   cp  gamedeathm
3141   jr  z,showlives
3142 showscore:
3143   ld  h,(ix+score+1)
3144   ld  l,(ix+score)
3145   cal _D_HL_DECI
3146   jr  __vputs
3147 showlives:
3148   ld  a,(ix+lives)
3149 showA: ;small w/o leading 0 (&&&combine w/ cshowA0??)
3150   cp  10
3151   jr  c,showleastsign
3152   ld  l,a
3153   ld  h,0
3154   cal _divHLby10
3155   psh af
3156   ld  a,l
3157   add a,'0'
3158   cal __vputmap
3159   pop af
3160 showleastsign:
3161   add a,'0'
3162 __vputmap:
3163   psh ix
3164   cal _vputmap
3165   pop ix
3166   ret
3167
3168 showstatsS: ;(singleplayer)
3169   ld  hl,txtLevel
3170   cal __vputs
3171   ld  a,0
3172 Level =$-1
3173   cal showA
3174
3175   ld  a,98
3176   ld  (_penCol),a
3177   cal showscore
3178   ld  a,123
3179   ld  (_penCol),a
3180   cal showlives
3181   ld  a,(gameCar)
3182   and _datafoodl
3183   pop ix
3184   ret z
3185 showleft:
3186   ld  a,31
3187   ld  (_penCol),a
3188   ld  a,0
3189 Left =$-1
3190   cal cshowA0
3191
3192   ld  hl,txtLeft
3193 __vputs:
3194   psh ix
3195   cal _vputs
3196   pop ix
3197   ret
3198
3199 showLevel:
3200   ld  hl,txtLevel
3201   cal _puts
3202   ld  a,(Level)
3203 showA0: ;big w/ leading 0
3204   ld  l,a
3205   ld  h,0
3206   cal _divHLby10
3207   psh af
3208   ld  a,l
3209   add a,'0'
3210   cal _putc
3211   pop af
3212   add a,'0'
3213   jp  _putc
3214
3215 cshowA0: ;small w/ leading 0
3216   or  a
3217   jr  nz,cshowavalue
3218   ld  hl,txtNone
3219   jp  _vputs
3220 cshowavalue:
3221   ld  l,a
3222   ld  h,0
3223   cal _divHLby10
3224   psh af
3225   ld  a,l
3226   add a,'0'
3227   cal __vputmap
3228   pop af
3229   add a,'0'
3230   jp  __vputmap
3231
3232 showHL:
3233   cal _D_HL_DECI
3234   jp  _puts
3235
3236 _D_HL_DECI:
3237   ld  de,savestr+4
3238   ld  b,5
3239 ldhld:
3240   cal _divHLby10
3241   add a,'0'
3242   ld  (de),a
3243   dec de
3244   dnz ldhld
3245   ld  hl,savestr
3246   ret
3247 savestr:
3248   .db "00000",0
3249
3250 ;-----------------------------
3251
3252 DisplayField:
3253   ld  a,c
3254   sub 29
3255   jr  nc,NotMinYScroll
3256   xor a
3257 NotMinYScroll:
3258   cp  43
3259 FieldHeight =$-1
3260   jr  c,NotMaxYScroll
3261   ld  a,(FieldHeight)
3262 NotMaxYScroll:
3263   ld  l,a
3264   ld  h,0
3265   add hl,hl
3266   add hl,hl
3267   add hl,hl
3268   add hl,hl
3269   add hl,hl
3270   psh bc                        ; >> 1
3271   psh de                        ; >> 2
3272   ld  de,ScrBuffer
3273   add hl,de
3274   ld  a,b
3275   sub 64
3276   jr  nc,NotMinXScroll
3277   xor a
3278 NotMinXScroll:
3279   cp  128
3280 FieldWidth = $-1
3281   jr  c,NotMaxXScroll
3282   ld  a,(FieldWidth)
3283 NotMaxXScroll:
3284   psh af                        ; >> 3
3285   and %11111000
3286   rra
3287   rra
3288   rra
3289   ld  c,a
3290   ld  b,0
3291   ld  de,DispBuffer
3292   pop af                         ; << 2
3293   and %00000111
3294   psh af                        ; >> 3
3295   cp  6
3296   jr  c,CopyScreen
3297   inc c
3298 CopyScreen:
3299   add hl,bc
3300   ld  b,57
3301 CopyScreenLoop:
3302   psh bc                        ; >> 4
3303   ld  bc,16
3304   ldir
3305   ld  c,16
3306   add hl,bc
3307   pop bc                         ; << 3
3308   dnz CopyScreenLoop
3309   pop af                         ; << 2
3310   ld  c,$b7 ;or a
3311 Bit0:
3312   jr  nz,Bit1
3313   halt
3314   halt
3315   jr  AfterShiftDelay
3316 Bit1:
3317   dec a
3318   jr  nz,Bit2
3319   cal ShiftRight1
3320   jr  AfterShiftDelay
3321 Bit2:
3322   dec a
3323   jr  nz,Bit3
3324   ld  a,2
3325   cal ShiftRight
3326   jr  AfterShiftDelay
3327 Bit3:
3328   dec a
3329   jr  nz,Bit4
3330   cal Chunk
3331   cal ShiftLeft1
3332   jr  AfterShift
3333 Bit4:
3334   dec a
3335   jr  nz,Bit5
3336   cal Chunk
3337   jr  AfterShiftDelay
3338 Bit5:
3339   dec a
3340   jr  nz,Bit6
3341   cal Chunk
3342   cal ShiftRight1
3343   jr  AfterShift
3344 Bit6:
3345   dec a
3346   jr  nz,Bit7
3347   ld  a,2
3348   cal ShiftLeft
3349   jr  AfterShift
3350 Bit7:
3351   cal ShiftLeft
3352 AfterShiftDelay:
3353   halt
3354 AfterShift:
3355 #ifdef buffer
3356   ld  hl,DispBuffer
3357   ld  de,$fc00+$70
3358   ld  bc,1024-$70
3359   ldir
3360 #endif
3361   pop de                         ; << 1
3362   pop bc                         ; << 0k
3363   ret
3364
3365 ShiftRight1:
3366   ld  a,1
3367 ShiftRight:
3368   ld  (ShiftRightCounter),a
3369   ld  a,c
3370   ld  (ShiftRightChunk),a
3371   ld  c,16
3372   add hl,bc
3373   ld  b,57
3374 ShiftRightLoop:
3375   psh bc
3376   ld  bc,-32
3377   add hl,bc
3378   ex  de,hl
3379   ld  a,(de)
3380 ShiftRightChunk:
3381   or  a
3382   cal c,_SHLACC
3383   ld  c,0
3384 ShiftRightCounter = $-1
3385 ShiftRowsLeft:
3386   psh hl
3387   rla
3388   ld  b,16
3389 ShiftRowLeft:
3390   dec hl
3391   rl  (hl)
3392   dnz ShiftRowLeft
3393   pop hl
3394   dec c
3395   jr  nz,ShiftRowsLeft
3396   ld  bc,-16
3397   add hl,bc
3398   ex  de,hl
3399   pop bc
3400   dnz ShiftRightLoop
3401   ret
3402
3403 ShiftLeft1:
3404   ld  a,1
3405 ShiftLeft:
3406   ld  (ShiftLeftCounter),a
3407   ld  a,c
3408   ld  (ShiftLeftChunk),a
3409   rla
3410   jr  nc,ShiftLeftSameByte
3411   dec hl
3412 ShiftLeftSameByte:
3413   ex  de,hl
3414   ld  bc,-16
3415   add hl,bc
3416 NewSprite:
3417   ex  de,hl
3418   ld  b,57
3419 ShiftLeftLoop:
3420   psh bc                        ; >> 1
3421   ld  bc,-32
3422   add hl,bc
3423   ex  de,hl
3424   ld  a,(de)
3425 ShiftLeftChunk:
3426   or  a
3427   cal c,_SHRACC
3428   ld  c,0
3429 ShiftLeftCounter = $-1
3430 ShiftRowsRight:
3431   psh hl                        ; >> 2
3432   rra
3433   ld  b,16
3434 ShiftRowRight:
3435   rr  (hl)
3436   inc hl
3437   dnz ShiftRowRight
3438   pop hl                         ; << 1
3439   dec c
3440   jr  nz,ShiftRowsRight
3441   ld  bc,-16
3442   add hl,bc
3443   ex  de,hl
3444   pop bc                         ; << 0k
3445   dnz ShiftLeftLoop
3446   ret
3447
3448 Chunk:
3449   psh hl                        ; >> 1
3450   psh de                        ; >> 2
3451   ld  c,16
3452   add hl,bc
3453   ld  b,57
3454 ChunkScreen:
3455   psh bc                        ; >> 3
3456   ld  bc,-32
3457   add hl,bc
3458   ex  de,hl
3459   ld  a,(de)
3460   cal _SHRACC
3461   ld  b,16
3462 ChunkRow:
3463   dec hl
3464   rld
3465   dnz ChunkRow
3466   ex  de,hl
3467   pop bc                         ; << 2
3468   dnz ChunkScreen
3469   pop de                         ; << 1
3470   pop hl                         ; << 0k
3471   ld  c,$37 ;scf
3472   ret
3473
3474 ;----------- draw ------------
3475
3476 ;--- pixel ---
3477
3478 chk4pixels: ;&&
3479   cal CheckPixel
3480   inc b
3481   cal CheckPixel
3482   inc c
3483   cal CheckPixel
3484   dec b
3485   cal CheckPixel
3486   dec c
3487   ret
3488 CheckPixel: ;at bc in d
3489   cal FindPixel
3490   and (hl)
3491   ret z
3492   dec d
3493   ret
3494
3495 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
3496 ;(b,c) to hl:a; "destroyes" ahl
3497
3498 FindPixel: ;(b,c) to hl:a
3499   ld  h,0
3500   ld  l,c    ;hl=y
3501   add hl,hl
3502   add hl,hl
3503   ld  a,b    ;a=x
3504   rra
3505   add hl,hl
3506   rra
3507   add hl,hl
3508   add hl,hl  ;hl=32*y
3509   rra        ;a=x/8
3510   or  l
3511   ld  l,a
3512   ld  a,b
3513   and 7
3514   cpl
3515   rlca
3516   rlca
3517   rlca
3518   ld  (FP_Bit),a
3519   xor a
3520 FP_Bit =$+1
3521   set 0,a
3522
3523   psh de ;&&&
3524   ld  de,ScrBuffer
3525   add hl,de
3526   pop de
3527   ret
3528
3529 ;--- objects ---
3530
3531 drawstuff:
3532   ld  a,(hl)
3533   inc hl
3534   or  a ;0 =
3535   ret z ;no more
3536
3537   ld  d,(hl)
3538   inc hl
3539   ld  e,(hl)
3540   inc hl
3541   ld  b,(hl)
3542   inc hl
3543   psh hl
3544   ld  l,(hl)
3545   ld  h,b
3546   cal drawsmtn
3547   pop hl
3548   inc hl
3549   jr  drawstuff
3550
3551 drawsmtn:
3552   dec a ;1 = line
3553   jr  z,drawline
3554   dec a ;2 = fatline
3555   jr  z,drawfatline
3556   dec a ;3 = box
3557   jr  z,drawbox
3558 ; dec a ;4 = circle
3559 ; jp  z,drawcircle
3560
3561 drawcircle: ;(d,e),h    ;de=x,y; h=z
3562   ld  c,h               ;c=yy=z
3563   ld  a,h
3564   neg
3565   ld  l,a               ;l=-z
3566   xor a
3567   ld  b,a               ;b=xx=0
3568   dec a                 ;-$00**
3569   ld  h,a               ;hl=zz=-z
3570 circloop:
3571   psh de                ;x,y
3572   ex  (sp),hl           ;push zz \ pop x,y
3573   cal circledraw        ;(x-xx,y+yy)-(x+xx,y+yy)
3574                         ;(x-xx,y-yy)-(x+xx,y-yy)
3575   cal circledraw        ;(x-yy,y+xx)-(x+yy,y+xx)
3576                         ;(x-yy,y-xx)-(x+yy,y-xx)
3577
3578   ex  (sp),hl           ;push x,y \ pop zz
3579   xor a
3580   ld  d,a               ;d=0
3581   dec a                 ;-256<h<0 = $FF**
3582   cp  h                 ;h<0?
3583   jr  z,circlenext      ;jump if zz<0
3584
3585   ld  a,c               ;yy
3586   dec a                 ;89<a<128
3587   add a,a               ;a=2yy-2 ;nc
3588   ld  e,a               ;de=a
3589   sbc hl,de             ;zz=zz-2yy+2
3590   dec c                 ;yy--
3591 circlenext:
3592   ld  a,b               ;xx
3593   inc a                 ;0<a<92
3594   add a,a               ;2xx+2
3595   inc a
3596   ld  e,a               ;de=a
3597   add hl,de             ;zz=zz+2xx+3
3598
3599   pop de                ;x,y
3600   ld  a,b
3601   cp  c
3602   ret nc                ;xx>=yy
3603   inc b                 ;xx++
3604   jr  circloop
3605
3606 circledraw:             ;destr:de
3607   psh hl
3608   ld  a,h               ;hl=x,y
3609   sub b                 ;bc=xx,yy
3610   ld  d,a               ;d=x-xx
3611   add hl,bc             ;h=x+xx; l=y+yy
3612   ld  e,l               ;e=y+yy
3613   cal drawline          ;(h-b,l+c)-(h+b,l+c)
3614   ld  a,l
3615   sub c                 ;a=y again
3616   sub c
3617   ld  l,a               ;l=y-yy
3618   ld  e,l               ;e=l=y-yy
3619   cal drawline          ;(h-b,l-c)-(h+b,l-c)
3620   ld  a,b               ;swap xx and yy
3621   ld  b,c
3622   ld  c,a               ;ex b,c
3623   pop hl
3624   ret
3625
3626 drawbox: ;(d,e)-(h,l)
3627   ld  b,l ;Delta-y
3628   ld  l,e
3629 boxloop:
3630   cal drawline
3631   inc l
3632   inc e
3633   dnz boxloop
3634   ret
3635
3636 drawfatline:
3637   cal drawline
3638   inc d
3639   inc h
3640   cal drawline
3641   inc e
3642   inc l
3643   cal drawline
3644   dec d
3645   dec h
3646 ; jp  drawline
3647
3648 ;LINE (d,e)-(h,l)
3649 ;destroyes a
3650
3651 drawline: ;(d,e)-(h,l)
3652   psh bc  ;destr: a
3653   psh hl
3654   psh de
3655   ld  a,d
3656   cp  h
3657   jr  c,lineOrdered
3658   ex  de,hl
3659 lineOrdered:
3660   ld  b,d
3661   ld  c,e
3662   psh hl
3663   psh bc
3664   cal FindPixel
3665   pop bc
3666   pop de
3667 connectedLine:
3668   psh hl
3669   ld  h,c
3670   ld  c,a
3671   ld  a,d
3672   sub b
3673   ld  b,a
3674   ld  a,e
3675   jr  nz,LineNotPoint
3676   cp  h
3677   jr  nz,LineNotPoint
3678   pop hl
3679   jr  DoneLine
3680 LineNotPoint:
3681   sub h
3682   ld  de,32
3683   jr  nc,LinePositiveY
3684   neg
3685   ld  de,-32
3686 LinePositiveY:
3687   cp  b
3688   jr  nc,SteepLine
3689   add a,a
3690   ld  (line2sm+1),a
3691   ld  h,a
3692   xor a
3693   sub b
3694   add a,a
3695   ld  (line1sm+1),a
3696   ld  a,h
3697   sub b
3698   pop hl
3699 LineLoopGentle:
3700   psh af
3701   ld  a,(hl)
3702   or  c
3703   ld  (hl),a
3704   rrc c
3705   jr  nc,$+3
3706   inc hl
3707   pop af
3708   jp  m,line2sm
3709 line1sm:
3710   add a,0
3711   add hl,de
3712 line2sm:
3713   add a,0
3714   dnz LineLoopGentle
3715 DoneLine:
3716   ld  a,(hl)
3717   or  c
3718   ld  (hl),a
3719   pop de
3720   pop hl
3721   pop bc
3722   ret
3723 SteepLine:
3724   ld  h,a
3725   neg
3726   add a,a
3727   ld  (line3sm+1),a
3728   ld  a,b
3729   add a,a
3730   ld  (line4sm+1),a
3731   sub h
3732   ld  b,h
3733   pop hl
3734 LineLoopSteep:
3735   psh af
3736   ld  a,(hl)
3737   or  c
3738   ld  (hl),a
3739   add hl,de
3740   pop af
3741   jp  m,line4sm
3742 line3sm:
3743   add a,0
3744   rrc c
3745   jr  nc,$+3
3746   inc hl
3747 line4sm:
3748   add a,0
3749   dnz LineLoopSteep
3750   jr  DoneLine
3751
3752 ;..and last but not least..:
3753 ;-----------------------------
3754 ;----------- link ------------
3755 ;-----------------------------
3756
3757 timeout = $8000
3758 lossout = 20
3759
3760 linkok:
3761   ld  a,D0HD1H
3762   out (7),a             ;raise both wires = link ok
3763   ret
3764
3765 checklink:              ;load wires in A and check for timeout
3766   dec de                ;decrease timer
3767   ld  a,d
3768   or  e
3769   jr  z,linktimeout     ;timeout if de==0
3770 linktest:
3771   ld  a,$BF
3772   out (1),a             ;select keys
3773   in  a,(1)             ;input
3774   bit 6,a               ;exit key
3775   jp  z,Exit            ;break!
3776 linkfine:
3777   in  a,(7)
3778   and %11
3779   ret
3780 linktimeout: ;de==0
3781   cal linkok
3782   ld a,0                ;losses so far
3783 linklosses =$-1
3784   inc a                 ;and this is another one
3785   ld (linklosses),a
3786   pop de                ;return from link
3787   cp  lossout           ;quit if too many errors
3788   ret c                 ;otherwise just continue
3789 linkerr:
3790   jp  Exit
3791
3792 ;---- SEND ----
3793
3794 Qsend:          ;--- try to send 8 bits in C; CF=error --- destr:abcde ---
3795   nop \ nop
3796   cal linkfine
3797   jr  z,linkerr         ;both wires low = exit signal
3798   ld  b,8               ;bits to send
3799 sendloop:
3800   ld  de,timeout
3801   rl  c                 ;bit to send in cf
3802   ld  a,D0LD1H          ;0: lower white
3803   jr  nc,sendbit
3804   ld  a,D0HD1L          ;1: lower red
3805 sendbit:
3806   out (7),a             ;lower one (send bit)
3807 sendwaitack:
3808   cal checklink         ;other calc must lower other wire
3809   jr  nz,sendwaitack
3810   cal linkok            ;raise one, ok to raise other (out (7),D0HD1H)
3811 sendfinish:
3812   cal checklink
3813   cp  %11               ;both raised (by other calc)
3814   jr  nz,sendfinish
3815 ; nop \ nop
3816   dnz sendloop          ;repeat for all bits
3817   xor a                 ;nc...
3818   ld (linklosses),a     ;reset number of losses
3819   ret                   ;=ok
3820
3821 ;---- RECV ----
3822
3823 Crecv:          ;--- receive 8 bits into A/C --- destr:abCde ---
3824   cal Qrecv
3825   ret nc                ;return if all went ok
3826   jr  Crecv             ;and try again
3827
3828 Qrecv:          ;--- receive 8 bits into A/C; CF=error --- destr:abCde ---
3829   cal linkfine
3830   jr  z,linkerr         ;both low = error, quit
3831   ld  b,8               ;bits to receive
3832 recvloop:
3833 ;  ld  de,timeout
3834 recvwait:
3835   cal linktest ;checklink
3836   cp  %11
3837   jr  z,recvwait        ;both high = nothing sent (yet)
3838   ld  de,timeout
3839   rra                   ;received bit in cf
3840   ld  a,D0LD1H
3841   jr  c,received        ;lower white wire as well
3842   ld  a,D0HD1L          ;lower red
3843 received:
3844   rl  c                 ;save bit in c
3845   out (7),a             ;both wires low
3846 recvwaitack:
3847   cal checklink
3848   jr  z,recvwaitack     ;same wire will be raised again by other calc
3849   cal linkok            ;raise both
3850 recvfinish:
3851   dnz recvloop          ;repeat for all bits
3852   xor a                 ;nc=no error
3853   ld (linklosses),a     ;reset number of losses
3854   ret
3855
3856
3857 ;-----------------------------
3858 ;---------- levels -----------
3859 ;-----------------------------
3860
3861 ;&&&&& 99%
3862 LevelDef:
3863   .db 5,4,15,15,0,0     ;peas,speed,growth,begin_size,sprite,balls
3864   .db 0,2,63            ;start d, y, x
3865   .db 128,57            ;field width (128-255), height (57-255)
3866   .db 0                 ;no additional lines, boxes
3867
3868   .db 255               ;last level
3869    ret                  ;ending code
3870
3871 LevelDefM:
3872   .db "Empty Arena",0
3873   .db 8,4,15,15,0,0
3874   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
3875   .db 128,57
3876   .db 0
3877
3878   .db "Fast Fun :))",0
3879   .db 8,0,18,12,5
3880   .db %1110000,%10001000,%10001000,%10001000,%1110000,0
3881   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
3882   .db 128,57
3883   .db 0
3884
3885   .db "Two Circles",0
3886   .db 8,5,18,12,0,0
3887   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
3888   .db 128,57
3889   .db 4,40,26,20,0
3890   .db 4,90,40,11,0,0
3891
3892 LevelDefT: ;tron=no delay
3893   .db "Empty Tron Level",0
3894   .db 8,4,18,12,5
3895   .db %1110000,%10001000,%10001000,%10001000,%1110000,0
3896   .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
3897   .db 128,57
3898   .db 0
3899
3900 LevelDefR: ;race
3901   .db "Round and Round",0
3902   .db 8,4,18,12,5
3903   .db %1110000,%10001000,%10001000,%10001000,%1110000,0
3904   .db $40,23,2,$C0,23,125, $40,35,2,$C0,35,125
3905   .db 128,57
3906   .db 63,27
3907   .db 4,63,27,10,0,0
3908
3909 LevelDefC: ;ctf
3910   .db "Default CTF",0
3911   .db 8,4,18,12,5
3912   .db %1110000,%10001000,%10001000,%10001000,%1110000,0
3913   .db $40,23,2,$C0,23,125, $40,35,2,$C0,35,125
3914   .db 128,57
3915   .db 27,8,27,116
3916   .db 0
3917
3918 ;-----------------------------
3919 ;---------- data -------------
3920 ;-----------------------------
3921
3922 wtPicture: ;title
3923 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
3924 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000
3925 .db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000
3926 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000,%00110000,%01111100,%00010001,%11001001,%00001000,%00100000,%10000010,%00010000
3927 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000,%00110000,%11101100,%00010001,%11000100,%10000001,%00000100,%10001110,%00001000
3928 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000,%00110000,%11000110,%00001100,%00000010,%01100010,%10011100,%00010001,%00001000
3929 .db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000,%00111001,%11000110,%00000011,%11000010,%00011100,%01100010,%00100001,%01101000
3930 .db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100,%00111001,%11000110,%01111000,%00100001,%00000000,%00000001,%11000001,%01101000
3931 .db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00011111,%10000110,%10000101,%11100001,%00000000,%00000000,%00000001,%00010000
3932 .db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00001111,%00001110,%10010110,%00010001,%00000000,%00000000,%00000000,%11100000
3933 .db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100,%00000000,%00001100,%01100100,%00001001,%00111111,%11111111,%11000000,%00000000
3934 .db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001110,%00000000,%00001100,%01000000,%10000001,%01000000,%00000000,%00000000,%00000000
3935 .db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00000110,%00000000,%00011100,%01000000,%11000001,%01100101,%01001001,%10000011,%01100011
3936 .db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00000111,%10000000,%00111000,%01000001,%00100001,%00110101,%00010101,%01000101,%01010100
3937 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00000011,%11111111,%11110000,%00111110,%00011110,%00010111,%01011101,%10010101,%01100101
3938 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00000000,%11111111,%11100000,%00000000,%00000000,%11100101,%01010101,%01000110,%01010011
3939
3940 wtWormy: ;g/o
3941 .db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000
3942 .db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000
3943 .db %00100000,%10000011,%00010001,%00110010,%00011000,%00010011,%01101010,%11000000,%00111011,%01001101,%10000110,%01000000,%11000000,%00000000,%10000001,%00010000
3944 .db %00100000,%00000000,%00001110,%00110010,%00011001,%10011011,%01101010,%11100000,%00110011,%01101101,%11000111,%10000001,%00011100,%00000000,%00000000,%00001100
3945 .db %01001100,%00011000,%00000000,%00000100,%00011000,%11011111,%01100010,%11001100,%00110011,%01101101,%10000111,%11000001,%00011100,%00111000,%00011000,%10000010
3946 .db %01010010,%00100100,%01100000,%00011000,%00011111,%11011011,%11101110,%11111100,%00011111,%01111000,%11110110,%11100000,%11000000,%11000110,%00101001,%10000010
3947 .db %01100001,%11000011,%10011111,%11100000,%00001111,%10001001,%11001100,%01111000,%00001110,%00110000,%01100110,%01100000,%00111111,%00000001,%11000110,%01111100
3948
3949 ;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000
3950
3951 txtMenu:  .db "Mode",0  ;1st menu item
3952           .db "Level",0 ;2nd
3953           .db "Link",0  ;...
3954           .db "Worms",0
3955           .db "worm #",0
3956 posMenu:  .db 5
3957           .dw $2418,$231E,$2824,$1F2A,$1730
3958 txtMenuR: .db "controls",0
3959 txtoMenu: .db "Back",0  ;1st menu item
3960           .db "Lives",0 ;2nd
3961           .db "Limit",0 ;...
3962           .db "Speed",0
3963           .db "Rotation",0
3964           .db "Growth",0
3965 posoMenu: .db 6
3966           .dw $2618,$251E,$2524,$222A,$1A30,$1C36
3967 txtpMenu: .db "Resume",0  ;1st menu item
3968           .db "Turn Off",0 ;2nd
3969           .db "Contrast",$CF,5,0  ;...
3970           .db "Exit",0
3971 pospMenu: .db 4
3972           .dw $3418,$331E,$2F24,$3A2A
3973 txtGame:  .db "Singleplayer",0
3974 txtGame1: .db "Peaworm",0
3975 txtGame2: .db "Tron",0
3976 txtGame3: .db "Deathmatch",0
3977 txtGame4: .db "Foodmatch",0
3978 txtGame5: .db "Timematch",0
3979 txtGame6: .db "Race",0
3980 txtGame7: .db "CTF" ;,0
3981
3982 posGame:  .db 0
3983           .db txtGame1-txtGame
3984           .db txtGame2-txtGame
3985           .db txtGame3-txtGame
3986           .db txtGame4-txtGame
3987           .db txtGame5-txtGame
3988           .db txtGame6-txtGame
3989           .db txtGame7-txtGame
3990
3991 txtNone:   .db "None",0
3992 txtDef:    .db "Default",0
3993 txtYes:    .db "Yes",0
3994 txtNo:     .db "No",0
3995 txtKeyleft: .db ":left",0
3996 txtKeyright:.db "/right",0
3997 posLevsel = $0320
3998 txtLevsel:  .db $CF," SELECT LEVELS ",5,0
3999 txtWaiting: .db "Waiting...",0
4000 txtReceive: .db "Receiving..." ;,0
4001
4002 TrigPrecalc:
4003 .db   0,  3,  6,  9, 12, 15, 18, 21
4004 .db  24, 27, 30, 33, 36, 39, 42, 45
4005 .db  48, 51, 54, 57, 59, 62, 65, 67
4006 .db  70, 73, 75, 78, 80, 82, 85, 87
4007 .db  89, 91, 94, 96, 98,100,102,103
4008 .db 105,107,108,110,112,113,114,116
4009 .db 117,118,119,120,121,122,123,123
4010 .db 124,125,125,126,126,126,126,126
4011 .db 127
4012
4013 txtLevel:  .db "Level ",0
4014 txtWorms:  .db "Worms: 0",0     ;follows txtLevel
4015 txtName:   .db "Name",0
4016 txtWinner: .db "Wins   "        ;follows txtName
4017 txtDied:   .db "Died    "       ;follows txtWinner
4018 txtScore:  .db "Score",0        ;follows txtDied
4019 txtLeft:   .db " left",0        ;follows txtScore
4020 txthiscore:.db "HiScore:",0
4021 #ifdef readytext
4022 txtReady:  .db "Prepare!",0
4023 txtposReady = 7
4024 #endif
4025 #ifndef coolzgfx
4026 txtGO:     .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
4027 #endif
4028
4029 datalevels: .dw LevelDef, LevelDefM
4030             .dw LevelDefT,LevelDefM
4031             .dw LevelDefM,LevelDefM
4032             .dw LevelDefR,LevelDefC
4033 nrlevels:   .db 0,3,1,3,3,3,3,1     ;=defaults
4034
4035 _datalink       = %0000001 ;linkplay
4036 _datafoodl      = %0000010 ;left=0 limit
4037 _datasingl      = %0000100 ;singleplayer=1 (=hiscore+keep_length+nextlevel)
4038 _datamultpeas   = %0001000 ;multiple peas=1
4039 _datatime       = %0010000 ;time incs score (timematch)
4040 _datafood       = %0100000 ;food present
4041 _datadie        = %1000000 ;worm dies on impact
4042 ;reserved        %10000000 ;for future use
4043
4044 savestart:        ;     �game info (see above)
4045                   ;     | �lives (0=unlimited)
4046                   ;     | | �nrworms (can be altered by user)
4047                   ;     | | | �level (reset to 1 at startup)
4048                   ;     | | | |  �speed/delay (-1=def)
4049                   ;     | | | |  |  �grow speed (-1=none; 0=continuous)
4050                   ;     | | | |  |  |  �turn speed (8=def)
4051                   ;     | | | |  |  |  |  �score limit (0=none)
4052 gamesingle   =  0 ;used | | | |  |  |  |  |
4053 datasingle: .db  %1100110,3,1,1,-1,-1, 8, 0 ;Singleplayer (SP; 3 lives)
4054 gamepeas     =  1
4055 datapeas:   .db  %1100100,1,1,1,-1,-1, 8, 0 ;Peaworm (SP; 1 live)
4056 gametron     =  2
4057 datatron:   .db  %1010100,1,1,1,-1, 0, 8, 0 ;Tron (SP; 1 live, cont.growth)
4058 gamedeathm   =  3 ;used
4059 datadeathm: .db  %1000000,3,2,1,-1,49, 8, 0 ;Deathmatch (3 lives, 50 growth)
4060 gamefoodm    =  4
4061 datafoodm:  .db  %1100000,0,2,1,-1,-1, 8,10 ;Foodmatch (100 score)
4062 gametimem    =  5
4063 datatimem:  .db  %1010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score)
4064 gamerace     =  6 ;used
4065 datarace:   .db  %0000000,0,2,1,-1,-1, 8,10 ;Race (100 score, no collision)
4066 gamectf      =  7 ;used
4067 datactf:    .db  %1001000,0,4,1,-1,-1, 8,10 ;CTF (100 score)
4068
4069 worm1set:  .dw worm1p,worm1p
4070            .db %11110111,1,-01,K_RIGHT,K_LEFT
4071 worm1name: .db "WORMY   ",0
4072 worm2set:  .dw worm2p,worm2p
4073            .db %11111011,0,-01,K_F2,K_F1
4074 worm2name: .db "VIPER   ",0
4075 worm3set:  .dw worm3p,worm3p
4076            .db %11111011,1,-01,K_COMMA,K_STO
4077 worm3name: .db "NIBBLER ",0
4078 worm4set:  .dw worm4p,worm4p
4079            .db %11111011,0,-01,K_PLUS,K_ENTER
4080 worm4name: .db "JIM     ",0
4081
4082 defhiscrpos:
4083   .db 0,0,"SHI"
4084   .db 0,0,"SHI"
4085   .db 0,0,"SHI"
4086   .db 0,0,"SHI"
4087   .db 0,0,"SHI"
4088
4089 Gametype:  .db 0 ;last gamemode
4090
4091 saveend:
4092
4093                ;set:
4094 heading  = 0   ;level*
4095 pos      = 2   ;level*
4096 pos2     = 4   ;level
4097 grow     = 6   ;level
4098 died     = 8   ;game
4099 score    = 9   ;game
4100 delay    = 11  ;game
4101                ;19B @game
4102 lives    = 12
4103 head     = 13  ;4B (head=tail)
4104 tail     = 15  ;also@next level
4105 storepos = 17
4106 reserv   = 18  ;loop (race:lap|ctf:pea)
4107 input    = 19 ;---currently unused afaik---
4108 left     = 20
4109 right    = 21
4110 name     = 22
4111 wormsize = 31
4112
4113 startdelay    = 30
4114 respawndelay  = 30
4115 maxnamelength = 8+1
4116
4117 ;bla space (reserved for internal levels)
4118 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4119 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4120 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4121 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4122 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4123 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4124 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4125 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4126 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4127 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4128 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4129 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4130 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4131 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4132 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4133 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4134 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4135 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4136 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4137 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4138 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4139 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4140 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4141 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4142 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4143 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4144 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4145 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4146 .db "WWW.SHIAR.ORG  WWW.SHIAR.ORG  "
4147 .db "   wormy@shiar.org",0
4148
4149 defspritesz = 4
4150 defspriteimg:   .db %01100000
4151                 .db %11110000
4152                 .db %11110000
4153                 .db %01100000
4154
4155 deflevels:
4156   .db "Internal Levels",0
4157   .db "by SHIAR -- still t"
4158   .db "o be added...." ;,0
4159
4160   .db 0,deflevels/256,deflevels&255
4161 templevels:
4162
4163 ;-----------------------------
4164 ;----------- end -------------
4165 ;-----------------------------
4166
4167   .end
4168
4169 .end