! Clock process

option  "-low"
include  "moose:mouse.inc"

externalintegerfnspec  free store

recordformat  clockreqfm (record (messagefm) msg,
                          Integer  ms)

ownrecord (mailboxfm)   clock
ownrecord (semaphorefm) server

Begin 
   record (queuefm)              q
   record (clockreqfm)name       m
   record (interrupthandlerfm)   ih
   integer  now,i,count=0
   label  x
   record (dictfm)name  e

   putstring("Clock process started: ");  put long(free store);  putsym(10)

   setup semaphore (server)
   setup mailbox (clock,server)

   e == poa_logdict
   e == e_alt while  e_alt ## nil

   i = Make Entry ("CLOCK_REQ",e)
   if  i = 0 start   
      Putstring("Clock process failed to add CLOCK_REQ");putsym(10)
      Stop 
   Finish 
   integer (i) = addr(clock)

   setup queue(q)
   setup interrupt handler (ih, addr(x))
   add interrupt handler(ih,6)
   cycle 
      semaphorewait(server)
      signalsemaphore(server)
      m == receivemessage(clock)
      if  m==nil start 
         semaphorewait(server)
         if  count>0 start 
            now = realtime
            i = 0
            cycle 
               i = i+1
               m == dequeue(q)
               if  m_ms<=now start 
                  sendmessage(m,m_msg_reply,nil)
                  count = count-1
               else 
                  enqueue(m,q)
               finish 
            repeatuntil  i>=count
         finish 
      elseif  m_ms<=realtime
         sendmessage(m,m_msg_reply,nil)
      else 
         enqueue(m,q); count = count+1
      finish 
   repeat 
x:
   intsignalsemaphore(server)
   returnfrominterrupt
end