( Clock                                      JCB 10:54 11/17/10)

variable seconds
variable minutes
variable hours
variable days
variable months
variable years
variable weekday

: show2 ( a -- ) @ s>d <# # # #> type ;

: setdate ( ud -- )
    [ -8 3600 * ] literal s>d d+
    d# 1 d# 60 m*/mod seconds !
    d# 1 d# 60 m*/mod minutes !
    d# 1 d# 24 m*/mod hours !
    d# 59. d- \ Days since Mar 1 1900
    2dup d# 1 d# 7 m*/mod weekday ! 2drop
    d# 365 um/mod ( days years )
    dup d# 1900 + years !
    d# 4 / 1- - \ subtract leaps ( daynum 0-365 )
    dup d# 5 * d# 308 + d# 153 / d# 2 - months !
    months @ d# 4 + d# 153 d# 5 */ - d# 122 + days !

    home
    'emit @ >r
    ['] vga-bigemit 'emit !

    s" ThuFriSatSunMonTueWed" drop
    weekday @ d# 3 * + d# 3 type cr
    s" MarAprMayJunJulAugSepOctNovDecJanFeb" drop
    months @ d# 3 * + d# 3 type
    space days @ d# 0 .r cr
    years @ . cr

    true if
        hours show2
        minutes show2
        seconds show2
        home
    then

    r> 'emit !
;

: setdelay ( ud -- )
    'emit @ >r
    ['] vga-emit 'emit !
    d# 32 d# 0 vga-at-xy
    s" ntp " type <# # # # [char] . hold #s #> type
    s"  ms " type
    r> 'emit !
;

include ntp.fs

2variable ntp-alarm

: clock-main
    vga-page
    d# 1000000. ntp-alarm setalarm
    begin
        begin
            mac-fullness
        while
            arp-handler
            OFFSET_ETH_TYPE packet@ h# 800 =
            if
                d# 2 OFFSET_IP_DSTIP mac-inoffset mac@n net-my-ip d=
                if
                    icmp-handler
                then
                loader-handler
                ntp-handler
            then

            depth if .s cr then
            mac-consume
        repeat

        ntp-alarm isalarm if
            ntp-request
            d# 1000000. ntp-alarm setalarm
        then

        next?
    until
;