Mercurial > hg > Members > kono > nitros9-code
annotate 3rdparty/packages/pacos9/scrns90.as @ 3295:6b7a7b233925 default tip
makefile: Allow PORTS with level1/2 mix
https://sourceforge.net/p/nitros9/feature-requests/10/
author | Tormod Volden <debian.tormod@gmail.com> |
---|---|
date | Tue, 19 Apr 2022 18:12:17 +0200 |
parents | 06508da42c98 |
children |
rev | line source |
---|---|
1864 | 1 |
2 | |
3 NAM SCRNS | |
4 TTL Screen handling routines | |
5 | |
6 * Program segment to be compiled using Level II RMA | |
7 * This is not a mainline program segment | |
8 * Written by Larry Olson | |
9 | |
10 IFP1 | |
11 * use /dd/defs/os9defs.a | |
12 ENDc | |
13 | |
14 STACK EQU 100 | |
15 | |
2946
06508da42c98
pacos: Add code and bss sections, lwlink style
Tormod Volden <debian.tormod@gmail.com>
parents:
2945
diff
changeset
|
16 SECTION bss |
1864 | 17 |
18 * Local variables | |
19 | |
20 RMB STACK | |
21 | |
22 ENDSECT | |
23 | |
2946
06508da42c98
pacos: Add code and bss sections, lwlink style
Tormod Volden <debian.tormod@gmail.com>
parents:
2945
diff
changeset
|
24 SECTION code |
1864 | 25 |
26 ERSCRN fcb 2,32,33,$0B | |
27 | |
28 SETCOL fcb $1b,$32,10 | |
29 | |
30 DELPAC: lda PLAYRS Check for 1 or 2 players | |
31 bne CHKTWO | |
32 lda PACMAN Get # of pacmen | |
33 deca Subtract 1 | |
34 sta PACMAN Save new player count | |
35 lbeq GAMOVR If 0 then END GAME | |
36 lbra NEWSC1 | |
37 | |
38 * 2 players, so check who's up | |
39 | |
40 CHKTWO lda PLCRNT Get current player | |
41 cmpa #1 Is it player #1 ? | |
42 bne PLAY2 | |
43 * Player 1 was up so kill one of his pacmen | |
44 lda PACMN1 Get number of pacmen | |
45 deca Subtract 1 | |
46 sta PACMN1 Save new total | |
47 bne TFRTWO | |
48 lbsr GAMOV2 Game over for player 1 | |
49 | |
50 * Transfer player2 variables | |
51 TFRTWO lda PACMN2 Get player 2 pacmen total | |
52 sta PACMAN Put it in current pacman | |
53 lda #2 | |
54 sta PLCRNT Set current player to 2 | |
55 leax SCR2,pcr Point arrow at player 2 | |
56 bra TFRSCR Go transfer score & run NEWSCREEN | |
57 | |
58 PLAY2 lda PACMN2 Get player 2 pacmen | |
59 deca Subtract 1 | |
60 sta PACMN2 Save new pacmen count | |
61 lbeq GAMOVR Game over | |
62 lda PACMN1 Get player 1 pacmen | |
63 sta PACMAN Put it in current pacman | |
64 lda #1 | |
65 sta PLCRNT Set current player to 1 | |
66 leax SCR1,pcr Point arrow at player 1 | |
67 | |
68 * Transfer score variables | |
69 | |
70 TFRSCR ldy #18 Output 18 characters to screen | |
71 lbsr OUTSTR Go output arrow | |
72 leax SCRPOS,U Point to score string | |
73 leay SCRPO2,U Point to score save area | |
74 ldb #12 Set count to 12 bytes | |
75 stb DOTCNT Save counter | |
76 SRLOOP lda ,X | |
77 ldb ,Y | |
78 sta ,Y+ | |
79 stb ,X+ | |
80 dec DOTCNT | |
81 bne SRLOOP Loop till 12 bytes done | |
82 | |
83 ldd EXTPAC,U | |
84 pshs d | |
85 ldd EXTPC2,U | |
86 std EXTPAC,U | |
87 puls D | |
88 std EXTPC2,U | |
89 | |
90 * Transfer board variables | |
91 | |
92 leax DOTTOT,U | |
93 leay DOTTMP,U | |
94 ldb #6 Transfer 6 bytes | |
95 stb DOTCNT Save counter | |
96 SBLOOP lda ,X | |
97 ldb ,Y | |
98 sta ,Y+ | |
99 stb ,X+ | |
100 dec DOTCNT | |
101 bne SBLOOP | |
102 | |
103 ****************************** | |
104 NEWSC1 leax SELECT,pcr *---- Remark out for testing | |
105 ldy #2 * | |
106 lbsr OUTST2 * | |
107 ****************************** | |
108 | |
109 ldx #75 | |
110 lbsr WAIT | |
111 lda PLAYRS Check for 1 or 2 players | |
112 beq ONEPLR | |
113 lbsr BELL | |
114 leax GETRD1,pcr | |
115 lda PLCRNT Get current player | |
116 cmpa #1 | |
117 beq PUTPLR | |
118 leax GETRD2,pcr | |
119 PUTPLR ldy #29 Output 29 bytes | |
120 lbsr POPUP | |
121 bra NEWSC2 | |
122 | |
123 ldx #75 | |
124 lbsr WAIT | |
125 | |
126 lbsr BELL | |
127 | |
128 ONEPLR leax GETRDY,pcr | |
129 ldy #12 | |
130 lbsr POPUP Do popup and output GETRDY | |
131 | |
132 NEWSC2 bsr NEWSCN Erase ghosts & pacman | |
133 lda PLAYRS Check for 1 or 2 players | |
134 beq SKIPTR | |
135 | |
136 lbsr TRANSF Transfer table to array | |
137 | |
138 SKIPTR nop | |
139 ldx #50 | |
140 lbsr WAIT | |
141 | |
142 lbsr BELL | |
143 | |
144 leax SELECT,pcr | |
145 ldy #2 | |
146 lbsr OUTSTR | |
147 | |
148 leax POPEND,pcr | |
149 ldy #15 | |
150 lbsr OUTST2 | |
151 | |
152 lbra MAIN | |
153 | |
154 * New screen routines | |
155 | |
156 NEWSCN: ldd PXNEW First erase pacman | |
157 std PXLOC | |
158 ldd PYNEW | |
159 std PYLOC | |
160 lda #37 Blank round pacman | |
161 sta PBFN | |
162 lbsr PUTBLK | |
163 * Now erase ghosts | |
164 lda #1 | |
165 sta PGBFN | |
166 lda #80 | |
167 sta GCOUNT | |
168 GHRSET lda GCOUNT | |
169 suba #20 | |
170 bmi GHRST2 | |
171 sta GCOUNT | |
172 leax G1OFST,U | |
173 leax A,X | |
174 ldd 2,X | |
175 std PGXLOC | |
176 ldd 4,X | |
177 std PGYLOC | |
178 lbsr PUTGHT | |
179 bra GHRSET | |
180 GHRST2 lbsr GHDATA | |
181 * Reset palette registers | |
182 leax PALST1,pcr | |
183 ldy #16 | |
184 lbsr OUTSTR | |
185 | |
186 * Clear and setup array | |
187 * Only clear array and dot total at start of game | |
188 | |
189 ldd DOTTOT Check dot total | |
190 cmpd SCNTOT Cleared screen ? | |
191 beq NEWBRD | |
192 | |
193 lda PLAYRS Check for 2 player mode | |
194 beq PTDOTS | |
195 | |
196 lda BRDNUM | |
197 cmpa BRDTMP Are players on same board? | |
198 beq SETVR2 | |
199 | |
200 leax ERSCRN,pcr Erase scrn, leave score | |
201 ldy #4 Output 4 bytes | |
202 lbsr OUTSTR | |
203 lbsr BOARDB Go draw players board | |
204 leax SETCOL,pcr Reset foreground color | |
205 ldy #3 Output 3 bytes | |
206 lbsr OUTSTR | |
207 bra SETVR2 | |
208 | |
209 NEWBRD: dec SCNFLG | |
210 bne NEWBR2 | |
211 lda #2 | |
212 sta SCNFLG Reset screen flag to 2 | |
213 lda BRDNUM Get board number | |
214 inca | |
215 cmpa #9 Only 8 boards | |
216 bne GETBRD | |
217 lda #1 Reset board to #1 | |
218 GETBRD sta BRDNUM Save new board number | |
219 leax ERSCRN,pcr Erase scrn, leave score | |
220 ldy #4 Output 4 bytes | |
221 lbsr OUTSTR | |
222 lbsr BOARDB Go draw new board | |
223 leax SETCOL,pcr Reset forgroung color | |
224 ldy #3 | |
225 lbsr OUTSTR | |
226 NEWBR2 lbsr CLRARR Clear array, fill with dots | |
227 ldd #0 | |
228 std DOTTOT Reset dot total | |
229 | |
230 * Redraw DOTS and PILLS that may have been | |
231 * partially erased by ghosts or pacman | |
232 | |
233 PTDOTS lbsr PDOTS | |
234 | |
235 RSTBON lbsr RESBON Go reset bonus | |
236 | |
237 * Reset pacman variables | |
238 SETVR2 ldd #308 | |
239 std PXNEW | |
240 std PCXLOC | |
241 std PXLOC,U | |
242 ldd #94 | |
243 std PYNEW | |
244 std PCYLOC | |
245 std PYLOC,U | |
246 lda #28 | |
247 sta BUFF | |
248 sta PBFN,U | |
249 lbsr PUTBLK Put starting pacman | |
250 ldd #1966 | |
251 std POFSET | |
252 lda #3 | |
253 sta CYCLE | |
254 lda #80 | |
255 sta GCOUNT | |
256 clr HITFLG | |
257 clr POWFLG | |
258 | |
259 RETURN rts Return to main loop | |
260 | |
261 * Transfer player table to array & array to table | |
262 * Used to save one players screen when switching | |
263 * to second player. | |
264 | |
265 | |
266 TRANSF leay TABLE1,U Point to player 1 table | |
267 lda PLCRNT,U | |
268 cmpa #2 Is new player #2 ? | |
269 beq TRFPUT | |
270 leay TABLE2,U Point to player 2 table | |
271 TRFPUT leax ARRAY,U Point to start of array | |
272 leax 70,X Move to first dot location | |
273 clr DOTCNT | |
274 TRLOOP inc DOTCNT Bump dot counter | |
275 lda ,X Get a byte from array | |
276 ldb ,Y Get a byte from table | |
277 sta ,Y+ Put array byte in table | |
278 stb ,X++ Put byte in array,bump pointer | |
279 lda DOTCNT Get dot counter | |
280 cmpa #34 Done 34 yet? | |
281 bne TRLOOP | |
282 cmpx #ARREND-69 Are we done? | |
283 bge TRCLR | |
284 leax 139,X Move down 2 lines in array | |
285 clr DOTCNT | |
286 bra TRLOOP | |
287 | |
288 TRCLR lbsr CLRARR Go clear and setup array | |
289 | |
290 leay TABLE1,U Point to player 1 table | |
291 lda PLCRNT,U | |
292 cmpa #1 Is new player #1 ? | |
293 beq TFRPT2 | |
294 leay TABLE2,U Point to player 2 table | |
295 TFRPT2 leax ARRAY,U Point to start of array | |
296 leax 70,X | |
297 clr DOTCNT | |
298 TRLOP2 inc DOTCNT | |
299 lda ,X | |
300 ldb ,Y | |
301 sta ,Y+ | |
302 stb ,X++ | |
303 lda DOTCNT | |
304 cmpa #34 | |
305 bne TRLOP2 | |
306 cmpx #ARREND-69 | |
307 bge TRDONE | |
308 leax 139,X | |
309 clr DOTCNT | |
310 bra TRLOP2 | |
311 | |
312 TRDONE lbsr PDOTS Go put dots on screen | |
313 | |
314 * Transfer players bonus variables (2 player mode only) | |
315 * Erase last players bonus items from screen | |
316 | |
317 TRFBON lda #69 Blank Bonus | |
318 sta PBFN,U | |
319 ldd BONUSX Get scrn x value | |
320 std PXLOC,U | |
321 ldd BONUSY Get scrn Y value | |
322 std PYLOC,U | |
323 lda BONCNT Get count of items | |
324 inca | |
325 sta BONTMP | |
326 TBLOOP dec BONTMP | |
327 beq TRBON2 Leave routine if 0 | |
328 lbsr PUTBLK Go erase item | |
329 ldd PXLOC,U | |
330 subd #28 | |
331 std PXLOC,U | |
332 bra TBLOOP | |
333 | |
334 * Now transfer bonus variables | |
335 | |
336 TRBON2 lda #15 Transfer 15 bytes | |
337 sta BONTMP | |
338 leax BONUSX,U Point to first block | |
339 leay BTEMP,U Point to second block | |
340 TLOOP2 lda ,X | |
341 ldb ,Y | |
342 sta ,Y+ | |
343 stb ,X+ | |
344 dec BONTMP | |
345 bne TLOOP2 | |
346 | |
347 * Now put new players bonus items on screen | |
348 | |
349 PBONUS ldd #8 | |
350 std PXLOC,U | |
351 ldd #181 | |
352 std PYLOC,U | |
353 leax BONTAB,U Point to table | |
354 stx BONTMP Save table pointer | |
355 lda BONCNT | |
356 beq PBDONE | |
357 PBLOOP pshs A Save count | |
358 ldd PXLOC,U | |
359 addd #28 | |
360 std PXLOC,U | |
361 ldx BONTMP Get pointer | |
362 ldb ,X+ Get next table item | |
363 stb PBFN,U | |
364 stx BONTMP Save pointer | |
365 lbsr PUTBLK Go put item on screen | |
366 puls A | |
367 deca Decrement counter | |
368 bne PBLOOP | |
369 | |
370 * Pacman may have to be put back on screen here | |
371 | |
372 PBDONE rts | |
373 | |
374 * Reset bonus variables | |
375 | |
376 RESBON: lda BONFLG Check flag | |
377 beq RESBN2 If 0, bonus not on screen | |
378 ldd #310 | |
379 std PXLOC | |
380 ldd #95 | |
381 std PYLOC | |
382 lda #69 | |
383 sta PBFN | |
384 lbsr PUTBLK Erase bonus from screen | |
385 leax ARRAY,U | |
386 ldd #1966 | |
387 leax D,X | |
388 clr ,X Erase bonus from array | |
389 clr BONFLG | |
390 RESBN2 lda #69 | |
391 sta BONBUF Reset bonus buffer # | |
392 lda #250 | |
393 sta BONTIM Reset bonus timer | |
394 rts | |
395 | |
396 * Bonus was eaten by pacman, so erase it | |
397 * and put it at bottom of screen | |
398 | |
399 SETBON: ldd #310 X scrn location of bonus | |
400 std PXLOC,U | |
401 ldd #95 Y scrn location of bonus | |
402 std PYLOC,U | |
403 lda #69 Number for blank bonus | |
404 sta PBFN,U | |
405 lbsr PUTBLK Go erase bonus | |
406 * Restore pacman (if erased) | |
407 leax PUTPACM,U | |
408 ldy #8 | |
409 lda PATH | |
410 OS9 I$Write | |
411 lbcs ERR1 | |
412 * Make noise | |
413 | |
414 ldx #$3f01 | |
415 ldy #3850 | |
416 lbsr SND | |
417 ldx #$3401 | |
418 ldy #4000 | |
419 lbsr SND | |
420 | |
421 leax BONTAB,U Point to item table | |
422 lda BONCNT | |
423 leax A,X Move to next table location | |
424 ldb BONBUF Get buffer number | |
425 stb ,X Put it in table | |
426 | |
427 ldd BONUSX | |
428 addd #28 Move to next location | |
429 std BONUSX Save new location | |
430 std PXLOC,U | |
431 ldd BONUSY | |
432 std PYLOC,U | |
433 lda BONBUF Get Bonus buffer number | |
434 sta PBFN,U | |
435 lbsr PUTBLK Put bonus at bottom of scrn | |
436 inc BONCNT Bump bonus counter | |
437 rts | |
438 | |
439 * When screen has been cleared, give an additional | |
440 * 100 points for each bonus at bottom of screen. | |
441 * Erase bonus item at bottom as it is added up. | |
442 | |
443 CNTBON: lda BONCNT Check for 0 bonus's | |
444 beq CTRTS If zero, then return | |
445 ldd BONUSY | |
446 std PYLOC,U | |
447 lda #69 Blank Bonus | |
448 sta PBFN,U | |
449 ldd BONUSX | |
450 std PXLOC,U | |
451 CTLOOP lbsr PUTBLK Go erase bonus item | |
452 | |
453 * Make noise | |
454 | |
455 ldx #$3f02 | |
456 ldy #4000 | |
457 lbsr SND | |
458 ldx #$3f03 | |
459 ldy #3800 | |
460 lbsr SND | |
461 ldx #$3f02 | |
462 ldy #4000 | |
463 lbsr SND | |
464 | |
465 * Bump score | |
466 | |
467 lda #1 Add 100 points to score | |
468 sta POINTS+1 | |
469 clr POINTS+2 | |
470 lbsr ADDUP | |
471 dec BONCNT Decrement bonus counter | |
472 beq CTDONE | |
473 ldd PXLOC,U | |
474 subd #28 Move to next item | |
475 std PXLOC,U | |
476 bra CTLOOP | |
477 | |
478 CTDONE clr POINTS+1 | |
479 ldd #8 | |
480 std BONUSX | |
481 | |
482 CTRTS rts | |
483 | |
484 | |
485 | |
486 ENDSECT | |
487 | |
488 | |
489 |