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