worm 0.90.0503: ctf, example level file
[wormy.git] / worm.z80
1 ; Title                      : Worm
2 ; Version                    : 90%
3 ; Release Date               : april 2000???
4 ; Filename                   : worm.86p (4kb)
5 ; Author(s)                  : Shiar
6 ; Email Address              : shiar@mailroom.com
7 ; ICQ UIN                    : #43840958
8 ; Web Page                   : www.games3.net/shiar
9 ; Description                : ruling multiplayer game for 86 (most like Nibbles)
10 ; Where to get this game     : games3.net/shiar (home of Worm)
11 ; Other games by author(s)   : Shiar: Nemesis beta
12 ; Additional Credits to      : Matthew Shepcar (wrote original Peaworm, end'98)
13 ;                              Jonah Cohen (wrote some parts of worm)
14
15 ;-----------------------------
16 ;----------- TO-DO -----------
17 ;-----------------------------
18
19 ; 90% = DONE
20
21 ;  3% * linkplay
22 ;  2% * make linkplay available for all gametypes (not just deathmatch)
23 ;     * game types:
24 ;  1%   * ctf: take enemy flag (right-bottom) and return to your flag (left-top)
25 ;  1%   * domination?: take control points by running over them and hold them
26 ;     * complete readme (+custom level info)
27 ;  2% * ... (pollish, &&&)
28
29 ; 99% = beta release
30
31 ;100% = bugs fixed + levels done
32
33 ;-----------------------------
34 ;-----------------------------
35 ;---------  W O R M  ---------
36 ;-----------------------------
37 ;-----------------------------
38
39 #define buffer  ;use display buffer (otherwise write directly to screen)
40
41 #define cal call
42 #define psh push
43 #define dnz djnz
44
45 #include "asm86.h"
46 #include "ti86asm.inc"
47
48 _SHRACC            = $4383
49 _SHLACC            = $438B
50 _divHLby10         = $4044 ;hl=hl/10
51 _divAby10          = $4DAF ;a=a/10
52 _HLTIMES10         = $41BF ;hl=hl*10
53 _cphlde            = $403C
54 _clrWindow         = $4A86 ;clear screen
55 _asapvar           = $D6FC ;own name (worm)
56 _MOV4B             = $429B ;4x ld (de),(hl)
57 _MOV5B             = $4297 ;5x ld (de),(hl)
58 _mov9b             = $4283 ;9x ld (de),(hl)
59 _ldHLind           = $4010 ;ld hl,(hl)
60 _swapt_            = $45F3 ;ex_ahl_bde
61 _Get_Word_ahl      = $521D ;ld de,(ahl)
62 _Set_Word_ahl      = $5221 ;ld (ahl),de
63 _INC_PTR_AHL       = $4637 ;ahl=ahl+1
64 _AHL_PLUS_2_PG3    = $4C3F ;ahl=ahl+2
65 _SET_ABS_SRC_ADDR  = $4647 ;set source for mm.ldir =ahl
66 _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source
67 _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl
68 _SET_MM_NUM_BYTES  = $464F ;number of bytes for mm.ldir = ahl
69 _mm_ldir           = $52ED ;24bit ldir
70 _RAM_PAGE_1        = $47E3 ;set $8000+ to page 1
71 _RAM_PAGE_7        = $47F3
72 _PTEMP_END         = $D29A ;end of VAT
73 _load_ram_ahl      = $462F ;ahl->page+hl
74 _writeb_inc_ahl    = $5567 ;ld (ahl),c
75
76 ;-----------------------------
77 ;------- data  storage -------
78 ;-----------------------------
79
80 ;--- permanent
81
82 ScrBuffer   = $8820 ;-A7FF (20*FF=1FE0)
83 worm2p      = $A800 ;-ABFF (400)      %10101O00
84 worm1       = $AC00 ;-AC1D (31d)
85 worm2       = $AC1F ;-AC3B (1F)
86 worm3       = $AC3E ;-AC59 (1F)
87 worm4       = $AC5D ;-AC77 (1F)
88 balls       = $AC7C ;-ACFF (3x43d)
89 SinCosTable = $AD00 ;-AE00 (4x40)
90         ;free $AE01 ;-AFFF (1FF)
91 worm1p      = $B000 ;-B7FF (800)      %1011O000
92 worm3p      = $B800 ;-BBFF (400)      %10111O00
93         ;free $BF91 ;-BFFF (6F)
94
95      ;program $D748 ;-E7FF (106D+4A)
96         ;free $E800 ;-EFFF (800)
97 worm4p      = $F000 ;-F3FF (400)      %11110O00
98 leveldata   = $F400 ;-FA70 (<=671)
99
100 peaspos = $AE01
101
102 ;--- temporary
103
104 templevels  = $BC00 ;(3*strings) @init
105 namelength  = $BC00 ;(1)         @menu
106 #ifdef buffer
107 DispBuffer  = $BC00 ;(10x57d)    @game
108 #else
109 DispBuffer  = $FC70
110 #endif
111
112 ;-----------------------------
113 ;------- program start -------
114 ;-----------------------------
115
116 .org _asm_exec_ram
117
118 WormVersion = 090
119
120 start:
121   nop
122   jp Start
123   .dw 1
124   .dw WormMsg
125   .dw WormIcon
126
127 WormMsg:
128   .db "WORM by SHIAR -- pre-beta 90%",0
129 WormIcon:
130   .db 9,2
131   .db %10010110,%01101111
132   .db %10110101,%01001011
133   .db %01110011,%01001001
134   .db %00000011,%10000000
135   .db %00000001,%11100000
136   .db %00111000,%11111000
137   .db %01111110,%00111111
138   .db %11101111,%00001111
139   .db %11000011,%10000000
140
141 levelhead  = 'w'
142 levelhead2 = 90 ;worm levels header = "90"
143
144 Start:
145   ld  (SpSave),sp
146   cal _runindicoff
147   cal _flushallmenus
148
149   cal _RAM_PAGE_7
150   ld  hl,$BFFF ;VAT start
151   ld  bc,templevels
152 searchloop:
153   ld  de,(_PTEMP_END+1) ;VAT end
154   or  a ;nc
155   sbc hl,de ;hl<de?
156   jr  c,searchcomplete
157   add hl,de
158   psh hl
159   ld  a,(hl)
160   cp  $0C ;string
161   jr  z,stringfound
162 searchnext:
163  cal _RAM_PAGE_7
164   pop hl
165   dec hl ;5x
166   dec hl
167   dec hl
168   dec hl
169   dec hl
170  psh bc
171   ld  b,(hl) ;name size
172   inc b
173 skipname:
174   dec hl
175   dnz skipname
176  pop bc
177   jr  searchloop
178
179 stringfound:
180   dec hl
181   ld  e,(hl)
182   dec hl
183   ld  d,(hl)
184   dec hl
185   ld  a,(hl)
186   ex  de,hl ;ld ahl,(hl)
187   cal _AHL_PLUS_2_PG3 ;string id
188   cal _Get_Word_ahl ;ld de,(ahl)
189  cal _RAM_PAGE_1
190  ld (bc),a
191   ld  a,levelhead
192   cp  e
193   jr  nz,searchnext ;not worm
194   ld  a,levelhead2
195   cp  d
196   jr  nz,searchnext
197
198  inc bc
199  ld a,h
200  ld (bc),a
201  inc bc
202  ld a,l
203  ld (bc),a
204  inc bc
205  jr searchnext
206
207 loadgametype:
208   psh de
209   inc bc
210   inc bc
211   cal _Get_Word_ahl ;ld de,(ahl++)
212   psh af
213   ld  a,d
214   or  e
215   jr  z,defaultlevels
216   ld  a,e ;set new level
217   ld  (bc),a
218   inc bc
219   ld  a,d
220   ld  (bc),a
221   dec bc
222 defaultlevels:
223   pop af
224   pop de ;counter
225   dec d ;8x
226   jr  nz,loadgametype
227   ret
228
229 searchcomplete:
230   cal _RAM_PAGE_1
231   ld  a,255
232   ld  (bc),a ;end mark
233   ld  hl,templevels
234   psh hl
235   or  a
236   sbc hl,bc
237   pop hl
238   jp  z,_clrWindow ;no ext files: exit
239 dispnextlevel:
240   cal _RAM_PAGE_1
241   psh hl
242   cal _clrWindow
243   ld  a,2
244   ld  (_curRow),a
245   ld  hl,txtLevsel
246   cal _puts ;"< Select levels: >"
247   ld  hl,$0004
248   ld  (_curRow),hl
249   pop hl
250   ld  a,(hl)
251   cp  255
252   jr  nz,displevel
253   ld  hl,templevels
254   ld  a,(hl)
255 displevel:
256   inc hl
257   ld  d,(hl)
258   inc hl
259   ld  e,(hl)
260   inc hl  ;ade=(hl)
261   psh hl  ;HL
262   ld  c,a
263   ld  h,d
264   ld  l,e ;cde=ahl=(hl)
265   cal _load_ram_ahl ;hl=ahl
266   ld  b,(hl) ;b=title size
267   psh bc
268   cal _putps ;destr=abchl
269   pop bc  ;cde=hl
270   pop hl  ;HL
271 levselect:
272   halt
273   psh hl
274   psh de
275   psh bc
276   cal GET_KEY
277   pop bc
278   pop de
279   pop hl
280   cp  K_RIGHT
281   jr  z,dispnextlevel
282   sub K_SECOND
283   jr  z,loadlevel
284   dec a ;K_EXIT
285   ret z
286   cp  K_ENTER-K_EXIT+256
287   jr  nz,levselect
288
289 loadlevel:
290   ld  a,c
291   ex  de,hl ;ahl=cde
292   inc b ;b=titlesize+1
293 skiptitle:
294   cal _INC_PTR_AHL
295   dnz skiptitle
296
297   cal _Get_Word_ahl
298   ld  (leveldataSize),de
299   ld  d,8 ;counter
300   ld  bc,datalevels-2
301   cal loadgametype
302   ld  (hilvlposa),a
303   ld  (hilvlposhl),hl
304   ld  d,4
305   cal loadgametype
306
307   cal _SET_ABS_SRC_ADDR
308   xor a
309   ld  hl,leveldata
310   cal _SET_ABS_DEST_ADDR
311  xor a
312   ld  hl,0
313 leveldataSize =$-2
314   cal _SET_MM_NUM_BYTES
315   cal _mm_ldir
316
317   cal _LOAD_ABS_SRC_ADDR ;->ahl
318 levelloaded:
319   ld  (hiscrposa),a
320   ld  (hiscrposhl),hl
321  cal _RAM_PAGE_1 ;&&&
322
323   res 2,(iy+13) ;appAutoScroll
324   ld  a,r
325   ld  (Seed),a
326
327 ;-----------------------------
328 ;----- build trig tables -----
329 ;-----------------------------
330
331   ld  hl,TrigPrecalc
332   ld  de,SinCosTable
333   psh de                        ; >> 1
334   ld  bc,65
335   ldir
336   dec hl
337   ld  b,63
338 MirrorSineWave:
339   dec hl
340   ld  a,(hl)
341   ld  (de),a
342   inc de
343   dnz MirrorSineWave
344   pop hl                         ; << 0k
345   ld  b,128+64
346 NegativeSineWave:
347   xor a
348   sub (hl)
349   ld  (de),a
350   inc hl
351   inc de
352   dnz NegativeSineWave
353
354 ;-----------------------------
355 ;---------- menu -------------
356 ;-----------------------------
357
358   ld  a,1
359   ld  (curlevel),a
360 DisplayMenu:
361   cal _clrWindow
362   ld  de,$FC42 ;(10,2)
363   ld  hl,wtPicture
364   ld  a,16 ;height
365 disptitleloop:
366   ld  bc,8 ;width
367   ldir
368   ex  de,hl
369   ld  bc,8 ;next line
370   add hl,bc
371   ex  de,hl
372   dec a
373   jr  nz,disptitleloop
374
375   ld  hl,txtMenu
376   ld  de,$0D5A
377   ld  (_penCol),de
378   cal _vputs ;by Shiar
379   ld  de,$0207
380   ld  (_curRow),de
381   cal _puts ;---
382   dec e ;$0206
383   ld  (_curRow),de
384   cal _puts ;Level
385   dec e ;$0205
386   ld  (_curRow),de
387   cal _puts ;Worms: 2
388   dec e ;$0204
389   ld  (_curRow),de
390   ld  hl,(CURtxtGame)
391   cal _puts ;Singleplayer
392
393   xor a
394   cal menudraw
395   jr  howmanyworms
396 mainMenu:
397   cal menucall
398   jr  nz,notselect
399 select:
400   ld  a,b
401   dec a ;2nd item
402   jp  z,changeworms
403   jp  LetsGetThisPartyOn ;1/3/4
404 notselect
405   cp  K_EXIT
406   jp  z,ExitNoStats
407   cp  K_RIGHT
408   ld  a,b
409   jr  nz,mainMenu
410   or  a
411   jr  z,changegame
412   dec a
413   jr  z,changenrworms
414   dec a
415   jp  nz,LetsGetThisPartyOn
416
417 changelevel:
418   ld  hl,Gametype
419   ld  d,0
420   ld  e,(hl)
421   ld  hl,nrlevels
422   add hl,de
423   ld  d,(hl) ;max level for sel.game
424   ld  a,1
425 curlevel =$-1
426   inc a
427   cp  d
428   jr  c,changedlevel
429   ld  a,1
430 changedlevel:
431   ld  (curlevel),a
432 dispcurlevel:
433   ld  hl,$0806
434   ld  (_curRow),hl
435   cal showA
436   jr  mainMenu
437
438 changegame:
439   ld  a,1
440   ld  (curlevel),a
441   ld  a,0
442 Gametype =$-1
443   ld  hl,txtGame2
444 NEXTtxtGame =$-2
445   inc a
446   and 7 ;mod 8
447   jr  nz,okilydokily
448   ld  hl,txtGame
449 okilydokily:
450   ld  (Gametype),a
451   ld  de,$0204
452   ld  (_curRow),de
453   ld  (CURtxtGame),hl
454   cal _puts
455   ld  (NEXTtxtGame),hl
456 howmanyworms:
457   ld  a,(Gametype)
458   cp  2
459   ld  a,1
460   jr  c,oneworm
461 nrworms =$+1
462   ld  a,2
463 oneworm:
464   jr  dispnrworms ;jr mainMenu
465
466 changenrworms:
467   ld  a,(Gametype)
468   cp  2
469   jr  c,mainMenu ;type 0/1
470   ld  hl,nrworms
471   ld  a,(hl)
472   inc a
473   cp  5
474   jr  c,changednrworms
475   ld  a,1
476 changednrworms:
477   ld  (hl),a
478 dispnrworms:
479   ld  hl,$0905
480   ld  (_curRow),hl
481   cal showA
482   ld  a,(curlevel)
483   jr  dispcurlevel ;mainMenu
484
485 menucall:
486   psh bc
487 menuwaitkey:
488   halt \ halt
489   cal GET_KEY
490   or  a
491   jr  z,menuwaitkey
492   pop bc ;pop a as b
493   cp  K_UP
494   cal z,menuup
495   cp  K_DOWN
496   cal z,menudown
497   cp  K_ENTER
498   ret z
499   cp  K_SECOND
500   ret ;z=select
501
502 menupos:
503   ld  a,b
504   add a,4
505   ld  h,0
506   ld  l,a
507   ld  (_curRow),hl
508   ret
509 menuclr:
510   cal menupos
511   ld  a,' '
512   jp  _putc
513 menudown:
514   cal menuclr
515   inc b
516   jr  menuupdown
517 menuup:
518   cal menuclr
519   dec b
520 menuupdown:
521   ld  a,b
522   and %11 ;4=0;-1=3
523 menudraw:
524   ld  b,a
525   cal menupos
526   ld  a,'*'
527   jp  _putc ;a=K_STO
528
529 changeworms:
530   cal _clrWindow
531   ld  hl,txtName
532   cal _puts ;"Enter name player "
533   ld  a,(Gametype)
534   cp  2
535   ld  a,1
536   jr  c,wormnrname
537   ld  a,(nrworms)
538 wormnrname:
539   add a,'0'
540   cal _putc
541   sub '0'
542   add a,a  ;2x
543   ld  e,a
544   add a,a  ;4x
545   add a,a  ;8x
546   add a,a ;16x
547   add a,e ;18x
548   ld  e,a
549   ld  d,0
550   ld  ix,worm1name-18
551   add ix,de
552   ld  a,maxnamelength
553   cal entername
554   ld  (ix),0
555   jp  DisplayMenu
556
557 entername:
558   ld  h,1
559   ld  l,h
560   ld  (_curRow),hl
561   ld  (namelength),a
562 enternameloop:
563   ld  a,'_'
564   cal _putc
565   ld  hl,_curCol
566   dec (hl)
567 nokeypressed:
568   halt
569   cal GET_KEY
570   or  a
571   jr  z,nokeypressed
572
573   cp  K_DEL
574   jr  nz,continue
575 backspace:
576   ld  hl,namelength
577   ld  a,(hl)
578   cp  maxnamelength
579   jr  nc,nokeypressed
580   inc (hl)
581
582   dec ix
583   ld  a,' '
584   ld  (ix),a
585   cal _putc
586   ld  hl,_curCol
587   dec (hl)
588   dec (hl)
589   jr  enternameloop
590 continue:
591   cp  K_ENTER
592   ret z
593   cp  K_EXIT
594   ret z
595
596   ld  hl,namelength
597   dec (hl)
598   ret z
599
600   ld  hl,chartable
601   ld  e,a
602   ld  d,0
603   add hl,de
604   ld  a,(hl)
605   or  a
606   jr  z,nokeypressed
607
608   ld  (ix),a
609   cal _putc
610   inc ix
611   cal waitnokeypressed
612   jr  enternameloop
613
614 waitnokeypressed:
615   halt
616   cal GET_KEY
617   or  a
618   jr  nz,waitnokeypressed
619   ret
620
621 chartable:
622   .db 0,".<>!",0,0,0,0  ;down,L,R,up
623   .db 0,"xtoje0",0      ;enter..clear
624   .db " wsnid9",0       ;(-)..custom
625   .db "zvrmhc8",0       ;dot..del
626   .db "yuqlgb7#"        ;0..xvar
627   .db 0,"-pkfa6'"       ;on..alpha
628   .db "54321*",0,0      ;F5..more
629
630 ;--proc
631
632 skiplevel: ;@hl - destr:ab - alter:hl
633   inc hl
634   inc hl
635   inc hl
636   inc hl ;skip 4
637   ld  b,(hl) ;spritesize
638   inc b
639 skipsprite:
640   inc hl
641   dnz skipsprite
642   ld  b,(hl) ;balls
643   inc b
644   inc b ;skip 6
645   ld  a,c
646   and _datasingl
647   jr  nz,skipworms
648   inc b ;multiplayer lvl
649   inc b
650   inc b ;skip other 3 worms (9 bytes)
651 skipworms:
652   ld  a,b
653   add a,a
654   add a,b
655   ld  b,a ;3x(balls+2)
656 skipballs:
657   inc hl
658   dnz skipballs
659   cal skiplines ;lines
660 skiplines: ;boxes
661   ld  a,(hl) ;lines/boxes
662   add a,a
663   add a,a
664   inc a
665   ld  b,a ;4x(hl)+1
666 skiplb
667   inc hl
668   dnz skiplb
669   ret
670
671 ;-----------------------------
672 ;-------- start game ---------
673 ;-----------------------------
674
675 LetsGetThisPartyOn:
676   ld  a,$17 ;no exit
677   ld  (CheckExit),a ;set exit state
678
679   ld  hl,gamesdata
680   ld  a,(Gametype)
681   ld  e,a
682   ld  d,0
683   add hl,de
684   ld  a,(hl)
685   ld  (gameCar),a
686
687   add hl,de
688   ld  e,8 ;=de
689   add hl,de
690
691   ld  c,a
692   and _datasingl
693   jr  z,notsingle
694   ld  a,1
695   ld  (nrworms),a
696 notsingle:
697   ld  a,c
698   and _datascore
699   ld  de,$FF64 ;virt.infinate
700   jr  z,setscorelimit
701   ld  d,0 ;de=100
702 setscorelimit:
703   ld  (scorelimit),de
704
705   cal _ldHLind ;ld hl,(hl)
706   ld  a,(curlevel)
707   ld  (Level),a
708   ld  d,a ;begin level
709 skiplevelloop:
710   dec d ;levels to skip
711   jr  z,levelsskipped
712   cal skiplevel
713   jr  skiplevelloop
714 levelsskipped:
715
716   psh hl  ;1st level
717   ld  a,c
718   and _datalink
719   jr  z,GameOver
720
721 linkmatch:
722   cal _clrWindow
723   ld  a,WormVersion
724   cal send
725   jr  c,client ;2nd
726
727 host:
728   ld  hl,txtWaiting
729   cal _puts
730   cal receive
731   cp  WormVersion
732   jp  nz,LinkBreak
733   cal send
734
735   ld  hl,SwapPos
736   ld  (hl),$f6
737   jr  multiplayer
738
739 client:
740   ld  hl,txtReceive
741   cal _puts
742   cal receive
743   cp  WormVersion
744   jp  nz,LinkBreak
745
746 multiplayer:
747   ld  a,2
748   ld  (nrworms),a
749
750 ;-----------------------------
751 ;--------- game over ---------
752 ;-----------------------------
753
754 GameOver:
755   cal _clrLCD
756   ld  hl,0
757   ld  (worm1+died),hl
758 ;+died=0 \ +score1=0
759   ld  (worm2+died),hl
760   ld  (worm3+died),hl
761   ld  (worm4+died),hl
762   inc h
763   ld  (worm1+score+1),hl
764 ;+score2=0 \ +delay=1
765   ld  (worm2+score+1),hl
766   ld  (worm3+score+1),hl
767   ld  (worm4+score+1),hl
768   ld  hl,worm1set
769   ld  de,worm1+head
770   ld  a,4 ;4x (all worms)
771 createwormsloop:
772   ld  bc,19
773   ldir ;copy 19 bytes
774   ex  de,hl
775   ld  bc,head
776   add hl,bc
777   ex  de,hl ;de=wormX+head
778   dec a     ;loop
779   jr  nz,createwormsloop
780
781   ld  a,(Gametype)
782   cp  1 ;=peaworm
783   jr  nz,worminitdone
784   ld  (worm1+lives),a
785 worminitdone:
786   pop hl ;begin of current level
787
788 StartLevel:
789   ld  de,Left
790   ld  a,(hl)
791   inc a ;=255?
792   jp  nz,nextlevel
793
794   psh hl
795   ld  b,150
796 waitsomemore:
797   halt
798   dnz waitsomemore
799   cal _clrWindow
800   pop hl
801 ;show end msg or smtn
802   ld  bc,Exit
803   psh bc   ;where to go afterwards
804   inc hl   ;location of ending-code
805   jp  (hl) ;go there ("call")
806 nextlevel:
807   ldi
808   ld  de,Speed
809   ldi
810   ld  de,peagrowth
811   ldi
812   ld  a,(hl)
813   ld  (worm1+grow),a
814   ld  (worm2+grow),a
815   ld  (worm3+grow),a
816   ld  (worm4+grow),a
817   ld  (beginsize),a
818   inc hl
819
820   ld  a,(hl)
821   inc hl
822   or  a
823   jr  z,defaultsprite
824   ld  d,h
825   ld  e,l ;ld de,hl
826   ld  c,a
827   ld  b,0 ;bc=sprite size
828   add hl,bc ;hl=behind sprite
829   jr  setsprite
830 defaultsprite:
831   ld  a,defsprsize
832   ld  de,peasprite
833 setsprite:
834   ld  (sprsize),a
835   ld  (spritepos),de
836
837   ld  a,(hl)
838   inc hl
839   ld  (nrballs),a
840   or  a
841   jr  z,toobad_noballs
842   ld  c,a
843   add a,a
844   add a,c
845   ld  c,a
846   ld  b,0
847   ld  de,balls
848   ldir
849 toobad_noballs:
850
851   ex  de,hl
852   ld  (thislevel),de
853
854   ld  hl,worm1
855   ld  a,(gameCar)
856   and _datanextl
857   ld  b,1
858   jr  nz,worminit
859   ld  b,4
860 worminit:
861   psh bc                        ; >> 1
862   ex  de,hl
863   ldi          ;d
864   ld  a,SinCosTable/256
865   ld  (de),a
866   inc de
867   ldi          ;y
868   ldi          ;x
869   ex  de,hl
870
871   xor a
872   ld  (hl),a   ;y2
873   inc hl
874   ld  (hl),a   ;x2
875
876   ld  bc,(worm2-worm1)-5
877   add hl,bc
878   pop bc                         ; << 0k
879   dnz worminit
880
881 ;-------- draw level ---------
882
883   ld  a,(de)
884   inc de
885   sub 128
886   ld  (FieldWidth),a
887   ld  a,(de)
888   inc de
889   sub 57
890   ld  (FieldHeight),a
891   add a,57-5
892   psh de                        ; >> levelp
893   ld  l,a
894   ld  h,0
895   add hl,hl
896   add hl,hl
897   add hl,hl
898   add hl,hl
899   add hl,hl
900   ex  de,hl
901
902   ld  hl,ScrBuffer
903   psh hl                        ; >> 1
904   psh de                        ; >> 2
905   ld  de,ScrBuffer+1
906   ld  bc,63
907   ld  (hl),%11111111
908   ldir
909   inc hl
910   ld  (hl),%11000000
911   inc hl
912   ld  b,31
913 ClearLine:
914   ld  (hl),c
915   inc hl
916   dnz ClearLine
917   psh hl                        ; >> 3
918
919   ld  a,(FieldWidth)
920   add a,126
921   psh af                        ; >> 4
922   and %11111000
923   rra
924   rra
925   rra
926   ld  l,a
927   ld  h,0
928   add hl,de
929   pop af                         ; << 3
930   and %00000111
931   ld  b,a
932   ld  c,0
933   ld  a,%11000000
934   jr  z,NoVertShift
935 VertShift:
936   rra
937   rr  c
938   dnz VertShift
939 NoVertShift:
940   ld  (hl),a
941   inc hl
942   ld  (hl),c
943
944   ex  de,hl
945   pop de                         ; << 2
946   pop bc                         ; << 1
947   ldir
948   pop hl                         ; << 0k
949   ld  c,64
950   ldir
951
952 ;-draw lines-
953
954   pop hl                         ; << levelp
955   ld  a,(hl)
956   inc hl
957   or  a
958   jr  z,NoLines
959 DrawLines:
960   psh af                        ; >> 1
961   cal loaddrawdata
962   psh hl                        ; >> 2
963   ld  l,(hl)
964   ld  h,a
965   cal Line
966   inc d
967   inc h
968   cal Line
969   inc e
970   inc l
971   cal Line
972   dec d
973   dec h
974   cal Line
975   pop hl                         ; << 1
976   inc hl
977   pop af                         ; << 0k
978   dec a
979   jr  nz,DrawLines
980 NoLines:
981
982   ld  a,(hl)
983   inc hl
984   or  a
985   jr  z,noboxes
986 drawboxes:
987   psh af
988   cal loaddrawdata
989   psh hl
990   ld  l,(hl)
991   ld  h,a
992   cal drawbox
993   pop hl
994   inc hl
995   pop af
996   dec a
997   jr  nz,drawboxes
998 noboxes:
999
1000 ;-----------------------------
1001
1002   psh hl                        ; >> levelp new
1003   cal showstats
1004   ld  a,(Gametype)
1005   cp  gamectf
1006   jr  nz,noctf
1007   ld  hl,$1010
1008   ld  (peaspos),hl
1009   cal DrawPea
1010   ld  hl,$2010
1011   ld  (peaspos+3),hl
1012   cal DrawPea
1013 noctf:
1014   ld  a,(gameCar)
1015   and _datafood
1016   jr  z,nofood
1017   cal NewPea
1018 nofood:
1019   ld  bc,(worm1+pos)
1020   cal DisplayField
1021   ld  hl,$FDE0
1022   ld  de,$FDE1
1023   ld  (hl),%11111111
1024   ld  bc,$BF
1025   ldir
1026   ld  hl,4+(txtposReady*256)
1027   ld  (_curRow),hl
1028   set 3,(iy+5)
1029   ld  hl,txtReady
1030   cal _puts
1031   res 3,(iy+5)
1032
1033   ld  a,0
1034 gameCar =$-1
1035   and _datalink
1036   jr  z,SwapPos ;no link
1037   xor a
1038   ld  (worm2+input),a
1039   ld  (worm2+left),a
1040   ld  (Speed),a
1041
1042 SwapPos: ;$18 xx -> $F6 xx
1043   jr  initfinished
1044   inc a
1045   ld  (worm2+left),a
1046   ld  hl,(worm1+pos)
1047   ld  de,(worm2+pos)
1048   ld  (worm2+pos),hl
1049   ld  (worm1+pos),de
1050   ld  a,(worm1+heading)
1051   ld  b,a
1052   ld  a,(worm2+heading)
1053   ld  (worm1+heading),a
1054   ld  a,b
1055   ld  (worm2+heading),a
1056 initfinished:
1057
1058   ld  b,0
1059 ReadyDelay:
1060   halt
1061   dnz ReadyDelay
1062
1063 ;-----------------------------
1064 ;----------- LOOP ------------
1065 ;-----------------------------
1066
1067 GameLoop:
1068   ld  bc,(worm1+pos)
1069   cal DisplayField
1070
1071   ld  a,1
1072 flashtime =$-1
1073   dec a
1074   jr  z,noflash
1075   ld  (flashtime),a
1076   ld  hl,$fc00+(16*7)
1077 screeninvertloop:
1078   ld  a,(hl)
1079   cpl
1080   ld  (hl),a
1081   inc hl
1082   xor a
1083   cp  h
1084   jr  nz,screeninvertloop
1085 noflash:
1086
1087   ld  a,0
1088 Speed =$-1
1089   or  a
1090   jr  z,NoDelay
1091 Delay:
1092   halt
1093   dec a
1094   jr  nz,Delay
1095 NoDelay:
1096
1097   ld  a,0
1098 nrballs =$-1
1099   or  a
1100   cal nz,handlethoseneatlittleballs
1101
1102   ld  ix,worm1
1103   ld  a,(nrworms)
1104   ld  b,a
1105 handleworms:
1106   psh bc
1107   cal HandleWorm
1108   ld  bc,worm2-worm1
1109   add ix,bc
1110   pop bc
1111   dnz handleworms
1112
1113 ;-----------------------------
1114 ;---------- keys -------------
1115 ;-----------------------------
1116
1117 HandleKeys:
1118   ld  a,%10111111
1119   out (1),a
1120   in  a,(1)
1121   rla ;MORE?
1122   jr  c,CheckExit
1123   ld  bc,$0103
1124   out (c),b
1125   halt ;pause/off
1126   ld  b,11
1127   out (c),b
1128
1129 CheckExit:
1130   rla  ;=$17 (c=EXIT-key)
1131       ;or$A7 (c=0)
1132   jp  c,GameLoop
1133   jr  Exit
1134
1135 WormDead:
1136   ld  a,2
1137   ld  (flashtime),a
1138   ld  (ix+delay),respawndelay
1139
1140 thislevel =$+1
1141   ld  de,0
1142   ld  a,(de)
1143   inc de
1144   ld  (ix+heading),a
1145   ld  a,(de)
1146   ld  (ix+pos),a
1147   inc de
1148   ld  a,(de)
1149   ld  (ix+pos+1),a
1150
1151   inc (ix+died)
1152   dec (ix+lives)
1153   psh af
1154   ld  de,10
1155   cal DecScore
1156   pop af
1157   ret nz ;HandleWorm done
1158   ld  a,(gameCar)
1159   and _datalivel
1160   ret z
1161   ld  a,$A7 ;exit@end of turn
1162   ld  (CheckExit),a ;set exit state
1163   ret ;finish turn
1164
1165 Exit:
1166   ld  sp,0 ;pop all
1167 SpSave = $-2
1168   cal _clrWindow
1169   ld  hl,txtGO
1170   cal _puts
1171   ld  hl,txtGame
1172 CURtxtGame =$-2
1173   cal _puts
1174   ld  de,0002
1175   ld  (_curRow),de
1176   cal showLevel
1177   ld  de,$0B03
1178   ld  (_curRow),de
1179   ld  hl,txtDied
1180   cal _puts
1181   cal _puts ;txtScore
1182   xor a
1183   ld  (_curCol),a
1184
1185   ld  a,(nrworms)
1186   ld  b,a
1187   ld  hl,worm1+died
1188 displayWormStats:
1189   psh bc
1190   psh hl
1191
1192   ld  bc,input-died
1193   add hl,bc ;+input
1194   xor a
1195   cp  (hl)
1196   jr  nz,NoLinkIndic
1197   ld  b,7
1198   inc hl ;+left
1199   cp  (hl)
1200   jr  z,hostLinkIndic
1201   dec b
1202 hostLinkIndic:
1203   ld  a,8
1204   ld  (_curCol),a
1205   ld  a,b
1206   cal _putc
1207   xor a
1208   ld  (_curCol),a
1209   dec hl
1210 NoLinkIndic:
1211   inc hl
1212   inc hl
1213   inc hl ;+name
1214   cal _puts
1215
1216   pop hl
1217   psh hl
1218   ld  a,13
1219   ld  (_curCol),a
1220   ld  a,(hl) ;worm+died
1221   psh hl
1222   cal showA
1223   pop hl
1224
1225   ld  a,16
1226   ld  (_curCol),a
1227   inc hl ;worm+score
1228   cal _ldHLind ;ld hl,(hl)
1229   cal showHL ;worm+score
1230
1231   pop hl
1232   ld  bc,worm2-worm1
1233   add hl,bc
1234   pop bc
1235   dnz displayWormStats
1236
1237   ld  a,(Gametype)
1238   or  a ;singleplayer (0) only
1239   jr  nz,hilevelcheckdone
1240 checkhilevel:
1241   ld  hl,nrlevels
1242   ld  a,(Level)
1243   inc a
1244   cp  (hl)
1245   jr  c,hilevelcheckdone
1246   ld  (hl),a    ;save local
1247   ld  c,a
1248   ld  a,0
1249 hilvlposa =$-1
1250   ld  hl,0
1251 hilvlposhl =$-2 ;save external
1252   cal _writeb_inc_ahl ;ld (ahl),c
1253 hilevelcheckdone:
1254
1255   ld  a,(gameCar)
1256   and _datasingl
1257   jr  z,hiscorecheckdone
1258 checkhiscore:
1259   cal loadhiscoreposinahl
1260   cal _Get_Word_ahl ;de=old_hi
1261  psh de
1262  cal _RAM_PAGE_1 ;&&
1263  pop de
1264   ld  hl,(worm1+score)
1265
1266   ld  a,h           ;New
1267   cp  d             ;Old
1268   jr  c,NotNewHigh  ;New<Old
1269   jr  nz,newhigh    ;New>Old
1270
1271   ld  a,e           ;old
1272   cp  l             ;new
1273   jr  nc,NotNewHigh ;new<old
1274
1275 newhigh:            ;New>=Old
1276   ex  de,hl
1277   cal loadhiscoreposinahl
1278   cal _Set_Word_ahl ;de->(ahl)
1279  cal _RAM_PAGE_1
1280
1281 NotNewHigh: ;de=current hiscore
1282   ld  hl,$0807
1283   ld  (_curRow),hl
1284   ld  hl,txthiscore
1285   cal _puts
1286   ex  de,hl ;pop
1287   cal showHL
1288 hiscorecheckdone:
1289
1290 waitkey:
1291   halt
1292   halt
1293   cal GET_KEY
1294   cp  K_ENTER
1295   jp  z,DisplayMenu
1296 ;  cp  K_EXIT
1297   jr  nz,waitkey
1298
1299 ;x123456789012345678901
1300 ;1----- GAME OVER -----
1301 ;2Multiplayer
1302 ;3Level 01
1303 ;4           Died Score:
1304 ;5NameName     03 00070
1305 ;6Worm#02 @    05 00120
1306 ;7Worm#03      15 00030
1307 ;8Snaky   @    00 04820
1308
1309 ExitNoStats:
1310   ld  hl,_asapvar
1311   rst 20h ;_ABS_MOV10TOOP1
1312   rst 10h ;_FINDSYM
1313   ld  hl,4
1314   xor a
1315   add hl,de
1316   adc a,b ;ahl=bde+4
1317   cal _SET_ABS_DEST_ADDR
1318
1319   xor a
1320   ld  hl,_asm_exec_ram
1321   cal _SET_ABS_SRC_ADDR
1322   ld  hl,end-_asm_exec_ram
1323   cal _SET_MM_NUM_BYTES
1324   cal _mm_ldir
1325
1326   res 4,(iy+9)
1327   set 2,(iy+13)
1328   jp  _clrWindow
1329
1330 loadhiscoreposinahl:
1331   ld  a,(Level)
1332   ld  b,a
1333   ld  a,(Gametype)
1334   or  a
1335 externalhiscoresavepos:
1336   ld  a,0
1337 hiscrposa =$-1
1338   ld  hl,0
1339 hiscrposhl =$-2
1340   ret z ;(Gametype)=0
1341 addlevelposition:
1342   cal _AHL_PLUS_2_PG3
1343   dnz addlevelposition
1344   ret
1345
1346 ;-----------------------------
1347 ;----------- worm ------------
1348 ;-----------------------------
1349
1350 inlink:
1351   ld  a,0
1352 sendbyte =$-1
1353   ld  b,(ix+left)
1354   dec b
1355   jr  z,receivefirst
1356   cal send
1357   cal receive
1358   ld  l,a
1359   ret
1360 receivefirst:
1361   psh af
1362   cal receive
1363   ld   l,a
1364   pop  af
1365   psh hl
1366   cal send
1367   pop  hl
1368   ret
1369
1370 inkeys: ;use jp not call!
1371   out (1),a ;nop\nop
1372   in  a,(1)
1373   ld  b,a
1374   and (ix+right)
1375   jr  z,notright
1376   ld  a,l
1377   add a,8
1378   ld  l,a
1379 notright:
1380   ld  a,b
1381   and (ix+left)
1382   ret z
1383   ld  a,l
1384   sub 8
1385   ld  l,a
1386   ret
1387
1388 chkinput:
1389   ld  bc,donediddelydone
1390   psh bc ;ret-dest.
1391 inputcall:
1392   ld  a,(ix+input)
1393   or  a
1394   jr  nz,inkeys
1395   jr  inlink
1396
1397 respawncheck:
1398   cp  respawndelay-1
1399   jr  nz,unnamedlabel
1400   cal saverespawncounter
1401 removeworm:
1402   ld  h,(ix+tail+1)
1403   ld  l,(ix+tail)
1404   ld  d,(ix+head+1)
1405   ld  e,(ix+head)
1406   jr  DoesWormTailEqualsWormHead ;chk4 size=0
1407 removewormloop:
1408   ld  c,(hl)
1409   inc hl
1410   ld  b,(hl)
1411   inc hl
1412   cal resbit
1413   psh hl
1414   cal res4pixels
1415   pop hl
1416   inc (ix+grow)
1417 DoesWormTailEqualsWormHead:
1418   cal _cphlde
1419   jr  nz,removewormloop
1420
1421   ld  a,(gameCar)
1422   and _datasingl
1423   jr  nz,safewormsizedone
1424   ld  a,0
1425 beginsize =$-1
1426   ld  (ix+grow),a
1427 safewormsizedone:
1428
1429   ;de=ix+head
1430   ld  (ix+tail+1),d
1431   ld  (ix+tail),e ;head=tail/size=0
1432   ret
1433
1434 unnamedlabel:
1435   cp  1
1436   ld  h,a
1437   jr  nz,saverespawncounter
1438 respawndue:
1439   ld  l,a
1440   cal inputcall
1441   ld  a,h ;previous
1442   cp  l   ;changed?
1443   ret z
1444 saverespawncounter:
1445   ld  (ix+delay),a
1446   ret
1447
1448 ;------- handle worm ---------
1449
1450 HandleWorm:
1451   ld  a,(ix+delay)
1452   dec a
1453   jr  nz,respawncheck
1454
1455   ld  l,(ix+heading)
1456   jr  chkinput
1457 donediddelydone:
1458   ld  a,l
1459   ld  (sendbyte),a
1460   ld  (ix+heading),l
1461   ld  h,(ix+heading+1)
1462
1463   ld  c,(ix+pos)
1464   ld  b,(ix+pos+1)
1465   ld  e,(ix+pos2)
1466   ld  d,(ix+pos2+1)
1467
1468   psh hl
1469   ld  hl,previouspos
1470   ld  (hl),c
1471   inc hl
1472   ld  (hl),b
1473   inc hl
1474   inc hl
1475   ld  (hl),e
1476   inc hl
1477   ld  (hl),d
1478   pop hl
1479
1480 ;-------- move worm ----------
1481
1482 Wormmove:
1483   psh bc                        ; >> pos
1484   ld  a,(hl)
1485   add a,a
1486   add a,d
1487   ld  d,a
1488   bit 7,(hl)
1489   jr  z,notnegX
1490   dec b
1491 notnegX:
1492   jr  nc,notmoveX
1493   inc b
1494 notmoveX:
1495   ld  a,l
1496   add a,$40
1497   ld  l,a
1498   ld  a,(hl)
1499   add a,a
1500   add a,e
1501   ld  e,a
1502   bit 7,(hl)
1503   jr  z,notnegY
1504   dec c
1505 notnegY:
1506   jr  nc,notmoveY
1507   inc c
1508 notmoveY: ;bc=newpos
1509   ld  (ix+pos2),e
1510   ld  (ix+pos2+1),d
1511   ld  (ix+pos),c
1512   ld  (ix+pos+1),b
1513
1514 ;-check-
1515   pop hl                         ; << pos (old)
1516   ld  a,h
1517   sub b
1518   and 1
1519   ld  h,a
1520   ld  a,l
1521   sub c
1522   and 1
1523   add a,h
1524   ld  d,4
1525   jr  z,GotFour
1526   xor 3
1527   ld  d,a
1528 GotFour:
1529   cal chk4pixels
1530   rl  d
1531   jp  nc,Drawworm
1532
1533 ;--------- worm hit ----------
1534
1535 Hitworm:
1536   ld  a,(gameCar)
1537   ld  h,a
1538   and _datadie
1539   cal z,checkhitotherworm
1540   ld  a,h
1541   and _datamultpeas ;&&bit
1542   jr  nz,multiple_peas
1543   ld  a,h
1544   and _datafood
1545   jp  z,WormDead ;no food
1546
1547   ld  hl,0
1548 PeaY =$-2
1549 PeaX =$-1
1550   cal chkpeahit
1551   jp  nc,WormDead
1552   cal DrawPea ;remove pea
1553   ld  a,(ix+grow)
1554   add a,15
1555 peagrowth =$-1
1556   ld  (ix+grow),a
1557   cal NewPea
1558   ld  hl,Left
1559   dec (hl)
1560   psh af
1561   ld  de,10
1562   cal IncScore
1563   pop af
1564   jp  nz,Drawworm ;continue
1565   ld  a,(gameCar)
1566   and _datafoodl
1567   jp  z,Drawworm
1568   ld  a,(Gametype)
1569   or  a
1570   jp  nz,Exit ;stack restored
1571
1572   ld  hl,Level
1573   ld  a,(hl)
1574   inc (hl)
1575   ld  l,a ;hl=Level
1576   ld  h,0
1577   add hl,hl
1578   add hl,hl
1579   cal _HLTIMES10
1580   ex  de,hl
1581   cal IncScore ;score+(40*level)
1582   cal removeworm
1583   pop hl                         ; << call
1584   pop hl                         ; << call
1585   pop hl                         ; << levelp new
1586   jp  StartLevel
1587
1588 chkpeahit: ;hl=peapos
1589   ld  a,(sprsize)
1590   inc a
1591   ld  d,a
1592   ld  a,b
1593   sub h
1594   inc a
1595   cp  d ;=(sprsize)+1
1596   ret nc ;nc=no pea
1597   ld  a,c
1598   sub l
1599   inc a
1600   cp  d
1601   ret ;c=pea
1602
1603 flagcaptured:
1604   psh hl
1605   ld  de,30
1606   cal IncScore
1607   pop hl
1608   cal WormDead
1609 DrawAllPeas:
1610   ld  hl,(peaspos)
1611   cal DrawPea
1612   ld  hl,(peaspos+3)
1613   jp  DrawPea
1614
1615 multiple_peas:
1616   ld  hl,(peaspos)
1617   ld  a,(ix+reserv)
1618   ld  e,a ;push a
1619   and %01
1620   jr  nz,corrrectpea
1621   ld  hl,(peaspos+3)
1622 corrrectpea:
1623   cal chkpeahit
1624   jp  nc,WormDead
1625   ld  a,e ;pop a
1626   xor %01 ;0=1;1=0
1627   ld  (ix+reserv),a
1628   and %01
1629   add a,a
1630   ld  b,a
1631   ld  a,e
1632   and %10
1633   cp  b
1634   psh af ;safe z-flag
1635   cal DrawPea ;remove
1636   pop af
1637   jr  z,flagcaptured
1638   jr  Drawworm
1639
1640 ;-----------------------------
1641
1642 nextotherwormbit:
1643   ld  a,c
1644   sub (hl)
1645   inc hl
1646   inc a
1647   cp  4
1648   jr  nc,nothit1 ;no
1649   ld  a,b
1650   sub (hl)
1651   inc a
1652   cp  4
1653   ret c ;nz ;yes
1654 nothit1:
1655   inc hl
1656   cal resbit
1657 ChkWorm:
1658   cal _cphlde
1659   jr  nz,nextotherwormbit
1660   ret ;z
1661
1662 checkhitlapline:
1663   ld  a,63
1664   sub b
1665   jr  z,nextlaphalf
1666   inc a
1667   ret nz
1668 nextlaphalf:
1669   ld  a,c
1670   and 32 ;y>=32?
1671   jr  nz,nolap
1672   cp  (ix+reserv)
1673   jr  z,nolap
1674   psh bc
1675   ld  de,20
1676   cal IncScore
1677   pop bc
1678   xor a
1679 nolap:
1680   ld  (ix+reserv),a
1681   ret
1682
1683 checkhitotherworm:
1684  .db  $dd,$7d ;ld a,lx
1685   cp  worm2&255
1686  psh ix
1687  jr nz,chkworm2 ; ret nz
1688   ld  ix,worm1
1689  jr chkworm
1690 chkworm2:
1691  ld ix,worm2
1692
1693 chkworm:
1694  ld h,(ix+tail+1)
1695  ld l,(ix+tail)
1696  ld e,(ix+head)
1697  ld d,(ix+head+1)
1698   cal ChkWorm
1699  pop ix
1700   ret z ;not hit
1701   pop bc ;call
1702 previouspos =$+1
1703   ld  bc,0
1704   ld  de,0
1705   ld  (ix+pos),c
1706   ld  (ix+pos+1),b
1707   ld  (ix+pos2),e
1708   ld  (ix+pos2+1),d
1709   ret
1710
1711 ;-------- draw worm ----------
1712
1713 Drawworm:
1714   ld  c,(ix+pos)
1715   ld  b,(ix+pos+1)
1716
1717   ld  a,(Gametype)
1718   cp  gamerace
1719   cal z,checkhitlapline
1720
1721   ld  l,(ix+head)
1722   ld  h,(ix+head+1)
1723   ld  (hl),c
1724   inc hl
1725   ld  (hl),b
1726   inc hl
1727   cal resbit
1728   ld  (ix+head),l
1729   ld  (ix+head+1),h
1730
1731   cal set4pixels
1732
1733   ld  a,(ix+grow)
1734   dec a
1735   jr  z,removetail
1736   ld  (ix+grow),a
1737   ret
1738
1739 removetail:
1740   ld  l,(ix+tail)
1741   ld  h,(ix+tail+1)
1742   ld  c,(hl)
1743   inc hl
1744   ld  b,(hl)
1745   inc hl
1746   cal resbit
1747   ld  (ix+tail),l
1748   ld  (ix+tail+1),h
1749
1750 res4pixels:
1751   cal ResPixel
1752   inc b
1753   cal ResPixel
1754   inc c
1755   cal ResPixel
1756   dec b
1757 ResPixel:
1758   cal FindPixel
1759   cpl
1760   and (hl)
1761   ld  (hl),a
1762   ret
1763
1764 ;-----------------------------
1765 ;---------- ball -------------
1766 ;-----------------------------
1767
1768 handlethoseneatlittleballs:
1769   ld  hl,balls
1770   ld  b,a ;a=(nrballs)
1771 handleballs
1772   psh bc
1773   psh hl
1774   ld  c,(hl)
1775   inc hl
1776   ld  b,(hl)
1777   inc hl
1778   ld  d,(hl)
1779   cal handleball
1780   dec c
1781   pop hl
1782   ld  (hl),c
1783   inc hl
1784   ld  (hl),b
1785   inc hl
1786   ld  (hl),d
1787   inc hl
1788   pop bc
1789   dnz handleballs
1790   ret
1791
1792 handleball:
1793   cal res4pixels
1794   dec c
1795
1796 ballxmove:
1797   bit 0,d ;1=L; 0=R
1798   jr  z,ballright
1799 ballleft:
1800   dec b
1801   cal checkballhit
1802   jr  z,ballymove
1803   inc b ;undo
1804   res 0,d ;go right
1805   jr  ballymove
1806 ballright:
1807   inc b
1808   cal checkballhit
1809   jr  z,ballymove
1810   dec b ;back
1811   set 0,d ;>left
1812
1813 ballymove:
1814   bit 1,d ;1=up; 0=down
1815   jr  z,balldown
1816 ballup:
1817   dec c
1818   cal checkballhit
1819   jr  z,balldone
1820   inc c
1821   res 1,d ;go down
1822   jr  balldone
1823 balldown:
1824   inc c
1825   cal checkballhit
1826   jr  z,balldone
1827   dec c
1828   set 1,d ;up
1829 balldone:
1830
1831 set4pixels: ;@(b,c)
1832   cal SetPixel
1833   inc b
1834   cal SetPixel
1835   inc c
1836   cal SetPixel
1837   dec b
1838 SetPixel: ;at bc
1839   cal FindPixel
1840   or  (hl)
1841   ld  (hl),a
1842   ret
1843
1844 letsmovetheotherway:
1845   ld  a,1
1846   xor (hl)
1847   ld  (hl),a
1848   ret
1849
1850 checkballhit:
1851   psh de
1852   ld  d,0
1853   cal chk4pixels
1854   xor a
1855   cp  d
1856   pop de
1857   ret
1858
1859 ;-----------------------------
1860 ;----------- procs -----------
1861 ;-----------------------------
1862
1863 resbit:
1864   ld  a,h
1865   and (ix+storepos)
1866   ld  h,a
1867   ret
1868
1869 randompos:
1870   ld  b,a
1871 Random: ;(2..b+2)
1872   ld  a,r
1873 Seed =$+1
1874   add a,0
1875   ld  (Seed),a
1876   and %01111110
1877   cp  b
1878   jr  nc,Random
1879   add a,2
1880   ret
1881
1882 NewPea:
1883   ld  a,(FieldWidth)
1884   add a,127-4
1885   cal randompos
1886   ld  h,a
1887   ld  a,(FieldHeight)
1888   add a,56-4
1889   cal randompos
1890   ld  l,a
1891   ld  (PeaY),hl
1892
1893 CheckPea:
1894   ld  c,l
1895   ld  a,(sprsize)
1896   ld  e,a
1897 chkloopy:
1898   ld  b,h
1899   ld  a,(sprsize)
1900   ld  d,a
1901 chkloopx:
1902   psh hl
1903   cal FindPixel
1904   and (hl)
1905   pop hl
1906   jr  nz,NewPea ;pixel found
1907   inc b
1908   dec d
1909   jr  nz,chkloopx
1910   inc c
1911   dec e
1912   jr  nz,chkloopy
1913 ;all ok; empty space
1914
1915 DrawPea: ;hl=(PeaY)
1916   ld  b,h
1917   ld  c,l
1918   ld  de,peasprite
1919 spritepos =$-2
1920   jp  PutSprite ;||-ed
1921
1922 ;----------- score -----------
1923
1924 _divHLby1000:
1925   psh hl
1926   ld  b,3
1927 divideagain: ;3x
1928   cal _divHLby10
1929   dnz divideagain
1930   ld  a,l ;a=hl/1000
1931   pop hl
1932   ret
1933
1934 IncScore:
1935   ld  h,(ix+score+1)
1936   ld  l,(ix+score)
1937   cal _divHLby1000
1938   ld  c,a
1939   add hl,de
1940   cal _divHLby1000
1941   cp  c
1942   jr  z,scorecommon ;hl/1000 not increased
1943   inc (ix+lives)
1944   jr  scorecommon
1945 DecScore: ;&&&
1946   ld  h,(ix+score+1)
1947   ld  l,(ix+score)
1948   or  a
1949   sbc hl,de
1950   jr  c,showstats ;<0=0
1951 scorecommon:
1952   ld  (ix+score+1),h
1953   ld  (ix+score),l
1954   ld  de,0
1955 scorelimit =$-2
1956   cal _cphlde
1957   jp  nc,Exit
1958
1959 showstats:
1960   psh ix
1961   ld  h,0
1962   ld  l,h
1963   ld  (_penCol),hl
1964   ld  a,(nrworms)
1965   ld  b,a
1966   ld  ix,worm1
1967   ld  a,(gameCar)
1968   and _datanextl
1969   jr  nz,showstatsS
1970 showstatloop:
1971   psh bc
1972   cal showstat
1973   ld  de,worm2-worm1
1974   add ix,de
1975   ld  hl,_penCol
1976   ld  a,(hl)
1977   add a,10
1978   ld  (hl),a
1979   pop bc
1980   dnz showstatloop
1981   pop ix
1982   ret
1983
1984 showstat:
1985   ld  a,(gameCar)
1986   and _datalivel
1987   jr  nz,showlives
1988 showscore:
1989   ld  h,(ix+score+1)
1990   ld  l,(ix+score)
1991   cal _D_HL_DECI
1992   jr __vputs
1993 showlives:
1994   ld  a,(ix+lives)
1995   add a,'0'
1996 __vputmap:
1997   psh ix
1998   cal _vputmap
1999   pop ix
2000   ret
2001
2002 showstatsS:
2003   ld  hl,txtLevel
2004   cal __vputs
2005   ld  a,0
2006 Level =$-1
2007   cp  10
2008   jr  c,tilllevel9
2009   ld  l,a
2010   ld  h,0
2011   cal _divHLby10
2012   psh af
2013   ld  a,l
2014   add a,'0'
2015   cal __vputmap
2016   pop af
2017 tilllevel9:
2018   add a,'0'
2019   cal __vputmap
2020
2021   ld  a,98
2022   ld  (_penCol),a
2023   cal showscore
2024   ld  a,123
2025   ld  (_penCol),a
2026   cal showlives
2027   ld  a,(gameCar)
2028   and _datafoodl
2029   pop ix
2030   ret z
2031 showleft:
2032   ld  a,31
2033   ld  (_penCol),a
2034   ld  a,0
2035 Left =$-1
2036   ld  l,a
2037   ld  h,0
2038   cal _divHLby10
2039   psh af
2040   ld  a,l
2041   add a,'0'
2042   cal __vputmap
2043   pop af
2044   add a,'0'
2045   cal __vputmap
2046
2047   ld  hl,txtLeft
2048 __vputs:
2049   psh ix
2050   cal _vputs
2051   pop ix
2052   ret
2053
2054 showLevel:
2055   ld  hl,txtLevel
2056   cal _puts
2057   ld  a,(Level)
2058 showA:
2059   ld  l,a
2060   ld  h,0
2061   cal _divHLby10
2062   psh af
2063   ld  a,l
2064   add a,'0'
2065   cal _putc
2066   pop af
2067   add a,'0'
2068   jp  _putc
2069
2070 showHL:
2071   cal _D_HL_DECI
2072   jp  _puts
2073
2074 _D_HL_DECI:
2075   ld  de,savestr+4
2076   ld  b,5
2077 ldhld:
2078   cal _divHLby10
2079   add a,'0'
2080   ld  (de),a
2081   dec de
2082   dnz ldhld
2083   ld  hl,savestr
2084   ret
2085 savestr:
2086   .db "00000",0
2087
2088 ;-----------------------------
2089
2090 DisplayField:
2091   ld  a,c
2092   sub 29
2093   jr  nc,NotMinYScroll
2094   xor a
2095 NotMinYScroll:
2096   cp  43
2097 FieldHeight =$-1
2098   jr  c,NotMaxYScroll
2099   ld  a,(FieldHeight)
2100 NotMaxYScroll:
2101   ld  l,a
2102   ld  h,0
2103   add hl,hl
2104   add hl,hl
2105   add hl,hl
2106   add hl,hl
2107   add hl,hl
2108   psh bc                        ; >> 1
2109   psh de                        ; >> 2
2110   ld  de,ScrBuffer
2111   add hl,de
2112   ld  a,b
2113   sub 64
2114   jr  nc,NotMinXScroll
2115   xor a
2116 NotMinXScroll:
2117   cp  128
2118 FieldWidth = $-1
2119   jr  c,NotMaxXScroll
2120   ld  a,(FieldWidth)
2121 NotMaxXScroll:
2122   psh af                        ; >> 3
2123   and %11111000
2124   rra
2125   rra
2126   rra
2127   ld  c,a
2128   ld  b,0
2129   ld  de,DispBuffer
2130   pop af                         ; << 2
2131   and %00000111
2132   psh af                        ; >> 3
2133   cp  6
2134   jr  c,CopyScreen
2135   inc c
2136 CopyScreen:
2137   add hl,bc
2138   ld  b,57
2139 CopyScreenLoop:
2140   psh bc                        ; >> 4
2141   ld  bc,16
2142   ldir
2143   ld  c,16
2144   add hl,bc
2145   pop bc                         ; << 3
2146   dnz CopyScreenLoop
2147   pop af                         ; << 2
2148   ld  c,$b7 ;or a
2149 Bit0:
2150   jr  nz,Bit1
2151   halt
2152   halt
2153   jr  AfterShiftDelay
2154 Bit1:
2155   dec a
2156   jr  nz,Bit2
2157   cal ShiftRight1
2158   jr  AfterShiftDelay
2159 Bit2:
2160   dec a
2161   jr  nz,Bit3
2162   ld  a,2
2163   cal ShiftRight
2164   jr  AfterShiftDelay
2165 Bit3:
2166   dec a
2167   jr  nz,Bit4
2168   cal Chunk
2169   cal ShiftLeft1
2170   jr  AfterShift
2171 Bit4:
2172   dec a
2173   jr  nz,Bit5
2174   cal Chunk
2175   jr  AfterShiftDelay
2176 Bit5:
2177   dec a
2178   jr  nz,Bit6
2179   cal Chunk
2180   cal ShiftRight1
2181   jr  AfterShift
2182 Bit6:
2183   dec a
2184   jr  nz,Bit7
2185   ld  a,2
2186   cal ShiftLeft
2187   jr  AfterShift
2188 Bit7:
2189   cal ShiftLeft
2190 AfterShiftDelay:
2191   halt
2192 AfterShift:
2193 #ifdef buffer
2194   ld  hl,DispBuffer
2195   ld  de,$fc00+$70
2196   ld  bc,1024-$70
2197   ldir
2198 #endif
2199   pop de                         ; << 1
2200   pop bc                         ; << 0k
2201   ret
2202
2203 ShiftRight1:
2204   ld  a,1
2205 ShiftRight:
2206   ld  (ShiftRightCounter),a
2207   ld  a,c
2208   ld  (ShiftRightChunk),a
2209   ld  c,16
2210   add hl,bc
2211   ld  b,57
2212 ShiftRightLoop:
2213   psh bc
2214   ld  bc,-32
2215   add hl,bc
2216   ex  de,hl
2217   ld  a,(de)
2218 ShiftRightChunk:
2219   or  a
2220   cal c,_SHLACC
2221   ld  c,0
2222 ShiftRightCounter = $-1
2223 ShiftRowsLeft:
2224   psh hl
2225   rla
2226   ld  b,16
2227 ShiftRowLeft:
2228   dec hl
2229   rl  (hl)
2230   dnz ShiftRowLeft
2231   pop hl
2232   dec c
2233   jr  nz,ShiftRowsLeft
2234   ld  bc,-16
2235   add hl,bc
2236   ex  de,hl
2237   pop bc
2238   dnz ShiftRightLoop
2239   ret
2240
2241 ShiftLeft1:
2242   ld  a,1
2243 ShiftLeft:
2244   ld  (ShiftLeftCounter),a
2245   ld  a,c
2246   ld  (ShiftLeftChunk),a
2247   rla
2248   jr  nc,ShiftLeftSameByte
2249   dec hl
2250 ShiftLeftSameByte:
2251   ex  de,hl
2252   ld  bc,-16
2253   add hl,bc
2254 NewSprite:
2255   ex  de,hl
2256   ld  b,57
2257 ShiftLeftLoop:
2258   psh bc                        ; >> 1
2259   ld  bc,-32
2260   add hl,bc
2261   ex  de,hl
2262   ld  a,(de)
2263 ShiftLeftChunk:
2264   or  a
2265   cal c,_SHRACC
2266   ld  c,0
2267 ShiftLeftCounter = $-1
2268 ShiftRowsRight:
2269   psh hl                        ; >> 2
2270   rra
2271   ld  b,16
2272 ShiftRowRight:
2273   rr  (hl)
2274   inc hl
2275   dnz ShiftRowRight
2276   pop hl                         ; << 1
2277   dec c
2278   jr  nz,ShiftRowsRight
2279   ld  bc,-16
2280   add hl,bc
2281   ex  de,hl
2282   pop bc                         ; << 0k
2283   dnz ShiftLeftLoop
2284   ret
2285
2286 Chunk:
2287   psh hl                        ; >> 1
2288   psh de                        ; >> 2
2289   ld  c,16
2290   add hl,bc
2291   ld  b,57
2292 ChunkScreen:
2293   psh bc                        ; >> 3
2294   ld  bc,-32
2295   add hl,bc
2296   ex  de,hl
2297   ld  a,(de)
2298   cal _SHRACC
2299   ld  b,16
2300 ChunkRow:
2301   dec hl
2302   rld
2303   dnz ChunkRow
2304   ex  de,hl
2305   pop bc                         ; << 2
2306   dnz ChunkScreen
2307   pop de                         ; << 1
2308   pop hl                         ; << 0k
2309   ld  c,$37 ;scf
2310   ret
2311
2312 ;----------- draw ------------
2313
2314 ;--- pixel ---
2315
2316 chk4pixels: ;&&
2317   cal CheckPixel
2318   inc b
2319   cal CheckPixel
2320   inc c
2321   cal CheckPixel
2322   dec b
2323   cal CheckPixel
2324   dec c
2325   ret
2326 CheckPixel: ;at bc in d
2327   cal FindPixel
2328   and (hl)
2329   ret z
2330   dec d
2331   ret
2332
2333 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
2334 ;(b,c) to hl:a; "destroyes" ahl
2335
2336 FindPixel: ;(b,c) to hl:a
2337   ld  h,0
2338   ld  l,c    ;hl=y
2339   add hl,hl
2340   add hl,hl
2341   ld  a,b    ;a=x
2342   rra
2343   add hl,hl
2344   rra
2345   add hl,hl
2346   add hl,hl  ;hl=32*y
2347   rra        ;a=x/8
2348   or  l
2349   ld  l,a
2350   ld  a,b
2351   and 7
2352   cpl
2353   rlca
2354   rlca
2355   rlca
2356   ld  (FP_Bit),a
2357   xor a
2358 FP_Bit =$+1
2359   set 0,a
2360
2361   psh de ;&&&
2362   ld  de,ScrBuffer
2363   add hl,de
2364   pop de
2365   ret
2366
2367 ;--- sprite ---
2368
2369 PutSprite:  ;||@(b,c)
2370   ;by SHIAR  only ix saved
2371   cal FindPixel
2372 putspr:
2373   ld  (beginbit),a
2374   ld  a,(sprsize)
2375   ld  b,a ;rows
2376 sprloopy:
2377   psh bc ;rows
2378   psh hl
2379   ld  a,(de)
2380   ld  c,a
2381   inc de
2382   ld  a,(sprsize)
2383   ld  b,a ;width
2384 beginbit =$+1
2385   ld  a,1
2386 sprloopx:
2387   sla c ;draw?
2388   jr  nc,sprnodraw
2389   psh af
2390   xor (hl)
2391   ld  (hl),a
2392   pop af
2393 sprnodraw:
2394   rrca ;next bit
2395   jp  nc,nextbitok
2396   inc hl ;next byte
2397 nextbitok:
2398   dnz sprloopx
2399
2400   pop hl
2401   ld  bc,32 ;next line
2402   add hl,bc
2403   pop bc
2404   dnz sprloopy
2405   ret
2406
2407 ;--- line ---
2408
2409 loaddrawdata:
2410   ld  d,(hl)
2411   inc hl
2412   ld  e,(hl)
2413   inc hl
2414   ld  a,(hl)
2415   inc hl
2416   ret
2417
2418 ;LINE (d,e)-(h,l)
2419 ;destroyes a
2420
2421 Line:
2422   psh bc
2423   psh hl
2424   psh de
2425   ld  a,d
2426   cp  h
2427   jr  c,lineOrdered
2428   ex  de,hl
2429 lineOrdered:
2430   ld  b,d
2431   ld  c,e
2432   psh hl
2433   psh bc
2434   cal FindPixel
2435   pop bc
2436   pop de
2437 connectedLine:
2438   psh hl
2439   ld  h,c
2440   ld  c,a
2441   ld  a,d
2442   sub b
2443   ld  b,a
2444   ld  a,e
2445   jr  nz,LineNotPoint
2446   cp  h
2447   jr  nz,LineNotPoint
2448   pop hl
2449   jr  DoneLine
2450 LineNotPoint:
2451   sub h
2452   ld  de,32
2453   jr  nc,LinePositiveY
2454   neg
2455   ld  de,-32
2456 LinePositiveY:
2457   cp  b
2458   jr  nc,SteepLine
2459   add a,a
2460   ld  (line2sm+1),a
2461   ld  h,a
2462   xor a
2463   sub b
2464   add a,a
2465   ld  (line1sm+1),a
2466   ld  a,h
2467   sub b
2468   pop hl
2469 LineLoopGentle:
2470   psh af
2471   ld  a,(hl)
2472   or  c
2473   ld  (hl),a
2474   rrc c
2475   jr  nc,$+3
2476   inc hl
2477   pop af
2478   jp  m,line2sm
2479 line1sm:
2480   add a,0
2481   add hl,de
2482 line2sm:
2483   add a,0
2484   dnz LineLoopGentle
2485 DoneLine:
2486   ld  a,(hl)
2487   or  c
2488   ld  (hl),a
2489   pop de
2490   pop hl
2491   pop bc
2492   ret
2493 SteepLine:
2494   ld  h,a
2495   neg
2496   add a,a
2497   ld  (line3sm+1),a
2498   ld  a,b
2499   add a,a
2500   ld  (line4sm+1),a
2501   sub h
2502   ld  b,h
2503   pop hl
2504 LineLoopSteep:
2505   psh af
2506   ld  a,(hl)
2507   or  c
2508   ld  (hl),a
2509   add hl,de
2510   pop af
2511   jp  m,line4sm
2512 line3sm:
2513   add a,0
2514   rrc c
2515   jr  nc,$+3
2516   inc hl
2517 line4sm:
2518   add a,0
2519   dnz LineLoopSteep
2520   jr  DoneLine
2521
2522 drawbox: ;(d,e)-(h,l)
2523   ld  b,l ;Delta-y
2524   ld  l,e
2525 boxloop:
2526   cal Line
2527   inc l
2528   inc e
2529   dnz boxloop
2530   ret
2531
2532 ;-----------------------------
2533 ;----------- link ------------
2534 ;-----------------------------
2535
2536 TIMEOUT = $1000
2537
2538 receive:
2539   cal GET_KEY
2540   cp  K_EXIT
2541   jp  z,LinkBreak
2542   in  a,(7)
2543   and %11
2544   cp  %11
2545   jr  z,receive
2546   cal Qreceive
2547   jr  c,receive
2548   ret
2549
2550 Qreceive:
2551   ld  b,8
2552   jr  ReceiveCont
2553 receiveloop:
2554   ld  de,TIMEOUT
2555 WaitRecBit:
2556   cal CheckLink
2557   jr  z,LinkFailed
2558   cp  %11
2559   jr  z,WaitRecBit
2560 ReceiveCont:
2561   sub 2
2562   ld  a,2
2563   ld  d,D0LD1H
2564   jr  c,ReceiveLow
2565   rra
2566   ld  d,D0HD1L
2567 ReceiveLow:
2568   rr c
2569   ld (AckBit),a
2570   ld a,d
2571   out (7),a
2572   ld  de,TIMEOUT
2573 WaitAckRec:
2574   cal CheckLink
2575   cp  0
2576 AckBit =$-1
2577   jr  nz,WaitAckRec
2578   ld  a,D0HD1H
2579   out (7),a
2580   ld  d,4
2581 WaitReadyRec:
2582   dec d
2583   jr  z,ReadyRec
2584   in  a,(7)
2585   cp  %11
2586   jr  nz,WaitReadyRec
2587 ReadyRec:
2588   dnz receiveloop
2589   jr  LinkSuccess
2590
2591 send:
2592   ld  b,9
2593   ld  c,a
2594   jr  SendAcked
2595 SendBits:
2596   rr  c
2597   ld  a,D0LD1H
2598   jr  nc,SendLow
2599   ld  a,D0HD1L
2600 SendLow:
2601   out (7),a
2602   ld  de,TIMEOUT
2603 WaitAckSend:
2604   cal CheckLink
2605   jr  nz,WaitAckSend
2606 SendAcked:
2607   ld  a,D0HD1H
2608   out (7),a
2609   ld  de,TIMEOUT
2610 WaitReadySend:
2611   cal CheckLink
2612   cp  %11
2613   jr  nz,WaitReadySend
2614   dnz SendBits
2615 LinkSuccess:
2616   ld  a,c ;pop a
2617   ret
2618
2619 LinkFailed:
2620   scf
2621   ld a,c
2622   ret
2623 LinkBreak:
2624   ld  a,D0HD1H
2625   out (7),a
2626   jp  Exit
2627
2628 CheckLink:
2629   pop hl
2630   dec de
2631   ld a,d
2632   or e
2633   jr z,LinkFailed
2634
2635   ld  a,$BF
2636   out (1),a
2637   nop \ nop
2638   in  a,(1)
2639   psh af
2640   ld  a,%11111111
2641   out (1),a
2642   pop af
2643   bit 6,a
2644
2645   in  a,(7)
2646   and %11
2647   jp  (hl)
2648
2649
2650 ;-----------------------------
2651 ;---------- levels -----------
2652 ;-----------------------------
2653
2654 LevelDef:
2655   .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
2656   .db 0,2,63        ;start d, y, x
2657   .db 128,57        ;field width (128-255), height (57-255)
2658   .db 0,0           ;no additional lines, boxes
2659
2660   .db 255
2661    ret
2662
2663 LevelDefM:
2664   .db 8,0,15,15,0,0
2665   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2666   .db 128,57
2667   .db 0,0
2668
2669 ;-----------------------------
2670 ;---------- data -------------
2671 ;-----------------------------
2672
2673 wtPicture:
2674 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2675 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2676 .db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2677 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000
2678 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000
2679 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000
2680 .db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000
2681 .db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100
2682 .db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2683 .db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2684 .db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100
2685 .db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001100
2686 .db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00001100
2687 .db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00011100
2688 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00011000
2689 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00011000
2690
2691 txtMenu:    .db "by Shiar",0
2692             .db "Have fun!",0 ;4th menu item
2693             .db "Level 00",0  ;3rd
2694             .db "Worms: 0",0  ;2nd
2695 txtGame:    .db "Singleplayer",0  ;0 (1st)
2696 txtGame2:   .db "Peaworm     ",0  ;1 (next 1st)
2697             .db "Deathmatch",0    ;2
2698             .db "Foodmatch ",0    ;3
2699             .db "LinkMatch",0     ;4
2700             .db "Race     ",0     ;5
2701             .db "CTF ",0          ;6
2702             .db "Domination",0    ;7
2703 txtLevsel:  .db $CF," Select levels: ",5,0
2704 txtName:    .db "Enter name player ",0
2705 txtWaiting: .db "Waiting...",0
2706 txtReceive: .db "Receiving..." ;,0
2707
2708 TrigPrecalc:
2709 .db   0,  3,  6,  9, 12, 15, 18, 21
2710 .db  24, 27, 30, 33, 36, 39, 42, 45
2711 .db  48, 51, 54, 57, 59, 62, 65, 67
2712 .db  70, 73, 75, 78, 80, 82, 85, 87
2713 .db  89, 91, 94, 96, 98,100,102,103
2714 .db 105,107,108,110,112,113,114,116
2715 .db 117,118,119,120,121,122,123,123
2716 .db 124,125,125,126,126,126,126,126
2717 .db 127
2718
2719 txtLevel:  .db "Level ",0
2720 txtWorms:  .db "Worms: 0",0 ;follows txtLevel
2721 txtDied:   .db "Died ",0
2722 txtScore:  .db "Score",0    ;follows txtDied
2723 txtLeft:   .db " left",0    ;follows txtScore
2724 txthiscore:.db "HiScore:",0
2725 txtReady:  .db "Prepare!",0
2726 txtposReady = 7
2727 txtGO:     .db "----- GAME OVER -----",0
2728
2729 gamesdata:
2730
2731 _datalink  = %00000001 ;linkplay
2732 _datalivel = %00000010 ;lives=0 limit
2733 _datafoodl = %00000100 ;left=0 limit
2734 _datanextl = %00001000 ;next level if left=0
2735 _datasingl = %00001000 ;singleplayer=1
2736 _datafood  = %00010000 ;food present
2737 _________  = %00100000 ;
2738 _datadie   = %01000000 ;worm dies on impact
2739 _datascore = %10000000 ;score>=100 limit
2740 _datamultpeas = %00100000
2741
2742 gamesingle   =  0
2743 datasingle: .db %01011110
2744 gamepeas     =  1
2745 datapeas:   .db %01011010
2746 gamedeathm   =  2
2747 datadeathm: .db %01000010
2748 gamefoodm    =  3
2749 datafoodm:  .db %11010000
2750 gamelinkm    =  4
2751 datalinkm:  .db %01000011
2752 gamerace     =  5
2753 datarace:   .db %10000000
2754 gamectf      =  6
2755 datactf:    .db %11100000
2756 gamedomin    =  7
2757 datadomin:  .db %01000000 ;==(8 modes)
2758
2759 datalevels: .dw LevelDef, LevelDef
2760             .dw LevelDefM,LevelDefM
2761             .dw LevelDefM,LevelDefM
2762             .dw LevelDefM,LevelDefM
2763 nrlevels:   .db 2,2,2,2,2,2,2,2
2764
2765 worm1set:  .dw worm1p,worm1p
2766            .db %11110111,3,%00,%01111110,%10,%100 ;< >
2767 worm1name: .db "worm #01",0
2768 worm2set:  .dw worm2p,worm2p
2769            .db %11111011,3,%11,%00111111,%10000,%1000 ;f1 f2
2770 worm2name: .db "worm #02",0
2771 worm3set:  .dw worm3p,worm3p
2772            .db %11111011,3,0,%01011111,%10,%100 ;sto ,
2773 worm3name: .db "worm #03",0
2774 worm4set:  .dw worm4p,worm4p
2775            .db %11111011,3,0,%01111101,%10,%1 ;enter +
2776 worm4name: .db "worm #04",0
2777
2778 hipeaworm: .dw 0
2779 end:
2780
2781 defsprsize   = 4
2782 sprsize:   .db 4
2783 peasprite: .db %01100000
2784            .db %11110000
2785            .db %11110000
2786            .db %01100000
2787
2788                ;set:
2789 heading  = 0   ;level*
2790 pos      = 2   ;level*
2791 pos2     = 4   ;level
2792 grow     = 6   ;level
2793 died     = 8   ;game
2794 score    = 9   ;game
2795 delay    = 11  ;game
2796                ;19B @game
2797 head     = 12  ;4B (head=tail)
2798 tail     = 14  ;also@next level
2799 storepos = 16
2800 lives    = 17
2801 reserv   = 18  ;loop
2802  ;race:lap
2803  ;ctf:pea
2804 input    = 19
2805 left     = 20
2806 right    = 21
2807 name     = 22
2808 wormsize = 31
2809
2810 respawndelay  = 30
2811 maxnamelength = 8+1
2812
2813 ;-----------------------------
2814 ;----------- end -------------
2815 ;-----------------------------
2816
2817   .end
2818
2819 .end