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