1 TITLE OPEN - CHANNEL OPENER FOR MUDDLE
\r
12 IF1, .INSRT MUDSYS;STENEX >
\r
14 ;THIS PROGRAM HAS ENTRIES: FOPEN, FCLOSE, RENAME, READB, PRINTB, FILECOPY, READSTRING,
\r
15 ; PRINTSTRING, NETSTATE, NETACC, NETS, AND ACCESS.
\r
17 ;THESE SUBROUTINES HANDLE I/O STREAMS FOR THE MUDDLE SYSTEM.
\r
19 ; FOPEN - OPENS A FILE FOR EITHER READING OR WRITING. IT TAKES
\r
20 ; FIVE OPTINAL ARGUMENTS AS FOLLOWS:
\r
22 ; FOPEN (<DIR>,<FILE NAME1>,<FILE NAME2>,<DEVICE>,<SYSTEM NAME>)
\r
24 ; <DIR> - DIRECTION EITHER READ (INPUT) OR PRINT (OUPUT). DEFAULT IS READ
\r
26 ; <FILE NAME1> - FIRST FILE NAME. DEFAULT INPUT OR OUTPUT.
\r
28 ; <FILE NAME2> - SECOND FILE NAME. DEFAULT MUDDLE.
\r
30 ; <DEVICE> - DEVICE FROM WHICH TO OPEN. DEFAULT IS DSK.
\r
32 ; <SNAME> - SYSTEM (DIRECTORY) NAME. DEFAULT UNAME.
\r
34 ; FOPEN RETURNS AN OBJECT OF TYPE CHANNEL IF IT SUCCEEDS OTHERWISE NIL
\r
37 ; FCLOSE - CLOSES A FILE. TAKES A CHANNEL OBJECT AS ITS ARGUMENT. IT ALSO TAKES
\r
38 ; ACCESS - DOES A .ACCESS ON A CHARACTER BASIS FOR CHARACTER FILES
\r
41 ; A CHANNEL OBJECT IS A VECTOR CONTAINIG THE FOLLOWING INFORMATION
\r
43 ; CHANNO ;ITS I/O CHANNEL NUMBER. 0 MEANS NOT A REAL CHANNEL.
\r
44 ; DIRECT ;DIRECTION (EITHER READ OR PRINT)
\r
45 ; NAME1 ;FIRST NAME OF FILE AS OPENED.
\r
46 ; NAME2 ;SECOND NAME OF FILE
\r
47 ; DEVICE ;DEVICE UPON WHICH THE CHANNEL IS OPEN
\r
48 ; SNAME ;DIRECTORY NAME
\r
49 ; RNAME1 ;REAL FIRST NAME (AS RETURNED BY READING CHANNEL STATUS)
\r
50 ; RNAME2 ;REAL SECOND NAME
\r
51 ; RDEVIC ;REAL DEVICE
\r
52 ; RSNAME ;SYSTEM OR DIRECTORY NAME
\r
53 ; STATUS ;VARIOUS STATUS BITS
\r
54 ; IOINS ;INSTRUCTION EXECUTED TO INPUT OR OUTPUT ONE CHARACTER
\r
55 ; ACCESS ;ACCESS POINTER FOR RAND ACCESS (OR USED FOR DISPLAY INFO)
\r
56 ; RADX ;RADIX FOR CHANNELS NUMBER CONVERSION
\r
58 ; *** THE FOLLOWING FIELDS FOR OUTPUT ONLY ***
\r
59 ; LINLN ;LENGTH OF A LINE IN CHARACTERS FOR THIS DEVICE
\r
60 ; CHRPOS ;CURRENT POSITION ON CURRENT LINE
\r
61 ; PAGLN ;LENGTH OF A PAGE
\r
62 ; LINPOS ;CURRENT LINE BEING WRITTEN ON
\r
64 ; *** THE FOLLOWING FILEDS FOR INPUT ONLY ***
\r
65 ; EOFCND ;GETS EVALUATED ON EOF
\r
66 ; LSTCH ;BACKUP CHARACTER
\r
67 ; WAITNS ;FOR TTY INPUT, BECOMES A .SLEEP WHEN WAITING
\r
68 ; EXBUFR ;FOR TTY INPUT, CONTAINS A WAITING BUFFER LIST
\r
69 ; BUFSTR ;A CHARACTER STRING USED AS BUFFER FOR NON-TTY DEVICES
\r
71 ; THIS DEFINES THE LENGTH OF THE NON-TTY BUFFER
\r
74 ;THIS DEFINES BLOCK MODE BIT FOR OPENING
\r
75 BLOCKM==2 ;DEFINED IN THE LEFT HALF
\r
79 ;THIS IRP DEFINES THE FIELDS AT ASSEMBLY TIME
\r
81 CHANLNT==4 ;INITIAL CHANNEL LENGTH
\r
83 ; BUILD A PROTOTYPE CHANNEL AND DEFINE FILEDS
\r
84 BUFRIN==-1 ;SPECIAL HACK SO LOSERS WON'T SEE TTY BUFFER
\r
85 SCRPTO==-3 ;SPECIAL HACK FOR SCRIPT CHANNELS
\r
88 IRP A,,[[CHANNO,FIX],[DIRECT,CHSTR]
\r
89 [NAME1,CHSTR],[NAME2,CHSTR],[DEVICE,CHSTR],[SNAME,CHSTR]
\r
90 [RNAME1,CHSTR],[RNAME2,CHSTR],[RDEVIC,CHSTR],[RSNAME,CHSTR]
\r
91 [STATUS,FIX],[IOINS,FIX],[LINLN,FIX],[CHRPOS,FIX],[PAGLN,FIX],[LINPOS,FIX]
\r
92 [ACCESS,FIX],[RADX,FIX],[BUFSTR,CHSTR]]
\r
104 ; EQUIVALANCES FOR CHANNELS
\r
110 DISINF==BUFSTR ;DISPLAY INFO
\r
111 INTFCN==BUFSTR ;FUNCTION (OR SUBR, OR RSUBR) TO BE APPLIED FOR INTERNAL CHNLS
\r
114 ;DEFINE VARIABLES ASSOCIATED WITH TTY BUFFERS
\r
116 IRP A,,[IOIN2,ECHO,CHRCNT,ERASCH,KILLCH,BRKCH,ESCAP,SYSCHR,BRFCHR,BRFCH2,BYTPTR]
\r
120 EXTBFR==BYTPTR+1+<100./5> ;LENGTH OF ADD'L BUFFER
\r
125 .GLOBAL IPNAME,MOPEN,MCLOSE,MIOT,ILOOKU,6TOCHS,ICLOS,OCLOS,RGPARS,RGPRS
\r
126 .GLOBAL OPNCHN,CHMAK,READC,TYO,SYSCHR,BRFCHR,LSTCH,BRFCH2,EXTBFR
\r
127 .GLOBAL CHRWRD,STRTO6,TTYBLK,WAITNS,EXBUFR,TTICHN,TTOCHN,GETCHR
\r
128 .GLOBAL CHANNO,STATUS,LINPOS,PAGLN,CHRPOS,LINLN,IOINS,ACCESS
\r
129 .GLOBAL DIRECT,DISINF,RADX,EOFCND,BUFSTR,MODE1,MODE2,GCHACK,GMTYO
\r
130 .GLOBAL T.CHAN,NAME1,BFCLOS,DOIOTI,DOIOTO,DOACCS,NOTTY,BYTDOP,TNXIN
\r
131 .GLOBAL DISOPN,DISROP,DISCLS,DCHAR,DISLNL,DISPGL,INSTAT,MTYO
\r
132 .GLOBAL ECHO,ERASCH,KILLCH,BRKCH,BYTPTR,SYSCHR,CHRCNT,ESCAP,N.CHNS
\r
133 .GLOBAL REOPN,QUITTE,CHNL0,CHNL1,BUFRIN,IOIN2,IFALSE,GFALS,IDVAL
\r
134 .GLOBAL BADCHN,WRONGD,CHNCLS,GSNAME,GIBLOK,APLQ,NAPT,ICONS,INCONS,IBLOCK,IDVAL1
\r
135 .GLOBAL GRB,GWB,R1CHAR,W1CHAR,BFCLS1,TTYOP2,MPOPJ,COMPER,R1C,W1C,WXCT,RXCT
\r
136 .GLOBAL TMTNXS,TNXSTR,RDEVIC
\r
141 ; PAIR MOVING MACRO
\r
150 ; DEFINITIONS OF THE OFFSETS INTO THE TP STACK FOR OPEN
\r
152 T.SPDL==0 ; SAVES P STACK BASE
\r
153 T.DIR==2 ; CONTAINS DIRECTION AND MODE
\r
154 T.NM1==4 ; NAME 1 OF FILE
\r
155 T.NM2==6 ; NAME 2 OF FILE
\r
156 T.DEV==10 ; DEVICE NAME
\r
158 T.XT==14 ; EXTRA CRUFT IF NECESSARY
\r
159 T.CHAN==16 ; CHANNEL AS GENERATED
\r
161 ; OFFSETS FROM PSTACK BASE (USED FOR OPENS, .RCHST AND .FDELES)
\r
163 S.DIR==0 ; CODE FOR DIRECTION 0-IN, 1-OUT, 2-BIN, 3-BOUT,4-DISPLAY
\r
165 S.DEV==1 ; SIXBIT DEVICE RIGHT JUSTIFIED
\r
166 S.NM1==2 ; SIXBIT NAME1
\r
167 S.NM2==3 ; SIXBIT NAME2
\r
168 S.SNM==4 ; SIXBIT SNAME
\r
182 ; FLAGS SPECIFYING STATE OF THE WORLD AT VARIOUS TIMES
\r
184 NOSTOR==400000 ; ON MEANS DONT BUILD NEW STRINGS
\r
185 MSTNET==200000 ; ON MEANS ONLY THE "NET" DEVICE CAN WIN
\r
186 SNSET==100000 ; FLAG, SNAME SUPPLIED
\r
187 DVSET==040000 ; FLAG, DEV SUPPLIED
\r
188 N2SET==020000 ; FLAG, NAME2 SET
\r
189 N1SET==010000 ; FLAG, NAME1 SET
\r
191 RMT [EXPUNGE N1SET,N2SET,DVSET,SNSET,MSTNET,NOSTOR
\r
195 ; TABLE OF LEGAL MODES
\r
197 MODES: IRP A,,[READ,PRINT,READB,PRINTB,DISPLAY]
\r
202 ; TABLE OF KNOWN DEVICES AND A POINTER TO THEIR OPENERS
\r
206 DEVS: IRP A,,[DSK,TPL,SYS,COM,TTY,USR,STY,[ST ],NET,DIS,E&S,INT,PTP,PTR
\r
207 [P ],[DK ],[UT ],[T ],NUL,[AI ]
\r
208 [ML ],[DM ],[AR ],ARC]B,,[ODSK,ODSK,ODSK,ODSK,OTTY,OUSR,OSTY,OSTY,ONET,ODIS,ODIS
\r
209 OINT,OPTP,OPTP,ODSK,ODSK,OUTN,OTTY,ONUL,ODSK,ODSK,ODSK,ODSK,ODSK]
\r
214 DEVS: IRP A,,[DSK,TTY,INT,NET]B,,[ODSK,OTTY,OINT,ONET]
\r
222 ;SUBROUTINE TO DO OPENING BEGINS HERE
\r
224 MFUNCTION NFOPEN,SUBR,[OPEN-NR]
\r
228 MFUNCTION FOPEN,SUBR,[OPEN]
\r
231 PUSHJ P,MAKCHN ;MAKE THE CHANNEL
\r
232 PUSHJ P,OPNCH ;NOW OPEN IT
\r
235 ; SUBR TO JUST CREATE A CHANNEL
\r
237 MFUNCTION CHANNEL,SUBR
\r
247 ; THIS ROUTINE PARSES ARGUMENTS TO FOPEN ETC. AND BUILDS A CHANNEL BUT DOESN'T OPEN IT
\r
249 MAKCHN: PUSH TP,$TPDL
\r
250 PUSH TP,P ; POINT AT CURRENT STACK BASE
\r
252 PUSH TP,CHQUOTE READ
\r
253 MOVEI E,10 ; SLOTS OF TP NEEDED
\r
257 EXCH E,(P) ; GET RET ADDR IN E
\r
258 IFE ITS, PUSH P,[0]
\r
259 IRP ATM,,[DEV,NM1,NM2,SNM]MDF,,[DSK,INPUT,>,[ ]]TMDF,,[DSK,INPUT,MUD,[ ]]
\r
268 IFN ITS, MOVE B,CHQUOTE MDF
\r
269 IFE ITS, MOVE B,CHQUOTE TMDF
\r
272 MOVEM B,T.!ATM+1(TB)
\r
275 PUSHJ P,STRTO6 ; RESULT LEFT ON P STACK AS DESIRED
\r
278 PUSH TP,[0] ; PUSH SLOTS
\r
281 PUSH P,[0] ; EXT SLOTS
\r
284 PUSH P,E ; PUSH RETURN ADDRESS
\r
287 JUMPGE AB,MAKCH0 ; NO ARGS, ALREADY DONE
\r
288 GETYP 0,(AB) ; 1ST ARG MUST BE A STRING
\r
291 MOVE A,(AB) ; GET ARG
\r
293 PUSHJ P,CHMODE ; CHECK OUT OPEN MODE
\r
295 PMOVEM (AB),T.DIR(TB) ; SAVE MODE NAME IN TEMPS
\r
296 ADD AB,[2,,2] ; BUMP PAST DIRECTION
\r
298 JUMPGE AB,MAKCH0 ; CHECK NAME1 BASED ON JUST MODE
\r
300 MOVEI 0,0 ; FLAGS PRESET
\r
301 PUSHJ P,RGPARS ; PARSE THE STRING(S)
\r
304 ; ARGUMENTS PARSED, DO FINAL CHECKS AND BUILD CHANNEL
\r
308 MOVE C,T.SPDL+1(TB)
\r
309 HLRZS D,S.DEV(C) ; GET DEV
\r
317 MOVE C,T.SPDL+1(TB)
\r
320 CAIE D,(SIXBIT /INT/); INTERNAL?
\r
321 JRST CHNET ; NO, MAYBE NET
\r
322 SKIPN T.XT+1(TB) ; WAS FCN SUPPLIED?
\r
325 ; FALLS TROUGH IF SKIP
\r
329 ; NOW BUILD THE CHANNEL
\r
331 ARGSOK: MOVEI A,CHANLNT ; GET LENGTH
\r
332 PUSHJ P,GIBLOK ; GET A BLOCK OF STUFF
\r
333 ADD B,[4,,4] ; HIDE THE TTY BUFFER SLOT
\r
336 HRLI C,PROCHN ; POINT TO PROTOTYPE
\r
337 HRRI C,(B) ; AND NEW ONE
\r
338 BLT C,CHANLN-5(B) ; CLOBBER
\r
339 MOVSI C,TLIST ; TO GIVE HIM A CLEAN LIST OF SCRIPT CHANS
\r
340 MOVEM C,SCRPTO-1(B)
\r
342 ; NOW BLT IN STUFF FROM THE STACK
\r
344 MOVSI C,T.DIR(TB) ; DIRECTION
\r
347 MOVEI C,RNAME1-1(B) ; NOW "REAL" SLOTS
\r
352 ; HERE TO VALIDIFY ARGUMENTS FOR A NET OPEN
\r
354 CHNET: CAIE D,(SIXBIT /NET/) ; IS IT NET
\r
355 IFN ITS, JRST MAKCH1
\r
359 MOVSI D,TFIX ; FOR TYPES
\r
360 MOVEI B,T.NM1(TB) ; MAKE SURE ALL ARE FIXED
\r
365 LSH A,-1 ; SKIP DEV FLAG
\r
369 MAKCH1: TRNN A,MSTNET ; CANT HAVE SEEN A FIX
\r
374 CHFIX: TRNE A,N1SET ; SKIP IF NOT SPECIFIED
\r
377 SETOM 1(B) ; SET TO -1
\r
379 MOVEM D,(B) ; CORRECT TYPE
\r
384 CHFIX1: ADDI C,1 ; POINT TO NEXT FIELD
\r
385 LSH A,-1 ; AND NEXT FLAG
\r
387 PARSQ: CAIE 0,TCHSTR
\r
411 ; SUBROUTINE TO CHECK VALIDITY OF MODE AND SAVE A CODE
\r
413 CHMODE: PUSHJ P,CHMOD ; DO IT
\r
414 MOVE C,T.SPDL+1(TB)
\r
418 CHMOD: PUSHJ P,STRTO6 ; TO SIXBIT
\r
419 POP P,B ; VALUE ENDSUP ON STACK, RESTORE IT
\r
421 CAME B,[SIXBIT /PRINTO/] ; KLUDGE TO MAKE PRINTO AS PRINTB
\r
423 MOVEI A,3 ; CODE FOR PRINTB
\r
426 MOVSI A,-NMODES ; SCAN TO SEE IF LEGAL MODE
\r
429 JUMPGE A,WRONGD ; ILLEGAL MODE NAME
\r
433 ; RGPARS -- PARSE THE STRINGS COMPRISING FILE NAMES INTO STANDARD ITS GOODIES
\r
435 RGPRS: MOVEI 0,NOSTOR ; DONT STORE STRINGS IF ENTER HERE
\r
437 RGPARS: HRLM 0,(P) ; LH IS FLAGS FOR THIS PROG
\r
438 MOVSI E,-4 ; FIELDS TO FILL
\r
440 RPARGL: GETYP 0,(AB) ; GET TYPE
\r
441 CAIE 0,TCHSTR ; STRING?
\r
442 JRST ARGCLB ; NO, JUST CLOBBER IT IN RAW
\r
443 JUMPGE E,CPOPJ ; DON'T DO ANY MORE
\r
444 PUSH TP,(AB) ; GET AN ARG
\r
447 FPARS: PUSH TP,-1(TP) ; ANOTHER COPY
\r
449 PUSHJ P,FLSSP ; NO LEADING SPACES
\r
450 MOVEI A,0 ; WILL HOLD SIXBIT
\r
451 MOVEI B,6 ; CHARS PER 6BIT WORD
\r
452 MOVE C,[440600,,A] ; BYTE POINTER INTO A
\r
454 FPARSL: HRRZ 0,-1(TP) ; GET COUNT
\r
455 JUMPE 0,PARSD ; DONE
\r
457 ILDB 0,(TP) ; CHAR TO 0
\r
459 CAIE 0,"
\11 ; FILE NAME QUOTE?
\r
464 ILDB 0,(TP) ; USE THIS
\r
467 NOCNTQ: CAIG 0,40 ; SPACE?
\r
468 JRST NDFLD ; YES, TERMINATE THIS FIELD
\r
469 CAIN 0,": ; DEVICE ENDED?
\r
471 CAIN 0,"; ; SNAME ENDED
\r
474 GOTCNQ: PUSHJ P,A0TO6 ; CONVERT TO 6BIT AND CHECK
\r
476 JUMPE B,FPARSL ; IGNORE IF AREADY HAVE 6
\r
480 ; HERE IF SPACE ENCOUNTERED
\r
482 NDFLD: MOVEI D,(E) ; COPY GOODIE
\r
483 PUSHJ P,FLSSP ; FLUSH REDUNDANT SPACES
\r
484 JUMPE 0,PARSD ; NO CHARS LEFT
\r
486 NFL0: PUSH P,A ; SAVE SIXBIT WORD
\r
487 PUSHJ P,6TOCHS ; CONVERT TO STRING
\r
488 HRRZ 0,-1(TP) ; RESTORE CHAR COUNT
\r
490 NFL2: MOVEI C,(D) ; COPY REL PNTR
\r
491 SKIPGE -1(P) ; SKIP IF STRINGS TO BE STORED
\r
495 MOVEM A,(D) ; STORE
\r
497 NFL3: MOVSI A,N1SET ; FLAG IT
\r
499 IORM A,-1(P) ; AND CLOBBER
\r
500 MOVE D,T.SPDL+1(TB) ; GET P BASE
\r
501 POP P,@SIXTBL(C) ; AND STORE SIXBIT OF IT
\r
503 POP TP,-2(TP) ; MAKE NEW STRING POINTER
\r
505 JUMPE 0,.+3 ; SKIP IF NO MORE CHARS
\r
506 AOBJN E,FPARS ; MORE TO PARSE?
\r
507 CPOPJ: POPJ P, ; RETURN, ALL DONE
\r
509 SUB TP,[2,,2] ; FLUSH OLD STRING
\r
511 ADD AB,[2,,2] ; BUMP ARG
\r
512 JUMPL AB,RPARGL ; AND GO ON
\r
513 CPOPJ1: AOS A,(P) ; PREPARE TO WIN
\r
519 ; HERE IF STRING HAS ENDED
\r
521 PARSD: PUSH P,A ; SAVE 6 BIT
\r
522 MOVE A,-3(TP) ; CAN USE ARG STRING
\r
525 JRST NFL2 ; AND CONTINUE
\r
527 ; HERE IF JUST READ DEV
\r
529 GOTDEV: MOVEI D,2 ; CODE FOR DEVICE
\r
530 JRST GOTFLD ; GOT A FIELD
\r
532 ; HERE IF JUST READ SNAME
\r
535 GOTFLD: PUSHJ P,FLSSP
\r
539 ; HERE FOR NON STRING ARG ENCOUNTERED
\r
541 ARGCLB: SKIPGE (P) ; IF NOT STORING, CONSIDER THIS THE END
\r
544 MOVE C,T.SPDL+1(TB) ; GET P-BASE
\r
545 HLRZ A,S.DEV(C) ; GET DEVICE
\r
546 CAIE A,(SIXBIT /INT/) ; IS IT THE INTERNAL DEVICE
\r
547 JRST TRYNET ; NO, COUD BE NET
\r
548 MOVE A,0 ; OFFNEDING TYPE TO A
\r
549 PUSHJ P,APLQ ; IS IT APPLICABLE
\r
550 JRST NAPT ; NO, LOSE
\r
551 PMOVEM (AB),T.XT(TB)
\r
552 ADD AB,[2,,2] ; MUST BE LAST ARG
\r
554 JRST CPOPJ1 ; ELSE SUCCESSFUL RETURN
\r
555 TRYNET: CAIE 0,TFIX ; FOR NET DEV, ARGS MUST BE FIX
\r
556 JRST WRONGT ; TREAT AS WRONG TYPE
\r
557 MOVSI A,MSTNET ; BETTER BE NET EVENTUALLY
\r
558 IORM A,(P) ; STORE FLAGS
\r
560 MOVE B,1(AB) ; GET NUMBER
\r
561 MOVEI 0,(E) ; MAKE SURE NOT DEVICE
\r
564 PUSH P,B ; SAVE NUMBER
\r
565 MOVEI D,(E) ; SET FOR TABLE OFFSETS
\r
568 JRST NFL2 ; GO CLOBBER IT AWAY
\r
572 ; ROUTINE TO FLUSH LEADING SPACES FROM A FIELD
\r
574 FLSSP: HRRZ 0,-1(TP) ; GET CHR COUNNT
\r
575 JUMPE 0,CPOPJ ; FINISHED STRING
\r
576 FLSS1: MOVE B,(TP) ; GET BYTR
\r
580 MOVEM B,(TP) ; UPDATE BYTE POINTER
\r
583 FLSS2: HRRM 0,-1(TP) ; UPDATE STRING
\r
587 ;TABLE FOR STFUFFING SIXBITS AWAY
\r
605 ; TENEX VERSION OF FILE NAME PARSER (ONLY ACCEPT ARGS IN SINGLE STRING)
\r
607 RGPRS: MOVEI 0,NOSTOR
\r
609 RGPARS: HRLM 0,(P) ; SAVE FOR STORE CHECKING
\r
610 CAMGE AB,[-7,,] ; MULTI-STRING CASE POSSIBLE?
\r
611 JRST TN.MLT ; YES, GO PROCESS
\r
612 RGPRSS: GETYP 0,(AB) ; CHECK ARG TYPE
\r
614 JRST WRONGT ; FOR NOW ONLY STRING ARGS WIN
\r
617 PUSHJ P,FLSSP ; FLUSH LEADING SPACES
\r
620 CHKLST: JUMPGE AB,CPOPJ1
\r
621 SKIPGE (P) ; IF FROM OPEN, ALLOW ONE MORE
\r
623 PMOVEM (AB),T.XT(TB)
\r
629 RGPRS1: PUSH P,[0] ; ALLOW A DEVICE SPEC
\r
630 TN.SNM: MOVE A,(TP)
\r
634 CAIE A,"< ; START "DIRECTORY" ?
\r
635 JRST TN.N1 ; NO LOOK FOR NAME1
\r
636 SETOM (P) ; DEV NOT ALLOWED
\r
637 IBP (TP) ; SKIP CHAR
\r
639 PUSHJ P,TN.CNT ; COUNT CHARS TO ">"
\r
640 JUMPE B,ILLNAM ; RAN OUT
\r
641 CAIE A,"> ; SKIP IF WINS
\r
643 PUSHJ P,TN.CPS ; COPY TO NEW STRING
\r
645 MOVEM B,T.SNM+1(TB)
\r
647 TN.N1: PUSHJ P,TN.CNT
\r
649 CAIE A,": ; GOT A DEVICE
\r
656 MOVEM B,T.DEV+1(TB)
\r
657 JRST TN.SNM ; NOW LOOK FOR SNAME
\r
662 MOVEM A,(P) ; SAVE END CHAR
\r
663 PUSHJ P,TN.CPS ; GEN STRING
\r
665 MOVEM B,T.NM1+1(TB)
\r
667 TN.N2: SKIPN A,(P) ; GET CHAR BACK
\r
669 CAIN A,"; ; START VERSION?
\r
671 CAIE A,". ; START NAME2?
\r
672 JRST ILLNAM ; I GIVE UP!!!
\r
673 HRRZ B,-1(TP) ; GET RMAINS OF STRING
\r
674 PUSHJ P,TN.CPS ; AND COPY IT
\r
676 MOVEM B,T.NM2+1(TB)
\r
677 RPDONE: SUB P,[1,,1] ; FLUSH TEMP
\r
681 TN.CNT: HRRZ 0,-1(TP) ; CHAR COUNT
\r
683 MOVEI B,0 ; INIT COUNT TO 0
\r
685 TN.CN1: MOVEI A,0 ; IN CASE RUN OUT
\r
686 SOJL 0,CPOPJ ; RUN OUT?
\r
688 CAIE A,"
\16 ; TNEX FILE QUOTE?
\r
691 IBP C ; SKIP QUOTED CHAT
\r
706 TN.CPS: PUSH P,B ; # OF CHARS
\r
707 MOVEI A,4(B) ; ADD 4 TO B IN A
\r
709 PUSHJ P,IBLOCK ; GET BLOCK OF WORDS FOR STRING
\r
711 POP P,C ; CHAR COUNT BACK
\r
714 HRRI A,(C) ; CHAR STRING
\r
715 MOVE D,B ; COPY BYTER
\r
718 ILDB 0,(TP) ; GET CHAR
\r
719 IDPB 0,D ; AND STROE
\r
722 MOVNI C,(A) ; - LENGTH TO C
\r
723 ADDB C,-1(TP) ; DECREMENT WORDS COUNT
\r
724 TRNN C,-1 ; SKIP IF EMPTY
\r
727 SOS -1(TP) ; ELSE FLUSH TERMINATOR
\r
730 ILLNAM: PUSH TP,$TATOM
\r
731 PUSH TP,EQUOTE ILLEGAL-TENEX-FILE-NAME
\r
734 TN.MLT: MOVEI A,(AB)
\r
737 TN.ML1: GETYP 0,(A)
\r
741 JRST RGPRSS ; ASSUME SINGLE STRING
\r
747 BLT A,T.SNM+1(TB) ; BLT 'EM IN
\r
748 ADD AB,[10,,10] ; SKIP THESE GUYS
\r
754 ; ROUTINE TO OPEN A CHANNEL FOR ANY DEVICE. NAMES ARE ASSUMED TO ALREADY
\r
755 ; BE ON BOTH TP STACK AND P STACK
\r
757 OPNCH: MOVE C,T.SPDL+1(TB) ; GET PDL BASE
\r
759 ANDI A,1 ; JUST WANT I AND O
\r
761 ; .TRANS S.DEV(C) ; UNDO ANY TRANSLATIONS
\r
762 ; JRST TRLOST ; COMPLAIN
\r
764 HRRZ A,S.DEV(C) ; GET SIXBIT DEVICE CODE
\r
765 MOVEI E,(A) ; COPY TO E
\r
766 ANDI E,777700 ; WITHOUT LAST
\r
767 MOVEI D,(E) ; AND D
\r
768 ANDI D,770000 ; WITH JUST LETTER
\r
769 MOVSI B,-NDEVS ; AOBJN COUNTER
\r
771 DEVLP: HRRZ 0,DEVS(B) ; GET ONE
\r
772 CAIN 0,(A) ; FULL DEV?
\r
774 CAIN 0,(D) ; ONE LETTER
\r
776 CAIN 0,(E) ; 2 LTTERS
\r
778 NXTDEV: AOBJN B,DEVLP ; LOOP THRU
\r
781 OUSR: HRRZ A,S.DIR(C) ; BLOCK OR UNIT?
\r
782 TRNE A,2 ; SKIP IF UNIT
\r
784 PUSHJ P,OPEN1 ; OPEN IT
\r
785 PUSHJ P,FIXREA ; AND READCHST IT
\r
786 MOVE B,T.CHAN+1(TB) ; RESTORE CHANNEL
\r
787 MOVE 0,[PUSHJ P,DOIOT] ; GET AN IOINS
\r
789 MOVE C,T.SPDL+1(TB)
\r
797 OSTY: HLRZ A,S.DEV(C)
\r
798 IORI A,10 ; THE DONT LOSE BIT (DONT HANG ON INPUT DO ON OUTPUT)
\r
804 PUSH TP,EQUOTE NO-SUCH-DEVICE?
\r
808 ; MAKE SURE DIGITS EXIST
\r
810 CH2DIG: LDB 0,[60600,,A]
\r
811 CAIG 0,'9 ; CHECK DIGITNESS
\r
813 JRST NXTDEV ; LOSER
\r
815 CH1DIG: LDB 0,[600,,A] ; LAST CHAR
\r
820 ; HERE TO DISPATCH IF SUCCESSFUL
\r
822 DISPA: HLRZ B,DEVS(B)
\r
824 HRRZ A,S.DIR(C) ; GET DIR OF OPEN
\r
825 CAIN A,5 ; IS IT DISPLAY
\r
826 CAIN B,ODIS ; BETTER BE OPENING DISPLAY
\r
827 JRST (B) ; GO TO HANDLER
\r
835 ; DISK DEVICE OPNER COME HERE
\r
837 ODSK: MOVE A,S.SNM(C) ; GET SNAME
\r
838 .SUSET [.SSNAM,,A] ; CLOBBER IT
\r
839 PUSHJ P,OPEN0 ; DO REAL LIVE OPEN
\r
843 ; TENEX DISK FILE OPENER
\r
845 ODSK: MOVE B,T.CHAN+1(TB) ; GET CHANNEL
\r
846 PUSHJ P,STSTK ; EXPAND STRING ONTO STACK (E POINTS TO OLD P)
\r
849 PUSHJ P,STRTO6 ; GET DIR NAME
\r
851 MOVE D,T.SPDL+1(TB)
\r
853 CAMN C,[SIXBIT /PRINTO/]
\r
854 IORI D,100 ; TURN ON BIT TO SAY USE OLD FILE
\r
855 MOVSI A,101 ; START SETTING UP BITS EXTRA BIT FOR MSB
\r
856 TRNE D,1 ; SKIP IF INPUT
\r
857 TRNE D,100 ; WITE OVER?
\r
858 TLOA A,100000 ; FORCE NEW VERSION
\r
859 TLO A,400000 ; FORCE OLD
\r
860 HRROI B,1(E) ; POIT TO STRING
\r
862 TDZA 0,0 ; SAVE FACT OF NO SKIP
\r
863 MOVEI 0,1 ; INDICATE SKIPPED
\r
864 MOVE P,E ; RESTORE PSTACK
\r
865 JUMPE 0,GTJLOS ; FIND OUT WHAT HAPPENED
\r
867 MOVE B,T.CHAN+1(TB) ; GET CHANNEL
\r
868 HRRZM A,CHANNO(B) ; SAVE IT
\r
869 ANDI A,-1 ; READ Y TO DO OPEN
\r
870 MOVSI B,440000 ; USE 36. BIT BYES
\r
871 HRRI B,200000 ; ASSUME READ
\r
872 TRNE D,1 ; SKIP IF READ
\r
873 HRRI B,300000 ; WRITE BIT
\r
874 HRRZ 0,FSAV(TB) ; SEE IF REF DATE HACK
\r
876 TRO B,400 ; SET DON'T MUNG REF DATE BIT
\r
879 MOVEI 0,C.OPN+C.READ
\r
880 TRNE D,1 ; SKIP FOR READ
\r
881 MOVEI 0,C.OPN+C.PRIN
\r
882 MOVE B,T.CHAN+1(TB)
\r
883 HRRM 0,-4(B) ; MUNG THOSE BITS
\r
884 ASH A,1 ; POINT TO SLOT
\r
885 ADDI A,CHNL0(TVP) ; TO REAL SLOT
\r
886 MOVEM B,1(A) ; SAVE CHANNEL
\r
887 PUSHJ P,TMTNXS ; GET STRING FROM TENEX
\r
888 MOVE B,CHANNO(B) ; JFN TO A
\r
889 HRROI A,1(E) ; BASE OF STRING
\r
890 MOVE C,[111111,,140001] ; WEIRD CONTROL BITS
\r
892 MOVEI B,1(E) ; POINT TO START OF STRING
\r
893 SUBM P,E ; RELATIVIZE E
\r
894 PUSHJ P,TNXSTR ; MAKE INTO A STRING
\r
895 SUB P,E ; BACK TO NORMAL
\r
898 PUSHJ P,RGPRS1 ; PARSE INTO FIELDS
\r
899 MOVE B,T.CHAN+1(TB)
\r
900 MOVEI C,RNAME1-1(B)
\r
904 OPFLOS: MOVEI C,(A) ; SAVE ERROR CODE
\r
905 MOVE B,T.CHAN+1(TB)
\r
906 HRRZ A,CHANNO(B) ; JFN BACK TO A
\r
907 RLJFN ; TRY TO RELEASE IT
\r
909 MOVEI A,(C) ; ERROR CODE BACK TO A
\r
911 GTJLOS: PUSHJ P,TGFALS ; GET A FALSE WITH REASON
\r
914 STSTK: PUSH TP,$TCHAN
\r
916 MOVEI A,4+5 ; COUNT CHARS NEEDED (NEED LAST 0 BYTE)
\r
922 ANDI A,-1 ; TO 18 BITS
\r
923 IDIVI A,5 ; TO WORDS NEEDED
\r
924 POP P,C ; SAVE RET ADDR
\r
925 MOVE E,P ; SAVE POINTER
\r
926 PUSH P,[0] ; ALOCATE SLOTS
\r
928 PUSH P,C ; RET ADDR BACK
\r
929 INTGO ; IN CASE OVERFLEW
\r
930 MOVE B,(TP) ; IN CASE GC'D
\r
931 MOVE D,[440700,,1(E)] ; BYTE POINTER TO IT
\r
932 MOVEI A,RDEVIC-1(B)
\r
933 PUSHJ P,MOVSTR ; FLUSH IT ON
\r
936 HRRZ A,RSNAME-1(B) ; ANY SNAME AT ALL?
\r
937 JUMPE A,ST.NM1 ; NOPE, CANT HACK WITH IT
\r
940 MOVEI A,RSNAME-1(B)
\r
941 PUSHJ P,MOVSTR ; SNAME UP
\r
944 MOVEI A,RNAME1-1(B)
\r
948 ST.NM1: MOVEI A,RNAME2-1(B)
\r
953 MOVSTR: HRRZ 0,(A) ; CHAR COUNT
\r
954 MOVE A,1(A) ; BYTE POINTER
\r
956 ILDB C,A ; GET CHAR
\r
957 IDPB C,D ; MUNG IT UP
\r
960 ; MAKE A TENEX ERROR MESSAGE STRING
\r
962 TGFALS: PUSH P,A ; SAVE ERROR CODE
\r
963 PUSHJ P,TMTNXS ; STRING ON STACK
\r
964 HRROI A,1(E) ; POINT TO SPACE
\r
965 MOVE B,(E) ; ERROR CODE
\r
966 HRLI B,400000 ; FOR ME
\r
967 MOVSI C,-100. ; MAX CHARS
\r
968 ERSTR ; GET TENEX STRING
\r
972 MOVEI B,1(E) ; A AND B BOUND STRING
\r
973 SUBM P,E ; RELATIVIZE E
\r
974 PUSHJ P,TNXSTR ; BUILD STRING
\r
975 SUB P,E ; P BACK TO NORMAL
\r
976 TGFLS2: SUB P,[1,,1] ; FLUSH ERROR CODE SLOT
\r
979 PUSHJ P,INCONS ; BUILD LIST
\r
980 MOVSI A,TFALSE ; MAKE IT FALSE
\r
983 TGFLS1: MOVE P,E ; RESET STACK
\r
985 MOVE B,CHQUOTE UNKNOWN PROBLEM IN I/O
\r
989 ; OTHER BUFFERED DEVICES JOIN HERE
\r
993 PUSHJ P,FIXREA ; STORE THE "REAL" NAMES INTO THE CHANNEL
\r
995 OPBASC: MOVE C,T.SPDL+1(TB) ; C WAS CLOBBERED, GET IT BACK
\r
996 HRRZ A,S.DIR(C) ; FIND OUT IF OPEN IS ASCII OR WORD
\r
997 TRZN A,2 ; SKIP IF BINARY
\r
998 PUSHJ P,OPASCI ; DO IT FOR ASCII
\r
1000 ; NOW SET UP IO INSTRUCTION FOR CHANNEL
\r
1002 MAKION: MOVE B,T.CHAN+1(TB)
\r
1004 JUMPE A,MAKIO1 ; JUMP IF INPUT
\r
1005 MOVEI C,PUTCHR ; ELSE GET INPUT
\r
1006 MOVEI 0,80. ; DEFAULT LINE LNTH
\r
1009 MOVEM 0,LINLN-1(B)
\r
1012 MOVEM C,IOINS(B) ; STORE IT
\r
1013 JUMPN A,OPNWIN ; GET AN EOF FORM FOR INPUT CHANNEL
\r
1015 ; HERE TO CONS UP <ERROR END-OF-FILE>
\r
1017 EOFMAK: MOVSI C,TATOM
\r
1018 MOVE D,EQUOTE END-OF-FILE
\r
1022 MOVE D,IMQUOTE ERROR
\r
1024 MOVE D,T.CHAN+1(TB) ; RESTORE CHANNEL
\r
1026 MOVEM 0,EOFCND-1(D)
\r
1029 OPNWIN: MOVEI 0,10. ; SET UP RADIX
\r
1030 MOVSI A,TCHAN ; OPEN SUCCEEDED, RET CHANNEL
\r
1031 MOVE B,T.CHAN+1(TB)
\r
1034 OPNRET: MOVE C,(P) ; RET ADDR
\r
1035 SUB P,[S.X3+2,,S.X3+2]
\r
1036 SUB TP,[T.CHAN+2,,T.CHAN+2]
\r
1040 ; HERE TO CREATE CHARACTER BUFFERS FOR ASCII I/O
\r
1042 OPASCI: PUSH P,A ; CONTAINS MODE, SAVE IT
\r
1043 MOVEI A,BUFLNT ; GET SIZE OF BUFFER
\r
1044 PUSHJ P,IBLOCK ; GET STORAGE
\r
1045 MOVSI 0,TWORD+.VECT. ; SET UTYPE
\r
1046 MOVEM 0,BUFLNT(B) ; AND STORE
\r
1048 SKIPE (P) ; SKIP IF INPUT
\r
1050 MOVEI D,BUFLNT(B) ; REST BYTE POINTER
\r
1051 OPASCA: HRLI D,440700
\r
1052 MOVE B,T.CHAN+1(TB) ; GET CHANNEL BACK
\r
1054 IORM 0,-4(B) ; TURN ON BUFFER BIT
\r
1055 MOVEM A,BUFSTR-1(B)
\r
1056 MOVEM D,BUFSTR(B) ; CLOBBER
\r
1060 OPASCO: HRROI C,777776
\r
1061 MOVEM C,(B) ; -1 THE BUFFER (LEAVE OFF LOW BIT)
\r
1063 HRRI C,1(B) ; BUILD BLT POINTER
\r
1064 BLT C,BUFLNT-1(B) ; ZAP
\r
1065 MOVEI D,(B) ; START MAKING STRING POINTER
\r
1066 HRRI A,BUFLNT*5 ; SET UP CHAR COUNT
\r
1070 ; OPEN NON FILE ORIENTED DEVICES (NUL, PTR, PTP ETC.)
\r
1074 OPTR: PUSHJ P,OPEN0 ; SET UP MODE AND OPEN
\r
1075 SETZM S.NM1(C) ; CLOBBER UNINTERESTING FIELDS
\r
1080 ; OPEN DEVICES THAT IGNORE SNAME
\r
1082 OUTN: PUSHJ P,OPEN0
\r
1086 ; OPEN THE DISPLAY DEVICE
\r
1088 ODIS: MOVEI B,T.DIR(TB) ; GET CHANNEL
\r
1089 PUSHJ P,CHRWRD ; TO ASCII
\r
1091 MOVE E,B ; DIR TO E
\r
1092 MOVE B,T.CHAN+1(TB) ; CHANNEL
\r
1093 MOVE 0,[PUSHJ P,DCHAR] ; IOINS
\r
1097 JRST DISLOS ; LOSER
\r
1099 MOVE D,T.CHAN+1(TB) ; GET CHANNEL
\r
1100 MOVEI 0,C.OPN+C.PRIN
\r
1102 MOVEM A,DISINF-1(D) ; AND STORE
\r
1104 SETZM CHANNO(D) ; NO REAL CHANNEL
\r
1109 MOVEI 0,10. ; SET RADIX
\r
1111 JRST SAVCHN ; ADD TO CHANNEL LIST
\r
1114 ; INTERNAL CHANNEL OPENER
\r
1116 OINT: HRRZ A,S.DIR(C) ; CHECK DIR
\r
1117 CAIL A,2 ; READ/PRINT?
\r
1118 JRST WRONGD ; NO, LOSE
\r
1120 MOVE 0,INTINS(A) ; GET INS
\r
1121 MOVE D,T.CHAN+1(TB) ; AND CHANNEL
\r
1122 MOVEM 0,IOINS(D) ; AND CLOBBER
\r
1123 MOVEI 0,C.OPN+C.READ
\r
1125 MOVEI 0,C.OPN+C.PRIN
\r
1127 SETOM STATUS(D) ; MAKE SURE NOT AA TTY
\r
1128 PMOVEM T.XT(TB),INTFCN-1(D)
\r
1130 ; HERE TO SAVE PSEUDO CHANNELS
\r
1132 SAVCHN: HRRZ E,CHNL0+1(TVP) ; POINT TO CURRENT LIST
\r
1134 PUSHJ P,ICONS ; CONS IT ON
\r
1135 HRRZM B,CHNL0+1(TVP)
\r
1138 ; INT DEVICE I/O INS
\r
1140 INTINS: PUSHJ P,GTINTC
\r
1144 ; HERE TO OPEN THE NET DEVICE (I.E. THE ARPA NET)
\r
1147 ONET: HRRZ A,S.DIR(C) ; DIRECTION CODE
\r
1148 CAILE A,1 ; ASCII ?
\r
1149 IORI A,4 ; TURN ON IMAGE BIT
\r
1150 SKIPGE S.NM1(C) ; NAME1 I.E. LOCAL HOST GIVEN
\r
1151 IORI A,10 ; NO, WE WILL LET ITS GIVE US ONE
\r
1152 SKIPGE S.NM2(C) ; NORMAL OR "LISTEN"
\r
1153 IORI A,20 ; TURN ON LISTEN BIT
\r
1154 MOVEI 0,7 ; DEFAULT BYTE SIZE
\r
1156 MOVEI 0,36. ; IMAGE WHICH IS 36
\r
1157 SKIPN T.XT(TB) ; BYTE SIZE GIVEN?
\r
1158 MOVEM 0,S.X1(C) ; NO, STORE DEFAULT
\r
1159 SKIPG D,S.X1(C) ; BYTE SIZE REASONABLE?
\r
1160 JRST RBYTSZ ; NO <0, COMPLAIN
\r
1161 TRNE A,2 ; SKIP TO CHECK ASCII
\r
1162 JRST ONET2 ; CHECK IMAGE
\r
1163 CAIN D,7 ; 7-BIT WINS
\r
1165 CAIE D,44 ; 36-BIT INDICATES BLOCK ASCII MODE
\r
1167 IORI A,2 ; SET BLOCK FLAG
\r
1169 IORI A,40 ; USE 8-BIT MODE
\r
1170 CAIN D,10 ; IS IT RIGHT
\r
1174 RBYTSZ: PUSH TP,$TATOM ; CALL ERROR
\r
1175 PUSH TP,EQUOTE BYTE-SIZE-BAD
\r
1179 ONET2: CAILE D,36. ; IMAGE SIZE REASONABLE?
\r
1181 CAIN D,36. ; NORMAL
\r
1182 JRST ONET1 ; YES, DONT SET FIELD
\r
1184 ASH D,9. ; POSITION FOR FIELD
\r
1185 IORI A,40(D) ; SET IT AND ITS BIT
\r
1187 ONET1: HRLM A,S.DEV(C) ; CLOBBER OPEN BLOCK
\r
1188 MOVE E,A ; SAVE BLOCK MODE INFO
\r
1189 PUSHJ P,OPEN1 ; DO THE OPEN
\r
1192 ; CLOBBER REAL SLOTS FOR THE OPEN
\r
1194 MOVEI A,3 ; GET STATE VECTOR
\r
1197 MOVE D,T.CHAN+1(TB)
\r
1198 MOVEM A,BUFRIN-1(D)
\r
1200 MOVSI A,TFIX+.VECT. ; SET U TYPE
\r
1202 MOVE C,T.SPDL+1(TB)
\r
1203 MOVE B,T.CHAN+1(TB)
\r
1205 PUSHJ P,INETST ; GET STATE
\r
1207 POP P,A ; IS THIS BLOCK MODE
\r
1208 MOVEI 0,80. ; POSSIBLE LINE LENGTH
\r
1209 TRNE A,1 ; SKIP IF INPUT
\r
1211 TRNN A,2 ; BLOCK MODE?
\r
1213 TRNN A,4 ; ASCII MODE?
\r
1214 JRST OPBASC ; GO SETUP BLOCK ASCII
\r
1215 MOVE 0,[PUSHJ P,DOIOT]
\r
1220 ; INTERNAL ROUTINE TO GET THE CURRENT STATE OF THE NETWROK CHANNEL
\r
1222 INETST: MOVE A,S.NM1(C)
\r
1226 LDB A,[1100,,S.SNM(C)]
\r
1229 MOVE E,BUFRIN(B) ; GET STATE BLOCK
\r
1230 INTST1: HRRE 0,S.X1(C)
\r
1238 ; ACCEPT A CONNECTION
\r
1240 MFUNCTION NETACC,SUBR
\r
1242 PUSHJ P,ARGNET ; CHECK THAT ARG IS AN OPEN NET CHANNEL
\r
1243 MOVE A,CHANNO(B) ; GET CHANNEL
\r
1244 LSH A,23. ; TO AC FIELD
\r
1247 JRST IFALSE ; RETURN FALSE
\r
1248 NETRET: MOVE A,(AB)
\r
1252 ; FORCE SYSTEM NETWORK BUFFERS TO BE SENT
\r
1254 MFUNCTION NETS,SUBR
\r
1259 SKIPA A,CHANNO(B) ; GET CHANNEL
\r
1266 ; SUBR TO RETURN UPDATED NET STATE
\r
1268 MFUNCTION NETSTATE,SUBR
\r
1270 PUSHJ P,ARGNET ; IS IT A NET CHANNEL
\r
1274 ; INTERNAL NETSTATE ROUTINE
\r
1276 INSTAT: MOVE C,P ; GET PDL BASE
\r
1277 MOVEI 0,S.X3 ; # OF SLOTS NEEDED
\r
1281 MOVEI D,S.DEV(C) ; SETUP FOR .RCHST
\r
1283 .RCHST D, ; GET THE GOODS
\r
1285 PUSHJ P,INETST ; INTO VECTOR
\r
1286 SUB P,[S.X3,,S.X3]
\r
1291 ; INTERNAL ROUTINE TO CHECK FOR CORRECT CHANNEL TYPE
\r
1297 MOVE B,1(AB) ; GET CHANNEL
\r
1298 SKIPN CHANNO(B) ; OPEN?
\r
1300 MOVE A,RDEVIC-1(B) ; GET DEV NAME
\r
1304 CAME A,[SIXBIT /NET /]
\r
1307 MOVE A,DIRECT-1(B) ; CHECK FOR A READ SOCKET
\r
1310 MOVE B,1(AB) ; RESTORE CHANNEL
\r
1316 ; TENEX NETWRK OPENING CODE
\r
1318 ONET: MOVE B,T.CHAN+1(TB) ; GET CHANNEL
\r
1322 PUSH P,[ASCII /NET:/] ; FOR STRINGS
\r
1323 GETYP 0,RNAME1-1(B) ; CHECK TYPE
\r
1324 CAIE 0,TFIX ; SKIP IF # SUPPLIED
\r
1326 MOVE 0,RNAME1(B) ; GET IT
\r
1330 ONET1: CAIE 0,TCHSTR
\r
1332 HRRZ 0,RNAME1-1(B)
\r
1340 MOVE B,T.CHAN+1(TB)
\r
1341 GETYP 0,RNAME2-1(B)
\r
1344 GETYP 0,RSNAME-1(B)
\r
1350 MOVE B,T.CHAN+1(TB)
\r
1357 ONET3: CAIE 0,TCHSTR
\r
1359 HRRZ 0,RNAME2-1(B)
\r
1367 ONET5: MOVE B,T.CHAN+1(TB)
\r
1368 GETYP 0,RNAME2-1(B)
\r
1376 HRROI B,1(E) ; STRING POINTER
\r
1377 GTJFN ; GET THE G.D JFN
\r
1378 TDZA 0,0 ; REMEMBER FAILURE
\r
1380 MOVE P,E ; RESTORE P
\r
1381 JUMPE 0,GTJLOS ; CONS UP ERROR STRING
\r
1383 MOVE B,T.CHAN+1(TB)
\r
1384 HRRZM A,CHANNO(B) ; SAVE THE JFN
\r
1386 MOVE C,T.SPDL+1(TB)
\r
1399 TRNE D,1 ; SKIP FOR INPUT
\r
1401 ANDI A,-1 ; ISOLATE JFCN
\r
1403 JRST OPFLOS ; REPORT ERROR
\r
1404 MOVE B,T.CHAN+1(TB)
\r
1405 ASH A,1 ; POINT TO SLOT
\r
1406 ADDI A,CHNL0(TVP) ; TO REAL SLOT
\r
1407 MOVEM B,1(A) ; SAVE CHANNEL
\r
1409 CVSKT ; GET ABS SOCKET #
\r
1410 FATAL NETWORK BITES THE BAG!
\r
1412 MOVE B,T.CHAN+1(TB)
\r
1415 MOVEM 0,RNAME1-1(B)
\r
1418 MOVEM 0,RNAME2-1(B)
\r
1419 MOVEM 0,RSNAME-1(B)
\r
1420 MOVE C,T.SPDL+1(TB)
\r
1422 MOVE 0,[PUSHJ P,DONETO]
\r
1423 TRNN C,1 ; SKIP FOR OUTPUT
\r
1424 MOVE 0,[PUSHJ P,DONETI]
\r
1426 MOVEI 0,80. ; LINELENGTH
\r
1427 TRNE C,1 ; SKIP FOR INPUT
\r
1429 MOVEI A,3 ; GET STATE UVECTOR
\r
1431 MOVSI 0,TFIX+.VECT.
\r
1434 MOVE B,T.CHAN+1(TB)
\r
1437 MOVEM 0,BUFRIN-1(B)
\r
1438 MOVE A,CHANNO(B) ; GET JFN
\r
1440 MOVE E,T.CHAN+1(TB)
\r
1444 MOVEM B,(C) ; INITIAL STATE STORED
\r
1448 ; DOIOT FOR TENEX NETWRK
\r
1459 MOVEI 0,(A) ; POSSIBLE OUTPUT CHAR TO 0
\r
1465 MOVEI A,(B) ; RET CHAR IN A
\r
1486 FIXSTK: CAMN 0,[-1]
\r
1488 JFFO 0,FIXS3 ; PUT OCTAL DIGITS INTO STIRNG
\r
1500 ROTC 0,3 ; NEXT DIGIT
\r
1509 TLNE C,760000 ; SKIP IF NEW WORD
\r
1518 MOVEM D,RNAME2(E) ; UPDATE FOREIGN SOCHKET
\r
1519 MOVEM C,RSNAME(E) ; AND HOST
\r
1521 XCT ITSTRN(B) ; XLATE TO LOOK MORE LIKE ITS
\r
1522 MOVEM B,(C) ; STORE STATE
\r
1542 NLOSS: FATAL ILLEGAL NETWORK STATE
\r
1544 NOPND: MOVE B,DIRECT(E) ; SEE IF READ OR PRINT
\r
1545 ILDB B,B ; GET 1ST CHAR
\r
1546 CAIE B,"R ; SKIP FOR READ
\r
1548 SIBE ; SEE IF INPUT EXISTS
\r
1552 MOVEM B,2(C) ; STORE BYTES IN STATE VECTOR
\r
1553 MOVEI B,11 ; RETURN DATA PRESENT STATE
\r
1556 NOPNDW: SOBE ; SEE IF OUTPUT PRESENT
\r
1564 NCLSD: MOVE B,DIRECT(E)
\r
1578 MFUNCTION NETSTATE,SUBR
\r
1586 MFUNCTION NETS,SUBR
\r
1589 CAME A,MODES+1 ; PRINT OR PRINTB?
\r
1595 NETRET: MOVE B,1(AB)
\r
1599 MFUNCTION NETACC,SUBR
\r
1609 ; HERE TO OPEN TELETYPE DEVICES
\r
1611 OTTY: HRRZ A,S.DIR(C) ; GET DIR CODE
\r
1612 TRNE A,2 ; SKIP IF NOT READB/PRINTB
\r
1613 JRST WRONGD ; CANT DO THAT
\r
1616 MOVE A,S.NM1(C) ; CHECK FOR A DIR
\r
1618 CAMN A,[SIXBIT /.FILE./]
\r
1619 CAME 0,[SIXBIT /(DIR)/]
\r
1620 SKIPA E,[-15.*2,,]
\r
1621 JRST OUTN ; DO IT THAT WAY
\r
1623 HRRZ A,S.DIR(C) ; CHECK DIR
\r
1627 PUSH P,S.DEV(C) ; SAVE THE SIXBIT DEV NAME
\r
1628 HRLZS (P) ; POSTITION DEVICE NAME
\r
1630 TTYLP: SKIPN D,1(E) ; CHANNEL OPEN?
\r
1631 JRST TTYLP1 ; NO, GO TO NEXT
\r
1632 MOVE A,RDEVIC-1(D) ; GET DEV NAME
\r
1634 PUSHJ P,STRTO6 ; TO 6 BIT
\r
1635 POP P,A ; GET RESULT
\r
1636 CAMN A,(P) ; SAME?
\r
1637 JRST SAMTYQ ; COULD BE THE SAME
\r
1638 TTYLP1: ADD E,[2,,2]
\r
1640 SUB P,[1,,1] ; THIS ONE MUST BE UNIQUE
\r
1641 TTYLP2: MOVE C,T.SPDL+1(TB) ; POINT TO P BASE
\r
1642 HRRZ A,S.DIR(C) ; GET DIR OF OPEN
\r
1643 SKIPE A ; IF OUTPUT,
\r
1644 IORI A,20 ; THEN USE DISPLAY MODE
\r
1645 HRLM A,S.DEV(C) ; STORE IN OPEN BLOCK
\r
1646 PUSHJ P,OPEN2 ; OPEN THE TTY
\r
1647 HRLZ A,S.DEV(C) ; GET DEVICE NAME
\r
1648 PUSHJ P,6TOCHS ; TO A STRING
\r
1649 MOVE D,T.CHAN+1(TB) ; POINT TO CHANNEL
\r
1650 MOVEM A,RDEVIC-1(D)
\r
1652 MOVE C,T.SPDL+1(TB) ; RESTORE PDL BASE
\r
1653 MOVE B,D ; CHANNEL TO B
\r
1654 HRRZ 0,S.DIR(C) ; AND DIR
\r
1656 TTY1: DOTCAL TTYGET,[CHANNO(B),[2000,,0],[2000,,A],[2000,,D]]
\r
1657 FATAL .CALL FAILURE
\r
1658 DOTCAL TTYSET,[CHANNO(B),MODE1,MODE2,D]
\r
1659 FATAL .CALL FAILURE
\r
1660 MOVE A,[PUSHJ P,GMTYO]
\r
1662 DOTCAL RSSIZE,[CHANNO(B),[2000,,A],[2000,,D]]
\r
1663 FATAL .CALL FAILURE
\r
1670 IOTMAK: HRLZ A,CHANNO(B) ; GET CHANNEL
\r
1672 IOR A,[.IOT A] ; BUILD IOT
\r
1673 MOVEM A,IOINS(B) ; AND STORE IT
\r
1677 ; HERE IF POSSIBLY OPENING AN ALREADY OPEN TTY
\r
1679 SAMTYQ: MOVE D,1(E) ; RESTORE CURRENT CHANNEL
\r
1680 MOVE A,DIRECT-1(D) ; GET DIR
\r
1683 POP P,A ; GET SIXBIT
\r
1684 MOVE C,T.SPDL+1(TB)
\r
1686 CAME A,MODES(C) ; SKIP IF DIFFERENT DIRECTION
\r
1689 ; HERE IF A RE-OPEN ON A TTY
\r
1691 HRRZ 0,FSAV(TB) ; IS IT FROM A FOPEN
\r
1693 JRST RETOLD ; RET OLD CHANNEL
\r
1696 PUSH TP,1(E) ; PUSH OLD CHANNEL
\r
1698 PUSH TP,T.CHAN+1(TB)
\r
1699 MOVE A,[PUSHJ P,CHNFIX]
\r
1703 RETOLD: MOVE B,1(E) ; GET CHANNEL
\r
1704 AOS CHANNO-1(B) ; AOS REF COUNT
\r
1706 SUB P,[1,,1] ; CLEAN UP STACK
\r
1707 JRST OPNRET ; AND LEAVE
\r
1710 ; ROUTINE TO PASS TO GCHACK TO FIX UP CHANNEL POINTER
\r
1712 CHNFIX: CAIN C,TCHAN
\r
1715 MOVE D,-2(TP) ; GET REPLACEMENT
\r
1717 MOVEM D,1(B) ; CLOBBER IT AWAY
\r
1722 MOVE C,T.SPDL+1(TB) ; POINT TO P BASE
\r
1723 HRRZ 0,S.DIR(C) ; 0/ 0 FOR READ 0/ 1 FOR PRINT
\r
1724 MOVE A,[PUSHJ P,MTYO]
\r
1725 MOVE B,T.CHAN+1(TB)
\r
1727 MOVEI A,100 ; PRIM INPUT JFN
\r
1729 MOVEI E,C.OPN+C.READ
\r
1731 MOVEM B,CHNL0+2*100+1(TVP)
\r
1733 TNXTY1: MOVEM B,CHNL0+2*101+1(TVP)
\r
1734 MOVEI A,101 ; PRIM OUTPUT JFN
\r
1735 MOVEI E,C.OPN+C.PRIN
\r
1737 TNXTY2: MOVEM A,CHANNO(B)
\r
1740 ; SETUP FUNNY BUFFER FOR TTY INPUT DEVICES
\r
1742 TTYSPC: MOVEI A,EXTBFR ; GET EXTRA BUFFER
\r
1743 PUSHJ P,IBLOCK ; GET BLOCK
\r
1744 MOVE D,T.CHAN+1(TB) ;RESTORE CHANNEL POINTER
\r
1756 MOVEM A,EXBUFR-1(D) ; FOR WAITING TTY BUFFERS
\r
1757 SETZM EXBUFR(D) ; NIL LIST
\r
1758 MOVEM B,BUFRIN(D) ;STORE IN CHANNEL
\r
1759 MOVSI A,TUVEC ;MAKE SURE TYPE IS UNIFORM VECTOR
\r
1760 MOVEM A,BUFRIN-1(D)
\r
1761 IFN ITS, MOVEI A,177 ;SET ERASER TO RUBOUT
\r
1762 IFE ITS, MOVEI A,1 ; TRY ^A FOR TENEX
\r
1764 SETZM KILLCH(B) ;NO KILL CHARACTER NEEDED
\r
1765 MOVEI A,33 ;BREAKCHR TO C.R.
\r
1767 MOVEI A,"\ ;ESCAPER TO \
\r
1769 MOVE A,[010700,,BYTPTR(E)] ;RELATIVE BYTE POINTER
\r
1771 MOVEI A,14 ;BARF BACK CHARACTER FF
\r
1776 ; SETUP DEFAULT TTY INTERRUPT HANDLER
\r
1779 PUSH TP,MQUOTE CHAR,CHAR,INTRUP
\r
1781 PUSH TP,[10] ; PRIORITY OF CHAR INT
\r
1784 MCALL 3,EVENT ; 1ST MAKE AN EVENT EXIST
\r
1788 PUSH TP,[QUITTER] ; DEFAULT HANDLER IS QUITTER
\r
1791 ; BUILD A NULL STRING
\r
1794 PUSHJ P,IBLOCK ; USE A BLOCK
\r
1795 MOVE D,T.CHAN+1(TB)
\r
1800 MOVEM A,BUFSTR-1(D)
\r
1803 MOVE B,D ; CHANNEL TO B
\r
1807 ; ROUTINE TO OPEN ITS CHANNEL WITHOUT .RCHST
\r
1809 OPEN2: MOVEI A,S.DEV(C) ; POINT TO OPEN BLOCK
\r
1810 PUSHJ P,MOPEN ; OPEN THE FILE
\r
1812 MOVE B,T.CHAN+1(TB) ; GET CHANNEL BACK
\r
1813 MOVEM A,CHANNO(B) ; SAVE THE CHANNEL
\r
1816 ; FIX UP MODE AND FALL INTO OPEN
\r
1818 OPEN0: HRRZ A,S.DIR(C) ; GET DIR
\r
1819 TRNE A,2 ; SKIP IF NOT BLOCK
\r
1820 IORI A,4 ; TURN ON IMAGE
\r
1821 IORI A,2 ; AND BLOCK
\r
1825 PUSH TP,C ; SAVE CRUFT TO CHECK FOR PRINTO, HA HA
\r
1826 MOVE B,T.CHAN+1(TB)
\r
1827 MOVE A,DIRECT-1(B)
\r
1828 MOVE B,DIRECT(B) ; THIS KLUDGE THE MESS OF NDR
\r
1831 POP P,D ; THE SIXBIT FOR KLUDGE
\r
1832 POP P,A ; GET BACK THE RANDOM BITS
\r
1834 CAME D,[SIXBIT /PRINTO/]
\r
1835 JRST OPEN9 ; WELL NOT THIS TIME
\r
1836 IORI A,100000 ; WRITEOVER BIT
\r
1840 IOR A,4 ; DON'T CHANGE REF DATE
\r
1841 OPEN9: HRLM A,S.DEV(C) ; AND STORE IT
\r
1843 ; ROUTINE TO ATTEMPT TO OPEN A REAL ITS CHANNEL
\r
1845 OPEN1: MOVEI A,S.DEV(C) ; POINT TO OPEN BLOCK
\r
1848 MOVE B,T.CHAN+1(TB) ; GET CHANNEL BACK
\r
1849 MOVEM A,CHANNO(B) ; CLOBBER INTO CHANNEL
\r
1850 MOVSI A,(A) ; SET UP READ CHAN STATUS
\r
1852 .RCHST A, ; GET THE GOODS
\r
1854 ; NOW CLOBBER THE TVP SLOT FOR THIS CHANNEL
\r
1856 OPEN3: MOVE A,S.DIR(C)
\r
1857 MOVEI 0,C.OPN+C.READ
\r
1859 MOVEI 0,C.OPN+C.PRIN
\r
1863 MOVE A,CHANNO(B) ; GET CHANNEL #
\r
1865 ADDI A,CHNL0(TVP) ; POINT TO SLOT
\r
1866 MOVEM B,1(A) ; NOT: TYPE ALREADY SETUP
\r
1868 ; NOW GET STATUS WORD
\r
1870 DOSTAT: HRLZ A,CHANNO(B) ; NOW GET STATUS WORD
\r
1872 IOR A,[.STATUS STATUS(B)] ; GET INS
\r
1877 ; HERE IF OPEN FAILS (CHANNEL IS IN A)
\r
1879 OPNLOS: JUMPL A,NOCHAN ; ALL CHANNELS ARE IN USE
\r
1880 LSH A,23. ; DO A .STATUS
\r
1882 XCT A ; STATUS TO A
\r
1883 PUSHJ P,GFALS ; GET A FALSE WITH A MESSAGE
\r
1884 SUB P,[1,,1] ; EXTRA RET ADDR FLUSHED
\r
1885 JRST OPNRET ; AND RETURN
\r
1887 ; ROUTINE TO CONS UP FALSE WITH REASON
\r
1889 GFALS: PUSH P,[SIXBIT / ERR/] ; SET UP OPEN TO ERR DEV
\r
1890 PUSH P,[3] ; SAY ITS FOR CHANNEL
\r
1892 .OPEN 0,-2(P) ; USE CHANNEL 0 FOR THIS
\r
1893 FATAL CAN'T OPEN ERROR DEVICE
\r
1894 SUB P,[3,,3] ; DONT WANT OPEN BLOCK NOW
\r
1895 MOVEI A,0 ; PREPARE TO BUILD STRING ON STACK
\r
1896 EL1: PUSH P,[0] ; WHERE IT WILL GO
\r
1897 MOVSI B,(<440700,,(P)>) ; BYTE POINTER TO TOP OF STACK
\r
1898 EL2: .IOT 0,0 ; GET A CHAR
\r
1899 JUMPL 0,EL3 ; JUMP ON -1,,3
\r
1901 JRST EL3 ; YES, MAKE STRING
\r
1902 CAIN 0,14 ; IGNORE FORM FEEDS
\r
1903 JRST EL2 ; IGNORE FF
\r
1904 CAIE 0,15 ; IGNORE CR & LF
\r
1907 IDPB 0,B ; STUFF IT
\r
1908 TLNE B,760000 ; SIP IF WORD FULL
\r
1910 AOJA A,EL1 ; COUNT WORD AND GO
\r
1912 EL3: SKIPN (P) ; ANY CHARS AT END?
\r
1913 SUB P,[1,,1] ; FLUSH XTRA
\r
1914 PUSH P,A ; PUT UP COUNT
\r
1915 .CLOSE 0, ; CLOSE THE ERR DEVICE
\r
1916 PUSHJ P,CHMAK ; MAKE STRING
\r
1918 MOVE D,B ; COPY STRING
\r
1919 PUSHJ P,INCONS ; CONS TO NIL
\r
1920 MOVSI A,TFALSE ; MAKEIT A FALSE
\r
1924 ; ROUTINE TO FILL IN THE "REAL" SLOTS FOR THE CHANNEL
\r
1926 FIXREA: HRLZS S.DEV(C) ; KILL MODE BITS
\r
1927 MOVE D,[-4,,S.DEV]
\r
1929 FIXRE1: MOVEI A,(D) ; COPY REL POINTER
\r
1930 ADD A,T.SPDL+1(TB) ; POINT TO SLOT
\r
1931 SKIPN A,(A) ; SKIP IF GOODIE THERE
\r
1933 PUSHJ P,6TOCHS ; MAKE INOT A STRING
\r
1934 MOVE C,RDTBL-S.DEV(D); GET OFFSET
\r
1935 ADD C,T.CHAN+1(TB)
\r
1938 FIXRE2: AOBJN D,FIXRE1
\r
1942 HRLZ A,CHANNO(B) ; GET CHANNEL
\r
1952 ;THIS ROUTINE CONVERTS MUDDLE CHARACTER STRINGS TO SIXBIT FILE NAMES
\r
1955 PUSH P,E ;SAVE USEFUL FROB
\r
1956 MOVEI E,(A) ; CHAR COUNT TO E
\r
1958 CAIE A,TCHSTR ; IS IT ONE WORD?
\r
1960 CHREAD: MOVEI A,0 ;INITIALIZE OUTPUT WORD
\r
1961 MOVE D,[440600,,A] ;AND BYTE POINTER TO IT
\r
1962 NEXCHR: SOJL E,SIXDON
\r
1963 ILDB 0,B ; GET NEXT CHAR
\r
1964 JUMPE 0,SIXDON ;IF NULL, WE ARE FINISHED
\r
1965 PUSHJ P,A0TO6 ; CONVERT TO SIXBIT
\r
1966 IDPB 0,D ;DEPOSIT INTO SIX BIT
\r
1967 TRNN A,77 ;IS OUTPUT FULL
\r
1968 JRST NEXCHR ; NO, GET NEXT
\r
1969 SIXDON: SUB TP,[2,,2] ;FIX UP TP
\r
1971 EXCH A,(P) ;LEAVE RESULT ON P-STACK
\r
1972 JRST (A) ;NOW RETURN
\r
1975 ;SUBROUTINE TO CONVERT SIXBIT TO ATOM
\r
1979 MOVEI B,0 ;MAX NUMBER OF CHARACTERS
\r
1980 PUSH P,[0] ;STRING WILL GO ON P SATCK
\r
1981 JUMPE A,GETATM ; EMPTY, LEAVE
\r
1982 MOVEI E,-1(P) ;WILL BE BYTE POINTER
\r
1983 HRLI E,10700 ;SET IT UP
\r
1984 PUSH P,[0] ;SECOND POSSIBLE WORD
\r
1985 MOVE D,[440600,,A] ;INPUT BYTE POINTER
\r
1986 6LOOP: ILDB 0,D ;START CHAR GOBBLING
\r
1987 ADDI 0,40 ;CHANGET TOASCII
\r
1988 IDPB 0,E ;AND STORE IT
\r
1989 TLNN D,770000 ; SKIP IF NOT DONE
\r
1991 TDNN A,MSKS(B) ; CHECK IF JUST SPACES LEFT
\r
1992 AOJA B,GETATM ; YES, DONE
\r
1993 AOJA B,6LOOP ;KEEP LOOKING
\r
1994 6LOOP1: PUSH P,[6] ;IF ARRIVE HERE, STRING IS 2 WORDS
\r
1996 GETATM: MOVEM B,(P) ;SET STRING LENGTH=1
\r
1997 PUSHJ P,CHMAK ;MAKE A MUDDLE STRING
\r
2009 ; CONVERT ONE CHAR
\r
2011 A0TO6: CAIL 0,141 ;IF IT IS GREATER OR EQUAL TO LOWER A
\r
2012 CAILE 0,172 ;BUT LESS THAN OR EQUAL TO LOWER Z
\r
2014 SUBI 0,40 ;CONVERT TO UPPER CASE
\r
2015 SUBI 0,40 ;NOW TO SIX BIT
\r
2016 JUMPL 0,BAD6 ;CHECK FOR A WINNER
\r
2021 ; SUBR TO DELETE AND RENAME FILES
\r
2023 MFUNCTION RENAME,SUBR
\r
2029 PUSH TP,P ; SAVE P-STACK BASE
\r
2030 GETYP 0,(AB) ; GET 1ST ARG TYPE
\r
2032 CAIN 0,TCHAN ; CHANNEL?
\r
2033 JRST CHNRNM ; MUST BE RENAME WHILE OPEN FOR WRITING
\r
2036 PUSH P,[100000,,0]
\r
2037 PUSH P,[377777,,377777]
\r
2039 MOVSI E,-4 ; 4 THINGS TO PUSH
\r
2040 RNMALP: MOVE B,@RNMTBL(E)
\r
2045 CAIE 0,TCHSTR ; SKIP IF WINS
\r
2048 IFN ITS, PUSHJ P,STRTO6 ; CONVERT TO SIXBIT
\r
2049 IFE ITS, PUSH P,B ; PUSH BYTE POINTER
\r
2052 RNMLP1: PUSH P,RNSTBL(E) ; USE DEFAULT
\r
2056 PUSHJ P,RGPRS ; PARSE THE ARGS
\r
2057 JRST RNM1 ; COULD BE A RENAME
\r
2059 ; HERE TO DELETE A FILE
\r
2061 DELFIL: MOVEI A,0 ; SETUP FDELE
\r
2062 EXCH A,(P) ; AND GET SNAME
\r
2063 .SUSET [.SSNAM,,A]
\r
2064 HLRZS -3(P) ; FIXUP DEVICE
\r
2065 .FDELE -3(P) ; DO IT TO IT
\r
2066 JRST FDLST ; ANALYSE ERROR
\r
2068 FDLWON: MOVSI A,TATOM
\r
2073 MOVE A,(TP) ; GET BASE OF PDL
\r
2074 MOVEI A,1(A) ; POINT TO CRAP
\r
2075 MOVE B,1(AB) ; STRING POINTER
\r
2080 JRST TDLLOS ; LOST
\r
2081 ADD AB,[2,,2] ; PAST ARG
\r
2082 JUMPL AB,RNM1 ; GO TRY FOR RENAME
\r
2083 MOVE P,(TP) ; RESTORE P STACK
\r
2084 MOVEI C,(A) ; FOR RELEASE
\r
2085 DELF ; ATTEMPT DELETE
\r
2086 JRST DELLOS ; LOSER
\r
2087 RLJFN ; MAKE SURE FLUSHED
\r
2090 FDLWON: MOVSI A,TATOM
\r
2098 DELLO1: MOVEI A,(C)
\r
2101 POP P,A ; ERR NUMBER BACK
\r
2102 TDLLOS: PUSHJ P,TGFALS ; GET FALSE WITH REASON
\r
2105 DELLOS: PUSH P,A ; SAVE ERROR
\r
2109 ;TABLE OF REANMAE DEFAULTS
\r
2111 RNMTBL: IMQUOTE DEV
\r
2116 RNSTBL: SIXBIT /DSK _MUDS_> /
\r
2119 RNMTBL: IMQUOTE DEV
\r
2124 RNSTBL: -1,,[ASCIZ /DSK/]
\r
2126 -1,,[ASCIZ /_MUDS_/]
\r
2129 ; HERE TO DO A RENAME
\r
2131 RNM1: JUMPGE AB,TMA ; IF ARGS EXHAUSTED, MUST BE TOO MUCH STRING
\r
2133 MOVE C,1(AB) ; GET ARG
\r
2134 CAIN 0,TATOM ; IS IT "TO"
\r
2136 JRST WRONGT ; NO, LOSE
\r
2137 ADD AB,[2,,2] ; BUMP PAST "TO"
\r
2140 MOVEM P,T.SPDL+1(TB) ; SAVE NEW P-BASE
\r
2142 MOVEI 0,4 ; FOUR DEFAULTS
\r
2143 PUSH P,-3(P) ; DEFAULT DEVICE IS CURRENT
\r
2146 PUSHJ P,RGPRS ; PARSE THE NEXT STRING
\r
2149 HLRZS A,-7(P) ; FIX AND GET DEV1
\r
2150 HLRZS B,-3(P) ; SAME FOR DEV2
\r
2151 CAIE A,(B) ; SAME?
\r
2154 POP P,A ; GET SNAME 2
\r
2155 CAME A,(P)-3 ; SNAME 1
\r
2157 .SUSET [.SSNAM,,A]
\r
2158 POP P,-2(P) ; MOVE NAMES DOWN
\r
2160 .FDELE -4(P) ; TRY THE RENAME
\r
2164 ; HERE FOR RENAME WHILE OPEN FOR WRITING
\r
2166 CHNRNM: ADD AB,[2,,2] ; NEXT ARG
\r
2168 MOVE B,-1(AB) ; GET CHANNEL
\r
2169 SKIPN CHANNO(B) ; SKIP IF OPEN
\r
2171 MOVE A,DIRECT-1(B) ; CHECK DIRECTION
\r
2173 PUSHJ P,STRTO6 ; TO 6 BIT
\r
2175 CAME A,[SIXBIT /PRINT/]
\r
2176 CAMN A,[SIXBIT /PRINTB/]
\r
2178 CAME A,[SIXBIT /PRINTO/]
\r
2181 ; SET UP .FDELE BLOCK
\r
2183 CHNRN1: PUSH P,[0]
\r
2185 MOVEM P,T.SPDL+1(TB)
\r
2187 PUSH P,[SIXBIT /_MUDL_/]
\r
2188 PUSH P,[SIXBIT />/]
\r
2191 PUSHJ P,RGPRS ; PARSE THESE
\r
2194 SUB P,[1,,1] ; SNAME/DEV IGNORED
\r
2195 MOVE AB,ABSAV(TB) ; GET ORIG ARG POINTER
\r
2197 MOVE A,CHANNO(B) ; ITS CHANNEL #
\r
2201 MOVEI A,-4(P) ; SET UP FOR RDCHST
\r
2204 MOVE A,-3(P) ; UPDATE CHANNEL
\r
2205 PUSHJ P,6TOCHS ; GET A STRING
\r
2207 MOVEM A,RNAME1-1(C)
\r
2212 MOVEM A,RNAME2-1(C)
\r
2220 MOVE A,(TP) ; PBASE BACK
\r
2221 PUSH A,[400000,,0]
\r
2228 MOVEI C,(A) ; FOR RELEASE ATTEMPT
\r
2234 MOVEI A,(C) ; MAKE SURR OTHER IS FLUSHED
\r
2239 ; HERE FOR LOSING .FDELE
\r
2241 FDLST: .STATUS 0,A ; GET STATUS
\r
2242 PUSHJ P,GFALS ; ANALYZE IT
\r
2245 ; SOME .FDELE ERRORS
\r
2247 DEVDIF: PUSH TP,$TATOM
\r
2248 PUSH TP,EQUOTE DEVICE-OR-SNAME-DIFFERS
\r
2251 \f; HERE TO RESET A READ CHANNEL
\r
2253 MFUNCTION FRESET,SUBR,RESET
\r
2259 MOVE B,1(AB) ;GET CHANNEL
\r
2260 SKIPN IOINS(B) ; OPEN?
\r
2261 JRST REOPE1 ; NO, IGNORE CHECKS
\r
2263 MOVE A,STATUS(B) ;GET STATUS
\r
2265 JUMPE A,REOPE1 ;IF IT CLOSED, JUST REOPEN IT, MAYBE?
\r
2266 CAILE A,2 ;SKIPS IF TTY FLAVOR
\r
2271 CAIE A,100 ; TTY-IN
\r
2272 CAIN A,101 ; TTY-OUT
\r
2276 CAME B,TTICHN+1(TVP)
\r
2277 CAMN B,TTOCHN+1(TVP)
\r
2279 REATT1: MOVEI B,DIRECT-1(B) ;POINT TO DIRECTION
\r
2280 PUSHJ P,CHRWRD ;CONVERT TO A WORD
\r
2282 CAME B,[ASCII /READ/]
\r
2284 MOVE B,1(AB) ;RESTORE CHANNEL
\r
2285 PUSHJ P,RRESET" ;DO REAL RESET
\r
2288 REOPEN: PUSH TP,(AB) ;FIRST CLOSE IT
\r
2291 MOVE B,1(AB) ;RESTORE CHANNEL
\r
2293 ; SET UP TEMPS FOR OPNCH
\r
2295 REOPE1: PUSH P,[0] ; WILL HOLD DIR CODE
\r
2298 IRP A,,[DIRECT,RNAME1,RNAME2,RDEVIC,RSNAME,ACCESS]
\r
2307 MOVE B,T.DIR+1(TB) ; GET DIRECTION
\r
2308 PUSHJ P,CHMOD ; CHECK THE MODE
\r
2309 MOVEM A,(P) ; AND STORE IT
\r
2311 ; NOW SET UP OPEN BLOCK IN SIXBIT
\r
2313 MOVSI E,-4 ; AOBN PNTR
\r
2314 FRESE2: MOVE B,T.CHAN+1(TB)
\r
2315 MOVEI A,@RDTBL(E) ; GET ITEM POINTER
\r
2316 GETYP 0,-1(A) ; GET ITS TYPE
\r
2319 MOVE B,(A) ; GET STRING
\r
2322 FRESE3: AOBJN E,FRESE2
\r
2323 HLRZS -3(P) ; FIX DEVICE SPEC
\r
2326 MOVE B,T.CHAN+1(TB)
\r
2327 MOVE A,RDEVIC-1(B)
\r
2329 PUSHJ P,STRTO6 ; RESULT ON STACK
\r
2333 PUSH P,[0] ; PUSH UP SOME DUMMIES
\r
2336 PUSHJ P,OPNCH ; ATTEMPT TO DO THEOPEN
\r
2339 JRST FINIS ; LEAVE IF FALSE OR WHATEVER
\r
2341 DRESET: MOVE A,(AB)
\r
2343 SETZM CHRPOS(B) ;INITIALIZE THESE PARAMETERS
\r
2348 TTYOPN: MOVE B,1(AB)
\r
2349 CAME B,TTOCHN+1(TVP)
\r
2350 CAMN B,TTICHN+1(TVP)
\r
2353 DOTCAL RSSIZE,[CHANNO(B),[2000,,C],[2000,,D]]
\r
2354 FATAL .CALL FAILURE
\r
2360 FRESE1: CAIE 0,TFIX
\r
2366 ; INTERFACE TO REOPEN CLOSED CHANNELS
\r
2368 OPNCHN: PUSH TP,$TCHAN
\r
2373 REATTY: PUSHJ P,TTYOP2
\r
2379 ; FUNCTION TO LIST ALL CHANNELS
\r
2381 MFUNCTION CHANLIST,SUBR
\r
2385 MOVEI A,N.CHNS-1 ;MAX # OF REAL CHANNELS
\r
2387 MOVEI B,CHNL1(TVP) ;POINT TO FIRST REAL CHANNEL
\r
2389 CHNLP: SKIPN 1(B) ;OPEN?
\r
2390 JRST NXTCHN ;NO, SKIP
\r
2391 HRRZ E,(B) ; ABOUT TO FLUSH?
\r
2392 JUMPN E,NXTCHN ; YES, FORGET IT
\r
2393 MOVE D,1(B) ; GET CHANNEL
\r
2394 HRRZ E,CHANNO-1(D) ; GET REF COUNT
\r
2397 ADDI C,1 ;COUNT WINNERS
\r
2398 SOJGE E,.-3 ; COUNT THEM
\r
2402 SKIPN B,CHNL0(TVP)+1 ;NOW HACK LIST OF PSUEDO CHANNELS
\r
2404 CHNLS: PUSH TP,(B)
\r
2410 MAKLST: ACALL C,LIST
\r
2413 \f; ROUTINE TO RESTORE A CLOSED CHANNEL TO ITS PREVIOUS STATE
\r
2416 REOPN: PUSH TP,$TCHAN
\r
2418 SKIPN CHANNO(B) ; ONLY REAL CHANNELS
\r
2422 MOVSI E,-4 ; SET UP POINTER FOR NAMES
\r
2424 GETOPB: MOVE B,(TP) ; GET CHANNEL
\r
2425 MOVEI A,@RDTBL(E) ; GET POINTER
\r
2426 MOVE B,(A) ; NOW STRING
\r
2428 PUSHJ P,STRTO6 ; LEAVES SIXBIT ON STACK
\r
2432 MOVE A,RDEVIC-1(B)
\r
2434 PUSHJ P,STRTO6 ; GET DEV NAME IN SIXBIT
\r
2436 MOVE B,(TP) ; RESTORE CHANNEL
\r
2437 MOVE A,DIRECT-1(B)
\r
2439 PUSHJ P,CHMOD ; CHECK FOR A VALID MODE
\r
2441 IFN ITS, HLRZS E,-3(P) ; GET DEVICE IN PROPER PLACE
\r
2442 IFE ITS, HLRZS E,(P)
\r
2443 MOVE B,(TP) ; RESTORE CHANNEL
\r
2444 CAIN E,(SIXBIT /DSK/)
\r
2445 JRST DISKH ; DISK WINS IMMEIDATELY
\r
2446 CAIN E,(SIXBIT /TTY/) ; NO NEED TO RE-OPEN THE TTY
\r
2449 ANDI E,777700 ; COULD BE "UTn"
\r
2450 MOVE D,CHANNO(B) ; GET CHANNEL
\r
2452 ADDI D,CHNL0(TVP) ; DON'T SEEM TO BE OPEN
\r
2455 CAIN E,(SIXBIT /UT /)
\r
2456 JRST REOPD ; CURRENTLY, CANT RESTORE UTAPE CHANNLES
\r
2457 CAIN E,(SIXBIT /AI /)
\r
2458 JRST REOPD ; CURRENTLY CANT RESTORE AI CHANNELS
\r
2459 CAIN E,(SIXBIT /ML /)
\r
2460 JRST REOPD ; CURRENTLY CANT RESTORE ML CHANNELS
\r
2461 CAIN E,(SIXBIT /DM /)
\r
2462 JRST REOPD ; CURRENTLY CANT RESTORE DM CHANNELS
\r
2464 PUSH TP,$TCHAN ; TRY TO RESET IT
\r
2470 REOPD: SUB P,[4,,4]
\r
2474 REOPD: SUB P,[1,,1]
\r
2476 REOPD0: SUB TP,[2,,2]
\r
2480 DISKH: MOVE C,(P) ; SNAME
\r
2481 .SUSET [.SSNAM,,C]
\r
2484 DISKH: MOVEM A,(P) ; SAVE MODE WORD
\r
2485 PUSHJ P,STSTK ; STRING TO STACK
\r
2486 MOVE A,(E) ; RESTORE MODE WORD
\r
2488 PUSH TP,E ; SAVE PDL BASE
\r
2489 MOVE B,-2(TP) ; CHANNEL BACK TO B
\r
2491 MOVE C,ACCESS(B) ; GET CHANNELS ACCESS
\r
2492 TRNN A,2 ; SKIP IF NOT ASCII CHANNEL
\r
2494 HRRZ D,ACCESS-1(B) ; IF PARTIAL WORD OUT
\r
2495 IMULI C,5 ; TO CHAR ACCESS
\r
2496 JUMPE D,DISKH1 ; NO SWEAT
\r
2499 DISKH1: HRRZ D,BUFSTR-1(B) ; ANY CHARS IN MUDDLE BUFFER
\r
2503 MOVEI C,BUFSTR-1(B)
\r
2504 PUSHJ P,BYTDOP ; FIND LENGTH OF WHOLE BUFFER
\r
2505 HLRZ D,(A) ; LENGTH + 2 TO D
\r
2507 IMULI D,5 ; TO CHARS
\r
2510 DISKH2: SUBI C,(D) ; UPDATE CHAR ACCESS
\r
2511 IDIVI C,5 ; BACK TO WORD ACCESS
\r
2512 IORI A,6 ; BLOCK IMAGE
\r
2515 IORI A,100000 ; WRITE OVER BIT
\r
2520 MOVE A,C ; ACCESS TO A
\r
2521 PUSHJ P,GETFLN ; CHECK LENGTH
\r
2522 CAIGE 0,(A) ; CHECK BOUNDS
\r
2523 JRST .+3 ; COMPLAIN
\r
2524 PUSHJ P,DOACCS ; AND ACESS
\r
2525 JRST REOPD1 ; SUCCESS
\r
2527 MOVE A,CHANNO(B) ; CLOSE THE G.D. CHANNEL
\r
2534 IOR A,[.ACCESS (P)]
\r
2544 MOVEM 0,BSTO(PVP) ; IN CASE OF INTERRUPT
\r
2555 GETFLN: MOVE 0,CHANNO(B) ; GET CHANNEL
\r
2556 .CALL FILBLK ; READ LNTH
\r
2563 402000,,0 ; STUFF RESULT IN 0
\r
2567 HRROI B,1(E) ; TENEX STRING POINTER
\r
2568 MOVEI A,1(P) ; A POINT TO BLOCK OF INFO
\r
2569 PUSH P,[100400,,0] ; FORCE JFN REUSE AND ONLY ACCEPT EXISTING FILE
\r
2570 PUSH P,[377777,,377777] ; NO I/O FOR CORRECTIONS ETC.
\r
2571 REPEAT 6,PUSH P,[0] ; OTHER SLOTS
\r
2572 MOVE D,-2(TP) ; CHANNEL BACK
\r
2573 PUSH P,CHANNO(D) ; AND DESIRED JFN
\r
2575 JRST RGTJL ; COMPLAIN
\r
2576 MOVE P,(TP) ; RESTORE P
\r
2577 MOVE A,(P) ; MODE WORD BACK
\r
2578 MOVE B,[440000,,200000] ; FLAG BITS
\r
2579 TRNE A,1 ; SKIP FOR INPUT
\r
2580 TRC B,300000 ; CHANGE TO WRITE
\r
2581 MOVE A,CHANNO(D) ; GET JFN
\r
2584 MOVE E,C ; LENGTH TO E
\r
2585 SIZEF ; GET CURRENT LENGTH
\r
2587 CAMGE B,E ; STILL A WINNER
\r
2589 MOVE A,-2(TP) ; CHANNEL
\r
2590 MOVE A,CHANNO(A) ; JFN
\r
2594 SUB TP,[2,,2] ; FLUSH PDL POINTER
\r
2597 ROPFLS: MOVE A,-2(TP)
\r
2599 CLOSF ; ATTEMPT TO CLOSE
\r
2600 JFCL ; IGNORE FAILURE
\r
2603 RGTJL: MOVE P,(TP)
\r
2615 PSUEDO: AOS (P) ; ASSUME SUCCESS FOR NOW
\r
2616 MOVEI B,RDEVIC-1(B) ; SEE WHAT DEVICE IS
\r
2619 CAME B,[ASCII /E&S/] ; DISPLAY ?
\r
2620 CAMN B,[ASCII /DIS/]
\r
2621 SKIPA B,(TP) ; YES, REGOBBLE CHANNEL AND CONTINUE
\r
2622 JRST REOPD0 ; NO, RETURN HAPPY
\r
2624 SOS (P) ; DISPLAY DID NOT REOPEN, UNDO ASSUMPTION OF SUCCESS
\r
2627 \f;THIS PROGRAM CLOSES THE SPECIFIED CHANNEL
\r
2629 MFUNCTION FCLOSE,SUBR,[CLOSE]
\r
2631 ENTRY 1 ;ONLY ONE ARG
\r
2632 GETYP A,(AB) ;CHECK ARGS
\r
2633 CAIE A,TCHAN ;IS IT A CHANNEL
\r
2635 MOVE B,1(AB) ;PICK UP THE CHANNEL
\r
2636 HRRZ A,CHANNO-1(B) ; GET REF COUNT
\r
2637 SOJGE A,CFIN5 ; NOT READY TO REALLY CLOSE
\r
2638 CAME B,TTICHN+1(TVP) ; CHECK FOR TTY
\r
2639 CAMN B,TTOCHN+1(TVP)
\r
2641 MOVE A,[JRST CHNCLS]
\r
2642 MOVEM A,IOINS(B) ;CLOBBER THE IO INS
\r
2643 MOVE A,RDEVIC-1(B) ;GET THE NAME OF THE DEVICE
\r
2647 MOVE B,1(AB) ; RESTORE CHANNEL
\r
2648 CAIE A,(SIXBIT /E&S/)
\r
2649 CAIN A,(SIXBIT /DIS/)
\r
2651 MOVE B,1(AB) ; IN CASE CLOBBERED BY DISCLS
\r
2652 SKIPN A,CHANNO(B) ;ANY REAL CHANNEL?
\r
2653 JRST REMOV ; NO, EITHER CLOSED OR PSEUDO CHANNEL
\r
2655 MOVE A,DIRECT-1(B) ; POINT TO DIRECTION
\r
2657 PUSHJ P,STRTO6 ; CONVERT TO WORD
\r
2659 LDB E,[140600,,(P)] ; FIRST CHAR OD DEV NAME
\r
2660 CAIE E,'T ; SKIP IF TTY
\r
2662 CAME A,[SIXBIT /READ/] ; SKIP IF WINNER
\r
2665 MOVE B,1(AB) ; IN ITS CHECK STATUS
\r
2666 LDB A,[600,,STATUS(B)]
\r
2671 PUSH TP,CHQUOTE CHAR
\r
2674 MCALL 2,OFF ; TURN OFF INTERRUPT
\r
2675 CFIN1: MOVE B,1(AB)
\r
2681 TLZ A,400000 ; FOR JFN RELEASE
\r
2682 CLOSF ; CLOSE THE FILE AND RELEASE THE JFN
\r
2687 ADDI A,CHNL0+1(TVP) ;POINT TO THIS CHANNELS LSOT
\r
2689 SETZM (A) ;AND CLOBBER IT
\r
2693 CFIN2: HLLZS -4(B)
\r
2694 MOVSI A,TCHAN ;RETURN THE CHANNEL
\r
2697 CLSTTY: PUSH TP,$TATOM
\r
2698 PUSH TP,EQUOTE ATTEMPT-TO-CLOSE-TTY-CHANNEL
\r
2702 REMOV: MOVEI D,CHNL0(TVP)+1 ;ATTEMPT TO REMOVE FROM PSUEDO CHANNEL LIST
\r
2703 REMOV0: SKIPN C,D ;FOUND ON LIST ?
\r
2704 JRST CFIN2 ;NO, JUST IGNORE THIS CLOSED CHANNEL
\r
2705 HRRZ D,(C) ;GET POINTER TO NEXT
\r
2706 CAME B,(D)+1 ;FOUND ?
\r
2708 HRRZ D,(D) ;YES, SPLICE IT OUT
\r
2713 ; CLOSE UP ANY LEFTOVER BUFFERS
\r
2715 CFIN4: CAME A,[SIXBIT /PRINTO/]
\r
2716 CAMN A,[SIXBIT /PRINTB/]
\r
2718 CAME A,[SIXBIT /PRINT/]
\r
2720 MOVE B,1(AB) ; GET CHANNEL
\r
2721 GETYP 0,BUFSTR-1(B) ; IS THERE AN OUTPUT BUFFER
\r
2726 IFE ITS, PUSH P,A ; SAVE MODE
\r
2729 POP P,A ; RESTORE MODE
\r
2733 CAME A,[SIXBIT /PRINT/]
\r
2735 MOVE A,CHANNO(B) ; GET JFN
\r
2736 TLO A,400000 ; BIT MEANS DONT RELEASE JFN
\r
2737 CLOSF ; CLOSE THE FILE
\r
2739 MOVE E,B ; SAVE CHANNEL
\r
2742 MOVSI B,7700 ; MASK
\r
2743 MOVSI C,700 ; MAKE NEW SIZE 7
\r
2747 MOVE C,ACCESS(E) ; LENGTH IN CHARS
\r
2752 CFINX1: HLLZS ACCESS-1(B)
\r
2755 CFIN5: HRRM A,CHANNO-1(B)
\r
2757 \f;SUBR TO DO .ACCESS ON A READ CHANNEL
\r
2758 ;FORM: <ACCESS CHANNEL FIX-NUMBER>
\r
2759 ;POSITIONS CHANNEL AT CHARACTER POSN FIX-NUMBER
\r
2760 ;H. BRODIE 7/26/72
\r
2762 MFUNCTION MACCESS,SUBR,[ACCESS]
\r
2763 ENTRY 2 ;ARGS: CHANNEL AND FIX-NUMBER
\r
2765 ;CHECK ARGUMENT TYPES
\r
2767 CAIE A,TCHAN ;FIRST ARG SHOULD BE CHANNEL
\r
2769 GETYP A,2(AB) ;TYPE OF SECOND
\r
2770 CAIE A,TFIX ;SHOULD BE FIX
\r
2773 ;CHECK DIRECTION OF CHANNEL
\r
2774 MOVE B,1(AB) ;B GETS PNTR TO CHANNEL
\r
2775 MOVEI B,DIRECT-1(B) ;GET DIRECTION OF CHANNEL
\r
2776 PUSHJ P,CHRWRD ;GRAB THE CHAR STRNG
\r
2778 CAME B,[<ASCII /PRINT/>+1]
\r
2780 PUSH P,[2] ;ACCESS ON PRINTB CHANNEL
\r
2782 SKIPE BUFSTR(B) ;SEE IF WE MUST FLUSH PART BUFFER
\r
2785 MACCA: PUSH P,[0] ; READ RATHER THAN READB INDICATOR
\r
2786 CAMN B,[ASCIZ /READ/]
\r
2788 CAME B,[ASCIZ /READB/] ; READB CHANNEL?
\r
2790 AOS (P) ; SET INDICATOR FOR BINARY MODE
\r
2792 ;CHECK THAT THE CHANNEL IS OPEN
\r
2793 MACC: MOVE B,1(AB) ;GET BACK PTR TO CHANNEL
\r
2794 SKIPN CHANNO(B) ;CLOSED CHANNELS HAVE CHANNO ZEROED OUT
\r
2795 JRST CHNCLS ;IF CHNL CLOSED => ERROR
\r
2797 ;COMPUTE ACCESS PNTR TO ACCESS WORD CHAR IS IN
\r
2798 ;REMAINDER IS NUMBER OF TIMES TO INCR BYTE POINTER
\r
2799 ADEVOK: SKIPGE C,3(AB) ;GET CHAR POSN...ALL NEGS = -5
\r
2801 ;BUT .ACCESS -1 ISN'T IMPLEMENTED ON ITS YET, SO TELL HIM
\r
2804 PUSH TP,EQUOTE NEGATIVE-ACCESS-NOT-ON-ITS
\r
2809 ;SETUP THE .ACCESS
\r
2810 MOVE B,1(AB) ;GET BACK PTR TO CHANNEL
\r
2811 MOVE A,CHANNO(B) ;A GETS REAL CHANNEL NUMBER
\r
2813 ROT A,23. ;SET UP IN AC FIELD
\r
2814 IOR A,[.ACCESS 0,C] ;C CONTAINS PLACE TO ACCESS TO
\r
2821 SFPTR ; DO IT IN TENEX
\r
2823 MOVE B,1(AB) ; RESTORE CHANNEL
\r
2825 POP P,E ; CHECK FOR READB MODE
\r
2827 JRST DONADV ; PRINTB CHANNEL
\r
2828 SKIPE BUFSTR(B) ; IS THERE A READ BUFFER TO FLUSH
\r
2830 SETZM LSTCH(B) ; CLEAR OUT POSSIBLE EOF INDICATOR
\r
2833 ;NOW FORCE GETCHR TO DO A .IOT FIRST THING
\r
2834 MOVEI C,BUFSTR-1(B) ; FIND END OF STRING
\r
2836 SUBI A,2 ; LAST REAL WORD
\r
2839 HLLZS BUFSTR-1(B) ; CLOBBER CHAR COUNT
\r
2841 SETZM LSTCH(B) ;CLOBBER READ'S HIDDEN CHARACTER
\r
2843 ;NOW DO THE APPROPRIATE NUM OF BYTE ADVANCEMENTS
\r
2845 ADVPTR: PUSHJ P,GETCHR
\r
2846 MOVE B,1(AB) ;RESTORE IN CASE CLOBBERED
\r
2849 DONADV: MOVE C,3(AB) ;FIXUP ACCESS SLOT IN CHNL
\r
2851 MOVE A,$TCHAN ;TYPE OF RESULT = "CHANNEL"
\r
2852 JRST FINIS ;DONE...B CONTAINS CHANNEL
\r
2855 ACCFAI: PUSH TP,$TATOM
\r
2856 PUSH TP,EQUOTE ACCESS-FAILURE
\r
2861 ;WRONG TYPE OF DEVICE ERROR
\r
2862 WRDEV: PUSH TP,$TATOM
\r
2863 PUSH TP,EQUOTE NON-DSK-DEVICE
\r
2866 ; BINARY READ AND PRINT ROUTINES
\r
2868 MFUNCTION PRINTB,SUBR
\r
2872 PBFL: PUSH P,. ; PUSH NON-ZERONESS
\r
2875 MFUNCTION READB,SUBR
\r
2885 BINI1: GETYP 0,(AB) ; SHOULD BE UVEC OR STORE
\r
2889 JRST WTYP1 ; ELSE LOSE
\r
2890 BINI2: MOVE B,1(AB) ; GET IT
\r
2892 SUBI B,(C) ; POINT TO DOPE
\r
2894 PUSHJ P,SAT" ; GET ITS ST.ALOC.TYPE
\r
2898 CAIE 0,TCHAN ; BETTER BE A CHANNEL
\r
2900 MOVE B,3(AB) ; GET IT
\r
2901 MOVEI B,DIRECT-1(B) ; GET DIRECTION OF
\r
2902 PUSHJ P,CHRWRD ; INTO 1 WORD
\r
2905 CAMN B,[ASCII /READB/]
\r
2907 CAMN B,[<ASCII /PRINT/>+1]
\r
2909 JUMPL E,WRONGD ; LOSER
\r
2910 CAME E,(P) ; CHECK WINNGE
\r
2912 MOVE B,3(AB) ; GET CHANNEL BACK
\r
2913 SKIPN A,IOINS(B) ; OPEN?
\r
2914 PUSHJ P,OPENIT ; LOSE
\r
2915 CAMN A,[JRST CHNCLS]
\r
2916 JRST CHNCLS ; LOSE, CLOSED
\r
2917 JUMPN E,BUFOU1 ; JUMP FOR OUTPUT
\r
2918 CAML AB,[-5,,] ; SKIP IF EOF GIVEN
\r
2921 MOVEM 0,EOFCND-1(B)
\r
2924 BINI5: SKIPE LSTCH(B) ; INDICATES IF EOF HIT
\r
2926 MOVE A,1(AB) ; GET VECTOR
\r
2927 PUSHJ P,PGBIOI ; READ IT
\r
2928 HLRE C,A ; GET COUNT DONE
\r
2929 HLRE D,1(AB) ; AND FULL COUNT
\r
2930 SUB C,D ; C=> TOTAL READ
\r
2932 JUMPGE A,BINIOK ; NOT EOF YET
\r
2935 MOVSI A,TFIX ; RETURN AMOUNT ACTUALLY READ
\r
2938 BUFOU1: SKIPE BUFSTR(B) ; ANY BUFFERS AROUND?
\r
2939 PUSHJ P,BFCLS1 ; GET RID OF SAME
\r
2945 MOVE A,(AB) ; RET VECTOR ETC.
\r
2950 BINEOF: PUSH TP,EOFCND-1(B)
\r
2954 MCALL 1,FCLOSE ; CLOSE THE LOSER
\r
2959 PUSHJ P,OPNCHN ;TRY TO OPEN THE LOSER
\r
2960 JUMPE B,CHNCLS ;FAIL
\r
2963 \f; THESE SUBROUTINES BY NDR 9/16/73 TO FACILITATE THE
\r
2964 ; TYPES OF IO NECESSARY TO MAKE MORE EFFICIENT USE OF
\r
2965 ; THE NETWORK AND DO RELATED FILE TRANSFER TYPE OF JOBS.
\r
2967 R1CHAR: SKIPN A,LSTCH(B) ; CHAR READING ROUTINE FOR FCOPY
\r
2970 JUMPL A,.+2 ; IN CASE OF -1 ON STY
\r
2971 TRZN A,400000 ; EXCL HACKER
\r
2973 MOVEM A,LSTCH(B) ; SAVE DE-EXCLED CHAR
\r
2978 HRRZ C,DIRECT-1(B)
\r
2979 CAIE C,5 ; IF DIRECTION IS 5 LONG THEN READB
\r
2983 AOS ACCESS(B) ; EVERY FIFTY INCREMENT
\r
2987 R1CH1: AOS ACCESS(B)
\r
2991 W1CHAR: CAIE A,15 ; CHAR WRITING ROUTINE, TEST FOR CR
\r
2995 CAIE A,12 ; TEST FOR LF
\r
2996 AOS CHRPOS(B) ; IF NOT LF AOS CHARACTE5R POSITION
\r
2997 CAIE A,14 ; TEST FOR FORM FEED
\r
2999 SETZM CHRPOS(B) ; IF FORM FEED ZERO CHARACTER POSITION
\r
3000 SETZM LINPOS(B) ; AND LINE POSITION
\r
3001 CAIE A,11 ; IS THIS A TAB?
\r
3006 IMULI C,8. ; FIX UP CHAR POS FOR TAB
\r
3007 MOVEM C,CHRPOS(B) ; AND SAVE
\r
3009 HRRZ C,DIRECT-1(B)
\r
3010 CAIE C,6 ; SIX LONG MUST BE PRINTB
\r
3018 W1CH1: AOS ACCESS(B)
\r
3023 R1C: SUBM M,(P) ;LITTLE ENTRY FOR COMPILED STUFF
\r
3024 PUSH TP,$TCHAN ;SAVE THE CHANNEL TO BLESS IT
\r
3026 MOVEI B,DIRECT-1(B)
\r
3029 CAME B,[ASCIZ /READ/]
\r
3030 CAMN B,[ASCII /READB/]
\r
3035 SKIPN IOINS(B) ; IS THE CHANNEL OPEN
\r
3036 PUSHJ P,OPENIT ; NO, GO DO IT
\r
3037 PUSHJ P,GRB ; MAKE SURE WE HAVE A READ BUFFER
\r
3038 PUSHJ P,R1CHAR ; AND GET HIM A CHARACTER
\r
3039 JRST MPOPJ ; THATS ALL FOLKS
\r
3045 W1CI: PUSH TP,$TCHAN
\r
3047 PUSH P,A ; ASSEMBLER ENTRY TO OUTPUT 1 CHAR
\r
3048 MOVEI B,DIRECT-1(B)
\r
3049 PUSHJ P,CHRWRD ; INTERNAL CALL TO W1CHAR
\r
3051 CAME B,[ASCII /PRINT/]
\r
3052 CAMN B,[<ASCII /PRINT/>+1]
\r
3057 SKIPN IOINS(B) ; MAKE SURE THAT IT IS OPEN
\r
3060 POP P,A ; GET THE CHAR TO DO
\r
3063 ; ROUTINES TO REPLACE XCT IOINS(B) FOR INPUT AND OUTPUT
\r
3064 ; THEY DO THE XCT THEN CHECK OUT POSSIBLE SCRIPTAGE--BLECH.
\r
3067 WXCT: PUSH P,A ; SAVE THE CHAR TO WRITE
\r
3068 PUSH TP,$TCHAN ; AND SAVE THE CHANNEL TOO
\r
3070 XCT IOINS(B) ; DO THE REAL ONE
\r
3071 JRST DOSCPT ; AND CHECK OUT SCRIPTAGE
\r
3073 RXCT: PUSH TP,$TCHAN
\r
3074 PUSH TP,B ; DO IT FOR READS, SAVE THE CHAN
\r
3075 XCT IOINS(B) ; READ IT
\r
3076 PUSH P,A ; AND SAVE THE CHAR AROUND
\r
3077 JRST DOSCPT ; AND CHECK OUT SCRIPTAGE
\r
3079 DOSCPT: MOVE B,(TP) ;CHECK FOR SCRIPTAGE
\r
3080 SKIPN SCRPTO(B) ; IF ZERO FORGET IT
\r
3081 JRST SCPTDN ; THATS ALL THERE IS TO IT
\r
3082 PUSH P,C ; SAVE AN ACCUMULATOR FOR CLEANLINESS
\r
3083 GETYP C,SCRPTO-1(B) ; IS IT A LIST
\r
3087 PUSH TP,[0] ; SAVE A SLOT FOR THE LIST
\r
3088 MOVE C,SCRPTO(B) ; GET THE LIST OF SCRIPT CHANNELS
\r
3089 SCPT1: GETYP B,(C) ; GET THE TYPE OF THIS SCRIPT CHAN
\r
3091 JRST BADCHN ; IF IT ISN'T A CHANNEL, COMPLAIN
\r
3092 HRRZ B,(C) ; GET THE REST OF THE LIST IN B
\r
3093 MOVEM B,(TP) ; AND STORE ON STACK
\r
3094 MOVE B,1(C) ; GET THE CHANNEL IN B
\r
3095 MOVE A,-1(P) ; AND THE CHARACTER IN A
\r
3096 PUSHJ P,W1CI ; GO TO INTERNAL W1C, IT BLESSES GOODIES
\r
3097 SKIPE C,(TP) ; GET THE REST OF LIST OF CHANS
\r
3098 JRST SCPT1 ; AND CYCLE THROUGH
\r
3099 SUB TP,[2,,2] ; CLEAN OFF THE LIST OF CHANS
\r
3100 POP P,C ; AND RESTORE ACCUMULATOR C
\r
3101 SCPTDN: POP P,A ; RESTORE THE CHARACTER
\r
3102 POP TP,B ; AND THE ORIGINAL CHANNEL
\r
3104 POPJ P, ; AND THATS ALL
\r
3107 ; SUBROUTINE TO COPY FROM INCHAN TO OUTCHAN UNTIL EOF HIT
\r
3108 ; ON THE INPUT CHANNEL
\r
3109 ; CALL IS <FILECOPY IN OUT> WHERE DEFAULTS ARE INCHAN AND OUTCHAN
\r
3111 MFUNCTION FCOPY,SUBR,[FILECOPY]
\r
3116 JRST WNA ; TAKES FROM 0 TO 2 ARGS
\r
3118 JUMPE 0,.+4 ; NO FIRST ARG?
\r
3120 PUSH TP,1(AB) ; SAVE IN CHAN
\r
3123 MOVE B,IMQUOTE INCHAN
\r
3127 HLRE 0,AB ; CHECK FOR SECOND ARG
\r
3128 CAML 0,[-2] ; WAS THERE MORE THAN ONE ARG?
\r
3130 PUSH TP,2(AB) ; SAVE SECOND ARG
\r
3133 MOVE A,$TATOM ; LOOK UP OUTCHAN AS DEFAULT
\r
3134 MOVE B,IMQUOTE OUTCHAN
\r
3137 PUSH TP,B ; AND SAVE IT
\r
3140 MOVE B,-2(TP) ; INPUT CHANNEL
\r
3141 MOVEI 0,0 ; INDICATE INPUT
\r
3142 PUSHJ P,CHKCHN ; CHECK FOR GOOD CHANNEL
\r
3144 MOVE B,(TP) ; GET OUT CHAN
\r
3145 MOVEI 0,1 ; INDICATE OUT CHAN
\r
3146 PUSHJ P,CHKCHN ; CHECK FOR GOOD OUT CHAN
\r
3148 PUSH P,[0] ; COUNT OF CHARS OUTPUT
\r
3151 PUSHJ P,GRB ; MAKE SURE WE HAVE READ BUFF
\r
3153 PUSHJ P,GWB ; MAKE SURE WE HAVE WRITE BUFF
\r
3155 FCLOOP: MOVE B,-2(TP)
\r
3156 PUSHJ P,R1CHAR ; GET A CHAR
\r
3157 JUMPL A,FCDON ; IF A NEG NUMBER WE GOT EOF
\r
3158 MOVE B,(TP) ; GET OUT CHAN
\r
3159 PUSHJ P,W1CHAR ; SPIT IT OUT
\r
3160 AOS (P) ; INCREMENT COUNT
\r
3163 FCDON: SUB TP,[2,,2] ; POP OFF OUTCHAN
\r
3164 MCALL 1,FCLOSE ; CLOSE INCHAN
\r
3166 POP P,B ; GET CHAR COUNT TO RETURN
\r
3169 CHKCHN: PUSH P,0 ; CHECK FOR GOOD TASTING CHANNEL
\r
3174 JRST CHKBDC ; GO COMPLAIN IN RIGHT WAY
\r
3175 MOVEI B,DIRECT-1(B)
\r
3178 MOVE C,(P) ; GET CHAN DIRECT
\r
3181 ADDI C,2 ; TEST FOR READB OR PRINTB ALSO
\r
3182 CAME B,CHKT(C) ; TEST FOR CORRECT DIRECT
\r
3185 SKIPN IOINS(B) ; MAKE SURE IT IS OPEN
\r
3186 PUSHJ P,OPENIT ; IF ZERO IOINS GO OPEN IT
\r
3188 POP P, ; CLEAN UP STACKS
\r
3191 CHKT: ASCIZ /READ/
\r
3200 CAMLE 0,D ; SEE IF THIS WAS HIS ARG OF DEFAULT
\r
3205 \f; FUNCTIONS READSTRING AND PRINTSTRING WORK LIKE READB AND PRINTB,
\r
3206 ; THAT IS THEY READ INTO AND OUT OF STRINGS. IN ADDITION BOTH ACCEPT
\r
3207 ; AN ADDITIONAL ARGUMENT WHICH IS THE NUMBER OF CHARS TO READ OR PRINT, IF
\r
3208 ; IT IS DESIRED FOR THIS TO BE DIFFERENT THAN THE LENGTH OF THE STRING.
\r
3210 ; FORMAT IS <READSTRING .STRING .INCHANNEL .EOFCOND .MAXCHARS>
\r
3211 ; AND BOTH SUBRS RETURN THE NUMBER OF CHARS READ OR WRITTEN
\r
3213 ; FORMAT FOR PRINTSTRING IS <PRINTSTRING .STRING .OUTCHANNEL .MAXCHARS>
\r
3215 ; THESE WERE CODED 9/16/73 BY NEAL D. RYAN
\r
3217 MFUNCTION RSTRNG,SUBR,READSTRING
\r
3220 PUSH P,[0] ; FLAG TO INDICATE READING
\r
3224 JRST WNA ; CHECK THAT IT HAS FROM 1 TO 4 ARGS
\r
3227 MFUNCTION PSTRNG,SUBR,PRINTSTRING
\r
3230 PUSH P,[1] ; FLAG TO INDICATE WRITING
\r
3234 JRST WNA ; CHECK THAT IT HAS FROM 1 TO 3 ARGS
\r
3236 STRIO1: PUSH TP,[0] ; SAVE SLOT ON STACK
\r
3239 CAIE 0,TCHSTR ; MAKE SURE WE GOT STRING
\r
3241 HRRZ 0,(AB) ; CHECK FOR EMPTY STRING
\r
3245 CAML 0,[-2] ; WAS A CHANNEL GIVEN
\r
3249 JRST WTYP2 ; SECOND ARG NOT CHANNEL
\r
3251 MOVEI B,DIRECT-1(B)
\r
3254 MOVNI E,1 ; CHECKING FOR GOOD DIRECTION
\r
3255 CAMN B,[ASCII /READ/]
\r
3257 CAMN B,[ASCII /PRINT/]
\r
3259 CAMN B,[<ASCII /PRINT/>+1]
\r
3261 CAMN B,[ASCII /READB/]
\r
3264 JRST WRONGD ; MAKE SURE CHANNEL IS OPEN IN RIGHT MODE
\r
3266 PUSH TP,3(AB) ; PUSH ON CHANNEL
\r
3268 STRIO2: MOVE B,IMQUOTE INCHAN
\r
3271 MOVE B,IMQUOTE OUTCHAN
\r
3273 TLZ A,TYPMSK#777777
\r
3275 JRST BADCHN ; MAKE SURE WE GOT A GOOD DEFAULT CHANNEL
\r
3278 STRIO3: MOVE B,(TP) ; GET CHANNEL
\r
3279 SKIPN E,IOINS(B) ; MAKE SURE HE IS OPEN
\r
3280 PUSHJ P,OPENIT ; IF NOT GO OPEN
\r
3281 CAMN E,[JRST CHNCLS]
\r
3282 JRST CHNCLS ; CHECK TO SEE THAT CHANNEL ISNT ALREADY CLOSED
\r
3285 JRST STRIO5 ; NO COUNT TO WORRY ABOUT
\r
3290 CAIN 0,TFIX ; BETTER BE A FIXED NUMBER
\r
3293 HRRZ D,(AB) ; GET ACTUAL STRING LENGTH
\r
3296 SKIPE (P) ; TEST FOR WRITING
\r
3297 JRST .-7 ; IF WRITING WE GOT TROUBLE
\r
3298 PUSH P,D ; ACTUAL STRING LENGTH
\r
3299 MOVEM E,(TB) ; STUFF HIS FUNNY DELIM STRING
\r
3302 CAML D,C ; MAKE SURE THE STRING IS LONG ENOUGH
\r
3304 PUSH TP,$TATOM ; LOSAGE, COUNT TOO GREAT
\r
3305 PUSH TP,EQUOTE COUNT-GREATER-THAN-STRING-SIZE
\r
3307 PUSH P,C ; PUSH ON MAX COUNT
\r
3310 STRIO6: HRRZ C,(AB) ; GET CHAR COUNT
\r
3311 PUSH P,C ; AND PUSH IT ON STACK AS NO MAX COUNT GIVEN
\r
3315 MOVE B,(TP) ; GET THE CHANNEL
\r
3317 MOVEM 0,EOFCND-1(B) ; STUFF IN SLOT IN CHAN
\r
3320 PUSH TP,(AB) ; PUSH ON STRING
\r
3322 PUSH P,[0] ; PUSH ON CURRENT COUNT OF CHARS DONE
\r
3323 MOVE 0,-2(P) ; GET READ OR WRITE FLAG
\r
3324 JUMPN 0,OUTLOP ; GO WRITE STUFF
\r
3326 MOVE B,-2(TP) ; GET CHANNEL
\r
3327 PUSHJ P,GRB ; MAKE SURE WE HAVE BUFF
\r
3328 SKIPGE A,LSTCH(B) ; CHECK FOR EOF ALREADY READ PREVIOUSLY
\r
3329 JRST SRDOEF ; GO DOES HIS EOF HACKING
\r
3331 MOVE B,-2(TP) ; GET CHANNEL
\r
3332 MOVE C,-1(P) ; MAX COUNT
\r
3333 CAMG C,(P) ; COMPARE WITH COUNT DONE
\r
3334 JRST STREOF ; WE HAVE FINISHED
\r
3335 PUSHJ P,R1CHAR ; GET A CHAR
\r
3336 JUMPL A,INEOF ; EOF HIT
\r
3338 HRRZ E,(TB) ; DO WE HAVE A STRING TO WORRY US?
\r
3339 SOJL E,INLNT ; GO FINISH STUFFING
\r
3344 INLNT: IDPB A,(TP) ; STUFF IN STRING
\r
3345 SOS -1(TP) ; DECREMENT STRING COUNT
\r
3346 AOS (P) ; INCREMENT CHAR COUNT
\r
3349 INEOF: SKIPE C,LSTCH(B) ; IS THIS AN ! AND IS THERE A CHAR THERE
\r
3351 MOVEM A,LSTCH(B) ; NO SAVE THE CHAR
\r
3355 HRRZ C,DIRECT-1(B) ; GET THE TYPE OF CHAN
\r
3356 CAIN C,5 ; IS IT READB?
\r
3358 SOS ACCESS(B) ; FIX UP ACCESS FOR READ CHANNEL
\r
3359 JRST STREOF ; AND THATS IT
\r
3360 HRRZ C,ACCESS-1(B) ; FOR A READB ITS WORSE
\r
3363 HRRM D,ACCESS-1(B) ; CHANGE A 0 TO A FIVE
\r
3366 SOS ACCESS(B) ; AND SOS THE WORD COUNT MAYBE
\r
3369 SRDOEF: SETZM LSTCH(B) ; IN CASE OF -1, FLUSH IT
\r
3370 AOJE A,INLOP ; SKIP OVER -1 ON PTY'S
\r
3372 SUB P,[3,,3] ; POP JUNK OFF STACKS
\r
3373 PUSH TP,EOFCND-1(B)
\r
3374 PUSH TP,EOFCND(B) ; WHAT WE NEED TO EVAL
\r
3377 MCALL 1,FCLOSE ; CLOSE THE LOOSING CHANNEL
\r
3378 MCALL 1,EVAL ; EVAL HIS EOF JUNK
\r
3381 OUTLOP: MOVE B,-2(TP)
\r
3382 PUSHJ P,GWB ; MAKE SURE WE HAVE BUFF
\r
3385 MOVE C,-1(P) ; MAX COUNT TO DO
\r
3386 CAMG C,(P) ; HAVE WE DONE ENOUGH
\r
3388 ILDB A,(TP) ; GET THE CHAR
\r
3389 SOS -1(TP) ; SUBTRACT FROM STRING LENGTH
\r
3390 AOS (P) ; INC COUNT OF CHARS DONE
\r
3391 PUSHJ P,W1CHAR ; GO STUFF CHAR
\r
3394 STREOF: MOVE A,$TFIX
\r
3395 POP P,B ; RETURN THE LOOSER A COUNT OF WHAT WAS DONE
\r
3401 GWB: SKIPE BUFSTR(B)
\r
3404 PUSH TP,B ; GET US A WRITE BUFFER ON PRINTB CHAN
\r
3407 MOVSI A,TWORD+.VECT.
\r
3419 MOVE C,[TCHSTR,,BUFLNT*5]
\r
3420 MOVEM C,BUFSTR-1(B)
\r
3425 GRB: SKIPE BUFSTR(B)
\r
3428 PUSH TP,B ; GET US A READ BUFFER
\r
3438 MOVEM C,BUFSTR-1(B)
\r
3442 MTSTRN: PUSH TP,$TATOM
\r
3443 PUSH TP,EQUOTE EMPTY-STRING
\r
3446 \f; INPUT UNBUFFERING ROUTINE. THIS DOES THE CHARACTER UNBUFFERING
\r
3447 ; FOR INPUT. THE OPEN ROUTINE SETUPS A PUSHJ P, TO
\r
3448 ; THIS ROUTINE AS THE IOINS FOR A CHANNEL OPEN TO A NON-TTY DEVICE.
\r
3450 ; H. BRODIE 7/19/72
\r
3454 ; B/ AOBJN PNTR TO CHANNEL VECTOR
\r
3455 ; RETURNS NEXT CHARACTER IN AC A.
\r
3456 ; ON ENCOUNTERING EITHER ^C OR NUL(^@) IT ASSUMES EOF AND
\r
3457 ; TRANSMITS ONLY ^C ON SUCCESSIVE CALLS
\r
3461 ; FIRST GRAB THE BUFFER
\r
3462 GETYP A,BUFSTR-1(B) ; GET TYPE WORD
\r
3463 CAIN A,TCHSTR ; SKIPS IF NOT CHSTR (I.E. IF BAD BUFFER)
\r
3464 JRST GTGBUF ; IS GOOD BUFFER...SKIP ERROR RETURN
\r
3465 BDCHAN: PUSH TP,$TATOM ; ERROR RETURN
\r
3466 PUSH TP,EQUOTE BAD-INPUT-BUFFER
\r
3470 GTGBUF: HRRZ A,BUFSTR-1(B) ; GET LENGTH OF STRING
\r
3471 SOJGE A,GTGCHR ; JUMP IF STILL MORE
\r
3473 ; HERE IF THE BUFFER WAS EXHAUSTED (BYTE PNTR POINTS INTO DOPE WDS)
\r
3474 ; GENERATE AN .IOT POINTER
\r
3475 ;FIRST SAVE C AND D AS I WILL CLOBBER THEM
\r
3479 LDB C,[600,,STATUS(B)] ; GET TYPE
\r
3480 CAIG C,2 ; SKIP IF NOT TTY
\r
3485 JRST GETTTY ; GET A TTY BUFFER
\r
3487 PUSHJ P,PGBUFI ; RE-FILL BUFFER
\r
3489 JUMPGE A,BUFGOO ;SKIPS IF IOT COMPLETED...FIX UP CHANNEL
\r
3490 MOVEI C,1 ; MAKE SURE LAST EOF REALLY ENDS IT
\r
3492 MOVSI C,014000 ; GET A ^C
\r
3493 MOVEM C,(A) ;FAKE AN EOF
\r
3495 ; RESET THE BYTE POINTER IN THE CHANNEL.
\r
3496 ; BUILD ONE USING THE PTR TO BEG OF BUFFER SAVED IN D
\r
3497 BUFGOO: HRLI D,440700 ; GENERATE VIRGIN LH
\r
3499 MOVEM D,BUFSTR(B) ; STASH IN THE BUFFER BYTE PNTR SLOT
\r
3500 MOVEI A,BUFLNT*5-1
\r
3501 BUFROK: POP P,D ;RESTORE D
\r
3502 POP P,C ;RESTORE C
\r
3505 ; HERE IF THERE ARE CHARS IN BUFFER
\r
3506 GTGCHR: HRRM A,BUFSTR-1(B)
\r
3507 ILDB A,BUFSTR(B) ; GET A CHAR FROM BUFFER
\r
3509 CAIN A,32 ; TENEX EOF?
\r
3513 POPJ P, ; AND RETURN
\r
3515 LDB A,[600,,STATUS(B)] ; CHECK FOR TTY
\r
3516 CAILE A,2 ; SKIP IF TTY
\r
3518 IFE ITS, SKIPN BUFRIN(B)
\r
3524 HRRZ A,@BUFSTR(B) ; SEE IF RSUBR START BIT IS ON
\r
3534 PGBUFO: SKIPA D,[SOUT]
\r
3535 PGBUFI: MOVE D,[SIN]
\r
3537 SKIPGE A,BUFSTR(B) ; POINT TO CURRENT BUFFER POSIT
\r
3538 SUBI A,1 ; FOR 440700 AND 010700 START
\r
3539 SUBI A,BUFLNT-1 ; CALCULATE PNTR TO BEG OF BUFFER
\r
3540 HRLI A,-BUFLNT ; IOT (AOBJN) PNTR IN A
\r
3543 PGBIOI: MOVE D,A ; COPY FOR LATER
\r
3544 MOVSI C,TUVEC ; PREPARE TO HANDDLE INTS
\r
3550 ; BUILD .IOT INSTR
\r
3551 MOVE C,CHANNO(B) ; CHANNEL NUMBER IN C
\r
3552 ROT C,23. ; MOVE INTO AC FIELD
\r
3553 IOR C,[.IOT 0,A] ; IOR IN SKELETON .IOT
\r
3556 ENABLE ; ALLOW INTS
\r
3557 XCT C ; EXECUTE THE .IOT INSTR
\r
3569 MOVEI C,(A) ; POINT TO BUFFER
\r
3571 MOVE D,A ; XTRA POINTER
\r
3572 MOVE A,CHANNO(B) ; FILE JFN
\r
3574 HLRE C,D ; - COUNT TO C
\r
3575 XCT (P) ; DO IT TO IT
\r
3580 JUMPGE C,CPOPJ ; NO EOF YET
\r
3581 HRLI A,(C) ; LOOK LIKE AN AOBJN PNTR
\r
3584 PGBIOO: SKIPA D,[SOUT]
\r
3585 PGBIOI: MOVE D,[SIN]
\r
3599 ; OUTPUT BUFFERING ROUTINES SIMILAR TO INPUT BUFFERING ROUTINES OF PREV PAGE
\r
3602 GETYP A,BUFSTR-1(B) ; CHECK TYPE OF ARG
\r
3603 CAIE A,TCHSTR ; MUST BE STRING
\r
3606 HRRZ A,BUFSTR-1(B) ; GET CHAR COUNT
\r
3607 JUMPE A,REBUFF ; PREV RESET BUFF, UNDO SAME
\r
3609 PUTCH1: POP P,A ; RESTORE CHAR
\r
3610 CAMN A,[-1] ; SPECIAL HACK?
\r
3611 JRST PUTCH2 ; YES GO HANDLE
\r
3612 IDPB A,BUFSTR(B) ; STUFF IT
\r
3613 PUTCH3: SOS A,BUFSTR-1(B) ; COUNT DOWN STRING
\r
3614 TRNE A,-1 ; SKIP IF FULL
\r
3617 ; HERE TO FLUSH OUT A BUFFER
\r
3621 PUSHJ P,PGBUFO ; SETUP AND DO IOT
\r
3622 HRLI D,440700 ; POINT INTO BUFFER
\r
3623 MOVEM D,BUFSTR(B) ; STORE IT
\r
3624 MOVEI A,BUFLNT*5 ; RESET COUNT
\r
3625 HRRM A,BUFSTR-1(B)
\r
3630 ;HERE TO DA ^C AND TURN ON MAGIC BIT
\r
3633 IDPB A,BUFSTR(B) ; ZAP OUT THE ^C
\r
3634 MOVEI A,1 ; GET BIT
\r
3635 IORM A,@BUFSTR(B) ; ON GOES THE BIT
\r
3638 ; RESET A FUNNY BUF
\r
3640 REBUFF: MOVEI A,BUFLNT*5 ; 1ST COUNT
\r
3641 HRRM A,BUFSTR-1(B)
\r
3642 HRRZ A,BUFSTR(B) ; NOW POINTER
\r
3645 MOVEM A,BUFSTR(B) ; STORE BACK
\r
3649 ; HERE TO FLUSH FINAL BUFFER
\r
3651 BFCLOS: HLLZS ACCESS-1(B) ; CLEAR OUT KLUDGE PRINTB PART ACCESS COUNT
\r
3652 MOVE C,B ; THIS BUFFER FLUSHER THE WORK OF NDR
\r
3653 MOVEI B,RDEVIC-1(B) ; FIND OUT IF THIS IS NET
\r
3656 TRZ B,77777 ; LEAVE ONLY HIGH 3 CHARS
\r
3657 MOVEI A,0 ; FLAG 0=NET 1=DSK
\r
3658 CAME B,[ASCIZ /NET/] ; IS THIS NET?
\r
3660 PUSH P,A ; SAVE THE RESULT OF OUR TEST
\r
3661 MOVE B,C ; RESTORE CHANNEL IN B
\r
3662 JUMPN A,BFCLNN ; DONT HAVE TO CHECK NET STATE
\r
3664 PUSH TP,B ; SAVE CHANNEL
\r
3665 PUSHJ P,INSTAT ; GET CURRENT NETWORK STATE
\r
3666 MOVE A,(B) ; GET FIRST ELEMENT OF STATE UVECTOR WHICH IS CUR STATE
\r
3667 POP TP,B ; RESTORE B
\r
3669 CAIE A,5 ; IS NET IN OPEN STATE?
\r
3670 CAIN A,6 ; OR ELSE IS IT IN RFNM WAIT STATE
\r
3671 JRST BFCLNN ; IF SO TO THE IOT
\r
3672 POP P, ; ELSE FLUSH CRUFT AND DONT IOT
\r
3673 POPJ P, ; RETURN DOING NO IOT
\r
3674 BFCLNN: MOVEI C,BUFLNT*5 ; NEW BUFFER FLUSHER BY NDR
\r
3675 HRRZ D,BUFSTR-1(B) ; SO THAT NET ALSO WORKS RIGHT
\r
3676 SUBI C,(D) ; GET NUMBER OF CHARS
\r
3677 IDIVI C,5 ; NUMBER OF FULL WORDS AND REST
\r
3678 PUSH P,D ; SAVE NUMBER OF ODD CHARS
\r
3679 SKIPGE A,BUFSTR(B) ; GET CURRENT BUF POSITION
\r
3680 SUBI A,1 ; FIX FOR 440700 BYTE POINTER
\r
3681 PUSH P,(A) ; SAVE THE ODD WORD OF BUFFER
\r
3686 ADDI D,1(A) ; FIX UP FOR POSSIBLE ODD CHARS
\r
3688 PUSH TP,D ; PUSH THE DOPE VECTOR ONTO THE STACK
\r
3689 JUMPE C,BFCLSR ; IN CASE THERE ARE NO FULL WORDS TO DO
\r
3691 MOVE E,[A,,BUFLNT]
\r
3692 SUBI E,(C) ; FIX UP FOR BACKWARDS BLT
\r
3693 POP A,@E ; AMAZING GRACE
\r
3696 HRRO A,D ; SET UP AOBJN POINTER
\r
3699 PUSHJ P,PGBIOO ; DO THE IOT OF ALL THE FULL WORDS
\r
3700 BFCLSR: HRRO A,(TP) ; GET IOT PTR FOR REST OF JUNK
\r
3701 SUBI A,1 ; POINT TO WORD BEFORE DOPE WORDS
\r
3702 POP P,0 ; GET BACK ODD WORD
\r
3703 POP P,C ; GET BACK ODD CHAR COUNT
\r
3704 POP P,D ; FLAG FOR NET OR DSK
\r
3705 JUMPE C,BFCLSD ; IF NO ODD CHARS FINISH UP
\r
3706 JUMPN D,BFCDSK ; GO FINISH OFF DSK
\r
3708 IMULI D,(C) ; FIND NO OF BITS TO SHIFT
\r
3709 LSH 0,-43(D) ; SHIFT BITS TO RIGHT PLACE
\r
3710 MOVEM 0,(A) ; STORE IN STRING
\r
3711 SUBI C,5 ; HOW MANY CHAR POSITIONS TO SKIP
\r
3712 MOVNI C,(C) ; MAKE C POSITIVE
\r
3714 TLC A,(C) ; MUNG THE AOBJN POINTER TO KLUDGE
\r
3715 PUSHJ P,PGBIOO ; DO IOT OF ODD CHARS
\r
3716 BFCLSD: HRRZ A,(TP) ; GET PTR TO DOPE WORD
\r
3718 HRLI A,440700 ; AOBJN POINTER TO FIRST OF BUFFER
\r
3721 HRRM A,BUFSTR-1(B)
\r
3725 BFCDSK: MOVE C,A ; FOR FUNNY AOBJN PTR
\r
3726 HLL C,BUFSTR(B) ; POINT INTO WORD AFTER LAST CHAR
\r
3729 IFN ITS, MOVEI 0,3 ; CONTROL C
\r
3730 IFE ITS, MOVEI 0,32 ; CNTL Z
\r
3735 BFCLS1: HRRZ C,DIRECT-1(B)
\r
3738 MOVE 0,[AOS ACCESS(B)]
\r
3740 HRRZ C,BUFSTR-1(B)
\r
3743 MOVEI A,40 ; PAD WITH SPACES
\r
3745 XCT (P) ; AOS ACCESS IF NECESSARY
\r
3746 SOJG D,.-3 ; TO END OF WORD
\r
3749 HRRZ C,BUFSTR-1(B)
\r
3755 ; HERE TO GET A TTY BUFFER
\r
3757 GETTTY: SKIPN C,EXBUFR(B) ; SKIP IF BUFFERS BACKED UP
\r
3759 HRRZ D,(C) ; CDR THE LIST
\r
3760 GETYP A,(C) ; CHECK TYPE
\r
3761 CAIE A,TDEFER ; MUST BE DEFERRED
\r
3763 MOVE C,1(C) ; GET DEFERRED GOODIE
\r
3764 GETYP A,(C) ; BETTER BE CHSTR
\r
3767 MOVE A,(C) ; GET FULL TYPE WORD
\r
3769 MOVEM D,EXBUFR(B) ; STORE CDR'D LIST
\r
3770 MOVEM A,BUFSTR-1(B) ; MAKE CURRENT BUFFER
\r
3774 TTYWAI: PUSHJ P,TTYBLK ; BLOCKED FOR TTY I/O
\r
3775 JRST GETTTY ; SHOULD ONLY RETURN HAPPILY
\r
3777 \f;INTERNAL DEVICE READ ROUTINE.
\r
3779 ;FOR INTERNAL DEVICES THIS ROUTINE APPLIES THE GIVEN OBJECT,
\r
3780 ;CHECKS THAT THE RETURNED VALUE IS OF TYPE CHARACTER,
\r
3781 ;AND RETURNS THAT AS THE NEXT CHARACTER IN THE "FILE"
\r
3783 ;H. BRODIE 8/31/72
\r
3785 GTINTC: PUSH TP,$TCHAN ;SAVE THE CHANNEL...WE'LL CLOBBER B
\r
3787 PUSH P,C ;AND SAVE THE OTHER ACS
\r
3791 PUSH TP,INTFCN-1(B)
\r
3798 INTRET: POP P,0 ;RESTORE THE ACS
\r
3802 POP TP,B ;RESTORE THE CHANNEL
\r
3803 SUB TP,[1,,1] ;FLUSH $TCHAN...WE DON'T NEED IT
\r
3807 BADRET: PUSH TP,$TATOM
\r
3808 PUSH TP,EQUOTE INT-DEVICE-WRONG-TYPE-EVALUATION-RESULT
\r
3811 ;INTERNAL DEVICE PRINT ROUTINE.
\r
3813 ;FOR INTERNAL DEVICES THIS ROUTINE APPLIES THE GIVEN OBJECT,(FUNCTION, SUBR, OR RSUBR)
\r
3814 ;TO THE CURRENT CHARACTER BEING "PRINTED".
\r
3816 PTINTC: PUSH TP,$TCHAN ;SAVE THE CHANNEL...WE'LL CLOBBER B
\r
3818 PUSH P,C ;AND SAVE THE OTHER ACS
\r
3822 PUSH TP,INTFCN-1(B) ;PUSH TYPE OF GIVEN OBJ
\r
3823 PUSH TP,INTFCN(B) ;PUSH THE SUPPLIED FUNCTION (OR SUBR ETC.)
\r
3824 PUSH TP,$TCHRS ;PUSH THE TYPE "CHARACTER"
\r
3825 PUSH TP,A ;PUSH THE CHAR
\r
3826 MCALL 2,APPLY ;APPLY THE FUNCTION TO THE CHAR
\r
3831 ; ROUTINE TO FLUSH OUT A PRINT BUFFER
\r
3833 MFUNCTION BUFOUT,SUBR
\r
3842 MOVEI B,DIRECT-1(B)
\r
3843 PUSHJ P,CHRWRD ; GET DIR NAME
\r
3845 CAMN B,[ASCII /PRINT/]
\r
3847 CAME B,[<ASCII /PRINT/>+1]
\r
3849 TRNE B,1 ; SKIP IF PRINT
\r
3851 TRNN B,1 ; SKIP IF PRINTB
\r
3852 PUSH P,[AOS ACCESS(B)]
\r
3854 GETYP 0,BUFSTR-1(B)
\r
3856 SKIPN C,BUFSTR(B) ; BYTE POINTER?
\r
3858 HRRZ C,BUFSTR-1(B) ; CHARS LEFT
\r
3859 IDIVI C,5 ; MULTIPLE OF 5?
\r
3860 JUMPE D,BFIN2 ; YUP NO EXTRAS
\r
3862 MOVEI A,40 ; PAD WITH SPACES
\r
3863 PUSHJ P,PUTCHR ; OUT IT GOES
\r
3864 XCT (P) ; MAYBE BUMP ACCESS
\r
3867 BFIN2: PUSHJ P,BFCLOS ; WRITE OUT BUFFER
\r
3868 BFIN1: MOVSI A,TCHAN
\r
3873 ; FUNCTION TO GET THE FILE LENGTH OF A READ CHANNEL
\r
3875 MFUNCTION FILLNT,SUBR,[FILE-LENGTH]
\r
3882 MOVEI B,DIRECT-1(B) ; GET CHANNEL TYPE
\r
3885 CAME B,[ASCIZ /READ/]
\r
3887 PUSH P,[5] ; MULTIPLICATIVE FACTOR FOR READ
\r
3889 CAME B,[ASCII /READB/]
\r
3891 PUSH P,[1] ; MULTIPLICATIVE FACTOR FOR READ
\r
3895 JRST FILLOS ; GIVE HIM A NICE FALSE
\r
3908 FILL1: SETZ ; BLOCK FOR .CALL TO FILLEN
\r
3913 FILLOS: MOVE A,CHANNO(C)
\r
3918 FILLOS: PUSHJ P,TGFALS
\r
3923 \f;THREE GENERALLY USEFUL ERROR ROUTINES FOR I/O
\r
3926 BADCHN: PUSH TP,$TATOM
\r
3927 PUSH TP,EQUOTE BAD-CHANNEL
\r
3930 WRONGD: PUSH TP,$TATOM
\r
3931 PUSH TP,EQUOTE WRONG-DIRECTION-CHANNEL
\r
3934 CHNCLS: PUSH TP,$TATOM
\r
3935 PUSH TP,EQUOTE CHANNEL-CLOSED
\r
3938 BAD6: PUSH TP,$TATOM
\r
3939 PUSH TP,EQUOTE NON-6-BIT-CHARACTER-IN-FILE-NAME
\r
3942 DISLOS: MOVE C,$TCHSTR
\r
3943 MOVE D,CHQUOTE [DISPLAY NOT AVAILABLE]
\r
3948 NOCHAN: PUSH TP,$TATOM
\r
3949 PUSH TP,EQUOTE ITS-CHANNELS-EXHAUSTED
\r
3952 MODE1: 232020,,202020
\r
3953 MODE2: 232023,,332320
\r