diff 3rdparty/utils/boisy/timer.asm @ 0:6641a883d6b0

Initial revision
author boisy
date Thu, 04 Apr 2002 16:34:12 +0000
parents
children 0e08f0830fd8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/3rdparty/utils/boisy/timer.asm	Thu Apr 04 16:34:12 2002 +0000
@@ -0,0 +1,268 @@
+************************************************************
+* Timer - Benchmarks a program with accuracy to one second
+*
+* By: Boisy G. Pitre
+*     Southern Station, Box 8455
+*     Hattiesburg, MS  39406-8455
+*     Internet:  bgpitre@seabass.st.usm.edu
+*
+* Usage:  Timer <program> [params]
+*
+* Timer is a benchmark utility that is used to rate the speed of an
+* OS-9 program.
+*
+
+         nam   Timer
+         ttl   Benchmark utility
+
+         ifp1
+         use   defsfile
+         endc
+
+         mod   Size,Name,Prgrm+Objct,Reent+1,Start,Fin
+
+Name     fcs   /Timer/
+Ed       fcb   $02
+
+Delim    rmb   1
+TempX    rmb   2
+Count    rmb   1
+ProgName rmb   70
+ParmBuff rmb   200
+OldTime  rmb   6
+NewTime  rmb   6
+Digit    rmb   2
+Stack    rmb   200
+Parms    rmb   200
+Fin      equ   .
+
+HelpMsg  fcc   /Usage:  Timer <progname> [params]/
+SpCR     fcb   $20,$0a,$0d
+HelpLen  equ   *-HelpMsg
+
+
+Header   fdb   $0a0d
+         fcc   /Timer Statistics:/
+         fdb   $0a0d,$0a0d
+         fcc   /Command line:  /
+Header1  fcc   /Date:  /
+Header2  fcc   /Start Time:  /
+Header3  fcc   /Stop  Time:  /
+Colon    fcc   /:/
+Slash    fcc   "/"
+
+Start    decb                          Check for params
+         lbeq  Help                    if none, show help
+         lda   #$0d
+         leay  ParmBuff,u              Else put a CR in param buffer
+         sta   ,y
+
+         leay  ProgName,u              and put progname in progname buffer
+GetName  lda   ,x+
+         sta   ,y+
+         cmpa  #$20                    any space after name?
+         beq   PlaceCR                 Yep, assume params are on line
+         cmpa  #$0d                    Is next char a CR?
+         bne   GetName                 nope, not finished getting name
+         bra   GetTime                 else assume no params...
+
+PlaceCR  lda   #$0D                    Put CR behind progname,
+         sta   -1,y
+
+SkipSpac lda   ,x+                     skip leading spaces
+         cmpa  #$20
+         beq   SkipSpac
+         leax  -1,x
+
+SaveParm leay  ParmBuff,u              and store params in param buffer
+Loop     lda   ,x+
+         sta   ,y+
+         cmpa  #$0d                    Is char a CR?
+         beq   GetTime                 Yep, we're finished parsing
+         bra   Loop                    else get next char
+
+GetTime  lda   #Prgrm+Objct            We'll take care of some F$FORK
+         ldb   #8                      params to minimize the time between
+         ldy   #200                    grabbing the time and forking.
+         leax  OldTime,u               
+         os9   F$Time                  Now we get the time
+         lbcs  Error
+
+         leax  ProgName,u              and point to the program name
+         pshs  u                       save the u pointer value
+         leau  ParmBuff,u              and point u to the param buffer
+         os9   F$Fork                  Fork the program
+         bcs   Error
+         os9   F$Wait                  and wait for it to complete
+
+         puls  u                       get the u pointer value
+         leax  NewTime,u               and get the new time
+         os9   F$Time
+         bcs   Error
+
+
+* Print the Header and command line
+
+         leax  Header,pcr
+         ldy   #38
+         lda   #2
+         os9   I$Write
+         bcs   Error
+
+         leax  ProgName,u
+         ldb   #$0d
+         bsr   PrnNam
+
+         leax  SpCR,pcr
+         ldy   #1
+         lda   #2
+         os9   I$Write
+         bcs   Error
+
+         leax  ParmBuff,u
+         ldy   #200
+         lda   #2
+         os9   I$Writln
+         bcs   Error
+         bra   DateShow
+
+**********************************************************************
+* PrnNam - Prints a string character-by-character until it encounters
+* a specific character in B
+*
+* Entry: X - Address of string
+*        B - Byte character to halt at
+*
+* Exit:  None
+*
+
+PrnNam   lda   #2
+         ldy   #1
+Prn2     cmpb  ,x                      compare B to char
+         bne   Prn3                    if not equal, print...
+         rts                           else return
+Prn3     os9   I$Write                 Write out character
+         bcs   Error
+         leax  1,x
+         bra   Prn2
+
+
+* Print the date
+
+DateShow leax  Header1,pcr
+         ldy   #7
+         os9   I$Write
+         bcs   Error
+         leax  Slash,pcr
+         lda   ,x
+         sta   Delim,u
+         leax  OldTime,u               Set X to old time packet+3
+         ldb   #2
+         bsr   ShowTime                and sub to showtime
+         bra   OldShow
+
+* We're done!
+
+Done     clrb
+Error    os9   F$Exit
+
+* Show the Old Time
+
+OldShow  lda   #2
+         leax  Header2,pcr             Write the old time message
+         ldy   #13
+         os9   I$Write
+         bcs   Error
+         leax  Colon,pcr
+         lda   ,x
+         sta   Delim,u
+         leax  OldTime+3,u             Set X to old time packet+3
+         ldb   #2
+         bsr   ShowTime                and sub to showtime
+
+NewShow  leax  Header3,pcr             Write the new time message
+         ldy   #13
+         os9   I$Write
+         bcs   Error
+         leax  NewTime+3,u             Set X to new time packet+3
+         ldb   #2
+         bsr   ShowTime                and sub to showtime
+         bra   Done
+
+* Help routine
+
+Help     leax  HelpMsg,pcr             Point to the help message
+         ldy   #HelpLen                and load the length
+         lda   #2                      we'll write to StdErr
+         os9   I$Write
+         bcs   Error
+         bra   Done                    and leave!
+
+*******************************************************
+* ShowTime routine - Prints date/time format
+*
+* Entry: X - Address of packet
+*        B - (Number of bytes to convert)-1
+*
+* Exit:  None
+*
+
+ShowTime stb   Count,u                 store count in counter address
+ShowLoop ldb   ,x+                     load X with byte
+         stx   TempX,u                 save the X value
+         pshs  u                       save the U value
+         leau  Digit,u                 and point to the digit buffer
+         bsr   Str2Num                 sub to the actual conversion routine
+         puls  u                       get the U value
+         lda   #2
+         ldy   #2
+         leax  Digit,u                 and write the two digits
+         os9   I$Write
+         bcs   Error
+         tst   Count,u                 is count at 0?
+         beq   PutCR                   yep, put a CR
+         dec   Count,u                 else decrement count
+         ldy   #1                      and print the delimiter
+         leax  Delim,u
+         os9   I$Write
+         bcs   Error
+         ldx   TempX,u                 get the X value
+         bra   ShowLoop                and get the next time byte
+PutCR    lda   #2
+         ldy   #2
+         leax  SpCR+1,pcr                print a CR for next line
+         os9   I$Write
+         lbcs  Error
+Return   rts                           Return to caller!
+
+************************************************************
+* Str2Num:  Converts a one byte representation to its string
+*           counterpart in the range of 0-255.
+*
+*  Entry:  U - Address to store text digits
+*          B - Byte to convert
+*
+*  Exit:   None
+*
+
+Str2Num  pshs  a,b,u
+         lda   #$2f
+         inca
+p1       subb  #$64
+         bcc   p1
+         sta   ,u+
+         cmpa  #$30
+         bne   P2
+         leau  -1,u
+p2       lda   #$3a
+p3       deca
+         addb  #$0a
+         bcc   p3
+         sta   ,u+
+         addb  #$30
+         stb   ,u+
+         puls  a,b,u
+         rts
+         emod
+Size     equ   *
+         end