\ 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 ;