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