view 3rdparty/packages/pacos9/score90.as @ 3215:195c09cade21

Updated MMC 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:07:36 -0600
parents 06508da42c98
children
line wrap: on
line source


         NAM   Score
         TTL   Routines to handle high score recording

*     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

         SECTION bss

*     Local Variables

FPATH:   rmb    1           File path number
FSCORE:  rmb    126         Names & scores put here
PNAME:   rmb    15          Players name
NAMLGH   rmb    2           Number of characters in name
ENTCNT   rmb    1           Entry counter
ENTPNT   rmb    2           Pointer to start of entry
COUNT    rmb    1
SAVEX    rmb    2
CURPOS   rmb    3

         rmb   STACK

         ENDSECT

         SECTION code

FILLST:  fcc    '/dd/sys/pac_scores'

WRTNBY   fcb    2,37,33,87,114,105,116,116
         fcb    101,110,32,66,121,$1b,$32,1,2
         fcb    35,36,76,97,114,114,121,32
         fcb    69,46,32,79,108,115,111,110

LDGSCR   fcb    2,33,34,76,111,97,100,105,110
         fcb    103,32,72,105,103,104,32,83
         fcb    99,111,114,101,115

ENTNAM   fcb    $1b,$32,1,$1b,$33,0,$0c,2,33,33
         fcb    80,76,69,65,83,69,32
         fcb    69,78,84,69,82,32,89,79
         fcb    85,82,32,78,65,77,69,32

ARROW    fcb    $1b,$32,2,2,34,35,45,45,62
         fcb    32,$1b,$32,3,95,2,38,35

QUESTN   fcb    $1b,$32,9,2,32,35,32,73,115,32
         fcb    78,97,109,101,32,67,111,114,114
         fcb    101,99,116,32,40,89,47,78,41,32,63
         fcb    2,55,35

CONGRT   fcb    2,37,33,$1b,$32,2,67,79,78
         fcb    71,82,65,84,85,76,65,84,73
         fcb    79,78,83,$1b,$32,4,2,38,35

NOTFND   fcb    $0c,$1b,$32,4,2,37,32,83,99,111
         fcb    114,101,32,70,105,108,101,$1b,$32
         fcb    2,2,34,34,47,100,100,47,115,121
         fcb    115,47,112,97,99,95,115,99,111
         fcb    114,101,115,$1b,$32,4,2,38,36
         fcb    78,79,84,32,70,79,85,78,68

CREATE   fcb    2,38,36,32,32,32,32,32,32,32,32
         fcb    32,2,37,36,67,114,101,97,116
         fcb    105,110,103,32,73,116

CHGWK1   fcb    $1b,$25,0,0,40,24
         fcb    $1b,$33,7

CHGWK2   fcb    $1b,$25,8,9,22,7,2,32,32

CRLF     fcb    $0d,$0a

CLRSCN   fcb    $0c

CURXY1   fcb    2,32,32

CURXY2   fcb    $0c,2,38,33,$1b,$32,4

CLNORM   fcb    $1b,$32,2,$1b,$33,0

CLINVT   fcb    $1b,$32,4,$1b,$33,0

CLNRM2   fcb    $1b,$32,2,$1b,$33,0


SBEGIN:  leax   SCRBOX,pcr
         ldy    #39
         lbsr   OUTST2
         leax   WRTNBY,pcr
         ldy    #33
         lbsr   OUTST2
         ldx    #200
         lbsr   WAIT
         leax   CLRSCN,pcr
         ldy    #1
         lbsr   OUTST2
         leax   LDGSCR,pcr
         ldy    #22
         lbsr   OUTST2
         ldx    #75
         lbsr   WAIT

OPENFL   lda    #1          Set for read
         leax   FILLST,pcr  Point to pathlist
         os9    I$Open      Open file
         lbcs   OPNERR      Go handle any errors
         sta    FPATH,U
READFL   leax   FSCORE,U    Point to data storage area
         ldy    #126        Read entire file (126 bytes)
         os9    I$Read      Go do read
         lbcs   REDERR      Go handle any errors
*    Close file
         lda    FPATH,U
         os9    I$Close
         lbcs   ERR1

         leax   CLRSCN,pcr
         ldy    #1
         lbsr   OUTST2

         lbsr   PRFIL2      Print score data
         leax   CHGWK1,pcr  Reset screen 0,0,40,24
         ldy    #9
         lbsr   OUTST2
         rts

SCEND:   lda    #0
         sta    ENTCNT,U
         lda    #2
         sta    CURPOS,U
         lda    #32
         sta    CURPOS+1,U

         lbsr   SCRCMP      Compare players score
         lda    ENTCNT,U
         cmpa   #-1
         beq    SCRTN

OPNFL2   lda    #2          Set to write
         leax   FILLST,pcr
         os9    I$Open
         lbcs   ERR1
         sta    FPATH,U
