1 TITLE OPEN - CHANNEL OPENER FOR MUDDLE
18 ;THIS PROGRAM HAS ENTRIES: FOPEN, FCLOSE, RENAME, READB, PRINTB, FILECOPY, READSTRING,
19 ; PRINTSTRING, NETSTATE, NETACC, NETS, ACCESS, AND FILE-EXISTS?
21 ;THESE SUBROUTINES HANDLE I/O STREAMS FOR THE MUDDLE SYSTEM.
23 ; FOPEN - OPENS A FILE FOR EITHER READING OR WRITING. IT TAKES
24 ; FIVE OPTINAL ARGUMENTS AS FOLLOWS:
26 ; FOPEN (<DIR>,<FILE NAME1>,<FILE NAME2>,<DEVICE>,<SYSTEM NAME>)
28 ; <DIR> - DIRECTION EITHER READ (INPUT) OR PRINT (OUPUT). DEFAULT IS READ
30 ; <FILE NAME1> - FIRST FILE NAME. DEFAULT INPUT OR OUTPUT.
32 ; <FILE NAME2> - SECOND FILE NAME. DEFAULT MUDDLE.
34 ; <DEVICE> - DEVICE FROM WHICH TO OPEN. DEFAULT IS DSK.
36 ; <SNAME> - SYSTEM (DIRECTORY) NAME. DEFAULT UNAME.
38 ; FOPEN RETURNS AN OBJECT OF TYPE CHANNEL IF IT SUCCEEDS OTHERWISE NIL
41 ; FCLOSE - CLOSES A FILE. TAKES A CHANNEL OBJECT AS ITS ARGUMENT. IT ALSO TAKES
42 ; ACCESS - DOES A .ACCESS ON A CHARACTER BASIS FOR CHARACTER FILES
45 ; A CHANNEL OBJECT IS A VECTOR CONTAINIG THE FOLLOWING INFORMATION
47 ; CHANNO ;ITS I/O CHANNEL NUMBER. 0 MEANS NOT A REAL CHANNEL.
48 ; DIRECT ;DIRECTION (EITHER READ OR PRINT)
49 ; NAME1 ;FIRST NAME OF FILE AS OPENED.
50 ; NAME2 ;SECOND NAME OF FILE
51 ; DEVICE ;DEVICE UPON WHICH THE CHANNEL IS OPEN
52 ; SNAME ;DIRECTORY NAME
53 ; RNAME1 ;REAL FIRST NAME (AS RETURNED BY READING CHANNEL STATUS)
54 ; RNAME2 ;REAL SECOND NAME
56 ; RSNAME ;SYSTEM OR DIRECTORY NAME
57 ; STATUS ;VARIOUS STATUS BITS
58 ; IOINS ;INSTRUCTION EXECUTED TO INPUT OR OUTPUT ONE CHARACTER
59 ; ACCESS ;ACCESS POINTER FOR RAND ACCESS (OR USED FOR DISPLAY INFO)
60 ; RADX ;RADIX FOR CHANNELS NUMBER CONVERSION
62 ; *** THE FOLLOWING FIELDS FOR OUTPUT ONLY ***
63 ; LINLN ;LENGTH OF A LINE IN CHARACTERS FOR THIS DEVICE
64 ; CHRPOS ;CURRENT POSITION ON CURRENT LINE
65 ; PAGLN ;LENGTH OF A PAGE
66 ; LINPOS ;CURRENT LINE BEING WRITTEN ON
68 ; *** THE FOLLOWING FILEDS FOR INPUT ONLY ***
69 ; EOFCND ;GETS EVALUATED ON EOF
70 ; LSTCH ;BACKUP CHARACTER
71 ; WAITNS ;FOR TTY INPUT, BECOMES A .SLEEP WHEN WAITING
72 ; EXBUFR ;FOR TTY INPUT, CONTAINS A WAITING BUFFER LIST
73 ; BUFSTR ;A CHARACTER STRING USED AS BUFFER FOR NON-TTY DEVICES
75 ; THIS DEFINES THE LENGTH OF THE NON-TTY BUFFER
78 ;THIS DEFINES BLOCK MODE BIT FOR OPENING
79 BLOCKM==2 ;DEFINED IN THE LEFT HALF
83 ;THIS IRP DEFINES THE FIELDS AT ASSEMBLY TIME
85 CHANLNT==4 ;INITIAL CHANNEL LENGTH
87 ; BUILD A PROTOTYPE CHANNEL AND DEFINE FILEDS
88 BUFRIN==-1 ;SPECIAL HACK SO LOSERS WON'T SEE TTY BUFFER
89 SCRPTO==-3 ;SPECIAL HACK FOR SCRIPT CHANNELS
92 IRP A,,[[CHANNO,FIX],[DIRECT,CHSTR]
93 [NAME1,CHSTR],[NAME2,CHSTR],[DEVICE,CHSTR],[SNAME,CHSTR]
94 [RNAME1,CHSTR],[RNAME2,CHSTR],[RDEVIC,CHSTR],[RSNAME,CHSTR]
95 [STATUS,FIX],[IOINS,FIX],[LINLN,FIX],[CHRPOS,FIX],[PAGLN,FIX],[LINPOS,FIX]
96 [ACCESS,FIX],[RADX,FIX],[BUFSTR,CHSTR]]
108 ; EQUIVALANCES FOR CHANNELS
114 DISINF==BUFSTR ;DISPLAY INFO
115 INTFCN==BUFSTR ;FUNCTION (OR SUBR, OR RSUBR) TO BE APPLIED FOR INTERNAL CHNLS
118 ;DEFINE VARIABLES ASSOCIATED WITH TTY BUFFERS
120 IRP A,,[IOIN2,ECHO,CHRCNT,ERASCH,KILLCH,BRKCH,ESCAP,SYSCHR,BRFCHR,BRFCH2,BYTPTR]
124 EXTBFR==BYTPTR+1+<100./5> ;LENGTH OF ADD'L BUFFER
129 .GLOBAL IPNAME,MOPEN,MCLOSE,MIOT,ILOOKU,6TOCHS,ICLOS,OCLOS,RGPARS,RGPRS
130 .GLOBAL OPNCHN,CHMAK,READC,TYO,SYSCHR,BRFCHR,LSTCH,BRFCH2,EXTBFR
131 .GLOBAL CHRWRD,STRTO6,TTYBLK,WAITNS,EXBUFR,TTICHN,TTOCHN,GETCHR,IILIST
132 .GLOBAL CHANNO,STATUS,LINPOS,PAGLN,CHRPOS,LINLN,IOINS,ACCESS,ADDNUL
133 .GLOBAL DIRECT,DISINF,RADX,EOFCND,BUFSTR,MODE1,MODE2,GCHACK,GMTYO,INMTYO
134 .GLOBAL T.CHAN,NAME1,BFCLOS,DOIOTI,DOIOTO,DOACCS,NOTTY,DEMFLG,BYTDOP,TNXIN
135 .GLOBAL DISOPN,DISROP,DISCLS,DCHAR,DISLNL,DISPGL,INSTAT,MTYO,CIREST
136 .GLOBAL ECHO,ERASCH,KILLCH,BRKCH,BYTPTR,SYSCHR,CHRCNT,ESCAP,N.CHNS
137 .GLOBAL REOPN,QUITTE,CHNL0,CHNL1,BUFRIN,IOIN2,IFALSE,GFALS,IDVAL,PVSTOR,SPSTOR
138 .GLOBAL BADCHN,WRONGD,CHNCLS,GSNAME,GIBLOK,APLQ,NAPT,ICONS,INCONS,IBLOCK,IDVAL1
139 .GLOBAL GRB,GWB,R1CHAR,W1CHAR,BFCLS1,TTYOP2,MPOPJ,COMPER,R1C,W1C,WXCT,RXCT
140 .GLOBAL TMTNXS,TNXSTR,RDEVIC,CPCH1,RCYCHN,CGFALS,CISTNG,CFILLE,FRSTCH
154 ; DEFINITIONS OF THE OFFSETS INTO THE TP STACK FOR OPEN
156 T.SPDL==0 ; SAVES P STACK BASE
157 T.DIR==2 ; CONTAINS DIRECTION AND MODE
158 T.NM1==4 ; NAME 1 OF FILE
159 T.NM2==6 ; NAME 2 OF FILE
160 T.DEV==10 ; DEVICE NAME
162 T.XT==14 ; EXTRA CRUFT IF NECESSARY
163 T.CHAN==16 ; CHANNEL AS GENERATED
165 ; OFFSETS FROM PSTACK BASE (USED FOR OPENS, .RCHST AND .FDELES)
167 S.DIR==0 ; CODE FOR DIRECTION 0-IN, 1-OUT, 2-BIN, 3-BOUT,4-DISPLAY
168 ; S.DIR(P) = <control word>,,<direction>
170 S.DEV==1 ; SIXBIT DEVICE RIGHT JUSTIFIED
171 S.NM1==2 ; SIXBIT NAME1
172 S.NM2==3 ; SIXBIT NAME2
173 S.SNM==4 ; SIXBIT SNAME
187 ; FLAGS SPECIFYING STATE OF THE WORLD AT VARIOUS TIMES
189 NOSTOR==400000 ; ON MEANS DONT BUILD NEW STRINGS
190 MSTNET==200000 ; ON MEANS ONLY THE "NET" DEVICE CAN WIN
191 SNSET==100000 ; FLAG, SNAME SUPPLIED
192 DVSET==040000 ; FLAG, DEV SUPPLIED
193 N2SET==020000 ; FLAG, NAME2 SET
194 N1SET==010000 ; FLAG, NAME1 SET
195 4ARG==004000 ; FLAG, CONSIDER ARGS TO BE 4 STRINGS
197 RMT [EXPUNGE N1SET,N2SET,DVSET,SNSET,MSTNET,NOSTOR
200 ; TABLE OF LEGAL MODES
202 MODES: IRP A,,[READ,PRINT,READB,PRINTB,PRINTO,PRINAO]
208 ; TABLE OF KNOWN DEVICES AND A POINTER TO THEIR OPENERS
211 DEVSTB: IRP A,,[DSK,TTY,USR,STY,ST,NET,INT,PTP,PTR,UT,T,NUL]
212 SIXBIT /A/ ; DEVICE NAMES
215 DEVS: IRP B,,[ODSK,OTTY,OUSR,OSTY,OSTY,ONET,OINT,OPTP,OPTP,OUTN,OTTY,ONUL]
221 DEVSTB: IRP A,,[PS,SS,SRC,DSK,TTY,INT,NET]
225 DEVS: IRP B,,[ODSK,ODSK,ODSK,ODSK,OTTY,OINT,ONET]
233 ;SUBROUTINE TO DO OPENING BEGINS HERE
235 MFUNCTION NFOPEN,SUBR,[OPEN-NR]
239 MFUNCTION FOPEN,SUBR,[OPEN]
242 PUSHJ P,MAKCHN ;MAKE THE CHANNEL
243 PUSHJ P,OPNCH ;NOW OPEN IT
245 SUB D,[4,,4] ; TOP THE CHANNEL
246 MOVEM D,RCYCHN+1 ; RECYCLE DEAD CHANNEL
253 ; SUBR TO JUST CREATE A CHANNEL
255 IMFUNCTION CHANNEL,SUBR
265 ; THIS ROUTINE PARSES ARGUMENTS TO FOPEN ETC. AND BUILDS A CHANNEL BUT DOESN'T OPEN IT
267 MAKCHN: PUSH TP,$TPDL
268 PUSH TP,P ; POINT AT CURRENT STACK BASE
271 MOVEI E,10 ; SLOTS OF TP NEEDED
275 EXCH E,(P) ; GET RET ADDR IN E
277 IRP ATM,,[DEV,NM1,NM2,SNM]MDF,,[DSK,INPUT,>,[ ]]TMDF,,[DSK,INPUT,MUD,[ ]]
286 IFN ITS, MOVE B,CHQUOTE MDF
287 IFE ITS, MOVE B,CHQUOTE TMDF
293 PUSHJ P,STRTO6 ; RESULT LEFT ON P STACK AS DESIRED
296 PUSH TP,[0] ; PUSH SLOTS
299 PUSH P,[0] ; EXT SLOTS
302 PUSH P,E ; PUSH RETURN ADDRESS
305 JUMPGE AB,MAKCH0 ; NO ARGS, ALREADY DONE
306 GETYP 0,(AB) ; 1ST ARG MUST BE A STRING
309 MOVE A,(AB) ; GET ARG
311 PUSHJ P,CHMODE ; CHECK OUT OPEN MODE
313 PMOVEM (AB),T.DIR(TB) ; SAVE MODE NAME IN TEMPS
314 ADD AB,[2,,2] ; BUMP PAST DIRECTION
317 JUMPGE AB,MAKCH0 ; CHECK NAME1 BASED ON JUST MODE
319 MOVEI 0,0 ; FLAGS PRESET
320 PUSHJ P,RGPARS ; PARSE THE STRING(S)
323 ; ARGUMENTS PARSED, DO FINAL CHECKS AND BUILD CHANNEL
328 MOVE D,S.DEV(C) ; GET DEV
339 IFE ITS, CAIE D,(SIXBIT /INT/);INTERNAL?
340 IFN ITS, CAME D,[SIXBIT /INT /]
341 JRST CHNET ; NO, MAYBE NET
342 SKIPN T.XT+1(TB) ; WAS FCN SUPPLIED?
345 ; FALLS TROUGH IF SKIP
349 ; NOW BUILD THE CHANNEL
351 ARGSOK: MOVEI A,CHANLNT ; GET LENGTH
352 SKIPN B,RCYCHN+1 ; RECYCLE?
353 PUSHJ P,GIBLOK ; GET A BLOCK OF STUFF
355 ADD B,[4,,4] ; HIDE THE TTY BUFFER SLOT
358 HRLI C,PROCHN ; POINT TO PROTOTYPE
359 HRRI C,(B) ; AND NEW ONE
360 BLT C,CHANLN-5(B) ; CLOBBER
361 MOVSI C,TLIST ; TO GIVE HIM A CLEAN LIST OF SCRIPT CHANS
364 ; NOW BLT IN STUFF FROM THE STACK
366 MOVSI C,T.DIR(TB) ; DIRECTION
369 MOVEI C,RNAME1-1(B) ; NOW "REAL" SLOTS
382 ANDI B,403776 ; ONLY ALLOW NON-CRITICAL BITSS
384 HRRM B,-4(C) ; HIDE BITS
388 ; HERE TO VALIDIFY ARGUMENTS FOR A NET OPEN
392 CAME D,[SIXBIT /NET /] ; IS IT NET
395 CAIE D,(SIXBIT /NET/) ; IS IT NET
397 MOVSI D,TFIX ; FOR TYPES
398 MOVEI B,T.NM1(TB) ; MAKE SURE ALL ARE FIXED
403 LSH A,-1 ; SKIP DEV FLAG
407 MAKCH1: TRNN A,MSTNET ; CANT HAVE SEEN A FIX
412 CHFIX: TRNE A,N1SET ; SKIP IF NOT SPECIFIED
414 SETOM 1(B) ; SET TO -1
416 MOVEM D,(B) ; CORRECT TYPE
422 CHFIX1: ADDI C,1 ; POINT TO NEXT FIELD
423 LSH A,-1 ; AND NEXT FLAG
449 ; SUBROUTINE TO CHECK VALIDITY OF MODE AND SAVE A CODE
451 CHMODE: PUSHJ P,CHMOD ; DO IT
456 CHMOD: PUSHJ P,STRTO6 ; TO SIXBIT
457 POP P,B ; VALUE ENDSUP ON STACK, RESTORE IT
459 MOVSI A,-NMODES ; SCAN TO SEE IF LEGAL MODE
462 JUMPGE A,WRONGD ; ILLEGAL MODE NAME
468 ; RGPARS -- PARSE THE STRINGS COMPRISING FILE NAMES INTO STANDARD ITS GOODIES
470 RGPRS: MOVEI 0,NOSTOR ; DONT STORE STRINGS IF ENTER HERE
472 RGPARS: CAMGE AB,[-7,,] ; MULTI-STRING CASE POSSIBLE?
473 IORI 0,4ARG ; 4 STRING CASE
474 HRLM 0,(P) ; LH IS FLAGS FOR THIS PROG
475 MOVSI E,-4 ; FIELDS TO FILL
477 RPARGL: GETYP 0,(AB) ; GET TYPE
478 CAIE 0,TCHSTR ; STRING?
479 JRST ARGCLB ; NO, JUST CLOBBER IT IN RAW
480 JUMPGE E,CPOPJ ; DON'T DO ANY MORE
481 PUSH TP,(AB) ; GET AN ARG
484 FPARS: PUSH TP,-1(TP) ; ANOTHER COPY
488 PUSHJ P,FLSSP ; NO LEADING SPACES
489 MOVEI A,0 ; WILL HOLD SIXBIT
490 MOVEI B,6 ; CHARS PER 6BIT WORD
491 MOVE C,[440600,,A] ; BYTE POINTER INTO A
493 FPARSL: HRRZ 0,-1(TP) ; GET COUNT
496 ILDB 0,(TP) ; CHAR TO 0
498 CAIE 0,"
\11 ; FILE NAME QUOTE?
503 ILDB 0,(TP) ; USE THIS
511 JRST NDFLD ; YES, TERMINATE THIS FIELD
512 CAIN 0,": ; DEVICE ENDED?
514 CAIN 0,"; ; SNAME ENDED
518 PUSHJ P,A0TO6 ; CONVERT TO 6BIT AND CHECK
520 JUMPE B,FPARSL ; IGNORE IF AREADY HAVE 6
524 ; HERE IF SPACE ENCOUNTERED
526 NDFLD: MOVEI D,(E) ; COPY GOODIE
527 PUSHJ P,FLSSP ; FLUSH REDUNDANT SPACES
528 JUMPE 0,PARSD ; NO CHARS LEFT
530 NFL0: PUSH P,A ; SAVE SIXBIT WORD
531 SKIPGE -1(P) ; SKIP IF STRING TO BE STORED
533 PUSH TP,$TAB ; PREVENT AB LOSSAGE
535 PUSHJ P,6TOCHS ; CONVERT TO STRING
538 NFL1: HRRZ 0,-1(TP) ; RESTORE CHAR COUNT
540 NFL2: MOVEI C,(D) ; COPY REL PNTR
541 SKIPGE -1(P) ; SKIP IF STRINGS TO BE STORED
547 NFL3: MOVSI A,N1SET ; FLAG IT
549 IORM A,-1(P) ; AND CLOBBER
550 MOVE D,T.SPDL+1(TB) ; GET P BASE
551 POP P,@SIXTBL(C) ; AND STORE SIXBIT OF IT
553 POP TP,-2(TP) ; MAKE NEW STRING POINTER
555 JUMPE 0,.+3 ; SKIP IF NO MORE CHARS
556 AOBJN E,FPARS ; MORE TO PARSE?
557 CPOPJ: POPJ P, ; RETURN, ALL DONE
559 SUB TP,[2,,2] ; FLUSH OLD STRING
561 ADD AB,[2,,2] ; BUMP ARG
563 JUMPL AB,RPARGL ; AND GO ON
564 CPOPJ1: AOS A,(P) ; PREPARE TO WIN
570 ; HERE IF STRING HAS ENDED
572 PARSD: PUSH P,A ; SAVE 6 BIT
573 MOVE A,-3(TP) ; CAN USE ARG STRING
576 JRST NFL2 ; AND CONTINUE
578 ; HERE IF JUST READ DEV
580 GOTDEV: MOVEI D,2 ; CODE FOR DEVICE
581 JRST GOTFLD ; GOT A FIELD
583 ; HERE IF JUST READ SNAME
586 GOTFLD: PUSHJ P,FLSSP
590 ; HERE FOR NON STRING ARG ENCOUNTERED
592 ARGCLB: SKIPGE (P) ; IF NOT STORING, CONSIDER THIS THE END
595 MOVE C,T.SPDL+1(TB) ; GET P-BASE
596 MOVE A,S.DEV(C) ; GET DEVICE
597 CAME A,[SIXBIT /INT /]; IS IT THE INTERNAL DEVICE
598 JRST TRYNET ; NO, COUD BE NET
599 MOVE A,0 ; OFFNEDING TYPE TO A
600 PUSHJ P,APLQ ; IS IT APPLICABLE
603 ADD AB,[2,,2] ; MUST BE LAST ARG
606 JRST CPOPJ1 ; ELSE SUCCESSFUL RETURN
607 TRYNET: CAIE 0,TFIX ; FOR NET DEV, ARGS MUST BE FIX
608 JRST WRONGT ; TREAT AS WRONG TYPE
609 MOVSI A,MSTNET ; BETTER BE NET EVENTUALLY
610 IORM A,(P) ; STORE FLAGS
612 MOVE B,1(AB) ; GET NUMBER
613 MOVEI 0,(E) ; MAKE SURE NOT DEVICE
616 PUSH P,B ; SAVE NUMBER
617 MOVEI D,(E) ; SET FOR TABLE OFFSETS
620 JRST NFL2 ; GO CLOBBER IT AWAY
624 ; ROUTINE TO FLUSH LEADING SPACES FROM A FIELD
626 FLSSP: HRRZ 0,-1(TP) ; GET CHR COUNNT
627 JUMPE 0,CPOPJ ; FINISHED STRING
628 FLSS1: MOVE B,(TP) ; GET BYTR
630 CAIE C,^Q ; DONT FLUSH CNTL-Q
633 MOVEM B,(TP) ; UPDATE BYTE POINTER
636 FLSS2: HRRM 0,-1(TP) ; UPDATE STRING
640 ;TABLE FOR STFUFFING SIXBITS AWAY
642 SIXTBL: SETZ S.NM1(D)
649 RDTBL: SETZ RDEVIC(B)
658 ; TENEX VERSION OF FILE NAME PARSER (ONLY ACCEPT ARGS IN SINGLE STRING)
661 RGPRS: MOVEI 0,NOSTOR
663 RGPARS: HRLM 0,(P) ; SAVE FOR STORE CHECKING
664 CAMGE AB,[-2,,] ; MULTI-STRING CASE POSSIBLE?
665 JRST TN.MLT ; YES, GO PROCESS
666 RGPRSS: GETYP 0,(AB) ; CHECK ARG TYPE
668 JRST WRONGT ; FOR NOW ONLY STRING ARGS WIN
671 PUSHJ P,FLSSP ; FLUSH LEADING SPACES
675 CHKLST: JUMPGE AB,CPOPJ1
676 SKIPGE (P) ; IF FROM OPEN, ALLOW ONE MORE
685 RGPRS1: PUSH P,[0] ; ALLOW A DEVICE SPEC
690 CAIE A,"< ; START "DIRECTORY" ?
691 JRST TN.N1 ; NO LOOK FOR NAME1
692 SETOM (P) ; DEV NOT ALLOWED
695 PUSHJ P,TN.CNT ; COUNT CHARS TO ">" OR "."
696 JUMPE B,ILLNAM ; RAN OUT
701 TN.SN1: PUSHJ P,TN.CNT ; COUNT CHARS TO ">"
702 JUMPE B,ILLNAM ; RAN OUT
708 TN.SN2: HRRZ B,-3(TP)
712 TN.SN3: CAIE A,"> ; SKIP IF WINS
714 PUSHJ P,TN.CPS ; COPY TO NEW STRING
719 TN.N1: PUSHJ P,TN.CNT
721 CAIE A,": ; GOT A DEVICE
729 JRST TN.SNM ; NOW LOOK FOR SNAME
734 MOVEM A,(P) ; SAVE END CHAR
735 PUSHJ P,TN.CPS ; GEN STRING
739 TN.N2: SKIPN A,(P) ; GET CHAR BACK
741 CAIN A,"; ; START VERSION?
743 CAIE A,". ; START NAME2?
744 JRST ILLNAM ; I GIVE UP!!!
745 HRRZ B,-1(TP) ; GET RMAINS OF STRING
746 PUSHJ P,TN.CPS ; AND COPY IT
749 RPDONE: SUB P,[1,,1] ; FLUSH TEMP
753 TN.CNT: HRRZ 0,-1(TP) ; CHAR COUNT
755 MOVEI B,0 ; INIT COUNT TO 0
757 TN.CN1: MOVEI A,0 ; IN CASE RUN OUT
758 SOJL 0,CPOPJ ; RUN OUT?
760 CAIE A,"
\16 ; TNEX FILE QUOTE?
763 IBP C ; SKIP QUOTED CHAT
778 TN.CPS: PUSH P,B ; # OF CHARS
779 MOVEI A,4(B) ; ADD 4 TO B IN A
781 PUSHJ P,IBLOCK ; GET BLOCK OF WORDS FOR STRING
783 POP P,C ; CHAR COUNT BACK
787 HRRI A,(C) ; CHAR STRING
788 MOVE D,B ; COPY BYTER
791 ILDB 0,(TP) ; GET CHAR
795 MOVNI C,(A) ; - LENGTH TO C
796 ADDB C,-1(TP) ; DECREMENT WORDS COUNT
797 TRNN C,-1 ; SKIP IF EMPTY
800 SOS -1(TP) ; ELSE FLUSH TERMINATOR
803 ILLNAM: ERRUUO EQUOTE ILLEGAL-TENEX-FILE-NAME
805 TN.MLT: MOVE A,AB ; AOBJN POINTER TO ARGS IN A
807 TN.ML1: GETYP 0,(A) ; IS THIS ARG OF RIGHT TYPE
811 JRST RGPRSS ; ASSUME SINGLE STRING
813 JUMPL A,TN.ML1 ; TRY NEXT ARG IF ANY LEFT
815 MOVEI 0,T.NM1(TB) ; 1ST WORD OF DESTINATION
816 HLRO A,AB ; MINUS NUMBER OF ARGS IN A
817 MOVN A,A ; NUMBER OF ARGS IN A
820 MOVEI A,7 ; IF MORE THAN 10 ARGS, PUT 7
821 ADD A,0 ; LAST WORD OF DESTINATION
823 BLT 0,(A) ; BLT 'EM IN
824 ADD AB,[10,,10] ; SKIP THESE GUYS
831 ; ROUTINE TO OPEN A CHANNEL FOR ANY DEVICE. NAMES ARE ASSUMED TO ALREADY
832 ; BE ON BOTH TP STACK AND P STACK
834 OPNCH: MOVE C,T.SPDL+1(TB) ; GET PDL BASE
836 ANDI A,1 ; JUST WANT I AND O
839 ; .TRANS S.DEV(C) ; UNDO ANY TRANSLATIONS
840 ; JRST TRLOST ; COMPLAIN
847 MOVE A,S.DEV(C) ; GET SIXBIT DEVICE CODE
850 IFE ITS,[HRLZS A,S.DEV(C)
853 MOVSI B,-NDEVS ; AOBJN COUNTER
855 MOVE 0,DEVSTB(B) ; GET ONE FROM TABLE
857 DEVLP1: AND E,D ; FLUSH POSSIBLE DIGITNESS
859 JRST CHDIGS ; MAKE SURE REST IS DIGITS
861 JUMPN D,DEVLP1 ; KEEP TRUCKING UNTIL DONE
863 ; WASN'T THAT DEVICE, MOVE TO NEXT
864 NXTDEV: AOBJN B,DEVLP
865 JRST ODSK ; UNKNOWN DEVICE IS ASSUMED TO BE DISK
868 OUSR: HRRZ A,S.DIR(C) ; BLOCK OR UNIT?
869 TRNE A,2 ; SKIP IF UNIT
871 PUSHJ P,OPEN1 ; OPEN IT
872 PUSHJ P,FIXREA ; AND READCHST IT
873 MOVE B,T.CHAN+1(TB) ; RESTORE CHANNEL
874 MOVE 0,[PUSHJ P,DOIOT] ; GET AN IOINS
884 OSTY: HLRZ A,S.DIR(C)
885 IORI A,10 ; THE DONT LOSE BIT (DONT HANG ON INPUT DO ON OUTPUT)
890 ; MAKE SURE DIGITS EXIST
893 JUMPE D,DISPA ; NO DIGITS, WIN IMMEDIATE
895 AND E,D ; LEAVES ONLY DIGITS, IF WINNING
898 JUMPG D,.-2 ; KEEP GOING TIL DIGITS LEFT SHIFTED
903 JRST NXTDEV ; NOT A DIGIT, LOSE
904 JUMPE E,DISPA ; IF THAT'S ALL THE CHARACTERS, WIN!
906 ROTC D,6 ; GET NEXT CHARACTER INTO D
907 JRST CHDIG1 ; GO TEST?
909 ; HERE TO DISPATCH IF SUCCESSFUL
916 ; DISK DEVICE OPNER COME HERE
918 ODSK: MOVE A,S.SNM(C) ; GET SNAME
919 .SUSET [.SSNAM,,A] ; CLOBBER IT
920 PUSHJ P,OPEN0 ; DO REAL LIVE OPEN
924 ; TENEX DISK FILE OPENER
926 ODSK: MOVE B,T.CHAN+1(TB) ; GET CHANNEL
927 PUSHJ P,STSTK ; EXPAND STRING ONTO STACK (E POINTS TO OLD P)
930 PUSHJ P,STRTO6 ; GET DIR NAME
934 CAME C,[SIXBIT /PRINAO/]
935 CAMN C,[SIXBIT /PRINTO/]
936 IORI D,100 ; TURN ON BIT TO SAY USE OLD FILE
937 MOVSI A,101 ; START SETTING UP BITS EXTRA BIT FOR MSB
938 TRNE D,1 ; SKIP IF INPUT
939 TRNE D,100 ; WITE OVER?
940 TLOA A,100000 ; FORCE OLD VERSION
941 TLO A,600000 ; FORCE NEW VERSION
942 HRROI B,1(E) ; POINT TO STRING
944 TDZA 0,0 ; SAVE FACT OF NO SKIP
945 MOVEI 0,1 ; INDICATE SKIPPED
946 POP P,C ; RECOVER OPEN MODE SIXBIT
947 MOVE P,E ; RESTORE PSTACK
948 JUMPE 0,GTJLOS ; FIND OUT WHAT HAPPENED
950 MOVE B,T.CHAN+1(TB) ; GET CHANNEL
951 HRRZ 0,-4(B) ; FUNNY MODE BITS
952 HRRZM A,CHANNO(B) ; SAVE IT
953 ANDI A,-1 ; READ Y TO DO OPEN
954 MOVSI B,440000 ; USE 36. BIT BYES
955 HRRI B,200000 ; ASSUME READ
956 ; CAMN C,[SIXBIT /READB/]
957 ; TRO B,2000 ; TURN ON THAWED IF READB
959 TRNE D,1 ; SKIP IF READ
960 HRRI B,300000 ; WRITE BIT
961 HRRZ 0,FSAV(TB) ; SEE IF REF DATE HACK
963 TRO B,400 ; SET DON'T MUNG REF DATE BIT
964 MOVE E,B ; SAVE BITS FOR REOPENS
967 MOVE B,[2,,11] ; GET LENGTH & BYTE SIZE
972 LDB 0,[300600,,-1(P)] ; GET BYTE SIZE
978 SIZEF ; USE OPENED SIZE
981 SIZASC: MOVEI 0,C.OPN+C.READ+C.DISK
982 TRNE D,1 ; SKIP FOR READ
983 MOVEI 0,C.OPN+C.PRIN+C.DISK
984 TRNE D,2 ; SKIP IF NOT BINARY FILE
989 HLRM 0,LSTCH-1(B) ; SAVE CURRENT LENGTH
991 HRRM 0,-2(B) ; MUNG THOSE BITS
992 ASH A,1 ; POINT TO SLOT
993 ADDI A,CHNL0 ; TO REAL SLOT
994 MOVEM B,1(A) ; SAVE CHANNEL
995 PUSHJ P,TMTNXS ; GET STRING FROM TENEX
996 MOVE B,CHANNO(B) ; JFN TO A
997 HRROI A,1(E) ; BASE OF STRING
998 MOVE C,[111111,,140001] ; WEIRD CONTROL BITS
1000 MOVEI B,1(E) ; POINT TO START OF STRING
1001 SUBM P,E ; RELATIVIZE E
1002 PUSHJ P,TNXSTR ; MAKE INTO A STRING
1003 SUB P,E ; BACK TO NORMAL
1006 PUSHJ P,RGPRS1 ; PARSE INTO FIELDS
1012 OPFLOS: MOVEI C,(A) ; SAVE ERROR CODE
1014 HRRZ A,CHANNO(B) ; JFN BACK TO A
1015 RLJFN ; TRY TO RELEASE IT
1017 MOVEI A,(C) ; ERROR CODE BACK TO A
1019 GTJLOS: MOVE B,T.CHAN+1(TB)
1020 PUSHJ P,TGFALS ; GET A FALSE WITH REASON
1023 STSTK: PUSH TP,$TCHAN
1025 MOVEI A,4+5 ; COUNT CHARS NEEDED (NEED LAST 0 BYTE)
1031 ANDI A,-1 ; TO 18 BITS
1033 IDIVI A,5 ; TO WORDS NEEDED
1034 POP P,C ; SAVE RET ADDR
1035 MOVE E,P ; SAVE POINTER
1036 PUSH P,[0] ; ALOCATE SLOTS
1038 PUSH P,C ; RET ADDR BACK
1039 INTGO ; IN CASE OVERFLEW
1041 MOVE B,(TP) ; IN CASE GC'D
1042 MOVE D,[440700,,1(E)] ; BYTE POINTER TO IT
1044 PUSHJ P,MOVSTR ; FLUSH IT ON
1046 JUMPN A,NLNMS ; USER GAVE NAME, USE IT (CAREFUL, RELIES ON
1050 MOVEI A,0 ; HERE TO SEE IF THIS IS REALLY L.N.
1053 LNMST ; LOOK UP LOGICAL NAME
1054 MOVNI A,1 ; NOT A LOGICAL NAME
1059 JUMPE A,ST.NM1 ; LOGICAL NAME, FLUSH SNAME
1060 HRRZ A,RSNAME-1(B) ; ANY SNAME AT ALL?
1061 JUMPE A,ST.NM1 ; NOPE, CANT HACK WITH IT
1065 PUSHJ P,MOVSTR ; SNAME UP
1068 ST.NM1: MOVEI A,RNAME1-1(B)
1078 MOVSTR: HRRZ 0,(A) ; CHAR COUNT
1079 MOVE A,1(A) ; BYTE POINTER
1082 IDPB C,D ; MUNG IT UP
1085 ; MAKE A TENEX ERROR MESSAGE STRING
1087 TGFALS: PUSH TP,$TCHAN
1089 PUSH P,A ; SAVE ERROR CODE
1090 PUSHJ P,TMTNXS ; STRING ON STACK
1091 HRROI A,1(E) ; POINT TO SPACE
1092 MOVE B,(E) ; ERROR CODE
1093 HRLI B,400000 ; FOR ME
1094 MOVSI C,-100. ; MAX CHARS
1095 ERSTR ; GET TENEX STRING
1099 MOVEI B,1(E) ; A AND B BOUND STRING
1100 SUBM P,E ; RELATIVIZE E
1101 PUSHJ P,TNXSTR ; BUILD STRING
1102 SUB P,E ; P BACK TO NORMAL
1104 IFE FNAMS, SUB P,[1,,1] ; FLUSH ERROR CODE SLOT
1134 PUSHJ P,IILIST ; BUILD LIST
1135 MOVSI A,TFALSE ; MAKE IT FALSE
1139 TGFLS1: MOVE P,E ; RESET STACK
1141 MOVE B,CHQUOTE UNKNOWN PROBLEM IN I/O
1145 ; OTHER BUFFERED DEVICES JOIN HERE
1149 PUSHJ P,FIXREA ; STORE THE "REAL" NAMES INTO THE CHANNEL
1151 OPBASC: MOVE C,T.SPDL+1(TB) ; C WAS CLOBBERED, GET IT BACK
1152 HRRZ A,S.DIR(C) ; FIND OUT IF OPEN IS ASCII OR WORD
1153 TRZN A,2 ; SKIP IF BINARY
1154 PUSHJ P,OPASCI ; DO IT FOR ASCII
1156 ; NOW SET UP IO INSTRUCTION FOR CHANNEL
1158 MAKION: MOVE B,T.CHAN+1(TB)
1160 JUMPE A,MAKIO1 ; JUMP IF INPUT
1161 MOVEI C,PUTCHR ; ELSE GET INPUT
1162 MOVEI 0,80. ; DEFAULT LINE LNTH
1168 MOVEM C,IOINS(B) ; STORE IT
1169 JUMPN A,OPNWIN ; GET AN EOF FORM FOR INPUT CHANNEL
1171 ; HERE TO CONS UP <ERROR END-OF-FILE>
1173 EOFMAK: MOVSI C,TATOM
1174 MOVE D,EQUOTE END-OF-FILE
1178 MOVE D,IMQUOTE ERROR
1180 MOVE D,T.CHAN+1(TB) ; RESTORE CHANNEL
1185 OPNWIN: MOVEI 0,10. ; SET UP RADIX
1186 MOVSI A,TCHAN ; OPEN SUCCEEDED, RET CHANNEL
1190 OPNRET: MOVE D,T.CHAN+1(TB) ; IN CASE WE RECYCLE IT
1191 MOVE C,(P) ; RET ADDR
1192 SUB P,[S.X3+2,,S.X3+2]
1193 SUB TP,[T.CHAN+2,,T.CHAN+2]
1197 ; HERE TO CREATE CHARACTER BUFFERS FOR ASCII I/O
1199 OPASCI: PUSH P,A ; CONTAINS MODE, SAVE IT
1200 MOVEI A,BUFLNT ; GET SIZE OF BUFFER
1201 PUSHJ P,IBLOCK ; GET STORAGE
1202 MOVSI 0,TWORD+.VECT. ; SET UTYPE
1203 MOVEM 0,BUFLNT(B) ; AND STORE
1205 SKIPE (P) ; SKIP IF INPUT
1207 MOVEI D,BUFLNT-1(B) ; REST BYTE POINTER
1208 OPASCA: HRLI D,010700
1209 MOVE B,T.CHAN+1(TB) ; GET CHANNEL BACK
1211 IORM 0,-2(B) ; TURN ON BUFFER BIT
1213 MOVEM D,BUFSTR(B) ; CLOBBER
1217 OPASCO: HRROI C,777776
1218 MOVEM C,(B) ; -1 THE BUFFER (LEAVE OFF LOW BIT)
1220 HRRI C,1(B) ; BUILD BLT POINTER
1221 BLT C,BUFLNT-1(B) ; ZAP
1222 MOVEI D,-1(B) ; START MAKING STRING POINTER
1223 HRRI A,BUFLNT*5 ; SET UP CHAR COUNT
1227 ; OPEN NON FILE ORIENTED DEVICES (NUL, PTR, PTP ETC.)
1232 OPTR: PUSHJ P,OPEN0 ; SET UP MODE AND OPEN
1233 SETZM S.NM1(C) ; CLOBBER UNINTERESTING FIELDS
1238 ; OPEN DEVICES THAT IGNORE SNAME
1246 ; INTERNAL CHANNEL OPENER
1248 OINT: HRRZ A,S.DIR(C) ; CHECK DIR
1249 CAIL A,2 ; READ/PRINT?
1250 JRST WRONGD ; NO, LOSE
1252 MOVE 0,INTINS(A) ; GET INS
1253 MOVE D,T.CHAN+1(TB) ; AND CHANNEL
1254 MOVEM 0,IOINS(D) ; AND CLOBBER
1255 MOVEI 0,C.OPN+C.READ
1257 MOVEI 0,C.OPN+C.PRIN
1259 SETOM STATUS(D) ; MAKE SURE NOT AA TTY
1260 PMOVEM T.XT(TB),INTFCN-1(D)
1262 ; HERE TO SAVE PSEUDO CHANNELS
1264 SAVCHN: HRRZ E,CHNL0+1 ; POINT TO CURRENT LIST
1266 PUSHJ P,ICONS ; CONS IT ON
1270 ; INT DEVICE I/O INS
1272 INTINS: PUSHJ P,GTINTC
1276 ; HERE TO OPEN THE NET DEVICE (I.E. THE ARPA NET)
1279 ONET: HRRZ A,S.DIR(C) ; DIRECTION CODE
1281 IORI A,4 ; TURN ON IMAGE BIT
1282 SKIPGE S.NM1(C) ; NAME1 I.E. LOCAL HOST GIVEN
1283 IORI A,10 ; NO, WE WILL LET ITS GIVE US ONE
1284 SKIPGE S.NM2(C) ; NORMAL OR "LISTEN"
1285 IORI A,20 ; TURN ON LISTEN BIT
1286 MOVEI 0,7 ; DEFAULT BYTE SIZE
1288 MOVEI 0,36. ; IMAGE WHICH IS 36
1289 SKIPN T.XT(TB) ; BYTE SIZE GIVEN?
1290 MOVEM 0,S.X1(C) ; NO, STORE DEFAULT
1291 SKIPG D,S.X1(C) ; BYTE SIZE REASONABLE?
1292 JRST RBYTSZ ; NO <0, COMPLAIN
1293 TRNE A,2 ; SKIP TO CHECK ASCII
1294 JRST ONET2 ; CHECK IMAGE
1295 CAIN D,7 ; 7-BIT WINS
1297 CAIE D,44 ; 36-BIT INDICATES BLOCK ASCII MODE
1299 IORI A,2 ; SET BLOCK FLAG
1301 IORI A,40 ; USE 8-BIT MODE
1302 CAIN D,10 ; IS IT RIGHT
1306 RBYTSZ: ERRUUO EQUOTE BYTE-SIZE-BAD
1309 ONET2: CAILE D,36. ; IMAGE SIZE REASONABLE?
1312 JRST ONET1 ; YES, DONT SET FIELD
1314 ASH D,9. ; POSITION FOR FIELD
1315 IORI A,40(D) ; SET IT AND ITS BIT
1317 ONET1: HRLM A,S.DIR(C) ; CLOBBER OPEN BLOCK
1318 MOVE E,A ; SAVE BLOCK MODE INFO
1319 PUSHJ P,OPEN1 ; DO THE OPEN
1322 ; CLOBBER REAL SLOTS FOR THE OPEN
1324 MOVEI A,3 ; GET STATE VECTOR
1330 MOVSI A,TFIX+.VECT. ; SET U TYPE
1335 PUSHJ P,INETST ; GET STATE
1337 POP P,A ; IS THIS BLOCK MODE
1338 MOVEI 0,80. ; POSSIBLE LINE LENGTH
1339 TRNE A,1 ; SKIP IF INPUT
1341 TRNN A,2 ; BLOCK MODE?
1343 TRNN A,4 ; ASCII MODE?
1344 JRST OPBASC ; GO SETUP BLOCK ASCII
1345 MOVE 0,[PUSHJ P,DOIOT]
1350 ; INTERNAL ROUTINE TO GET THE CURRENT STATE OF THE NETWROK CHANNEL
1352 INETST: MOVE A,S.NM1(C)
1356 LDB A,[1100,,S.SNM(C)]
1359 MOVE E,BUFRIN(B) ; GET STATE BLOCK
1360 INTST1: HRRE 0,S.X1(C)
1368 ; ACCEPT A CONNECTION
1370 MFUNCTION NETACC,SUBR
1372 PUSHJ P,ARGNET ; CHECK THAT ARG IS AN OPEN NET CHANNEL
1373 MOVE A,CHANNO(B) ; GET CHANNEL
1374 LSH A,23. ; TO AC FIELD
1377 JRST IFALSE ; RETURN FALSE
1382 ; FORCE SYSTEM NETWORK BUFFERS TO BE SENT
1389 SKIPA A,CHANNO(B) ; GET CHANNEL
1396 ; SUBR TO RETURN UPDATED NET STATE
1398 MFUNCTION NETSTATE,SUBR
1400 PUSHJ P,ARGNET ; IS IT A NET CHANNEL
1404 ; INTERNAL NETSTATE ROUTINE
1406 INSTAT: MOVE C,P ; GET PDL BASE
1407 MOVEI 0,S.X3 ; # OF SLOTS NEEDED
1410 ; RESTORED FROM MUDDLE 54. IT SEEMED TO WORK THERE, AND THE STUFF
1411 ; COMMENTED OUT HERE CERTAINLY DOESN'T.
1415 ; HRR D,CHANNO(B) ; SETUP FOR RFNAME CALL
1416 ; DOTCAL RFNAME,[D,[2003,,S.DEV],[2003,,S.NM1],[2003,,S.NM2],[2003,,S.SNM]]
1417 ; .LOSE %LSFIL ; THIS MAY NOT BE DESIRABLE, BUT I ASSUME WE CARE IF
1419 PUSHJ P,INETST ; INTO VECTOR
1425 ; INTERNAL ROUTINE TO CHECK FOR CORRECT CHANNEL TYPE
1431 MOVE B,1(AB) ; GET CHANNEL
1432 SKIPN CHANNO(B) ; OPEN?
1434 MOVE A,RDEVIC-1(B) ; GET DEV NAME
1438 CAME A,[SIXBIT /NET /]
1441 MOVE A,DIRECT-1(B) ; CHECK FOR A READ SOCKET
1444 MOVE B,1(AB) ; RESTORE CHANNEL
1450 ; TENEX NETWRK OPENING CODE
1452 ONET: MOVE B,T.CHAN+1(TB) ; GET CHANNEL
1456 PUSH P,[ASCII /NET:/] ; FOR STRINGS
1457 GETYP 0,RNAME1-1(B) ; CHECK TYPE
1458 CAIE 0,TFIX ; SKIP IF # SUPPLIED
1460 MOVE 0,RNAME1(B) ; GET IT
1464 ONET1: CAIE 0,TCHSTR
1482 CAIG 0,377 ;NEW STYLE 32 BIT HOST NUMBER?
1484 ;CONVERT HOSTS2 HOST NUMBERS TO INTERNET (TOPS-20) HOST NUMBERS
1486 LDB B,[001100,,0] ;HOST NUMBER: 1.1-1.9 ->
1487 DPB B,[201000,,A] ; 2.8-3.6
1488 LDB B,[111100,,0] ;IMP LOW BITS: 2.1-2.9 ->
1489 DPB B,[001000,,A] ; 1.1-1.8
1490 LDB B,[221100,,0] ;IMP HIGH BITS: 3.1-3.9 ->
1491 DPB B,[101000,,A] ; 1.9-2.7
1492 LDB B,[331100,,0] ;NETWORK: 4.1-4.9 ->
1493 DPB B,[301000,,A] ; 3.7-4.5
1495 ONET2A: PUSHJ P,FIXSTK
1504 ONET3: CAIE 0,TCHSTR
1514 ONET5: MOVE B,T.CHAN+1(TB)
1523 HRROI B,1(E) ; STRING POINTER
1524 GTJFN ; GET THE G.D JFN
1525 TDZA 0,0 ; REMEMBER FAILURE
1527 MOVE P,E ; RESTORE P
1528 JUMPE 0,GTJLOS ; CONS UP ERROR STRING
1531 HRRZM A,CHANNO(B) ; SAVE THE JFN
1546 TRNE D,1 ; SKIP FOR INPUT
1548 ANDI A,-1 ; ISOLATE JFCN
1550 JRST OPFLOS ; REPORT ERROR
1552 ASH A,1 ; POINT TO SLOT
1553 ADDI A,CHNL0 ; TO REAL SLOT
1554 MOVEM B,1(A) ; SAVE CHANNEL
1555 MOVE C,T.SPDL+1(TB) ; POINT TO P BASE
1556 HRRZ A,S.DIR(C) ; 0/ 0 FOR READ 0/ 1 FOR PRINT
1557 MOVEI 0,C.OPN+C.READ
1559 MOVEI 0,C.OPN+C.PRIN
1564 CVSKT ; GET ABS SOCKET #
1565 FATAL NETWORK BITES THE BAG!
1577 MOVE 0,[PUSHJ P,DONETO]
1578 TRNN C,1 ; SKIP FOR OUTPUT
1579 MOVE 0,[PUSHJ P,DONETI]
1581 MOVEI 0,80. ; LINELENGTH
1582 TRNE C,1 ; SKIP FOR INPUT
1584 MOVEI A,3 ; GET STATE UVECTOR
1593 MOVE B,CHANNO(B) ; GET JFN
1594 MOVEI A,4 ; CODE FOR GTNCP
1596 ADJSP P,4 ; ROOM FOR DATA
1597 MOVE D,[-4,,1] ; GET FHOST, LOC SOC, F SOC
1599 FATAL NET LOSSAGE ; GET STATE
1608 MOVEM B,(C) ; INITIAL STATE STORED
1612 ; DOIOT FOR TENEX NETWRK
1623 MOVEI 0,(A) ; POSSIBLE OUTPUT CHAR TO 0
1629 MOVEI A,(B) ; RET CHAR IN A
1652 JFFO 0,FIXS3 ; PUT OCTAL DIGITS INTO STIRNG
1664 ROTC 0,3 ; NEXT DIGIT
1673 TLNE C,760000 ; SKIP IF NEW WORD
1679 MOVE B,CHANNO(B) ; GET JFN
1680 MOVEI A,4 ; CODE FOR GTNCP
1682 ADJSP P,4 ; ROOM FOR DATA
1683 MOVE D,[-4,,1] ; GET FHOST, LOC SOC, F SOC
1685 FATAL NET LOSSAGE ; GET STATE
1690 MOVEM D,RNAME2(E) ; UPDATE FOREIGN SOCHKET
1691 MOVEM C,RSNAME(E) ; AND HOST
1693 XCT ITSTRN(B) ; XLATE TO LOOK MORE LIKE ITS
1694 MOVEM B,(C) ; STORE STATE
1714 NLOSS: FATAL ILLEGAL NETWORK STATE
1716 NOPND: MOVE B,DIRECT(E) ; SEE IF READ OR PRINT
1717 ILDB B,B ; GET 1ST CHAR
1718 CAIE B,"R ; SKIP FOR READ
1720 SIBE ; SEE IF INPUT EXISTS
1724 MOVEM B,2(C) ; STORE BYTES IN STATE VECTOR
1725 MOVEI B,11 ; RETURN DATA PRESENT STATE
1728 NOPNDW: SOBE ; SEE IF OUTPUT PRESENT
1736 NCLSD: MOVE B,DIRECT(E)
1750 MFUNCTION NETSTATE,SUBR
1761 CAME A,MODES+1 ; PRINT OR PRINTB?
1767 NETRET: MOVE B,1(AB)
1771 MFUNCTION NETACC,SUBR
1781 ; HERE TO OPEN TELETYPE DEVICES
1783 OTTY: HRRZ A,S.DIR(C) ; GET DIR CODE
1784 TRNE A,2 ; SKIP IF NOT READB/PRINTB
1785 JRST WRONGD ; CANT DO THAT
1788 MOVE A,S.NM1(C) ; CHECK FOR A DIR
1790 CAMN A,[SIXBIT /.FILE./]
1791 CAME 0,[SIXBIT /(DIR)/]
1793 JRST OUTN ; DO IT THAT WAY
1795 HRRZ A,S.DIR(C) ; CHECK DIR
1799 PUSH P,S.DEV(C) ; SAVE THE SIXBIT DEV NAME
1800 ; HRLZS (P) ; POSTITION DEVICE NAME
1802 TTYLP: SKIPN D,1(E) ; CHANNEL OPEN?
1803 JRST TTYLP1 ; NO, GO TO NEXT
1804 MOVE A,RDEVIC-1(D) ; GET DEV NAME
1806 PUSHJ P,STRTO6 ; TO 6 BIT
1807 POP P,A ; GET RESULT
1809 JRST SAMTYQ ; COULD BE THE SAME
1810 TTYLP1: ADD E,[2,,2]
1812 SUB P,[1,,1] ; THIS ONE MUST BE UNIQUE
1813 TTYLP2: MOVE C,T.SPDL+1(TB) ; POINT TO P BASE
1814 HRRZ A,S.DIR(C) ; GET DIR OF OPEN
1815 SKIPE A ; IF OUTPUT,
1816 IORI A,20 ; THEN USE DISPLAY MODE
1817 HRLM A,S.DIR(C) ; STORE IN OPEN BLOCK
1818 PUSHJ P,OPEN2 ; OPEN THE TTY
1819 MOVE A,S.DEV(C) ; GET DEVICE NAME
1820 PUSHJ P,6TOCHS ; TO A STRING
1821 MOVE D,T.CHAN+1(TB) ; POINT TO CHANNEL
1824 MOVE C,T.SPDL+1(TB) ; RESTORE PDL BASE
1825 MOVE B,D ; CHANNEL TO B
1826 HRRZ 0,S.DIR(C) ; AND DIR
1828 TTY1: DOTCAL TTYGET,[CHANNO(B),[2000,,0],[2000,,A],[2000,,D]]
1830 DOTCAL TTYSET,[CHANNO(B),MODE1,MODE2,D]
1832 MOVE A,[PUSHJ P,GMTYO]
1834 DOTCAL RSSIZE,[CHANNO(B),[2000,,A],[2000,,D]]
1842 IOTMAK: HRLZ A,CHANNO(B) ; GET CHANNEL
1844 IOR A,[.IOT A] ; BUILD IOT
1845 MOVEM A,IOINS(B) ; AND STORE IT
1849 ; HERE IF POSSIBLY OPENING AN ALREADY OPEN TTY
1851 SAMTYQ: MOVE D,1(E) ; RESTORE CURRENT CHANNEL
1852 MOVE A,DIRECT-1(D) ; GET DIR
1855 POP P,A ; GET SIXBIT
1858 CAME A,MODES(C) ; SKIP IF DIFFERENT DIRECTION
1861 ; HERE IF A RE-OPEN ON A TTY
1863 HRRZ 0,FSAV(TB) ; IS IT FROM A FOPEN
1865 JRST RETOLD ; RET OLD CHANNEL
1868 PUSH TP,1(E) ; PUSH OLD CHANNEL
1870 PUSH TP,T.CHAN+1(TB)
1871 MOVE A,[PUSHJ P,CHNFIX]
1872 MOVEI PVP,0 ; SAY MIGHT BE NON-ATOMS
1876 RETOLD: MOVE B,1(E) ; GET CHANNEL
1877 AOS CHANNO-1(B) ; AOS REF COUNT
1879 SUB P,[1,,1] ; CLEAN UP STACK
1880 JRST OPNRET ; AND LEAVE
1883 ; ROUTINE TO PASS TO GCHACK TO FIX UP CHANNEL POINTER
1885 CHNFIX: CAIN C,TCHAN
1888 MOVE D,-2(TP) ; GET REPLACEMENT
1890 MOVEM D,1(B) ; CLOBBER IT AWAY
1895 MOVE C,T.SPDL+1(TB) ; POINT TO P BASE
1896 HRRZ 0,S.DIR(C) ; 0/ 0 FOR READ 0/ 1 FOR PRINT
1897 MOVE A,[PUSHJ P,INMTYO]
1900 MOVEI A,100 ; PRIM INPUT JFN
1902 MOVEI E,C.OPN+C.READ+C.TTY
1904 MOVEM B,CHNL0+2*100+1
1906 TNXTY1: MOVEM B,CHNL0+2*101+1
1907 MOVEI A,101 ; PRIM OUTPUT JFN
1908 MOVEI E,C.OPN+C.PRIN+C.TTY
1910 TNXTY2: MOVEM A,CHANNO(B)
1913 ; SETUP FUNNY BUFFER FOR TTY INPUT DEVICES
1915 TTYSPC: MOVEI A,EXTBFR ; GET EXTRA BUFFER
1916 PUSHJ P,IBLOCK ; GET BLOCK
1917 MOVE D,T.CHAN+1(TB) ;RESTORE CHANNEL POINTER
1929 MOVEM A,EXBUFR-1(D) ; FOR WAITING TTY BUFFERS
1930 SETZM EXBUFR(D) ; NIL LIST
1931 MOVEM B,BUFRIN(D) ;STORE IN CHANNEL
1932 MOVSI A,TUVEC ;MAKE SURE TYPE IS UNIFORM VECTOR
1934 MOVEI A,177 ;SET ERASER TO RUBOUT
1941 SETZM KILLCH(B) ;NO KILL CHARACTER NEEDED
1943 MOVEI A,33 ;BREAKCHR TO C.R.
1945 MOVEI A,"\ ;ESCAPER TO \
1947 MOVE A,[010700,,BYTPTR(E)] ;RELATIVE BYTE POINTER
1949 MOVEI A,14 ;BARF BACK CHARACTER FF
1954 ; SETUP DEFAULT TTY INTERRUPT HANDLER
1957 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
1959 PUSH TP,[10] ; PRIORITY OF CHAR INT
1962 MCALL 3,EVENT ; 1ST MAKE AN EVENT EXIST
1966 PUSH TP,[QUITTER] ; DEFAULT HANDLER IS QUITTER
1969 ; BUILD A NULL STRING
1972 PUSHJ P,IBLOCK ; USE A BLOCK
1982 MOVE B,D ; CHANNEL TO B
1986 ; ROUTINE TO OPEN ITS CHANNEL WITHOUT .RCHST
1989 OPEN2: MOVEI A,S.DIR(C) ; POINT TO OPEN BLOCK
1990 PUSHJ P,MOPEN ; OPEN THE FILE
1992 MOVE B,T.CHAN+1(TB) ; GET CHANNEL BACK
1993 MOVEM A,CHANNO(B) ; SAVE THE CHANNEL
1996 ; FIX UP MODE AND FALL INTO OPEN
1998 OPEN0: HRRZ A,S.DIR(C) ; GET DIR
1999 TRNE A,2 ; SKIP IF NOT BLOCK
2000 IORI A,4 ; TURN ON IMAGE
2001 IORI A,2 ; AND BLOCK
2005 PUSH TP,C ; SAVE CRUFT TO CHECK FOR PRINTO, HA HA
2008 MOVE B,DIRECT(B) ; THIS KLUDGE THE MESS OF NDR
2011 POP P,D ; THE SIXBIT FOR KLUDGE
2012 POP P,A ; GET BACK THE RANDOM BITS
2014 CAME D,[SIXBIT /PRINAO/]
2015 CAMN D,[SIXBIT /PRINTO/]
2016 IORI A,100000 ; WRITEOVER BIT
2019 IORI A,10 ; DON'T CHANGE REF DATE
2020 OPEN9: HRLM A,S.DIR(C) ; AND STORE IT
2022 ; ROUTINE TO ATTEMPT TO OPEN A REAL ITS CHANNEL
2024 OPEN1: MOVEI A,S.DIR(C) ; POINT TO OPEN BLOCK
2027 MOVE B,T.CHAN+1(TB) ; GET CHANNEL BACK
2028 MOVEM A,CHANNO(B) ; CLOBBER INTO CHANNEL
2029 DOTCAL RFNAME,[A,[2003,,S.DEV],[2003,,S.NM1],[2003,,S.NM2],[2003,,S.SNM]]
2032 ; NOW CLOBBER THE TVP SLOT FOR THIS CHANNEL
2034 OPEN3: MOVE A,S.DIR(C)
2035 MOVEI 0,C.OPN+C.READ
2037 MOVEI 0,C.OPN+C.PRIN
2041 MOVE A,CHANNO(B) ; GET CHANNEL #
2043 ADDI A,CHNL0 ; POINT TO SLOT
2044 MOVEM B,1(A) ; NOT: TYPE ALREADY SETUP
2046 ; NOW GET STATUS WORD
2048 DOSTAT: HRRZ A,CHANNO(B) ; NOW GET STATUS WORD
2049 DOTCAL STATUS,[A,[2002,,STATUS]]
2054 ; HERE IF OPEN FAILS (CHANNEL IS IN A)
2056 OPNLOS: JUMPL A,NOCHAN ; ALL CHANNELS ARE IN USE
2057 LSH A,23. ; DO A .STATUS
2061 PUSHJ P,GFALS ; GET A FALSE WITH A MESSAGE
2062 SUB P,[1,,1] ; EXTRA RET ADDR FLUSHED
2063 JRST OPNRET ; AND RETURN
2068 IFN ITS, PUSHJ P,GFALS
2069 IFE ITS, PUSHJ P,TGFALS
2072 ; ROUTINE TO CONS UP FALSE WITH REASON
2074 GFALS: PUSH TP,$TCHAN
2076 PUSH P,[SIXBIT / ERR/] ; SET UP OPEN TO ERR DEV
2077 PUSH P,[3] ; SAY ITS FOR CHANNEL
2079 .OPEN 0,-2(P) ; USE CHANNEL 0 FOR THIS
2080 FATAL CAN'T OPEN ERROR DEVICE
2081 SUB P,[3,,3] ; DONT WANT OPEN BLOCK NOW
2083 MOVEI A,0 ; PREPARE TO BUILD STRING ON STACK
2084 EL1: PUSH P,[0] ; WHERE IT WILL GO
2085 MOVSI B,(<440700,,(P)>) ; BYTE POINTER TO TOP OF STACK
2086 EL2: .IOT 0,0 ; GET A CHAR
2087 JUMPL 0,EL3 ; JUMP ON -1,,3
2089 JRST EL3 ; YES, MAKE STRING
2090 CAIN 0,14 ; IGNORE FORM FEEDS
2091 JRST EL2 ; IGNORE FF
2092 CAIE 0,15 ; IGNORE CR & LF
2096 TLNE B,760000 ; SIP IF WORD FULL
2098 AOJA A,EL1 ; COUNT WORD AND GO
2112 MOVSI B,(<440700,,(P)>)
2114 IRP XX,,[RDEVIC,RSNAME,RNAME1,RNAME2]YY,,[0,72,73,40]
2125 SKIPN (P) ; ANY CHARS AT END?
2126 SUB P,[1,,1] ; FLUSH XTRA
2127 PUSH P,A ; PUT UP COUNT
2128 .CLOSE 0, ; CLOSE THE ERR DEVICE
2129 PUSHJ P,CHMAK ; MAKE STRING
2136 IFE FNAMS, MOVEI A,1
2143 MOVSI A,TFALSE ; MAKEIT A FALSE
2144 IFN FNAMS, SUB TP,[2,,2]
2151 MOVSI B,(<440700,,(P)>)
2162 ; ROUTINE TO FILL IN THE "REAL" SLOTS FOR THE CHANNEL
2165 IFE ITS, HRLZS S.DEV(C) ; KILL MODE BITS
2168 FIXRE1: MOVEI A,(D) ; COPY REL POINTER
2169 ADD A,T.SPDL+1(TB) ; POINT TO SLOT
2170 SKIPN A,(A) ; SKIP IF GOODIE THERE
2172 PUSHJ P,6TOCHS ; MAKE INOT A STRING
2173 MOVE C,RDTBL-S.DEV(D); GET OFFSET
2177 FIXRE2: AOBJN D,FIXRE1
2182 HRR A,CHANNO(B) ; GET CHANNEL
2183 DOTCAL OPEN,[A,-3(P),-2(P),-1(P),(P)]
2189 ;THIS ROUTINE CONVERTS MUDDLE CHARACTER STRINGS TO SIXBIT FILE NAMES
2192 PUSH P,E ;SAVE USEFUL FROB
2193 MOVEI E,(A) ; CHAR COUNT TO E
2195 CAIE A,TCHSTR ; IS IT ONE WORD?
2197 CAILE E,6 ; SKIP IF L=? 6 CHARS
2199 CHREAD: MOVEI A,0 ;INITIALIZE OUTPUT WORD
2200 MOVE D,[440600,,A] ;AND BYTE POINTER TO IT
2201 NEXCHR: SOJL E,SIXDON
2202 ILDB 0,B ; GET NEXT CHAR
2203 CAIN 0,^Q ; CNTL-Q, QUOTES NEXT CHAR
2205 JUMPE 0,SIXDON ;IF NULL, WE ARE FINISHED
2206 PUSHJ P,A0TO6 ; CONVERT TO SIXBIT
2207 IDPB 0,D ;DEPOSIT INTO SIX BIT
2208 JRST NEXCHR ; NO, GET NEXT
2209 SIXDON: SUB TP,[2,,2] ;FIX UP TP
2211 EXCH A,(P) ;LEAVE RESULT ON P-STACK
2212 JRST (A) ;NOW RETURN
2215 ;SUBROUTINE TO CONVERT SIXBIT TO ATOM
2219 MOVEI B,0 ;MAX NUMBER OF CHARACTERS
2220 PUSH P,[0] ;STRING WILL GO ON P SATCK
2221 JUMPE A,GETATM ; EMPTY, LEAVE
2222 MOVEI E,-1(P) ;WILL BE BYTE POINTER
2223 HRLI E,10700 ;SET IT UP
2224 PUSH P,[0] ;SECOND POSSIBLE WORD
2225 MOVE D,[440600,,A] ;INPUT BYTE POINTER
2226 6LOOP: ILDB 0,D ;START CHAR GOBBLING
2227 ADDI 0,40 ;CHANGET TOASCII
2228 IDPB 0,E ;AND STORE IT
2229 TLNN D,770000 ; SKIP IF NOT DONE
2231 TDNN A,MSKS(B) ; CHECK IF JUST SPACES LEFT
2232 AOJA B,GETATM ; YES, DONE
2233 AOJA B,6LOOP ;KEEP LOOKING
2234 6LOOP1: PUSH P,[6] ;IF ARRIVE HERE, STRING IS 2 WORDS
2236 GETATM: MOVEM B,(P) ;SET STRING LENGTH=1
2237 PUSHJ P,CHMAK ;MAKE A MUDDLE STRING
2251 A0TO6: CAIL 0,141 ;IF IT IS GREATER OR EQUAL TO LOWER A
2252 CAILE 0,172 ;BUT LESS THAN OR EQUAL TO LOWER Z
2254 SUBI 0,40 ;CONVERT TO UPPER CASE
2255 SUBI 0,40 ;NOW TO SIX BIT
2256 JUMPL 0,BAD6 ;CHECK FOR A WINNER
2261 ; SUBR TO TEST THE EXISTENCE OF FILES
2263 MFUNCTION FEXIST,SUBR,[FILE-EXISTS?]
2269 PUSH TP,P ; SAVE P-STACK BASE
2271 MOVSI E,-4 ; 4 THINGS TO PUSH
2273 IFN ITS, MOVE B,@RNMTBL(E)
2274 IFE ITS, MOVE B,@FETBL(E)
2279 CAIE 0,TCHSTR ; SKIP IF WINS
2282 IFN ITS, PUSHJ P,STRTO6 ; CONVERT TO SIXBIT
2285 ; PUSHJ P,ADDNUL ; NOT NEEDED, SINCE CONSED INTO ONE STRING-TAA
2287 PUSH TP,A ; DEFAULT TYPE AND VALUE GIVEN BY USER
2288 PUSH TP,B ; IN VALUE OF DEV, SNM, NM1, NM2
2294 IFN ITS, PUSH P,EXISTS(E) ; USE DEFAULT
2296 PUSH TP,FETYP(E) ; DEFAULT TYPE AND VALUE IF NO
2297 PUSH TP,FEVAL(E) ; DEFAULT GIVEN BY USER
2301 PUSHJ P,RGPRS ; PARSE THE ARGS
2302 JRST TMA ; TOO MANY ARGUMENTS
2305 MOVE 0,-3(P) ; GET SIXBIT DEV NAME
2307 CAMN 0,[SIXBITS /DSK /]
2308 MOVSI B,10 ; DONT SET REF DATE IF DISK DEV
2310 DOTCAL OPEN,[B,[17,,-3],[17,,-2],[17,,-1],[17,,0]]
2313 JRST FDLWON ; WON!!!
2314 .STATUS 0,A ; FIND THE STATUS OF CHANNEL BEFORE POPING
2320 SUBI B,10 ; GET B TO POINT CORRECTLY TO ARGS
2321 PUSHJ P,STSTK ; GET FILE NAME IN A STRING
2322 HRROI B,1(E) ; POINT B TO THE STRING
2325 JRST TDLLOS ; FILE DOES NOT EXIST
2326 RLJFN ; FILE EXIST SO RETURN JFN
2328 JRST FDLWON ; SUCCESS
2332 EXISTS: SIXBITS /DSK INPUT > /
2335 FETBL: SETZ IMQUOTE NM1
2345 FEVAL: 440700,,[ASCIZ /INPUT/]
2346 440700,,[ASCIZ /MUD/]
2347 440700,,[ASCIZ /DSK/]
2351 ; SUBR TO DELETE AND RENAME FILES
2353 MFUNCTION RENAME,SUBR
2359 PUSH TP,P ; SAVE P-STACK BASE
2360 GETYP 0,(AB) ; GET 1ST ARG TYPE
2362 CAIN 0,TCHAN ; CHANNEL?
2363 JRST CHNRNM ; MUST BE RENAME WHILE OPEN FOR WRITING
2367 PUSH P,[377777,,377777]
2369 MOVSI E,-4 ; 4 THINGS TO PUSH
2370 RNMALP: MOVE B,@RNMTBL(E)
2375 CAIE 0,TCHSTR ; SKIP IF WINS
2378 IFN ITS, PUSHJ P,STRTO6 ; CONVERT TO SIXBIT
2387 RNMLP1: PUSH P,RNSTBL(E) ; USE DEFAULT
2391 PUSHJ P,RGPRS ; PARSE THE ARGS
2392 JRST RNM1 ; COULD BE A RENAME
2394 ; HERE TO DELETE A FILE
2396 DELFIL: MOVE A,(P) ; AND GET SNAME
2398 DOTCAL DELETE,[[17,,-3],[17,,-2],[17,,-1],[17,,0]]
2399 JRST FDLST ; ANALYSE ERROR
2401 FDLWON: MOVSI A,TATOM
2409 MOVE A,(TP) ; GET BASE OF PDL
2410 MOVEI A,1(A) ; POINT TO CRAP
2411 CAMGE AB,[-3,,] ; SKIP IF DELETE
2412 HLLZS (A) ; RESET DEFAULT
2418 ADD AB,[2,,2] ; PAST ARG
2420 JUMPL AB,RNM1 ; GO TRY FOR RENAME
2421 MOVE P,(TP) ; RESTORE P STACK
2422 MOVEI C,(A) ; FOR RELEASE
2423 DELF ; ATTEMPT DELETE
2425 RLJFN ; MAKE SURE FLUSHED
2428 FDLWON: MOVSI A,TATOM
2439 POP P,A ; ERR NUMBER BACK
2441 PUSHJ P,TGFALS ; GET FALSE WITH REASON
2444 DELLOS: PUSH P,A ; SAVE ERROR
2448 ;TABLE OF REANMAE DEFAULTS
2455 RNSTBL: SIXBIT /DSK _MUDS_> /
2458 RNMTBL: SETZ IMQUOTE DEV
2463 RNSTBL: -1,,[ASCIZ /DSK/]
2465 -1,,[ASCIZ /_MUDS_/]
2468 ; HERE TO DO A RENAME
2470 RNM1: JUMPGE AB,TMA ; IF ARGS EXHAUSTED, MUST BE TOO MUCH STRING
2472 MOVE C,1(AB) ; GET ARG
2473 CAIN 0,TATOM ; IS IT "TO"
2475 JRST WRONGT ; NO, LOSE
2476 ADD AB,[2,,2] ; BUMP PAST "TO"
2480 MOVEM P,T.SPDL+1(TB) ; SAVE NEW P-BASE
2482 MOVEI 0,4 ; FOUR DEFAULTS
2483 PUSH P,-3(P) ; DEFAULT DEVICE IS CURRENT
2486 PUSHJ P,RGPRS ; PARSE THE NEXT STRING
2489 MOVE A,-7(P) ; FIX AND GET DEV1
2490 MOVE B,-3(P) ; SAME FOR DEV2
2494 POP P,A ; GET SNAME 2
2495 CAME A,(P)-3 ; SNAME 1
2498 POP P,-2(P) ; MOVE NAMES DOWN
2500 DOTCAL RENAME,[[17,,-4],[17,,-3],[17,,-2],A,[17,,-1],(P)]
2504 ; HERE FOR RENAME WHILE OPEN FOR WRITING
2506 CHNRNM: ADD AB,[2,,2] ; NEXT ARG
2509 MOVE B,-1(AB) ; GET CHANNEL
2510 SKIPN CHANNO(B) ; SKIP IF OPEN
2512 MOVE A,DIRECT-1(B) ; CHECK DIRECTION
2514 PUSHJ P,STRTO6 ; TO 6 BIT
2516 CAME A,[SIXBIT /PRINT/]
2517 CAMN A,[SIXBIT /PRINTB/]
2519 CAMN A,[SIXBIT /PRINAO/]
2521 CAME A,[SIXBIT /PRINTO/]
2524 ; SET UP .FDELE BLOCK
2528 MOVEM P,T.SPDL+1(TB)
2530 PUSH P,[SIXBIT /_MUDL_/]
2534 PUSHJ P,RGPRS ; PARSE THESE
2537 SUB P,[1,,1] ; SNAME/DEV IGNORED
2538 MOVE AB,ABSAV(TB) ; GET ORIG ARG POINTER
2540 MOVE A,CHANNO(B) ; ITS CHANNEL #
2541 DOTCAL RENMWO,[A,[17,,-1],(P)]
2543 MOVE A,CHANNO(B) ; ITS CHANNEL #
2544 DOTCAL RFNAME,[A,[2017,,-4],[2017,,-3],[2017,,-2],[2017,,-1]]
2546 MOVE A,-3(P) ; UPDATE CHANNEL
2547 PUSHJ P,6TOCHS ; GET A STRING
2565 MOVE A,(TP) ; PBASE BACK
2572 MOVEI C,(A) ; FOR RELEASE ATTEMPT
2578 MOVEI A,(C) ; MAKE SURR OTHER IS FLUSHED
2586 MOVEI A,(A) ; LNTH OF STRING
2588 JUMPN B,NONUAD ; DONT NEED TO ADD ONE
2593 PUSHJ P,CISTNG ; COPY OF STRING
2600 ; HERE FOR LOSING .FDELE
2603 FDLST: .STATUS 0,A ; GET STATUS
2605 PUSHJ P,GFALS ; ANALYZE IT
2609 ; SOME .FDELE ERRORS
2611 DEVDIF: ERRUUO EQUOTE DEVICE-OR-SNAME-DIFFERS
2613 \f; HERE TO RESET A READ CHANNEL
2615 MFUNCTION FRESET,SUBR,RESET
2621 MOVE B,1(AB) ;GET CHANNEL
2622 SKIPN IOINS(B) ; OPEN?
2623 JRST REOPE1 ; NO, IGNORE CHECKS
2625 MOVE A,STATUS(B) ;GET STATUS
2627 JUMPE A,REOPE1 ;IF IT CLOSED, JUST REOPEN IT, MAYBE?
2628 CAILE A,2 ;SKIPS IF TTY FLAVOR
2634 CAIN A,101 ; TTY-OUT
2641 REATT1: MOVEI B,DIRECT-1(B) ;POINT TO DIRECTION
2642 PUSHJ P,CHRWRD ;CONVERT TO A WORD
2644 CAME B,[ASCII /READ/]
2646 MOVE B,1(AB) ;RESTORE CHANNEL
2647 PUSHJ P,RRESET" ;DO REAL RESET
2650 REOPEN: PUSH TP,(AB) ;FIRST CLOSE IT
2653 MOVE B,1(AB) ;RESTORE CHANNEL
2655 ; SET UP TEMPS FOR OPNCH
2657 REOPE1: PUSH P,[0] ; WILL HOLD DIR CODE
2660 IRP A,,[DIRECT,RNAME1,RNAME2,RDEVIC,RSNAME,ACCESS]
2669 MOVE B,T.DIR+1(TB) ; GET DIRECTION
2670 PUSHJ P,CHMOD ; CHECK THE MODE
2671 MOVEM A,(P) ; AND STORE IT
2673 ; NOW SET UP OPEN BLOCK IN SIXBIT
2676 MOVSI E,-4 ; AOBN PNTR
2677 FRESE2: MOVE B,T.CHAN+1(TB)
2678 MOVEI A,@RDTBL(E) ; GET ITEM POINTER
2679 GETYP 0,-1(A) ; GET ITS TYPE
2682 MOVE B,(A) ; GET STRING
2685 FRESE3: AOBJN E,FRESE2
2691 PUSHJ P,STRTO6 ; RESULT ON STACK
2695 PUSH P,[0] ; PUSH UP SOME DUMMIES
2698 PUSHJ P,OPNCH ; ATTEMPT TO DO THEOPEN
2701 JRST FINIS ; LEAVE IF FALSE OR WHATEVER
2705 SETZM CHRPOS(B) ;INITIALIZE THESE PARAMETERS
2717 DOTCAL RSSIZE,[CHANNO(B),[2000,,C],[2000,,D]]
2731 ; INTERFACE TO REOPEN CLOSED CHANNELS
2733 OPNCHN: PUSH TP,$TCHAN
2738 REATTY: PUSHJ P,TTYOP2
2739 IFE ITS, SKIPN DEMFLG ; SKIP IF DEMONFLAG IS ON
2745 ; FUNCTION TO LIST ALL CHANNELS
2747 MFUNCTION CHANLIST,SUBR
2751 MOVEI A,N.CHNS-1 ;MAX # OF REAL CHANNELS
2753 MOVEI B,CHNL1 ;POINT TO FIRST REAL CHANNEL
2755 CHNLP: SKIPN 1(B) ;OPEN?
2756 JRST NXTCHN ;NO, SKIP
2757 HRRE E,(B) ; ABOUT TO FLUSH?
2758 JUMPL E,NXTCHN ; YES, FORGET IT
2759 MOVE D,1(B) ; GET CHANNEL
2760 HRRZ E,CHANNO-1(D) ; GET REF COUNT
2763 ADDI C,1 ;COUNT WINNERS
2764 SOJGE E,.-3 ; COUNT THEM
2768 SKIPN B,CHNL0+1 ;NOW HACK LIST OF PSUEDO CHANNELS
2776 MAKLST: ACALL C,LIST
2779 \f; ROUTINE TO RESTORE A CLOSED CHANNEL TO ITS PREVIOUS STATE
2782 REOPN: PUSH TP,$TCHAN
2784 SKIPN CHANNO(B) ; ONLY REAL CHANNELS
2788 MOVSI E,-4 ; SET UP POINTER FOR NAMES
2790 GETOPB: MOVE B,(TP) ; GET CHANNEL
2791 MOVEI A,@RDTBL(E) ; GET POINTER
2792 MOVE B,(A) ; NOW STRING
2794 PUSHJ P,STRTO6 ; LEAVES SIXBIT ON STACK
2800 PUSHJ P,STRTO6 ; GET DEV NAME IN SIXBIT
2802 MOVE B,(TP) ; RESTORE CHANNEL
2805 PUSHJ P,CHMOD ; CHECK FOR A VALID MODE
2807 IFN ITS, MOVE E,-3(P) ; GET DEVICE IN PROPER PLACE
2808 IFE ITS, HLRZS E,(P)
2809 MOVE B,(TP) ; RESTORE CHANNEL
2810 IFN ITS, CAMN E,[SIXBIT /DSK /]
2812 CAIE E,(SIXBIT /PS /)
2813 CAIN E,(SIXBIT /DSK/)
2814 JRST DISKH ; DISK WINS IMMEIDATELY
2815 CAIE E,(SIXBIT /SS /)
2816 CAIN E,(SIXBIT /SRC/)
2817 JRST DISKH ; DISK WINS IMMEIDATELY
2819 IFN ITS, CAMN E,[SIXBIT /TTY /] ; NO NEED TO RE-OPEN THE TTY
2820 IFE ITS, CAIN E,(SIXBIT /TTY/)
2823 AND E,[777700,,0] ; COULD BE "UTn"
2824 MOVE D,CHANNO(B) ; GET CHANNEL
2826 ADDI D,CHNL0 ; DON'T SEEM TO BE OPEN
2829 CAMN E,[SIXBIT /UT /]
2830 JRST REOPD ; CURRENTLY, CANT RESTORE UTAPE CHANNLES
2831 CAMN E,[SIXBIT /AI /]
2832 JRST REOPD ; CURRENTLY CANT RESTORE AI CHANNELS
2833 CAMN E,[SIXBIT /ML /]
2834 JRST REOPD ; CURRENTLY CANT RESTORE ML CHANNELS
2835 CAMN E,[SIXBIT /DM /]
2836 JRST REOPD ; CURRENTLY CANT RESTORE DM CHANNELS
2838 PUSH TP,$TCHAN ; TRY TO RESET IT
2850 REOPD0: SUB TP,[2,,2]
2854 DISKH: MOVE C,(P) ; SNAME
2858 DISKH: MOVEM A,(P) ; SAVE MODE WORD
2859 PUSHJ P,STSTK ; STRING TO STACK
2860 MOVE A,(E) ; RESTORE MODE WORD
2862 PUSH TP,E ; SAVE PDL BASE
2863 MOVE B,-2(TP) ; CHANNEL BACK TO B
2865 MOVE C,ACCESS(B) ; GET CHANNELS ACCESS
2866 TRNN A,2 ; SKIP IF NOT ASCII CHANNEL
2868 HRRZ D,ACCESS-1(B) ; IF PARTIAL WORD OUT
2869 IMULI C,5 ; TO CHAR ACCESS
2870 JUMPE D,DISKH1 ; NO SWEAT
2873 DISKH1: HRRZ D,BUFSTR-1(B) ; ANY CHARS IN MUDDLE BUFFER
2875 TRNN A,1 ; SKIP IF OUTPUT CHANNEL
2880 PUSHJ P,BYTDOP ; FIND LENGTH OF WHOLE BUFFER
2881 HLRZ D,(A) ; LENGTH + 2 TO D
2883 IMULI D,5 ; TO CHARS
2887 DISKH2: SUBI C,(D) ; UPDATE CHAR ACCESS
2888 IDIVI C,5 ; BACK TO WORD ACCESS
2890 IORI A,6 ; BLOCK IMAGE
2892 IORI A,100000 ; WRITE OVER BIT
2895 MOVE A,C ; ACCESS TO A
2896 PUSHJ P,GETFLN ; CHECK LENGTH
2897 CAIGE 0,(A) ; CHECK BOUNDS
2899 PUSHJ P,DOACCS ; AND ACESS
2900 JRST REOPD1 ; SUCCESS
2902 MOVE A,CHANNO(B) ; CLOSE THE G.D. CHANNEL
2908 DOTCAL ACCESS,[A,(P)]
2919 MOVEM 0,BSTO(PVP) ; IN CASE OF INTERRUPT
2930 GETFLN: MOVE 0,CHANNO(B) ; GET CHANNEL
2931 .CALL FILBLK ; READ LNTH
2938 402000,,0 ; STUFF RESULT IN 0
2944 SETZM 1(A) ; MAY GET A DIFFERENT JFN
2945 HRROI B,1(E) ; TENEX STRING POINTER
2946 MOVSI A,400001 ; MAKE SURE
2948 JRST RGTJL ; COMPLAIN
2950 HRRZM A,CHANNO(D) ; COULD HAVE CHANGED
2951 MOVE P,(TP) ; RESTORE P
2953 ASH A,1 ; MUNG ITS SLOT
2956 HLLOS (A) ; MARK CHANNEL NOT TO BE RELOOKED AT
2957 MOVE A,(P) ; MODE WORD BACK
2958 MOVE B,[440000,,200000] ; FLAG BITS
2959 TRNE A,1 ; SKIP FOR INPUT
2960 TRC B,300000 ; CHANGE TO WRITE
2961 MOVE A,CHANNO(D) ; GET JFN
2964 MOVE E,C ; LENGTH TO E
2965 SIZEF ; GET CURRENT LENGTH
2967 CAMGE B,E ; STILL A WINNER
2969 MOVE A,CHANNO(D) ; JFN
2973 SUB TP,[2,,2] ; FLUSH PDL POINTER
2976 ROPFLS: MOVE A,-2(TP)
2978 CLOSF ; ATTEMPT TO CLOSE
2979 JFCL ; IGNORE FAILURE
2994 PSUEDO: AOS (P) ; ASSUME SUCCESS FOR NOW
2995 MOVEI B,RDEVIC-1(B) ; SEE WHAT DEVICE IS
2998 JRST REOPD0 ; NO, RETURN HAPPY
2999 IFN 0,[ CAME B,[ASCII /E&S/] ; DISPLAY ?
3000 CAMN B,[ASCII /DIS/]
3001 SKIPA B,(TP) ; YES, REGOBBLE CHANNEL AND CONTINUE
3002 JRST REOPD0 ; NO, RETURN HAPPY
3004 SOS (P) ; DISPLAY DID NOT REOPEN, UNDO ASSUMPTION OF SUCCESS
3007 \f;THIS PROGRAM CLOSES THE SPECIFIED CHANNEL
3009 MFUNCTION FCLOSE,SUBR,[CLOSE]
3011 ENTRY 1 ;ONLY ONE ARG
3012 GETYP A,(AB) ;CHECK ARGS
3013 CAIE A,TCHAN ;IS IT A CHANNEL
3015 MOVE B,1(AB) ;PICK UP THE CHANNEL
3016 HRRZ A,CHANNO-1(B) ; GET REF COUNT
3017 SOJGE A,CFIN5 ; NOT READY TO REALLY CLOSE
3018 CAME B,TTICHN+1 ; CHECK FOR TTY
3021 MOVE A,[JRST CHNCLS]
3022 MOVEM A,IOINS(B) ;CLOBBER THE IO INS
3023 MOVE A,RDEVIC-1(B) ;GET THE NAME OF THE DEVICE
3027 IFE ITS, HLRZS A,(P)
3028 MOVE B,1(AB) ; RESTORE CHANNEL
3030 CAME A,[SIXBIT /E&S /]
3031 CAMN A,[SIXBIT /DIS /]
3033 MOVE B,1(AB) ; IN CASE CLOBBERED BY DISCLS
3034 SKIPN A,CHANNO(B) ;ANY REAL CHANNEL?
3035 JRST REMOV ; NO, EITHER CLOSED OR PSEUDO CHANNEL
3037 MOVE A,DIRECT-1(B) ; POINT TO DIRECTION
3039 PUSHJ P,STRTO6 ; CONVERT TO WORD
3041 IFN ITS, LDB E,[360600,,(P)] ; FIRST CHAR OD DEV NAME
3042 IFE ITS, LDB E,[140600,,(P)] ; FIRST CHAR OD DEV NAME
3043 CAIE E,'T ; SKIP IF TTY
3045 CAME A,[SIXBIT /READ/] ; SKIP IF WINNER
3048 MOVE B,1(AB) ; IN ITS CHECK STATUS
3049 LDB A,[600,,STATUS(B)]
3054 PUSH TP,CHQUOTE CHAR
3057 MCALL 2,OFF ; TURN OFF INTERRUPT
3064 TLZ A,400000 ; FOR JFN RELEASE
3065 CLOSF ; CLOSE THE FILE AND RELEASE THE JFN
3070 ADDI A,CHNL0+1 ;POINT TO THIS CHANNELS LSOT
3072 SETZM (A) ;AND CLOBBER IT
3077 MOVSI A,TCHAN ;RETURN THE CHANNEL
3080 CLSTTY: ERRUUO EQUOTE ATTEMPT-TO-CLOSE-TTY-CHANNEL
3083 REMOV: MOVEI D,CHNL0+1 ;ATTEMPT TO REMOVE FROM PSUEDO CHANNEL LIST
3084 REMOV0: SKIPN C,D ;FOUND ON LIST ?
3085 JRST CFIN2 ;NO, JUST IGNORE THIS CLOSED CHANNEL
3086 HRRZ D,(C) ;GET POINTER TO NEXT
3087 CAME B,(D)+1 ;FOUND ?
3089 HRRZ D,(D) ;YES, SPLICE IT OUT
3094 ; CLOSE UP ANY LEFTOVER BUFFERS
3097 ; CAME A,[SIXBIT /PRINTO/]
3098 ; CAMN A,[SIXBIT /PRINTB/]
3100 ; CAME A,[SIXBIT /PRINT/]
3102 MOVE B,1(AB) ; GET CHANNEL
3103 HRRZ A,-2(B) ;GET MODE BITS
3106 GETYP 0,BUFSTR-1(B) ; IS THERE AN OUTPUT BUFFER
3122 CFINX1: HLLZS ACCESS-1(B)
3125 CFIN5: HRRM A,CHANNO-1(B)
3127 \f;SUBR TO DO .ACCESS ON A READ CHANNEL
3128 ;FORM: <ACCESS CHANNEL FIX-NUMBER>
3129 ;POSITIONS CHANNEL AT CHARACTER POSN FIX-NUMBER
3132 MFUNCTION MACCESS,SUBR,[ACCESS]
3133 ENTRY 2 ;ARGS: CHANNEL AND FIX-NUMBER
3135 ;CHECK ARGUMENT TYPES
3137 CAIE A,TCHAN ;FIRST ARG SHOULD BE CHANNEL
3139 GETYP A,2(AB) ;TYPE OF SECOND
3140 CAIE A,TFIX ;SHOULD BE FIX
3143 ;CHECK DIRECTION OF CHANNEL
3144 MOVE B,1(AB) ;B GETS PNTR TO CHANNEL
3145 ; MOVEI B,DIRECT-1(B) ;GET DIRECTION OF CHANNEL
3146 ; PUSHJ P,CHRWRD ;GRAB THE CHAR STRNG
3148 ; CAME B,[<ASCII /PRINT/>+1]
3149 HRRZ A,-2(B) ; GET MODE BITS
3153 SKIPE C,BUFSTR(B) ;SEE IF WE MUST FLUSH PART BUFFER
3157 ; CAMN B,[ASCIZ /READ/]
3159 ; CAME B,[ASCIZ /READB/] ; READB CHANNEL?
3161 ; AOS (P) ; SET INDICATOR FOR BINARY MODE
3163 ;CHECK THAT THE CHANNEL IS OPEN
3164 MACC: MOVE B,1(AB) ;GET BACK PTR TO CHANNEL
3167 JRST CHNCLS ;IF CHNL CLOSED => ERROR
3169 ;COMPUTE ACCESS PNTR TO ACCESS WORD CHAR IS IN
3170 ;REMAINDER IS NUMBER OF TIMES TO INCR BYTE POINTER
3171 ADEVOK: SKIPGE C,3(AB) ;GET CHAR POSN
3172 ERRUUO EQUOTE NEGATIVE-ARGUMENT
3174 TRNN E,C.BIN ; SKIP FOR BINARY FILE
3194 HRRM 0,LSTCH-1(B) ; UPDATE "LARGEST"
3195 NLSTCH: MOVE A,CHANNO(B) ;A GETS REAL CHANNEL NUMBER
3198 .LOSE %LSFIL ;PRESUMABLY LOSSAGE MATTERS
3203 SFPTR ; DO IT IN TENEX
3205 MOVE B,1(AB) ; RESTORE CHANNEL
3207 ; POP P,E ; CHECK FOR READB MODE
3209 JRST ACCOUT ; PRINT TYPE CHANNEL, GO DO IT
3210 SKIPE BUFSTR(B) ; IS THERE A READ BUFFER TO FLUSH
3212 SETZM LSTCH(B) ; CLEAR OUT POSSIBLE EOF INDICATOR
3215 ;NOW FORCE GETCHR TO DO A .IOT FIRST THING
3216 MOVEI C,BUFSTR-1(B) ; FIND END OF STRING
3218 SUBI A,2 ; LAST REAL WORD
3221 HLLZS BUFSTR-1(B) ; CLOBBER CHAR COUNT
3222 SETZM LSTCH(B) ;CLOBBER READ'S HIDDEN CHARACTER
3224 ;NOW DO THE APPROPRIATE NUM OF BYTE ADVANCEMENTS
3226 ADVPTR: PUSHJ P,GETCHR
3227 MOVE B,1(AB) ;RESTORE IN CASE CLOBBERED
3230 DONADV: MOVE C,3(AB) ;FIXUP ACCESS SLOT IN CHNL
3233 MOVE A,$TCHAN ;TYPE OF RESULT = "CHANNEL"
3234 JRST FINIS ;DONE...B CONTAINS CHANNEL
3237 ACCFAI: ERRUUO EQUOTE ACCESS-FAILURE
3239 ACCOUT: SKIPN C,BUFSTR(B) ; FIXUP BUFFER?
3249 ACCOU1: TRNE E,C.BIN ; FINISHED FOR BINARY CHANNELS
3252 JUMPE D,DONADV ; THIS CASE OK
3254 MOVE A,CHANNO(B) ; GET LAST WORD
3259 MOVE B,[444400,,E] ; READ THE WORD
3265 MOVE B,1(AB) ; CHANNEL BACK
3273 IFN ITS, ERRUUO EQUOTE CANT-ACCESS-ASCII-ON-ITS
3276 ;WRONG TYPE OF DEVICE ERROR
3277 WRDEV: ERRUUO EQUOTE NON-DSK-DEVICE
3279 ; BINARY READ AND PRINT ROUTINES
3281 MFUNCTION PRINTB,SUBR
3285 PBFL: PUSH P,. ; PUSH NON-ZERONESS
3289 MFUNCTION READB,SUBR
3301 GETYP 0,(AB) ; SHOULD BE UVEC OR STORE
3308 JRST WTYP1 ; ELSE LOSE
3309 BINI2: MOVE B,1(AB) ; GET IT
3311 SUBI B,(C) ; POINT TO DOPE
3313 PUSHJ P,SAT" ; GET ITS ST.ALOC.TYPE
3316 BYTOK: GETYP 0,2(AB)
3317 CAIE 0,TCHAN ; BETTER BE A CHANNEL
3319 MOVE B,3(AB) ; GET IT
3320 ; MOVEI B,DIRECT-1(B) ; GET DIRECTION OF
3321 ; PUSHJ P,CHRWRD ; INTO 1 WORD
3324 ; CAMN B,[ASCII /READB/]
3326 ; CAMN B,[<ASCII /PRINT/>+1]
3327 HRRZ A,-2(B) ; MODE BITS
3328 TRNN A,C.BIN ; IF NOT BINARY
3333 ; JUMPL E,WRONGD ; LOSER
3334 CAME E,(P) ; CHECK WINNGE
3336 MOVE B,3(AB) ; GET CHANNEL BACK
3337 SKIPN A,IOINS(B) ; OPEN?
3338 PUSHJ P,OPENIT ; LOSE
3339 CAMN A,[JRST CHNCLS]
3340 JRST CHNCLS ; LOSE, CLOSED
3341 JUMPN E,BUFOU1 ; JUMP FOR OUTPUT
3343 CAML AB,[-5,,] ; SKIP IF EOF GIVEN
3355 BINI5: SKIPE LSTCH(B) ; INDICATES IF EOF HIT
3357 GETYP 0,(AB) ; BRANCH BASED ON BYTE SIZE
3361 MOVE A,1(AB) ; GET VECTOR
3362 PUSHJ P,PGBIOI ; READ IT
3363 HLRE C,A ; GET COUNT DONE
3364 HLRE D,1(AB) ; AND FULL COUNT
3365 SUB C,D ; C=> TOTAL READ
3367 JUMPGE A,BINIOK ; NOT EOF YET
3370 MOVSI A,TFIX ; RETURN AMOUNT ACTUALLY READ
3379 LDB B,[300600,,1(AB)]
3383 HRRZ A,(AB) ; GET BYTE STRING LENGTH
3385 MOVSS A ; MAKE FUNNY BYTE POINTER
3389 HLL C,1(AB) ; GET START OF BPTR
3392 HLRE C,A ; GET COUNT DONE
3395 HRRZ D,(AB) ; AND FULL COUNT
3396 ADD D,C ; C=> TOTAL READ
3397 LDB E,[300600,,1(AB)]
3402 SKIPGE C ; NOT EOF YET
3411 BUFOU1: SKIPE BUFSTR(B) ; ANY BUFFERS AROUND?
3412 PUSHJ P,BFCLS1 ; GET RID OF SAME
3421 GETYP 0,(AB) ; BRANCH BASED ON BYTE SIZE
3432 BYTO1: MOVE A,(AB) ; RET VECTOR ETC.
3442 LDB B,[300600,,1(AB)]
3446 HRRZ A,(AB) ; GET BYTE SIZE
3448 MOVSS A ; MAKE FUNNY BYTE POINTER
3450 ADDI A,1 ; COMPENSATE FOR PGBIOT DOING THE WRONG THING
3451 HLL C,1(AB) ; GET START OF BPTR
3454 LDB D,[300600,,1(AB)]
3467 BINEOF: PUSH TP,EOFCND-1(B)
3471 MCALL 1,FCLOSE ; CLOSE THE LOSER
3476 PUSHJ P,OPNCHN ;TRY TO OPEN THE LOSER
3477 JUMPE B,CHNCLS ;FAIL
3480 \f; THESE SUBROUTINES BY NDR 9/16/73 TO FACILITATE THE
3481 ; TYPES OF IO NECESSARY TO MAKE MORE EFFICIENT USE OF
3482 ; THE NETWORK AND DO RELATED FILE TRANSFER TYPE OF JOBS.
3484 R1CHAR: SKIPN A,LSTCH(B) ; CHAR READING ROUTINE FOR FCOPY
3486 TLO A,200000 ; ^@ BUG
3489 JUMPL A,.+2 ; IN CASE OF -1 ON STY
3490 TRZN A,400000 ; EXCL HACKER
3492 MOVEM A,LSTCH(B) ; SAVE DE-EXCLED CHAR
3498 CAIE C,5 ; IF DIRECTION IS 5 LONG THEN READB
3502 AOS ACCESS(B) ; EVERY FIFTY INCREMENT
3506 R1CH1: AOS ACCESS(B)
3510 W1CHAR: CAIE A,15 ; CHAR WRITING ROUTINE, TEST FOR CR
3514 CAIE A,12 ; TEST FOR LF
3515 AOS CHRPOS(B) ; IF NOT LF AOS CHARACTE5R POSITION
3516 CAIE A,14 ; TEST FOR FORM FEED
3518 SETZM CHRPOS(B) ; IF FORM FEED ZERO CHARACTER POSITION
3519 SETZM LINPOS(B) ; AND LINE POSITION
3520 CAIE A,11 ; IS THIS A TAB?
3525 IMULI C,8. ; FIX UP CHAR POS FOR TAB
3526 MOVEM C,CHRPOS(B) ; AND SAVE
3528 HRRZ C,-2(B) ; GET BITS
3529 TRNN C,C.BIN ; SIX LONG MUST BE PRINTB
3537 W1CH1: AOS ACCESS(B)
3544 R1C: SUBM M,(P) ;LITTLE ENTRY FOR COMPILED STUFF
3545 ; PUSH TP,$TCHAN ;SAVE THE CHANNEL TO BLESS IT
3547 ; MOVEI B,DIRECT-1(B)
3550 ; CAME B,[ASCIZ /READ/]
3551 ; CAMN B,[ASCII /READB/]
3554 HRRZ A,-2(B) ; GET MODE BITS
3557 SKIPN IOINS(B) ; IS THE CHANNEL OPEN
3558 PUSHJ P,OPENIT ; NO, GO DO IT
3559 PUSHJ P,GRB ; MAKE SURE WE HAVE A READ BUFFER
3560 PUSHJ P,R1CHAR ; AND GET HIM A CHARACTER
3561 JRST MPOPJ ; THATS ALL FOLKS
3570 PUSH P,A ; ASSEMBLER ENTRY TO OUTPUT 1 CHAR
3571 ; MOVEI B,DIRECT-1(B)
3572 ; PUSHJ P,CHRWRD ; INTERNAL CALL TO W1CHAR
3574 ; CAME B,[ASCII /PRINT/]
3575 ; CAMN B,[<ASCII /PRINT/>+1]
3583 SKIPN IOINS(B) ; MAKE SURE THAT IT IS OPEN
3586 POP P,A ; GET THE CHAR TO DO
3589 ; ROUTINES TO REPLACE XCT IOINS(B) FOR INPUT AND OUTPUT
3590 ; THEY DO THE XCT THEN CHECK OUT POSSIBLE SCRIPTAGE--BLECH.
3594 RXCT: XCT IOINS(B) ; READ IT
3598 DOSCPT: PUSH TP,$TCHAN
3600 PUSH P,A ; AND SAVE THE CHAR AROUND
3602 SKIPN SCRPTO(B) ; IF ZERO FORGET IT
3603 JRST SCPTDN ; THATS ALL THERE IS TO IT
3604 PUSH P,C ; SAVE AN ACCUMULATOR FOR CLEANLINESS
3605 GETYP C,SCRPTO-1(B) ; IS IT A LIST
3609 PUSH TP,[0] ; SAVE A SLOT FOR THE LIST
3610 MOVE C,SCRPTO(B) ; GET THE LIST OF SCRIPT CHANNELS
3611 SCPT1: GETYP B,(C) ; GET THE TYPE OF THIS SCRIPT CHAN
3613 JRST BADCHN ; IF IT ISN'T A CHANNEL, COMPLAIN
3614 HRRZ B,(C) ; GET THE REST OF THE LIST IN B
3615 MOVEM B,(TP) ; AND STORE ON STACK
3616 MOVE B,1(C) ; GET THE CHANNEL IN B
3617 MOVE A,-1(P) ; AND THE CHARACTER IN A
3618 PUSHJ P,W1CI ; GO TO INTERNAL W1C, IT BLESSES GOODIES
3619 SKIPE C,(TP) ; GET THE REST OF LIST OF CHANS
3620 JRST SCPT1 ; AND CYCLE THROUGH
3621 SUB TP,[2,,2] ; CLEAN OFF THE LIST OF CHANS
3622 POP P,C ; AND RESTORE ACCUMULATOR C
3623 SCPTDN: POP P,A ; RESTORE THE CHARACTER
3624 POP TP,B ; AND THE ORIGINAL CHANNEL
3626 POPJ P, ; AND THATS ALL
3629 ; SUBROUTINE TO COPY FROM INCHAN TO OUTCHAN UNTIL EOF HIT
3630 ; ON THE INPUT CHANNEL
3631 ; CALL IS <FILECOPY IN OUT> WHERE DEFAULTS ARE INCHAN AND OUTCHAN
3633 MFUNCTION FCOPY,SUBR,[FILECOPY]
3638 JRST WNA ; TAKES FROM 0 TO 2 ARGS
3640 JUMPE 0,.+4 ; NO FIRST ARG?
3642 PUSH TP,1(AB) ; SAVE IN CHAN
3645 MOVE B,IMQUOTE INCHAN
3649 HLRE 0,AB ; CHECK FOR SECOND ARG
3650 CAML 0,[-2] ; WAS THERE MORE THAN ONE ARG?
3652 PUSH TP,2(AB) ; SAVE SECOND ARG
3655 MOVE A,$TATOM ; LOOK UP OUTCHAN AS DEFAULT
3656 MOVE B,IMQUOTE OUTCHAN
3659 PUSH TP,B ; AND SAVE IT
3662 MOVE B,-2(TP) ; INPUT CHANNEL
3663 MOVEI 0,C.READ ; INDICATE INPUT
3664 PUSHJ P,CHKCHN ; CHECK FOR GOOD CHANNEL
3666 MOVE B,(TP) ; GET OUT CHAN
3667 MOVEI 0,C.PRIN ; INDICATE OUT CHAN
3668 PUSHJ P,CHKCHN ; CHECK FOR GOOD OUT CHAN
3670 PUSH P,[0] ; COUNT OF CHARS OUTPUT
3673 PUSHJ P,GRB ; MAKE SURE WE HAVE READ BUFF
3675 PUSHJ P,GWB ; MAKE SURE WE HAVE WRITE BUFF
3679 PUSHJ P,R1CHAR ; GET A CHAR
3680 JUMPL A,FCDON ; IF A NEG NUMBER WE GOT EOF
3681 MOVE B,(TP) ; GET OUT CHAN
3682 PUSHJ P,W1CHAR ; SPIT IT OUT
3683 AOS (P) ; INCREMENT COUNT
3686 FCDON: SUB TP,[2,,2] ; POP OFF OUTCHAN
3687 MCALL 1,FCLOSE ; CLOSE INCHAN
3689 POP P,B ; GET CHAR COUNT TO RETURN
3692 CHKCHN: PUSH P,0 ; CHECK FOR GOOD TASTING CHANNEL
3697 JRST CHKBDC ; GO COMPLAIN IN RIGHT WAY
3698 ; MOVEI B,DIRECT-1(B)
3701 ; MOVE C,(P) ; GET CHAN DIRECT
3702 HRRZ C,-2(B) ; MODE BITS
3707 ; ADDI C,2 ; TEST FOR READB OR PRINTB ALSO
3708 ; CAME B,CHKT(C) ; TEST FOR CORRECT DIRECT
3711 SKIPN IOINS(B) ; MAKE SURE IT IS OPEN
3712 PUSHJ P,OPENIT ; IF ZERO IOINS GO OPEN IT
3714 POP P, ; CLEAN UP STACKS
3726 CAMLE 0,D ; SEE IF THIS WAS HIS ARG OF DEFAULT
3731 \f; FUNCTIONS READSTRING AND PRINTSTRING WORK LIKE READB AND PRINTB,
3732 ; THAT IS THEY READ INTO AND OUT OF STRINGS. IN ADDITION BOTH ACCEPT
3733 ; AN ADDITIONAL ARGUMENT WHICH IS THE NUMBER OF CHARS TO READ OR PRINT, IF
3734 ; IT IS DESIRED FOR THIS TO BE DIFFERENT THAN THE LENGTH OF THE STRING.
3736 ; FORMAT IS <READSTRING .STRING .INCHANNEL .EOFCOND .MAXCHARS>
3737 ; AND BOTH SUBRS RETURN THE NUMBER OF CHARS READ OR WRITTEN
3739 ; FORMAT FOR PRINTSTRING IS <PRINTSTRING .STRING .OUTCHANNEL .MAXCHARS>
3741 ; THESE WERE CODED 9/16/73 BY NEAL D. RYAN
3743 MFUNCTION RSTRNG,SUBR,READSTRING
3746 PUSH P,[0] ; FLAG TO INDICATE READING
3750 JRST WNA ; CHECK THAT IT HAS FROM 1 TO 4 ARGS
3753 MFUNCTION PSTRNG,SUBR,PRINTSTRING
3756 PUSH P,[1] ; FLAG TO INDICATE WRITING
3760 JRST WNA ; CHECK THAT IT HAS FROM 1 TO 3 ARGS
3762 STRIO1: PUSH TP,[0] ; SAVE SLOT ON STACK
3765 CAIE 0,TCHSTR ; MAKE SURE WE GOT STRING
3767 HRRZ 0,(AB) ; CHECK FOR EMPTY STRING
3771 CAML 0,[-2] ; WAS A CHANNEL GIVEN
3774 SKIPN (P) ; SKIP IF PRINT
3776 CAIN 0,TTP ; SEE IF FLATSIZE HACK
3778 TESTIN: CAIE 0,TCHAN
3779 JRST WTYP2 ; SECOND ARG NOT CHANNEL
3782 MOVNI E,1 ; CHECKING FOR GOOD DIRECTION
3783 TRNE B,C.READ ; SKIP IF NOT READ
3785 TRNE B,C.PRIN ; SKIP IF NOT PRINT
3788 JRST WRONGD ; MAKE SURE CHANNEL IS OPEN IN RIGHT MODE
3789 STRIO9: PUSH TP,2(AB)
3790 PUSH TP,3(AB) ; PUSH ON CHANNEL
3792 STRIO2: MOVE B,IMQUOTE INCHAN
3795 MOVE B,IMQUOTE OUTCHAN
3798 SKIPN (P) ; SKIP IF PRINTSTRING
3800 CAIN 0,TTP ; SKIP IF NOT FLATSIZE HACK
3802 TESTI2: CAIE 0,TCHAN
3803 JRST BADCHN ; MAKE SURE WE GOT A GOOD DEFAULT CHANNEL
3806 STRIO3: MOVE B,(TP) ; GET CHANNEL
3808 PUSHJ P,OPENIT ; IF NOT GO OPEN
3810 CAMN E,[JRST CHNCLS]
3811 JRST CHNCLS ; CHECK TO SEE THAT CHANNEL ISNT ALREADY CLOSED
3814 JRST STRIO5 ; NO COUNT TO WORRY ABOUT
3819 CAIN 0,TFIX ; BETTER BE A FIXED NUMBER
3822 HRRZ D,(AB) ; GET ACTUAL STRING LENGTH
3825 SKIPE (P) ; TEST FOR WRITING
3826 JRST .-7 ; IF WRITING WE GOT TROUBLE
3827 PUSH P,D ; ACTUAL STRING LENGTH
3828 MOVEM E,(TB) ; STUFF HIS FUNNY DELIM STRING
3831 CAML D,C ; MAKE SURE THE STRING IS LONG ENOUGH
3833 ERRUUO EQUOTE COUNT-GREATER-THAN-STRING-SIZE
3834 PUSH P,C ; PUSH ON MAX COUNT
3837 STRIO6: HRRZ C,(AB) ; GET CHAR COUNT
3838 PUSH P,C ; AND PUSH IT ON STACK AS NO MAX COUNT GIVEN
3842 MOVE B,(TP) ; GET THE CHANNEL
3844 MOVEM 0,EOFCND-1(B) ; STUFF IN SLOT IN CHAN
3847 PUSH TP,(AB) ; PUSH ON STRING
3849 PUSH P,[0] ; PUSH ON CURRENT COUNT OF CHARS DONE
3850 MOVE 0,-2(P) ; GET READ OR WRITE FLAG
3851 JUMPN 0,OUTLOP ; GO WRITE STUFF
3853 MOVE B,-2(TP) ; GET CHANNEL
3854 PUSHJ P,GRB ; MAKE SURE WE HAVE BUFF
3855 SKIPGE A,LSTCH(B) ; CHECK FOR EOF ALREADY READ PREVIOUSLY
3856 JRST SRDOEF ; GO DOES HIS EOF HACKING
3858 MOVE B,-2(TP) ; GET CHANNEL
3859 MOVE C,-1(P) ; MAX COUNT
3860 CAMG C,(P) ; COMPARE WITH COUNT DONE
3861 JRST STREOF ; WE HAVE FINISHED
3862 PUSHJ P,R1CHAR ; GET A CHAR
3863 JUMPL A,INEOF ; EOF HIT
3865 HRRZ E,(TB) ; DO WE HAVE A STRING TO WORRY US?
3866 SOJL E,INLNT ; GO FINISH STUFFING
3871 INLNT: IDPB A,(TP) ; STUFF IN STRING
3872 SOS -1(TP) ; DECREMENT STRING COUNT
3873 AOS (P) ; INCREMENT CHAR COUNT
3876 INEOF: SKIPE C,LSTCH(B) ; IS THIS AN ! AND IS THERE A CHAR THERE
3878 MOVEM A,LSTCH(B) ; NO SAVE THE CHAR
3884 HRRZ C,DIRECT-1(B) ; GET THE TYPE OF CHAN
3885 CAIN C,5 ; IS IT READB?
3887 SOS ACCESS(B) ; FIX UP ACCESS FOR READ CHANNEL
3888 JRST STREOF ; AND THATS IT
3889 HRRZ C,ACCESS-1(B) ; FOR A READB ITS WORSE
3892 HRRM D,ACCESS-1(B) ; CHANGE A 0 TO A FIVE
3895 SOS ACCESS(B) ; AND SOS THE WORD COUNT MAYBE
3898 SRDOEF: SETZM LSTCH(B) ; IN CASE OF -1, FLUSH IT
3899 AOJE A,INLOP ; SKIP OVER -1 ON PTY'S
3901 SUB P,[3,,3] ; POP JUNK OFF STACKS
3903 PUSH TP,EOFCND(B) ; WHAT WE NEED TO EVAL
3906 MCALL 1,FCLOSE ; CLOSE THE LOOSING CHANNEL
3907 MCALL 1,EVAL ; EVAL HIS EOF JUNK
3910 OUTLOP: MOVE B,-2(TP)
3912 MOVE A,-3(TP) ; GET CHANNEL
3914 MOVE C,-1(P) ; MAX COUNT TO DO
3915 CAMG C,(P) ; HAVE WE DONE ENOUGH
3917 ILDB D,(TP) ; GET THE CHAR
3918 SOS -1(TP) ; SUBTRACT FROM STRING LENGTH
3919 AOS (P) ; INC COUNT OF CHARS DONE
3920 PUSHJ P,CPCH1 ; GO STUFF CHAR
3923 STREOF: MOVE A,$TFIX
3924 POP P,B ; RETURN THE LOOSER A COUNT OF WHAT WAS DONE
3930 GWB: SKIPE BUFSTR(B)
3933 PUSH TP,B ; GET US A WRITE BUFFER ON PRINTB CHAN
3936 MOVSI A,TWORD+.VECT.
3948 MOVE C,[TCHSTR,,BUFLNT*5]
3954 GRB: SKIPE BUFSTR(B)
3957 PUSH TP,B ; GET US A READ BUFFER
3971 MTSTRN: ERRUUO EQUOTE EMPTY-STRING
3973 \f; INPUT UNBUFFERING ROUTINE. THIS DOES THE CHARACTER UNBUFFERING
3974 ; FOR INPUT. THE OPEN ROUTINE SETUPS A PUSHJ P, TO
3975 ; THIS ROUTINE AS THE IOINS FOR A CHANNEL OPEN TO A NON-TTY DEVICE.
3981 ; B/ AOBJN PNTR TO CHANNEL VECTOR
3982 ; RETURNS NEXT CHARACTER IN AC A.
3983 ; ON ENCOUNTERING EITHER ^C OR NUL(^@) IT ASSUMES EOF AND
3984 ; TRANSMITS ONLY ^C ON SUCCESSIVE CALLS
3988 ; FIRST GRAB THE BUFFER
3989 ; GETYP A,BUFSTR-1(B) ; GET TYPE WORD
3990 ; CAIN A,TCHSTR ; SKIPS IF NOT CHSTR (I.E. IF BAD BUFFER)
3991 ; JRST GTGBUF ; IS GOOD BUFFER...SKIP ERROR RETURN
3992 GTGBUF: HRRZ A,BUFSTR-1(B) ; GET LENGTH OF STRING
3993 SOJGE A,GTGCHR ; JUMP IF STILL MORE
3995 ; HERE IF THE BUFFER WAS EXHAUSTED (BYTE PNTR POINTS INTO DOPE WDS)
3996 ; GENERATE AN .IOT POINTER
3997 ;FIRST SAVE C AND D AS I WILL CLOBBER THEM
4001 LDB C,[600,,STATUS(B)] ; GET TYPE
4002 CAIG C,2 ; SKIP IF NOT TTY
4007 JRST GETTTY ; GET A TTY BUFFER
4009 PUSHJ P,PGBUFI ; RE-FILL BUFFER
4012 JUMPGE A,BUFGOO ;SKIPS IF IOT COMPLETED...FIX UP CHANNEL
4014 MOVEI C,1 ; MAKE SURE LAST EOF REALLY ENDS IT
4017 MOVSI C,014000 ; GET A ^C
4018 MOVEM C,(A) ;FAKE AN EOF
4021 HLRE C,A ; HOW MUCH LEFT
4022 ADDI C,BUFLNT ; # OF WORDS TO C
4023 IMULI C,5 ; TO CHARS
4029 MOVE A,-2(B) ; GET BITS
4030 TRNE A,C.BIN ; CAN'T HELP A BINARY CHANNEL
4039 MOVE B,[2,,11] ; READ WORD CONTAINING BYTE SIZE
4041 LDB D,[300600,,-1(P)] ; GET BYTE SIZE
4045 CAIE D,7 ; SEVEN BIT BYTES?
4046 JRST BUFGO1 ; NO, DONT HACK
4048 IDIVI B,5 ; C IS NUMBER IN LAST WORD IF NOT EVEN
4051 ADDI C,-5(D) ; FIXUP C FOR WINNAGE
4055 ; RESET THE BYTE POINTER IN THE CHANNEL.
4056 ; BUILD ONE USING THE PTR TO BEG OF BUFFER SAVED IN D
4057 BUFGOO: HRLI D,010700 ; GENERATE VIRGIN LH
4060 MOVEM D,BUFSTR(B) ; STASH IN THE BUFFER BYTE PNTR SLOT
4061 IFE ITS, HRRM C,LSTCH-1(B) ; SAVE IT
4063 BUFROK: POP P,D ;RESTORE D
4067 ; HERE IF THERE ARE CHARS IN BUFFER
4068 GTGCHR: HRRM A,BUFSTR-1(B)
4069 ILDB A,BUFSTR(B) ; GET A CHAR FROM BUFFER
4073 POPJ P, ; AND RETURN
4074 LDB A,[600,,STATUS(B)] ; CHECK FOR TTY
4075 CAILE A,2 ; SKIP IF TTY
4093 HRRZ A,BUFSTR(B) ; SEE IF RSUBR START BIT IS ON
4104 PGBUFO: SKIPA D,[SOUT]
4105 PGBUFI: MOVE D,[SIN]
4107 SKIPGE A,BUFSTR(B) ; POINT TO CURRENT BUFFER POSIT
4108 SUBI A,1 ; FOR 440700 AND 010700 START
4109 SUBI A,BUFLNT-1 ; CALCULATE PNTR TO BEG OF BUFFER
4110 HRLI A,-BUFLNT ; IOT (AOBJN) PNTR IN A
4114 PGBIOI: MOVE D,A ; COPY FOR LATER
4115 MOVSI C,TUVEC ; PREPARE TO HANDDLE INTS
4123 MOVE C,CHANNO(B) ; CHANNEL NUMBER IN C
4124 ROT C,23. ; MOVE INTO AC FIELD
4125 IOR C,[.IOT 0,A] ; IOR IN SKELETON .IOT
4129 XCT C ; EXECUTE THE .IOT INSTR
4144 HRRI C,-1(A) ; POINT TO BUFFER
4145 HLRE D,A ; XTRA POINTER
4150 MOVE D,[PUSHJ P,FIXACS]
4155 MOVE A,CHANNO(B) ; FILE JFN
4157 HLRE C,D ; - COUNT TO C
4159 MOVN C,(P) ; REAL DESIRED COUNT
4162 XCT (P) ; DO IT TO IT
4172 JUMPGE C,CPOPJ ; NO EOF YET
4173 HRLI A,(C) ; LOOK LIKE AN AOBJN PNTR
4184 PGBIOO: SKIPA D,[SOUT]
4185 PGBIOI: MOVE D,[SIN]
4188 DOIOTO: PUSH P,[SOUT]
4202 DOIOTI: PUSH P,[SIN]
4206 ; OUTPUT BUFFERING ROUTINES SIMILAR TO INPUT BUFFERING ROUTINES OF PREV PAGE
4209 GETYP A,BUFSTR-1(B) ; CHECK TYPE OF ARG
4210 CAIE A,TCHSTR ; MUST BE STRING
4213 HRRZ A,BUFSTR-1(B) ; GET CHAR COUNT
4214 JUMPE A,REBUFF ; PREV RESET BUFF, UNDO SAME
4216 PUTCH1: POP P,A ; RESTORE CHAR
4217 CAMN A,[-1] ; SPECIAL HACK?
4218 JRST PUTCH2 ; YES GO HANDLE
4219 IDPB A,BUFSTR(B) ; STUFF IT
4220 PUTCH3: SOS A,BUFSTR-1(B) ; COUNT DOWN STRING
4221 TRNE A,-1 ; SKIP IF FULL
4224 ; HERE TO FLUSH OUT A BUFFER
4228 PUSHJ P,PGBUFO ; SETUP AND DO IOT
4229 HRLI D,010700 ; POINT INTO BUFFER
4231 MOVEM D,BUFSTR(B) ; STORE IT
4232 MOVEI A,BUFLNT*5 ; RESET COUNT
4238 ;HERE TO DA ^C AND TURN ON MAGIC BIT
4241 IDPB A,BUFSTR(B) ; ZAP OUT THE ^C
4250 IORM A,@BUFSTR(B) ; ON GOES THE BIT
4256 REBUFF: MOVEI A,BUFLNT*5 ; 1ST COUNT
4258 HRRZ A,BUFSTR(B) ; NOW POINTER
4261 MOVEM A,BUFSTR(B) ; STORE BACK
4265 ; HERE TO FLUSH FINAL BUFFER
4267 BFCLOS: HRRZ C,-2(B) ; THIS BUFFER FLUSHER THE WORK OF NDR
4273 PUSH P,A ; SAVE THE RESULT OF OUR TEST
4274 JUMPN A,BFCLNN ; DONT HAVE TO CHECK NET STATE
4276 PUSH TP,B ; SAVE CHANNEL
4277 PUSHJ P,INSTAT ; GET CURRENT NETWORK STATE
4278 MOVE A,(B) ; GET FIRST ELEMENT OF STATE UVECTOR WHICH IS CUR STATE
4279 POP TP,B ; RESTORE B
4281 CAIE A,5 ; IS NET IN OPEN STATE?
4282 CAIN A,6 ; OR ELSE IS IT IN RFNM WAIT STATE
4283 JRST BFCLNN ; IF SO TO THE IOT
4284 POP P, ; ELSE FLUSH CRUFT AND DONT IOT
4285 POPJ P, ; RETURN DOING NO IOT
4286 BFCLNN: MOVEI C,BUFLNT*5 ; NEW BUFFER FLUSHER BY NDR
4287 HRRZ D,BUFSTR-1(B) ; SO THAT NET ALSO WORKS RIGHT
4288 SUBI C,(D) ; GET NUMBER OF CHARS
4289 IDIVI C,5 ; NUMBER OF FULL WORDS AND REST
4290 PUSH P,D ; SAVE NUMBER OF ODD CHARS
4291 SKIPGE A,BUFSTR(B) ; GET CURRENT BUF POSITION
4292 SUBI A,1 ; FIX FOR 440700 BYTE POINTER
4298 PUSH P,(A) ; SAVE THE ODD WORD OF BUFFER
4304 ADDI D,1(A) ; FIX UP FOR POSSIBLE ODD CHARS
4306 PUSH TP,D ; PUSH THE DOPE VECTOR ONTO THE STACK
4307 JUMPE C,BFCLSR ; IN CASE THERE ARE NO FULL WORDS TO DO
4310 MOVE E,[SETZ BUFLNT(A)]
4311 SUBI E,(C) ; FIX UP FOR BACKWARDS BLT
4312 POP A,@E ; AMAZING GRACE
4315 HRRO A,D ; SET UP AOBJN POINTER
4318 PUSHJ P,PGBIOO ; DO THE IOT OF ALL THE FULL WORDS
4319 BFCLSR: HRRO A,(TP) ; GET IOT PTR FOR REST OF JUNK
4320 SUBI A,1 ; POINT TO WORD BEFORE DOPE WORDS
4321 POP P,0 ; GET BACK ODD WORD
4322 POP P,C ; GET BACK ODD CHAR COUNT
4323 POP P,D ; FLAG FOR NET OR DSK
4324 JUMPN D,BFCDSK ; GO FINISH OFF DSK
4325 JUMPE C,BFCLSD ; IF NO ODD CHARS FINISH UP
4327 IMULI D,(C) ; FIND NO OF BITS TO SHIFT
4328 LSH 0,-43(D) ; SHIFT BITS TO RIGHT PLACE
4329 MOVEM 0,(A) ; STORE IN STRING
4330 SUBI C,5 ; HOW MANY CHAR POSITIONS TO SKIP
4331 MOVNI C,(C) ; MAKE C POSITIVE
4333 TLC A,(C) ; MUNG THE AOBJN POINTER TO KLUDGE
4334 PUSHJ P,PGBIOO ; DO IOT OF ODD CHARS
4336 BFCLSD: HRRZ A,(TP) ; GET PTR TO DOPE WORD
4340 MOVEM 0,1(A) ; LAST WORD BACK IN BFR
4341 HRLI A,010700 ; AOBJN POINTER TO FIRST OF BUFFER
4352 BFCLSY: MOVE A,CHANNO(B)
4357 HRRZ F,LSTCH-1(C) ; PREVIOUS HIGH
4358 MOVE G,C ; SAVE CHANNEL
4381 DOTCAL RFPNTR,[A,[2000,,B]]
4382 .LOSE %LSFIL ;PRESUMABLY LOSSAGE MATTERS
4385 .LOSE %LSFIL ;PRESUMABLY LOSSAGE MATTERS
4388 BFCLSZ: SUB TP,[2,,2]
4396 PUSH P,0 ; WORD OF CHARS
4398 MOVEI B,7 ; MAKE BYTE SIZE 7
4411 DOTCAL SIOT,[CHANNO(B),D,C]
4412 .LOSE %LSFIL ;PRESUMABLY LOSSAGE MATTERS
4416 BFCDS1: MOVNI C,1 ; INDICATE NOT TOHACK BUFFER
4419 BFCLS1: HRRZ C,DIRECT-1(B)
4422 MOVE 0,[AOS ACCESS(B)]
4427 MOVEI A,40 ; PAD WITH SPACES
4429 XCT (P) ; AOS ACCESS IF NECESSARY
4430 SOJG D,.-3 ; TO END OF WORD
\r
4439 ; HERE TO GET A TTY BUFFER
4441 GETTTY: SKIPN C,EXBUFR(B) ; SKIP IF BUFFERS BACKED UP
4443 HRRZ D,(C) ; CDR THE LIST
4444 GETYP A,(C) ; CHECK TYPE
4445 CAIE A,TDEFER ; MUST BE DEFERRED
4447 MOVE C,1(C) ; GET DEFERRED GOODIE
4448 GETYP A,(C) ; BETTER BE CHSTR
4451 MOVE A,(C) ; GET FULL TYPE WORD
4453 MOVEM D,EXBUFR(B) ; STORE CDR'D LIST
4454 MOVEM A,BUFSTR-1(B) ; MAKE CURRENT BUFFER
4459 TTYWAI: PUSHJ P,TTYBLK ; BLOCKED FOR TTY I/O
4460 JRST GETTTY ; SHOULD ONLY RETURN HAPPILY
4462 \f;INTERNAL DEVICE READ ROUTINE.
4464 ;FOR INTERNAL DEVICES THIS ROUTINE APPLIES THE GIVEN OBJECT,
4465 ;CHECKS THAT THE RETURNED VALUE IS OF TYPE CHARACTER,
4466 ;AND RETURNS THAT AS THE NEXT CHARACTER IN THE "FILE"
4470 GTINTC: PUSH TP,$TCHAN ;SAVE THE CHANNEL...WE'LL CLOBBER B
4472 PUSH P,C ;AND SAVE THE OTHER ACS
4483 INTRET: POP P,0 ;RESTORE THE ACS
4487 POP TP,B ;RESTORE THE CHANNEL
4488 SUB TP,[1,,1] ;FLUSH $TCHAN...WE DON'T NEED IT
4492 BADRET: ERRUUO EQUOTE INT-DEVICE-WRONG-TYPE-EVALUATION-RESULT
4494 ;INTERNAL DEVICE PRINT ROUTINE.
4496 ;FOR INTERNAL DEVICES THIS ROUTINE APPLIES THE GIVEN OBJECT,(FUNCTION, SUBR, OR RSUBR)
4497 ;TO THE CURRENT CHARACTER BEING "PRINTED".
4499 PTINTC: PUSH TP,$TCHAN ;SAVE THE CHANNEL...WE'LL CLOBBER B
4501 PUSH P,C ;AND SAVE THE OTHER ACS
4505 PUSH TP,$TCHRS ;PUSH THE TYPE "CHARACTER"
4506 PUSH TP,A ;PUSH THE CHAR
4507 PUSH TP,$TCHAN ;PUSH THE CHANNEL
4509 MCALL 2,INTFCN-1(B) ;APPLY THE FUNCTION TO THE CHAR
4514 ; ROUTINE TO FLUSH OUT A PRINT BUFFER
4516 MFUNCTION BUFOUT,SUBR
4525 ; MOVEI B,DIRECT-1(B)
4526 ; PUSHJ P,CHRWRD ; GET DIR NAME
4528 ; CAMN B,[ASCII /PRINT/]
4530 ; CAME B,[<ASCII /PRINT/>+1]
4532 ; TRNE B,1 ; SKIP IF PRINT
4534 ; TRNN B,1 ; SKIP IF PRINTB
4535 ; PUSH P,[AOS ACCESS(B)]
4539 ; TRNE 0,C.BIN ; SKIP IF PRINT
4541 ; TRNN 0,C.BIN ; SKIP IF PRINTB
4542 ; PUSH P,[AOS ACCESS(B)]
4544 ; GETYP 0,BUFSTR-1(B)
4546 ; SKIPN A,BUFSTR(B) ; BYTE POINTER?
4548 ; HRRZ C,BUFSTR-1(B) ; CHARS LEFT
4549 ; IDIVI C,5 ; MULTIPLE OF 5?
4550 ; JUMPE D,BFIN2 ; YUP NO EXTRAS
4552 ; MOVEI A,40 ; PAD WITH SPACES
4553 ; PUSHJ P,PUTCHR ; OUT IT GOES
4554 ; XCT (P) ; MAYBE BUMP ACCESS
4557 BFIN2: PUSHJ P,BFCLOS ; WRITE OUT BUFFER
4559 BFIN1: MOVSI A,TCHAN
4564 ; FUNCTION TO GET THE FILE LENGTH OF A READ CHANNEL
4566 MFUNCTION FILLNT,SUBR,[FILE-LENGTH]
4578 MOVEI B,DIRECT-1(B) ; GET CHANNEL TYPE
4581 CAME B,[ASCIZ /READ/]
4583 PUSH P,[5] ; MULTIPLICATIVE FACTOR FOR READ
4585 CAME B,[ASCII /READB/]
4587 PUSH P,[1] ; MULTIPLICATIVE FACTOR FOR READ
4589 MOVE C,-2(B) ; GET BITS
4590 MOVEI D,5 ; ASSUME ASCII
4591 TRNE C,C.BIN ; SKIP IF NOT BINARY
4597 JRST FILLOS ; GIVE HIM A NICE FALSE
4603 MOVE B,[1,,11] ; READ WORD CONTAINING BYTE SIZE
4605 LDB D,[300600,,(P)] ; GET BYTE SIZE
4607 MOVEI D,36. ; HANDLE "0" BYTE SIZE
4619 YESASC: MOVE A,$TFIX
4624 IDIV 0,D ; BYTES PER WORD
4632 FILL1: SETZ ; BLOCK FOR .CALL TO FILLEN
4637 FILLOS: MOVE A,CHANNO(C)
4638 MOVE B,[.STATUS A] ;MAKE A CALL TO STATUS TO FIND REASON
4639 LSH A,23. ;SHIFT THE CHANNEL NUMBER INTO RIGHT PLACE
4640 IOR B,A ;FIX UP .STATUS
4655 \f; MCHAN LOW-LEVEL I/O GARBAGE (PDL)-ORIGINAL (LIM)-ADDITIONS
4657 ;CALLING ROUTINE: AC-A contains pointer to block of SIXBIT data
4658 ; DIR ? DEV ? FNM1 ? FNM2 ? SNM
4659 ;RETURNED VALUE : AC-A = <channel #, or -1 if no channel available>
4663 MOVE C,FRSTCH ; skip gc and tty channels
4664 CNLP: DOTCAL STATUS,[C,[2000,,B]]
4667 JUMPE B,CHNFND ; found unused channel ?
4668 ADDI C,1 ; try another channel
4669 CAIG C,17 ; are all the channels used ?
4671 SETO C, ; all channels used so C = -1
4674 HLL B,(A) ; M.DIR slot
4675 DOTCAL OPEN,[B,1(A),2(A),3(A),4(A)]
4677 AOS -2(P) ; successful skip when returning
4683 MIOT: DOTCAL IOT,[A,B]
4687 MCLOSE: DOTCAL CLOSE,[A]
4697 \f;THREE GENERALLY USEFUL ERROR ROUTINES FOR I/O
4700 BADCHN: ERRUUO EQUOTE BAD-CHANNEL
4701 BDCHAN: ERRUUO EQUOTE BAD-INPUT-BUFFER
4703 WRONGD: ERRUUO EQUOTE WRONG-DIRECTION-CHANNEL
4705 CHNCLS: ERRUUO EQUOTE CHANNEL-CLOSED
4707 BAD6: ERRUUO EQUOTE NON-6-BIT-CHARACTER-IN-FILE-NAME
4709 DISLOS: MOVE C,$TCHSTR
4710 MOVE D,CHQUOTE [DISPLAY NOT AVAILABLE]
4715 NOCHAN: ERRUUO EQUOTE ITS-CHANNELS-EXHAUSTED
4717 MODE1: 232020,,202020
4718 MODE2: 232023,,330320