1 TITLE OPEN - CHANNEL OPENER FOR MUDDLE
9 ;THIS PROGRAM HAS TWO ENTRIES. FOPEN,FCLOSE AND FDELETE.
10 ;THESE SUBROUTINES HANDLE I/O STREAMS FOR THE MUDDLE SYSTEM.
12 ; FOPEN - OPENS A FILE FOR EITHER READING OR WRITING. IT TAKES
13 ; FIVE OPTINAL ARGUMENTS AS FOLLOWS:
15 ; FOPEN (<DIR>,<FILE NAME1>,<FILE NAME2>,<DEVICE>,<SYSTEM NAME>)
17 ; <DIR> - DIRECTION EITHER READ (INPUT) OR PRINT (OUPUT). DEFAULT IS READ
19 ; <FILE NAME1> - FIRST FILE NAME. DEFAULT INPUT OR OUTPUT.
21 ; <FILE NAME2> - SECOND FILE NAME. DEFAULT MUDDLE.
23 ; <DEVICE> - DEVICE FROM WHICH TO OPEN. DEFAULT IS DSK.
25 ; <SNAME> - SYSTEM (DIRECTORY) NAME. DEFAULT UNAME.
27 ; FOPEN RETURNS AN OBJECT OF TYPE CHANNEL IF IT SUCCEEDS OTHERWISE NIL
30 ; FCLOSE - CLOSES A FILE. TAKES A CHANNEL OBJECT AS ITS ARGUMENT. IT ALSO TAKES
33 ;A CHANNEL OBJECT IS A VECTOR CONTAINIG THE FOLLOWING INFORMATION
35 ; CHANNO==1 ;ITS I/O CHANNEL NUMBER. 0 MEANS NOT A REAL CHANNEL.
36 ; DIRECT==3 ;DIRECTION (EITHER READ OR PRINT)
37 ; DEVICE==5 ;DEVICE UPON WHICH THE CHANNEL IS OPEN
38 ; NAME1==7 ;FIRST NAME OF FILE AS OPENED.
39 ; NAME2==11 ;SECOND NAME OF FILE
40 ; SNAME==13 ;DIRECTORY NAME
41 ; RDEVIC==15 ;REAL DEVICE
42 ; RNAME1=17 ;REAL FIRST NAME (AS RETURNED BY READING CHANNEL STATUS)
43 ; RNAME2==21 ;REAL SECOND NAME
44 ; RSNAME==23 ;SYSTEM OR DIRECTORY NAME
45 ; STATUS==25 ;VARIOUS STATUS BITS
46 ; IOINS==27 ;INSTRUCTION EXECUTED TO INPUT OR OUTPUT ONE CHARACTER
47 ; ACCESS==31 ;ACCESS POINTER FOR RAND ACCESS
48 ; RADX==33 ;RADIX FOR CHANNELS NUMBER CONVERSION
49 ; *** THE FOLLOWING FIELDS FOR OUTPUT ONLY ***
51 ; LINLN==35 ;LENGTH OF A LINE IN CHARACTERS FOR THIS DEVICE
52 ; CHRPOS==37 ;CURRENT POSITION ON CURRENT LINE
53 ; PAGLN==41 ;LENGTH OF A PAGE
54 ; LINPOS==43 ;CURRENT LINE BEING WRITTEN ON
55 ; *** THE FOLLOWING FILEDS FOR INPUT ONLY ***
57 ; EOFCND==35 ;GETS EVALUATED ON EOF
58 ; LSTCHR==37 ;BACKUP CHARACTER
59 ; BUFRIN==41 ;POINTER TO BUFFER FOR TTY FLAVOR DEVICES
62 ;CHANLNT==42 ;LENGTH OF A CHANNEL OBJECT
64 ;THIS IRP DEFINES THE FIELDS AT ASSEMBLY TIME
66 CHANLNT==1 ;INITIAL CHANNEL LENGTH
68 ; BUILD A PROTOTYPE CHANNEL AND DEFINE FILEDS
72 IRP A,,[[CHANNO,FIX],[DIRECT,CHSTR],[DEVICE,CHSTR],[NAME1,CHSTR],[NAME2,CHSTR]
73 [SNAME,CHSTR],[RDEVIC,CHSTR],[RNAME1,CHSTR],[RNAME2,CHSTR],[RSNAME,CHSTR]
74 [STATUS,FIX],[IOINS,FIX],[LINLN,FIX],[CHRPOS,FIX],[PAGLN,FIX],[LINPOS,FIX]
75 [ACCESS,FIX],[RADX,FIX]]
87 ; EQUIVALANCES FOR INPUT CHANNELS
93 ;PRESET LINE LENGTH AND PAGE LENGTH
95 ZZZ==. ;SAVE CURRENT LOCATION
101 TTYLNL ;USE TTY LINE LENGTH
104 TTYPGL ;USE TTY PAGE LENGTH
106 LOC ZZZ ;RESET LOCATIN
110 INBIT==0 ;LH BITS FOR INPUT
111 OUTBIT==1 ;AND FOR OUTPUT
113 ;PAGE AND LINE LENGTH FOR TTY
118 ;DEFINE VARIABLES ASSOCIATED WITH TTY BUFFERS
120 IRP A,,[IOIN2,ECHO,CHRCNT,ERASCH,KILLCH,BRKCH,ESCAP,SYSCHR,BRFCHR,BYTPTR]
124 EXTBFR==BYTPTR+1+<100./5> ;LENGTH OF ADD'L BUFFER
129 .GLOBAL IPNAME,OPEN,CLOSE,IOT,ILOOKU,6TOCHS,ICLOS,OCLOS
130 .GLOBAL OPNCHN,CHMAK,READC,TYO,RADX,SYSCHR,BRFCHR,LSTCH
133 .GLOBAL DISOPN,DISCLS,DCHAR,DISLNL,DISPGL,CHANL0,BUFRIN,IOIN2
134 .GLOBAL ECHO,ERASCH,KILLCH,BRKCH,BYTPTR,SYSCHR,CHRCNT,ESCAP
136 \f;SUBROUTINE TO DO OPENING BEGINS HERE
138 MFUNCTION FOPEN,SUBR,[OPEN]
141 PUSHJ P,MAKCHN ;MAKE THE CHANNEL
142 PUSHJ P,OPNCHN ;NOW OPEN IT
145 ; SUBROUTINE TO JUST CREATE A CHANNEL
147 MFUNCTION CHANNEL,SUBR
152 ;INTERNAL CHANNEL CREATOR
157 ; CYCLE THROUGH THE GIVEN ARGUMENTS
159 MOVSI A,-5 ;NUMBER OF ARGUMENTS INTO A
160 ARGLP: JUMPGE AB,ARGDON ;IF AB>=0, NO MORE ARGS
161 HLRZ C,(AB) ;CHECK THE TYPE
162 CAIN C,TCHRS ;MUST BE AN CHRS
166 ARGWIN: PUSH TP,(AB) ;NOW TO TEMPS
168 ADD AB,[2,,2] ;BUMP ARGG POINTER
171 ;NOW PUSH ANY MORE GOODIES FOR DEFAULTS
174 MOVEI A,(A) ;GET NUMBER DONE
178 CAIE A,2 ;WASONLY DIRECTION GIVEN?
180 MOVEI B,-1(TP) ;PICK UP DIRECTION
181 PUSHJ P,CHRWRD ;GET WORD
184 JRST DFLTB1 ;YES,GO PUSH 'INPUT'
186 PUSH TP,CHQUOTE OUTPUT
189 DFLTAB: PUSH TP,$TCHSTR ;DEFAULT DIRECTION
191 DFLTB1: PUSH TP,$TCHSTR ;DEFAULT NAME1
192 PUSH TP,CHQUOTE INPUT
193 DFLTB2: PUSH TP,$TCHSTR ;DEFAULT NAME2
194 PUSH TP,CHQUOTE MUDDLE
195 PUSH TP,$TCHSTR ;DEFAULT DEVICE
200 PUSH TP,B ;AND DEFAULT SYS NAME
202 GETCHN: PUSH TP,$TFIX ;SETUP CALL TO VECTOR
204 MCALL 1,VECTOR ;GO GET STORAGE
205 HRLI C,PROCHN ;SETUP FOR BLT
207 BLT C,CHANLNT-1(B) ;BLT IN THE TYPES
208 MOVE A,(TB) ;GET TYPE
209 MOVEM A,DIRECT-1(B) ;AND CLOBBER
210 MOVE A,1(TB) ;GET THE DIRECTION
211 MOVEM A,DIRECT(B) ;STORE IT
212 MOVE A,2(TB) ;TYPE FIRST
215 MOVE A,3(TB) ;GET NAME1
217 MOVEM A,RNAME1(B) ;ALSO REAL NAME 1
223 MOVEM A,RNAME2(B) ;ALSO REAL NAME 2
227 MOVE A,7(TB) ;GET DEVICE NAME
233 MOVE A,11(TB) ;FINALLY UNAME
236 SUB TP,[10.,,10.] ;GARBAGE COLLECT TP
237 MOVSI A,TCHAN ;MAKE TYPE INTO CHANNEL
240 \f;OPEN THE CHANNEL POINTED TO BY B
242 OPNCHN: PUSH TP,$TCHAN ;SAVE THE CHANNEL
244 MOVEI B,DIRECT-1(B) ;POINT TO DIRECTION
245 PUSHJ P,CHRWRD ;PUT INTO A WORD
249 MOVE A,DEVICE-1(B) ;GET DEVICE
251 PUSHJ P,STRTO6 ;CONVERT TO 6-BIT
252 HLRZS A,(P) ;DEVICE TO RH
253 CAIN A,(SIXBIT /E&S/) ;DISPLAY HACK?
254 JRST DISCHK ;YES, GO HACK
255 MOVE B,(TP) ;RESTORE B
256 MOVE A,NAME1-1(B) ;TYPE OF NAME1
257 MOVE B,NAME1(B) ;GET THE FIRST NAME
258 PUSHJ P,STRTO6 ;TO 6-BIT
259 MOVE B,(TP) ;RESTORE B
261 MOVE B,NAME2(B) ;SECOND NAME
262 PUSHJ P,STRTO6 ;ALSO TO 6 BIT
264 MOVSI A,INBIT ;GET BIT FOR INPUT OPEN
265 CAME E,[ASCII /READ/] ;REALLY INPUT?
266 MOVSI A,OUTBIT ;NO GET OUTPUT BIT
267 IORM A,-2(P) ;INTO OPEN STUFF
269 MOVE B,SNAME(B) ;GOBBLE SNAME
270 PUSHJ P,STRTO6 ;6 BIT
271 POP P,A ;RESTORE RESULT
272 .SUSET [.SSNAM,,A] ;SET THE SYSTEM NAME
273 MOVEI A,-2(P) ;POINT TO OPEN BLOCK
274 PUSHJ P,OPEN ;DO THE OPEN
275 JRST OPNFAI ;OPEN FAILED, LOSE
276 MOVE B,(TP) ;RESTORE B
277 PUSHJ P,DOSTAT ;GOBBLE THE STATUS
278 LDB C,[600,,STATUS(B)] ;GOBBLE STATUS
279 CAMN E,[ASCII /PRINT/]
280 CAIE C,2 ;SKIP IF DATAPOINT CROCK
281 JRST OPNCH2 ;NOT SAME FOR OUTPUT
283 PUSHJ P,CLOSE ;CLOSE THE FILE
284 MOVSI A,OUTBIT+20 ;AND RE-OPEN IN DISPLAY MODE
286 MOVEI A,-2(P) ;POINT TO OPEN BLOCK
287 PUSHJ P,OPEN ;NOW OPEN THE DEVICE
288 JRST OPNFAI ;CANT OPEN
290 OPNCH2: SUB P,[3,,3] ;REMOVE OPEN BLOCK
291 MOVEM A,CHANNO(B) ;RESTORE CHANNEL NUMBER
292 MOVEI D,(A) ;COPY CHANNEL NO.
294 ADDI D,CHANL0+1(TVP) ;POINT TO THIS CHANNELS TV ENTRY
296 HRLZS A ;CHANNEL NO. TO LH
298 ROT C,5 ;INTO C'S AC FILED
299 IOR C,[.IOT 0,A] ;AND AN I/O INSTRUCTION
300 MOVEM C,IOINS(B) ;SAVE IN CHANNEL
301 ; THIS CODES SETS THE 'REAL' NAMES, DEVICES AND SNAMES
303 HRRI A,1(P) ;POINT INTO P
304 MOVEI C,(A) ;C ALSO POINTS
305 ADD P,[5,,5] ;ALLOCATE SOME P
306 JUMPGE P,[.VALUE [ASCIZ 'P/']] ;DIE ON PDL LOSSAGE
307 .RCHST A, ;READ THE STATUS
308 HRLZS (C) ;FOR NOW KILL LH OF DEVICE
311 PUSH P,[0] ;USED AS A COUNTER
312 NXTREL: MOVEM C,-1(P) ;SAVE C
313 SKIPN A,(C) ;WAS THIS ONE GIVEN?
314 JRST NXTLOK ;NO, SKIP CHANGE
315 PUSHJ P,6TOCHS ;YES, MAKE INTO ATOM
316 MOVEI C,RDTBL ;FIND OUT WHERE
317 ADD C,(P) ;FOR THIS ONE
318 MOVE C,(C) ;NOW HAVE TH OFFSET TO USE
319 ADD C,(TP) ;ADD TO POINTER
321 MOVEM B,(C) ;CLOBBER THE NEW ATOM IN
322 MOVE C,-1(P) ;RESTORE C
323 NXTLOK: AOS (P) ;COUNT THE GOODIES
326 SUB P,[7,,7] ;GC ON P
328 ; DETERMIN EIF THIS IS A TTY FLAVOR DEVICE
330 MOVE B,(TP) ;RESTORE CHANEL POINTER
331 MOVE A,STATUS(B) ;GET STATUS
332 ANDI A,77 ;ISOLATE DEVICE SPEC
333 CAMN E,[ASCIZ /READ/]
334 CAILE A,2 ;NOT A TTY, NO FURTHER ACTION
337 PUSH TP,$TFIX ;CALL UVECTOR FOR BUFFER
339 MCALL 1,UVECTOR ;GET VECTOR
340 MOVE C,[PUSHJ P,READC] ;GET NEW IOINS
341 MOVE D,(TP) ;RESTORE CHANNEL POINTER
342 EXCH C,IOINS(D) ;STORE NEW ONE AND GE OLD
343 MOVEM C,IOIN2(B) ;STORE
344 MOVEM B,BUFRIN(D) ;STORE IN CHANNEL
345 MOVSI A,TUVEC ;MAKE SURE TYPE IS UNIFORM VECTOR
347 MOVEI A,177 ;SET ERASER TO RUBOUT
349 SETOM KILLCH(B) ;NO KILL CHARACTER NEEDED
350 MOVEI A,33 ;BREAKCHR TO C.R.
352 MOVEI A,"\ ;ESCAPER TO \
354 MOVE A,[010700,,BYTPTR(B)] ;RELATIVE BYTE POINTER
356 MOVEI A,14 ;BARF BACK CHARACTER FF
359 OPNRET: POP TP,B ;GET CHANNEL POINTER BACK
361 POP TP,A ;RESTORE TYPE OF CHANNEL
365 ;TABLE USED TO DO THE 'REAL GOODIES'
374 ;HERE TO DO STATUS FOR OPEN LOSSAGE ETC.
376 DOSTAT: PUSH P,A ;SAVE CHANNEL
377 ROT A,23. ;INTO AC FILED
378 IOR A,[.STATUS STATUS(B)] ;GOBBLE THE STATUS
384 ;MAKE THE DISPLAY DEVICE A PSEUDO DEVICE HANDLED BY "DCHAR" ROUTINE
385 DISCHK: SUB P,[1,,1] ;POP OFF JUNK
386 MOVE B,(TP) ;GET POINTER TO CHANNEL
387 SETZM CHANNO(B) ;A PSEUDO CHANNEL NUMBER
388 MOVE C,[PUSHJ P,DCHAR]
389 MOVEM C,IOINS(B) ;GO TO THIS ROUTINE TO HANDLE I/O
394 PUSHJ P,DISOPN ;GO INITIALIZE THE DISPLAY
398 ;ARRIVE HERE IF FOPEN CALLED WITH WRONG TYPES OF ARGUMENTS
400 WRONGT: PUSH TP,$TATOM ;SET UP CALL TO ERROR
401 PUSH TP,MQUOTE WRONG-TYPE
405 ;THIS ROTINE CONVERTS MUDDLE CHARACTER STRINGS TO SIXBIT FILE NAMES
408 PUSH P,E ;SAVE USEFUL FROB
409 MOVEI E,-1(A) ;GET END+1 OF TCHSTR
410 HLRZS A ;CHECK THE TYPE(ONE WORD OR VECTOR)
411 CAIE A,TCHRS ; IS IT ONE WORD?
413 MOVEI B,(TP) ;YES, CREATE DUMMY VECTOR POINTER
415 MOVEI E,1(TP) ;AND DUMMY VECTOR END+1
416 CHREAD: MOVEI A,0 ;INITIALIZE OUTPUT WORD
417 MOVE D,[440600,,A] ;AND BYTE POINTER TO IT
418 LDB 0,B ;PICK UP FIRST CHARACTER
420 JUMPE 0,SIXDON ;IF NULL, WE ARE FINISHED
421 CAIL 0,141 ;IF IT IS GREATER OR EQUAL TO LOWER A
422 CAILE 0,172 ;BUT LESS THAN OR EQUAL TO LOWER Z
424 SUBI 0,40 ;CONVERT TO UPPER CASE
425 SUBI 0,40 ;NOW TO SIX BIT
426 JUMPLE 0,BAD6 ;CHECK FOR A WINNER
429 IDPB 0,D ;DEPOSIT INTO SIX BIT
430 TRNE A,77 ;IS OUTPUT FULL
431 JRST SIXDON ;YES, LEAVE
432 ILDB 0,B ;GET NEXT CHAR AND INC POINTER
433 HRRZ C,B ;GET ADDRESS PART OF BYTE POINTER
434 CAME C,E ;HAS POINTER REACHED LIMIT?
435 JRST NEXCHR ;NO, GOBBLE NEXT CHARACTER
436 SIXDON: SUB TP,[2,,2] ;FIX UP TP
438 EXCH A,(P) ;LEAVE RESULT ON P-STACK
442 ;SUBROUTINE TO CONVERT SIXBIT TO ATOM
445 MOVEI B,6 ;MAX NUMBER OF CHARACTERS
446 PUSH P,[0] ;STRING WILL GO ON P SATCK
447 MOVEI E,-1(P) ;WILL BE BYTE POINTER
448 HRLI E,10700 ;SET IT UP
449 PUSH P,[0] ;SECOND POSSIBLE WORD
450 MOVE D,[440600,,A] ;INPUT BYTE POINTER
451 6LOOP: ILDB 0,D ;START CHAR GOBBLING
452 JUMPE 0,GETATM ;IF ZERO, FINISHED
453 ADDI 0,40 ;CHANGET TOASCII
454 IDPB 0,E ;AND STORE IT
455 SOJG B,6LOOP ;KEEP LOOKING
456 PUSH P,[2] ;IF ARRIVE HERE, STRING IS 2 WORDS
458 GETATM: AOS (P) ;SET STRING LENGTH=1
459 PUSHJ P,CHMAK ;MAKE A MUDDLE STRING
466 OPNFAI: MOVE B,(TP) ;RESTORE CHANNEL POINTER
467 SETOM STATUS(B) ;SET TO -1
468 JUMPL A,.+2 ;A<0 MEANS NO CHANNELS
469 PUSHJ P,DOSTAT ;GOBBLE STATUS
470 SUB TP,[2,,2] ;PATCH UP TP
471 SUB P,[3,,3] ;REMOVE CRAP
472 RETNIL: MOVSI A,TFALSE ;RETURN A FALSE
476 ;ERROR FOR BAD CHARACTER IN SIX BIT STRING
478 BAD6: PUSH TP,$TATOM ;SETUP ERROR CALL
479 PUSH TP,MQUOTE FILE-NAME-NOT-6-BIT
483 ; FUNCTION TO LIST ALL CHANNELS
485 MFUNCTION CHANLIST,SUBR
489 MOVEI A,16. ;MAX # OF CHANNELS
491 MOVEI B,CHANL0(TVP) ;POINT TO FIRST
493 CHNLP: SKIPN 1(B) ;OPEN?
494 JRST NXTCHN ;NO, SKIP
497 ADDI C,1 ;COUNT WINNERS
505 ;THIS PROGRAM CLOSES THE SPECIFIED CHANNEL
507 MFUNCTION FCLOSE,SUBR,[CLOSE]
509 ENTRY 1 ;ONLY ONE ARG
510 HLRZ A,(AB) ;CHECK ARGS
511 CAIE A,TCHAN ;IS IT A CHANNEL
513 MOVE B,1(AB) ;PICK UP THE CHANNEL
514 CLEARM IOINS(B) ;CLOBBER THE IO INS
515 MOVEI B,DEVICE-1(B) ;GE THE NAME OF THE DEVICE
520 CAMN A,[ASCIZ /TTY/] ;IS IT THE TTY?
521 JRST TTYCLS ;YES, DO SPECIAL HACK
523 PUSHJ P,DISCLS ;GO RELEASE THE DISPLAY SPACE
524 SKIPE A,CHANNO(B) ;IS THERE A CHANNEL NO.?
525 PUSHJ P,CLOSE ;YES, CLOSE IT
526 CFIN: SKIPN A,CHANNO(B) ;ANY CHANNEL?
529 ADDI A,CHANL0+1(TVP) ;POINT TO THIS CHANNELS LSOT
531 SETZM (A) ;AND CLOBBER IT
532 CFIN2: MOVSI A,TCHAN ;RETURN THE CHANNEL
535 TTYCLS: MOVE A,DIRECT(B) ;GET THE DIRECTION OF THE CHANNEL
536 CAMN A,CHQUOTE READ, ;IS IT READ
537 PUSHJ P,ICLOS ;YES, CLOSE THAT
538 CAMN A,CHQUOTE PRINT, ;IS IT PEINT
539 PUSHJ P,OCLOS ;YES CLOSE TTY OUT CHANNEL