›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››