.TITLE SERVER Datacommunication JOB uses XF (no RSP protocol) ;*********************************************************************** ; ; Handler: * XF.MAC == ( DR(V)-11 C/K, WB(V)-11 ) * ; Terminate job: 2 * ^C ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; ; COPYRIGHT (c) 1986 by ; ; H.H. Klin. Neuro. AZG ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; SPDIR = 0 ;Special Directory (e.g. Magtape) support enabled for SPDIR=1 TEST = 0 ;1=enable test printout: ; NOTE on LINK command: ; IF (TEST) THEN ; SERVER = SY:CNV,DK:SERVER ; ELSE ; SERVER = SERVER,SY:CNV ! CNV only used at start, put in buffer! ; ENDIF CHECK = 125252 .MCALL .LOOKUP, .READW, .WRITW, .EXIT, .PRINT, .SETTOP, .SERR .MCALL .SPFUN .PSECT RUNJB START:: CALL BUFFER AGAIN:: .READW #AREA,#15.,#HEADER,#4,#0 ;Wait for next command. BCS DCERR .if NE,TEST INC IOCNT ;Count the IO's. MOV #LINE,R3 MOV #BFSIZE,R5 MOV #6,R4 10$: MOV (R5)+,R0 CALL CNV10 MOVB #'.,(R3)+ SOB R4,10$ CLRB (R3) .PRINT #TSTTXT .endc ;TEST CMP QWCNT,BFSIZE BGT SIZERR CMP QCHECK,#CHECK ;Pattern O.K.? BNE PTNERR TST QWCNT BMI WRITE ;=====================================================================; ; Read data from device ;=====================================================================; READ: .READW #AREA,#0,#BUFFER,QWCNT,QBLKN ;Store on device BCS DEVERR .WRITW #AREA,#15.,#BUFFER,QWCNT,#0 ;Get the user data BCS DCERR BR SNDEND ;=====================================================================; ; Write data to device ;=====================================================================; WRITE: .READW #AREA,#15.,#BUFFER,QWCNT,#0 ;Get the user data BCS DCERR NEG QWCNT .WRITW #AREA,#0,#BUFFER,QWCNT,QBLKN ;Store on device BCS DEVERR SNDEND: .WRITW #AREA,#15.,#ENDPKT,#5,#0 ;Send END Packet BCS DCERR ;=====================================================================; ;---------SPFUN requests + SPECIAL DIRECTORY device support-----------; ;=====================================================================; ; R3 => Block address ; R5 => Remaining words ; Read/Spfun with zero wordcount: ; R1 => Nr. of IO blocks ; Write: ; R1 => R1=R4=0 (On return from receive data part=write processing) FILST$ = 100000 SPFREQ: MOV #BUFFER,R4 MOV R4,BUFDAT ;Set up for possible SEND CMPB MTCHAN,UNIT BEQ 1$ CMPB SPFCOD,#373 ;Random access-size request? BNE 1$ TST DKSIZE BEQ HRDERR ;0 = No size DEC @R0 BNE 30$ ;1 = Variable volume, 30$ = SEND ; ; Variable volume: do SPFUN #373 request ; 1$: MOV #ENDINF,R0 MOV R0,R2 ;Error return block 4 words. CLR (R0)+ ;Initialize first two. CLR (R0)+ TSTB SPFCOD ;Positive means Special Directory req. BEQ HRDERR BGT SPDIRC TST R3 ;Blockno: if non 0, assume error return block BNE 4$ ; (e.g. MAGTAPE, RK06/07 etc.) CLR R2 4$: MOV R1,R4 ;Setup R4 also for code in SEND. CMP R4,BUFBLK ;Data buffer for SPFUN must be contiguous! BHI SPFMEM ;Not enough memory to execute this SPF. .SPFUN #AREA,UNIT,SPFCOD,#BUFFER,SPDATA,R2 BCC 20$ ; ; SPFUN ERROR! Still send the data in case of SPFUN read request! MOVB #-1,ENDMOD ;Init with HARD error! 10$: CMPB #2,OPCODE ;also DATA READ? BEQ 30$ ;No -> all done. Yes -> SPFUN REQ. with DATA- BR IOERR ;read; R1=Nr. IO blks, R5=wordrest, R4=R1 20$: CMPB #2,OPCODE ;Succesfull SPFUN: also DATA READ? BNE SUCCES ;No -> all done. Yes -> SPFUN REQ. with DATA- 30$: JMP SEND ;read; R1=Nr. IO blks, R5=wordrest, R4=R1 SPFMEM: MOV #"NB,TEXT ;Inform that there is No Buffer room! CALL PSTAT SPFERR: BR HRDERR ; ; SPECIAL DIRECTORY Device Requests: ; ================================== ; SPDIRC: ; ASYREQ=-20. LOOKUP =3 ENTER =4 CLOSE =1 FNF =1 ; CONFIG=300 ;RT-11 CONFIGURATION word. USR$=1000 ;USR bit in CONFIG. word. MOV #1,R4 ASH UNIT,R4 .GVAL #AREA,#CONFIG ;The USR must be available! BIT #USR$,R0 BNE USROK MOV #"NU,TEXT ;Inform that there is No Usr! CALL PSTAT BR HRDR USROK: CMPB SPFCOD,#CLOSE BNE SPDIRO SPCLOS: BIT R4,CHSTAT ;Channel open? BEQ HRDR ;No -> hard error .CLOSE UNIT BIC R4,CHSTAT ;Set channel no open. SUCC: JMP SNDEND NFSMT: .RAD50 /MT / .WORD 0 SPDIRO: CMPB MTCHAN,UNIT BNE OTHERS ; ; MT: perform ASYNCHRONOUS DIRECTORY OPERATION! ; BIT R4,CHSTAT BNE 1$ .LOOKUP #AREA,UNIT,#NFSMT,R3 BCS HRDR 1$: BIS R4,CHSTAT MOV #BUFFER+6,R2 ;BUFF word 1,2,3 ; contains RAD50 filename TST BUFFER ;Hardware LOOKUP?. BEQ SUCC ;Yes, then we are ready. CMPB #LOOKUP,SPFCOD BNE 2$ MOV #LOOKUP,(R2)+ BR 3$ 2$: CMPB #ENTER,SPFCOD BNE HRDR MOV #ENTER,(R2)+ 3$: MOV R3,(R2)+ ;Enter sequence number(BLCKNR). CLR (R2)+ ;DEC reserved CLR (R2)+ ;DEC reserved ; .SPFUN #AREA,UNIT,#ASYREQ,#BUFFER,,#ENDINF BCC SUCC ;CC =file found! CMP #FNF,ENDINF ;File not found? BEQ SUCC ;Yes! OK! .CLOSE UNIT BIC R4,CHSTAT ;Set channel no open. HRDR: JMP HRDERR OTHERS: .READW #AREA,MESSAG,#BUFFER+100.,#32.,#0 ;16 Device/file names CLR R2 BISB UNIT,R2 ASL R2 ;Make bytes. ASL R2 ;*2. ASL R2 ;*4. (full filespec.=4 words) ADD #BUFFER+100.,R2 MOV #BUFFER+6.,R5 ;Shift filename MOV #BUFFER+8.,R1 ; 1 word MOV -(R5),-(R1) ; upwards MOV -(R5),-(R1) ; in BUFFER. MOV -(R5),-(R1) MOV @R2,@R5 ;Copy device name. CMPB SPFCOD,#LOOKUP ;Lookup support. BNE 3$ .LOOKUP #AREA,UNIT,R5,R3 BCS HRDR BR 4$ 3$: CMPB SPFCOD,#ENTER ;Enter support. BNE HRDR .ENTER #AREA,UNIT,R5,,R3 BCS HRDR 4$: BIS R4,CHSTAT .ENDC ;SUCCES: send END packet ;-------------------------Send END packet-----------------------------; SNDEND: MOVB #'E,COND .WRITW #AREA,#15.,#ENDOPC,#5,#1 CALL ERRTST JMP AGAIN ;Go listening. DCERR: .PRINT #MSG1 BR SEXIT PTNERR: .PRINT #MSG2 BR SEXIT SIZERR: .PRINT #MSG3 BR SEXIT DEVERR: .PRINT #MSG4 SEXIT: .SPFUN #AREA,#15.,#277,#BUFFER,#1,#0 ; Reset XF: .EXIT MSG1: .ASCIZ /DC-error/ MSG2: .ASCIZ /DC-Pattern-error/ MSG3: .ASCIZ /DC-Buffer too small!/ MSG4: .ASCIZ /DC-Device IO error/ .if NE,TEST TSTTXT: .ASCII /Size,IO,Blok,func,check,wcnt=/ LINE: .BLKB 70. .endc ; TEST .EVEN ;-------------------------------------------------------------------------; AREA: .BLKW 8. BFSIZE: .WORD 0 ; Data buffer size in words. IOCNT: .WORD 0 ; Nr. of I/O's ; HEADER PACKET: HEADER:: QBLKN: .WORD 0 QFUNC: .WORD 0 QCHECK: .WORD 0 QWCNT: .WORD 0 ; END PACKET: ENDPKT: .WORD CHECK ERROR: .WORD 0,0,0,0 ;========================================================================; ; Initialization / buffer ;========================================================================; .PSECT INITJB FILST$ = 100000 VARSZ$ = 400 BUFFER::.SERR .LOOKUP #AREA,#15.,#XF BCS NOXF ; ; Determine the size of our device ; .DSTAT #BUF,#DEV ERRTST MOV BUF+4,R5 ERRTST ,NE MOV BUF,DVSTAT MOV BUF+6,DVSIZE ;Initialize size BIT #VARSZ$,DVSTAT BEQ SIZEOK CLR DVSIZE MOVB #'V,SIZE .LOOKUP #AREA,#0,#DEV BCC 10$ MOVB #'?,SIZE+2 ;' ?' = LOOKUP error 10$: .SPFUN #AREA,#0,#373,#BUF,#1,#BLK BCC 11$ MOVB #'?,SIZE+1 ;'?' = SPFUN size req. error BR 12$ 11$: MOV BUF,DKSIZE 12$: .CLOSE #0 SIZEOK: ; ; Set up DATA & I/O buffer: ; ------------------------- MOV #-2,R0 .SETTOP SUB #BUFFER,R0 ;R0 = top of program TST (R0)+ ;R0 = available memory in bytes CLC ;Cannot use ASR (SIGNED division /2 !) ROR R0 ;R0 = available memory in words MOV R0,BFSIZE MOV #TSIZE,R3 CALL CNV10 .PRINT #PINIT ;;.iif NE,TEST .HERR RETURN ;Go running!! XF: .RAD50 /XF / DEV: .RAD50 /SRV/ .WORD 0,0,0 NOXF: .PRINT #INIT1 .EXIT NOFILE: .PRINT #INIT2 .EXIT PINIT: .ASCII \XF-Server start, buffer size =\ TSIZE: .ASCIZ \ . words!\ INIT1: .ASCIZ \?No XF: handler\ .EVEN .=BUFFER+512. ;Get space for at least 1 disk block! ;--------------End of initializing code / buffer area-----------------; .PSECT CNV .END START