Mercurial > hg > Members > kono > nitros9-code
diff 3rdparty/packages/pacos9/movpac90.a @ 1864:f351932fa6cd
Added pacos9
author | boisy |
---|---|
date | Tue, 26 Jul 2005 01:17:24 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/3rdparty/packages/pacos9/movpac90.a Tue Jul 26 01:17:24 2005 +0000 @@ -0,0 +1,450 @@ + + NAM MOVPAC + TTL Move pacman routines + +* Program segment to be compiled using Level II RMA +* This is not a mainline program segment +* Written by Larry Olson + + IFP1 +* use /dd/defs/os9defs.a + ENDc + + +STACK EQU 100 + + + PSECT MOVPAC,0,0,2,STACK,MVPAC + + VSECT + +* Local variables + + RMB STACK + + ENDSECT + + +MVPAC: nop + +* Read joystick + +JOY lda PATH Set path to window + ldb #$13 Setup for SS.Joy + ldx PORT,U Get selected port + os9 I$GetStt + lbcs ERR1 + stx JOYSTX + sty JOYSTY + sta BUTTON +* Cycle is used to animate pacman + +CYC dec CYCLE Decrement cycle counter + bpl MVRT If >0 continue + lda #2 Reset counter to 2 + sta CYCLE + + clra + sta MOVFLG,U + +* Check direction of joystick & move pacman + +MVRT leay ARRAY,U Point to start of array + ldd POFSET Get pacman offset in array + leax D,Y +* X reg now points to pacman position in array + ldd JOYSTX Get joystick X value + cmpd #37 Is it greater than 37 ? + blo MVLFT Go to move left + + inc MOVFLG,U + + lda 1,X Get adjacent byte from array + lbmi MVDWN If wall then go check for down + ldd PCXLOC GET pseudo screen X location + cmpd PXNEW Is it equal to actual location? + beq SKIPR + addd #8 + std PCXLOC +SKIPR ldd PXNEW Get actual screen X location + addd #8 Add 8 to it + std PXNEW Put it back + ldd PYNEW Get screen Y location + std PCYLOC Set pyold = pynew + ldd POFSET Get pacman array offset + addd #1 Increment it + cmpd #1793 Is it off screen to the right ? + bne STBUF1 +* Erase pacman on right side of screen +* Before moving pacman to left side + lda #37 Set for blank pacman + sta PBFN Put it in putblk code + ldd #572 + std PXLOC + ldd #85 + std PYLOC + lbsr PUTBLK Go erase pacman + + ldd #44 + std PXNEW Reset pac screen X to 36 + subd #8 Set pseudo X location + std PCXLOC + lda #1 + ldd #1726 Move pacman to left side +STBUF1 std POFSET Store pacman array offset + leax D,Y Point to pacman position in array + lda #25 Set pacman direction buffer + sta BUFF for right facing pacman + ldb #1 + lda B,X Get the byte at this spot + bmi MVPAC1 Branch if wall + bita #6 Check for a dot or pill + beq MVPAC1 + lbsr ERPILL Go erase pill or dot + bra MVPAC1 +MVLFT ldd JOYSTX Get joystick X value + cmpd #27 + bhi MVDWN + inc MOVFLG,U + lda -1,X Get byte 1 move to the left + bmi MVDWN Branch if wall + ldd PXNEW Get new pac position + subd #8 Subtract 8 from it + std PXNEW Put it back + std PCXLOC Set pxold = pxnew + ldd PYNEW + std PCYLOC Set pyold = pynew + ldd POFSET Get pacman array offset + subd #1 Decrement it + cmpd #1725 Is it off left side of screen ? + bne STBUF2 If not then store hcount +* Erase pacman on left side of screen +* Before moving pacman to right side + lda #37 Set for blank pacman + sta PBFN Put it in PUTBLK code + ldd #44 + std PXLOC + ldd #85 + std PYLOC + lbsr PUTBLK Go erase pacman + + ldd #572 + std PXNEW Update screen location too. + std PCXLOC + ldd #1792 Move pacman to right side +STBUF2 std POFSET Store pacman array offset + leax D,Y X holds pacman position in array + lda #28 Set pacman direction buffer + sta BUFF for left facing pacman + ldb #-1 + lda B,X Get byte from array + bmi MVPAC1 Branch if wall + bita #6 Check for dot or pill + beq MVPAC1 + lbsr ERPILL Go erase pill or dot +MVPAC1 lda BUFF + adda CYCLE + sta PCBFN + leax PUTPACM,U + ldy #8 + lda PATH + os9 I$Write + lbcs ERR1 + +MVDWN leay ARRAY,U Point to start of array + ldd POFSET Get pacman array offset + leax D,Y X holds pacman array position + ldd JOYSTY Get joystick Y value + cmpd #27 Is it greater than 27 ? + bhi MVUP If not, then check for up move + inc MOVFLG,U + lda 69,X Look at byte one line down + lbmi LEAVE Branch if wall + ldd PCYLOC Get pseudo screen Y location + cmpd PYNEW Are they the same ? + beq SKIPD + addd #3 Add 3 to it + std PCYLOC +SKIPD ldd PYNEW Get actual screen Y location + addd #3 Add 3 to it + std PYNEW Put it back + ldd PXNEW + std PCXLOC +SKIPD2 ldd POFSET Get location in array + addd #69 Move down 1 line + cmpd #3692 Off screen at bottom? + bne STBUF3 + + lda #37 Blank pacman buffer + sta PBFN + ldd #316 + std PXLOC + ldd #166 + std PYLOC + lbsr PUTBLK Go erase pacman at bottom + + ldd #300 + std PXNEW + std PCXLOC + ldd #07 New Y scrn location + std PCYLOC + addd #3 + std PYNEW + ldd #33 Move to top of array +STBUF3 std POFSET + leax D,Y + lda #34 Set pacman direction buffer + sta BUFF for down facing pacman + ldb #69 Look one line down + lda B,X Get byte at this spot + bmi MVPAC2 Branch if wall + bita #6 Check for dot(2) or pill(4) + beq MVPAC2 Go move pacman + lbsr ERPILL Go erase pill or dot + bra MVPAC2 Go move pacman + +MVUP ldd JOYSTY Get joystick Y value + cmpd #37 Is it less than 37 ? + lblo LEAVE + inc MOVFLG,U + lda -69,X Get byte from array, 1 line up + bmi LEAVE Branch if wall + ldd PYNEW Get pac screen Y location + subd #3 Subtract 3 from it + std PYNEW Put it back + std PCYLOC Set pyold = pynew + ldd PXNEW + std PCXLOC Set pxold = pxnew + lda #31 Set direction buffer + sta BUFF to up facing pacman + ldd POFSET Get pacman array offset + subd #69 Move up one line + cmpd #33 At top of screen? + bne STBUF4 + + lda #37 Blank pacman buffer # + sta PBFN + ldd #300 + std PXLOC + ldd #13 + std PYLOC + lbsr PUTBLK Erase pacman at top + + ldd #316 + std PXNEW + std PCXLOC + ldd #169 + std PYNEW + std PCYLOC + ldd #3692 +STBUF4 std POFSET Put it back + leax D,Y X holds pacman array position + ldb #-69 + lda B,X Get byte at this spot + bmi MVPAC2 Branch if wall + bita #6 Check for dot(2) or pill(4) + beq MVPAC2 Go move pacman + lbsr ERPILL Go erase pill or dot +MVPAC2 lda BUFF Get current pac buffer + adda CYCLE Add cycle count + sta PCBFN Set putblk buffer + leax PUTPACM,U + ldy #8 + lda PATH + os9 I$Write + lbcs ERR1 + +LEAVE lda MOVFLG,U + bne EXTCHK + ldx #2 + lbsr WAIT + +EXTCHK ldb PACMAN Get # of pacmen left + cmpb #6 Only a total of 6 allowed + beq MVDONE If already 6, then exit + lda SCRBCD,U + anda #15 %00001111 strip high + cmpa EXTPAC,U Compare it with goal + blo MVDONE If not =, then exit + incb If =, then give bonus- + stb PACMAN pacman to player + inc EXTPAC,U Increment goal + ldd #181 + std PYLOC,U + lda #28 + sta PBFN,U + lda #30 + ldb PACMAN + subb #1 + mul + std PXLOC,U + ldd #600 + subd PXLOC,U + std PXLOC,U + lbsr PUTBLK + +MVDONE rts Return to MAIN + +PALCHG: clrb + stb STRLGH Save counter + leay STRING,U String to output + leax G1OFST,U Point to ghost tables + lda 10,X Get #1 ghost status + cmpa #1 + bne TEST2 + ldd #$1b31 Palette set code + std ,Y++ Put it in string + ldd #$043d + std ,Y++ Put it in string + inc STRLGH + lda #2 + sta 10,X Make ghost run from pacman +TEST2 lda 30,X Get #2 ghost status + cmpa #1 + bne TEST3 + ldd #$1b31 Palette set code + std ,Y++ Put it in string + ldd #$063d + std ,Y++ Put it in string + inc STRLGH + lda #2 + sta 30,X Make ghost run from pacman +TEST3 lda 50,X Get #3 ghost status + cmpa #1 + bne TEST4 + ldd #$1b31 Palette set code + std ,Y++ + ldd #$053d + std ,Y++ Put it in string + inc STRLGH + lda #2 + sta 50,X Make ghost run from pacman +TEST4 lda 70,X Get #4 ghost status + cmpa #1 + bne TESTCK + ldd #$1b31 Palette set code + std ,Y++ + ldd #$033d + std ,Y + inc STRLGH + lda #2 + sta 70,X Make ghost run from pacman +TESTCK ldb STRLGH + beq OTDONE + lda #4 + mul + tfr D,Y + leax STRING,U + lbsr OUTSTR +OTDONE rts + +* erase pill subroutine +* Erases DOT or PILL from array +* and updates score +* On entry, X reg points to spot in array +* B reg holds 1 byte offset 1,-1,96 or -96 +* A reg holds byte at that point in array + +ERPILL cmpa #6 Was it a bonus ? + beq ERBON + bita #4 Was it a power dot ? + beq ERDOT + anda #1 + sta B,X Erase power pill from array + lda #32 Add 20 to score + sta POINTS+2 + + ldd DOTTOT + addd #1 + std DOTTOT + + lda #100 Set timeout counter + sta POWFLG + lbsr PALCHG Go change color of ghosts + bra ADDUP + +ERBON clra + sta B,X + lbsr SETBON Go to Bonus Routines(in SCRNS) + lda #154 Add 100 to score + sta POINTS+2 + bra ADDUP + +ERDOT anda #1 + sta B,X Erase dot from array + lda #1 Add 1 point to score + sta POINTS+2 Put it back + + ldd DOTTOT + addd #1 + std DOTTOT + +* Add points to score + +ADDUP: leax SCRBCD+3,U + leay POINTS+3,U + ldb #3 Set loop counter to 3 + andcc #%11111110 Clear carry +ADLOOP lda ,-X Decrement X and get a byte + adca ,-Y Add new points + daa Decimal adjust bytes + sta ,X Put result back in score byte + decb Decrement loop counter + bne ADLOOP Loop till done + +SHIFT leay SCRASC,U Point to asc string + leax SCRBCD,U Point to score bytes + ldb #3 Set loop counter to 3 + stb SHCNT Set loop counter to 3 + clrb Clear leading zero flag +SFLOOP lda ,X Get a byte of score, bump pointer + lsra + lsra Shift high nibble to low + lsra + lsra + beq TSTFG1 + incb Set leading zero flag +TSTFG1 tstb Is leading zero flag set ? + bne ASCSET1 + lda #-16 48-16 = ascii space +ASCSET1 adda #48 Add ascii offset for number + sta ,Y+ Put result in score string + lda ,X+ Get bcd score byte again + anda #15 Mask off high nibble + beq TSTFG2 + incb +TSTFG2 tstb + bne ASCSET2 + lda #-16 +ASCSET2 adda #48 + sta ,Y+ + dec SHCNT + bne SFLOOP Loop 3 times + +JUST1 leax SCRPOS,U Point to score string + ldy #9 Output 9 characters + lbsr OUTSTR Go output string + + rts + +* Noise maker when pacman eats a dot + + +*WOCWOC lda PATH +* ldb #$98 +* ldx #$3202 +* ldy #3000 +* os9 I$SetStt + +* ldy #2000 +* os9 I$GetStt + +* Return to MAIN + +*SCDONE rts + + + ENDSECT + + +