WRITFL   leax   FSCORE,U
         ldy    #126
         os9    I$Write
         lbcs   ERR1
         lda    FPATH,U
         os9    I$Close
         lbcs   ERR1

         ldx    #100
         lbsr   WAIT
SCRTN    rts

*   File data has been put in memory
*   now print it on screen
*   This is used for path2
PRFIL2   leax   CLNRM2,pcr
         ldy    #6
         lbsr   OUTST2
         leax   CURXY1,pcr
         ldy    #3
         lbsr   OUTST2
         leax   FSCORE,U
         leax   -21,X
         ldb    #7
         pshs   B,X
PLOOP2   puls   B,X
         decb
         beq    PDONE2
         leax   21,X
         pshs   B,X
         ldy    #21
         lbsr   OUTST2
         leax   CRLF,pcr
         ldy    #2
         lbsr   OUTST2
         bra    PLOOP2

PDONE2   rts

SCRCMP   lda    #0          Set entry count to zero
         ldb    #0
         sta    ENTCNT,U    Save it
         std    ENTPNT,U    Set entry pointer
         leay   FSCORE,U    Point to start of data
SCLOOP   leay   15,Y        Move to first score
         leax   SCRASC-1,U  Point to players score -1
         ldb    #7          Set byte counter
SCLOP2   decb               Decrement counter
         beq    NEXTCK      If =, go get next score
         lda    ,Y+         Get hi-score byte
         leax   1,X         Bump player score pointer
         cmpa   ,X          Compare them
         beq    SCLOP2      If =, go check next byte
         blo    MOVE        If <, insert players name

NEXTCK   lda    ENTCNT,U    Get entry counter
         inca               Bump it
         cmpa   #6          Done 6 yet ?
         bne    NEXT        Score not higher, Print old data
         lda    #-1
         sta    ENTCNT,U
         bra    PRFILE

NEXT     sta    ENTCNT,U    Save count
         leay   FSCORE,U
         ldb    #21
         mul
         leay   D,Y
         std    ENTPNT,U
         bra    SCLOOP

*        This routine is used to insert the
*        player's score into the hi-scores
*   Move name & score data down to allow player's
*   name & score to be inserted. This will remove
*   the last item from the list

MOVE     lda    #5          Set constant
         suba   ENTCNT,U    Subtract entry counter
         ldb    #21         Set multiplier
         mul                B reg. holds loop counter
         leax   FSCORE,U    Point to start of data
         leax   126,X       Move to last byte entry 6 +1
         leay   FSCORE,U
         leay   105,Y       Move to last byte entry 5 +1
         cmpd   #0          If on bottom, then don't
         beq    PUTIT         move any down
INLOOP   lda    ,-Y         Get a byte
         sta    ,-X         Move it
         decb               Decrement counter
         bne    INLOOP      

*   Now zero(underline) out previous entry at this location

PUTIT    ldb    #15         Set byte counter
         lda    #95         ASCII underline chacarter
PUTLOP   decb               Decrement counter
         beq    PUTSCR
         sta    ,Y+         Store a '_' character
         bra    PUTLOP      Loop till 15 are done
*   Now transfer players score
PUTSCR   lda    #32         Space character
         sta    ,Y+
         ldb    #7          Set transfer byte counter
         leax   SCRASC,U    Point to players ascii score
PLOOP    decb               Decrement counter
         beq    PRFILE      If 0, then exit
         lda    ,X+         Get byte & increment X
         sta    ,Y+         Put byte & increment Y
         bra    PLOOP
*   File data has been put in memory
*   now print it on screen
*   This is used for path
PRFILE   leax   CLNORM,pcr
         ldy    #6
         lbsr   OUTST2
         leax   CHGWK2,pcr
         ldy    #9
         lbsr   OUTST2
         leax   FSCORE,U
         leax   -21,X
         lda    #-1
         ldb    #7
         pshs   D,X
PRLOOP   puls   D,X
         decb
         beq    PRDONE
         leax   21,X        Point to line to print
         inca               Increment compare count
         pshs   D,X
         cmpa   ENTCNT,U    Are we on the new line ?
         bne    NORMPR
         stx    SAVEX,U     Save X register
         leax   CLINVT,pcr  Invert screen colors
         ldy    #6
         lbsr   OUTST2
         ldx    SAVEX,U     Get X register value
         ldy    #21         Output 21 bytes
         lbsr   OUTST2
         leax   CRLF,pcr    Do a carriage return
         ldy    #2            and a line feed
         lbsr   OUTST2
         leax   CLNORM,pcr  Reset screen colors
         ldy    #6
         lbsr   OUTST2
         bra    PRLOOP

NORMPR   ldy    #21
         lbsr   OUTST2
         leax   CRLF,pcr
         ldy    #2
         lbsr   OUTST2
         bra    PRLOOP

PRDONE   lda    ENTCNT,U
         cmpa   #-1
         lbeq   RDDONE

