[comp.os.vms] Pgm to display memory, cpu, jobs and of course clock

ltl@CUGSBVAX.BITNET (05/16/88)

With all the clock program and show mode command procedure floating around,
I have gathered up some thought at producing the following programs which will
display on the 25th line of the screen of PC running MSKERMIT the status
of (respectively):

   Memory usage: Total Physical memory in Megabytes
                 Memory free in K-pages
                 Memory used in K-pages
   CPU    usage: Total %
                 Kernel Mode %
                 Executive Mode %
                 Supervisor Mode %
                 User Mode %
                 Interrupt Stack %
                 Compatibility Mode %
   Jobs        : Interactive job count
                 Batch job count
   Date and time

You may modify the program to suit your taste like setting up scrolling regions
and display on the 24th line instead.

The ideas main is attributed to the previous program/command procedure
submit by messrs: Wolfgang J. Moeller U0012@DGOGWDGS.BITNET and
FETZER@nmfecc.ARPA.

LTL
LTL@cugsbvax.Bitnet
System Manager

..............................cut here....................................
      program clock
      implicit none
C
Cc
Ccc   Compile and link as follows:
Ccc   fortran/extend_source clock
Ccc   link clock,sys$system:sys.stb/selective,sysdef.stb/selective
Ccc
Ccc   This program is meant to be spawned in a subprocess.
Ccc   e.g. spawn/nowait/nological/nosymbols run clock
Cc
C
      include '($syssrvnam)'
      include '($iodef)'

      character*(*) esc
      integer*4 delay_seconds
      integer*4 delay_half
      parameter (esc = char(27))
      parameter (delay_seconds = 30)
      parameter (delay_half    = delay_seconds / 2 - 1)

      external sys$gw_ijobcnt, sys$gw_bjobcnt                          ! Jobs
      external exe$gl_rpb, rpb$l_memdsc, sch$gl_freecnt, sch$gl_mfycnt ! Memory
      external pms$gl_kernel, pms$gl_compat, exe$gl_abstim             ! Cpu
      external sch$gl_nullpcb, pcb$l_phd, phd$l_cputim                 ! Null
      character*256 buffer
      integer*4 delayed(2)/-1e7,-1/,initial_delay(2)/2*-1/
      integer*4 eval,eval_array
      integer*4 status,i,j,k,total
      integer*4 last(6),current(6),null_elapsed,null_last,null_current
      integer*4 total_memory,used_memory,free_memory
      integer*2 tt_channel,size,time(7)

      delayed(1) = delayed(1) * delay_seconds
      status = sys$assign('tt:',tt_channel,,)
      if (.not.status) call lib$signal(%val(status))
      total_memory= iand('ffffff'x,
     &     eval(%val(eval(%val(%loc(exe$gl_rpb)))+%loc(rpb$l_memdsc))))
      status = sys$fao('!AS7!AS[1;33;46m!AS[25;1H!3ULMb0000f000u   000%000k
     &000e000s000u000i000c   I:000 B:000   00/00/00 00:00:00!AS[0m!AS8',
     &     size,buffer,esc,esc,esc,
     &     %val(total_memory/2048),
     &     esc,esc)
      if (.not.status) call lib$signal(%val(status))

      null_last = eval(%val(eval(%val(%loc(sch$gl_nullpcb)+%loc(pcb$l_phd)))+
     &     %loc(phd$l_cputim)))
      call eval_array(%val(%loc(pms$gl_kernel)),last,6)
      call sys$numtim(time,)
      initial_delay(1) = (mod(zext(time(6) * 100 + time(7)),
     &     delay_seconds * 100) - delay_seconds*100) * 1e5
      call sys$schdwk (,,initial_delay,delayed)
      do while (.true.)
         call sys$hiber
         call sys$numtim(time,)
         null_current = eval(%val(eval(%val(%loc(sch$gl_nullpcb) +
     &        %loc(pcb$l_phd))) + %loc(phd$l_cputim)))
         null_elapsed = null_current - null_last
         call eval_array(%val(%loc(pms$gl_kernel)),current,6)
         total = 0
         do i = 1, 6
            total = total + current(i) - last(i)
            if (i.eq.1) total = total - null_elapsed
         enddo

         free_memory = eval(%val(%loc(sch$gl_freecnt)))
         used_memory = total_memory-free_memory-eval(%val(%loc(sch$gl_mfycnt)))
         call sys$fao('!4ULf!3ULu   !3UL%!3ULk!3ULe!3ULs!3ULu!3ULi!3ULc   I:
     &!3UW B:!3UW   !2UW/!2ZW/!2ZW !2UW:!2ZW:!2ZW',,
     &        buffer(25:98),
     &        %val((free_memory + 511) / 1024),
     &        %val((used_memory + 511) / 1024),
     &        %val(total / delay_seconds),
     &        %val((current(1)-last(1)-null_elapsed+delay_half)/delay_seconds),
     &        %val((current(2)-last(2)+delay_half) / delay_seconds),
     &        %val((current(3)-last(3)+delay_half) / delay_seconds),
     &        %val((current(4)-last(4)+delay_half) / delay_seconds),
     &        %val((current(5)-last(5)+delay_half) / delay_seconds),
     &        %val((current(6)-last(6)+delay_half) / delay_seconds),
     &        %val(eval(%val(%loc(sys$gw_ijobcnt)))),
     &        %val(eval(%val(%loc(sys$gw_bjobcnt)))),
     &        %val(time(2)),%val(time(3)),%val(mod(time(1),100)),
     &        %val(time(4)),%val(time(5)),%val(time(6)))
         call sys$qio(,%val(tt_channel),
     &        %val(io$_writevblk+io$m_breakthru+io$m_noformat),,,,
     &        %ref(buffer),%val(size),,,,)

         do i = 1, 6
            last(i) = current(i)
         enddo
         null_last = null_current
      enddo
      end

      integer*4 function eval(pointer)
      implicit none
      integer*4 eval_array,pointer(1),returned_value(1),size,i
      eval = pointer(1)
      return

      entry eval_array(pointer,returned_value,size)
      do i = 1, size
         returned_value(i) = pointer(i)
      enddo
      eval_array = pointer(1)
      return
      end
-------