.TITLE SETTCU V3.2 1-JAN-80 .IDENT \01JAN0\ .ENABL LC .REM ! ********************************************************************** TITLE: SETTCU DESCRIPTION: SETTCU is a stand-alone program which runs under RSX-11M V3.2. Its function is to set the date and time for the TCU-100 or TCU-150 battery powered timing control unit. SETTCU gets the correct time and date from RSX-11M. It then sets the TCU-1X0 to the current time. SETTCU will wait the next even minute, and set the TCU-1X0 registers correctly, automatically zeroing the seconds register to synchronize the exact second. USAGE: SETTCU may be used at any time that the TCU-1X0 must be set. It is invoked as follows: >RUN $SETTCU NOTE: This routine can take up to 2 minutes to execute, depending on the RSX-11M clock time when it is run. ********************************************************************** ! .MCALL DIR$,MRKT$,WTSE$,EXIT$S,CALL,RETURN .NLIST CND TCU150=1 ; SET TO 0 IF TCU-100 ; SET TO 1 IF TCU-150 TCUADR=160770 ; ADDRESS OF THE TCU-1X0 ON THE BUS TCUYMD=TCUADR ; ADDRESS OF TCU-1X0 YEAR/MONTH/DAY REGISTER TCUHM=TCUADR+2 ; ADDRESS OF TCU-1X0 HOUR/MINUTE REGISTER TCUFC=TCUADR+4 ; ADDRESS OF TCU-1X0 FAST CLOCK REGISTER TCUSTA=TCUADR+6 ; ADDRESS OF TCU-1X0 STATUS REGISTER DATMSK=100 ; SET DATE MASK TIMMSK=40100 ; SET TIME MASK RDYBIT=200 ; READY BIT .IF NE TCU150 ; RSX-11M DIRECTIVES MARK: MRKT$ 1,0,2 ; MARK TIME n SECONDS WAIT: WTSE$ 1 ; WAIT FOR EVENT FLAG 1 .IFTF .PAGE SETTCU:: .IFT ; CHECK FOR TCU-1X0 READY 1$: BIT #RDYBIT,TCUSTA ; TEST READY BIT IN STATUS REGISTER BNE 3$ ; READY MOV @#TCUFC,@#TCUFC ; STOP FAST CLOCK 2$: MOV #1,R5 ; SET TIMER FOR 1 SECOND CALL TIMER ; WAIT A BIT BR 1$ ; TRY AGAIN 3$: ; GET THE CURRENT RSX-11M TIME MOV #$TTNS-14,R0 ; ADDRESS OF RSX-11M TIME BUFFER MOV (R0)+,R1 ; GET RSX-11M YEAR ASL R1 ; PUT IN POSITION ASL R1 ASL R1 ASL R1 BIS (R0)+,R1 ; GET RSX-11M MONTH ASL R1 ; PUT IN POSITION ASL R1 ASL R1 ASL R1 ASL R1 BIS (R0)+,R1 ; GET RSX-11M DAY MOV (R0)+,R2 ; GET RSX-11M HOUR SWAB R2 ; PUT IN POSITION BIS (R0)+,R2 ; GET RSX-11M MINUTE CMP #59.,R2 ; CHECK FOR LAST MINUTE IN HOUR BEQ 2$ ; WAIT TIL AFTER TRANSITION INC R2 ; ADD A MINUTE TO COMPENSATE FOR SECS SYNC MOV #59.,R5 ; SET SECONDS CONSTANT SUB (R0),R5 ; GET RSX-11M SECONDS BLE 2$ ; TOO CLOSE TO TIME TRANSITION - WAIT INC R5 ; SET TO 0 SECONDS CALL TIMER ; WAIT UNTIL 60TH SEC OF MINUTE ; NOW SET THE TCU-150 MOV #TCUYMD,R0 ; SET TCU-150 YEAR/MONTH/DAY REGISTER CMP (R0),R1 ; DOES IT MATCH? BEQ 4$ ; YES - DON'T BOTHER CALL SET ; SET YEAR/MONTH/DAY 4$: MOV #TCUHM,R0 ; SET TCU-150 HOUR/MINUTE REGISTER MOV R2,R1 ; GET HOURS/MINUTES CALL SET ; SET HOURS/MINUTES EXIT$S ; EXIT TO RSX .PAGE ; SUBROUTINE TO SET AND CHECK A TCU-150 REGISTER .REM ! R0: TCU-150 REGISTER ADDRESS R1: VALUE TO SET ! SET: MOV R1,(R0) ; SET REGISTER - START FAST CLOCK 1$: CMP (R0),R1 ; DOES IT MATCH YET? BNE 1$ ; NO - KEEP LOOKING MOV R1,@#TCUFC ; YES - STOP CLOCK QUICKLY BEFORE IT CHANGES! CMP (R0),R1 ; DOES IT MATCH? BNE SET ; NO - TRY AGAIN RETURN ; SUBROUTINE TO WAIT n SECONDS .REM ! R5: SECONDS COUNT ! TIMER: MOV R5,MARK+M.KTMG ; SET SECONDS COUNT DIR$ #MARK ERROR ; SET WAKE-UP DIR$ #WAIT ERROR ; WAIT RETURN ERROR: BPT ; DIRECTIVE ERROR .IFF MOV #$TTNS-12,R0 ;GET ADR. OF RSX TIME BUFFER ; (AND POINT TO MONTH ENTRY) MOV #TCUADR,R3 ;SET ADR. OF TCU UNIT MOV (R0)+,R1 ;GET MONTH FROM RSX MOV (R0)+,R2 ;SET DAY FROM RSX SWAB R1 ;PUT MONTH IN HIGH ORDER BYTE BIS R2,R1 ;COMBINE MONTH AND DATE BIS #DATMSK,R1 ;SET CONTROL BITS MOV R1,(R3)+ ;SET DATE IN TCU 10$: TSTB TCUSTA ;CHECK STATUS REGISTER FOR DONE BGE 10$ ;LOOP UNTIL READY MOV (R0)+,R1 ;GET HOUR FROM RSX MOV (R0)+,R2 ;GET MINUTE SWAB R1 ;GET HOUR IN HIGH ORDER BYTE BIS R2,R1 ;COMBINE HOURS AND MINUTES BIS #TIMMSK,R1 ;SET CONTROL BITS MOV R1,(R3)+ ;SET TIME IN TCU 20$: TSTB TCUSTA ;CHECK TCU STATUS BGE 20$ ;WAIT UNTIL DONE EXIT$S ;EXIT TO RSX .ENDC .END SETTCU