record  format  parmf(integer  dest, srce, p1, p2, p3, p4, p5, p6)
external  routine  spec  dpon(record  (parmf) name  p)
external  routine  spec  dpoff(record  (parmf) name  p)
system  routine  spec  signal(integer  ep, p1, p2, integer  name  flag)
const  long  integer  int mask= x'03E2000A03E2000A'; ! INT: A,C,Q,V,W,X,Y,a,c,q,v,w,x,y
system  routine  spec  reroutecontingency(integer  ep, class, long  integer  mask,
    routine  ontrap, integer  name  flag)

external  routinespec  tim(string (255) s)
external  routine  spec  documents(string  (255) s)
external  routine  spec  ddelay(integer  seconds)
external  routine  spec  nrstrg(stringname  s)
external  routine  spec  bel(string  (255) s)
external  routine  spec  define(string (255) s)
external  routine  spec  clear(string (255) s)



include  "CONLIB.VVP_VVPSPECS"



record  format  tmodef(half  integer  flags1, flags2,  {.04} byte  integer  promptchar, endchar,
     {.06} byte  array  breakbit1(0:3) {%or %halfintegerarray BREAKBIT2(0:1))},
     {.0A} byte  integer  pads, rptbuf, linelimit, pageleng,
     {.0E} byte  integer  array  tabvec(0:7),  {.16} byte  integer  cr, esc, del, can, sp1, sp2,
    sp3, sp4, sp5, sp6)
   {length of this format is X20 bytes}

record  format  uinff(string  (6) user, string  (31) jobdocfile,  {.28} integer  mark, fsys,
     {.30} procno, isuff, reason, batchid,  {.40} sessiclim, scidensad, scidens, startcnsl,
     {.50} aiostat, sct date, sync1 dest, sync2 dest,  {.60} async dest, aacct rec, aic revs,
     {.6C} string  (15) jobname,  {.7C} string  (31) basefile,  {.9C} integer  previc,
     {.A0} itaddr0, itaddr1, itaddr2, itaddr3,  {.B0} itaddr4, stream id, dident, scarcity,
     {.C0} preemptat, string  (11) spoolrfile,  {.D0} integer  funds, sesslen, priority, decks,
     {.E0} drives, part close,  {.E8} record  (tmodef) tmodes,  {108} integer  pslot,
     {10C} string  (63) itaddr,  {14C} integer  array  fclosing(0:3), integer  clo fes,
     {160} integer  output limit, dapsecs, long  integer  dapinstrs,  {170} integer  out,
    string  (15) outname,  {184} integer  hiseg, integer  uend)
const  record  (uinff) name  uinf=9<<18
const  integer  every= 1
const  integer  after= 2

const  integer  clock dact=5 {arbitrary}
constinteger  clockx=1
owninteger  type=0

routine  kick at(integer  seconds, dact, every or after, info)
! Param EVERY OR AFTER should be  1  for every SECONDS seconds, or CANCEL
!                             or  2  for after SECONDS second.
! If SECONDS is -1, then it's a "cancel" request.
record  (parmf) p
   p=0
   p_dest=X'A0000'!every or after
   p_p1=uinf_sync1 dest!dact
   p_p2=seconds
   p_p3=info {returned in P_P1}
   dpon(p)
end ; ! KICK AT

routine  ontrap(integer  class, subclass)
integer  flag
integer  array  aa(0:31)
   kick at(-1 {cancel}, clock dact, after, 9 {info})
   if  type=clock then  vv define triggers(0, 0, 0)
   signal(3, class, subclass, flag); ! Get the Subsystem to do the rest
end ; ! of ONTRAP

external  routine  alive(string  (255) s)
integer  flag, secs, count
string (127) aa, bb
record  (parmf) p
   type=0
   secs=10{mins}*60; count=0
   reroutecontingency(3, 65, int mask, ontrap, flag); ! Catch INT: messages
   cycle 
      count=count+1
      kick at(secs, clock dact, after, 0)
      dpoff(p)
      tim("")
   repeat 
end  {alive}

external  routine  clock(string  (255) s)
constinteger  inside wid=8, inside dep=3
integer  start line, start col, outer, i
routine  spec  draw box
integer  flag, secs, count
string (127) aa, bb
record  (parmf) p
   start line=12-inside dep//2-1
   start col=40-inside wid//2-1
   secs=30; count=0
   reroutecontingency(3, 65, int mask, ontrap, flag); ! Catch INT: messages
   vv init(flag); return  if  flag#0
   vv define triggers(1, 0, 0)
   type=clockx
   draw box
   cycle 
      count=count+1
      kick at(secs, clock dact, after, 0)
      dpoff(p)
      vv goto(start col+inside wid//1-3, start line+inside dep//2+1)
      vv printstring(timex)
      vv update screen
   repeat 
routine  draw box
   vv goto(start col, start line)
   for  outer=1, 1, 2 cycle 
   for  i=1, 1, inside wid+2 cycle 
      vv printstring("*")
   repeat 
   exit  if  outer=1
   for  i=1, 1, inside wid cycle 
      vv printstring("*"); vv spaces(inside wid); vvprintstring("*")
   repeat 
   repeat 
end  {draw box}
end  {clock}

end  of  file