\ 2006-07-23 EW adv2_timeup.fs

Variable newtimer
Variable lastsec
Variable tickflag
Variable tick
Variable secflag
Variable sec
Variable minflag
Variable min
Variable hourflag
Variable hour
Variable dayflag
Variable day
Variable monthflag
Variable month
Variable yearflag
Variable year
500 Constant cycles.tick \ timerC cycles/tick
2   Constant ticks.sec   \ ticks/second
ram
create MaxDay 31 c, 28 c, 31 c, 30 c, 31 c,
  30 c, 31 c, 31 c, 30 c, 31 c, 30 c, 31 c,
rom

: tickover? ( -- ) newtimer @ timer @ -  0< ;
: leap_year ( year -- f )
  dup 400 mod 0= IF     \ if year%400 == 0
    true                \   -> leap year
  ELSE                  \ else
    dup 100 mod 0= IF   \ if year%100 == 0
      false             \    -> no leap year
    ELSE                \ else
      dup 4 mod 0= IF   \ if year%4   == 0
	true            \    -> leap year
      ELSE              \ else
	false           \    -> no leap year
      ENDIF
    ENDIF
  ENDIF
  swap drop             \ remove year
;
: length_of_month ( year month -- maxday )
  dup 1-                \ array starts at 0
  MaxDay + c@
  swap 2 = IF           \ if month == 2
    swap leap_year IF   \ and leap_year
      1+                \   month += 1
    ENDIF
  ELSE
    swap drop           \ remove year
  ENDIF
;

: timeup ( -- )
  cycles.tick newtimer +!
  1 tickflag !          \ tick over
  1 tick +!
  tick @ ticks.sec >= IF
    0 tick !
    1 secflag !         \ sec over
    1 sec +!
  ENDIF
  sec @ 60 >= IF
    0 sec !
    1 minflag !         \ min over
    1 min +!
  ENDIF
  min @ 60 >= IF
    0 min !
    1 hourflag !        \ hour over
    1 hour +!
  ENDIF
  hour @ 24 >= IF
    0 hour !
    1 dayflag !         \ day over
    1 day +!
  ENDIF
  day @ year @ month @ length_of_month > IF
    1 day !             \ offset 1!
    1 monthflag !       \ month over
    1 month +!
  ENDIF
  month @ 12 > IF
    1 month !           \ offset 1!
    1 yearflag !        \ year over
    1 year +!
  ENDIF
;