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