.TITLE SETDTM - SET RT-11 DATE & TIME .SBTTL Introduction, Macros, DATE Storage .ENABL LC ;Completed: 19-MAR-82 R. W. Meister ;Revision 1 02-APR-82 Take System Date if <> File Date ;Revision 2 05-MAY-82 Check Time only once for decisions ;Revision 3 21-MAY-82 Added CHAINing to another .COM file ; ;This is an RT-11 program that is run via STARTx.COM to ; elicit the date and time. When a date is entered, it ; is validated and stored in this program at location ; 0 in block 1. Each time the program is invoked, it ; prints the current date and asks the user to re-enter ; it if it is incorrect. The date enters fields in day, ; month, and year order. After getting the date correct, ; the user is prompted to enter the time. Values enter ; hours, then minutes, then seconds. Any non-numeric ; character may be used as a separator between any of ; the fields for the date or the time, so the user is ; not restricted to the colons for time or the hyphens ; for date. An abbreviated date format allows only ; the changed parameter to be entered, and accepts the ; minimal number of alphabetic characters for the ; month. All values entered for the date or time are ; checked very thoroughly. If the system's date word ; is not equal to the stored date word, the system's ; date word is assumed to be correct. Finally, neither ; the date nor the time will be asked for if the time ; is more than one minute. NOTE: THIS FILE *** MUST *** ; repeat, *** MUST *** RESIDE ON THE SYSTEM DEVICE. ;Unconditional transfer of control .MACRO ...... .ENDM ...... .MCALL .DATE .EXIT .GTIM .LOOKUP .PRINT .PURGE .MCALL .RCTRLO .SDTTM .TTYIN .TTYOU .WRITW DATWRD: .WORD 0 TIMEHI: .WORD 0 TIMELO: .WORD 0 .SBTTL The Main Program Executive START:: .RCTRLO .PRINT #CRLF .GTIM #ARGBLK,#TIMEHI .DATE 10$: MOV R0,RTDATE MOV DATWRD,R0 BNE 20$ CLR TIMEHI CLR TIMELO MOV RTDATE,R0 20$: MOV R0,NEWDAT TST RTDATE BEQ 30$ CMP RTDATE,NEWDAT BEQ 30$ MOV RTDATE,R0 MOV R0,DATWRD MOV R0,NEWDAT BIS #<100000>,DATWRD 30$: CALL PDATE CLR TIMFLG TST RTDATE BEQ 50$ TST TIMEHI BNE 40$ CMP TIMELO,#<3600.> BLOS 50$ 40$: .PRINT #CRLF INC TIMFLG BR 60$ ...... 50$: .PRINT #DTMSG2 CALL GETDAT BCS START CMP R0,NEWDAT BNE 10$ CMP R0,DATWRD BEQ 60$ BIS #<100000>,R0 MOV R0,DATWRD 60$: .GTIM #ARGBLK,#TIMEHI 70$: CALL PTIME TST TIMFLG BNE 140$ .PRINT #DTMSG2 CALL GETTIM BCS 70$ MOV R0,TIMEHI MOV R1,TIMELO 80$: TST DATWRD BPL 90$ BIC #<100000>,DATWRD CALL WRTFIL 90$: .SDTTM #ARGBLK,#DATWRD .IFDF EJUDGE .PRINT #SYSMSG MOV #,R1 100$: CALL GETCHR MOVB R0,(R1)+ CMPB R0,#<12> BNE 100$ CLRB -(R1) CMP R1,# BEQ 130$ MOV #,R1 MOV #<512>,R0 110$: MOVB (R1)+,(R0)+ BNE 110$ DEC R0 MOV #,R1 120$: MOVB (R1)+,(R0)+ BNE 120$ SUB #<512>,R0 MOV R0,@#510 BIS #<4000>,@#44 CLR R0 .EXIT .ENDC 130$: .PRINT #CRLF MOV PC,R0 .EXIT 140$: .PRINT #CRLF MOV #<-1>,TIMEHI BR 80$ ...... .SBTTL Major Subroutines PDATE: TST R0 BEQ 20$ MOV R0,R2 ASL R0 ASL R0 ASL R0 SWAB R0 BIC #<^c37>,R0 MOV R0,DAY MOV R2,R0 SWAB R0 ASR R0 ASR R0 BIC #<^c17>,R0 MOV R0,MONTH MOV R2,R0 BIC #<^c37>,R0 MOV R0,YEAR .PRINT #CRLF ;added .PRINT #DMSG1 CALL PDOFWK MOV DAY,R1 CALL DECMAL .TTYOU #<'-> MOV MONTH,R1 ASL R1 ASL R1 ADD #,R1 .TTYOU (R1)+ MOV #<3>,R2 10$: MOVB (R1)+,R0 BISB #<40>,R0 .TTYOU DEC R2 BNE 10$ MOV YEAR,R1 ADD #<72.>,R1 CALL DECMAL RETURN ...... 20$: .PRINT #BADDAT CLR DAY MOV #<1>,MONTH CLR YEAR RETURN ...... PTIME: .PRINT #TMSG1 MOV TIMEHI,R0 MOV TIMELO,R3 MOV #<-1>,R2 10$: INC R2 SUB #<3600.>,R3 SBC R0 BHIS 10$ ADD #<3600.>,R3 CALL DIV60 CALL DECMAL .TTYOU #<':> MOV R2,R1 CALL DECMAL .TTYOU #<':> MOV R3,R2 CALL DIV60 CALL DECMAL RETURN ...... GETDAT: CLR MSTORE CALL GETCHR CMPB R0,#<12> BEQ DATDUN CLR R1 CALL GETDCX MOV DAY,R2 MOV R1,DAY MOV #,R1 CMPB R0,#<12> BNE 20$ CMP DAY,R2 BGE 30$ INC MONTH CMP MONTH,#<12.> BLE 30$ MOV #<1>,MONTH INC YEAR CMP YEAR,#<99.-72.> BLE 30$ BR DATERR ...... 10$: CALL GETCHR 20$: CMPB R0,#<12> BEQ 30$ CALL CHKNUM BCC 30$ CALL CHKALP BCS 10$ MOVB R0,(R1)+ BR 10$ ...... 30$: CLRB @R1 CMPB R0,#<12> BEQ DATDUN CLR R1 CALL GETDCX SUB #<72.>,R1 MOV R1,YEAR CALL EMPTYB DATDUN: TST YEAR BMI DATERR CMP YEAR,#<99.-72.> BGT DATERR MOV #,R1 MOV MONTH,R0 TSTB @R1 BEQ 40$ MOV #,R0 10$: TSTB @R0 BEQ DATERR CMPB @R1,@R0 BNE 20$ TSTB 1(R1) BEQ 30$ CMPB 1(R1),1(R0) BNE 20$ TSTB 2(R1) BEQ 30$ CMPB 2(R1),2(R0) BEQ 30$ 20$: ADD #<4>,R0 BR 10$ ...... 30$: SUB #,R0 ASR R0 ASR R0 INC R0 MOV R0,MONTH 40$: SWAB R0 ASL R0 ASL R0 ADD YEAR,R0 MOV DAY,R1 BLE DATERR MOV MONTH,R2 DEC R2 MOVB (R2),R2 CMP MONTH,#<2> BNE 50$ BIT #<3>,R0 BNE 50$ INC R2 50$: CMP R1,R2 BGT DATERR SWAB R1 ASR R1 ASR R1 ASR R1 ADD R1,R0 TST (PC)+ DATERR: SEC RETURN ...... GETTIM: CLR HOURS CLR MINS CLR SECS 10$: CALL GETCHR CMPB R0,#<12> BEQ 40$ CALL CHKNUM BCS 10$ CLR R1 CALL GETDCC MOV R1,HOURS CMPB R0,#<12> BEQ 20$ CALL GETDEC MOV R1,MINS CMPB R0,#<12> BEQ 20$ CALL GETDEC MOV R1,SECS CALL EMPTYB 20$: CMP HOURS,#<24.> BGE 30$ CMP MINS,#<60.> BGE 30$ CMP SECS,#<60.> BGE 30$ CLR R0 MOV HOURS,R1 CALL MULT60 ADD MINS,R1 CALL MULT60 ADD SECS,R1 ADC R0 CALL MULT60 TST (PC)+ 30$: SEC RETURN ...... 40$: MOV #<-1>,R0 CLR R1 RETURN ...... PDOFWK: CLR R1 MOV YEAR,R0 BEQ 20$ 10$: DEC R0 BMI 20$ ADD #<365.>,R1 BR 10$ ...... 20$: MOV YEAR,R0 ASR R0 ASR R0 ADD R0,R1 MOV #,R2 CLR R3 MOV MONTH,R0 30$: DEC R0 BEQ 40$ MOVB (R2)+,R3 ADD R3,R1 BR 30$ ...... 40$: BIT #<3>,YEAR BNE 50$ DEC R1 CMP MONTH,#<2> BLE 50$ INC R1 50$: ADD DAY,R1 ADD #<6>,R1 60$: SUB #<7>,R1 BHIS 60$ ADD #<7>,R1 ASL R1 ADD #,R1 .PRINT @R1 .PRINT #DAYEND RETURN ...... .SBTTL Minor Supporting Subroutines DECMAL: MOV #<'0-1>,R0 10$: INC R0 SUB #<10.>,R1 BHIS 10$ .TTYOU ADD #<'0+10.>,R1 .TTYOU R1 RETURN ...... DIV60: MOV #<-1>,R1 10$: INC R1 SUB #<60.>,R2 BHIS 10$ ADD #<60.>,R2 RETURN ...... GETCHR: .TTYIN CMPB R0,#<15> BEQ GETCHR RETURN ...... EMPTYB: CMPB R0,#<12> BEQ OK CALL GETCHR BR EMPTYB ...... GETDEC: CLR R1 NUMLUP: CALL GETCHR CMPB R0,#<12> BEQ OK GETDCX: CALL CHKNUM BCS INVLID GETDCC: ASL R1 MOV R1,-(SP) ASL R1 ASL R1 ADD (SP)+,R1 SUB #<'0>,R0 ADD R0,R1 BR NUMLUP ...... CHKNUM: CMPB R0,#<'0> BLT INVLID CMPB R0,#<'9> BGT INVLID OK: TST (PC)+ INVLID: SEC RETURN ...... CHKALP: CMPB R0,#<'A> BLT INVLID CMPB R0,#<'Z> BGT INVLID BR OK ...... MULT60: ASL R1 ROL R0 ASL R1 ROL R0 MOV R0,-(SP) MOV R1,-(SP) ASL R1 ROL R0 ASL R1 ROL R0 ASL R1 ROL R0 ASL R1 ROL R0 SUB (SP)+,R1 SBC R0 SUB (SP)+,R0 RETURN ...... WRTFIL: .LOOKUP #ARGBLK,#3,#FILNAM BCS LKERR .WRITW #ARGBLK,#3,#DATWRD,#256.,#1 BCS WRERR WRITEX: .PURGE #3 RETURN ...... LKERR: MOV #LKERRM,R0 BR PERR ...... WRERR: MOV #WRERRM,R0 PERR: .PRINT .PRINT #DNSMSG BR WRITEX ...... .SBTTL Messages, Constants, and Buffers FILNAM: .RAD50 /SY SETDTMSAV/ .NLIST BEX MTABLE: .ASCIZ "JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC-" NUMDAY: .BYTE 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. BADDAT: .ASCII "The date has NEVER been set"<200> DMSG1: .ASCII "Today is "<200> TMSG1: .ASCII "The Time is "<200> DTMSG2: .ASCII ". Re-enter if incorrect> "<200> LKERRM: .ASCII "SY:SETDTM.SAV not found"<200> WRERRM: .ASCII "Error Writing SY:SETDTM.SAV"<200> DNSMSG: .ASCII " - unable to preserve DATE" CRLF: .BYTE 0 SUN: .ASCII "Sun"<200> MON: .ASCII "Mon"<200> TUES: .ASCII "Tues"<200> WEDNES: .ASCII "Wednes"<200> THURS: .ASCII "Thurs"<200> FRI: .ASCII "Fri"<200> SATUR: .ASCII "Satur"<200> DAYEND: .ASCII "day, "<200> .IFDF EJUDGE SYSMSG: .ASCII "System> "<200> CHNMS1: .ASCIZ "@SY:" .ENDC .EVEN .LIST BEX DOWTBL: .WORD SUN,MON,TUES,WEDNES,THURS,FRI,SATUR TIMFLG: .WORD 0 DAY: .WORD 0 MONTH: .WORD 0 YEAR: .WORD 0 HOURS: .WORD 0 MINS: .WORD 0 SECS: .WORD 0 NEWDAT: .WORD 0 RTDATE: .WORD 0 MSTORE: ARGBLK: .BLKW 6 .END START