wonderworm (3 levels (lines), greyscale, vertical scrolling)
[wormy.git] / worm.asm
1
2 ; -WonderWorm--v0.9-
3 ; by Matthew Shepcar
4 ; 30th December 1998
5
6 #include asm86.h
7 #include ti86asm.inc
8 #include ti86abs.inc
9
10 .org _asm_exec_ram
11                     
12   nop
13   jp Start
14   .dw 0,WormMsg
15 Start:
16
17   call _runindicoff
18   call _clrLCD
19
20   call BuildTrigTables
21
22   ld hl,0FC00h
23   ld de,GreyBuf
24   ld bc,400h
25   ldir
26
27   ld hl,IHandler
28   ld bc,IHandlerEnd-IHandler
29   ld de,0BCBCh
30   ldir
31   ld hl,0BD00h
32   ld (hl),d
33   ld de,0BD01h
34   ld a,d
35   ld bc,256
36   ldir
37   ld i,a
38   im 2
39
40   ld a,r
41   ld (Seed),a
42
43   ld hl,0
44   ld (Score),hl
45   ld a,1
46   ld (Level),a
47   ld a,3
48   ld (Lives),a
49   ld hl,Levels
50
51 StartLevel:
52   ld a,(hl)
53   ld (Left),a
54   inc hl
55   ld a,(hl)
56   ld (Speed),a
57   inc hl
58   ld a,25
59 NextLife:
60   ld (GrowAmt),a
61   push hl
62   ld d,(hl)
63   inc hl
64   ld e,(hl)
65   inc hl
66   ld a,(hl)
67   inc hl
68   ld (Heading),a
69   push de
70   ld a,(hl)
71   inc hl
72   sub 57
73   ld (FieldHeight),a
74   add a,57-5
75   push hl
76   ld l,a
77   ld h,0
78   add hl,hl
79   add hl,hl
80   add hl,hl
81   add hl,hl
82   ex de,hl
83
84   ld hl,ScrBuffer
85   push hl
86   push de
87   ld de,ScrBuffer+1
88   ld bc,31
89   ld (hl),-1
90   ldir
91   inc hl
92   ld (hl),192
93   inc hl
94   ld b,14
95 ClearLine:
96   ld (hl),c
97   inc hl
98   djnz ClearLine
99   ld (hl),3
100   inc hl
101   ex de,hl
102   pop bc
103   ldir
104   pop hl
105   ld c,32
106   ldir
107   pop hl
108
109   ld a,(hl)
110   inc hl
111   or a
112   jr z,NoLines
113 DrawLines:
114   push af
115   ld d,(hl)
116   inc hl
117   ld e,(hl)
118   inc hl
119   ld a,(hl)
120   inc hl
121   push hl
122   ld l,(hl)
123   ld h,a
124   call Line
125   inc d
126   inc h
127   call Line
128   inc e
129   inc l
130   call Line
131   dec d
132   dec h
133   call Line
134   pop hl
135   inc hl
136   pop af
137   dec a
138   jr nz,DrawLines
139 NoLines:
140   push hl
141
142   ld hl,ScrBuffer
143   ld de,ScrBuffer+BufSize
144   ld bc,BufSize
145   ldir
146
147   ld hl,0
148   ld (_penCol),hl
149   ld hl,LivesMsg
150   call _vputs
151   ld a,(Lives)
152   add a,'0'
153   call _vputmap
154
155   ld a,40
156   ld (_penCol),a
157   call _vputs ;scoremsg
158   ld a,100
159   ld (_penCol),a
160   call _vputs
161   ld a,(Left)
162   call PutNum
163
164   call PutScore
165
166   call NewPea
167
168   xor a
169   call DisplayField
170   ld hl,LevelMsg
171   ld a,7
172   call DispMsg
173   ld a,(Level)
174   add a,'0'
175   call _putc
176   res 3,(iy+5)
177
178   xor a
179 ReadyDelay:
180   halt
181   dec a
182   jr nz,ReadyDelay
183
184   ld hl,(HeadPos)
185   ld (TailPos),hl
186   pop hl
187   pop bc
188   push hl
189   ld de,0
190
191 GameLoop:
192
193   ld a,c
194   sub 29
195   jr nc,NotMinScroll
196   xor a
197 NotMinScroll:
198   cp 43
199 FieldHeight =$-1
200   jr c,NotMaxScroll
201   ld a,(FieldHeight)
202 NotMaxScroll:
203   call DisplayField
204
205   ld a,5
206 Speed =$-1
207 Delay:
208   halt
209   dec a
210   jr nz,Delay
211
212   ld hl,0A000h
213 HeadPos =$-2
214   ld (hl),c
215   inc hl
216   ld (hl),b
217   inc hl
218   res 4,h
219   ld (HeadPos),hl
220
221   ld hl,SinCosTable
222 Heading =$-2
223
224   ld a,0FEh
225   out (1),a
226   in a,(1)
227   rra
228   rra
229   jr c,NotRight
230   ld a,l
231   add a,8
232   ld l,a
233   inc a
234 NotRight:
235   rra
236   jr c,NotLeft
237   ld a,l
238   sub 8
239   ld l,a
240 NotLeft:
241
242   ld (Heading),hl
243
244   push bc
245   ld a,(hl)
246   add a,a
247   add a,d
248   ld d,a
249   bit 7,(hl)
250   jr z,NotNegX
251   dec b
252 NotNegX:
253   jr nc,NotMoveX
254   inc b
255 NotMoveX:
256   ld a,l
257   add a,40h
258   ld l,a
259   ld a,(hl)
260   add a,a
261   add a,e
262   ld e,a
263   bit 7,(hl)
264   jr z,NotNegY
265   dec c
266 NotNegY:
267   jr nc,NotMoveY
268   inc c
269 NotMoveY:
270
271   pop hl
272   push de
273   ld a,h
274   sub b
275   and 1
276   ld h,a
277   ld a,l
278   sub c
279   and 1
280   add a,h
281   ld d,4
282   jr z,GotFour
283   xor 3
284   ld d,a
285 GotFour:
286
287   call CheckPixel
288   inc b
289   call CheckPixel
290   inc c
291   call CheckPixel
292   dec b
293   call CheckPixel
294   dec c
295   rl d
296   jr nc,WormNotCrashed
297   ld hl,0
298 PeaY =$-2
299 PeaX =$-1
300   ld a,b
301   sub h
302   inc a
303   cp 4
304   jp nc,WormDead
305   ld a,c
306   sub l
307   inc a
308   cp 4
309   jr nc,WormDead
310   push bc
311   call DrawPea
312   ld a,0
313 GrowAmt =$-1
314   add a,15
315   ld (GrowAmt),a
316   call NewPea
317   ld de,10
318   call IncScore
319   ld a,119
320   ld (_penCol),a
321   ld hl,Left
322   dec (hl)
323   jr nz,NotNextLevel
324   ld hl,Level
325   inc (hl)
326   pop bc
327   pop de
328   pop hl
329   pop de
330   jp StartLevel
331
332 NotNextLevel:
333   ld a,(hl)
334   call PutNum
335   pop bc
336 WormNotCrashed:
337
338   push bc
339   ld a,3
340 WormCol =$-1
341   call SetPixel
342   inc b
343   call SetPixel
344   inc c
345   call SetPixel
346   dec b
347   call SetPixel
348
349 ;  xor 2
350 ;  ld (WormCol),a
351
352   ld hl,GrowAmt
353   dec (hl)
354   jr nz,GrowWorm
355   inc (hl)
356   ld hl,0A000h
357 TailPos =$-2
358   ld c,(hl)
359   inc hl
360   ld b,(hl)
361   inc hl
362   res 4,h
363   ld (TailPos),hl
364
365   call ResPixel
366   inc b
367   call ResPixel
368   inc c
369   call ResPixel
370   dec b
371   call ResPixel
372
373 GrowWorm:
374
375   ld a,0BFh
376   out (1),a
377   in a,(1)
378   rla
379   jr c,NotPaused
380   call _getky
381 WaitUnpause:
382   halt
383   call _getky
384   or a
385   jr z,WaitUnpause
386   ld a,128
387 NotPaused:
388   pop bc
389   pop de
390   rla
391   jp c,GameLoop
392   push hl
393 WormDead:
394   pop de
395   pop hl
396   ld hl,(HeadPos)
397   ld de,(TailPos)
398   sbc hl,de
399   ld a,l
400   rr h
401   rra
402   ld hl,Lives
403   dec (hl)
404   pop hl
405   jp nz,NextLife
406
407 #if 0
408   ld a,(Eaten)
409   ld hl,HiScore
410   cp (hl)
411   jr c,NotNewHigh
412   ld (hl),a
413   ld hl,Varname-1
414   rst 20h
415   rst 10h
416   call 460Bh
417   ld de,HiScore-_asm_exec_ram+2
418   add hl,de
419   adc a,0
420   call _load_ram_ahl
421   ld a,(HiScore)
422   ld (hl),a
423 NotNewHigh:
424 #endif
425
426   im 1
427   ld a,03Ch
428   out (0),a
429   call _clrScrn
430   call _homeup
431   jp _getky
432
433 NewPea:
434   call Random
435   ld a,h
436   and 7Fh
437   cp 77h
438   jr nc,NewPea
439   add a,3
440   ld h,a
441   ld a,(FieldHeight)
442   add a,57-12
443   ld b,a
444   ld a,l
445   and 7Fh
446   cp b
447   jr nc,NewPea
448   add a,5
449   ld l,a
450   ld (PeaY),hl
451   ld d,2
452   push hl
453   call CheckPea
454   pop hl
455   dec d
456   jr z,NewPea
457 DrawPea:
458   ld d,0
459 CheckPea:
460   ld b,h
461   ld c,l
462   call PeaPixel
463   inc c
464   call PeaPixel
465   inc b
466   call PeaPixel
467   dec c
468 PeaPixel:
469   push de
470   call FindPixel
471   pop de
472   ld e,a
473   ld a,d
474   or a
475   ld a,e
476   jr z,DrawPeaPixel
477   and (hl)
478   ret z
479   ld d,1
480   ret
481 DrawPeaPixel:
482   xor (hl)
483   ld (hl),a
484   ret
485
486 Random:
487   ld hl,0
488   ld de,12345
489 Seed =$-2
490   ld a,7921 & 255
491   ld bc,1000h+(7921/256)
492 domult16:
493   add hl,hl
494   rla
495   rl c
496   jr nc,noadd16
497   add hl,de
498 noadd16:
499   djnz domult16
500   inc hl
501   ld (Seed),hl ;seed=(seed*7921+1) MOD 65536
502   ld a,h
503   ret
504
505 ResPixel:
506   call FindPixel
507   cpl
508   ld d,a
509   and (hl)
510   ld (hl),a
511   ld a,d
512   ld de,BufSize
513   add hl,de
514   and (hl)
515   ld (hl),a
516   ret
517
518 SetPixel:
519   push bc
520   push af
521   push af
522   call FindPixel
523   pop de
524   ld e,a
525   rr d
526   jr c,SetGrey1
527   cpl
528   and (hl)
529   ld (hl),a
530 SetGrey1:
531   or (hl)
532   ld (hl),a
533   ld bc,BufSize
534   add hl,bc
535   ld a,e
536   rr d
537   jr c,SetGrey2
538   cpl
539   and (hl)
540   ld (hl),a
541 SetGrey2:
542   or (hl)
543   ld (hl),a
544   pop af
545   pop bc
546   ret
547
548 CheckPixel:
549   push de
550   call FindPixel
551   push af
552   and (hl)
553   ld de,BufSize
554   add hl,de
555   ld e,a
556   pop af
557   and (hl)
558   or e
559   pop de
560   ret z
561   dec d
562   ret
563
564 FindPixel:
565   push bc
566   ld a,b
567   and 7
568   add a,offsets_table & 255
569   ld e,a
570   ld d,offsets_table/256
571   ld h,0
572   ld a,c
573   add a,a
574   add a,a
575   rl h
576   add a,a
577   rl h
578   add a,a
579   rl h
580   srl b
581   srl b
582   srl b
583   or b
584   ld l,a
585   ld a,(de)
586   ld de,ScrBuffer
587   add hl,de
588   pop bc
589   ret
590
591 IncScore:
592   ld hl,(Score)
593   add hl,de
594   ld (Score),hl
595 PutScore:
596   ld hl,-1
597   ld (_curRow),hl
598   ld a,63
599   ld (_penCol),a
600   ld hl,(Score)
601   xor a
602   call 4A33h
603   dec hl
604   ld b,5
605 DoPutScore:
606   ld a,(hl)
607   inc hl
608   cp 32
609   jr nz,NotZeroDigit
610   ld a,'0'
611 NotZeroDigit:
612   call _vputmap
613   djnz DoPutScore
614   ret
615
616 PutNum:
617   ld l,a
618   ld h,0
619   call UNPACK_HL
620   push af
621   ld a,l
622   call PutDigit
623   pop af
624 PutDigit:
625   add a,'0'
626   jp _vputmap
627
628 offsets_table:
629   .db 128,64,32,16,8,4,2,1
630
631 IHandler:
632   exx
633   ex af,af'
634         in a,(3)
635         bit 1,a
636         jr z,notvbl
637         ld hl,GreyCounter
638         inc (hl)
639         ld a,(hl)
640   cp 3
641         ld a,3Ch
642         jr nz,notpage1
643   ld (hl),0
644   ld a,(GreyBuf/256)-0C0h
645 notpage1:
646         out (0),a
647 notvbl:
648   jp 3Ah
649 IHandlerEnd:
650 GreyCounter .db 0
651
652 DisplayField:
653   ld l,a
654   ld h,0
655   add hl,hl
656   add hl,hl
657   add hl,hl
658   add hl,hl
659   push bc
660   push de
661   ld de,ScrBuffer
662   add hl,de
663   ld de,0FC70h
664   ld bc,00390h
665   ldir
666   ld de,BufSize-390h
667   add hl,de
668   ld de,GreyBuf+70h
669   ld bc,00390h
670   ldir
671   pop de
672   pop bc
673   ret
674
675 DispMsg:
676   push hl
677   ld h,a
678   ld l,4
679   ld (_curRow),hl
680   ld hl,0FDE0h
681   ld de,0FDE1h 
682   ld (hl),-1
683   ld bc,0BFh
684   ldir
685   pop hl
686   set 3,(iy+5)
687   jp _puts
688
689
690 Levels:
691   .db 5,7           ;5 peas, speed 7
692   .db 64,4,0        ;x,y,d
693   .db 57            ;field height
694   .db 0             ;no additional lines
695
696   .db 8,6
697   .db 4,14,40h
698   .db 57
699   .db 1
700   .db 28,28,100,28
701
702   .db 99,5
703   .db 4,14,40h
704   .db 100
705   .db 2
706   .db 28,28,28,72
707   .db 100,28,100,72
708
709 #include trigtab.asm
710 #include line.asm
711
712 WormMsg .db "Wonderworm!",0
713 LevelMsg .db "Level ",0
714 LivesMsg .db "Lives: ",0
715 ScoreMsg .db "Score: ",0
716 LeftMsg  .db "Food: ",0
717 HiScore .db 0
718 Varname .db 4,"worm"
719
720 Left =$
721 Lives =$+1
722 Level =$+2
723 Score =$+3
724
725 SinCosTable =09E00h
726 ScrBuffer =8200h
727 BufSize =0A00h
728 GreyBuf =0F400h
729
730 .end