Twenex Muddle.
[pdp10-muddle.git] / <mdl.int> / ipc.mid.19
1 TITLE IPC -- IPC COMMUNICATIONS HANDLER FOR MUDDLE
2
3 RELOCATABLE
4
5 ; N. RYAN   October 1973
6
7 .INSRT MUDDLE >
8
9 ;THIS PROGRAM HAS ENTRIES  SEND, SEND-WAIT, IPC-OFF,
10 ;                AND IPC-HANDLER.
11
12 ;THESE HANDLE THE IPC DEVICE.
13
14 ;SEND AND SEND-WAIT SEND OUT A MESSAGE ON THE IPC DEVICE.
15 ;THEY TAKE 6 ARGUMENTS, THE FIRST THREE OF WHICH ARE NECESSARY
16
17 ;       SEND (<HISNAME1> <HISNAME2> <MESSAGE> <MESSAGE-TYPE> <MYNAME1> <MYNAME2>)
18
19 ;       <HISNAME1> -- STRING USED AS SIXBIT FOR NAME 1
20 ;       <HISNAME2> -- STRING USED AS SIXBIT FOR NAME 2
21 ;       <MESSAGE>  -- THE MESSAGE TO SEND, EITHER A STRING OR A UVECTOR OF TYPE WORD
22 ;       <TYPE>     -- THE TYPECODE TO SEND, A FIXED NUMBER, DEFAULT 0
23 ;       <MYNAME1>  -- STRING USED AS SIXBIT FOR MY NAME 1
24 ;       <MYNAME2>  -- STRING USED AS SIXBIT FOR MY NAME 2
25
26 ;       SEND    -- TRIES TO SEND IMMEDIATELY, ELSE RETURNS FALSE WITH MESSAGE
27 ;       SEND-WAIT -- HANGS UNTIL MESSAGE CAN BE SENT
28
29 ;       IPC-OFF -- NO ARGUMENTS, CLOSES ALL IPC-RECEIVE CHANNELS
30
31 ;       IPC-ON  -- OPENS AN IPC RECEIVE CHANNEL
32 ;                  IT TAKES 2 OPTIONAL ARGS WHICH ARE THE NAMES TO LISTEN ON,
33 ;                       THE DEFAULT IS UNAME, JNAME
34
35
36
37 \f; DEFINITIONS FOR STRUCTURE OF IPC BUFFER
38
39 BUFL==200.                      ;LENGTH OF IPC BUFFER
40 BUFHED==3                       ;LENGTH OF BUFFER HEADER
41 CONT==400000                    ;LEFT HALF BIT INDICATING THIS IS CONTINUATION
42 INCOMP==200000          ;LEFT HALF BIT INDICATING MESSAGE COMPLETE
43 ASCIMS==100000          ;LEFT HALF BIT INDICATING THIS IS PACKED ASCII MESSAGE
44 MESHED==2                       ;LENGTH OF CRUFT AT FRONT OF FIRST MESSAGE
45 MAXMES==20000.          ;MAXIMUM LENGTH IN WORDS OF MESSAGES MUDDLE WILL LIKE
46
47
48 .GLOBAL STRTO6,SAT,IBLOCK,MOPEN,MCLOSE,GFALS,TTOCHN,INCONS,MASK2,INTHLD
49 .GLOBAL IPCS1,IBLOCK,IPCGOT,DIRQ,GIBLOK,6TOCHS,CAFRE,CAFRET,IPCBLS,PVSTOR,SPSTOR
50
51 ; DEFINITIONS OF BITS IN THE OPEN BLOCK FOR IPC DEVICE
52
53 RFROMA==1                       ;READ FROM ANY
54 RFROMS==2                       ;READ FROM SPECIFIC
55 SANDH==4                        ;SEND AND HANG
56 SIMM==10                        ;SEND IMMEDIATE
57 USEUJ==20                       ;USE MY UNAME, JNAME
58
59
60 ;BUFFERFORMAT:  HISNAME1
61 ;               HISNAME2
62 ;               COUNT
63 ;               BITS,,LENGTH
64 ;               TYPE
65
66 ;WHERE ASCII MESSAGES CONSIST OF A COUNT FOLLOWED BY CHARS
67 ;THE LENGTH IS THE LENGTH OF THE TYPE WORD PLUS ALL THE BODIES
68
69 \f
70
71 ; THE FOLLOWING IS THE HANDLER WHICH WILL NORMALLY BE PUT ON THE
72 ; IPC INTERRUPT AND SO SERVE AS THE DEFAULT HANDLER FOR IPC RECEIVES
73 ; WHICH ARE NOT CAUGHT BY THE USER AND SERVICED IN SOME OTHER MANNER
74
75 ; NOTE THAT AS AN EXPERIMENT, MESSAGE WHICH ARE ASCII STRINGS WITH TYPE-CODE 1
76 ; ARE CONSIDERED AS EXECUTE COMMANDS.  THEY ARE FIRST PRINTED OUT,
77 ; THEN THEY ARE PARSED AND THAT RESULT IS EVALED.
78 ; ALL MESSAGES OF OTHER TYPES ARE CONSIDERED MERELY AS MESSAGES TO BE
79 ; PRINTED OUT WITH AN INDICATING OF WHO THEY ARE FROM
80
81 ; THE ARGS WHICH THIS SUBROUTINE IS CALLED WITH BY INTERRUPT ARE
82 ; <MESSAGE> <TYPE> <HIS NAME 1> <HIS NAME 2> <MY NAME 1> <MY NAME 2>
83 ; WHERE THE LAST TWO ARE OPTIONAL AND ONLY GIVEN IF THE SOCKET WAS NOT
84 ; LISTENING ON THE DEFAULT UNAME,JNAME COMBINATION.
85
86
87 MFUNCTION       IPCH,SUBR,[IPC-HANDLER]
88
89         ENTRY
90
91         PUSH    P,[0]                   ;SAVE A SLOT FOR LATTER USE
92         HLRE    0,AB                    ;CHECK THE NUMBER OF ARGS WE GOT
93         CAMLE   0,[-8.]                 ;NEED AT LEAST 4 ARGS
94         JRST    WNA
95         GETYP   E,(AB)                  ;CHECK TYPE OF FIRST ARG
96         CAIN    E,TCHSTR                ;IS IT A CHARACTER STRING
97         JRST    .+3
98         CAIE    E,TUVEC                 ;IF NOT IT MUST BE A UVECTOR
99         JRST    WTYP1                   ;IF NEITHER THEN WE HAVE A LOOSER
100         GETYP   A,2(AB)                 ;GET TYPE OF MESSAGE TYPE, SHOULD BE A FIX
101         CAIE    A,TFIX
102         JRST    WTYP2                   ;IF NOT FIX COMPLAIN
103         GETYP   A,4(AB)
104         CAIE    A,TCHSTR                ;HIS NAME 1 SHOULD BE CHAR STRING
105         JRST    WTYP
106         GETYP   A,6(AB)
107         CAIE    A,TCHSTR
108         JRST    WTYP                    ;HIS NAME 2 SHOULD BE CHAR STRING
109         CAML    0,[-8.]                 ;SEE IF WE HAVE 4 OR 6 ARGS
110         JRST    IPCH1                   ;WE ONLY HAD 4 ARGS
111         CAME    0,[-12.]                ;THEN WE MUST HAVE EXACTLY 6 ARGS
112         JRST    WNA
113         GETYP   A,(AB)8.
114         CAIE    A,TCHSTR
115         JRST    WTYP                    ;CHECK TO SEE THE MY NAME 1 IS STRING
116         GETYP   A,10.(AB)
117         CAIE    A,TCHSTR
118         JRST    WTYP                    ;CHECK TO SEE THAT MY NAME 2 IS STRING
119
120 IPCH1:  PUSH    TP,$TCHAN
121         PUSH    TP,TTOCHN+1     ;PUSH ON TTY OUTPUT CHANNEL TO CALL TERPRI
122         MCALL   1,TERPRI
123         PUSH    TP,$TCHSTR
124         PUSH    TP,CHQUOTE [IPC MESSAGE FROM ]
125         PUSH    TP,$TCHAN
126         PUSH    TP,TTOCHN+1
127         MCALL   2,PRINC                 ;PRINT OUT BLURB TO TELL LOOSER WHATS HAPPENING
128         PUSH    TP,4(AB)
129         PUSH    TP,5(AB)                ;OUTPUT HIS NAME 1
130         PUSHJ   P,TO                    ;JUMP OUT OUTPUTTER OVER TTY OUTPUT CHANNEL
131         PUSHJ   P,STO                   ;JUMP TO SPACE OUTPUTTER OVER TTY OUTPUT CHANNEL
132         PUSH    TP,6(AB)
133         PUSH    TP,7(AB)                ;OUTPUT NAME 2
134         PUSHJ   P,TO
135         MOVE    E,3(AB)                 ;MESSAGE TYPE
136         JUMPE   E,IPCH3                 ;IF MESSAGE TYPE 0 DO NOTHING ABOUT IT
137         CAIE    E,1                     ;IF 1 SEE IF THIS IS EXECUTE MESSAGE
138         JRST    IPCH2                   ;IF NOT TELL LOOSER ABOUT THIS MESSAGE TYPE
139         GETYP   0,(AB)
140         CAIE    0,TCHSTR                ;SEE IF WE HAVE STRING
141         JRST    IPCH2                   ;IF NOT THIS CANT BE EXECUTE MESSAGE
142         AOS     (P)                     ;SET FLAG TO INDICATE EXECUTE MESSAGE
143         PUSH    TP,$TCHSTR
144         PUSH    TP,CHQUOTE [     EXECUTE]
145         PUSHJ   P,TO                    ;TELL THE LOOSER HE IS GETTING WHAT HE DESERVES
146         JRST    IPCH3
147 IPCH2:  PUSH    TP,$TCHSTR
148         PUSH    TP,CHQUOTE [     TYPE ]
149         PUSHJ   P,TO
150         PUSH    TP,2(AB)
151         PUSH    TP,3(AB)                ;PUSH ON THE MESSAGE TYPE
152         PUSHJ   P,TO
153 IPCH3:  HLRE    0,AB
154         CAME    0,[-12.]                ;SEE IF WE HAVE 6 ARGS AND SO MUST TELL HIM WHO MESS IS FOR
155         JRST    IPCH4                   ;IF NOT DONT WORRY
156         PUSH    TP,$TCHSTR
157         PUSH    TP,CHQUOTE [     TO ]
158         PUSHJ   P,TO
159         PUSH    TP,8.(AB)
160         PUSH    TP,9.(AB)               ;PUSH ON MY NAME 1
161         PUSHJ   P,TO
162         PUSHJ   P,STO                   ;LEAVE SPACE BETWEEN NAMES
163         PUSH    TP,10.(AB)              ;PUSH ON MY NAME 2
164         PUSH    TP,11.(AB)
165         PUSHJ   P,TO
166 IPCH4:  PUSH    TP,(AB)                 ;PUSH ON THE ACTUAL GOODIE
167         PUSH    TP,1(AB)
168         PUSH    TP,$TCHAN
169         PUSH    TP,TTOCHN+1
170         MCALL   2,PRINT                 ;AND PRINT IT OUT
171         SKIPN   (P)                     ;TEST TO SEE IF WE MUST EXECUTE THIS BAG BITTER
172         JRST    IPCHND
173         PUSH    TP,(AB)
174         PUSH    TP,1(AB)
175         MCALL   1,PARSE                 ;PARSE HIS CRUFT
176         PUSH    TP,A
177         PUSH    TP,B
178         MCALL   1,EVAL                  ;THEN EVAL THE RESULT
179 IPCHND: PUSH    TP,$TCHAN
180         PUSH    TP,TTOCHN+1
181         MCALL   1,TERPRI
182         MOVSI   A,TATOM
183         MOVE    B,IMQUOTE T
184         JRST    FINIS                   ;TO RETURN WITH SOMETHING NICE
185
186 STO:    PUSH    TP,$TCHSTR              ;CROCK TO OUTPUT A SPACE ON THE TTY OUTPUT CHANNEL
187         PUSH    TP,CHQUOTE [ ]
188 TO:     PUSH    TP,$TCHAN
189         PUSH    TP,TTOCHN+1
190
191         MCALL   2,PRINC
192         POPJ    P,                      ;GO BACK TO WHAT WE WERE DOING
193 \f
194
195 ;THESE ARE THE FUNCTIONS TO ACTUALLY STUFF GOODIES OUT
196 ;OVER THE IPC DEVICE
197 ;DESCRIPTION OF CALLING ARGS TO THEM IS AT THE
198 ;FIRST OF THE FILE
199
200 MFUNCTION       SEND,SUBR
201
202         ENTRY
203
204         PUSH    P,[0]                   ;FLAG TO INDICATE DONT WAIT
205         JRST    CASND
206
207 MFUNCTION       SENDW,SUBR,[SEND-WAIT]
208
209         ENTRY
210
211         PUSH    P,[1]                   ;FLAG TO INDICATE WAITING
212
213 CASND:  HLRE    0,AB
214         CAMG    0,[-6]                  ;NEED AT LEAST 3 ARGS
215         CAMGE   0,[-12.]                ;AND NOT MORE THAN 6 ARGS
216         JRST    WNA
217         MOVE    A,(AB)
218         MOVE    B,1(AB)
219         PUSHJ   P,STRTO6                ;POOF FIRST ARG TO SIXBIT
220         MOVE    A,2(AB)
221         MOVE    B,3(AB)
222         PUSHJ   P,STRTO6                ;POOF SECOND ARG TO SIXBIT
223         GETYP   0,4(AB)
224         CAIN    0,TCHSTR
225         JRST    CASND1                  ;IF FIRST ARG IS STRING, NO PROBLEMS
226         CAIE    0,TSTORAGE
227         CAIN    0,TUVEC
228         JRST    .+2
229         JRST    WTYP3                   ;ELSE MUST BE OF TYPE STORAGE OR UVEC
230         MOVE    B,5(AB)
231         HLRE    C,B                     ;GET COUNT FIELD
232         SUBI    B,(C)                   ;AND ADD THAT AMOUNT TO FIND DOPE WORD
233         GETYP   A,(B)                   ;GET TYPE WORD OUT OF DOPE
234         PUSHJ   P,SAT                   ;GET ITS STORAGE TYPE
235         CAIE    A,S1WORD
236         JRST    WTYP3                   ;CRUFT MUST BE OF TYPE WORD
237 CASND1: PUSH    TP,4(AB)
238         PUSH    TP,5(AB)                ;SAVE THE STRUCTURE AROUND TO REST OFF AS WE SEND
239         PUSH    P,[0]                   ;SLOT FOR THIS MESSAGE TYPE, DEFAULT 0
240         HLRE    0,AB
241         CAMLE   0,[-8.]                 ;IF 4 OR MORE ARGS GET THE MESS TYPE
242         JRST    CASND2
243         GETYP   0,6(AB)                 ;CHECK TO SEE THAT TYPE IS A FIX
244         CAIE    0,TFIX
245         JRST    WTYP
246         MOVE    0,7(AB)
247         MOVEM   0,(P)                   ;SMASH IN THE SLOT RESERVED FOR TYPE
248 CASND2: HLRE    0,AB
249         CAMN    0,[-10.]                ;IF WE HAVE FIVE ARGS WE ARE A GLOBAL LOOSER NEED 4 OR 6
250         JRST    WNA
251         CAMGE   0,[-8.]                 ;IF WE HAVE 4 OR LESS DONT WORRY 
252         JRST    .+4                     ;GO GET LAST TO ARGS
253         PUSH    P,[0]                   ;NO SIXBIT OF FROM
254         PUSH    P,[0]                   ;SO SAVE SLOTS ANYWAY
255         JRST    CASND3                  ;GO WORRY ABOUT SENDING NOW
256         MOVE    A,8.(AB)
257         MOVE    B,9.(AB)
258         PUSHJ   P,STRTO6                ;CONVERT MY NAME1 TO SIXBIT
259         MOVE    A,10.(AB)
260         MOVE    B,11.(AB)               ;CONVERT MY NAME 2 TO SIXBIT
261         PUSHJ   P,STRTO6
262
263 CASND3: GETYP   0,-1(TP)
264         CAIE    0,TCHSTR                ;IS THIS A CHAR STRING
265         JRST    .+5
266         HRRZ    A,-1(TP)                ;IF SO GET COUNT
267         ADDI    A,9.
268         IDIVI   A,5                     ;IF SO ROUND UP AND ADD ONE
269         JRST    .+3
270         HLRE    A,(TP)
271         MOVN    A,A                     ;IF A VECTOR GET THE WORD COUNT
272         PUSH    P,A                     ;SAVE COUNT OF WORDS
273         CAILE   A,MAXMES
274         JRST    TOBIGR                  ;MESS OVER SIZE LIKED BY MUDDLE
275         CAILE   A,BUFL-MESHED           ;HOW BIG A BUFFER DO WE NEED?
276         MOVEI   A,BUFL-MESHED           ;IF TOO BIG WE USE DEFAULT MAX SIZE, ELSE LESS
277         ADDI    A,MESHED+BUFHED         ;PLUS ROOM FOR MESSAGE AND SYSTEM HEADERS
278         PUSHJ   P,IBLOCK
279         PUSH    TP,A
280         PUSH    TP,B                    ;GET BUFFER OF RIGHT SIZE AND SAVE ON STACK
281         PUSH    TP,A
282         PUSH    TP,B                    ;SAVE ANOTHER COPY WHICH WILL BE RESTED AT TIMES
283         MOVE    C,-5(P)                 ;GET HIS NAME 1
284         MOVEM   C,(B)                   ;AND STUFF IN RIGHT PLACE
285         MOVE    C,-4(P)
286         MOVEM   C,1(B)                  ;STUFF HIS NAME 2
287         MOVE    C,-3(P)
288         MOVEM   C,4(B)                  ;STUFF MESSAGE TYPE CODE WORD
289         GETYP   0,-5(TP)                ;IS THIS STRING OR UVECTOR?
290         CAIE    0,TCHSTR
291         JRST    CASND4
292         MOVE    C,(P)                   ;GET LENGTH OF CHAR STRING TO SEND
293         ADDI    C,1
294         MOVEM   C,3(B)                  ;STORE IN LENGTH FIELD IN MESS HEADER
295         SOS     (P)                     ;DECREMENT FOR COUNT WORD
296         HRRZ    C,-5(TP)                ;GET THE CHARACTER COUNT
297         MOVEM   C,5(B)                  ;STORE IN CORRECT SLOT IN MESSAGE
298         MOVE    D,[6,,6]                ;OFFSET FOR INITIAL HEADER ON ASCII MESSAGES
299         ADDM    D,(TP)                  ;OFFSET BUF PTR 2 BY THIS AMOUNT
300         JRST    CASND5
301 CASND4: MOVE    C,(P)                   ;GET COUNT OF MESSAGE
302         ADDI    C,1                     ;EXTRA FOR TYPE WORD
303         MOVEM   C,3(B)                  ;STORE IN SLOT FOR COUNT OF WHOLE MESSAGE
304         MOVE    D,[5,,5]                ;OFFSET FOR INITIAL HEADER ON UVECTOR MESSAGES
305         ADDM    D,(TP)                  ;OFFSET BUF PTR 2 BY THIS AMOUNT
306 CASND5: PUSHJ   P,STUFBF                ;GO FILL UP THE BUFFER WITH GARBAGE
307         MOVN    0,A                     ;GET NEGATIVE THE COUNT OF WORDS STUFFED
308         ADDM    0,(P)                   ;THAT MANY LESS WORDS REMAINING TO BE DONE
309         HRRZ    C,-2(TP)                ;GET A POINTER TO THE "UNRESTED" BUFFER
310         HRRZ    D,(TP)                  ;GET A POINTER TO THE "RESTED" BUFFER
311         SUB     D,C                     ;FIND OUT HOW MUCH WAS RESTED OFF
312         ADD     D,A                     ;ADD TO THAT THE COUNT OF WORDS STUFFED THIS TIME
313         SUBI    D,BUFHED                ;LESS THE SYSTEM CONSTANT HEADER THAT DOENT COUNT
314         MOVEM   D,2(C)                  ;STORE IN THE BUFFER IN CORRECT SLOT
315         PUSHJ   P,CASIOT                ;GO DO THE "IOT"--ACTUALLY AN OPEN
316         MOVE    C,-2(TP)
317         HRLZI   E,CONT                  ;THE "THIS IS A CONTINUATION" BIT
318         IORM    E,3(C)                  ;TURN BIT ON IN FUTURE MESSAGES
319         ADD     C,[4,,4]                ;REST OFF THE SHORTER HEADER FOR THE REST OF MESSAGES
320         MOVEM   C,(TP)                  ;STORE THIS IN THE "RESTED" BUFFER SLOT
321         SKIPLE  (P)                     ;IS THERE MORE TO DO?
322         JRST    CASND5
323         MOVSI   A,TATOM
324         MOVE    B,IMQUOTE T
325         JRST    FINIS                   ;RETURN HIM SOMETHING NICE
326
327 TOBIGR: ERRUUO  EQUOTE MESSAGE-TOO-BIG
328
329 \f
330 STUFBF: MOVE    C,-2(TP)                        ;ROUTINE TO FILL UP BUFFER WITH GOODIES
331         HRLZI   E,INCOMP+ASCIMS
332         ANDCAM  E,3(C)                          ;CLEAR THE INCOMPLETE AND ASCII FLAGS IF SET
333         HLRE    B,(TP)                          ;GET THE BUFFER LENGTH
334         MOVN    B,B                             ;MAKE IT A POSITIVE NUMBER
335         CAML    B,-1(P)                         ;SEE IF THE WHOLE MESSAGE WILL FIT
336         JRST    .+4                             ;IT WILL ALL FIT
337         HRLZI   0,INCOMP                        ;THE INCOMPLETE FLAG
338         IORM    0,3(C)                          ;SET IT
339         JRST    .+2
340         MOVE    B,-1(P)                         ;ELSE THE WHOLE MESSAGE FITS
341         GETYP   0,-5(TP)
342         CAIN    0,TCHSTR
343         JRST    STUFAS
344         HRLZ    D,-4(TP)                        ;SET UP TO BLT UVECTOR
345         HRR     D,(TP)
346         HRRZ    E,(TP)
347         ADDI    E,(B)-1                         ;SET UP BLT POINTERS
348         SKIPLE  B                               ;IN CASE ZERO LENGTH UVECTOR
349         BLT     D,(E)                           ;BBBBLLLLLLLLLLLLLLLLLLTTTT?
350         MOVE    A,B                             ;MOVE COUNT OF WORDS DONE INTO A
351         HRL     B,B
352         ADDM    B,-4(TP)                        ;REST OFF THIS MUCH OF GOODIE FOR NEXT TIME
353         POPJ    P,
354 STUFAS: HRLZI   0,ASCIMS
355         IORM    0,3(C)                          ;TURN ON THE ASCII BIT IN THE MESSAGE
356         MOVE    A,B                             ;MOVE COUNT OF NUMBER OF WORDS INTO A
357         IMULI   B,5                             ;GET CHAR COUNT IN B
358         HRRZ    C,-5(TP)                        ;COMPARE THIS WITH COUNT FIELD IN STRING
359         MOVE    D,B
360         SUB     D,C                             ;SEE HOW MANY EXTRA BLANKS AT END OF MESS
361         JUMPGE  D,.+3
362         MOVEI   D,0                             ;NO EXTRA SPACES TO PAD
363         MOVE    C,B                             ;NOT EXTRA SPACES, DO 5*WORD CHARS
364         MOVN    E,C
365         ADDM    E,-5(TP)                        ;FIX UP COUNT IN ASCII
366         HRLZI   E,440700                        ;GET A IDPB PTR INTO THE BUFFER
367         HRR     E,(TP)                          ;POINT TO RIGHT PLACE IN BUFFER
368         JUMPLE  C,.+4                           ;ARE WE DONE MOVING CHARS?
369         ILDB    0,-4(TP)                        ;LOAD A BYTE FROM STRING
370         IDPB    0,E                             ;STUFF IN BUFFER
371         SOJG    C,.-2                           ;REPEAT THE LOOP
372         JUMPLE  D,.+4                           ;SEE IF WE NEED TO FILL OUT WITH NULLS
373         MOVEI   0,0
374         IDPB    0,E                             ;STUFF A NULL IN RIGHT SPOT IN BUFFER
375         SOJG    D,.-1
376         POPJ    P,
377
378 CASIOT: HRRZI   A,(SIXBIT /IPC/)                ;FIX UP OPEN BLOCK IN THE AC'S
379         MOVE    B,-2(TP)                        ;HOWS THAT FOR SNAZZY?
380         MOVE    C,-3(P)                         ;MY NAME 1
381         MOVE    D,-2(P)                         ;MY NAME 2
382         JUMPN   C,.+3
383         JUMPN   D,.+2
384         TLO     A,USEUJ                         ;IF BOTH ARE ZERO THEN USE DEFAULT UNAME,JNAME
385         SKIPN   -7(P)                           ;SEE IF SEND AND HANG FLAG IS SET
386         JRST    .+3
387         TLO     A,SANDH                         ;SET SEND AND HANG FLAG
388         JRST    .+3
389         TLO     A,SIMM                          ;ELSE WE MUST BE SENDING IMMEDIATE
390         AOS     -7(P)                           ;IF THERE IS MORE TO DO, IT MUST BE IN HANG MODE
391         MOVSI   0,TUVEC
392         MOVE    PVP,PVSTOR+1
393         MOVEM   0,BSTO(PVP)                     ;IN CASE WE ARE INTERRUPTED OUT WE WANT TO WIN
394         SETZM   E                               ;FLAG USED TO INDICATE NO SKIPPAGE
395         ENABLE
396         .OPEN   0,A                             ;WELL, THATS ALL THERE IS TO IT.
397         AOS     E                               ;IF WE DONT SKIP WE HAVE PROBLEMS
398         DISABLE
399         MOVE    PVP,PVSTOR+1
400         SETZM   BSTO(PVP)                       ;FIX UP THE SLOT IN PVP
401         SKIPN   E                               ;SEE IF WE LOST
402         POPJ    P,                              ;IF NOT WE ARE THROUGH WITH THIS PART
403         .STATUS 0,A                             ;FIND OUT REASON FOR LOSSAGE
404         MOVEI   B,0
405         PUSHJ   P,GFALS                         ;MAKE A FALSE WITH THAT REASON
406         JRST    FINIS                           ;GIVE THE MAGIC FALSE BACK TO THE LOOSER
407
408 \f
409 MFUNCTION       DEMSIG,SUBR
410
411         ENTRY 1
412
413         MOVE    A,(AB)
414         MOVE    B,1(AB)
415         PUSHJ   P,STRTO6                ;GET THE SIXBIT REPRESENTATION
416         MOVE    A,[SETZ]                ;FIX UP THE BLOCK IN THE AC'S
417         MOVE    B,[SIXBIT /DEMSIG/]
418         MOVE    C,[SETZ (P)]            ;THE SIXBIT IS ON TOP OF P STACK
419         .CALL   A
420         JRST    RFALS                   ;DIDNT WIN WITH DEMON SIGNAL
421 RTRUE:  MOVSI   A,TATOM
422         MOVE    B,IMQUOTE T
423         JRST    FINIS
424
425 RFALS:  MOVSI   A,TFALSE
426         MOVEI   B,0
427         JRST    FINIS                   ;FALSE INDICATING LACK OF WINNAGE
428
429 \f
430 MFUNCTION       IPCON,SUBR,[IPC-ON]
431
432         ENTRY
433
434         PUSH    P,[USEUJ,,0]            ;FLAG FOR WHETHER OR NOT TO USE DEFAULT
435         HLRZ    0,AB
436         JUMPE   0,IPCON1                ;NO ARGS ARE FINE
437         CAIE    0,-4                    ;ELSE MUST HAVE 2 ARGS
438         JRST    WNA
439         SETZM   (P)                     ;CLEAR OUR FLAG
440         MOVE    A,(AB)
441         MOVE    B,1(AB)
442         PUSHJ   P,STRTO6                ;GET SIXBIT OF OUR FIRST ARG
443         MOVE    A,2(AB)
444         MOVE    B,3(AB)
445         PUSHJ   P,STRTO6                ;GET SIXBIT OF OUR SECOND ARG
446         JRST    IPCON2
447 IPCON1: PUSH    P,[0]                   ;SAVE SLOT ON STACK FOR EVENNESS
448         PUSH    P,[0]
449 IPCON2: MOVEI   A,BUFL+BUFHED
450         PUSHJ   P,CAFRE                 ;GET A BUFFER OF RIGHT LENGTH TO READ INTO
451         PUSH    P,A                     ;AND SAVE IT AROUND SO WE DONT LOOSE
452         MOVEI   0,BUFL
453         MOVEM   0,2(A)                  ;FILL COUNT IN THE BUFFER SLOT
454         MOVEI   A,5
455         PUSHJ   P,IBLOCK                ;GET A BLOCK OF STORE FOR THE OPEN BLOCK
456         PUSH    TP,$TUVEC
457         PUSH    TP,B                    ;SAVE CRUFT ON TP
458         TLO     0,RFROMA                ;SET THE READ FROM ANY FLAG
459         IOR     0,-3(P)                 ;FIX FOR DEFAULT UNAME,JNAME IF FLAG INDICATES
460         MOVEM   0,(B)                   ;MAKE OPEN BLOCK
461         MOVE    0,[SIXBIT /IPC/]
462         MOVEM   0,1(B)
463         MOVE    0,-2(P)
464         MOVEM   0,3(B)                  ;MY NAME 1
465         MOVE    0,-1(P)
466         MOVEM   0,4(B)                  ;MY NAME 2 IF NOT USING DEFAULT
467         MOVE    0,(P)
468         MOVEM   0,2(B)                  ;PTR TO THE WIRED BUFFER FOR STUFFING CRUFT
469         MOVE    A,B
470         PUSHJ   P,MOPEN                 ;GO DO THE OPEN
471         JRST    IPCON3                  ;OPEN FAILED, FIND OUT WHY
472         PUSH    P,A                     ;SAVE THE CHANNEL NUMBER
473         MOVEI   E,1
474         LSH     E,(A)                   ;SET INTERRUPT BITS RIGHT
475         IORM    E,MASK2
476         .SUSET  [.SMSK2,,MASK2]
477         MOVE    C,-1(TP)
478         MOVE    D,(TP)                  ;GET THE OPEN BLOCK UVECTOR
479         PUSHJ   P,INCONS                ;THROW INTO PAIR SPACE
480         POP     P,C                     ;GET THE CHANNEL #
481         SUBI    C,1
482         IMULI   C,2
483         MOVEM   B,IPCS1+1(C)            ;STUFF PTR TO OPEN BLOCK INTO SLOT IN TVP
484         JRST    RTRUE                   ;WE WON, GO LET LUSER KNOW IT.
485 IPCON3: PUSH    P,A                     ;WE LOST, LETS FIND OUT WHY
486         MOVE    A,BUFL+BUFHED
487         MOVE    B,-1(P)                 ;LETS FREE UP OUR WIRED DOWN BUFFER TO BE CLEAN
488         PUSHJ   P,CAFRET
489         POP     P,A                     ;GET THE CHANNEL # BACK
490         JUMPL   A,NFCHN                 ;NO FREE CHANNELS?
491         MOVE    B,[.STATUS A]           ;MAKE A CALL TO STATUS TO FIND REASON
492         LSH     A,23.                   ;SHIFT THE CHANNEL NUMBER INTO RIGHT PLACE
493         IOR     B,A                     ;FIX UP .STATUS
494         XCT     B
495         MOVEI   B,0
496         PUSHJ   P,GFALS
497         JRST    FINIS                   ;RETURN A LOOSE WITH REASON FOR LOOSAGE
498
499 NFCHN:  ERRUUO  EQUOTE NO-ITS-CHANNELS-FREE
500
501 \f
502 MFUNCTION       IPCOFF,SUBR,[IPC-OFF]
503
504         ENTRY   0
505
506         PUSH    TP,$TVEC
507         MOVE    0,[IPCS1,,IPCS1]
508         PUSH    TP,0                    ;SAVE OUR PLACE IN RUNNING THROUGH SLOTS
509         PUSH    P,[1]                   ;COUNTER OF CHANNEL NUMBER
510
511 IPCOF1: MOVE    A,(TP)                  ;GET FIRST GOODIE
512         SKIPN   B,1(A)                  ;GET THE POINTER TO LIST
513         JRST    IPCOF2
514         SETZM   1(A)                    ;ZERO OUT SLOT TO BE CLEAN
515         MOVE    B,1(B)                  ;GET CAR OF LIST, PTR TO OPEN BLOCK
516         MOVE    C,(P)                   ;GET THE ACTUAL CHANNEL NUMBER
517         MOVEI   E,1                     ;TURN OFF INTERRUPT
518         LSH     E,(C)
519         ANDCAM  E,MASK2
520         .SUSET  [.SMSK2,,MASK2]
521         MOVE    A,C
522         PUSHJ   P,MCLOSE                ;CLOSE THIS CHANNEL
523         JFCL
524         MOVEI   A,BUFL+BUFHED           ;LENGTH OF WIRED STORE TO FREE UP
525         MOVE    B,1(B)                  ;GET THE POINTER TO WIRED STORE
526         PUSHJ   P,CAFRET                        ;FREE ALREADY
527 IPCOF2: MOVE    0,[2,,2]
528         ADDM    0,(TP)                  ;REST TO NEXT SLOT
529         AOS     D,(P)                   ;NEXT CHANNEL
530         CAIG    D,15.                   ;ARE WE THROUGH
531         JRST    IPCOF1
532         JRST    RTRUE                   ;RETURN HIM A TRUE FOR NICENESS
533
534 \f
535 IPCGOT: MOVEI   D,IPCS1+1
536         ADDI    D,(B)
537         ADDI    D,(B)
538         SKIPN   D,-74.(D)       ;GET THE GOODIE LIST FOR CHANNEL WE INTERRUPTED ON
539         JRST    DIRQ            ;MIX UP MAYBE, LET HIM WORRY ABOUT IT
540         PUSH    P,B             ;SAVE THE CHAN #
541         PUSH    TP,$TLIST
542         PUSH    TP,D            ;SAVE GOODIE LIST
543         MOVE    E,1(D)          ;GET PTR TO OPEN BLOCK
544         PUSH    P,2(E)          ;SAVE PTR TO WIRED BUFFER
545         MOVE    E,2(E)
546         MOVE    0,3(E)          ;GET THE MAGIC BITS FOR THIS MESSAGE
547         TLNE    0,CONT          ;IS THIS MESSAGE A CONTINUATION?
548         JRST    IGCON           ;YES
549         MOVEI   A,10.           ;NO
550         PUSHJ   P,GIBLOK        ;GET A BLOCK FOR FUNNY MESSAGE VECTOR
551         PUSH    TP,$TVEC
552         PUSH    TP,B            ;SAVE THE BLOCK FOR FUNNY MESSAGE VECTOR
553         MOVE    E,(P)           ;GET PTR TO WIRED BUFFER
554         MOVE    0,3(E)          ;GET THE MAGIC BITS AGAIN
555         HRRZ    A,0             ;GET THE LENGTH IN WORDS OF THIS THE WHOLE MESSAGE HE HAS
556         SUBI    A,1             ;MINUS ONE FOR THE TYPE WORD WHICH IS COUNTED
557         TLNE    0,ASCIMS        ;IS THIS ASCII?
558         SUBI    A,1             ;IF YES THEN MUST SUB 1 MORE FOR ASCII CHAR COUNT
559         CAILE   A,MAXMES        ;IS THIS BIGGER THAN MUDDLE BLESSES?
560         JRST    TBGMS           ;IF SO THEN CLEAN UP AND FORGET ABOUT THE LOOSER
561         PUSHJ   P,IBLOCK
562         MOVE    E,(P)
563         MOVE    D,(TP)
564         MOVE    0,(E)           ;GET HIS NAME 1 OUT OF MESSAGE
565         MOVEM   0,5(D)          ;STORE INTO SLOT IN FUNNY MESSAGE VECTOR
566         MOVE    0,1(E)          ;GET HIS NAME 2 OUT OF MESSAGE
567         MOVEM   0,7(D)
568         MOVE    0,4(E)          ;GET THE MESSAGE TYPE WORD
569         MOVEM   0,9(D)          ;STORE INTO SLOT IN MESSAGE VECTOR
570         MOVSI   0,TFIX
571         MOVE    0,4(D)
572         MOVE    0,6(D)
573         MOVE    0,8(D)
574         MOVE    0,3(E)          ;GET THE MESSAGE BITS
575         TLNE    0,ASCIMS        ;IS IT ASCII?
576         JRST    IG1             ;YES
577         MOVSI   0,TUVEC
578         MOVEM   0,(D)
579         MOVEM   0,2(D)
580         MOVEM   B,1(D)
581         MOVEM   B,3(D)          ;STORE MESSAGE BLANK TWICE, THE SECOND TO REST THROUGH
582         HLRE    E,B
583         SUBM    B,E
584         MOVSI   0,TFIX
585         MOVEM   0,(E)           ;SET NICE TYPE TO PRINT GOODER
586         JRST    IGBLT
587 IG1:    MOVSI   0,TUVEC
588         MOVEM   0,2(D)
589         MOVEM   B,3(D)          ;STORE MESSAGE BLANK AS UVECTOR TO REST THROUGH
590         HLRE    A,B
591         HRLI    B,010700        ;MAKE THE ILDB PTR
592         SUBI    B,1
593         MOVEM   B,1(D)          ;AND STORE IN THE SLOT
594         IMUL    A,[-5]          ;MAX CHAR COUNT FOR STRING
595         MOVE    B,5(E)          ;GET THE ACTUAL CHARACTER COUNT HE CLAIMED
596         MOVE    C,A
597         SUB     C,B             ;FIND DIFFERENCE BETWEEN MAX AND CLAIMED
598         JUMPL   C,.+2           ;IF COUNT TOO BIG, MUST DO BEST POSSIBLE AND USE MAX COUNT
599         CAILE   C,4             ;NO MORE THAN FOUR EXTRA CHARS IMPLIES GOODNESS
600         MOVE    B,A             ;IF LOSSAGE, THEN USE MAX COUNT INSTEAD OF HIS CLAIM
601         HRLI    B,TCHSTR        ;MAKE THIS A CHAR STRING TYPE WORD
602         MOVEM   B,(D)           ;AND FIX MESSAGE BLANK # 1 TO BE THE BLESSED STRING
603         JRST    IGBLT           ;BLT THE MESSAGE INTO THE BLANK
604
605 IGCON:  MOVE    D,(TP)          ;GET THE IPC SLOT LIST
606         MOVE    E,(P)           ;GET A PTR TO THE MESSAGE BUFFER
607         HRRZ    C,(D)           ;CDR THE IPC SLOT LIST TO POINT TO FIRST MESSAGE VECTOR
608 IGCON1: JUMPE   C,IGCONL        ;IF NIL, THEN ABANDON ALL HOPE
609         MOVE    B,1(C)          ;LOOK AT THE VECTOR
610         MOVE    0,5(B)          ;HIS NAME 1 FOR THIS BLOCK
611         CAME    0,(E)           ;COMPARE WITH HIS NAME 1 IN THIS MESSAGE
612         JRST    IGCON2          ;IMMEDIATE FAILURE, TRY THE NEXT IN THE LIST
613         MOVE    0,7(B)          ;SEE IF HIS NAME 2 ALSO MATCHES
614         CAME    0,1(E)          ;WELL, DOES IT MATCH?
615         JRST    IGCON2          ;NO, TRY THE NEXT ONE
616         PUSH    TP,$TVEC        ;WE GOT IT
617         PUSH    TP,1(C)         ;SAVE THIS MESSAGE BLOCK ON TP FOR LATER BLTING
618         HRRZ    C,(C)           ;CDR TO REST OF LIST
619         HRRM    C,(D)           ;AND SPLICE IT RIGHT OUT OF THE LIST, NEAT HUH?
620         JRST    IGBLT           ;GO BLT TO OUR HEART'S CONTENT
621 IGCON2: HRRZ    D,(D)           ;REST OUR FOLLOW UP POINTER
622         HRRZ    C,(C)           ;REST OUR ACTUAL TEST POINTER
623         JRST    IGCON1          ;TRY AGAIN
624
625 IGCONL: MOVE    A,(TP)
626         MOVE    A,1(A)          ;GET PTR TO OPEN BLOCK
627         MOVE    B,-1(P)
628         SUBI    B,36.           ;GET CHANNEL NUMBER
629         HLL     B,(A)
630         MOVE    C,(P)           ;GET THE WIRED BUFFER
631         SUB     P,[2,,2]        ;WE LOST SO CLEAN UP STACKS
632         SUB     TP,[2,,2]
633 ROPNL:  SETZM   (C)             ;REOPEN CHANNEL SO NOT PERMANENTLY CROGGLED
634         SETZM   1(C)            ;ZERO OUT THE HIS NAME SLOTS
635         MOVEI   0,BUFL
636         MOVEM   0,2(C)          ;RESET THE LENGTH FIELD IN WIRED BUF
637         DOTCAL  OPEN,[B,1(A),2(A),3(A),4(A)]
638         FATAL CANT REOPEN IPC CHN
639         JRST    DIRQ            ;LEFT IN NICE STATE AFTER LOOSAGE
640
641 TBGMS:  MOVE    A,-2(TP)
642         MOVE    A,1(A)          ;GET OPEN BLOCK
643         MOVE    B,-1(P)
644         SUBI    B,36.           ;CHANNEL #
645         HLL     B,(A)
646         MOVE    C,(P)           ;WIRED BUFFER
647         SUB     P,[2,,2]        ;CLEAN UP STACKS
648         SUB     TP,[4,,4]
649         JRST    ROPNL           ;REOPEN SO NEXT GUY CAN WIN
650
651 \f
652
653 IGBLT:  MOVE    E,(TP)          ;POINTER TO MESSAGE VECTOR
654         MOVE    E,3(E)          ;GET VECTOR (MAYBE STRING IN DISGUISE) TO BLT IN
655         MOVE    D,(P)           ;GET THE WIRED BUFFER
656         MOVEI   C,4(D)          ;GET A POINTER TO THE REST OF THE WIRED BUF
657         MOVEI   0,BUFL-1        ;KLUDGE TO IGNORE ONE EXTRA WORD OF BITS
658         SUB     0,2(D)          ;GET LENGTH OF GOODIE GOT
659         MOVE    A,3(D)          ;GET THE RANDOM MESSAGE BITS
660         TLNE    A,CONT          ;TEST FOR CONTINUED MESSAGE
661         JRST    .+7             ;IF SO THEN NO NEED TO WORRY
662         SOS     0
663         AOS     C               ;FIX UP FOR ONE LESS WORD TO WORRY WITH
664         TLNN    A,ASCIMS        ;TEST FOR ASCII MESSAGE
665         JRST    .+3             ;IF NOT THEN NO WORRY
666         SOS     0
667         AOS     C               ;FIX UP FOR YET 1 FEWER WORD
668         HLRE    A,E
669         MOVM    A,A             ;GET LENGTH OF VECTOR TO BLT INTO
670         CAILE   0,(A)           ;CHECK TO SEE WE DONT HAVE TOO MUCH
671         MOVE    0,A             ;IF WE HAVE TOO MUCH, CHOP OFF--HA, HA, HA
672         MOVEI   B,-1(E)
673         ADD     B,0             ;B POINTS TO LAST WORD TO BLT INTO
674         HRL     C,E             ;BLT POINTER
675         MOVSS   C               ;NDR CANT REMEMBER HOW TO BLT POINTER
676         BLT     C,(B)           ;VIOLA
677         HRL     0,0
678         MOVE    E,(TP)          ;GET BACK POINTER TO MESSAGE VECTOR
679         ADDM    0,3(E)          ;REST OFF TO KEEP TRACK OF INCOMPLETE MESSAGE
680         MOVE    A,3(D)          ;GET THE RANDOM MESSAGE BITS BACK
681         TLNE    A,INCOMP        ;MESSAGE COMPLETE?
682         JRST    IGHALF          ;INCOMPLETE
683         JRST    IGMES           ;COMPLETE
684
685 IGHALF: MOVE    C,-1(TP)        ;GOT TO SPLICE MESSAGE VECTOR BACK IN
686         MOVE    D,(TP)
687         PUSHJ   P,INCONS        ;STICK INTO PAIR SPACE
688         HRRZ    E,-2(TP)        ;PTR TO LIST
689         HRRZ    D,(E)           ;CDR OF LIST
690         HRRM    D,(B)           ;MAKE SPLICE
691         HRRM    B,(E)           ;THAT IT
692         MOVE    B,1(E)          ;POINT TO OPEN BLOCK
693         MOVE    0,-1(P)         ;GET CHAN #
694         SUBI    0,36.
695         HLL     0,(B)
696         MOVE    E,(P)           ;GET THE WIRED BUF
697         MOVEI   D,BUFL
698         MOVEM   D,2(E)          ;REFIX THE WIRED BUF
699         SETZM   (E)
700         SETZM   1(E)
701         DOTCAL  OPEN,[0,1(B),2(B),3(B),4(B)]
702         FATAL CANT REOPEN IPC CHN
703         SUB     P,[2,,2]
704         SUB     TP,[4,,4]       ;CLEAN OURSELVES
705         JRST    DIRQ            ;THATS ALL THERE IS TO IT
706
707 IGMES:  HRRZ    E,-2(TP)        ;PTR TO OUR KLUDGE LIST
708         MOVE    B,1(E)          ;PTR TO OPEN BLOCK
709         MOVE    0,-1(P)         ;CHANNEL #
710         SUBI    0,36.
711         HLL     0.(B)
712         MOVE    D,(P)           ;GET THE WIRED BUF
713         MOVEI   C,BUFL
714         MOVEM   C,2(D)
715         SETZM   (D)
716         SETZM   1(D)            ;BLESS WIRED BUF FOR REOPENING
717         DOTCAL  OPEN,[0,1(B),2(B),3(B),4(B)]
718         FATAL CANT REOPEN IPC CHN
719         MOVE    E,(TP)          ;GET THE MESSAGE VECTOR (ALIAS GOODIE BLOCK)
720         SUB     P,[2,,2]        ;BLESS OUR P STACK
721         PUSH    P,5(E)          ;SAVE SIXBIT HIS NAME 1
722         PUSH    P,7(E)          ;SAVE SIXBIT HIS NAME 2
723         SUB     TP,[4,,4]       ;BLESS THE TP STACK
724         PUSH    TP,$TCHSTR
725         PUSH    TP,CHQUOTE IPC
726         PUSH    TP,(E)          ;STUFF STUFF ON TO CALL INTERRUPT
727         PUSH    TP,1(E)         ;THAT IS THE ACTUAL MESSAGE
728         MOVE    0,9(E)
729         CAMN    0,[400000,,0]
730          JRST   IGUG
731 IGUGN:  PUSH    P,3(B)          ;GET MY NAME 1 OUT OF OPEN BLOCK
732         PUSH    P,4(B)          ;GET MY NAME 2 OUT OF OPEN BLOCK
733         MOVE    0,(B)           ;GET SOME OF THE RANDOM OPEN FLAGS
734         TLNE    0,USEUJ
735         SETZ    -1(P)           ;MAKE SURE WE HAVE INDICATOR IF THIS IS TO UNAME,JNAME
736         PUSH    TP,$TFIX
737         PUSH    TP,9(E)         ;SAVE THE MESSAGE TYPE
738         MOVE    A,-3(P)         ;HIS NAME 1
739         PUSHJ   P,6TOCHS
740         PUSH    TP,A
741         PUSH    TP,B            ;GIVE HIM NICE CHAR STRING OF ALL THE NAMES
742         MOVE    A,-2(P)
743         PUSHJ   P,6TOCHS
744         PUSH    TP,A
745         PUSH    TP,B            ;NICE CHAR STRING OF HIS NAME 2
746         SKIPN   A,-1(P)         ;ISE THIS DEFAULT UNAME, JNAME
747         JRST    IGFOUR          ;ONLY FOUR ARGS TO THE IPC INTERRUPT
748         PUSHJ   P,6TOCHS
749         PUSH    TP,A
750         PUSH    TP,B
751         MOVE    A,(P)
752         PUSHJ   P,6TOCHS
753         PUSH    TP,A
754         PUSH    TP,B            ;GIVE HIM CHAR STRINGS OF MY NAME 1 AND 2 IF NOT DEFAULT
755         MOVEI   E,7             ;FOR ACALL INDICATING 6 ARGS TO THE IPC INTERRUPT HANDLER
756         JRST    .+2             ;SKIP OVER FIX FOR ONLY 4 ARGS TO IPC INTERRUPT
757 IGFOUR: MOVEI   E,5
758         SUB     P,[4,,4]        ;CLEAN UP OUR WHOLE WORLD
759         ACALL   E,INTERR        ;THATS IT FOLKS, THE REAL THING
760         JRST    DIRQ
761
762 IGUG:   .SUSET  [.RMARPC,,0]
763         CAMN    0,[-1]
764          JRST   IGUGN           ; DISABLED, SO GO AWAY
765         SETZM   INTHLD          ; RE-ENABLEE INTERRUPTS
766         SUB     P,[2,,2]
767         MCALL   1,PARSE
768         SUB     TP,[2,,2]       ;FLUSH OFF STRING "IPC"
769         PUSH    TP,A
770         PUSH    TP,B
771         MCALL   1,EVAL
772         JRST    DIRQ
773
774 \f
775 IPCBLS: PUSH    P,A
776         PUSH    P,B
777         PUSH    P,C
778         PUSH    P,D
779         PUSH    P,E                     ;PARANOIA STRIKES AGAIN
780         PUSH    P,0
781         MOVEI   E,0                     ;CRETIN ASSEMBLER
782         .SUSET  [.SMARPC,,E]
783         MOVEI   E,IPCS1                 ;BLESSES ALL CURRENTLY OPEN IPC CHANNELS
784         MOVEI   0,1
785 IPCBL1: SKIPN   B,1(E)
786         JRST    IPCBL2
787         HLLZS   (B)                     ;CLEAR OUT ANY PARTIAL BUFFER WE MAY HAVE
788         HRRZ    B,1(B)                  ;GET A POINTER TO THE OPEN BLOCK
789         MOVE    A,0                     ;GET THE CHANNEL NUMBER
790         HLL     A,(B)
791         MOVE    C,2(B)                  ;GET A POINTER TO THE BUFFER    
792         MOVEI   D,BUFL                  ;TO FIX UP THE BUFFER
793         MOVEM   D,2(C)                  ;FIX LENGTH UP RIGHT
794         SETZM   (C)
795         SETZM   1(C)                    ;FIX UP THE READ FROM FIELDS
796         DOTCAL  OPEN,[A,1(B),2(B),3(B),4(B)]
797         FATAL IPC DEVICE LOST
798 IPCBL2: ADDI    E,2
799         ADDI    0,1
800         CAIG    0,15.
801         JRST    IPCBL1                  ;IF ANY MORE GO BLESS THEM
802
803         POP     P,0
804         POP     P,E
805         POP     P,D
806         POP     P,C
807         POP     P,B
808         POP     P,A
809         POPJ    P,
810
811
812
813
814 END
815 \f\ 3\f