1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-20 09:55:52 +00:00
PDP-10.its/src/sysen2/mlslv.77
Eric Swenson a3684d9638 Added MLDEV/MLSLV devices. These allow access to the file system using
the device DB: both locally and from remote systems.
2016-11-26 20:22:55 +01:00

825 lines
19 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-*-MIDAS-*-
TITLE BOJ SLAVE -- MLSLV, Works with MLDEV
.XCREF A,B,C,D,E,TT,I,Q,J,R,W,H,P,T,U
ICPSOC==123 ;This is the Postel-approved number
A=1
B=2
C=3
D=4
E=5
T=6
TT=7
I=10
H=11
J=12
Q=13
W=14
P=15
IOP=16
U=17
CH==,,-1 ;BIT TYPEOUT MASK FOR CHANNEL NAMES
CHNETI==1
CHNETO==2
CHDEV==4
DEFINE SYSCAL NAME,ARGS
.CALL [ SETZ ? SIXBIT /NAME/ ? ARGS ((SETZ))]
TERMIN
MAXLOG==20 ;MAXIMUM # OF LOGIN TRIES
BUFL==400 ;SIZE OF BUFFER. SENDING TO MLDEV CAN USE FULL SIZE.
DEFINE CHECK TAG,LEN
IFN .-TAG-<LEN>,.ERR WRONG TABLE LENGTH
TERMIN
LOC 42
JSR TSINT
LOC 100
GO: .CLOSE 1, ;CLOSE DISK CHANNEL USED FOR LOADING
.SUSET [.RUNAM,,DEBUG]
HLLOS DEBUG ;IF WE ARE IN A LOGGED-IN TREE
AOSN DEBUG ;SOMEONE MUST BE DEBUGGING MLSLV.
.SUSET [.SJNAME,,[SIXBIT/MLSLV/]] ;IF NOT DEBUGGING, RECTIFY JNAME
.CALL [ SETZ
SIXBIT /SSTATU/
2000,,A ;IGNORE THE DIE TIME
SETZM SYSDBG]
JFCL
MOVE P,[-LPDL-1,,PDL-1]
SETZM ALLOC
SETZM NBFOXF
SETZM NBFIXF
MOVE A,[440800,,NBUFO]
MOVEM A,NBUFOP
MOVEI A,NBUFL
MOVEM A,NBUFOC
.SUSET [.SMASK,,[%PIIOC+%PIRLT+%PIILO+%PIMPV+%PIPDL]]
MOVE A,[600000,,[60.*60.]]
SKIPN DEBUG ;IF DEBUGGING, DON'T LIGHT FUSE
.REALT A,
JFCL
;Find out what kind of server we're supposed to be
.SUSET [.RXJNAME,,A]
CAME A,[SIXBIT/TCP/]
JRST CHAICP
TCPICP: MOVEI A,CHNETI
MOVEI B,ICPSOC
PUSHJ P,NETWRK"TCPSRV
JSR LOGOUT
TLZ B,777000 ;Clear network number
TDNN B,[177700000] ;Try to reduce to old-style number
TRNE B,374
JRST GO1 ;Can't
LDB A,[000200,,B]
LSH A,6
LSH B,-9
IOR B,A
JRST GO1
CHAICP: MOVEI A,CHNETI
MOVEI C,[ASCIZ/MLDEV/]
MOVEI D,8
PUSHJ P,NETWRK"CHASRV
JSR LOGOUT
GO1: ANDI B,777 ;Kludgey unique number (low 9 bits of host)
MOVEM B,JOBUSR
MOVSI D,(SETZ)
.REALT D,
JFCL
JRST GO4 ;Start up
;ANY CHANGES IN THIS SHOULD BE REPORTED TO INFO-MLDEV@AI AND
;UPDATED IN MLSLV ALSO. NEW VERSION MUST THEN BE UPDATED
;SIMULTANEOUSLY ON ALL ITS'S AND ON MULTICS.
;[Next line is inoperative]
;ICP IS TO SOCKET 197. IF DOING MOSTLY INPUT, 199. IF MOSTLY OUTPUT
;COMMAND FORMAT: TO SLAVE
;AOBJN POINTER (RH = COMMAND CODE)
;BLOCK OF ARGUMENTS
;COMMAND CODES:
COPENI==1 ;OPEN FOR INPUT
;ARG1: DEVICE
;ARG2: FN1
;ARG3: FN2
;ARG4: SNAME
;ARG5: OPEN MODE
COPENO==2 ;OPEN FOR OUTPUT
;ARG1: DEVICE
;ARG2: FN1
;ARG3: FN2
;ARG4: SNAME
;ARG5: OPEN MODE
CDATA==3 ;WRITE DATA (WD COUNT INCLUDES DATA WDS AND BYTE COUNT WD).
;# OF BYTES OF DATA
;DATA, PACKED ILDB-STYLE INTO AT MOST 200 WORDS.
CALLOC==4 ;READ ALLOCATE
;ARG: ALLOCATION IN BYTES
CICLOS==5 ;INPUT CLOSE
;ARG: IGNORED
COCLOS==6 ;OUTPUT CLOSE
;ARG: IGNORED
CFDELE==7 ;.FDELE (DELETE OR RENAME)
;ARG1: DEV
;ARG2: FN1
;ARG3: FN2
;ARG4: 0 OR NEW FN1
;ARG5: 0 OR NEW FN2
;ARG6: SNAME
CRNMWO==10 ;.FDELE (RENAME WHILE OPEN)
;ARG1: NEW FN1
;ARG2: NEW FN2
CNOOP=11 ;NOOP
;ARG: ECHOED BY THE NOOP REPLY
CACCES==12 ;ACCESS
;ARG1: TRANSACTION NUMBER.
;ARG2: ACCESS POINTER
;ARG3: NEW ALLOCATION
CSYSCL==13 ;RANDOM SYSTEM CALL. 11 (DECIMAL) ARGUMENTS.
;ARG1: SYSTEM CALL NAME IN SIXBIT
;ARG2: FLAGS (CONTROL-BIT ARGUMENT)
;ARG3: NUMBER OF FOLLOWING ARGS THAT HAVE SIGNIFICANCE
;ARG4: 1ST ARG TO SYSTEM CALL
;...
;ARG11: 8TH ARG TO SYSTEM CALL
CREUSE==14 ;REINITIALIZE YOURSELF, BECAUSE WE ARE ABOUT TO BE REUSED
;BY A NEW CREATOR FOR A NEW FILE.
CLOGIN==15 ;LOGIN USER (RECORD XUNAME FOR SYS: DELETION PURPOSES, ETC.)
;ARG1: XUNAME (USED AS "TERMINAL NAME" IN LOGIN CALL)
CMAX==16 ;LARGEST COMMAND NUMBER, PLUS ONE.
;REPLIES FROM SLAVE START WITH AN AOBJN POINTER (RH = REPLY CODE)
;FOLLOWED BY A BLOCK OF ARGUMENTS
R==,,-1 ;REPLY CODES:
RDATA==1 ;INPUT DATA (WD COUNT INCLUDES DATA WDS AND BYTE COUNT WD).
;# OF BYTES OF DATA
;DATA, PACKED ILDB-STYLE INTO WORDS.
;NOTE: SLAVE MUST ALWAYS SEND FULLY POPULATED WORDS
;EXCEPT WHEN EOF IS REACHED.
ROPENI==2 ;INPUT OPEN STATUS. 1 OR 11 ARGUMENTS.
;ARG1: -1 => SUCCEEDED; >0 => OPEN LOSS NUMBER
;ARG2-ARG11 PRESENT ONLY IF ARG1 IS -1.
;ARG2: REAL DEVICE NAME (USUALLY SIXBIT/DSK/)
;ARG3: REAL FN1
;ARG4: REAL FN2
;ARG5: REAL SNAME
;ARG6: FILE LENGTH
;ARG7: BYTE SIZE OPEN IN
;ARG8: FILE LENGTH IN BYTE SIZE WRITTEN IN
;ARG9: BYTE SIZE WRITTEN IN
;ARG10: FILDTP - -1 IF "RFDATE" WINS ON THIS FILE
;ARG11: CREATION DATE (IF "RFDATE" WINS).
ROPENO==3 ;OUTPUT OPEN STATUS. 1 OR 11 ARGUMENTS.
;ARG1: -1 => SUCCEEDED; >0 => OPEN LOSS NUMBER
;ARG2-ARG11 PRESENT ONLY IF ARG1 IS -1.
;ARG2: REAL DEVICE NAME
;ARG3: REAL FN1
;ARG4: REAL FN2
;ARG5: REAL SNAME
;ARG6: FILE LENGTH (-1 => FILLEN FAILS ON THIS DEVICE)
;ARG7: BYTE SIZE OPEN IN
;ARG8: FILE LENGTH IN BYTE SIZE WRITTEN IN
;ARG9: BYTE SIZE WRITTEN IN
;ARG10: FILDTP - -1 IF "RFDATE" WINS ON THIS FILE
;ARG11: CREATION DATE (IF "RFDATE" WINS).
REOF==4 ;EOF ON INPUT
;ARG: IGNORED
RFDELE==5 ;.FDELE STATUS. 1ST ARGUMENT:
;RH: -1 => SUCCEEDED
; >=0 => FAILURE CODE
;LH: -1 => DELETE OR RENAME
; 0 => RENAME WHILE OPEN
;IF RENAME WHILE OPEN CALL SUCCEEDED, THERE ARE 4 MORE ARGS:
;ARG2: REAL DEVICE NAME
;ARG3: REAL FN1 (AS RENAMED)
;ARG4: REAL FN2
;ARG5: REAL SNAME
RNOOP==6 ;NOOP REPLY
;ARG: ECHO ARG SENT BY NOOP COMMAND
RACCES==7 ;ACKNOWLEDGE ACCESS
;ARG: TRANSACTION NUMBER FROM CACCES.
RSYSCL==10 ;RESPOND TO SYSTEM CALL. 9 ARGUMENTS.
;ARG1: <ERROR CODE OR 0>,,<# OF TIMES CALL SKIPPED>
;ARG2: 1ST VALUE FROM SYSTEM CALL.
;...
;ARG9: 8TH VALUE FROM SYSTEM CALL.
RICLOS==11 ;RESPOND TO INPUT-CLOSE.
ROCLOS==12 ;RESPOND TO OUTPUT CLOSE.
RIOC==13 ;REFLECT AN IOC ERROR
;ARG: IOC ERROR CODE, RIGHT-JUSTIFIED IN WORD.
RREUSE==14 ;ACKNOWLEDGE A CREUSE. ARG IS MEANINGLESS (NONE RETURNED).
RLOGIN==15 ;ACKNOWLEDGE A LOGIN. ARG IS MEANINGLESS (NONE RETURNED).
RMAX==16 ;LAST REPLY CODE + 1.
GO4: SYSCAL WHYINT,[1000,,CHNETI ? 2000,,A ? 2000,,B ? 2000,,C]
JSR LOGOUT
CAIN A,%WYCHA
HLRZS C ;Non-zero if input available
JUMPN C,GO5 ;IF THERE ARE COMMANDS FOR US, HACK THEM.
SKIPGE EOFI
JRST GO5
SKIPE C,ALLOC ;ELSE, IF WE HAVE MORE ALLOCATION, SEND MORE DATA.
JRST ALLI1 ;NO COMMANDS AND NO ALLOC => WAIT FOR COMMAND.
GO5: PUSHJ P,SYSFRC ;Force system output buffer before waiting
HRROI IOP,B ;Read command
PUSHJ P,NTIIOT
JUMPGE B,BYE2
HRRZ A,B
CAIL A,CMAX
JSR LOGOUT
MOVEM B,LCMND'
JRST @CMDTB(A)
;JUMP TO COMMAND HANDLER ROUTINE, LH(B) HAS - # ARGS TO READ OUT OF NET
CMDTB: OFFSET -.
BYE3
COPENI:: OPNI
COPENO:: OPNO
CDATA:: IOTO
CALLOC:: ALLI
CICLOS:: CLSI
COCLOS:: CLSO
CFDELE:: FDEL1
CRNMWO:: FDEL2
CNOOP:: YNOOP
CACCES:: YACCES
CSYSCL:: YSYSCL
CREUSE:: YREUSE
CLOGIN:: LOGIN
CMAX:: OFFSET 0
OPNI: SKIPA A,[ROPENI]
OPNO: MOVEI A,ROPENO ;OPENI AND OPENO SAME EXCEPT FOR REPLY CODE.
PUSH P,A
HRRI B,DEV
PUSHJ P,NTIIOB ;READ THE FILENAMES AND MODE.
.SUSET [.SSNAME,,SNAME]
POP P,B
MOVE A,OPNM
ANDI A,2
MOVEM A,BLOKMD ;WE MUST BE AWARE WHETHER USING BLOCK MODE.
SYSCAL OPEN,[4000,,OPNM ? 1000,,CHDEV
DEV ? FN1 ? FN2 ? SNAME
3000,,C]
JRST OPNIL ;IF OPEN LOSES, REPORT THAT.
SETZM EOFI ;IT WON, REPORT THAT.
HRLI B,-11.
;REPLY TO A SUCCESSFUL OPEN. B SHOULD HAVE REPLY HEADER, -11.,,<CODE>
OPNRCH: SETO C,
PUSHJ P,OPNRC1 ;SEND FILE NAMES
SYSCAL FILLEN,[ 1000,,CHDEV
REPEAT 4,[ ? 2000,,DEVRCH+.RPCNT ]]
SETOM DEVRCH
MOVEI A,36. ;IF FILLEN FAILED, WE MUST ESTIMATE
MOVE B,OPNM ;THE BYTE SIZE: 7 IN UNIT ASCII MODE,
TRNN B,6 ;ELSE 36.
MOVEI A,7
SKIPGE DEVRCH
MOVEM A,DEVRCH+1
.RSYSI D, ;TEMPORARY CODE TO COMPENSATE FOR OLD SYSTEM
CAMG D,[SIXBIT/1040/]
JRST [ MOVEM A,DEVRCH+1
MOVEM A,DEVRCH+3
MOVE A,DEVRCH
MOVEM A,DEVRCH+2
JRST .+1 ]
SKIPLE A,DEVRCH+1
CAIL A,37.
.VALUE
SETOM DEVRCH+4 ;NOW READ THE FILE'S DATE
SYSCAL RFDATE,[ 1000,,CHDEV ? 2000,,DEVRCH+5]
SETZM DEVRCH+4 ;OR SAY IT HAS NONE.
MOVE IOP,[-6,,DEVRCH]
PUSHJ P,NETOFR
MOVE A,DEVRCH+1
MOVEM A,BYTSIZ ;NOW FIGURE OUT HOW TO HACK THIS BYTE SIZE.
MOVEI A,36.
IDIV A,BYTSIZ
MOVEM A,BYTSWD
IMULI A,BUFL
MOVEM A,BUFSIZ
HRLZ A,BYTSIZ
LSH A,6
IOR A,[440000,,BUF]
MOVEM A,BUFBP ;SET UP BP. TO BUFFER'S BEGINNING.
SETZM ALLOC
JRST GO4
OPNRC1: MOVE IOP,[-2,,B]
PUSHJ P,NETOUT
.CALL [SETZ
SIXBIT /RCHST/
1000,,CHDEV
2000,,DEVRCH
2000,,DEVRCH+1
2000,,DEVRCH+2
2000,,DEVRCH+3
2000,,DEVRCH+4
2000,,DEVRCH+5
2000,,DEVRCH+6
SETZM DEVRCH+7]
JSR LOGOUT
MOVE IOP,[-4,,DEVRCH]
PUSHJ P,NETOUT
POPJ P,
OPNIL: HRLI B,-1 ;REPLY TO FAILING OPEN.
MOVE IOP,[-2,,B]
PUSHJ P,NETOFR
JRST GO4
ALLI: HRRI B,C
PUSHJ P,NTIIOB ;READ ALLOC AMOUNT INTO C
MOVEM C,LALLOC'
ADDB C,ALLOC ;INCREASE ALLOC
SKIPGE EOFI ;CAN'T ACTUALLY TRANSFER ANYTHING IF AT EOF.
JRST GO4
ALLI1: MOVE B,BUFSIZ
CAML C,B
MOVE C,B ;WE CAN'T IOT MORE THAN A BUFFERFULL AT ONCE.
SKIPN BLOKMD
JRST ALLI2 ;NOW GO DO THE XFRS IN UNIT MODE WITH SIOT,
MOVN B,C ;OR IN BLOCK MODE WITH IOT.
HRLZS B
HRRI B,BUF
.IOT CHDEV,B
MOVEI C,-BUF(B) ;HOW MANY BYTES DID WE GET?
SKIPGE B
SETOM EOFI ;NOT ALL WE ASKED FOR => AT EOF NOW.
JRST ALLI3 ;GO SEND OUR DATA (AND MAYBE EOF) TO MLDEV.
ALLI2: IDIV C,BYTSWD ;ROUND DOWN BYTE COUNT TO MULTIPLE OF A WORD
IMUL C,BYTSWD ;SINCE SUPPOSED TO SEND FULLY POPULATED WORDS
JUMPE C,GO5 ;JUMP IF NOT ENOUGH ALLOC TO READ ANYTHING
MOVE B,BUFBP
MOVE A,C
SYSCAL SIOT,[1000,,CHDEV ? B ? A]
JSR LOGOUT
LDB D,[360600,,B]
CAIE D,44 ;MAKE B POINT AT THE FIRST WORD NOT READ INTO AT ALL.
AOS B
SKIPE A
SETOM EOFI
SUB C,A
;NOW WE HAVE READ DATA FROM DEVICE INTO BUFFER.
;C HAS # BYTES READ.
;B POINTS AT 1ST UNUSED WORD OF BUF.
ALLI3: JUMPE C,ALLI4
HRLZI IOP,-BUF(B)
MOVNS IOP ;- # WORDS CONTAINING DATA.
ADD IOP,[-1,,RDATA]
MOVEM IOP,HDR0 ;SET UP RDATA CMD CONTAINING THEM AND BYTE COUNT.
MOVEM C,HDR1
ADD IOP,[-1,,HDR0-RDATA]
PUSHJ P,NETOUT ;Translate to bytes and send. But let the system
PUSHJ P,BUFFRC ;decide where to put in the packet boundaries.
MOVNS C
ADDM C,ALLOC ;DEDUCT BYTES SENT FROM ALLOCATION.
ALLI4: SKIPL EOFI ;NOW, IF WE REACHED EOF, TELL MLDEV THAT.
JRST GO4 ;ELSE HANDLE ANOTHER COMMAND.
;NOTE WE MIGHT STILL HAVE SOME ALLOCATION LEFT.
;IF SO, THEN WE WILL HANDLE IT AS SOON AS THERE
;ARE NO COMMANDS PENDING.
ALLEOF: HRROI B,REOF ;HERE WHEN WE REACH EOF: SEND REOF REPLY.
JRST REPLY1
IOTO: HRROI IOP,C ;HANDLE CDATA (DATE TO WRITE TO DEVICE)
PUSHJ P,NTIIOT ;READ BYTE COUNT.
ADD B,[1,,]
HRRI B,BUF ;READ THE DATA.
PUSHJ P,NTIIOB
SKIPE BLOKMD
JRST [ .IOT CHDEV,B
JRST GO4] ;IN BLOCK MODE, SEND OUT AS WORDS.
MOVE B,BUFBP
SYSCAL SIOT,[1000,,CHDEV ? B ? C]
JSR LOGOUT
JRST GO4 ;IN UNIT MODE, SEND OUT AS BYTES.
CLSI: HRRI B,C
PUSHJ P,NTIIOB
.CLOSE CHDEV,
HRROI IOP,[RICLOS]
PUSHJ P,NETOFR
JRST GO4
CLSO: HRRI B,C
PUSHJ P,NTIIOB
.CLOSE CHDEV,
HRROI IOP,[ROCLOS]
PUSHJ P,NETOFR
JRST GO4
;HERE FOR CREUSE COMMAND, WHICH MEANS MLDEV IS ABOUT TO USE US FOR A DIFFERENT FILE
;AND WASNTS US TO REINITIALIZE EVERYTHING APPROPRIATE.
YREUSE: HRRI B,C ;IGNORE THE ARGUMENT.
PUSHJ P,NTIIOB
SETZM ALLOC ;DON'T EVEN TRY SENDING OUT MORE DATA.
HRROI IOP,[RREUSE]
PUSHJ P,NETOFR ;SO JUST ACKNOWLEDGE.
JRST GO4
LOGIN: HRRI B,UNAME ; READ LOGIN ID
PUSHJ P,NTIIOB
SETZM TRMNAM
MOVE A,[440600,,TRMNAM]
MOVEM A,TNAMBP
MOVEI A,6
MOVEM A,TNAMCC ;6 SIXBIT CHARACTERS IN WORD
MOVE A,JOBUSR ;THE HOST AT THE OTHER END OF LINE
PUSHJ P,OCTPNT
MOVEI A,'J
PUSHJ P,SIXTYP
.SUSET [.RUIND,,A] ;THE USER INDEX IS MORE USEFUL
PUSHJ P,OCTPNT
MOVEI C,MAXLOG ;MAXIMUM LOGIN TRIES
SKIPA B,UNAME
LOGIN1: AOS UNAME
.CALL [ SETZ
SIXBIT /LOGIN/
UNAME ;UNAME
TRMNAM ; "CONSOLE" (HOST AND USER INDEX)
SETZ B ] ; XUNAME
SOJG C,LOGIN1 ;KEEP TRYING UNTIL WE MAKE IT
HRROI IOP,[RLOGIN] ; AND ACKNOWLEDGE
PUSHJ P,NETOFR
JRST GO4
;LOGIN UTILITY ROUTINES
OCTPNT: IDIVI A,10 ;THE NELSON RECURSIVE NUMBER PRINTER
HRLM B,(P)
SKIPE A
PUSHJ P,OCTPNT
HLRZ A,(P)
ADDI A,'0
SIXTYP: SOSL TNAMCC ;MAXIMUM OF 6 CHARACTERS
IDPB A,TNAMBP
CPOPJ: POPJ P,
FDEL1: HRRI B,DEV
PUSHJ P,NTIIOB
MOVEI A,[SETZ ? SIXBIT /RENAME/
DEV ? FN1 ? FN2 ? FSNAM
FN2+1 ? FN2+2
SETZB C]
SKIPE SNAME ; 0=>deleting
JRST FDEL5
HRROI C,%ENSMD ; RETURN "MODE NOT AVAILABLE" ERROR IF NOT LOGGED IN
SKIPN UNAME
JRST FDEL4
MOVEI A,[SETZ ? SIXBIT /DELETE/
DEV ? FN1 ? FN2 ? FSNAM
SETZB C]
FDEL5: .CALL (A)
SKIPA ; Leave failure code in C if no skip
MOVEI C,-1 ; Set code of -1 to mean succeeded
HRROS C ; Set left half to -1 for RENAME/DELETE
; Can't return the real name so just return code
; Drop through to FDEL4
FDEL4: MOVE B,[-1,,RFDELE] ; only sending status word
MOVE IOP,[-2,,B] ; Code is in "C".
PUSHJ P,NETOFR
JRST GO4
FDEL2: HRRI B,FN1
PUSHJ P,NTIIOB
.CALL [ SETZ ? 'RENMWO ? 1000,,CHDEV ? FN1 ? FN2
SETZB C]
SKIPA ; If failure leave code in C
MOVEI C,-1 ; Otherwise set -1 to mean success
; Left half is zero here to mean reply to Rename while open
TRNN C,400000 ; RH sign will be on if we succeeded
JRST FDEL4 ; jump if call failed.
MOVE B,[-5,,RFDELE]
PUSHJ P,OPNRC1 ; Get the real file name and send it.
PUSHJ P,NETFRC
JRST GO4
YNOOP: HRRI B,C ;GET NOOP ARG
PUSHJ P,NTIIOB
HRROI B,RNOOP ;NOOP REPLY
REPLY1: MOVE IOP,[-2,,B] ;BLKO POINTER FOR NOOP REPLY
PUSHJ P,NETOFR
JRST GO4 ;BACK FOR NEXT COMMAND
;HANDLE CACCES COMMAND
YACCES: HRRI B,B
PUSHJ P,NTIIOB ;GET TRANSACTION NUMBER FOR REPLY IN C
EXCH B,C ;AND ACCESS POINTER INTO B. NEW ALLOCATION IN D, USED ONLY IF INPUT.
.CALL [ SETZ
'ACCESS
1000,,CHDEV
SETZ B] ;PUT IT INTO DEV CHANNEL
JSR LOGOUT
SETZM EOFI
HRROI B,RACCES
MOVE IOP,[-2,,B]
PUSHJ P,NETOFR ;SEND REPLY
MOVE A,OPNM
TRNE A,1 ;IF OTHER END IS READING FILE, SEND WHAT WE'VE BEEN ALLOCATED.
JRST GO4 ;IF OTHER SIDE IS WRITING, WAIT FOR IT TO SEND MORE DATA.
MOVE C,D ;PROCESS NEW ALLOCATION SUPPLIED AS PART OF CACCES COMMAND,
MOVEM D,ALLOC
JRST ALLI1 ;THEN SEND NEW STUFF.
;HANDLE REQUEST TO EXECUTE SYSTEM CALL.
YSYSCL: HRRI B,YSYSB
PUSHJ P,NTIIOB ;READ SYS CALL NAME AND ARGS.
MOVEI A,CHDEV ;1ST ARG IS NORMALLY DEV CHANNEL NUMBER,
MOVE B,YSYSB
CAME B,[SIXBIT/MLINK/]
MOVEM A,YSYSB+3 ;BUT FOR "MLINK" CALL, IT IS SENT BY MASTER.
MOVEM B,YSYSC+1
MOVSI C,-NYSYSI
MOVSI D,(SETZ)
ANDCAM D,YSYSI(C)
AOBJN C,.-1
SOS C,YSYSB+2 ;# OF INPUT ARGUMENTS-1
IORM D,YSYSI(C) ;SET END OF ARG LIST AT APPROPRIATE PLACE
.CALL YSYSC
JRST [MOVSS A ? JRST YSYS1]
MOVEI A,1 ;SUCCESSFUL CALL RETURNS HERE - SAY WAS 1 SKIP.
YSYS1: MOVEM A,YSYSS
MOVE IOP,[-YSYSRL,,YSYSR]
PUSHJ P,NETOFR ;REPLY, GIVING MASTER VALUES RETURNED.
JRST GO4
TSINT: 0
INTPC: 0
MOVEM A,TSINTA ;IO INTR, CHECK SOCKET STATES
SKIPL A,TSINT
JRST TSFW
TSINTX: MOVE A,TSINTA
.DISMISS INTPC
TSINTA: 0
TSFW: TRNN A,%PIIOC ;HERE FOR 1ST WORD INTERRUPT.
JSR LOGOUT
.SUSET [.RBCHN,,A] ;ONLY ONE WE CAN HANDLE IS AN IOC ERROR
CAIE A,CHDEV ;ON THE DEVICE BEING USED.
JSR LOGOUT ;IOC ERROR ON NET SOCKET MEANS MLDEV WANTS US TO DIE.
MOVSS A
ADD A,[.RIOS,,A] ;WHEN THAT HAPPENS, SEND OUT A RIOC COMMAND
.SUSET A ;CONTAINING THE IOC ERROR NUMBER.
LDB C,[330400,,A]
.DISMI [.+1]
HRROI B,RIOC
MOVE IOP,[-2,,B]
PUSHJ P,NETOFR
JRST GO4 ;ALSO ABORT WHATEVER WE WERE DOING.
BYE1: JSR LOGOUT
BYE2: JSR LOGOUT
BYE3: JSR LOGOUT
LOGOUT: 0
SKIPE DEBUG
.VALUE
.LOGOUT
JRST .-2
;NETWORK 36-BIT OUTPUT ROUTINES
NETOFR: PUSHJ P,NETOUT ;Output then force
NETFRC: PUSHJ P,BUFFRC ;Force our buffer and system's too
SYSFRC: .CALL [ SETZ ? SIXBIT/FORCE/ ? SETZI CHNETO ] ;Send it
JSR LOGOUT ;Probably connection closed
POPJ P,
BUFFRC: PUSH P,H ;Force our buffer into system
PUSH P,J
PUSH P,Q
AOSE NBFOXF
JRST NETFR1
MOVE H,NBFOXW ;Send extra word
MOVEI J,0 ;Padded with zeros
PUSHJ P,NETOU2
NETFR1: PUSHJ P,NETBFO ;Code-convert buffer
POPQJH: POP P,Q
POP P,J
POP P,H
POPJ P,
;Send words, IOP is aobjn pointer
NETOUT: PUSH P,H
PUSH P,J
PUSH P,Q
AOSE NBFOXF
JRST NETOU1
MOVE H,NBFOXW ;Send saved word from last time
MOVE J,(IOP) ;Followed by first new word
PUSHJ P,NETOU2
AOBJP IOP,POPQJH
NETOU1: MOVE H,(IOP) ;Send two words
AOBJP IOP,NETOU3 ;No more
MOVE J,(IOP)
PUSHJ P,NETOU2
AOBJN IOP,NETOU1
JRST POPQJH
NETOU3: MOVEM H,NBFOXW ;Send this word next time
SETOM NBFOXF
JRST POPQJH
;Send pair of 36-bit words in H,J
NETOU2: MOVE Q,NBUFOC ;Space in buffer?
CAIGE Q,9
PUSHJ P,NETBFO ;Make some
MOVNI Q,9
ADDM Q,NBUFOC
REPEAT 9,[
ROTC H,8
IDPB J,NBUFOP
]
POPJ P,
;Send and refresh the buffer -- clobbers Q only
NETBFO: MOVEI Q,NBUFL
SUB Q,NBUFOC ;Number of 8-bit bytes in buffer
JUMPE Q,CPOPJ ;Empty
PUSH P,J
MOVE J,[440800,,NBUFO]
MOVEM J,NBUFOP
ADDM Q,NBUFOC
.CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI CHNETO ? J ? SETZ Q ]
JSR LOGOUT ;Probably connection closed
POP P,J
POPJ P,
;Read 36-bit words from network into aobjn pointer in IOP
;If an odd number of words, NTIFRC will clean up the extra word
;(Calls to NTIFRC must match calls to NETFRC at other end).
NTIIOB: MOVE IOP,B
PUSHJ P,NTIIOT
NTIFRC: SETZM NBFIXF ;Swallow extra word, if any
POPJ P,
NTIIOT: PUSH P,H
PUSH P,J
PUSH P,Q
AOSE NBFIXF ;If have extra word, recieve it first
JRST NTIIO1
MOVE H,NBFIXW
MOVEM H,(IOP)
AOBJP IOP,POPQJH
NTIIO1: HLRO H,IOP ;Compute how much input we need
ASH H,-1 ;Rounded-up negative number of word pairs
IMUL H,[-9] ;Number of bytes
CAILE H,NBUFL ;Take at most one buffer full
MOVEI H,NBUFL
PUSH P,H
IDIVI H,9 ;Store number of word pairs
MOVEM H,NBUFIC
POP P,H
MOVE J,[440800,,NBUFI]
MOVEM J,NBUFIP
.CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI CHNETI ? J ? SETZ H ]
JSR LOGOUT ;Probably connection closed
SKIPE H
JSR LOGOUT ;Failed to transfer, could be TCP conn closed
NTIIO2: MOVEI J,0 ;Receive two words into H,J
REPEAT 9,[
IFN .RPCNT, LSHC H,8
ILDB Q,NBUFIP
IOR J,Q
]
MOVEM H,(IOP)
AOBJP IOP,NTIIO3
MOVEM J,(IOP)
AOBJP IOP,POPQJH
SOSLE NBUFIC
JRST NTIIO2
JRST NTIIO1 ;Need another buffer full
NTIIO3: MOVEM J,NBFIXW ;Save this word for next time
SETOM NBFIXF
JRST POPQJH
NBUFL==360. ;Number of 8-bit bytes of network buffer
NBUFO: BLOCK NBUFL/4 ;NBUFL must be multiple of 4 and 9
NBUFOP: 440800,,NBUFO ;Fill pointer for network buffer
NBUFOC: NBUFL ;Bytes remaining
NBFOXF: 0 ;-1 => extra word in NBFOXW
NBFOXW: 0 ;extra word not sent yet
NBUFI: BLOCK NBUFL/4
NBUFIP: 440800,,NBUFI ;Take pointer for network buffer
NBUFIC: 0
NBFIXF: 0 ;-1 => extra word in EXTRAW
NBFIXW: 0 ;extra word not sent yet
LPDL==20
PDL: BLOCK LPDL+4
PATCH:
PAT: BLOCK 40
RCH: BLOCK 10 ? STATE=RCH+4 ;THIS IS THE SOCKET STATE
OPN:
DEV: 0
FN1: 0
FN2: 0
SNAME: 0
OPNM: 0
FSNAM: 0
BLOCK 10 ;SLOP FOR NET IOTS INTO HERE
;LOGIN STUFF
UNAME: 0
TRMNAM: 0
TNAMBP: 0 ;BYTE POINTER INTO UNAME
TNAMCC: 0 ;SIXBIT CHARACTER COUNT
JOBUSR: 0 ;THE FOREIGN USER
DEBUG: -1 ;DEBUG FLAG
SYSDBG: 0 ;SYSTEM BEING DEBUGGED FLAG
VERSIO: .FNAM1
.FNAM2
BLOKMD: 0 ;-1 => DEVICE OPEN IN BLOCK MODE.
EOFI: 0 ;-1 => HAVE REACHED EOF ON INPUT
ALLOC: 0 ;-1 => ALLOCATION FOR DATA TO MLDEV, IN BYTES.
HDR0: 0 ;HOLDS -N,,RDATA
HDR1: 0 ;HOLDS BYTE COUNT OF RDATA COMMAND.
BUF: BLOCK BUFL
BUFBP: 0 ;B.P. TO ILDB 1ST BYTE OF BUFFER.
BYTSIZ: 0 ;BYTE SIZE WE ARE XFERRING TO DEVICE.
BYTSWD: 0 ;# BYTES PER WORD.
BUFSIZ: 0 ;BUFFER SIZE IN BYTES.
YSYSBL==11.
YSYSB: BLOCK YSYSBL
BLOCK 10 ;SLOP FOR NET IOTS INTO HERE
YSYSR: 1-YSYSRL,,RSYSCL ;CODE FOR "REPLY TO SYSTEM CALL"
YSYSS: 0 ;ERROR CODE,,# SKIPS
YSYSV: BLOCK 10 ;VALUES RETURNED BY SYSTEM CALL GO HERE.
YSYSRL==.-YSYSR
YSYSC: SETZ ;BLOCK FILLED IN FOR DOING SYSTEM CALL
SIXBIT/GAZONK/ ;NAME OF CALL STORED HERE
4000,,YSYSB+1 ;CONTROL BITS
3000,,A ;ERROR RETURN ARGUMENT
REPEAT 8,2000,,YSYSV+.RPCNT ;COLLECT OUTPUT ARGS
YSYSI: NYSYSI==8
REPEAT NYSYSI, YSYSB+3+.RPCNT ;INPUT ARGS, SIGN BIT WILL GET TURNED ON IN LAST ONE
DEVRCH: BLOCK 8 ;SPACE FOR .RCHST ON DSK
$$HST3==1
$$CHAOS==1
$$TCP==1
$$SERVE==1
.INSRT SYSENG;NETWRK
LITTER: CONSTANTS
VARS:: VARIABLES
END GO