.TITLE PROMPT USER FOR DATE AND TIME .CSECT STDTTM .MCALL .DATE,.PRINT,.TTYIN,.SDTTM,.SETTOP,.EXIT .GLOBL JTIME STDTTM:: .DATE ;GET CURRENT DATE TST R0 ;ANY DATE SET? BEQ GETDAT ;IF NOT, BRANCH JMP QUIT ;IS DATE ALREADY SET, RETURN GETDAT: .PRINT #DATMSG ;ASK FOR DATE CALL GETNUM ;GET THE DAY OF THE MONTH MOV R2,DAY ;STORE IT CMP R0,#55 ;DASH? BNE SKIPLN ;IF NOT, BRANCH MOV #MONTH,R2 ;LOAD ADDRESS MOV #3,R3 ;3 CHARACTERS 2$: .TTYIN ;GET A CHARACTER CMP R0,#'A ;ALPHABETIC? BLT SKIPLN ;IF NOT, BRANCH CMP R0,#'Z BGT SKIPLN MOVB R0,(R2)+ ;SAVE THIS CHARACTER SOB R3,2$ ;COUNT LOOP .TTYIN ;GET NEXT CHARACTER CMP R0,#55 ;DASH? BNE SKIPLN ;IF NOT, BRANCH CALL GETNUM ;GET THE YEAR CMP R0,#15 ;CARRIAGE RETURN? BNE SKIPLN ;IF NOT, BRANCH CMP R2,#72. ;<72? BLT SKIPLN ;IF SO, BRANCH CMP R2,#99. ;>99? BGT SKIPLN ;IF SO, BRANCH MOV R2,YEAR ;STORE YEAR MOV #MONTHS+33.,R1 ;POINT TO NAME OF MONTH 12 MOV #12.,R2 ;12 MONTHS 5$: MOV R1,R3 ;SAVE PTR MOV #3,R4 ;3 CHARACTERS/NAME MOV #MONTH,R5 ;POINT TO MONTH 6$: CMPB (R3)+,(R5)+ ;IS THIS THE MONTH? BNE 7$ ;IF NOT, BRANCH SOB R4,6$ ;COUNT LOOP BR 10$ ;ITS A MATCH! 7$: SUB #3,R1 ;CHECK ANOTHER MONTH SOB R2,5$ ;COUNT LOOP BR SKIPLN ;FALL THRU IS A FAILURE 10$: MOV R2,MO ;STORE MONTH # ASL R2 ;*2 FOR TABLE OFFSET MOV DAYS-2(R2),R5 ;GET # DAYS IN THAT MONTH CMP R2,#4 ;FEBRUARY? BNE 11$ ;IF NOT, BRANCH BIT #3,YEAR ;LEAP YEAR? (DIVISIBLE BY FOUR) BNE 11$ ;IF NOT, BRANCH INC R5 ;THIS IS A LEAP YEAR! 11$: CMP DAY,R5 ;DAY OF MONTH TOO LARGE? BLE ENDLN ;IF NOT, BRANCH SKIPLN: CALL READLN ;SKIP TO END OF LINE JMP GETDAT ;TRY, TRY AGAIN ; ; ROUTINE TO FLUSH TO THE END OF LINE READLN: CMP R0,#12 ;LINE FEED? BEQ 9$ ;IF SO, BRANCH .TTYIN ;GET NEXT CHARACTER BR READLN ;LOOP 9$: RETURN ; ENDLN: CALL READLN ;SKIP TO END OF LINE ; GETTIM: .PRINT #TIMMSG ;ASK FOR TIME CALL GETNUM ;GET THE HOUR CMP R0,#72 ;COLON? BNE ENDLN ;IF NOT, BRANCH CMP R2,#23. ;0 <= HOUR <= 23 ? BGT ENDLN ;IF NOT, BRANCH MOV R2,HOUR ;STORE HOUR CALL GETNUM ;GET MINUTE CMP R2,#59. ;0 <= MINUTE <= 59 ? BGT ENDLN ;IF NOT, BRANCH MOV R2,MIN ;STORE MINUTE CLR SEC ;SEC=0 CLR TICK ;CLOCK TICKS=0 CMP R0,#15 ;CARRIAGE RETURN? BEQ GOTTEN ;IF SO, BRANCH CMP R0,#72 ;COLON? BNE ENDLN ;IF NOT, BRANCH CALL GETNUM ;GET SECONDS CMP R0,#15 ;CARRIAGE RETURN? BNE ENDLN ;IF NOT, RETURN CMP R2,#59. ;0 <= SECOND <= 59 ? BGT ENDLN ;IF NOT, BRANCH MOV R2,SEC ;STORE SECONDS GOTTEN: MOV MO,R0 ;LOAD MONTH ASH #5,R0 ;SHIFT R0 LEFT 5 BIS DAY,R0 ;INSERT DAY ASH #5,R0 ;SHIFT R0 LEFT 5 MOV YEAR,R1 ;LOAD YEAR SUB #72.,R1 ;RT-11 YEAR IS MOD 1972 BIS R1,R0 ;INSERT YEAR MOV R0,DATTIM ;SAVE RT-11 DATE FOR .SDTTM MOV #JTMBLK,R5 ;LOAD PARM BLOCK ADDRESS CALL JTIME ;CONVERT HR,MIN,SEC,TICK TO RT-11 TIME .SDTTM #AREA,#DATTIM ;SET DATE AND TIME QUIT: .SETTOP #0 ;QUIT GRACEFULLY .EXIT ;RETURN TO RT-11 ; ROUTINE TO READ A NUMBER FROM CONSOLE ; GETNUM: CLR R2 ;NUMBER RETURNED IN R2 1$: .TTYIN ;GET A CHARACTER CMP R0,#'0 ;IS CHARACTER NUMERIC? BLT 9$ ;IF NOT, BRANCH CMP R0,#'9 BGT 9$ SUB #'0,R0 ;CONVERT TO BINARY ASL R2 ;R2=R2*10+R0 MOV R2,R3 ASL R2 ASL R2 ADD R3,R2 ADD R0,R2 BR 1$ ;LOOP 9$: RETURN ; DATA AREA ; .NLIST BEX ;DON'T LIST BINARY EXTENSIONS AREA: .BLKW 5 DATTIM: .BLKW 3 YEAR: .BLKW 1 MO: .BLKW 1 DAY: .BLKW 1 HOUR: .BLKW 1 MIN: .BLKW 1 SEC: .BLKW 1 TICK: .BLKW 1 JTMBLK: .WORD 5,HOUR,MIN,SEC,TICK,DATTIM+2 DAYS: .WORD 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. MONTH: .BLKB 3 MONTHS: .ASCII /JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC/ .ENABL LC DATMSG: .ASCII /Enter date (dd-mmm-yy): /<200> TIMMSG: .ASCII /Enter time (hh:mm:ss): /<200> .END STDTTM