original peaworm v0.9 release
[wormy.git] / worm.asm
1
2 ; -- Peaworm v0.9 --
3 ; by Matthew Shepcar
4 ; 28th 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   ld a,r
21   ld (Seed),a
22
23   ld hl,0FC70h
24   push hl
25   ld de,0FC71h
26   ld bc,31
27   ld (hl),-1
28   ldir
29   inc hl
30   ld (hl),192
31   ld l,9*16+15
32   ld (hl),3
33   inc hl
34   ex de,hl
35   ld bc,52*16
36   ldir
37   pop hl
38   ld c,32
39   ldir
40
41   ld (_penCol),de
42   ld hl,WormMsg
43   call _vputs
44   ld a,48
45   ld (_penCol),a
46   call _vputs
47   ld a,91
48   ld (_penCol),a
49   call _vputs
50   ld a,(hl)
51   call PutNum
52
53   call BuildTrigTables
54
55   call NewPea
56   ld a,25
57   ld (GrowAmt),a
58   ld hl,(HeadPos)
59   ld (TailPos),hl
60   xor a
61   ld (Heading),a
62   ld (Eaten),a
63   ld bc,0400Ah
64   ld d,a
65   ld e,a
66
67 GameLoop:
68   ld a,8
69 Delay:
70   halt
71   dec a
72   jr nz,Delay
73
74   ld hl,0A000h
75 HeadPos =$-2
76   ld (hl),c
77   inc hl
78   ld (hl),b
79   inc hl
80   res 4,h
81   ld (HeadPos),hl
82
83   ld hl,SinCosTable
84 Heading =$-2
85
86   ld a,0FEh
87   out (1),a
88   in a,(1)
89   rra
90   rra
91   jr c,NotRight
92   ld a,l
93   add a,8
94   ld l,a
95   inc a
96 NotRight:
97   rra
98   jr c,NotLeft
99   ld a,l
100   sub 8
101   ld l,a
102 NotLeft:
103
104   ld (Heading),hl
105
106   push bc
107   ld a,(hl)
108   add a,a
109   add a,d
110   ld d,a
111   bit 7,(hl)
112   jr z,NotNegX
113   dec b
114 NotNegX:
115   jr nc,NotMoveX
116   inc b
117 NotMoveX:
118   ld a,l
119   add a,40h
120   ld l,a
121   ld a,(hl)
122   add a,a
123   add a,e
124   ld e,a
125   bit 7,(hl)
126   jr z,NotNegY
127   dec c
128 NotNegY:
129   jr nc,NotMoveY
130   inc c
131 NotMoveY:
132
133   pop hl
134   push de
135   ld a,h
136   sub b
137   and 1
138   ld h,a
139   ld a,l
140   sub c
141   and 1
142   add a,h
143   ld d,4
144   jr z,GotFour
145   xor 3
146   ld d,a
147 GotFour:
148
149   call CheckPixel
150   inc b
151   call CheckPixel
152   inc c
153   call CheckPixel
154   dec b
155   call CheckPixel
156   dec c
157   rl d
158   jr nc,WormNotCrashed
159   ld hl,0
160 PeaX =$-2
161 PeaY =$-1
162   ld a,b
163   sub h
164   inc a
165   cp 4
166   jr nc,WormDead
167   ld a,c
168   sub l
169   inc a
170   cp 4
171   jr nc,WormDead
172   push bc
173   call DrawPea
174   ld a,0
175 GrowAmt =$-1
176   add a,15
177   ld (GrowAmt),a
178   call NewPea
179   ld a,70
180   ld (_penCol),a
181   ld hl,Eaten
182   inc (hl)
183   ld a,(hl)
184   call PutNum
185   pop bc
186 WormNotCrashed:
187
188   push bc
189   call SetPixel
190   inc b
191   call SetPixel
192   inc c
193   call SetPixel
194   dec b
195   call SetPixel
196
197   ld hl,GrowAmt
198   dec (hl)
199   jr nz,GrowWorm
200   inc (hl)
201   ld hl,0A000h
202 TailPos =$-2
203   ld c,(hl)
204   inc hl
205   ld b,(hl)
206   inc hl
207   res 4,h
208   ld (TailPos),hl
209
210   call ResPixel
211   inc b
212   call ResPixel
213   inc c
214   call ResPixel
215   dec b
216   call ResPixel
217
218 GrowWorm:
219
220   ld a,0BFh
221   out (1),a
222   in a,(1)
223   rla
224   jr c,NotPaused
225   call _getky
226 WaitUnpause:
227   call _getky
228   or a
229   jr z,WaitUnpause
230   ld a,128
231 NotPaused:
232   pop bc
233   pop de
234   rla
235   jp c,GameLoop
236   push hl
237 WormDead:
238   pop de
239   ld a,(Eaten)
240   ld hl,HiScore
241   cp (hl)
242   jr c,NotNewHigh
243   ld (hl),a
244   ld hl,Varname-1
245   rst 20h
246   rst 10h
247   call 460Bh
248   ld de,HiScore-_asm_exec_ram+2
249   add hl,de
250   adc a,0
251   call _load_ram_ahl
252   ld a,(HiScore)
253   ld (hl),a
254 NotNewHigh:
255   call _clrScrn
256   call _homeup
257   jp _getky
258
259 NewPea:
260   call Random
261   ld a,h
262   and 7Fh
263   cp 7Bh
264   jr nc,NewPea
265   add a,2
266   ld h,a
267   ld a,l
268   and 3Fh
269   cp 30h
270   jr nc,NewPea
271   add a,12
272   ld l,a
273   ld (PeaX),hl
274   ld d,2
275   push hl
276   call CheckPea
277   pop hl
278   dec d
279   jr z,NewPea
280 DrawPea:
281   ld d,0
282 CheckPea:
283   ld b,h
284   ld c,l
285   call PeaPixel
286   inc c
287   call PeaPixel
288   inc b
289   call PeaPixel
290   dec c
291 PeaPixel:
292   push de
293   call FindPixel
294   pop de
295   ld e,a
296   ld a,d
297   or a
298   ld a,e
299   jr z,DrawPeaPixel
300   and (hl)
301   ret z
302   ld d,1
303   ret
304 DrawPeaPixel:
305   xor (hl)
306   ld (hl),a
307   ret
308
309 Random:
310   ld hl,0
311   ld de,12345
312 Seed =$-2
313   ld a,7921 & 255
314   ld bc,1000h+(7921/256)
315 domult16:
316         add hl,hl
317         rla
318   rl c
319         jr nc,noadd16
320         add hl,de
321 noadd16:
322         djnz domult16
323   inc hl
324   ld (Seed),hl ;seed=(seed*7921+1) MOD 65536
325   ld a,h
326   ret
327
328 ResPixel:
329   call FindPixel
330   cpl
331   and (hl)
332   ld (hl),a
333   ret
334
335 SetPixel:
336   call FindPixel
337   or (hl)
338   ld (hl),a
339   ret
340
341 CheckPixel:
342   push de
343   call FindPixel
344   and (hl)
345   pop de
346   ret z
347   dec d
348   ret
349
350 FindPixel:
351   push bc
352   ld a,b
353   and 7
354   add a,offsets_table & 255
355   ld e,a
356   ld d,offsets_table/256
357   ld h,0
358   ld a,c
359   add a,a
360   add a,a
361   rl h
362   add a,a
363   rl h
364   add a,a
365   rl h
366   srl b
367   srl b
368   srl b
369   or b
370   ld l,a
371   ld a,(de)
372   dec h
373   dec h
374   dec h
375   dec h
376   pop bc
377   ret
378
379 PutNum:
380   ld l,a
381   ld h,0
382   call UNPACK_HL
383   push af
384   ld a,l
385   call PutDigit
386   pop af
387 PutDigit:
388   add a,'0'
389   jp _vputmap
390
391 offsets_table:
392   .db 128,64,32,16,8,4,2,1
393
394 #include trigtab.asm
395
396 WormMsg .db "Peaworm!",0
397 PeasMsg .db "Eaten: 00",0
398 HiMsg   .db "Hiscore: ",0
399 HiScore .db 0
400 Varname .db 4,"worm"
401 Eaten =$
402
403 SinCosTable =09000h
404
405 .end