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