›MODULE ; TIME.ACT››; copyright (c) 1984›; Action Computer Services›; All Rights Reserved››; last modified February 8, 1984››; assumes already declared:›;BYTE ARRAY buf(256)›;DEFINE JIFFIES="285" ; jiffies/hour›;DEFINE JPD="$0" ; jiffies/day < 24››; NOTE: routines don't work past 1999›; JIFFIES and JPD must be positive››TYPE TIME =›[›  BYTE T_DAY, T_MONTH, T_YEAR›  BYTE T_HOUR, T_MIN, T_SEC›]› ›TIME tod, ; time of day›     dt   ; delta time››BYTE ARRAY RTC(0)=$12›››BYTE FUNC GetVal(BYTE i)›RETURN((buf(i)-'0)*10+buf(i+1)-'0)›››PROC PrintND(BYTE dev, n)›  PutD(dev, (n/10)+'0)›  PutD(dev, (n MOD 10)+'0)›RETURN›››PROC PrintTime(BYTE dev  TIME POINTER t)›  PrintND(dev, t.T_HOUR)›  PutD(dev, ':)›  PrintND(dev, t.T_MIN)›  PutD(dev, ':)›  PrintND(dev, t.T_SEC)›RETURN›››CARD FUNC Div60(CARD POINTER t)›  BYTE odd, remainder=$86›  CARD res››  res = t^›  odd = res & 1›  res = res RSH 1›  res = res / 30›  remainder = remainder LSH 1›  t^ = remainder + odd›RETURN(res)›››PROC UpdateTime()›  CARD ticks›  BYTE t_lo=ticks, t_hi=ticks+1›  BYTE th, d, days, month›  CARD h, m, s, dh›  BYTE ARRAY mdays(0)=[0 31 28 31 30›    31 30 31 31 30 31 30 31]››  t_lo = RTC(2)›  h = tod.T_HOUR›  m = tod.T_MIN›  s = tod.T_SEC›  WHILE RTC(2)=t_lo DO OD›  th = RTC(0)  RTC(0) = 0›  t_hi = RTC(1)  RTC(1) = 0›  t_lo = RTC(2)›  s = s + Div60(@ticks)›  RTC(2) = ticks››  IF th#0 THEN ; oops, we blew it›    m = m + th*18›    s = s + (th*184 + 7)/15›  FI››  IF s>59 THEN m = m + Div60(@s) FI››  IF m>59 THEN›    dh = Div60(@m)›  ; delta time offset to adjust for›  ; different clocks›    ticks = JIFFIES*dh›    s = s + Div60(@ticks)›    RTC(2) ==+ ticks›    IF s>59 THEN›      WHILE s>59 DO›        s ==- 60›        m == +1 ›      OD›      WHILE m>59 DO›        m ==- 60›        h == +1 ›      OD›    FI›    h = h + dh›    IF h>23 THEN›      d = h/24›      RTC(2) ==+ JPD*d›      h = h MOD 24›      tod.T_DAY ==+ d›      month = tod.T_MONTH›      days = mdays(month)›      IF month=2 AND›         (tod.T_YEAR & $3)=0 THEN›        days = 29 ; leap year›      FI›      IF tod.T_DAY>days THEN›        tod.T_DAY ==- days›        tod.T_MONTH ==+ 1›        IF tod.T_MONTH>12 THEN›          tod.T_MONTH ==- 12›          tod.T_YEAR ==+ 1›        FI›      FI›    FI›  FI›  tod.T_HOUR = h›  tod.T_MIN = m›  tod.T_SEC = s›RETURN›››CARD FUNC DeltaDays(TIME POINTER t)›; return # days since Jan. 1, 1984›  BYTE dy, month›  CARD ddays›  CARD ARRAY mdays=[0 0 31 59 90›    120 151 181 212 243 273 304 334]››  dy = t.T_YEAR - 84›  ddays = 365*dy + ((dy + 3) RSH 2)››  month = t.T_MONTH›  IF month>2 AND (dy & $3)=0 THEN›    ddays ==+ 1 ; leap year›  FI›RETURN(ddays+mdays(month)+t.T_DAY-1)›››CARD FUNC DeltaTime(TIME POINTER t)›; returns delta time in dt›; delta days as result ›  BYTE c›  CARD dtod, ddays›  BYTE dd_hi=ddays+1››  UpdateTime()››  dt.T_SEC = tod.T_SEC - t.T_SEC›  c = 0›  IF dt.T_SEC>127 THEN›    c = 1›    dt.T_SEC ==+ 60›  FI››  dt.T_MIN = tod.T_MIN - t.T_MIN - c›  c = 0›  IF dt.T_MIN>127 THEN›    c = 1›    dt.T_MIN ==+ 60›  FI››  dt.T_HOUR = tod.T_HOUR - t.T_HOUR - c›  c = 0›  IF dt.T_HOUR>127 THEN›    c = 1›    dt.T_HOUR ==+ 24›  FI››  dtod = DeltaDays(tod)›  ddays = dtod - DeltaDays(t) - c›  dt.T_DAY = ddays›  dt.T_MONTH = dd_hi›RETURN(ddays)›››BYTE FUNC DayOfWeek(TIME POINTER t)›RETURN(DeltaDays(t) MOD 7)›››PROC PrintDate(BYTE dev  TIME POINTER t)›  BYTE dow›  CARD ARRAY day(7), month(13)››  day(0) = "Sunday"›  day(1) = "Monday"›  day(2) = "Tuesday"›  day(3) = "Wednesday"›  day(4) = "Thursday"›  day(5) = "Friday"›  day(6) = "Saturday"››  month(1) = "January"›  month(2) = "February"›  month(3) = "March"›  month(4) = "April"›  month(5) = "May"›  month(6) = "June"›  month(7) = "July"›  month(8) = "August"›  month(9) = "September"›  month(10) = "October"›  month(11) = "November"›  month(12) = "December"››  PrintTime(dev, t)›  PrintD(dev, "  ")›  dow = DayOfWeek(t)›  PrintD(dev, day(dow))›  PrintD(dev, ", ")›  PrintD(dev, month(t.T_MONTH))›  PutD(dev, ' )›  IF t.T_DAY>9 THEN›    PutD(dev, t.T_DAY/10+'0)›    PutD(dev, t.T_DAY MOD 10+'0)›  ELSE›    PutD(dev, t.T_DAY+'0)›  FI›  PrintD(dev, ", 19")›  PrintND(dev, t.T_YEAR)›  PutDE(dev)›RETURN›››PROC ZeroRTC()›  BYTE tick››  tick = RTC(2)›  WHILE RTC(2)=tick DO OD›  RTC(0) = 0›  RTC(1) = 0›  RTC(2) = 0›RETURN›› ›PROC SetTime()›  BYTE in››  DO›    Print("Enter date MM/DD/YY - ")›    InputS(buf)›    IF buf(0)=0 THEN ; for testing›      tod.T_MONTH = 2›      tod.T_DAY = 8›      tod.T_YEAR = 84›      tod.T_HOUR = 23›      tod.T_MIN = 57›      tod.T_SEC = 00›      ZeroRTC()›    ELSE›      tod.T_MONTH = GetVal(1)›      tod.T_DAY = GetVal(4)›      tod.T_YEAR = GetVal(7)›      Print("Enter time HH:MM:SS - ")›      InputS(buf)›      ZeroRTC()›      tod.T_HOUR = GetVal(1)›      tod.T_MIN = GetVal(4)›      tod.T_SEC = GetVal(7)›    FI››    PutE()  PrintDate(0, tod)›    PutE()  Print("OK? ")›    in = GetD(7)  Put(in)›    IF in=$9B THEN EXIT FI›    PutE()›  UNTIL (in % $20)='y OD›RETURN››MODULE ; just in case››