diff 3rdparty/packages/pacos9/scrns90.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/scrns90.a	Tue Jul 26 01:17:24 2005 +0000
@@ -0,0 +1,490 @@
+
+
+         NAM    SCRNS
+         TTL    Screen handling 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  SCRNS,0,0,2,STACK,DELPAC
+
+         VSECT
+
+*    Local variables
+
+         RMB    STACK
+
+         ENDSECT
+
+
+ERSCRN   fcb    2,32,33,$0B
+
+SETCOL   fcb    $1b,$32,10
+
+DELPAC:  lda    PLAYRS      Check for 1 or 2 players
+         bne    CHKTWO
+         lda    PACMAN      Get # of pacmen
+         deca               Subtract 1
+         sta    PACMAN      Save new player count
+         lbeq   GAMOVR      If 0 then END GAME
+         lbra   NEWSC1
+
+*    2 players, so check who's up
+
+CHKTWO   lda    PLCRNT      Get current player
+         cmpa   #1          Is it player #1 ?
+         bne    PLAY2
+*    Player 1 was up so kill one of his pacmen
+         lda    PACMN1      Get number of pacmen
+         deca               Subtract 1
+         sta    PACMN1      Save new total
+         bne    TFRTWO
+         lbsr   GAMOV2      Game over for player 1
+
+*    Transfer player2 variables
+TFRTWO   lda    PACMN2      Get player 2 pacmen total
+         sta    PACMAN      Put it in current pacman
+         lda    #2
+         sta    PLCRNT      Set current player to 2
+         leax   SCR2,pcr    Point arrow at player 2
+         bra    TFRSCR      Go transfer score & run NEWSCREEN
+
+PLAY2    lda    PACMN2      Get player 2 pacmen
+         deca               Subtract 1
+         sta    PACMN2      Save new pacmen count
+         lbeq   GAMOVR       Game over
+         lda    PACMN1      Get player 1 pacmen
+         sta    PACMAN      Put it in current pacman
+         lda    #1
+         sta    PLCRNT      Set current player to 1
+         leax   SCR1,pcr    Point arrow at player 1
+
+*    Transfer score variables
+
+TFRSCR   ldy    #18         Output 18 characters to screen
+         lbsr   OUTSTR      Go output arrow
+         leax   SCRPOS,U    Point to score string
+         leay   SCRPO2,U    Point to score save area
+         ldb    #12         Set count to 12 bytes
+         stb    DOTCNT      Save counter
+SRLOOP   lda    ,X
+         ldb    ,Y
+         sta    ,Y+
+         stb    ,X+
+         dec    DOTCNT
+         bne    SRLOOP      Loop till 12 bytes done
+
+         ldd    EXTPAC,U
+         pshs   d
+         ldd    EXTPC2,U
+         std    EXTPAC,U
+         puls   D
+         std    EXTPC2,U
+
+*    Transfer board variables
+
+         leax   DOTTOT,U
+         leay   DOTTMP,U
+         ldb    #6          Transfer 6 bytes
+         stb    DOTCNT      Save counter
+SBLOOP   lda    ,X
+         ldb    ,Y
+         sta    ,Y+
+         stb    ,X+
+         dec    DOTCNT
+         bne    SBLOOP
+
+******************************
+NEWSC1   leax   SELECT,pcr  *---- Remark out for testing
+         ldy    #2          *
+         lbsr   OUTST2      *
+******************************
+
+         ldx    #75
+         lbsr   WAIT
+         lda    PLAYRS      Check for 1 or 2 players
+         beq    ONEPLR
+         lbsr   BELL
+         leax   GETRD1,pcr
+         lda    PLCRNT      Get current player
+         cmpa   #1
+         beq    PUTPLR
+         leax   GETRD2,pcr
+PUTPLR   ldy    #29         Output 29 bytes 
+         lbsr   POPUP
+         bra    NEWSC2
+
+         ldx    #75
+         lbsr   WAIT
+
+         lbsr   BELL
+
+ONEPLR   leax   GETRDY,pcr
+         ldy    #12
+         lbsr   POPUP       Do popup and output GETRDY
+
+NEWSC2   bsr    NEWSCN      Erase ghosts & pacman
+         lda    PLAYRS      Check for 1 or 2 players
+         beq    SKIPTR
+
+         lbsr   TRANSF      Transfer table to array
+
+SKIPTR   nop
+         ldx    #50
+         lbsr   WAIT
+
+         lbsr   BELL
+
+         leax   SELECT,pcr
+         ldy    #2
+         lbsr   OUTSTR
+
+         leax   POPEND,pcr
+         ldy    #15
+         lbsr   OUTST2
+
+         lbra   MAIN
+
+*   New screen routines
+
+NEWSCN:  ldd    PXNEW       First erase pacman
+         std    PXLOC
+         ldd    PYNEW
+         std    PYLOC
+         lda    #37         Blank round pacman
+         sta    PBFN
+         lbsr   PUTBLK
+*   Now erase ghosts
+         lda    #1
+         sta    PGBFN
+         lda    #80
+         sta    GCOUNT
+GHRSET   lda    GCOUNT
+         suba   #20
+         bmi    GHRST2
+         sta    GCOUNT
+         leax   G1OFST,U
+         leax   A,X
+         ldd    2,X
+         std    PGXLOC
+         ldd    4,X
+         std    PGYLOC
+         lbsr   PUTGHT
+         bra    GHRSET
+GHRST2   lbsr   GHDATA
+*    Reset palette registers
+         leax   PALST1,pcr
+         ldy    #16
+         lbsr   OUTSTR
+
+*    Clear and setup array
+*    Only clear array and dot total at start of game
+
+         ldd    DOTTOT      Check dot total
+         cmpd   SCNTOT      Cleared screen ?
+         beq    NEWBRD
+
+         lda    PLAYRS      Check for 2 player mode
+         beq    PTDOTS
+
+         lda    BRDNUM
+         cmpa   BRDTMP      Are players on same board?
+         beq    SETVR2
+
+         leax   ERSCRN,pcr  Erase scrn, leave score
+         ldy    #4          Output 4 bytes
+         lbsr   OUTSTR
+         lbsr   BOARDB      Go draw players board
+         leax   SETCOL,pcr  Reset foreground color
+         ldy    #3          Output 3 bytes
+         lbsr   OUTSTR
+         bra    SETVR2
+
+NEWBRD:  dec    SCNFLG
+         bne    NEWBR2
+         lda    #2
+         sta    SCNFLG      Reset screen flag to 2
+         lda    BRDNUM      Get board number
+         inca
+         cmpa   #9          Only 8 boards
+         bne    GETBRD
+         lda    #1          Reset board to #1
+GETBRD   sta    BRDNUM      Save new board number
+         leax   ERSCRN,pcr  Erase scrn, leave score
+         ldy    #4          Output 4 bytes
+         lbsr   OUTSTR
+         lbsr   BOARDB      Go draw new board
+         leax   SETCOL,pcr  Reset forgroung color
+         ldy    #3
+         lbsr   OUTSTR
+NEWBR2   lbsr   CLRARR      Clear array, fill with dots
+         ldd    #0
+         std    DOTTOT      Reset dot total
+
+*    Redraw DOTS and PILLS that may have been
+*     partially erased by ghosts or pacman
+
+PTDOTS   lbsr   PDOTS
+
+RSTBON   lbsr   RESBON      Go reset bonus
+
+*    Reset pacman variables
+SETVR2   ldd    #308  
+         std    PXNEW
+         std    PCXLOC
+         std    PXLOC,U
+         ldd    #94
+         std    PYNEW
+         std    PCYLOC
+         std    PYLOC,U
+         lda    #28
+         sta    BUFF
+         sta    PBFN,U
+         lbsr   PUTBLK      Put starting pacman
+         ldd    #1966
+         std    POFSET
+         lda    #3
+         sta    CYCLE
+         lda    #80
+         sta    GCOUNT
+         clr    HITFLG
+         clr    POWFLG
+
+RETURN   rts                Return to  main loop
+
+*   Transfer player table to array & array to table
+*   Used to save one players screen when switching
+*   to second player.
+
+
+TRANSF   leay   TABLE1,U    Point to player 1 table
+         lda    PLCRNT,U
+         cmpa   #2          Is new player #2 ?
+         beq    TRFPUT
+         leay   TABLE2,U    Point to player 2 table
+TRFPUT   leax   ARRAY,U     Point to start of array
+         leax   70,X        Move to first dot location
+         clr    DOTCNT
+TRLOOP   inc    DOTCNT      Bump dot counter
+         lda    ,X          Get a byte from array
+         ldb    ,Y          Get a byte from table
+         sta    ,Y+         Put array byte in table
+         stb    ,X++        Put byte in array,bump pointer
+         lda    DOTCNT      Get dot counter
+         cmpa   #34         Done 34 yet?
+         bne    TRLOOP
+         cmpx   #ARREND-69  Are we done?
+         bge    TRCLR
+         leax   139,X       Move down 2 lines in array
+         clr    DOTCNT
+         bra    TRLOOP
+
+TRCLR    lbsr   CLRARR      Go clear and setup array
+
+         leay   TABLE1,U    Point to player 1 table
+         lda    PLCRNT,U
+         cmpa   #1          Is new player #1 ?
+         beq    TFRPT2
+         leay   TABLE2,U    Point to player 2 table
+TFRPT2   leax   ARRAY,U     Point to start of array
+         leax   70,X
+         clr    DOTCNT
+TRLOP2   inc    DOTCNT
+         lda    ,X
+         ldb    ,Y
+         sta    ,Y+
+         stb    ,X++
+         lda    DOTCNT
+         cmpa   #34
+         bne    TRLOP2
+         cmpx   #ARREND-69
+         bge    TRDONE
+         leax   139,X
+         clr    DOTCNT
+         bra    TRLOP2
+
+TRDONE   lbsr   PDOTS       Go put dots on screen
+
+*    Transfer players bonus variables (2 player mode only)
+*     Erase last players bonus items from screen
+
+TRFBON   lda    #69         Blank Bonus
+         sta    PBFN,U
+         ldd    BONUSX      Get scrn x value
+         std    PXLOC,U
+         ldd    BONUSY      Get scrn Y value
+         std    PYLOC,U
+         lda    BONCNT      Get count of items
+         inca
+         sta    BONTMP
+TBLOOP   dec    BONTMP
+         beq    TRBON2      Leave routine if 0
+         lbsr   PUTBLK      Go erase item
+         ldd    PXLOC,U
+         subd   #28
+         std    PXLOC,U
+         bra    TBLOOP
+
+*    Now transfer bonus variables
+
+TRBON2   lda    #15         Transfer 15 bytes
+         sta    BONTMP
+         leax   BONUSX,U    Point to first block
+         leay   BTEMP,U     Point to second block
+TLOOP2   lda    ,X
+         ldb    ,Y
+         sta    ,Y+
+         stb    ,X+
+         dec    BONTMP
+         bne    TLOOP2
+
+*    Now put new players bonus items on screen
+
+PBONUS   ldd    #8
+         std    PXLOC,U
+         ldd    #181
+         std    PYLOC,U
+         leax   BONTAB,U    Point to table
+         stx    BONTMP      Save table pointer
+         lda    BONCNT
+         beq    PBDONE
+PBLOOP   pshs   A           Save count
+         ldd    PXLOC,U
+         addd   #28
+         std    PXLOC,U
+         ldx    BONTMP      Get pointer
+         ldb    ,X+         Get next table item
+         stb    PBFN,U
+         stx    BONTMP      Save pointer
+         lbsr   PUTBLK      Go put item on screen
+         puls   A
+         deca               Decrement counter
+         bne    PBLOOP
+
+*  Pacman may have to be put back on screen here
+
+PBDONE   rts
+
+*   Reset bonus variables
+
+RESBON:  lda    BONFLG      Check flag
+         beq    RESBN2      If 0, bonus not on screen
+         ldd    #310
+         std    PXLOC
+         ldd    #95
+         std    PYLOC
+         lda    #69
+         sta    PBFN
+         lbsr   PUTBLK      Erase bonus from screen
+         leax   ARRAY,U
+         ldd    #1966
+         leax   D,X
+         clr    ,X          Erase bonus from array
+         clr    BONFLG
+RESBN2   lda    #69
+         sta    BONBUF      Reset bonus buffer #
+         lda    #250
+         sta    BONTIM      Reset bonus timer
+         rts
+
+*    Bonus was eaten by pacman, so erase it
+*    and put it at bottom of screen
+
+SETBON:  ldd    #310        X scrn location of bonus
+         std    PXLOC,U
+         ldd    #95         Y scrn location of bonus
+         std    PYLOC,U
+         lda    #69         Number for blank bonus
+         sta    PBFN,U
+         lbsr   PUTBLK      Go erase bonus
+*    Restore pacman (if erased)
+         leax   PUTPACM,U
+         ldy    #8
+         lda    PATH
+         OS9    I$Write
+         lbcs   ERR1
+*    Make noise
+
+         ldx    #$3f01
+         ldy    #3850
+         lbsr   SND
+         ldx    #$3401
+         ldy    #4000
+         lbsr   SND
+
+         leax   BONTAB,U    Point to item table
+         lda    BONCNT
+         leax   A,X         Move to next table location
+         ldb    BONBUF      Get buffer number
+         stb    ,X          Put it in table
+
+         ldd    BONUSX
+         addd   #28         Move to next location
+         std    BONUSX      Save new location
+         std    PXLOC,U
+         ldd    BONUSY
+         std    PYLOC,U
+         lda    BONBUF      Get Bonus buffer number
+         sta    PBFN,U
+         lbsr   PUTBLK      Put bonus at bottom of scrn
+         inc    BONCNT      Bump bonus counter
+         rts
+
+*    When screen has been cleared, give an additional
+*    100 points for each bonus at bottom of screen.
+*    Erase bonus item at bottom as it is added up.
+
+CNTBON:  lda    BONCNT      Check for 0 bonus's
+         beq    CTRTS       If zero, then return
+         ldd    BONUSY
+         std    PYLOC,U
+         lda    #69         Blank Bonus
+         sta    PBFN,U
+         ldd    BONUSX
+         std    PXLOC,U
+CTLOOP   lbsr   PUTBLK      Go erase bonus item
+
+*     Make noise
+
+         ldx    #$3f02
+         ldy    #4000
+         lbsr   SND
+         ldx    #$3f03
+         ldy    #3800
+         lbsr   SND
+         ldx    #$3f02
+         ldy    #4000
+         lbsr   SND
+
+*     Bump score
+
+         lda    #1          Add 100 points to score
+         sta    POINTS+1
+         clr    POINTS+2
+         lbsr   ADDUP
+         dec    BONCNT      Decrement bonus counter
+         beq    CTDONE
+         ldd    PXLOC,U
+         subd   #28         Move to next item
+         std    PXLOC,U
+         bra    CTLOOP
+
+CTDONE   clr    POINTS+1
+         ldd    #8
+         std    BONUSX
+
+CTRTS    rts
+
+
+
+         ENDSECT
+
+
+