Metropoli BBS
VIEWER: timekeep.src MODE: TEXT (ASCII)
%%HP: T(3);
DIR

  CDP       @ Clock Data Put
\<< \-> V L \<< 'CLKDAT' L V PUT \>> \>>

  CDG       @ Clock Data Get
\<< 'CLKDAT' SWAP GET \>>

  PA        @ PreAmble
\<< RCLF 64 STWS 2 CDG TICKS 1 CDG - OVER - B\->R \>>

  AO        @ Alarm Object
\<< IFERR DROP PATH :&: JOB RCL EVAL EVAL THEN ERRM END OFF \>>

  RESET     @ Reset Reference Time
\<< TICKS 1 CDP 0 2 CDP \>>

  CLKDAT    @ Clock Data
{ #0 0 0 }

  CANCEL    @ Cancel Alarm
\<< RCLF -55 SF IFERR 1 \-> I \<< WHILE I RCLALARM IF 3 GET 'AO'
RCL SAME THEN I DELALARM 1 ELSE 'I' INCR END REPEAT END \>> THEN
END STOF \>>

  SCHEDULE           @ Schedule Alarm
\<< CANCEL PATH HOME IF :&: JOB VTYPE 0 < THEN DUP 'KICK' +
:&: JOB STO END EVAL DATE 1 DATE+ 4 'AO' RCL 707788800 4 \->LIST
STOALARM DROP \>>

  EXACT     @ Compute Accuracy Factor
\<< PA / 3 CDP STOF \>>

  ADJC      @ Adjust Clock
\<< DUP 2 CDG + 2 CDP CLKADJ \>>

  ADJT      @ Adjust Time
\<< 1_s CONVERT UVAL 8192 * DUP 1 CDG + 1 CDP CLKADJ \>>

  KICK      @ Kick Clock
\<< PA 3 CDG * 0 RND SWAP - ADJC STOF \>>

END
[ RETURN TO DIRECTORY ]