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