From 3677bb2c4235034d7b0647297f6d60cdf384e385 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Fri, 24 Feb 2017 22:46:02 +0100 Subject: [PATCH] IFILE - Chaosnet file service. --- README.md | 1 + build/build.tcl | 4 + src/syseng/ifile.3 | 191 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100755 src/syseng/ifile.3 diff --git a/README.md b/README.md index 9c791d3a..b0cad9aa 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,7 @@ A list of [known ITS machines](doc/machines.md). - HSNAME, displays user's HSNAME. - HSNDEV, HSNAME device. - IDLE, list idle users. + - IFILE, Chaosnet file service. - INIT, a helper program for LOGIN, LOGOUT, and other script files. - INLINE, reads line from TTY and adds to JCL (for DDT init files). - INQUIR, user account database. diff --git a/build/build.tcl b/build/build.tcl index 2ee8603c..4b8c553a 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -1100,6 +1100,10 @@ respond "*" ":midas device;chaos filei_eak;file\r" expect ":KILL" respond "*" ":link device;chaos fileo,device;chaos filei\r" +# ifile +respond "*" ":midas device;chaos ifile_syseng;ifile\r" +expect ":KILL" + # 11sim respond "*" ":midas /t sys1;ts pdp11_syseng;11sim\r" respond "end input with ^C" "45p==0\r" diff --git a/src/syseng/ifile.3 b/src/syseng/ifile.3 new file mode 100755 index 00000000..af3da2f2 --- /dev/null +++ b/src/syseng/ifile.3 @@ -0,0 +1,191 @@ +;-*-MIDAS-*- + TITLE IFILE SERVER + +;MODIFIED FOR ITS/OZ FTP. from MINIC from MINI. +; +; 2-Sep-85 17:54:14, GZ - use SOPEN, fix EOF handling + +;Contact name is IFILE +; +;Protocol: (all you can do is read files) +;Initial packet contains filename, ala SIMPLE connection. +;Server returns data packets containing stuff, followed by eof. + +A=1 +B=2 +C=3 +D=4 +E=5 +T=6 +TT=7 +P=17 + +CHIC=10 +CHOC=11 +DKIC=12 +ERRC=13 + +DEBUG: 0 + +PDL: -20,,. + BLOCK 22 + +.INSRT SYSTEM;CHSDEF > + +$$CHAOS==1 +$$CONNECT==1 +.INSRT SYSENG;NETWRK > + +PKTBUF: BLOCK %CPMXW+%CPKDT +BUF1==PKTBUF +BUF1L==<%CPMXW+%CPKDT>*5 +BUF2: BLOCK /4 + +WINSIZ: 5 + +GO: .CLOSE 1, ;Close load channel + MOVE P,PDL + MOVEI T,TSINT + MOVEM T,42 + .SUSET [.SMASK,,[%PIIOC]] + MOVEI A,CHIC + MOVEI B,0 + MOVEI C,[ASCIZ/IFILE/] + MOVE D,WINSIZ + PUSHJ P,NETWRK"CHALSN + JSR LOSE + .SUSET [.SSNAME,,[SIXBIT/IFILE/]] ;Give peekers a clue + +OPEN: LDB B,[$CPKNB+NETWRK"PKTBUF] + MOVE C,[440800,,%CPKDT+NETWRK"PKTBUF] +OPEN1: SOJL B,OPEN2 + ILDB A,C + CAIE A,40 + JRST OPEN1 +OPEN2: MOVE D,[440700,,BUF2] +OPEN3: SOJL B,OPEN4 + ILDB A,C + IDPB A,D + JRST OPEN3 +OPEN4: SETZ A, + IDPB A,D + MOVE A,[.UAI,,DKIC] + .CALL [ SETZ ? SIXBIT/SOPEN/ ? A ? [440700,,BUF2]] + JRST OPENLS +; JRST XMITA + +XMITA: MOVE A,[440700,,BUF1] ;HAVE TO DELETE ^C'S AND ^L'S AT EOF + MOVEI B,5 ;GET BUFFERED-BACK WORD + .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI DKIC ? A ? SETZ B] + .LOSE %LSFIL +XMITA0: MOVE A,[440700,,BUF1+1] + MOVEI B,BUF1L-5 + MOVE C,B + .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI DKIC ? A ? SETZ B] + .LOSE %LSFIL + PUSH P,C + IDIVI B,5 ;ROUND TO WORD BOUNDARY + IMULI B,5 + JUMPG C,[ MOVEI D,0 ;IF PARTIAL WORD TRANSFER, MAKE SURE FILLED WITH NULLS + IDPB D,A + SOJA C,. ] + POP P,C + SUB C,B + JUMPE C,XMITA9 ;NOTHING TRANSFERRED, EOF +XMITA3: MOVE A,[440700,,BUF1] ;NOW MOVE AND CONVERT BYTE-SIZE. DON'T MOVE LAST 5 CHARS + MOVE E,[440800,,BUF2] + MOVEI D,0 +ZIPCO: ILDB T,A + IDPB T,E + ADDI D,1 +XMITA2: SOJG C,ZIPCO + MOVE A,[440800,,BUF2] + .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI CHOC ? A ? SETZ D] + JSR LOSE +XMITA9: JUMPL B,XMITA7 ;HERE B HAS NUMBER CHARS NOT XFERRED LAST SIOT OR -1 FLAG + MOVEI C,BUF1L-5 + SUB C,B + ADDI C,4 + IDIVI C,5 ;NUMBER OF VALID WORDS IN BUFFER (NOT COUNTING FIRST ONE) + MOVE D,BUF1(C) ;MOVE LAST WORD UP TO FIRST POSITION (REST HAVE BEEN XMTED) + MOVEM D,BUF1 + JUMPE B,XMITA0 ;NO EOF YET + ;D HAS LAST WORD IN FILE, COUNT VALID CHARS + MOVEI C,5 + LSH D,-1 +XMITA8: MOVE A,D + ANDI A,177 + JUMPE A,.+3 ;Nulls appear from someplace + CAIE A,^C + CAIN A,^L + SOJG C,[ LSH D,-7 ? JRST XMITA8] + SETO B, + JUMPN C,XMITA3 ;GO TRANSMIT LAST WORD, SUCH AS IT IS +XMITA7: .CALL [ SETZ ? SIXBIT/FORCE/ ? SETZI CHOC] + JSR LOSE +; JRST XMTEOF + +XMTEOF: MOVSI B,(<.BYTE 8 ? %COEOF ? 0>) + MOVEM B,PKTBUF + .CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF] + JSR LOSE + .CALL [SETZ ? 'FINISH ? SETZI CHOC] + JSR LOSE + .CLOSE DKIC, + MOVSI B,(<.BYTE 8 ? %COCLS ? 0>) + MOVEM B,PKTBUF + .CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF] + JSR LOSE + SKIPN DEBUG + .LOGOUT 1, + .VALUE + .LOGOUT 1, + +;;XMITB: MOVE A,[444400,,%CPKDT+PKTBUF] +; MOVEI B,%CPMXC/4 +; MOVE C,B +; .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI DKIC ? A ? SETZ B] +; .LOSE %LSFIL +; SUB C,B +; JUMPE C,XMTEOF +; IMULI C,4 +; DPB C,[$CPKNB+PKTBUF] +; MOVEI A,300 +; DPB A,[$CPKOP+PKTBUF] +; .CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF] +; JSR LOSE +; JUMPE B,XMITB]; END IF IFNE 0, + +TSINT: 0 ? 0 + JSR LOSE + +LOSE: 0 + SKIPE DEBUG + .VALUE + .LOGOUT + JRST .-2 + +;FAILURE, RETURN ERROR MESSAGE + +OPENLS: MOVEI A,203 + DPB A,[$CPKOP+PKTBUF] + .CALL [ SETZ ? SIXBIT/OPEN/ ? [.UAI,,ERRC] ? [SIXBIT/ERR/] ? MOVEI 1 ? SETZI 0] + .LOSE %LSFIL + MOVE A,[440800,,%CPKDT+PKTBUF] + MOVEI B,%CPMXC + .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI ERRC ? A ? SETZ B] + .LOSE %LSFIL + MOVEI B,0 + IDPB B,A +OPENL1: MOVE A,[440800,,%CPKDT+PKTBUF] +OPENL2: ILDB TT,A + CAIL TT,40 + AOJA B,OPENL2 + DPB B,[$CPKNB+PKTBUF] + .CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF] + JSR LOSE + SKIPN DEBUG + .LOGOUT 1, + .VALUE + + END GO