OPNBOT   ldx    #100
         lbsr   WAIT
         leax   BOTWIN,pcr
         ldy    #47
         lbsr   OUTST2

PNAMLP   leax   ENTNAM,pcr  Print 'Please enter your name'
         ldy    #33         Output 34 bytes
         lbsr   OUTST2

         leax   ARROW,pcr   Print '-->_'
         ldy    #17
         lbsr   OUTST2

*   Now get players name

GETNAM   leax   PNAME,U     Fill name storage
         lda    #32           with spaces
         ldb    #15
PNLOOP   sta    ,X+
         decb
         bne    PNLOOP

RDNAME   leax   PNAME,U     Get name from player
         ldy    #15         14 + CR
         lda    PATH2,U
         os9    I$ReadLn
         lbcs   ERR1
         tfr    Y,D

         leax   PNAME,U
         subd   #1
         leax   D,X
         std    NAMLGH,U
         lda    #32
         sta    ,X          Remove CR

NAMEOK   ldd    NAMLGH,U
         cmpd   #0
         beq    NAMASK

         leax   CURXY2,pcr  Clear screen, Move to XY
         ldy    #7            location 6,0
         lbsr   OUTST2        and set color

         leax   PNAME,U
         ldy    NAMLGH,U
         lbsr   OUTST2

NAMASK   leax   QUESTN,pcr
         ldy    #33
         lbsr   OUTST2

         lbsr   READ2
         lda    RESPON,U
         cmpa   #89
         beq    PUTNAM
         cmpa   #121
         beq    PUTNAM
         leax   CLRSCN,pcr
         ldy    #1
         lbsr   OUTST2

         lbra   PNAMLP

PUTNAM   leax   BOTEND,pcr
         ldy    #15
         lbsr   OUTST2

         leax   PNAME,U
         leay   FSCORE,U
         ldd    ENTPNT,U
         leay   D,Y
         ldb    #14
PUTNML   lda    ,X+
         sta    ,Y+
         decb
         bne    PUTNML

         lda    ENTCNT,U
         adda   #32
         sta    CURPOS+2,U

         leax   CURPOS,U
         ldy    #3
         lbsr   OUTST2

         leax   FSCORE,U
         ldd    ENTPNT,U
         leax   D,X
         ldy    #21
         lbsr   OUTST2

         leax   BOTWIN,pcr
         ldy    #47
         lbsr   OUTST2

         leax   CONGRT,pcr
         ldy    #27
         lbsr   OUTST2

         leax   PNAME,U
         ldy    NAMLGH,U
         lbsr   OUTST2

RDDONE   ldx    #200
         lda    ENTCNT,U
         cmpa   #-1
         beq    RDWAIT
         ldx    #150
RDWAIT   lbsr   WAIT        Sleep for 150 or 200 ticks
         lda    ENTCNT,U
         cmpa   #-1
         beq    RDEXIT

         leax   BOTEND,pcr
         ldy    #15
         lbsr   OUTST2
RDEXIT   rts

*   Handle file errors here
*   214- no permission
*   216- path name not found
*   

OPNERR   cmpb   #216        Is it PATH NAME NOT FOUND ?
         lbne   ERR1
*   Print Creating score file
         leax   NOTFND,pcr
         ldy    #56
         lbsr   OUTST2
         ldx    #75
         lbsr   WAIT
FILLSC   leax   FSCORE,U    Point to data area
         ldb    #7          Set counter
         stb    COUNT,U
DMLOOP   lda    COUNT,U
         deca
         beq    CRFILE
         sta    COUNT,U     Save new count
         ldb    #15
         lda    #46         '.'
DLOOP2   decb
         beq    SPACE
         sta    ,X+         Put 14 '.' in data area
         bra    DLOOP2
SPACE    lda    #32         ' '
         sta    ,X+         Put a space in data area
         lda    #32         Space
         ldb    #6
DLOOP3   decb
         beq    DZERO
         sta    ,X+         Put 5 spaces in data area
         bra    DLOOP3
DZERO    lda    #48         '0'
         sta    ,X+
         bra    DMLOOP

*   File doesn't exist, so create it

CRFILE   leax   CREATE,pcr
         ldy    #26
         lbsr   OUTST2
         leax   FILLST,pcr  Point to path list
         lda    #2          Access mode (2=write)
         ldb    #47         Attributes (00101111)
         os9    I$Create    Go create file
         lbcs   ERR1
         sta    FPATH,U     Save path #
*   Write data to file
WRTFIL   leax   FSCORE,U    Point to data
         ldy    #126        Write 126 bytes
         lda    FPATH,U     Set path #
         os9    I$Write     Do write
         lbcs   ERR1
*   Now close file
CLSFIL   lda    FPATH,U
         os9    I$Close
         lbcs   ERR1
         ldx    #75
         lbsr   WAIT

         rts

REDERR   lbra   ERR1


         ENDSECT