.TITLE TIMSRV Time server .NLIST BEX .ENABL LC ; ; Pdp11/dcn - time server ; ; This program is an internet time server compatible with rfc-868. ; ; External symbols ; .GLOBL GETPKT,SNDPKT,FREPKT ;utility routines .GLOBL OPNBLK ;connection block ; ; Entry symbols ; .GLOBL TIMREQ ;time request ; ; System definitions ; .ASECT .MCALL .COM,.CHR ;dcnlib definitions .MCALL .GDAT,.GCLK ;dcnlib macros .MCALL $DFIH,$DFUH,$DFSIG ;moslib definitions .MCALL DFCON,CALL,FORMAT ;netlib macros .COM ;define common data .CHR ;define ascii character codes $DFIH ;define internet header $DFUH ;define user datagram header $DFSIG ;define interprocess signals DFCON ;define connection block ; .PSECT $BOSI,RO,I ; ; Time request ; R0 = udp length, r1 = packet pointer, r2 = udp header pointer ; TIMREQ: JSR PC,FREPKT ;free packet buffer ; FORMAT #COM80 ;time request from [host] JSR PC,JULIAN ;get julian time BCS 1$ ;branch if unsynchronized MOV R0,TIME MOV R1,TIME+2 JSR PC,GETPKT ;get reply packet BCS 1$ ;branch if cant MOV R1,R2 ;construct pointers ADD PH.OFS(R2),R2 MOV R2,R0 ADD #UH.LEN,R0 MOV TIME,@R0 SWAB (R0)+ MOV TIME+2,@R0 SWAB (R0)+ SUB R2,R0 JSR PC,SNDPKT 1$: RTS PC ; ; Julian (jul) read julian clock ; Returns r0-r1 = julian (rfc-868) clock (seconds past 1 January 1900) ; JULIAN: MOV R2,-(SP) ;save MOV R3,-(SP) .GDAT ;get date (days past 1 January 1972) CMP R0,#140000 ;is clock synchronized BHIS 3$ ;branch if no BIC #140000,R0 ;yes. convert to day-seconds MUL #21600.,R0 ;(60*60*24/4) ASHC #2,R0 ;(4) MOV R0,-(SP) MOV R1,-(SP) .GCLK ;get time (milliseconds past 0000) ADD #500.,R1 ;(round off to nearest second) ADC R0 CLR R2 ;convert to seconds MOV #33.,R3 1$: ROL R2 ADD #-1000.,R2 BCS 2$ SUB #-1000.,R2 2$: ROL R1 ROL R0 DEC R3 BNE 1$ ADD (SP)+,R1 ;add day-seconds ADC R0 ADD (SP)+,R0 ADD #58752.,R1 ;(2,272,060,800) 0000 1 january 1972 ADC R0 ADD #34668.,R0 CLC ;normal return BR 4$ ; 3$: SEC ;error return 4$: MOV (SP)+,R3 ;evas MOV (SP)+,R2 RTS PC ; ; Data segment ; .PSECT $BOSD,RO,D ; ; Text strings ; COM80: .ASCIZ '?UDP-I-Time request ^C' .EVEN ; .PSECT $ERAS,RW,I ; ; Variables ; TIME: .BLKW 2 ;date/time .EVEN ; .END