diff CoCoOS9/level2v3/CMDS/proc.asm @ 31:bd2b07db8917 cocoos9lv2v3

CoCoOS9 version
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Jul 2018 15:16:13 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CoCoOS9/level2v3/CMDS/proc.asm	Sat Jul 14 15:16:13 2018 +0900
@@ -0,0 +1,507 @@
+********************************************************************
+* Proc - Show process information
+*
+* $Id: proc.asm,v 1.1.1.1 2001/02/21 23:30:54 boisy Exp $
+*
+* NOTE: SHOULD ADD IN TO HANDLE PRINTING NAME OF CURRENT MODULE
+*       RUNNING IN A RUNB or BASIC09 PROCESS
+*
+* From "Inside Level II" by Kevin Darling
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+* 1      Original version                               KKD 88/10/28
+* ?      Modified to show status in English, stderr     ??? 89/07/30
+*        and the system process
+* 11     Modified to add current executing/editing      LCB 94/11/08
+*        module name for Basic09 and/or RunB programs
+
+         nam   Proc
+         ttl   Show process information
+
+         ifp1  
+         use   defsfile
+         endc  
+
+Type     set   Prgrm+Objct
+Revs     set   ReEnt+1
+edition  set   11
+
+bufsiz   set   512
+CR       set   $0D
+Spc      set   $20
+stdout   set   1
+
+         pag   
+***************************************************
+         mod   PrgSiz,Name,Type,Revs,Entry,DatSiz
+
+Name     fcs   /Proc/
+         fcb   edition
+
+* Data Equates
+umem     rmb   2          Data mem ptr
+sysimg   rmb   2          pointer to sysprc datimg
+datimg   rmb   2          datimg for copymem
+datimg2  rmb   2          2nd copy for non-descriptor use
+basicflg rmb   1          Flag that primary module is BASIC09 or RUNB
+outptr   rmb   2          pointer in outbuf
+number   rmb   3
+leadflag rmb   1
+path     rmb   3          stdin, stdout and stderr
+pid      rmb   1
+namlen   rmb   1
+hdr      rmb   64
+outbuf   rmb   80         Buffer for output string
+buffer   rmb   bufsiz     working proc. desc.
+sysprc   rmb   bufsiz     system proc. desc.
+stack    rmb   200
+datsiz   equ   .
+
+**************************************************
+* Messages
+* Headers
+Header   fcc   " ID Prnt User Pty  Age  Tsk  Status  Signal   Module    I/O Paths "
+         fcb   CR
+Hdrlen   equ   *-Header
+
+Header2  fcc   /___ ____ ____ ___  ___  ___  _______ __  __  _________ __________________/
+Hdrcr    fcb   CR
+Hdrlen2  equ   *-Header2
+
+* State Strings (6 characters each)
+Quesstr  fcc   /??????/
+TimSlpSt fcc   /TSleep/
+TimOStr  fcc   /TimOut/
+ImgChStr fcc   /ImgChg/
+SuspStr  fcc   /Suspnd/
+CondmStr fcc   /Condem/
+DeadStr  fcc   /Dead          /
+Spaces   fcc   /              /
+SystmSt  fcc   /System        /
+
+* Special case module names
+basic09  fcc   'BASIC'
+b09sz    equ   *-basic09
+runb     fcc   'RUNB'
+runbsz   equ   *-runb
+basicms2 fcc   ')'
+         fcb   CR
+Nomodule fcc   'Not Defined'
+Nomodsz  equ   *-Nomodule
+
+************************************************
+Entry    stu   <Umem      save data mem ptr
+         lda   #stdout    Std out path=1
+         leax  Hdrcr,PC   print blank line
+         ldy   #1
+         os9   I$WritLn
+         bcs   Error
+         leax  Header,pcr  Print header line 1
+         ldy   #Hdrlen
+         os9   I$WritLn
+         bcs   Error
+         leax  Header2,pcr Print header line 2
+         ldy   #Hdrlen2
+         os9   I$WritLn
+         bcs   Error
+         lda   #1
+         leax  >sysprc,U  get system proc. desc.
+         os9   F$GPrDsc
+         bcs   Error
+         leax  P$DatImg,X just for its dat image
+         stx   <sysimg
+         clra             set <pid = start -1
+         sta   <basicflg  Default: not a RUNB or BASIC09
+         sta   <pid
+
+* Main Program Loop
+Main     ldu   <umem      Get data mem ptr
+         leax  OutBuf,U   Point to line buffer to print to screen
+         stx   <outptr
+         inc   <pid       next process
+         beq   Exit       If wrapped, we are done
+         lda   <pid       get proc ID to check 
+         leax  Buffer,U   Point to place to hold process dsc.
+         os9   F$GPrDsc   Get it
+         bcs   Main       loop if no descriptor
+         bsr   Output     print data for descriptor
+         bra   Main       Do rest of descriptors
+
+Exit     clrb  
+Error    os9   F$Exit
+
+***********************************************
+*  Subroutines
+* Print Data re Process
+* Entry: X=Ptr to buffer copy of process descriptor (Buffer,u)
+Output   lda   P$ID,X     process id
+         lbsr  Outdecl    print pid
+         lda   P$PID,X    parent's id
+         lbsr  Outdecl
+         lbsr  Spce
+         ldd   P$User,X   user id
+         lbsr  Outdec
+         lbsr  Spce
+         lda   P$Prior,X  priority
+         lbsr  Outdecl
+         lbsr  Spce
+         lda   P$Age,X    age
+         lbsr  Outdecl
+         lbsr  Spce
+         lbsr  Spce
+         lda   P$Task,X   task no.
+         lbsr  Out2HS
+         lbsr  Spce
+         lda   P$State,X  state
+         pshs  X          save X
+         lbsr  OutState
+         puls  X          restore x
+         lda   P$Signal,X signal
+         lbsr  Outdecl    - in decimal
+         lbsr  Spce
+         lda   P$Signal,X signal
+         lbsr  Out2HS     - in hex
+         lbsr  Spce
+         ldd   P$Path,X   get stdin and stdout
+         std   <path
+         lda   P$Path+2,X and stderr
+         sta   <path+2
+* Print primary module name
+* IN: X - ptr to process descriptor copy (buffer,u)
+         leay  P$DATImg,X
+         tfr   Y,D        d=dat image
+         std   <datimg
+         std   <datimg2   2nd copy for 2ndary name
+         lda   <pid       working on system process?
+         cmpa  #1
+         beq   Outp2      yes, print name
+         ldx   P$PModul,X x=offset in map
+         ldb   #9         set minimum space padded size of name
+         stb   <namlen
+         lbsr  Printnam   Go append name to buffer
+         bra   Outp3
+
+Outp2    leax  SystmSt,pcr print "System"
+         ldb   #9         name length
+         lbsr  PutSt1
+* Print Standard input Device
+Outp3    lbsr  Spce
+         lda   #'<
+         lbsr  Print
+         lbsr  Device
+         lda   <path+1    get stdout
+         sta   <path
+         lda   #'>
+         lbsr  Print
+         lbsr  Device
+Stderr   lda   <path+2    get stderr
+         sta   <path
+         lda   #'>
+         lbsr  Print      print first >
+         lda   #'>
+         lbsr  Print
+         bsr   Device
+* Print Line
+         ldx   <outptr    now print line
+         lda   #CR
+         sta   ,X         terminate line with CR
+         ldu   <umem
+         leax  outbuf,U   Print it (up to 80 chars)
+         ldy   #80
+         lda   #stdout
+         os9   I$Writln
+         lbcs  Error
+         lda   <basicflg  Was module RUNB or BASIC09?
+         beq   notbasic   No, finished this entry
+         clr   <basicflg  Yes, clear out flag for 2nd call to Printnam
+         leax  outbuf,u   Point to output buffer start
+         ldd   #$20*256+45 45 spaces
+copylp   sta   ,x+        Put spaces into output buffer
+         decb             Drop size counter
+         bne   copylp     Copy entire message
+         lda   #'(        Add opening parenthesis
+         sta   ,x+
+         stx   <outptr    Save new output buffer ptr
+         ldd   <datimg2   Get programs DAT img
+         std   <datimg    Save over descriptor one
+         ldx   #$002f     $002f in basic09 is ptr to current module
+         ldy   #2         Just need ptr for now
+         ldu   <umem
+         leau  hdr,u      Point to place to hold it
+         os9   F$CpyMem   Get current module ptr
+         ldu   <umem      Get data mem ptr
+         ldx   hdr,u      Get ptr to module start in BASIC09 workspace
+         beq   NotDef     If 0, no 'current module' defined
+         lbsr  Printnam   Go append sub-module name to output buffer
+         bra   printit    Add closing chars & print it
+
+NotDef   ldx   <outptr    Get current output buffer ptr
+         leay  Nomodule,pcr Point to 'Not Defined'
+         ldb   #Nomodsz   Size of message
+Notlp    lda   ,y+        Copy it
+         sta   ,x+
+         decb             Until done
+         bne   Notlp
+         stx   <outptr    Save output buffer ptr for below
+printit  ldd   basicms2,pcr Get closing ')' + CR
+         ldx   <outptr    Get current output buffer ptr
+         std   ,x         Append to output buffer
+         ldu   <umem
+         leax  outbuf,U   Print it (up to 80 chars)
+         ldy   #80
+         lda   #stdout
+         os9   I$Writln
+         lbcs  Error
+notbasic rts   
+
+* Print Character in A and Device Name
+Device   ldu   <umem      restore U
+         lda   <path
+         bne   Device2    if <path = 0, print spaces
+         leax  Spaces,pcr
+         lbra  PutStr
+
+* Get device name
+Device2  leau  hdr,U      get table offset in sys map
+         ldd   <sysimg
+         ldx   #D.PthDBT  from direct page
+         ldy   #2
+         os9   F$CpyMem
+         lbcs  Error
+         ldx   hdr        get <path descriptor table
+         ldy   #64
+         ldd   <sysimg
+         os9   F$CpyMem
+         lbcs  Error
+         ldb   <path      point to <path block
+         lsrb             four           <paths/ block
+         lsrb  
+         lda   B,U        a=msb block addr.
+         pshs  A
+         ldb   <path      point to <path
+         andb  #3
+         lda   #$40
+         mul   
+         puls  A          d= <path descriptor address
+         addb  #PD.Dev    get device table pointer
+         tfr   D,X
+         ldd   <sysimg
+         ldy   #2
+         os9   F$CpyMem
+         lbcs  Error
+         ldx   hdr        x= dev. table entry sys.
+         ldb   #V$Desc    we want descr. pointer
+         abx   
+         ldd   <sysimg
+         ldy   #2
+         os9   F$CpyMem
+         lbcs  Error
+         ldx   hdr        get descriptor addr.
+         ldu   <umem
+         ldd   <sysimg
+         std   <datimg
+         ldb   #5
+         stb   <namlen
+** Find and print a module name
+* IN:  X - module offset
+*      U - data area
+*      <datimg = pointer
+* Read module header
+Printnam pshs  U          save u
+         leau  hdr,U      destination
+         ldd   <datimg    proc <datimg pointer
+         ldy   #10        set length (M$Name ptr is @ 4)
+         os9   F$CpyMem   Get 1st 10 bytes of module header
+         lbcs  Error
+* Read name from Module to buffer
+         ldd   M$Name,U   get name offset from header
+         ldu   <outptr    move name to outbuf
+         leax  D,X        X - offset to name
+         ldd   <datimg
+         ldy   #40        max length of name we will accept
+         os9   F$CpyMem   Get copy of module name
+         puls  U
+         lbcs  Error
+
+         pshs  X
+         ldx   <outptr
+         pshs  X          Save start of module name ptr
+         clrb             set            length = 0
+Name3    incb             Bump up # chars long name is
+         lda   ,X+        Get char from module name
+         bpl   Name3      No hi-bit terminator yet, keep checking
+         cmpb  #40        Done, is it >39 chars?
+         bhs   Name5      Yes, skip ahead
+         anda  #$7F       Take out hi-bit
+         sta   -1,X       Save char back without hi-bit
+         cmpb  <namlen    Bigger than max name size we allow?
+         bhs   Name5      No, skip ahead
+         lda   #Spc       If smaller, pad with spaces
+Name4    sta   ,X+
+         incb  
+         cmpb  <namlen
+         blo   Name4
+Name5    stx   <outptr    Save new output buffer ptr
+         lda   <basicflg  Are we here doing a basic09 sub-module?
+         bne   notbas     Yes, don't get stuck in recursive loop
+         ldx   ,s         Get ptr to start of module name again
+         leay  basic09,pcr Check for BASIC09 1st
+         ldb   #b09sz     Size of module to check           
+chkb09lp lda   ,x+        Get char from module name
+         anda  #$df       Force to uppercase
+         cmpa  ,y+        Same as one for BASIC09?
+         bne   chkrunb    No, check runb
+         decb             Done 'BASIC' yet?
+         bne   chkb09lp   No, keep checking
+         ldd   ,x++       Get last 2 chars from name
+         cmpd  #$3039     '09'?
+         bne   chkrunb    No, try runb
+         lda   ,x         Next char space (end of name)?
+         cmpa  #$20
+         beq   setflag    Yes, set basic09 flag
+chkrunb  leay  runb,pcr    Point to 'runb'
+         ldb   #runbsz
+         ldx   ,s         Get ptr to name in buffer
+chkrunlp lda   ,x+        Get char
+         anda  #$df       Force to uppercase
+         cmpa  ,y+        Match?
+         bne   notbas     No, not either basic
+         decb             Done whole check?
+         bne   chkrunlp   No, keep checking
+setflag  sta   <basicflg  Set basic09 flag
+notbas   leas  2,s        Eat start of module name ptr
+         puls  X,PC       Restore X & return
+
+* Print Hexidecimal Digit in D
+Out4HS   pshs  B
+         bsr   Hexl
+         puls  A
+Out2HS   bsr   Hexl
+
+Spce     lda   #Spc
+         bra   Print
+
+* Print Hexidecimal Digit in A
+Hexl     tfr   A,B
+         lsra  
+         lsra  
+         lsra  
+         lsra  
+         bsr   Outhex
+         tfr   B,A
+Outhex   anda  #$0F
+         cmpa  #$0A       0 - 9
+         bcs   Outdig
+         adda  #$07       A - F
+Outdig   adda  #'0        make ASCII
+
+Print    pshs  X
+         ldx   <outptr
+         sta   ,X+
+         stx   <outptr
+         puls  X,PC
+
+* Print 1 Decimal Digit in B
+*
+Outdecl  tfr   A,B        <number to B
+         clra  
+
+* Print 2 Decimal Digits in D
+Outdec   clr   <leadflag
+         pshs  X
+         ldx   <umem
+         leax  <number,X
+         clr   ,X
+         clr   1,X
+         clr   2,X
+Hundred  inc   ,X
+         subd  #100
+         bcc   Hundred
+         addd  #100
+Ten      inc   1,X
+         subd  #10
+         bcc   Ten
+         addd  #10
+         incb  
+         stb   2,X
+         bsr   Printled
+         bsr   Printled
+         bsr   Printnum
+         bsr   Spce
+         puls  X,PC
+
+Printnum lda   ,X+        get char
+         adda  #$30-1     make ASCII
+         bra   Print
+
+Printled tst   <leadflag  print leading zero?
+         bne   Printnum   yes
+         ldb   ,X         is it zero?
+         inc   <leadflag
+         decb  
+         bne   Printnum   no, print zeros
+         clr   <leadflag
+         lda   #Spc
+         leax  1,X
+         bra   Print
+
+* Print process state in English
+*  IN:  A = P$State
+OutState tfr   A,B
+         bitb  #SysState  system?
+         beq   OutSt1     no
+         lda   #'s        s = System state
+         bra   OutSt2
+
+OutSt1   lda   #Spc
+
+OutSt2   bsr   Print
+         bitb  #TimSleep
+         bne   PTimSlp
+         bitb  #TimOut
+         bne   PTimOut
+         bitb  #ImgChg
+         bne   PImgCh
+         bitb  #Suspend
+         bne   PSuspnd
+         bitb  #Condem
+         bne   PCondem
+         bitb  #Dead
+         bne   PDead
+         bitb  #$04
+         bne   PQues
+         leax  Spaces,pcr  nothing to report
+         bra   PutStr
+
+PQues    leax  QuesStr,pcr
+         bra   PutStr
+
+PTimSlp  leax  TimSlpSt,pcr
+         bra   PutStr
+
+PTimOut  leax  TimOStr,pcr
+         bra   PutStr
+
+PImgCh   leax  ImgChStr,pcr
+         bra   PutStr
+
+PSuspnd  leax  SuspStr,pcr
+         bra   PutStr
+
+PCondem  leax  Condmstr,pcr
+         bra   PutStr
+
+PDead    leax  Deadstr,pcr
+
+Putstr   ldb   #6         six characters
+
+Putst1   lda   ,X+
+         lbsr  Print
+         decb  
+         bne   PutSt1
+         rts   
+
+         emod  
+Prgsiz   equ   *
+         end