.TITLE DATE AND TIME TEST .ENABL LC .NLIST BEX .MCALL .PRINT,.DATE,.GTIM,.SDTTM,.EXIT,.GTLIN,.GVAL CLK50$=40 ; MASK FOR 50-HZ CLOCK BIT IN CONFIG WORD ; GET DATE AND TIME INTO STRING DATE2. START: CLR REPEAT ; CLEAR RE-DISPLAY FLAG MOV #3600.*50.,HOURLO ; STORE CONSTANTS FOR 50 HZ CLOCK MOV #2,HOURHI ; DP 3600*50 MOV #60.*50.,MINTKS ; NO OF TICKS/MINUTE MOV #50.,SECTKS ; AND PER SECOND .GVAL #AREA,#300 ; BUT GET CONFIGURATION WORD AT OFFSET 300 BIT #CLK50$,%0 ; IS IT A 50HZ CLOCK BNE AGAIN ; YES, KEEP VALUES MOV #3600.*60.,HOURLO ; NO, CHANGE TO 60HZ VALUES INC HOURHI MOV #60.*60.,MINTKS MOV #60.,SECTKS AGAIN: .GTIM #AREA+4,#AREA ; GET SEC PAST MIDNIGHT *50 CLR %1 ; HOURS COUNTER MOV AREA+2,%3 ; %3=L.O. COUNT MOV AREA,%2 ; %2=H.O. HOURLP: CMP %2,HOURHI ; D.P. COMPARE BLT GOTHR ; HIGH ORDER BNE INCHR ; IF EQUAL, MUST TEST CMP %3,HOURLO ; LOW ORDER BLO GOTHR ; OF 3600*50(60) INCHR: INC %1 ; INC HOUR SUB HOURLO,%3 ; SUBTRACT L.O. OF SBC %2 ; DOUBLE PRECISION SUB HOURHI,%2 ; HIGH ORDER OF BR HOURLP GOTHR: JSR %5,DEC2 ; FOUND HOUR IN %1 HOURS ; CONVERT IT DIV MINTKS,%2 ; (%3)(%2)=MINS TICKS MOV %2,%1 ; QUOTIENT=MINS JSR %5,DEC2 ; CONVERT IT MINS CLR %2 DIV SECTKS,%2 ; REMAINDER=SECS*50(60) MOV %2,%1 ; QUOTIENT=SECS JSR %5,DEC2 ; CONVERT IT SECS ; NOW THE DATE .DATE ; IN %0 MOV %0,%1 ; COPY DATE BIC #177740,%1 ; GET YEAR ADD #72.,%1 ; PAST 1972 JSR %5,DEC2 ; CONVERT TO STRING YEAR MOV %0,%1 ASH #-5,%1 ; GET DAY BIC #177740,%1 ; IN %1 JSR %5,DEC2 ; CONVERT IT DAY ASH #-10.,%0 ; GET MONTH MOV %0,%1 ; COPY IT JSR %5,DEC2 MONTH .PRINT #DATE2 TST REPEAT ; SECOND TIME THROUGH? BEQ SETTIM ; NO, SET NEW TIME .EXIT ; YES, DONE ; GET NEW DATE AND TIME SETTIM: .GTLIN #INBUF,#NEWHR ; GET NEW HOUR JSR PC,GETNO MOV %1,NEWDTM+2 ; -VE? BMI 20$ ; YES, STORE -1 TO KEEP CURRENT TIME, JUST DO DAY MUL #60.,%1 ; CONVERT HOURS TO MINUTES MOV %1,-(SP) ; (SINGLE-PRECISION), AND SAVE .GTLIN #INBUF,#NEWMIN ; GET NEW MINUTE JSR PC,GETNO ADD (SP)+,%1 ; ADD IN HOURS*60 MOV %1,%0 ; COPY TO AN EVEN REGISTER MUL MINTKS,%0 ; CONVERT TO TICKS (DP) MOV %0,NEWDTM+2 ; STORE HIGH ORDER MOV %1,NEWDTM+4 ; THEN LO .GTLIN #INBUF,#NEWSEC ; REPEAT FOR SECONDS JSR PC,GETNO MUL SECTKS,%1 ; CONVERT TO TICKS ADD %1,NEWDTM+4 ; ADD TO NEW TIME ADC NEWDTM+2 20$: .GTLIN #INBUF,#NEWYR ; GET YEAR JSR PC,GETNO MOV %1,NEWDTM ; STORE AND TEST NUMBER GIVEN BMI 30$ ; -VE (-1) MEANS KEEP CURRENT DATE SUB #72.,%1 ; +V1 IS GIVEN VALUE, RELATIVE TO 1972 MOV %1,NEWDTM ; STORE .GTLIN #INBUF,#NEWMTH ; REPEAT FOR MONTH JSR PC,GETNO ASH #10.,%1 ; TO APPROPRIATE BITS BIS %1,NEWDTM ; STORE .GTLIN #INBUF,#NEWDAY ; AND DAY JSR PC,GETNO ASH #5,%1 ; PUT IN APPROPRIATE BITS BIS %1,NEWDTM ; COMPLETE NEW TIME 30$: .SDTTM #AREA,#NEWDTM ; SET IT INC REPEAT ; SAY OUTPUT BEING REPEATED JMP AGAIN ; GO SHOW NEW TIME ; CONVERT 2-DIGIT STRING IN INBUF TO DECIMAL NO IN %1 GETNO: MOVB INBUF,%0 ; GET DIGIT CMPB %0,#'- ; IF IF'S A - SIGN BNE 10$ MOV #-1,%1 ; RETURN -1 RTS PC 10$: SUB #'0,%0 ; CONVERT DIGIT TO BINARY MUL #10.,%0 ; THAT'S THE TENS MOVB INBUF+1,%0 ; GET UNITS SUB #'0,%0 ; IN BINARY ADD %0,%1 ; ADD IN UNITS RTS PC ; AND RETURN ; CONVERT A NO <=99. IN %1 TO A 2-CHAR STRING AT PARAMETER. DEC2: MOV %0,-(SP) ; SAVE %0 MOV %1,-(SP) ; & %1 MOV %2,-(SP) ; & %2 CLR %0 DIV #10.,%0 ; %0:=MSD, %1:=LSD ADD #'0,%0 ; CONVERT TO ASCII ADD #'0,%1 MOV (%5)+,%2 MOVB %0,(%2)+ ; COPY M.S.D. MOVB %1,@%2 ; & L.S.D. MOV (SP)+,%2 ; RESTORE STACK MOV (SP)+,%1 MOV (SP)+,%0 RTS %5 ; RETURN DATE2: .ASCII "Date " YEAR: .ASCII " -" MONTH: .ASCII " -" DAY: .ASCII " Time " HOURS: .ASCII " :" MINS: .ASCII " :" SECS: .ASCIZ " " NEWHR: .ASCII "Enter new time (-1 to leave unchanged)"<15><12>"Hour = "<200> NEWMIN: .ASCII "Minute = "<200> NEWSEC: .ASCII "Second = "<200> NEWYR: .ASCII "Enter new date (-1 to leave unchanged)"<15><12>"Year = "<200> NEWMTH: .ASCII "Month = "<200> NEWDAY: .ASCII "Day = "<200> .EVEN HOURHI: .BLKW 1 HOURLO: .BLKW 1 MINTKS: .BLKW 1 SECTKS: .BLKW 1 AREA: .BLKW 4 REPEAT: .BLKW 1 NEWDTM: .BLKW 3 INBUF: .BLKB 80. .END START