Mercurial > hg > Members > kono > nitros9-code
annotate 3rdparty/packages/pacos9/movpac90.as @ 2951:63fb45a6007b
coyota: Rename assembler files to .as
author | Tormod Volden <debian.tormod@gmail.com> |
---|---|
date | Sun, 09 Feb 2014 21:06:29 +0100 |
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 |