.TITLE SETTCU .IDENT /02/ ; .MCALL SPRA$S,STOP$S,EXIT$S,ASTX$S,EMBDF$ EMBDF$ ; TCUCSR=160770 ; TCYR: .WORD 0 ;YEAR TCMO: .WORD 0 ;MONTH TCDA: .WORD 0 ;DAY TCHR: .WORD 0 ;HOUR TCMN: .WORD 0 ;MINUTE TCSE: .WORD 0 ;SECOND EMBADD: .WORD 0 ;ADDRESS OF EMB EMBTIM: .WORD 0 ;TIME BUFFER INSIDE EMB ; SETTCU::CALL SETTIM ;START OUT WITH THE CORRECT TIME TST TCDA ;IS TCU INSTALLED AND WORKING? BEQ 10$ ;IF EQ, NO SPRA$S #RESTOR ;SET POWER FAIL RECOVERY STOP$S ;LOWER OUR PRIORITY TO ZIP 10$: EXIT$S ;ALL DONE ; RESTOR: MOV R0,-(SP) ;SAVE MOV R1,-(SP) ; SOME MOV R2,-(SP) ; REGISTERS CALL SETTIM ;RESET TIME AFTER POWER FAIL MOV (SP)+,R2 ;RESTORE MOV (SP)+,R1 ; SOME MOV (SP)+,R0 ; REGISTERS 10$: ASTX$S ;RETURN FROM AST BR 10$ ;IN CASE ASTX IS REJECTED ; ODD:: MOV #RET,(SP) ;RETURN FROM SETTIM IF NO TCU RTI .PAGE SETTIM: CLR TCDA ;ASSUME ERROR CLR EMBADD ;INITIALIZE EMB ADDRESS TST $ERRPT ;ERROR LOGGING? BEQ 5$ ;IF EQ NO CALL $SWSTK,5$ ;GO TO SYSTEM STATE MOV #EC.TIM,-(SP) ;ERROR CODE FOR TIME CHANGE MOV #22.,R1 ;EMB SIZE CALL $ALEB1 ;ALLOCATE AN EMB BCS 4$ ;IF CS NO EMB MOV R1,EMBADD ;SAVE EMB ADDRESS MOV R0,EMBTIM ;TIME BUFFER IN EMB 4$: RETURN ;BACK TO USER STATE 5$: MOV #TCUCSR+6,R0 ;LOAD TCU CSR TSTB (R0) ;IS TIME BEING SET? BEQ RET ;IF EQ, YES MOV -(R0),TCSE ;GET SECONDS MOV -(R0),R1 ;GET HOUR/MINUTE MOV -(R0),R0 ;GET YEAR/MONTH/DAY MOV R1,R2 ;COPY HOUR/MINUTE BIC #177700,R2 ;CLEAN OUT TRASH MOV R2,TCMN ;SAVE MINUTES SWAB R1 ;POSITION HOURS BIC #177740,R1 ;CLEAN OUT TRASH MOV R1,TCHR ;SAVE HOURS MOV R0,R1 ;COPY YR/MO/DA MOV R1,R2 ;DITTO BIC #177740,R2 ;CLEAN OUT TRASH MOV R2,TCDA ;SAVE DAYS ASH #-5,R1 ;POSITION MONTH BIC #177760,R1 ;CLEAN OUT TRASH MOV R1,TCMO ;SAVE MONTH SWAB R0 ;POSITION YEAR ASR R0 ;DITTO BIC #177600,R0 ;CLEAN OUT TRASH MOV R0,TCYR ;SAVE YEARS MOV #TCYR,R0 ;GET READY TO MOVE MOV #$TTNS-14,R1 ; TO EXECUTIVE STORAGE AREA MOV #6.,R2 ;LENGTH OF MOVE MTPS #PR7 ;DISABLE INTERRUPTS 10$: MOV (R0)+,(R1)+ ;;;XFER NEXT WORD TO EXEC SOB R2,10$ ;;;LOOP UNTIL DONE MOV TCMO,R2 ;;;GET MONTH MOVB $DYPMN-1(R2),$TKPS-10 ;;;LOAD DAYS PER MONTH MTPS #0 ;;;ENABLE INTERRUPTS MOV EMBADD,R1 ;GET EMB ADDRESS BEQ RET ;IF EQ NONE THERE MOV EMBTIM,R0 ;BUFFER FOR NEW TIME CALL $SWSTK,RET ;GO TO SYSTEM STATE MOV #TCSE+2,R2 ;AFTER CURRENT SECOND 15$: DEC R2 ;SKIP BYTE MOVB -(R2),(R0)+ ;FILL IN NEW TIME CMP R2,#TCYR ;DONE YET? BHI 15$ ;IF HI NO CALL $QEMB ;QUEUE THE EMB RETURN ;BACK TO USER STATE RET: RETURN ;THE TIME IS NOW SET .END SETTCU