worm 0.90.0501: title picture, mode-specific improvements
[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,(gameCar)
1005   and _datafood
1006   jr  z,nofood
1007   cal NewPea
1008 nofood:
1009   ld  bc,(worm1+pos)
1010   cal DisplayField
1011   ld  hl,$FDE0
1012   ld  de,$FDE1
1013   ld  (hl),%11111111
1014   ld  bc,$BF
1015   ldir
1016   ld  hl,4+(txtposReady*256)
1017   ld  (_curRow),hl
1018   set 3,(iy+5)
1019   ld  hl,txtReady
1020   cal _puts
1021   res 3,(iy+5)
1022
1023   ld  a,0
1024 gameCar =$-1
1025   and _datalink
1026   jr  z,SwapPos ;no link
1027   xor a
1028   ld  (worm2+input),a
1029   ld  (worm2+left),a
1030   ld  (Speed),a
1031
1032 SwapPos: ;$18 xx -> $F6 xx
1033   jr  initfinished
1034   inc a
1035   ld  (worm2+left),a
1036   ld  hl,(worm1+pos)
1037   ld  de,(worm2+pos)
1038   ld  (worm2+pos),hl
1039   ld  (worm1+pos),de
1040   ld  a,(worm1+heading)
1041   ld  b,a
1042   ld  a,(worm2+heading)
1043   ld  (worm1+heading),a
1044   ld  a,b
1045   ld  (worm2+heading),a
1046 initfinished:
1047
1048   ld  b,0
1049 ReadyDelay:
1050   halt
1051   dnz ReadyDelay
1052
1053 ;-----------------------------
1054 ;----------- LOOP ------------
1055 ;-----------------------------
1056
1057 GameLoop:
1058   ld  bc,(worm1+pos)
1059   cal DisplayField
1060
1061   ld  a,1
1062 flashtime =$-1
1063   dec a
1064   jr  z,noflash
1065   ld  (flashtime),a
1066   ld  hl,$fc00+(16*7)
1067 screeninvertloop:
1068   ld  a,(hl)
1069   cpl
1070   ld  (hl),a
1071   inc hl
1072   xor a
1073   cp  h
1074   jr  nz,screeninvertloop
1075 noflash:
1076
1077   ld  a,0
1078 Speed =$-1
1079   or  a
1080   jr  z,NoDelay
1081 Delay:
1082   halt
1083   dec a
1084   jr  nz,Delay
1085 NoDelay:
1086
1087   ld  a,0
1088 nrballs =$-1
1089   or  a
1090   cal nz,handlethoseneatlittleballs
1091
1092   ld  ix,worm1
1093   ld  a,(nrworms)
1094   ld  b,a
1095 handleworms:
1096   psh bc
1097   cal HandleWorm
1098   ld  bc,worm2-worm1
1099   add ix,bc
1100   pop bc
1101   dnz handleworms
1102
1103 ;-----------------------------
1104 ;---------- keys -------------
1105 ;-----------------------------
1106
1107 HandleKeys:
1108   ld  a,%10111111
1109   out (1),a
1110   in  a,(1)
1111   rla ;MORE?
1112   jr  c,CheckExit
1113   ld  bc,$0103
1114   out (c),b
1115   halt ;pause/off
1116   ld  b,11
1117   out (c),b
1118
1119 CheckExit:
1120   rla  ;=$17 (c=EXIT-key)
1121       ;or$A7 (c=0)
1122   jp  c,GameLoop
1123   jr  Exit
1124
1125 WormDead:
1126   ld  a,2
1127   ld  (flashtime),a
1128   ld  (ix+delay),respawndelay
1129
1130 thislevel =$+1
1131   ld  de,0
1132   ld  a,(de)
1133   inc de
1134   ld  (ix+heading),a
1135   ld  a,(de)
1136   ld  (ix+pos),a
1137   inc de
1138   ld  a,(de)
1139   ld  (ix+pos+1),a
1140
1141   inc (ix+died)
1142   dec (ix+lives)
1143   psh af
1144   ld  de,10
1145   cal DecScore
1146   pop af
1147   ret nz ;HandleWorm done
1148   ld  a,(gameCar)
1149   and _datalivel
1150   ret z
1151   ld  a,$A7 ;exit@end of turn
1152   ld  (CheckExit),a ;set exit state
1153   ret ;finish turn
1154
1155 Exit:
1156   ld  sp,0 ;pop all
1157 SpSave = $-2
1158   cal _clrWindow
1159   ld  hl,txtGO
1160   cal _puts
1161   ld  hl,txtGame
1162 CURtxtGame =$-2
1163   cal _puts
1164   ld  de,0002
1165   ld  (_curRow),de
1166   cal showLevel
1167   ld  de,$0B03
1168   ld  (_curRow),de
1169   ld  hl,txtDied
1170   cal _puts
1171   cal _puts ;txtScore
1172   xor a
1173   ld  (_curCol),a
1174
1175   ld  a,(nrworms)
1176   ld  b,a
1177   ld  hl,worm1+died
1178 displayWormStats:
1179   psh bc
1180   psh hl
1181
1182   ld  bc,input-died
1183   add hl,bc ;+input
1184   xor a
1185   cp  (hl)
1186   jr  nz,NoLinkIndic
1187   ld  b,7
1188   inc hl ;+left
1189   cp  (hl)
1190   jr  z,hostLinkIndic
1191   dec b
1192 hostLinkIndic:
1193   ld  a,8
1194   ld  (_curCol),a
1195   ld  a,b
1196   cal _putc
1197   xor a
1198   ld  (_curCol),a
1199   dec hl
1200 NoLinkIndic:
1201   inc hl
1202   inc hl
1203   inc hl ;+name
1204   cal _puts
1205
1206   pop hl
1207   psh hl
1208   ld  a,13
1209   ld  (_curCol),a
1210   ld  a,(hl) ;worm+died
1211   psh hl
1212   cal showA
1213   pop hl
1214
1215   ld  a,16
1216   ld  (_curCol),a
1217   inc hl ;worm+score
1218   cal _ldHLind ;ld hl,(hl)
1219   cal showHL ;worm+score
1220
1221   pop hl
1222   ld  bc,worm2-worm1
1223   add hl,bc
1224   pop bc
1225   dnz displayWormStats
1226
1227   ld  a,(Gametype)
1228   or  a ;singleplayer (0) only
1229   jr  nz,hilevelcheckdone
1230 checkhilevel:
1231   ld  hl,nrlevels
1232   ld  a,(Level)
1233   inc a
1234   cp  (hl)
1235   jr  c,hilevelcheckdone
1236   ld  (hl),a    ;save local
1237   ld  c,a
1238   ld  a,0
1239 hilvlposa =$-1
1240   ld  hl,0
1241 hilvlposhl =$-2 ;save external
1242   cal _writeb_inc_ahl ;ld (ahl),c
1243 hilevelcheckdone:
1244
1245   ld  a,(gameCar)
1246   and _datasingl
1247   jr  z,hiscorecheckdone
1248 checkhiscore:
1249   cal loadhiscoreposinahl
1250   cal _Get_Word_ahl ;de=old_hi
1251  psh de
1252  cal _RAM_PAGE_1 ;&&
1253  pop de
1254   ld  hl,(worm1+score)
1255
1256   ld  a,h           ;New
1257   cp  d             ;Old
1258   jr  c,NotNewHigh  ;New<Old
1259   jr  nz,newhigh    ;New>Old
1260
1261   ld  a,e           ;old
1262   cp  l             ;new
1263   jr  nc,NotNewHigh ;new<old
1264
1265 newhigh:            ;New>=Old
1266   ex  de,hl
1267   cal loadhiscoreposinahl
1268   cal _Set_Word_ahl ;de->(ahl)
1269  cal _RAM_PAGE_1
1270
1271 NotNewHigh: ;de=current hiscore
1272   ld  hl,$0807
1273   ld  (_curRow),hl
1274   ld  hl,txthiscore
1275   cal _puts
1276   ex  de,hl ;pop
1277   cal showHL
1278 hiscorecheckdone:
1279
1280 waitkey:
1281   halt
1282   halt
1283   cal GET_KEY
1284   cp  K_ENTER
1285   jp  z,DisplayMenu
1286 ;  cp  K_EXIT
1287   jr  nz,waitkey
1288
1289 ;x123456789012345678901
1290 ;1----- GAME OVER -----
1291 ;2Multiplayer
1292 ;3Level 01
1293 ;4           Died Score:
1294 ;5NameName     03 00070
1295 ;6Worm#02 @    05 00120
1296 ;7Worm#03      15 00030
1297 ;8Snaky   @    00 04820
1298
1299 ExitNoStats:
1300   ld  hl,_asapvar
1301   rst 20h ;_ABS_MOV10TOOP1
1302   rst 10h ;_FINDSYM
1303   ld  hl,4
1304   xor a
1305   add hl,de
1306   adc a,b ;ahl=bde+4
1307   cal _SET_ABS_DEST_ADDR
1308
1309   xor a
1310   ld  hl,_asm_exec_ram
1311   cal _SET_ABS_SRC_ADDR
1312   ld  hl,end-_asm_exec_ram
1313   cal _SET_MM_NUM_BYTES
1314   cal _mm_ldir
1315
1316   res 4,(iy+9)
1317   set 2,(iy+13)
1318   jp  _clrWindow
1319
1320 loadhiscoreposinahl:
1321   ld  a,(Level)
1322   ld  b,a
1323   ld  a,(Gametype)
1324   or  a
1325 externalhiscoresavepos:
1326   ld  a,0
1327 hiscrposa =$-1
1328   ld  hl,0
1329 hiscrposhl =$-2
1330   ret z ;(Gametype)=0
1331 addlevelposition:
1332   cal _AHL_PLUS_2_PG3
1333   dnz addlevelposition
1334   ret
1335
1336 ;-----------------------------
1337 ;----------- worm ------------
1338 ;-----------------------------
1339
1340 inlink:
1341   ld  a,0
1342 sendbyte =$-1
1343   ld  b,(ix+left)
1344   dec b
1345   jr  z,receivefirst
1346   cal send
1347   cal receive
1348   ld  l,a
1349   ret
1350 receivefirst:
1351   psh af
1352   cal receive
1353   ld   l,a
1354   pop  af
1355   psh hl
1356   cal send
1357   pop  hl
1358   ret
1359
1360 inkeys: ;use jp not call!
1361   out (1),a ;nop\nop
1362   in  a,(1)
1363   ld  b,a
1364   and (ix+right)
1365   jr  z,notright
1366   ld  a,l
1367   add a,8
1368   ld  l,a
1369 notright:
1370   ld  a,b
1371   and (ix+left)
1372   ret z
1373   ld  a,l
1374   sub 8
1375   ld  l,a
1376   ret
1377
1378 chkinput:
1379   ld  bc,donediddelydone
1380   psh bc ;ret-dest.
1381 inputcall:
1382   ld  a,(ix+input)
1383   or  a
1384   jr  nz,inkeys
1385   jr  inlink
1386
1387 respawncheck:
1388   cp  respawndelay-1
1389   jr  nz,unnamedlabel
1390   cal saverespawncounter
1391 removeworm:
1392   ld  h,(ix+tail+1)
1393   ld  l,(ix+tail)
1394   ld  d,(ix+head+1)
1395   ld  e,(ix+head)
1396   jr  DoesWormTailEqualsWormHead ;chk4 size=0
1397 removewormloop:
1398   ld  c,(hl)
1399   inc hl
1400   ld  b,(hl)
1401   inc hl
1402   cal resbit
1403   psh hl
1404   cal res4pixels
1405   pop hl
1406   inc (ix+grow)
1407 DoesWormTailEqualsWormHead:
1408   cal _cphlde
1409   jr  nz,removewormloop
1410
1411   ld  a,(gameCar)
1412   and _datasingl
1413   jr  nz,safewormsizedone
1414   ld  a,0
1415 beginsize =$-1
1416   ld  (ix+grow),a
1417 safewormsizedone:
1418
1419   ;de=ix+head
1420   ld  (ix+tail+1),d
1421   ld  (ix+tail),e ;head=tail/size=0
1422   ret
1423
1424 unnamedlabel:
1425   cp  1
1426   ld  h,a
1427   jr  nz,saverespawncounter
1428 respawndue:
1429   ld  l,a
1430   cal inputcall
1431   ld  a,h ;previous
1432   cp  l   ;changed?
1433   ret z
1434 saverespawncounter:
1435   ld  (ix+delay),a
1436   ret
1437
1438 ;------- handle worm ---------
1439
1440 HandleWorm:
1441   ld  a,(ix+delay)
1442   dec a
1443   jr  nz,respawncheck
1444
1445   ld  l,(ix+heading)
1446   jr  chkinput
1447 donediddelydone:
1448   ld  a,l
1449   ld  (sendbyte),a
1450   ld  (ix+heading),l
1451   ld  h,(ix+heading+1)
1452
1453   ld  c,(ix+pos)
1454   ld  b,(ix+pos+1)
1455   ld  e,(ix+pos2)
1456   ld  d,(ix+pos2+1)
1457
1458   psh hl
1459   ld  hl,previouspos
1460   ld  (hl),c
1461   inc hl
1462   ld  (hl),b
1463   inc hl
1464   inc hl
1465   ld  (hl),e
1466   inc hl
1467   ld  (hl),d
1468   pop hl
1469
1470 ;-------- move worm ----------
1471
1472 Wormmove:
1473   psh bc                        ; >> pos
1474   ld  a,(hl)
1475   add a,a
1476   add a,d
1477   ld  d,a
1478   bit 7,(hl)
1479   jr  z,notnegX
1480   dec b
1481 notnegX:
1482   jr  nc,notmoveX
1483   inc b
1484 notmoveX:
1485   ld  a,l
1486   add a,$40
1487   ld  l,a
1488   ld  a,(hl)
1489   add a,a
1490   add a,e
1491   ld  e,a
1492   bit 7,(hl)
1493   jr  z,notnegY
1494   dec c
1495 notnegY:
1496   jr  nc,notmoveY
1497   inc c
1498 notmoveY: ;bc=newpos
1499   ld  (ix+pos2),e
1500   ld  (ix+pos2+1),d
1501   ld  (ix+pos),c
1502   ld  (ix+pos+1),b
1503
1504 ;-check-
1505   pop hl                         ; << pos (old)
1506   ld  a,h
1507   sub b
1508   and 1
1509   ld  h,a
1510   ld  a,l
1511   sub c
1512   and 1
1513   add a,h
1514   ld  d,4
1515   jr  z,GotFour
1516   xor 3
1517   ld  d,a
1518 GotFour:
1519   cal chk4pixels
1520   rl  d
1521   jp  nc,Drawworm
1522
1523 ;--------- worm hit ----------
1524
1525 Hitworm:
1526   ld  a,(gameCar)
1527   ld  h,a
1528   and _datadie
1529   cal z,checkhitotherworm
1530   ld  a,h
1531   and _datamultpeas ;&&bit
1532   jr  nz,multiple_peas
1533   ld  a,h
1534   and _datafood
1535   jp  z,WormDead ;no food
1536
1537   ld  hl,0
1538 PeaY =$-2
1539 PeaX =$-1
1540   ld  a,(sprsize)
1541   inc a
1542   ld  d,a
1543   ld  a,b
1544   sub h
1545   inc a
1546   cp  d ;=(sprsize)+1
1547   jp  nc,WormDead
1548   ld  a,c
1549   sub l
1550   inc a
1551   cp  d
1552   jp  nc,WormDead
1553   cal DrawPea ;remove pea
1554   ld  a,(ix+grow)
1555   add a,15
1556 peagrowth =$-1
1557   ld  (ix+grow),a
1558   cal NewPea
1559   ld  hl,Left
1560   dec (hl)
1561   psh af
1562   ld  de,10
1563   cal IncScore
1564   pop af
1565   jp  nz,still_alive_not_dead
1566   ld  a,(gameCar)
1567   and _datafoodl
1568   jp  z,still_alive_not_dead
1569   ld  a,(Gametype)
1570   or  a
1571   jp  nz,Exit ;stack restored
1572
1573   ld  hl,Level
1574   ld  a,(hl)
1575   inc (hl)
1576   ld  l,a ;hl=Level
1577   ld  h,0
1578   add hl,hl
1579   add hl,hl
1580   cal _HLTIMES10
1581   ex  de,hl
1582   cal IncScore ;score+(40*level)
1583   cal removeworm
1584   pop hl                         ; << call
1585   pop hl                         ; << call
1586   pop hl                         ; << levelp new
1587   jp  StartLevel
1588
1589 multiple_peas:
1590   ld  hl,(peaspos)
1591   ld  a,(sprsize)
1592   inc a
1593   ld  d,a
1594   ld  a,b
1595   sub h
1596   inc a
1597   cp  d ;=(sprsize)+1
1598   jp  nc,peaaction
1599   ld  a,c
1600   sub l
1601   inc a
1602   cp  d
1603   ret c
1604 peaaction:
1605   ret
1606
1607 ;-----------------------------
1608
1609 nextotherwormbit:
1610   ld  a,c
1611   sub (hl)
1612   inc hl
1613   inc a
1614   cp  4
1615   jr  nc,nothit1 ;no
1616   ld  a,b
1617   sub (hl)
1618   inc a
1619   cp  4
1620   ret c ;nz ;yes
1621 nothit1:
1622   inc hl
1623   cal resbit
1624 ChkWorm:
1625   cal _cphlde
1626   jr  nz,nextotherwormbit
1627   ret ;z
1628
1629 checkhitlapline:
1630   ld  a,63
1631   sub b
1632   jr  z,nextlaphalf
1633   inc a
1634   ret nz
1635 nextlaphalf:
1636   ld  a,c
1637   and 32 ;y>=32?
1638   jr  nz,nolap
1639   cp  (ix+reserv)
1640   jr  z,nolap
1641   psh bc
1642   ld  de,20
1643   cal IncScore
1644   pop bc
1645   xor a
1646 nolap:
1647   ld  (ix+reserv),a
1648   ret
1649
1650 checkhitotherworm:
1651  .db  $dd,$7d ;ld a,lx
1652   cp  worm2&255
1653  psh ix
1654  jr nz,chkworm2 ; ret nz
1655   ld  ix,worm1
1656  jr chkworm
1657 chkworm2:
1658  ld ix,worm2
1659
1660 chkworm:
1661  ld h,(ix+tail+1)
1662  ld l,(ix+tail)
1663  ld e,(ix+head)
1664  ld d,(ix+head+1)
1665   cal ChkWorm
1666  pop ix
1667   ret z ;not hit
1668   pop bc ;call
1669 previouspos =$+1
1670   ld  bc,0
1671   ld  de,0
1672   ld  (ix+pos),c
1673   ld  (ix+pos+1),b
1674   ld  (ix+pos2),e
1675   ld  (ix+pos2+1),d
1676   ret
1677 still_alive_not_dead:
1678
1679 ;-------- draw worm ----------
1680
1681 Drawworm:
1682   ld  c,(ix+pos)
1683   ld  b,(ix+pos+1)
1684
1685   ld  a,(Gametype)
1686   cp  gamerace
1687   cal z,checkhitlapline
1688
1689   ld  l,(ix+head)
1690   ld  h,(ix+head+1)
1691   ld  (hl),c
1692   inc hl
1693   ld  (hl),b
1694   inc hl
1695   cal resbit
1696   ld  (ix+head),l
1697   ld  (ix+head+1),h
1698
1699   cal set4pixels
1700
1701   ld  a,(ix+grow)
1702   dec a
1703   jr  z,removetail
1704   ld  (ix+grow),a
1705   ret
1706
1707 removetail:
1708   ld  l,(ix+tail)
1709   ld  h,(ix+tail+1)
1710   ld  c,(hl)
1711   inc hl
1712   ld  b,(hl)
1713   inc hl
1714   cal resbit
1715   ld  (ix+tail),l
1716   ld  (ix+tail+1),h
1717
1718 res4pixels:
1719   cal ResPixel
1720   inc b
1721   cal ResPixel
1722   inc c
1723   cal ResPixel
1724   dec b
1725 ResPixel:
1726   cal FindPixel
1727   cpl
1728   and (hl)
1729   ld  (hl),a
1730   ret
1731
1732 ;-----------------------------
1733 ;---------- ball -------------
1734 ;-----------------------------
1735
1736 handlethoseneatlittleballs:
1737   ld  hl,balls
1738   ld  b,a ;a=(nrballs)
1739 handleballs
1740   psh bc
1741   psh hl
1742   ld  c,(hl)
1743   inc hl
1744   ld  b,(hl)
1745   inc hl
1746   ld  d,(hl)
1747   cal handleball
1748   dec c
1749   pop hl
1750   ld  (hl),c
1751   inc hl
1752   ld  (hl),b
1753   inc hl
1754   ld  (hl),d
1755   inc hl
1756   pop bc
1757   dnz handleballs
1758   ret
1759
1760 handleball:
1761   cal res4pixels
1762   dec c
1763
1764 ballxmove:
1765   bit 0,d ;1=L; 0=R
1766   jr  z,ballright
1767 ballleft:
1768   dec b
1769   cal checkballhit
1770   jr  z,ballymove
1771   inc b ;undo
1772   res 0,d ;go right
1773   jr  ballymove
1774 ballright:
1775   inc b
1776   cal checkballhit
1777   jr  z,ballymove
1778   dec b ;back
1779   set 0,d ;>left
1780
1781 ballymove:
1782   bit 1,d ;1=up; 0=down
1783   jr  z,balldown
1784 ballup:
1785   dec c
1786   cal checkballhit
1787   jr  z,balldone
1788   inc c
1789   res 1,d ;go down
1790   jr  balldone
1791 balldown:
1792   inc c
1793   cal checkballhit
1794   jr  z,balldone
1795   dec c
1796   set 1,d ;up
1797 balldone:
1798
1799 set4pixels: ;@(b,c)
1800   cal SetPixel
1801   inc b
1802   cal SetPixel
1803   inc c
1804   cal SetPixel
1805   dec b
1806 SetPixel: ;at bc
1807   cal FindPixel
1808   or  (hl)
1809   ld  (hl),a
1810   ret
1811
1812 letsmovetheotherway:
1813   ld  a,1
1814   xor (hl)
1815   ld  (hl),a
1816   ret
1817
1818 checkballhit:
1819   psh de
1820   ld  d,0
1821   cal chk4pixels
1822   xor a
1823   cp  d
1824   pop de
1825   ret
1826
1827 ;-----------------------------
1828 ;----------- procs -----------
1829 ;-----------------------------
1830
1831 resbit:
1832   ld  a,h
1833   and (ix+storepos)
1834   ld  h,a
1835   ret
1836
1837 randompos:
1838   ld  b,a
1839 Random: ;(2..b+2)
1840   ld  a,r
1841 Seed =$+1
1842   add a,0
1843   ld  (Seed),a
1844   and %01111110
1845   cp  b
1846   jr  nc,Random
1847   add a,2
1848   ret
1849
1850 NewPea:
1851   ld  a,(FieldWidth)
1852   add a,127-4
1853   cal randompos
1854   ld  h,a
1855   ld  a,(FieldHeight)
1856   add a,56-4
1857   cal randompos
1858   ld  l,a
1859   ld  (PeaY),hl
1860
1861 CheckPea:
1862   ld  c,l
1863   ld  a,(sprsize)
1864   ld  e,a
1865 chkloopy:
1866   ld  b,h
1867   ld  a,(sprsize)
1868   ld  d,a
1869 chkloopx:
1870   psh hl
1871   cal FindPixel
1872   and (hl)
1873   pop hl
1874   jr  nz,NewPea ;pixel found
1875   inc b
1876   dec d
1877   jr  nz,chkloopx
1878   inc c
1879   dec e
1880   jr  nz,chkloopy
1881 ;all ok; empty space
1882
1883 DrawPea: ;hl=(PeaY)
1884   ld  b,h
1885   ld  c,l
1886   ld  de,peasprite
1887 spritepos =$-2
1888   cal PutSprite ;||-ed
1889   ret
1890
1891 ;----------- score -----------
1892
1893 _divHLby1000:
1894   psh hl
1895   ld  b,3
1896 divideagain: ;3x
1897   cal _divHLby10
1898   dnz divideagain
1899   ld  a,l ;a=hl/1000
1900   pop hl
1901   ret
1902
1903 IncScore:
1904   ld  h,(ix+score+1)
1905   ld  l,(ix+score)
1906   cal _divHLby1000
1907   ld  c,a
1908   add hl,de
1909   cal _divHLby1000
1910   cp  c
1911   jr  z,scorecommon ;hl/1000 not increased
1912   inc (ix+lives)
1913   jr  scorecommon
1914 DecScore: ;&&&
1915   ld  h,(ix+score+1)
1916   ld  l,(ix+score)
1917   or  a
1918   sbc hl,de
1919   jr  c,showstats ;<0=0
1920 scorecommon:
1921   ld  (ix+score+1),h
1922   ld  (ix+score),l
1923   ld  de,0
1924 scorelimit =$-2
1925   cal _cphlde
1926   jp  nc,Exit
1927
1928 showstats:
1929   psh ix
1930   ld  h,0
1931   ld  l,h
1932   ld  (_penCol),hl
1933   ld  a,(nrworms)
1934   ld  b,a
1935   ld  ix,worm1
1936   ld  a,(gameCar)
1937   and _datanextl
1938   jr  nz,showstatsS
1939 showstatloop:
1940   psh bc
1941   cal showstat
1942   ld  de,worm2-worm1
1943   add ix,de
1944   ld  hl,_penCol
1945   ld  a,(hl)
1946   add a,10
1947   ld  (hl),a
1948   pop bc
1949   dnz showstatloop
1950   pop ix
1951   ret
1952
1953 showstat:
1954   ld  a,(gameCar)
1955   and _datalivel
1956   jr  nz,showlives
1957 showscore:
1958   ld  h,(ix+score+1)
1959   ld  l,(ix+score)
1960   cal _D_HL_DECI
1961   jr __vputs
1962 showlives:
1963   ld  a,(ix+lives)
1964   add a,'0'
1965 __vputmap:
1966   psh ix
1967   cal _vputmap
1968   pop ix
1969   ret
1970
1971 showstatsS:
1972   ld  hl,txtLevel
1973   cal __vputs
1974   ld  a,0
1975 Level =$-1
1976   cp  10
1977   jr  c,tilllevel9
1978   ld  l,a
1979   ld  h,0
1980   cal _divHLby10
1981   psh af
1982   ld  a,l
1983   add a,'0'
1984   cal __vputmap
1985   pop af
1986 tilllevel9:
1987   add a,'0'
1988   cal __vputmap
1989
1990   ld  a,98
1991   ld  (_penCol),a
1992   cal showscore
1993   ld  a,123
1994   ld  (_penCol),a
1995   cal showlives
1996   ld  a,(gameCar)
1997   and _datafoodl
1998   pop ix
1999   ret z
2000 showleft:
2001   ld  a,31
2002   ld  (_penCol),a
2003   ld  a,0
2004 Left =$-1
2005   ld  l,a
2006   ld  h,0
2007   cal _divHLby10
2008   psh af
2009   ld  a,l
2010   add a,'0'
2011   cal __vputmap
2012   pop af
2013   add a,'0'
2014   cal __vputmap
2015
2016   ld  hl,txtLeft
2017 __vputs:
2018   psh ix
2019   cal _vputs
2020   pop ix
2021   ret
2022
2023 showLevel:
2024   ld  hl,txtLevel
2025   cal _puts
2026   ld  a,(Level)
2027 showA:
2028   ld  l,a
2029   ld  h,0
2030   cal _divHLby10
2031   psh af
2032   ld  a,l
2033   add a,'0'
2034   cal _putc
2035   pop af
2036   add a,'0'
2037   jp  _putc
2038
2039 showHL:
2040   cal _D_HL_DECI
2041   jp  _puts
2042
2043 _D_HL_DECI:
2044   ld  de,savestr+4
2045   ld  b,5
2046 ldhld:
2047   cal _divHLby10
2048   add a,'0'
2049   ld  (de),a
2050   dec de
2051   dnz ldhld
2052   ld  hl,savestr
2053   ret
2054 savestr:
2055   .db "00000",0
2056
2057 ;-----------------------------
2058
2059 DisplayField:
2060   ld  a,c
2061   sub 29
2062   jr  nc,NotMinYScroll
2063   xor a
2064 NotMinYScroll:
2065   cp  43
2066 FieldHeight =$-1
2067   jr  c,NotMaxYScroll
2068   ld  a,(FieldHeight)
2069 NotMaxYScroll:
2070   ld  l,a
2071   ld  h,0
2072   add hl,hl
2073   add hl,hl
2074   add hl,hl
2075   add hl,hl
2076   add hl,hl
2077   psh bc                        ; >> 1
2078   psh de                        ; >> 2
2079   ld  de,ScrBuffer
2080   add hl,de
2081   ld  a,b
2082   sub 64
2083   jr  nc,NotMinXScroll
2084   xor a
2085 NotMinXScroll:
2086   cp  128
2087 FieldWidth = $-1
2088   jr  c,NotMaxXScroll
2089   ld  a,(FieldWidth)
2090 NotMaxXScroll:
2091   psh af                        ; >> 3
2092   and %11111000
2093   rra
2094   rra
2095   rra
2096   ld  c,a
2097   ld  b,0
2098   ld  de,DispBuffer
2099   pop af                         ; << 2
2100   and %00000111
2101   psh af                        ; >> 3
2102   cp  6
2103   jr  c,CopyScreen
2104   inc c
2105 CopyScreen:
2106   add hl,bc
2107   ld  b,57
2108 CopyScreenLoop:
2109   psh bc                        ; >> 4
2110   ld  bc,16
2111   ldir
2112   ld  c,16
2113   add hl,bc
2114   pop bc                         ; << 3
2115   dnz CopyScreenLoop
2116   pop af                         ; << 2
2117   ld  c,$b7 ;or a
2118 Bit0:
2119   jr  nz,Bit1
2120   halt
2121   halt
2122   jr  AfterShiftDelay
2123 Bit1:
2124   dec a
2125   jr  nz,Bit2
2126   cal ShiftRight1
2127   jr  AfterShiftDelay
2128 Bit2:
2129   dec a
2130   jr  nz,Bit3
2131   ld  a,2
2132   cal ShiftRight
2133   jr  AfterShiftDelay
2134 Bit3:
2135   dec a
2136   jr  nz,Bit4
2137   cal Chunk
2138   cal ShiftLeft1
2139   jr  AfterShift
2140 Bit4:
2141   dec a
2142   jr  nz,Bit5
2143   cal Chunk
2144   jr  AfterShiftDelay
2145 Bit5:
2146   dec a
2147   jr  nz,Bit6
2148   cal Chunk
2149   cal ShiftRight1
2150   jr  AfterShift
2151 Bit6:
2152   dec a
2153   jr  nz,Bit7
2154   ld  a,2
2155   cal ShiftLeft
2156   jr  AfterShift
2157 Bit7:
2158   cal ShiftLeft
2159 AfterShiftDelay:
2160   halt
2161 AfterShift:
2162 #ifdef buffer
2163   ld  hl,DispBuffer
2164   ld  de,$fc00+$70
2165   ld  bc,1024-$70
2166   ldir
2167 #endif
2168   pop de                         ; << 1
2169   pop bc                         ; << 0k
2170   ret
2171
2172 ShiftRight1:
2173   ld  a,1
2174 ShiftRight:
2175   ld  (ShiftRightCounter),a
2176   ld  a,c
2177   ld  (ShiftRightChunk),a
2178   ld  c,16
2179   add hl,bc
2180   ld  b,57
2181 ShiftRightLoop:
2182   psh bc
2183   ld  bc,-32
2184   add hl,bc
2185   ex  de,hl
2186   ld  a,(de)
2187 ShiftRightChunk:
2188   or  a
2189   cal c,_SHLACC
2190   ld  c,0
2191 ShiftRightCounter = $-1
2192 ShiftRowsLeft:
2193   psh hl
2194   rla
2195   ld  b,16
2196 ShiftRowLeft:
2197   dec hl
2198   rl  (hl)
2199   dnz ShiftRowLeft
2200   pop hl
2201   dec c
2202   jr  nz,ShiftRowsLeft
2203   ld  bc,-16
2204   add hl,bc
2205   ex  de,hl
2206   pop bc
2207   dnz ShiftRightLoop
2208   ret
2209
2210 ShiftLeft1:
2211   ld  a,1
2212 ShiftLeft:
2213   ld  (ShiftLeftCounter),a
2214   ld  a,c
2215   ld  (ShiftLeftChunk),a
2216   rla
2217   jr  nc,ShiftLeftSameByte
2218   dec hl
2219 ShiftLeftSameByte:
2220   ex  de,hl
2221   ld  bc,-16
2222   add hl,bc
2223 NewSprite:
2224   ex  de,hl
2225   ld  b,57
2226 ShiftLeftLoop:
2227   psh bc                        ; >> 1
2228   ld  bc,-32
2229   add hl,bc
2230   ex  de,hl
2231   ld  a,(de)
2232 ShiftLeftChunk:
2233   or  a
2234   cal c,_SHRACC
2235   ld  c,0
2236 ShiftLeftCounter = $-1
2237 ShiftRowsRight:
2238   psh hl                        ; >> 2
2239   rra
2240   ld  b,16
2241 ShiftRowRight:
2242   rr  (hl)
2243   inc hl
2244   dnz ShiftRowRight
2245   pop hl                         ; << 1
2246   dec c
2247   jr  nz,ShiftRowsRight
2248   ld  bc,-16
2249   add hl,bc
2250   ex  de,hl
2251   pop bc                         ; << 0k
2252   dnz ShiftLeftLoop
2253   ret
2254
2255 Chunk:
2256   psh hl                        ; >> 1
2257   psh de                        ; >> 2
2258   ld  c,16
2259   add hl,bc
2260   ld  b,57
2261 ChunkScreen:
2262   psh bc                        ; >> 3
2263   ld  bc,-32
2264   add hl,bc
2265   ex  de,hl
2266   ld  a,(de)
2267   cal _SHRACC
2268   ld  b,16
2269 ChunkRow:
2270   dec hl
2271   rld
2272   dnz ChunkRow
2273   ex  de,hl
2274   pop bc                         ; << 2
2275   dnz ChunkScreen
2276   pop de                         ; << 1
2277   pop hl                         ; << 0k
2278   ld  c,$37 ;scf
2279   ret
2280
2281 ;----------- draw ------------
2282
2283 ;--- pixel ---
2284
2285 chk4pixels: ;&&
2286   cal CheckPixel
2287   inc b
2288   cal CheckPixel
2289   inc c
2290   cal CheckPixel
2291   dec b
2292   cal CheckPixel
2293   dec c
2294   ret
2295 CheckPixel: ;at bc in d
2296   cal FindPixel
2297   and (hl)
2298   ret z
2299   dec d
2300   ret
2301
2302 ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes)
2303 ;(b,c) to hl:a; "destroyes" ahl
2304
2305 FindPixel: ;(b,c) to hl:a
2306   ld  h,0
2307   ld  l,c    ;hl=y
2308   add hl,hl
2309   add hl,hl
2310   ld  a,b    ;a=x
2311   rra
2312   add hl,hl
2313   rra
2314   add hl,hl
2315   add hl,hl  ;hl=32*y
2316   rra        ;a=x/8
2317   or  l
2318   ld  l,a
2319   ld  a,b
2320   and 7
2321   cpl
2322   rlca
2323   rlca
2324   rlca
2325   ld  (FP_Bit),a
2326   xor a
2327 FP_Bit =$+1
2328   set 0,a
2329
2330   psh de ;&&&
2331   ld  de,ScrBuffer
2332   add hl,de
2333   pop de
2334   ret
2335
2336 ;--- sprite ---
2337
2338 PutSprite:  ;||@(b,c)
2339   ;by SHIAR  only ix saved
2340   cal FindPixel
2341 putspr:
2342   ld  (beginbit),a
2343   ld  a,(sprsize)
2344   ld  b,a ;rows
2345 sprloopy:
2346   psh bc ;rows
2347   psh hl
2348   ld  a,(de)
2349   ld  c,a
2350   inc de
2351   ld  a,(sprsize)
2352   ld  b,a ;width
2353 beginbit =$+1
2354   ld  a,1
2355 sprloopx:
2356   sla c ;draw?
2357   jr  nc,sprnodraw
2358   psh af
2359   xor (hl)
2360   ld  (hl),a
2361   pop af
2362 sprnodraw:
2363   rrca ;next bit
2364   jp  nc,nextbitok
2365   inc hl ;next byte
2366 nextbitok:
2367   dnz sprloopx
2368
2369   pop hl
2370   ld  bc,32 ;next line
2371   add hl,bc
2372   pop bc
2373   dnz sprloopy
2374   ret
2375
2376 ;--- line ---
2377
2378 loaddrawdata:
2379   ld  d,(hl)
2380   inc hl
2381   ld  e,(hl)
2382   inc hl
2383   ld  a,(hl)
2384   inc hl
2385   ret
2386
2387 ;LINE (d,e)-(h,l)
2388 ;destroyes a
2389
2390 Line:
2391   psh bc
2392   psh hl
2393   psh de
2394   ld  a,d
2395   cp  h
2396   jr  c,lineOrdered
2397   ex  de,hl
2398 lineOrdered:
2399   ld  b,d
2400   ld  c,e
2401   psh hl
2402   psh bc
2403   cal FindPixel
2404   pop bc
2405   pop de
2406 connectedLine:
2407   psh hl
2408   ld  h,c
2409   ld  c,a
2410   ld  a,d
2411   sub b
2412   ld  b,a
2413   ld  a,e
2414   jr  nz,LineNotPoint
2415   cp  h
2416   jr  nz,LineNotPoint
2417   pop hl
2418   jr  DoneLine
2419 LineNotPoint:
2420   sub h
2421   ld  de,32
2422   jr  nc,LinePositiveY
2423   neg
2424   ld  de,-32
2425 LinePositiveY:
2426   cp  b
2427   jr  nc,SteepLine
2428   add a,a
2429   ld  (line2sm+1),a
2430   ld  h,a
2431   xor a
2432   sub b
2433   add a,a
2434   ld  (line1sm+1),a
2435   ld  a,h
2436   sub b
2437   pop hl
2438 LineLoopGentle:
2439   psh af
2440   ld  a,(hl)
2441   or  c
2442   ld  (hl),a
2443   rrc c
2444   jr  nc,$+3
2445   inc hl
2446   pop af
2447   jp  m,line2sm
2448 line1sm:
2449   add a,0
2450   add hl,de
2451 line2sm:
2452   add a,0
2453   dnz LineLoopGentle
2454 DoneLine:
2455   ld  a,(hl)
2456   or  c
2457   ld  (hl),a
2458   pop de
2459   pop hl
2460   pop bc
2461   ret
2462 SteepLine:
2463   ld  h,a
2464   neg
2465   add a,a
2466   ld  (line3sm+1),a
2467   ld  a,b
2468   add a,a
2469   ld  (line4sm+1),a
2470   sub h
2471   ld  b,h
2472   pop hl
2473 LineLoopSteep:
2474   psh af
2475   ld  a,(hl)
2476   or  c
2477   ld  (hl),a
2478   add hl,de
2479   pop af
2480   jp  m,line4sm
2481 line3sm:
2482   add a,0
2483   rrc c
2484   jr  nc,$+3
2485   inc hl
2486 line4sm:
2487   add a,0
2488   dnz LineLoopSteep
2489   jr  DoneLine
2490
2491 drawbox: ;(d,e)-(h,l)
2492   ld  b,l ;Delta-y
2493   ld  l,e
2494 boxloop:
2495   cal Line
2496   inc l
2497   inc e
2498   dnz boxloop
2499   ret
2500
2501 ;-----------------------------
2502 ;----------- link ------------
2503 ;-----------------------------
2504
2505 TIMEOUT = $1000
2506
2507 receive:
2508   cal GET_KEY
2509   cp  K_EXIT
2510   jp  z,LinkBreak
2511   in  a,(7)
2512   and %11
2513   cp  %11
2514   jr  z,receive
2515   cal Qreceive
2516   jr  c,receive
2517   ret
2518
2519 Qreceive:
2520   ld  b,8
2521   jr  ReceiveCont
2522 receiveloop:
2523   ld  de,TIMEOUT
2524 WaitRecBit:
2525   cal CheckLink
2526   jr  z,LinkFailed
2527   cp  %11
2528   jr  z,WaitRecBit
2529 ReceiveCont:
2530   sub 2
2531   ld  a,2
2532   ld  d,D0LD1H
2533   jr  c,ReceiveLow
2534   rra
2535   ld  d,D0HD1L
2536 ReceiveLow:
2537   rr c
2538   ld (AckBit),a
2539   ld a,d
2540   out (7),a
2541   ld  de,TIMEOUT
2542 WaitAckRec:
2543   cal CheckLink
2544   cp  0
2545 AckBit =$-1
2546   jr  nz,WaitAckRec
2547   ld  a,D0HD1H
2548   out (7),a
2549   ld  d,4
2550 WaitReadyRec:
2551   dec d
2552   jr  z,ReadyRec
2553   in  a,(7)
2554   cp  %11
2555   jr  nz,WaitReadyRec
2556 ReadyRec:
2557   dnz receiveloop
2558   jr  LinkSuccess
2559
2560 send:
2561   ld  b,9
2562   ld  c,a
2563   jr  SendAcked
2564 SendBits:
2565   rr  c
2566   ld  a,D0LD1H
2567   jr  nc,SendLow
2568   ld  a,D0HD1L
2569 SendLow:
2570   out (7),a
2571   ld  de,TIMEOUT
2572 WaitAckSend:
2573   cal CheckLink
2574   jr  nz,WaitAckSend
2575 SendAcked:
2576   ld  a,D0HD1H
2577   out (7),a
2578   ld  de,TIMEOUT
2579 WaitReadySend:
2580   cal CheckLink
2581   cp  %11
2582   jr  nz,WaitReadySend
2583   dnz SendBits
2584 LinkSuccess:
2585   ld  a,c ;pop a
2586   ret
2587
2588 LinkFailed:
2589   scf
2590   ld a,c
2591   ret
2592 LinkBreak:
2593   ld  a,D0HD1H
2594   out (7),a
2595   jp  Exit
2596
2597 CheckLink:
2598   pop hl
2599   dec de
2600   ld a,d
2601   or e
2602   jr z,LinkFailed
2603
2604   ld  a,$BF
2605   out (1),a
2606   nop \ nop
2607   in  a,(1)
2608   psh af
2609   ld  a,%11111111
2610   out (1),a
2611   pop af
2612   bit 6,a
2613
2614   in  a,(7)
2615   and %11
2616   jp  (hl)
2617
2618
2619 ;-----------------------------
2620 ;---------- levels -----------
2621 ;-----------------------------
2622
2623 LevelDef:
2624   .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
2625   .db 0,2,63        ;start d, y, x
2626   .db 128,57        ;field width (128-255), height (57-255)
2627   .db 0,0           ;no additional lines, boxes
2628
2629   .db 255
2630    ret
2631
2632 LevelDefM:
2633   .db 8,0,15,15,0,0
2634   .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
2635   .db 128,57
2636   .db 0,0
2637
2638 ;-----------------------------
2639 ;---------- data -------------
2640 ;-----------------------------
2641
2642 wtPicture:
2643 .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2644 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2645 .db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000
2646 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000
2647 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000
2648 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000
2649 .db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000
2650 .db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100
2651 .db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2652 .db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100
2653 .db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100
2654 .db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001100
2655 .db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00001100
2656 .db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00011100
2657 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00011000
2658 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00011000
2659
2660 txtMenu:    .db "by Shiar",0
2661             .db "Have fun!",0 ;4th menu item
2662             .db "Level 00",0  ;3rd
2663             .db "Worms: 0",0  ;2nd
2664 txtGame:    .db "Singleplayer",0  ;0 (1st)
2665 txtGame2:   .db "Peaworm     ",0  ;1 (next 1st)
2666             .db "Deathmatch",0    ;2
2667             .db "Foodmatch ",0    ;3
2668             .db "LinkMatch",0     ;4
2669             .db "Race     ",0     ;5
2670             .db "CTF ",0          ;6
2671             .db "Domination",0    ;7
2672 txtLevsel:  .db $CF," Select levels: ",5,0
2673 txtName:    .db "Enter name player ",0
2674 txtWaiting: .db "Waiting...",0
2675 txtReceive: .db "Receiving..." ;,0
2676
2677 TrigPrecalc:
2678 .db   0,  3,  6,  9, 12, 15, 18, 21
2679 .db  24, 27, 30, 33, 36, 39, 42, 45
2680 .db  48, 51, 54, 57, 59, 62, 65, 67
2681 .db  70, 73, 75, 78, 80, 82, 85, 87
2682 .db  89, 91, 94, 96, 98,100,102,103
2683 .db 105,107,108,110,112,113,114,116
2684 .db 117,118,119,120,121,122,123,123
2685 .db 124,125,125,126,126,126,126,126
2686 .db 127
2687
2688 txtLevel:  .db "Level ",0
2689 txtWorms:  .db "Worms: 0",0 ;follows txtLevel
2690 txtDied:   .db "Died ",0
2691 txtScore:  .db "Score",0    ;follows txtDied
2692 txtLeft:   .db " left",0    ;follows txtScore
2693 txthiscore:.db "HiScore:",0
2694 txtReady:  .db "Prepare!",0
2695 txtposReady = 7
2696 txtGO:     .db "----- GAME OVER -----",0
2697
2698 gamesdata:
2699
2700 _datalink  = %00000001 ;linkplay
2701 _datalivel = %00000010 ;lives=0 limit
2702 _datafoodl = %00000100 ;left=0 limit
2703 _datanextl = %00001000 ;next level if left=0
2704 _datasingl = %00001000 ;singleplayer=1
2705 _datafood  = %00010000 ;food present
2706 _________  = %00100000 ;
2707 _datadie   = %01000000 ;worm dies on impact
2708 _datascore = %10000000 ;score>=100 limit
2709 _datamultpeas = 0
2710
2711 gamesingle   =  0
2712 datasingle: .db %01011110
2713 gamepeas     =  1
2714 datapeas:   .db %01011010
2715 gamedeathm   =  2
2716 datadeathm: .db %01000010
2717 gamefoodm    =  3
2718 datafoodm:  .db %11010000
2719 gamelinkm    =  4
2720 datalinkm:  .db %01000011
2721 gamerace     =  5
2722 datarace:   .db %10000000
2723 gamectf      =  6
2724 datactf:    .db %01000000
2725 gamedomin    =  7
2726 datadomin:  .db %01000000 ;==(8 modes)
2727
2728 datalevels: .dw LevelDef, LevelDef
2729             .dw LevelDefM,LevelDefM
2730             .dw LevelDefM,LevelDefM
2731             .dw LevelDefM,LevelDefM
2732 nrlevels:   .db 2,2,2,2,2,2,2,2
2733
2734 worm1set:  .dw worm1p,worm1p
2735            .db %11110111,3,0,%01111110,%10,%100 ;< >
2736 worm1name: .db "worm #01",0
2737 worm2set:  .dw worm2p,worm2p
2738            .db %11111011,3,0,%00111111,%10000,%1000 ;f1 f2
2739 worm2name: .db "worm #02",0
2740 worm3set:  .dw worm3p,worm3p
2741            .db %11111011,3,0,%01011111,%10,%100 ;sto ,
2742 worm3name: .db "worm #03",0
2743 worm4set:  .dw worm4p,worm4p
2744            .db %11111011,3,0,%01111101,%10,%1 ;enter +
2745 worm4name: .db "worm #04",0
2746
2747 hipeaworm: .dw 0
2748 end:
2749
2750 defsprsize   = 4
2751 sprsize:   .db 4
2752 peasprite: .db %01100000
2753            .db %11110000
2754            .db %11110000
2755            .db %01100000
2756
2757                ;set:
2758 heading  = 0   ;level*
2759 pos      = 2   ;level*
2760 pos2     = 4   ;level
2761 grow     = 6   ;level
2762 died     = 8   ;game
2763 score    = 9   ;game
2764 delay    = 11  ;game
2765                ;19B @game
2766 head     = 12  ;4B (head=tail)
2767 tail     = 14  ;also@next level
2768 storepos = 16
2769 lives    = 17
2770 reserv   = 18  ;loop
2771  ;race:lap
2772  ;hunt:time
2773 input    = 19
2774 left     = 20
2775 right    = 21
2776 name     = 22
2777 wormsize = 31
2778
2779 respawndelay  = 30
2780 maxnamelength = 8+1
2781
2782 ;-----------------------------
2783 ;----------- end -------------
2784 ;-----------------------------
2785
2786   .end
2787
2788 .end