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