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