1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-26 02:05:51 +00:00
Files
PDP-10.its/src/syseng/minisr.5
Lars Brinkhoff f9619117ca MINIC - mini Chaosnet file server.
For booting Lisp machines.
2018-11-03 16:39:48 +01:00

366 lines
7.3 KiB
Groff
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 MINI SERVER
;MODIFIED FOR ITS FTP. MINIC
;Server for Lisp machine miniature Chaosnet
;Contact name is MINIC
;
;Protocol: (all you can do is read files)
; User to server:
; 200 ascii open, contents is file name
; 201 binary open, contents is file name
; Server to user:
; 202 win, contents is file-id (fn2 space cdate space ctime)
; 203 lose, contents is error message
; 200 ascii data
; 300 binary data
; eof end of file, user can then ask for another
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 <BUF1L+3>/4
FN1: 0
FN2: 0
SNM: 0
DEV: 0
GO: .CLOSE 1, ;Close load channel
MOVE P,PDL
MOVEI T,TSINT
MOVEM T,42
.SUSET [.SMASK,,[%PIIOC]]
.SUSET [.SWHO1,,[166_10.+1,,66_12.]] ;2 sixbit words in who-line, space between
.SUSET [.SWHO2,,[0]]
.SUSET [.SWHO3,,[0]]
MOVEI A,CHIC
MOVEI B,0
MOVEI C,[ASCIZ/MINIC/]
MOVEI D,1
PUSHJ P,NETWRK"CHALSN
JSR LOSE
.SUSET [.SSNAME,,[SIXBIT/MINI/]] ;Give peekers a clue
NXTFIL: .CALL [ SETZ ? 'PKTIOT ? MOVEI CHIC ? SETZI PKTBUF]
JSR LOSE
LDB A,[$CPKOP+PKTBUF]
CAIE A,200
CAIN A,201
JRST OPEN
JSR LOSE
OPEN: SETZM ASCMOD'
CAIE A,201
SETOM ASCMOD
LDB B,[$CPKNB+PKTBUF]
MOVE C,[440800,,%CPKDT+PKTBUF]
SETZM FN1
SETZM FN2
SETZM SNM
SETZM DEV
FNR0: MOVEI D,0
MOVE E,[440600,,D]
FNR1: SOJL B,FNR2
ILDB A,C
CAILE A,40
CAIL A,200
JRST FNR2
CAIN A,";
JRST FNR3
CAIN A,":
JRST FNR4
CAIGE A,140
SUBI A,40
TLNE E,770000
IDPB A,E
JRST FNR1
FNR2: JUMPE D,FNR2A
MOVSI A,-3
SKIPE FN1(A)
AOBJN A,.-1
MOVEM D,FN1(A)
FNR2A: JUMPL B,FNRX
JRST FNR0
FNR3: MOVEM D,SNM
JRST FNR0
FNR4: MOVEM D,DEV
JRST FNR0
;HERE ON OPEN COMMAND AFTER PARSING FILE NAME INTO FN1, FN2, SNM, DEV
FNRX: MOVSI A,'DSK
SKIPN DEV
MOVEM A,DEV
MOVSI A,(SIXBIT/>/)
SKIPN FN2
MOVEM A,FN2
MOVSI A,.UAI
SKIPN ASCMOD
MOVSI A,.UII
HRRI A,DKIC
.CALL [ SETZ ? SIXBIT/OPEN/ ? A ? DEV ? FN1 ? FN2 ? SETZ SNM ]
JRST OPENLS
;SUCCESS, RETURN FILE-ID
MOVEI A,202
DPB A,[$CPKOP+PKTBUF]
SETZM OUTCNT'
MOVE C,[440800,,%CPKDT+PKTBUF]
MOVEM C,OUTBP'
.CALL [ SETZ ? 'RFNAME ? MOVEI DKIC ? MOVEM TT ? MOVEM T ? SETZM TT] ;FN2
.LOSE %LSFIL
.SUSET [.SWHO2,,T] ;FN1
.SUSET [.SWHO3,,TT] ;FN2
;Send the second filename in ascii.
MOVE A,[440600,,TT]
MOVEI B,6
SNDFN2: ILDB T,A
CAIN T,0
JRST SNDVR2
ADDI T,40
PUSHJ P,CHOUT
SOJG B,SNDFN2
SNDVR2: MOVEI T,40
PUSHJ P,CHOUT
.CALL [ SETZ ? 'RFDATE ? MOVEI DKIC ? SETZM A] ;DATE/TIME
MOVEI A,0
PUSH P,A
PUSHJ P,DATASC ;CREATION DATE
MOVEI T,40
PUSHJ P,CHOUT
POP P,A
PUSHJ P,TIMASC ;CREATION TIME
MOVE A,OUTCNT
DPB A,[$CPKNB+PKTBUF]
.CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF]
JSR LOSE
;NOW TRANSMIT THE FILE
SKIPE ASCMOD
JRST XMITA
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
XMTEOF: MOVSI B,(<.BYTE 8 ? %COEOF ? 0>)
MOVEM B,PKTBUF
.CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF]
JSR LOSE
.CLOSE DKIC,
JRST NXTFIL
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
; XCT AS2LM(T) ;CONVERT CHAR CODE
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
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
JRST NXTFIL
;DATE, TIME, NUMBER CONVERSION ROUTINES (LIFTED BODILY FROM FILE JOB)
TM%SEC== 777776 ; 2.9-1.2 0-131K seconds 0-86399.
TM%DAY== 37,,0 ; 3.5-3.1 0-31 days 1-31
TM%MON== 740,,0 ; 3.9-3.6 0-15 months 1-12
TM%YR== 177000,,0 ; 4.7-4.1 0-127 years 0-127 relative to 1900 (1900-2027)
TM$SEC==(.BP TM%SEC,) ; Define BP LH's into each field.
TM$DAY==(.BP TM%DAY,)
TM$MON==(.BP TM%MON,)
TM$YR== (.BP TM%YR,)
; DATASC - Deposit MM/DD/YY using CHOUT
; Takes time wd in A
DATASC: PUSH P,B
PUSH P,C
PUSH P,E
SKIPA E,[-3,,[ TM$MON,,A
TM$DAY,,A
TM$YR,,A ] ]
TMDT2: PUSHJ P,CHOUT
LDB B,(E) ; Get numerical value into B.
IDIVI B,10. ; Divide into 2 digits.
MOVEI T,"0(B)
PUSHJ P,CHOUT ; Output first,
MOVEI T,"0(C)
PUSHJ P,CHOUT ; and second.
MOVEI T,"/ ; Set up separator, in case looping again.
AOBJN E,TMDT2
TIMTMX: POP P,E
POP P,C
POP P,B
POPJ P,
; TIMASC - Deposit HH:MM:SS using CHOUT given a time word in A.
; Takes time wd in A.
TIMASC: PUSH P,B
PUSH P,C
PUSH P,E
HRRZ B,A ; For storage of hr, min, sec.
LSH B,-1
IDIVI B,60. ; Get secs
PUSH P,C ; save
IDIVI B,60. ; Get hr and mins
PUSH P,C ; Save mins too.
MOVSI E,-3
JRST TMTM3
TMTM2: PUSHJ P,CHOUT
POP P,B ; Get numerical value into B.
TMTM3: IDIVI B,10. ; Divide into 2 digits.
MOVEI T,"0(B)
PUSHJ P,CHOUT ; Output first,
MOVEI T,"0(C)
PUSHJ P,CHOUT ; and second.
MOVEI T,": ; Set up separator, in case looping again.
AOBJN E,TMTM2
JRST TIMTMX
;CONVERT NUMBER IN A TO DECIMAL, THROUGH CHOUT
NUMASC: IDIVI A,10.
JUMPE A,NUMAS1
PUSH P,B
PUSHJ P,NUMASC
POP P,B
NUMAS1: MOVEI T,"0(B)
PUSHJ P,CHOUT
POPJ P,
CHOUT: IDPB T,OUTBP
AOSA OUTCNT
POPJ1: AOS (P)
CPOPJ: POPJ P,
SIXOUT: SETZ T,
LSHC T,6
ADDI T,40
PUSHJ P,CHOUT
JUMPN TT,SIXOUT
POPJ P,
;ASCII TO LISP-MACHINE CODE-CONVERSION XCT TABLE
AS2LM: REPEAT 10,JFCL ;0-7
MOVEI T,210 ;BS
MOVEI T,211 ;TAB
JRST XMITA2 ;FLUSH LF'S
JFCL ;13
MOVEI T,214 ;FORM
MOVEI T,215 ;CR
REPEAT 177-16,JFCL ;16-176
.VALUE ;177 I don't know how to handle escapes
IFN .-AS2LM-200, .ERR AS2LM TABLE WRONG SIZE
END GO