mirror of
https://github.com/PDP-10/its.git
synced 2026-01-30 21:41:56 +00:00
167 lines
2.7 KiB
Groff
167 lines
2.7 KiB
Groff
;-*- Mode: MIDAS -*-
|
|
TITLE DATSRV ; Net daytime server -- install as DEVICE;TCP SYN015
|
|
|
|
PORT==13. ; Official TCP port for Daytime Server.
|
|
|
|
A=1 ; General use reguster
|
|
B=2 ; "
|
|
C=3 ; "
|
|
D=4 ; "
|
|
DATE=5 ; SIXBIT YYMMDD
|
|
|
|
SEND=<001000,,>
|
|
T=7 ; For use by SEND UUO only
|
|
E=40 ; "
|
|
|
|
NETO==1 ; Output socket
|
|
NETI==2 ; Input socket
|
|
|
|
|
|
LOC 41
|
|
JSR UUOH
|
|
LOC 42
|
|
JSR TSINT
|
|
|
|
LOC 100 ; One page of impure code is all we need
|
|
|
|
DEBUG: 0
|
|
|
|
TSINT: 0 ; Interrupt handler - for fatal conditions
|
|
0
|
|
JSR AUTPSY ; Any interrupt is cause for death.
|
|
|
|
UUOH: 0 ; UUO handler -- send SIXBIT terminated by '@
|
|
MOVEI T,440600 ; SIXBIT byte pointer
|
|
HRLM T,E
|
|
ILDB T,E
|
|
ADDI T,40 ; Convert to ASCII
|
|
.IOT NETO,T ; First uppercase
|
|
.SEND: ILDB T,E
|
|
CAIN T,'@
|
|
JRST 2,@UUOH
|
|
ADDI T,40 ; Convert to ASCII
|
|
CAIL T,"A ; If greater than than A
|
|
ADDI T,40 ; convert to lowercase
|
|
.IOT NETO,T
|
|
JRST .SEND
|
|
|
|
GO: .CALL [ SETZ
|
|
SIXBIT /TCPOPN/
|
|
MOVEI NETI
|
|
MOVEI NETO
|
|
MOVEI PORT
|
|
[-1]
|
|
[-1] ((SETZ))]
|
|
JSR AUTPSY ; Failed (should timeout!)
|
|
MOVEI B,3*30. ; Try for 30 sec
|
|
RETRY: MOVEI A,10.
|
|
.SLEEP A,
|
|
.CALL [ SETZ
|
|
SIXBIT /WHYINT/
|
|
MOVEI NETO
|
|
MOVEM A
|
|
MOVEM A ((SETZ))]
|
|
.LOSE %LSSYS
|
|
CAIE A,%NSOPN
|
|
CAIN A,%NSRFN
|
|
CAIA
|
|
SOJG B,RETRY
|
|
CAIG B,
|
|
JSR AUTPSY ; Timed out...
|
|
SERVE: .RDATE DATE,
|
|
CAMN DATE,[-1]
|
|
JRST [ SEND [SIXBIT /TIME @/]
|
|
SEND [SIXBIT /UNSET@/]
|
|
JRST CRLF ]
|
|
LDB A,[360400,,DATE] ; First digit of year
|
|
IMULI A,10.
|
|
LDB B,[300400,,DATE] ; Second digit of year
|
|
ADD A,B
|
|
IDIVI A,4
|
|
IMULI A,5
|
|
ADD A,B
|
|
LDB C,[140600,,DATE] ; Month
|
|
TLNE DATE,A
|
|
ADDI C,10.
|
|
JUMPN B,.+3
|
|
CAIG C,22
|
|
SOJ A,
|
|
ADD A,MONTAB-1-'0 (C)
|
|
LDB B,[060400,,DATE] ; First digit of day
|
|
IMULI B,10.
|
|
LDB D,[000400,,DATE] ; Second digit of day
|
|
ADD A,D
|
|
ADD A,B
|
|
CAL2: ADDI A,5 ; Century starts on a Saturday
|
|
IDIVI A,7
|
|
SEND WKDAY(B)
|
|
SEND MONTH-1-'0 (C)
|
|
LDB B,[001400,,T]
|
|
ROT B,-14
|
|
TLNN B,170000 ; If date has a leading zero
|
|
TLZ B,600000 ; make it a blank
|
|
IORI B,(SIXBIT /@/)
|
|
SEND B
|
|
.RTIME B,
|
|
LSHC A,2*6
|
|
LSH A,6
|
|
IORI A,':
|
|
LSHC A,2*6
|
|
LSH A,6
|
|
IORI A,':
|
|
HRRI B,(SIXBIT /20@/) ; Century
|
|
SEND A
|
|
HRLZI B,777700 ; Mask YY
|
|
AND B,DATE
|
|
TLO B,'@
|
|
SEND B
|
|
CRLF: .IOT NETO,[15] ; CR
|
|
.IOT NETO,[12] ; LF
|
|
.NETS NETO, ; Force the output.
|
|
.CLOSE NETO, ; Disconnect.
|
|
.CLOSE NETI, ; Disconnect.
|
|
CAIA
|
|
AUTPSY: 0
|
|
SKIPE DEBUG
|
|
.VALUE
|
|
.LOGOUT ; All done
|
|
|
|
CONST:
|
|
CONSTANTS
|
|
|
|
MONTH: SIXBIT/JAN @/
|
|
SIXBIT/FEB @/
|
|
SIXBIT/MAR @/
|
|
SIXBIT/APR @/
|
|
SIXBIT/MAY @/
|
|
SIXBIT/JUN @/
|
|
SIXBIT/JUL @/
|
|
SIXBIT/AUG @/
|
|
SIXBIT/SEP @/
|
|
SIXBIT/OCT @/
|
|
SIXBIT/NOV @/
|
|
SIXBIT/DEC @/
|
|
|
|
MONTAB: 0
|
|
3
|
|
3
|
|
6
|
|
1
|
|
4
|
|
6
|
|
2
|
|
5
|
|
0
|
|
3
|
|
5
|
|
|
|
WKDAY: SIXBIT/MON @/
|
|
SIXBIT/TUE @/
|
|
SIXBIT/WED @/
|
|
SIXBIT/THU @/
|
|
SIXBIT/FRI @/
|
|
SIXBIT/SAT @/
|
|
SIXBIT/SUN @/
|
|
|
|
END GO
|