Mercurial > hg > Members > kono > nitros9-code
annotate 3rdparty/packages/pacos9/movpac90.as @ 3220:9ccec98c9897
Updated IDE Driver makefile so it will have place holders for
dsk, dskclean, and dskcopy so that make does not error out when
chaining into the driver tree to build disk images where applicable.
author | David Ladd <drencor-xeen@users.sourceforge.net> |
---|---|
date | Wed, 20 Dec 2017 16:10:50 -0600 |
parents | 06508da42c98 |
children |
rev | line source |
---|---|
1864 | 1 |
2 NAM MOVPAC | |
3 TTL Move pacman routines | |
4 | |
5 * Program segment to be compiled using Level II RMA | |
6 * This is not a mainline program segment | |
7 * Written by Larry Olson | |
8 | |
9 IFP1 | |
10 * use /dd/defs/os9defs.a | |
11 ENDc | |
12 | |
13 | |
14 STACK EQU 100 | |
15 | |
16 | |
2946
06508da42c98
pacos: Add code and bss sections, lwlink style
Tormod Volden <debian.tormod@gmail.com>
parents:
2945
diff
changeset
|
17 SECTION bss |
1864 | 18 |
19 * Local variables | |
20 | |
21 RMB STACK | |
22 | |
23 ENDSECT | |
24 | |
2946
06508da42c98
pacos: Add code and bss sections, lwlink style
Tormod Volden <debian.tormod@gmail.com>
parents:
2945
diff
changeset
|
25 SECTION code |
1864 | 26 |
27 MVPAC: nop | |
28 | |
29 * Read joystick | |
30 | |
31 JOY lda PATH Set path to window | |
32 ldb #$13 Setup for SS.Joy | |
33 ldx PORT,U Get selected port | |
34 os9 I$GetStt | |
35 lbcs ERR1 | |
36 stx JOYSTX | |
37 sty JOYSTY | |
38 sta BUTTON | |
39 * Cycle is used to animate pacman | |
40 | |
41 CYC dec CYCLE Decrement cycle counter | |
42 bpl MVRT If >0 continue | |
43 lda #2 Reset counter to 2 | |
44 sta CYCLE | |
45 | |
46 clra | |
47 sta MOVFLG,U | |
48 | |
49 * Check direction of joystick & move pacman | |
50 | |
51 MVRT leay ARRAY,U Point to start of array | |
52 ldd POFSET Get pacman offset in array | |
53 leax D,Y | |
54 * X reg now points to pacman position in array | |
55 ldd JOYSTX Get joystick X value | |
56 cmpd #37 Is it greater than 37 ? | |
57 blo MVLFT Go to move left | |
58 | |
59 inc MOVFLG,U | |
60 | |
61 lda 1,X Get adjacent byte from array | |
62 lbmi MVDWN If wall then go check for down | |
63 ldd PCXLOC GET pseudo screen X location | |
64 cmpd PXNEW Is it equal to actual location? | |
65 beq SKIPR | |
66 addd #8 | |
67 std PCXLOC | |
68 SKIPR ldd PXNEW Get actual screen X location | |
69 addd #8 Add 8 to it | |
70 std PXNEW Put it back | |
71 ldd PYNEW Get screen Y location | |
72 std PCYLOC Set pyold = pynew | |
73 ldd POFSET Get pacman array offset | |
74 addd #1 Increment it | |
75 cmpd #1793 Is it off screen to the right ? | |
76 bne STBUF1 | |
77 * Erase pacman on right side of screen | |
78 * Before moving pacman to left side | |
79 lda #37 Set for blank pacman | |
80 sta PBFN Put it in putblk code | |
81 ldd #572 | |
82 std PXLOC | |
83 ldd #85 | |
84 std PYLOC | |
85 lbsr PUTBLK Go erase pacman | |
86 | |
87 ldd #44 | |
88 std PXNEW Reset pac screen X to 36 | |
89 subd #8 Set pseudo X location | |
90 std PCXLOC | |
91 lda #1 | |
92 ldd #1726 Move pacman to left side | |
93 STBUF1 std POFSET Store pacman array offset | |
94 leax D,Y Point to pacman position in array | |
95 lda #25 Set pacman direction buffer | |
96 sta BUFF for right facing pacman | |
97 ldb #1 | |
98 lda B,X Get the byte at this spot | |
99 bmi MVPAC1 Branch if wall | |
100 bita #6 Check for a dot or pill | |
101 beq MVPAC1 | |
102 lbsr ERPILL Go erase pill or dot | |
103 bra MVPAC1 | |
104 MVLFT ldd JOYSTX Get joystick X value | |
105 cmpd #27 | |
106 bhi MVDWN | |
107 inc MOVFLG,U | |
108 lda -1,X Get byte 1 move to the left | |
109 bmi MVDWN Branch if wall | |
110 ldd PXNEW Get new pac position | |
111 subd #8 Subtract 8 from it | |
112 std PXNEW Put it back | |
113 std PCXLOC Set pxold = pxnew | |
114 ldd PYNEW | |
115 std PCYLOC Set pyold = pynew | |
116 ldd POFSET Get pacman array offset | |
117 subd #1 Decrement it | |
118 cmpd #1725 Is it off left side of screen ? | |
119 bne STBUF2 If not then store hcount | |
120 * Erase pacman on left side of screen | |
121 * Before moving pacman to right side | |
122 lda #37 Set for blank pacman | |
123 sta PBFN Put it in PUTBLK code | |
124 ldd #44 | |
125 std PXLOC | |
126 ldd #85 | |
127 std PYLOC | |
128 lbsr PUTBLK Go erase pacman | |
129 | |
130 ldd #572 | |
131 std PXNEW Update screen location too. | |
132 std PCXLOC | |
133 ldd #1792 Move pacman to right side | |
134 STBUF2 std POFSET Store pacman array offset | |
135 leax D,Y X holds pacman position in array | |
136 lda #28 Set pacman direction buffer | |
137 sta BUFF for left facing pacman | |
138 ldb #-1 | |
139 lda B,X Get byte from array | |
140 bmi MVPAC1 Branch if wall | |
141 bita #6 Check for dot or pill | |
142 beq MVPAC1 | |
143 lbsr ERPILL Go erase pill or dot | |
144 MVPAC1 lda BUFF | |
145 adda CYCLE | |
146 sta PCBFN | |
147 leax PUTPACM,U | |
148 ldy #8 | |
149 lda PATH | |
150 os9 I$Write | |
151 lbcs ERR1 | |
152 | |
153 MVDWN leay ARRAY,U Point to start of array | |
154 ldd POFSET Get pacman array offset | |
155 leax D,Y X holds pacman array position | |
156 ldd JOYSTY Get joystick Y value | |
157 cmpd #27 Is it greater than 27 ? | |
158 bhi MVUP If not, then check for up move | |
159 inc MOVFLG,U | |
160 lda 69,X Look at byte one line down | |
161 lbmi LEAVE Branch if wall | |
162 ldd PCYLOC Get pseudo screen Y location | |
163 cmpd PYNEW Are they the same ? | |
164 beq SKIPD | |
165 addd #3 Add 3 to it | |
166 std PCYLOC | |
167 SKIPD ldd PYNEW Get actual screen Y location | |
168 addd #3 Add 3 to it | |
169 std PYNEW Put it back | |
170 ldd PXNEW | |
171 std PCXLOC | |
172 SKIPD2 ldd POFSET Get location in array | |
173 addd #69 Move down 1 line | |
174 cmpd #3692 Off screen at bottom? | |
175 bne STBUF3 | |
176 | |
177 lda #37 Blank pacman buffer | |
178 sta PBFN | |
179 ldd #316 | |
180 std PXLOC | |
181 ldd #166 | |
182 std PYLOC | |
183 lbsr PUTBLK Go erase pacman at bottom | |
184 | |
185 ldd #300 | |
186 std PXNEW | |
187 std PCXLOC | |
188 ldd #07 New Y scrn location | |
189 std PCYLOC | |
190 addd #3 | |
191 std PYNEW | |
192 ldd #33 Move to top of array | |
193 STBUF3 std POFSET | |
194 leax D,Y | |
195 lda #34 Set pacman direction buffer | |
196 sta BUFF for down facing pacman | |
197 ldb #69 Look one line down | |
198 lda B,X Get byte at this spot | |
199 bmi MVPAC2 Branch if wall | |
200 bita #6 Check for dot(2) or pill(4) | |
201 beq MVPAC2 Go move pacman | |
202 lbsr ERPILL Go erase pill or dot | |
203 bra MVPAC2 Go move pacman | |
204 | |
205 MVUP ldd JOYSTY Get joystick Y value | |
206 cmpd #37 Is it less than 37 ? | |
207 lblo LEAVE | |
208 inc MOVFLG,U | |
209 lda -69,X Get byte from array, 1 line up | |
210 bmi LEAVE Branch if wall | |
211 ldd PYNEW Get pac screen Y location | |
212 subd #3 Subtract 3 from it | |
213 std PYNEW Put it back | |
214 std PCYLOC Set pyold = pynew | |
215 ldd PXNEW | |
216 std PCXLOC Set pxold = pxnew | |
217 lda #31 Set direction buffer | |
218 sta BUFF to up facing pacman | |
219 ldd POFSET Get pacman array offset | |
220 subd #69 Move up one line | |
221 cmpd #33 At top of screen? | |
222 bne STBUF4 | |
223 | |
224 lda #37 Blank pacman buffer # | |
225 sta PBFN | |
226 ldd #300 | |
227 std PXLOC | |
228 ldd #13 | |
229 std PYLOC | |
230 lbsr PUTBLK Erase pacman at top | |
231 | |
232 ldd #316 | |
233 std PXNEW | |
234 std PCXLOC | |
235 ldd #169 | |
236 std PYNEW | |
237 std PCYLOC | |
238 ldd #3692 | |
239 STBUF4 std POFSET Put it back | |
240 leax D,Y X holds pacman array position | |
241 ldb #-69 | |
242 lda B,X Get byte at this spot | |
243 bmi MVPAC2 Branch if wall | |
244 bita #6 Check for dot(2) or pill(4) | |
245 beq MVPAC2 Go move pacman | |
246 lbsr ERPILL Go erase pill or dot | |
247 MVPAC2 lda BUFF Get current pac buffer | |
248 adda CYCLE Add cycle count | |
249 sta PCBFN Set putblk buffer | |
250 leax PUTPACM,U | |
251 ldy #8 | |
252 lda PATH | |
253 os9 I$Write | |
254 lbcs ERR1 | |
255 | |
256 LEAVE lda MOVFLG,U | |
257 bne EXTCHK | |
258 ldx #2 | |
259 lbsr WAIT | |
260 | |
261 EXTCHK ldb PACMAN Get # of pacmen left | |
262 cmpb #6 Only a total of 6 allowed | |
263 beq MVDONE If already 6, then exit | |
264 lda SCRBCD,U | |
265 anda #15 %00001111 strip high | |
266 cmpa EXTPAC,U Compare it with goal | |
267 blo MVDONE If not =, then exit | |
268 incb If =, then give bonus- | |
269 stb PACMAN pacman to player | |
270 inc EXTPAC,U Increment goal | |
271 ldd #181 | |
272 std PYLOC,U | |
273 lda #28 | |
274 sta PBFN,U | |
275 lda #30 | |
276 ldb PACMAN | |
277 subb #1 | |
278 mul | |
279 std PXLOC,U | |
280 ldd #600 | |
281 subd PXLOC,U | |
282 std PXLOC,U | |
283 lbsr PUTBLK | |
284 | |
285 MVDONE rts Return to MAIN | |
286 | |
287 PALCHG: clrb | |
288 stb STRLGH Save counter | |
289 leay STRING,U String to output | |
290 leax G1OFST,U Point to ghost tables | |
291 lda 10,X Get #1 ghost status | |
292 cmpa #1 | |
293 bne TEST2 | |
294 ldd #$1b31 Palette set code | |
295 std ,Y++ Put it in string | |
296 ldd #$043d | |
297 std ,Y++ Put it in string | |
298 inc STRLGH | |
299 lda #2 | |
300 sta 10,X Make ghost run from pacman | |
301 TEST2 lda 30,X Get #2 ghost status | |
302 cmpa #1 | |
303 bne TEST3 | |
304 ldd #$1b31 Palette set code | |
305 std ,Y++ Put it in string | |
306 ldd #$063d | |
307 std ,Y++ Put it in string | |
308 inc STRLGH | |
309 lda #2 | |
310 sta 30,X Make ghost run from pacman | |
311 TEST3 lda 50,X Get #3 ghost status | |
312 cmpa #1 | |
313 bne TEST4 | |
314 ldd #$1b31 Palette set code | |
315 std ,Y++ | |
316 ldd #$053d | |
317 std ,Y++ Put it in string | |
318 inc STRLGH | |
319 lda #2 | |
320 sta 50,X Make ghost run from pacman | |
321 TEST4 lda 70,X Get #4 ghost status | |
322 cmpa #1 | |
323 bne TESTCK | |
324 ldd #$1b31 Palette set code | |
325 std ,Y++ | |
326 ldd #$033d | |
327 std ,Y | |
328 inc STRLGH | |
329 lda #2 | |
330 sta 70,X Make ghost run from pacman | |
331 TESTCK ldb STRLGH | |
332 beq OTDONE | |
333 lda #4 | |
334 mul | |
335 tfr D,Y | |
336 leax STRING,U | |
337 lbsr OUTSTR | |
338 OTDONE rts | |
339 | |
340 * erase pill subroutine | |
341 * Erases DOT or PILL from array | |
342 * and updates score | |
343 * On entry, X reg points to spot in array | |
344 * B reg holds 1 byte offset 1,-1,96 or -96 | |
345 * A reg holds byte at that point in array | |
346 | |
347 ERPILL cmpa #6 Was it a bonus ? | |
348 beq ERBON | |
349 bita #4 Was it a power dot ? | |
350 beq ERDOT | |
351 anda #1 | |
352 sta B,X Erase power pill from array | |
353 lda #32 Add 20 to score | |
354 sta POINTS+2 | |
355 | |
356 ldd DOTTOT | |
357 addd #1 | |
358 std DOTTOT | |
359 | |
360 lda #100 Set timeout counter | |
361 sta POWFLG | |
362 lbsr PALCHG Go change color of ghosts | |
363 bra ADDUP | |
364 | |
365 ERBON clra | |
366 sta B,X | |
367 lbsr SETBON Go to Bonus Routines(in SCRNS) | |
368 lda #154 Add 100 to score | |
369 sta POINTS+2 | |
370 bra ADDUP | |
371 | |
372 ERDOT anda #1 | |
373 sta B,X Erase dot from array | |
374 lda #1 Add 1 point to score | |
375 sta POINTS+2 Put it back | |
376 | |
377 ldd DOTTOT | |
378 addd #1 | |
379 std DOTTOT | |
380 | |
381 * Add points to score | |
382 | |
383 ADDUP: leax SCRBCD+3,U | |
384 leay POINTS+3,U | |
385 ldb #3 Set loop counter to 3 | |
386 andcc #%11111110 Clear carry | |
387 ADLOOP lda ,-X Decrement X and get a byte | |
388 adca ,-Y Add new points | |
389 daa Decimal adjust bytes | |
390 sta ,X Put result back in score byte | |
391 decb Decrement loop counter | |
392 bne ADLOOP Loop till done | |
393 | |
394 SHIFT leay SCRASC,U Point to asc string | |
395 leax SCRBCD,U Point to score bytes | |
396 ldb #3 Set loop counter to 3 | |
397 stb SHCNT Set loop counter to 3 | |
398 clrb Clear leading zero flag | |
399 SFLOOP lda ,X Get a byte of score, bump pointer | |
400 lsra | |
401 lsra Shift high nibble to low | |
402 lsra | |
403 lsra | |
404 beq TSTFG1 | |
405 incb Set leading zero flag | |
406 TSTFG1 tstb Is leading zero flag set ? | |
407 bne ASCSET1 | |
408 lda #-16 48-16 = ascii space | |
409 ASCSET1 adda #48 Add ascii offset for number | |
410 sta ,Y+ Put result in score string | |
411 lda ,X+ Get bcd score byte again | |
412 anda #15 Mask off high nibble | |
413 beq TSTFG2 | |
414 incb | |
415 TSTFG2 tstb | |
416 bne ASCSET2 | |
417 lda #-16 | |
418 ASCSET2 adda #48 | |
419 sta ,Y+ | |
420 dec SHCNT | |
421 bne SFLOOP Loop 3 times | |
422 | |
423 JUST1 leax SCRPOS,U Point to score string | |
424 ldy #9 Output 9 characters | |
425 lbsr OUTSTR Go output string | |
426 | |
427 rts | |
428 | |
429 * Noise maker when pacman eats a dot | |
430 | |
431 | |
432 *WOCWOC lda PATH | |
433 * ldb #$98 | |
434 * ldx #$3202 | |
435 * ldy #3000 | |
436 * os9 I$SetStt | |
437 | |
438 * ldy #2000 | |
439 * os9 I$GetStt | |
440 | |
441 * Return to MAIN | |
442 | |
443 *SCDONE rts | |
444 | |
445 | |
446 ENDSECT | |
447 | |
448 | |
449 |