! 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
