1 TITLE IPC -- IPC COMMUNICATIONS HANDLER FOR MUDDLE
9 ;THIS PROGRAM HAS ENTRIES SEND, SEND-WAIT, IPC-OFF,
12 ;THESE HANDLE THE IPC DEVICE.
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
17 ; SEND (<HISNAME1> <HISNAME2> <MESSAGE> <MESSAGE-TYPE> <MYNAME1> <MYNAME2>)
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
26 ; SEND -- TRIES TO SEND IMMEDIATELY, ELSE RETURNS FALSE WITH MESSAGE
27 ; SEND-WAIT -- HANGS UNTIL MESSAGE CAN BE SENT
29 ; IPC-OFF -- NO ARGUMENTS, CLOSES ALL IPC-RECEIVE CHANNELS
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
37 \f; DEFINITIONS FOR STRUCTURE OF IPC BUFFER
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
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
51 ; DEFINITIONS OF BITS IN THE OPEN BLOCK FOR IPC DEVICE
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
60 ;BUFFERFORMAT: HISNAME1
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
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
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
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.
87 MFUNCTION IPCH,SUBR,[IPC-HANDLER]
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
95 GETYP E,(AB) ;CHECK TYPE OF FIRST ARG
96 CAIN E,TCHSTR ;IS IT A CHARACTER STRING
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
102 JRST WTYP2 ;IF NOT FIX COMPLAIN
104 CAIE A,TCHSTR ;HIS NAME 1 SHOULD BE CHAR STRING
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
115 JRST WTYP ;CHECK TO SEE THE MY NAME 1 IS STRING
118 JRST WTYP ;CHECK TO SEE THAT MY NAME 2 IS STRING
120 IPCH1: PUSH TP,$TCHAN
121 PUSH TP,TTOCHN+1 ;PUSH ON TTY OUTPUT CHANNEL TO CALL TERPRI
124 PUSH TP,CHQUOTE [IPC MESSAGE FROM ]
127 MCALL 2,PRINC ;PRINT OUT BLURB TO TELL LOOSER WHATS HAPPENING
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
133 PUSH TP,7(AB) ;OUTPUT NAME 2
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
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
144 PUSH TP,CHQUOTE [ EXECUTE]
145 PUSHJ P,TO ;TELL THE LOOSER HE IS GETTING WHAT HE DESERVES
147 IPCH2: PUSH TP,$TCHSTR
148 PUSH TP,CHQUOTE [ TYPE ]
151 PUSH TP,3(AB) ;PUSH ON THE MESSAGE TYPE
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
157 PUSH TP,CHQUOTE [ TO ]
160 PUSH TP,9.(AB) ;PUSH ON MY NAME 1
162 PUSHJ P,STO ;LEAVE SPACE BETWEEN NAMES
163 PUSH TP,10.(AB) ;PUSH ON MY NAME 2
166 IPCH4: PUSH TP,(AB) ;PUSH ON THE ACTUAL GOODIE
170 MCALL 2,PRINT ;AND PRINT IT OUT
171 SKIPN (P) ;TEST TO SEE IF WE MUST EXECUTE THIS BAG BITTER
175 MCALL 1,PARSE ;PARSE HIS CRUFT
178 MCALL 1,EVAL ;THEN EVAL THE RESULT
179 IPCHND: PUSH TP,$TCHAN
184 JRST FINIS ;TO RETURN WITH SOMETHING NICE
186 STO: PUSH TP,$TCHSTR ;CROCK TO OUTPUT A SPACE ON THE TTY OUTPUT CHANNEL
192 POPJ P, ;GO BACK TO WHAT WE WERE DOING
195 ;THESE ARE THE FUNCTIONS TO ACTUALLY STUFF GOODIES OUT
197 ;DESCRIPTION OF CALLING ARGS TO THEM IS AT THE
204 PUSH P,[0] ;FLAG TO INDICATE DONT WAIT
207 MFUNCTION SENDW,SUBR,[SEND-WAIT]
211 PUSH P,[1] ;FLAG TO INDICATE WAITING
214 CAMG 0,[-6] ;NEED AT LEAST 3 ARGS
215 CAMGE 0,[-12.] ;AND NOT MORE THAN 6 ARGS
219 PUSHJ P,STRTO6 ;POOF FIRST ARG TO SIXBIT
222 PUSHJ P,STRTO6 ;POOF SECOND ARG TO SIXBIT
225 JRST CASND1 ;IF FIRST ARG IS STRING, NO PROBLEMS
229 JRST WTYP3 ;ELSE MUST BE OF TYPE STORAGE OR UVEC
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
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
241 CAMLE 0,[-8.] ;IF 4 OR MORE ARGS GET THE MESS TYPE
243 GETYP 0,6(AB) ;CHECK TO SEE THAT TYPE IS A FIX
247 MOVEM 0,(P) ;SMASH IN THE SLOT RESERVED FOR TYPE
249 CAMN 0,[-10.] ;IF WE HAVE FIVE ARGS WE ARE A GLOBAL LOOSER NEED 4 OR 6
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
258 PUSHJ P,STRTO6 ;CONVERT MY NAME1 TO SIXBIT
260 MOVE B,11.(AB) ;CONVERT MY NAME 2 TO SIXBIT
263 CASND3: GETYP 0,-1(TP)
264 CAIE 0,TCHSTR ;IS THIS A CHAR STRING
266 HRRZ A,-1(TP) ;IF SO GET COUNT
268 IDIVI A,5 ;IF SO ROUND UP AND ADD ONE
271 MOVN A,A ;IF A VECTOR GET THE WORD COUNT
272 PUSH P,A ;SAVE COUNT OF WORDS
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
280 PUSH TP,B ;GET BUFFER OF RIGHT SIZE AND SAVE ON STACK
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
286 MOVEM C,1(B) ;STUFF HIS NAME 2
288 MOVEM C,4(B) ;STUFF MESSAGE TYPE CODE WORD
289 GETYP 0,-5(TP) ;IS THIS STRING OR UVECTOR?
292 MOVE C,(P) ;GET LENGTH OF CHAR STRING TO SEND
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
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
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?
325 JRST FINIS ;RETURN HIM SOMETHING NICE
327 TOBIGR: ERRUUO EQUOTE MESSAGE-TOO-BIG
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
340 MOVE B,-1(P) ;ELSE THE WHOLE MESSAGE FITS
344 HRLZ D,-4(TP) ;SET UP TO BLT UVECTOR
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
352 ADDM B,-4(TP) ;REST OFF THIS MUCH OF GOODIE FOR NEXT TIME
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
360 SUB D,C ;SEE HOW MANY EXTRA BLANKS AT END OF MESS
362 MOVEI D,0 ;NO EXTRA SPACES TO PAD
363 MOVE C,B ;NOT EXTRA SPACES, DO 5*WORD CHARS
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
374 IDPB 0,E ;STUFF A NULL IN RIGHT SPOT IN BUFFER
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
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
387 TLO A,SANDH ;SET SEND AND HANG FLAG
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
393 MOVEM 0,BSTO(PVP) ;IN CASE WE ARE INTERRUPTED OUT WE WANT TO WIN
394 SETZM E ;FLAG USED TO INDICATE NO SKIPPAGE
396 .OPEN 0,A ;WELL, THATS ALL THERE IS TO IT.
397 AOS E ;IF WE DONT SKIP WE HAVE PROBLEMS
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
405 PUSHJ P,GFALS ;MAKE A FALSE WITH THAT REASON
406 JRST FINIS ;GIVE THE MAGIC FALSE BACK TO THE LOOSER
409 MFUNCTION DEMSIG,SUBR
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
420 JRST RFALS ;DIDNT WIN WITH DEMON SIGNAL
425 RFALS: MOVSI A,TFALSE
427 JRST FINIS ;FALSE INDICATING LACK OF WINNAGE
430 MFUNCTION IPCON,SUBR,[IPC-ON]
434 PUSH P,[USEUJ,,0] ;FLAG FOR WHETHER OR NOT TO USE DEFAULT
436 JUMPE 0,IPCON1 ;NO ARGS ARE FINE
437 CAIE 0,-4 ;ELSE MUST HAVE 2 ARGS
439 SETZM (P) ;CLEAR OUR FLAG
442 PUSHJ P,STRTO6 ;GET SIXBIT OF OUR FIRST ARG
445 PUSHJ P,STRTO6 ;GET SIXBIT OF OUR SECOND ARG
447 IPCON1: PUSH P,[0] ;SAVE SLOT ON STACK FOR EVENNESS
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
453 MOVEM 0,2(A) ;FILL COUNT IN THE BUFFER SLOT
455 PUSHJ P,IBLOCK ;GET A BLOCK OF STORE FOR THE OPEN BLOCK
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/]
464 MOVEM 0,3(B) ;MY NAME 1
466 MOVEM 0,4(B) ;MY NAME 2 IF NOT USING DEFAULT
468 MOVEM 0,2(B) ;PTR TO THE WIRED BUFFER FOR STUFFING CRUFT
470 PUSHJ P,MOPEN ;GO DO THE OPEN
471 JRST IPCON3 ;OPEN FAILED, FIND OUT WHY
472 PUSH P,A ;SAVE THE CHANNEL NUMBER
474 LSH E,(A) ;SET INTERRUPT BITS RIGHT
476 .SUSET [.SMSK2,,MASK2]
478 MOVE D,(TP) ;GET THE OPEN BLOCK UVECTOR
479 PUSHJ P,INCONS ;THROW INTO PAIR SPACE
480 POP P,C ;GET THE CHANNEL #
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
487 MOVE B,-1(P) ;LETS FREE UP OUR WIRED DOWN BUFFER TO BE CLEAN
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
497 JRST FINIS ;RETURN A LOOSE WITH REASON FOR LOOSAGE
499 NFCHN: ERRUUO EQUOTE NO-ITS-CHANNELS-FREE
502 MFUNCTION IPCOFF,SUBR,[IPC-OFF]
507 MOVE 0,[IPCS1,,IPCS1]
508 PUSH TP,0 ;SAVE OUR PLACE IN RUNNING THROUGH SLOTS
509 PUSH P,[1] ;COUNTER OF CHANNEL NUMBER
511 IPCOF1: MOVE A,(TP) ;GET FIRST GOODIE
512 SKIPN B,1(A) ;GET THE POINTER TO LIST
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
520 .SUSET [.SMSK2,,MASK2]
522 PUSHJ P,MCLOSE ;CLOSE THIS CHANNEL
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
532 JRST RTRUE ;RETURN HIM A TRUE FOR NICENESS
535 IPCGOT: MOVEI D,IPCS1+1
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 #
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
546 MOVE 0,3(E) ;GET THE MAGIC BITS FOR THIS MESSAGE
547 TLNE 0,CONT ;IS THIS MESSAGE A CONTINUATION?
550 PUSHJ P,GIBLOK ;GET A BLOCK FOR FUNNY MESSAGE VECTOR
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
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
568 MOVE 0,4(E) ;GET THE MESSAGE TYPE WORD
569 MOVEM 0,9(D) ;STORE INTO SLOT IN MESSAGE VECTOR
574 MOVE 0,3(E) ;GET THE MESSAGE BITS
575 TLNE 0,ASCIMS ;IS IT ASCII?
581 MOVEM B,3(D) ;STORE MESSAGE BLANK TWICE, THE SECOND TO REST THROUGH
585 MOVEM 0,(E) ;SET NICE TYPE TO PRINT GOODER
589 MOVEM B,3(D) ;STORE MESSAGE BLANK AS UVECTOR TO REST THROUGH
591 HRLI B,010700 ;MAKE THE ILDB PTR
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
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
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
626 MOVE A,1(A) ;GET PTR TO OPEN BLOCK
628 SUBI B,36. ;GET CHANNEL NUMBER
630 MOVE C,(P) ;GET THE WIRED BUFFER
631 SUB P,[2,,2] ;WE LOST SO CLEAN UP STACKS
633 ROPNL: SETZM (C) ;REOPEN CHANNEL SO NOT PERMANENTLY CROGGLED
634 SETZM 1(C) ;ZERO OUT THE HIS NAME SLOTS
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
642 MOVE A,1(A) ;GET OPEN BLOCK
644 SUBI B,36. ;CHANNEL #
646 MOVE C,(P) ;WIRED BUFFER
647 SUB P,[2,,2] ;CLEAN UP STACKS
649 JRST ROPNL ;REOPEN SO NEXT GUY CAN WIN
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
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
667 AOS C ;FIX UP FOR YET 1 FEWER WORD
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
673 ADD B,0 ;B POINTS TO LAST WORD TO BLT INTO
675 MOVSS C ;NDR CANT REMEMBER HOW TO BLT POINTER
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
685 IGHALF: MOVE C,-1(TP) ;GOT TO SPLICE MESSAGE VECTOR BACK IN
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
692 MOVE B,1(E) ;POINT TO OPEN BLOCK
693 MOVE 0,-1(P) ;GET CHAN #
696 MOVE E,(P) ;GET THE WIRED BUF
698 MOVEM D,2(E) ;REFIX THE WIRED BUF
701 DOTCAL OPEN,[0,1(B),2(B),3(B),4(B)]
702 FATAL CANT REOPEN IPC CHN
704 SUB TP,[4,,4] ;CLEAN OURSELVES
705 JRST DIRQ ;THATS ALL THERE IS TO IT
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 #
712 MOVE D,(P) ;GET THE WIRED BUF
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
726 PUSH TP,(E) ;STUFF STUFF ON TO CALL INTERRUPT
727 PUSH TP,1(E) ;THAT IS THE ACTUAL MESSAGE
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
735 SETZ -1(P) ;MAKE SURE WE HAVE INDICATOR IF THIS IS TO UNAME,JNAME
737 PUSH TP,9(E) ;SAVE THE MESSAGE TYPE
738 MOVE A,-3(P) ;HIS NAME 1
741 PUSH TP,B ;GIVE HIM NICE CHAR STRING OF ALL THE NAMES
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
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
758 SUB P,[4,,4] ;CLEAN UP OUR WHOLE WORLD
759 ACALL E,INTERR ;THATS IT FOLKS, THE REAL THING
762 IGUG: .SUSET [.RMARPC,,0]
764 JRST IGUGN ; DISABLED, SO GO AWAY
765 SETZM INTHLD ; RE-ENABLEE INTERRUPTS
768 SUB TP,[2,,2] ;FLUSH OFF STRING "IPC"
779 PUSH P,E ;PARANOIA STRIKES AGAIN
781 MOVEI E,0 ;CRETIN ASSEMBLER
783 MOVEI E,IPCS1 ;BLESSES ALL CURRENTLY OPEN IPC CHANNELS
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
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
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
801 JRST IPCBL1 ;IF ANY MORE GO BLESS THEM