|
|
1.1 root 1: ; Copyright Barbara Liskov 1986
2:
3: x_buf = cluster is init, setup,
4: set_s0, set_s01, set_s01l1, set_s0123,
5: set_l0, set_l01, set_l0s23,
6: set_s45l3, set_s4567, set_l23, set_l2s67,
7: send_data, send_array, flush, receive, receive_data,
8: events,
9: get_lp0, get_lp1, get_lp2, get_lp3,
10: get_sp0, get_sp1, get_sp2, get_sp3, get_sp4, get_sp5,
11: get_bp10, get_bp11
12:
13: rep = null
14:
15: bufsize = 2048
16:
17: rsize = 24
18:
19: x_err = -1
20: x_reply = 0
21:
22: ExposeWindow = #0080
23: ExposeRegion = #0100
24: ExposeCopy = #0200
25: UnmapWindow = #2000
26: FocusChange = #4000
27:
28: args = -12
29: parms = 4
30:
31: sock_stream = 1
32: %fionread = #4004,,#667f
33:
34: wvec ev {11}
35: wvec obuf {513}
36: wvec ibuf {6}
37: wvec padbuf {1}
38: wvec reqcount {1}
39:
40: own fdesc
41: own bufptr
42: own bufmin
43: own bufmax
44:
45: init = proc (addr: _wordvec) signals (error(string))
46: clr -(sp)
47: moveq sock_stream,n1
48: move n1,-(sp)
49: movew 4(rr),n1
50: move n1,-(sp)
51: clr -(sp)
52: moveq %socket,n0
53: move n0,-(sp)
54: trap 0
55: bcs death
56: move n0,fdesc
57: move n0,4(sp)
58: move rr,n1
59: addq 4,n1
60: move n1,8(sp)
61: move (rr),n1
62: asr 1,n1
63: move n1,12(sp)
64: moveq %connect,n0
65: move n0,-(sp)
66: trap 0
67: ifcs
68: then move n0,n2
69: move fdesc,4(sp)
70: moveq %close,n0
71: move n0,-(sp)
72: trap 0
73: move n2,n0
74: death: lea 16(sp),sp
75: movea n0,rr
76: moveq 1,n0
77: lea 1(rr,rr),rr
78: _erstr(rr)
79: signal error(rr)
80: end
81: lea 16(sp),sp
82: clr -12(sp)
83: moveq 1,n0
84: clr reqcount
85: lea obuf,r1
86: subq 4,r1
87: move r1,bufmin
88: move r1,bufptr
89: adda bufsize,r1
90: move r1,bufmax
91: moveq 42,n1
92: move n1,ev
93: end init
94:
95: setup = qproc (code, func, mask, win: int)
96: movea bufptr,r1
97: moveq rsize,n2
98: add n2,bufptr
99: move bufmax,n3
100: iflt cmp bufptr,n3
101: then suba bufmin,r1
102: move r1,-(sp)
103: pea obuf
104: move fdesc,-(sp)
105: clr -(sp)
106: qloop
107: moveq %write,n0
108: move n0,-(sp)
109: trap 0
110: bcs oops
111: add n0,8(sp)
112: sub n0,12(sp)
113: bne this
114: end
115: lea 16(sp),sp
116: moveq 1,n0
117: movea bufmin,r1
118: move r1,bufptr
119: add n2,bufptr
120: end
121: addq 4,r1
122: move code,n1
123: asrw 1,n1
124: moveb n1,(r1)+
125: move func,n1
126: asrw 1,n1
127: moveb n1,(r1)+
128: move mask,n1
129: asr 1,n1
130: movew n1,(r1)+
131: move rr,n1
132: asr 1,n1
133: move n1,(r1)
134: addq 1,reqcount
135: return
136: oops: lea 16(sp),sp
137: movea n0,rr
138: moveq 1,n0
139: lea 1(rr,rr),rr
140: move ep,-(sp)
141: movea sp,ep
142: _erstr(rr)
143: movea (sp)+,ep
144: signal failure(rr)
145: end setup
146:
147: send_data = qproc (b: _bytevec, strt, z: int)
148: movea b,r1
149: move strt,n3
150: move (r1),n2
151: ifgt subq 3,n3
152: blt this
153: cmp n2,n3
154: then
155: bnds: signal failure("unhandled exception: bounds")
156: end
157: move rr,n1
158: blt bnds
159: move n1,n4
160: add n3,n4
161: cmp n2,n4
162: bhi bnds
163: ifeq asr 1,n1
164: then return
165: end
166: addq 3,n1
167: andib -4,n1
168: movea bufptr,r2
169: lea (r2,n1),r3
170: move bufmax,n4
171: asr 1,n3
172: lea 4(r1,n3),r1
173: ifge cmp r3,n4
174: then subq 1,n1
175: addq 4,r2
176: qloop
177: moveb (r1)+,(r2)+
178: dbra n1,this
179: end
180: movea n0,r1
181: move r3,bufptr
182: return
183: end
184: move r2,n3
185: sub bufmin,n3
186: move n3,-(sp)
187: pea obuf
188: move fdesc,-(sp)
189: clr -(sp)
190: qloop
191: moveq %write,n0
192: move n0,-(sp)
193: trap 0
194: bcs oops
195: add n0,8(sp)
196: sub n0,12(sp)
197: bne this
198: end
199: move bufmin,bufptr
200: move r1,8(sp)
201: move n1,12(sp)
202: qloop
203: moveq %write,n0
204: move n0,-(sp)
205: trap 0
206: bcs oops
207: add n0,8(sp)
208: sub n0,12(sp)
209: bne this
210: end
211: lea 16(sp),sp
212: clr -12(sp)
213: moveq 1,n0
214: movea n0,r1
215: return
216: oops: lea 16(sp),sp
217: clr -12(sp)
218: movea n0,rr
219: moveq 1,n0
220: movea n0,r1
221: lea 1(rr,rr),rr
222: move ep,-(sp)
223: movea sp,ep
224: _erstr(rr)
225: movea (sp)+,ep
226: signal failure(rr)
227: end send_data
228:
229: send_array = qproc (a: array[char], strt, z: int)
230: move rr,n1
231: iflt subq 3,n1
232: then ifeq addq 2,n1
233: then return
234: end
235: bnds: signal failure("unhandled exception: bounds")
236: end
237: movea a,r1
238: move strt,n2
239: sub dv%low(r1),n2
240: blt bnds
241: cmp dv%max(r1),n2
242: bgt bnds
243: add n2,n1
244: cmp dv%max(r1),n1
245: bgt bnds
246: move rr,n1
247: asr 1,n1
248: addq 3,n1
249: andib -4,n1
250: add n2,n2
251: movea dv%rel(r1),r1
252: lea 1(r1,n2),r1
253: movea bufptr,r2
254: lea (r2,n1),r3
255: move bufmax,n4
256: iflt cmp r3,n4
257: then move r2,n3
258: sub bufmin,n3
259: move n3,-(sp)
260: pea obuf
261: move fdesc,-(sp)
262: clr -(sp)
263: qloop
264: moveq %write,n0
265: move n0,-(sp)
266: trap 0
267: bcs oops
268: add n0,8(sp)
269: sub n0,12(sp)
270: bne this
271: end
272: lea 16(sp),sp
273: moveq 1,n0
274: movea bufmin,r2
275: lea (r2,n1),r3
276: end
277: addq 4,r2
278: subq 1,n1
279: qloop
280: move (r1)+,n4
281: moveb n4,(r2)+
282: dbra n1,this
283: end
284: move r3,bufptr
285: movea n0,r1
286: return
287: oops: lea 16(sp),sp
288: clr -12(sp)
289: movea n0,rr
290: moveq 1,n0
291: movea n0,r1
292: lea 1(rr,rr),rr
293: move ep,-(sp)
294: movea sp,ep
295: _erstr(rr)
296: movea (sp)+,ep
297: signal failure(rr)
298: end send_array
299:
300: set_s0 = qproc (s0: int)
301: movea bufptr,r1
302: move rr,n1
303: asr 1,n1
304: movew n1,args+0(r1)
305: end set_s0
306:
307: set_s01 = qproc (s0, s1: int)
308: movea bufptr,r1
309: move rr,n1
310: asr 1,n1
311: movew n1,args+2(r1)
312: move s0,n1
313: asr 1,n1
314: movew n1,args+0(r1)
315: end set_s01
316:
317: set_s01l1 = qproc (s0, s1, l1: int)
318: movea bufptr,r1
319: move rr,n1
320: asr 1,n1
321: move n1,args+4(r1)
322: move s1,n1
323: asr 1,n1
324: movew n1,args+2(r1)
325: move s0,n1
326: asr 1,n1
327: movew n1,args+0(r1)
328: end set_s01l1
329:
330: set_s0123 = qproc (s0, s1, s2, s3: int)
331: movea bufptr,r1
332: move rr,n1
333: asr 1,n1
334: movew n1,args+6(r1)
335: move s2,n1
336: asr 1,n1
337: movew n1,args+4(r1)
338: move s1,n1
339: asr 1,n1
340: movew n1,args+2(r1)
341: move s0,n1
342: asr 1,n1
343: movew n1,args+0(r1)
344: end set_s0123
345:
346: set_l0 = qproc (l0: int)
347: movea bufptr,r1
348: move rr,n1
349: asr 1,n1
350: move n1,args+0(r1)
351: end set_l0
352:
353: set_l01 = qproc (l0, l1: int)
354: movea bufptr,r1
355: move rr,n1
356: asr 1,n1
357: move n1,args+4(r1)
358: move l0,n1
359: asr 1,n1
360: move n1,args+0(r1)
361: end set_l01
362:
363: set_l0s23 = qproc (l0, s2, s3: int)
364: movea bufptr,r1
365: move rr,n1
366: asr 1,n1
367: movew n1,args+6(r1)
368: move s2,n1
369: asr 1,n1
370: movew n1,args+4(r1)
371: move l0,n1
372: asr 1,n1
373: move n1,args+0(r1)
374: end set_l0s23
375:
376: set_s45l3 = qproc (s4, s5, l3: int)
377: movea bufptr,r1
378: move rr,n1
379: asr 1,n1
380: move n1,args+12(r1)
381: move s5,n1
382: asr 1,n1
383: movew n1,args+10(r1)
384: move s4,n1
385: asr 1,n1
386: movew n1,args+8(r1)
387: end set_s45l3
388:
389: set_s4567 = qproc (s4, s5, s6, s7: int)
390: movea bufptr,r1
391: move rr,n1
392: asr 1,n1
393: movew n1,args+14(r1)
394: move s6,n1
395: asr 1,n1
396: movew n1,args+12(r1)
397: move s5,n1
398: asr 1,n1
399: movew n1,args+10(r1)
400: move s4,n1
401: asr 1,n1
402: movew n1,args+8(r1)
403: end set_s4567
404:
405: set_l23 = qproc (l2, l3: int)
406: movea bufptr,r1
407: move rr,n1
408: asr 1,n1
409: move n1,args+12(r1)
410: move l2,n1
411: asr 1,n1
412: move n1,args+8(r1)
413: end set_l23
414:
415: set_l2s67 = qproc (l2, s6, s7: int)
416: movea bufptr,r1
417: move rr,n1
418: asr 1,n1
419: movew n1,args+14(r1)
420: move s6,n1
421: asr 1,n1
422: movew n1,args+12(r1)
423: move l2,n1
424: asr 1,n1
425: move n1,args+8(r1)
426: end set_l2s67
427:
428: flush = qproc ()
429: move bufptr,n2
430: lea obuf,r2
431: ifgt cmp r2,n2
432: then sub bufmin,n2
433: move n2,-(sp)
434: move r2,-(sp)
435: move fdesc,-(sp)
436: clr -(sp)
437: qloop
438: moveq %write,n0
439: move n0,-(sp)
440: trap 0
441: bcs oops
442: add n0,8(sp)
443: sub n0,12(sp)
444: bne this
445: end
446: lea 16(sp),sp
447: moveq 1,n0
448: move bufmin,bufptr
449: end
450: return
451: oops: lea 16(sp),sp
452: movea n0,rr
453: moveq 1,n0
454: lea 1(rr,rr),rr
455: move ep,-(sp)
456: movea sp,ep
457: _erstr(rr)
458: movea (sp)+,ep
459: signal failure(rr)
460: end flush
461:
462: receive = proc () signals (error(string))
463: move bufptr,n2
464: lea obuf,r2
465: ifgt cmp r2,n2
466: then sub bufmin,n2
467: move n2,-(sp)
468: move r2,-(sp)
469: move fdesc,-(sp)
470: clr -(sp)
471: qloop
472: moveq %write,n0
473: move n0,-(sp)
474: trap 0
475: bcs oops
476: add n0,8(sp)
477: sub n0,12(sp)
478: bne this
479: end
480: lea 16(sp),sp
481: moveq 1,n0
482: move bufmin,bufptr
483: end
484: loop
485: moveq rsize,n2
486: lea ibuf,r1
487: move n2,-(sp)
488: move r1,-(sp)
489: move fdesc,-(sp)
490: clr -(sp)
491: moveq %read,n0
492: move n0,-(sp)
493: trap 0
494: bcs oops
495: cmp n0,n2
496: bne bad
497: lea 16(sp),sp
498: moveq 1,n0
499: ifeq tst (r1)
500: then return
501: end
502: ifne cmpi x_err,(r1)
503: then x_buf$%enq()
504: continue
505: end
506: moveq 0,n1
507: moveb parms+4(r1),n1
508: movea n1,rr
509: pea 1(rr,rr)
510: movea parms+0(r1),rr
511: pea 1(rr,rr)
512: moveb parms+5(r1),n1
513: movea n1,rr
514: pea 1(rr,rr)
515: moveb parms+6(r1),n1
516: movea n1,rr
517: pea 1(rr,rr)
518: movea parms+8(r1),rr
519: lea 1(rr,rr),rr
520: move parms+0(r1),n1
521: ifeq cmp reqcount,n1
522: then x_erstr(*, *, *, *, *)
523: signal error(rr)
524: end
525: x_erstr(*, *, *, *, *)
526: x_error(rr)
527: end
528: oops: lea 16(sp),sp
529: movea n0,rr
530: moveq 1,n0
531: lea 1(rr,rr),rr
532: _erstr(rr)
533: signal failure(rr)
534: bad: lea 16(sp),sp
535: moveq 1,n0
536: signal failure("incomplete message received")
537: end receive
538:
539: receive_data = proc (b: _bytevec)
540: move (rr),n2
541: asr 1,n2
542: move n2,-(sp)
543: pea 4(rr)
544: move fdesc,-(sp)
545: clr -(sp)
546: qloop
547: moveq %read,n0
548: move n0,-(sp)
549: trap 0
550: bcs oops
551: add n0,8(sp)
552: sub n0,12(sp)
553: bne this
554: end
555: ifne andib 3,n2
556: then move n2,12(sp)
557: move rr,8(sp)
558: qloop
559: moveq %read,n0
560: move n0,-(sp)
561: trap 0
562: bcs oops
563: add n0,8(sp)
564: sub n0,12(sp)
565: bne this
566: end
567: end
568: lea 16(sp),sp
569: clr -12(sp)
570: moveq 1,n0
571: return
572: oops: lea 16(sp),sp
573: clr -12(sp)
574: movea n0,rr
575: moveq 1,n0
576: lea 1(rr,rr),rr
577: _erstr(rr)
578: signal failure(rr)
579: end receive_data
580:
581: events = proc (need: bool)
582: var cnt
583: move bufptr,n2
584: lea obuf,r2
585: ifgt cmp r2,n2
586: then sub bufmin,n2
587: move n2,-(sp)
588: move r2,-(sp)
589: move fdesc,-(sp)
590: clr -(sp)
591: qloop
592: moveq %write,n0
593: move n0,-(sp)
594: trap 0
595: bcs oops
596: add n0,8(sp)
597: sub n0,12(sp)
598: bne this
599: end
600: lea 16(sp),sp
601: moveq 1,n0
602: move bufmin,bufptr
603: end
604: loop
605: again: pea cnt
606: move %fionread,-(sp)
607: move fdesc,-(sp)
608: clr -(sp)
609: moveq %ioctl,n0
610: move n0,-(sp)
611: trap 0
612: bcs oops
613: lea 16(sp),sp
614: ifeq tst cnt
615: then tst need
616: beq next
617: addq 1,cnt
618: end
619: clr need
620: moveq rsize,n2
621: qloop
622: move n2,-(sp)
623: lea ibuf,r1
624: move r1,-(sp)
625: move fdesc,-(sp)
626: clr -(sp)
627: moveq %read,n0
628: move n0,-(sp)
629: trap 0
630: bcs oops
631: lea 16(sp),sp
632: ifne cmp n0,n2
633: then moveq 1,n0
634: signal failure("incomplete message received")
635: end
636: moveq 1,n0
637: ifeq tst (r1)
638: then signal failure("protocol screwup")
639: end
640: ifeq cmpi x_err,(r1)
641: then moveq 0,n1
642: moveb parms+4(r1),n1
643: movea n1,rr
644: pea 1(rr,rr)
645: movea parms+0(r1),rr
646: pea 1(rr,rr)
647: moveb parms+5(r1),n1
648: movea n1,rr
649: pea 1(rr,rr)
650: moveb parms+6(r1),n1
651: movea n1,rr
652: pea 1(rr,rr)
653: movea parms+8(r1),rr
654: lea 1(rr,rr),rr
655: x_erstr(*, *, *, *, *)
656: x_error(rr)
657: bra again
658: end
659: x_buf$%enq()
660: moveq rsize,n2
661: sub n2,cnt
662: bgt this
663: end
664: end
665: lea 16(sp),sp
666: moveq 1,n0
667: return
668: oops: lea 16(sp),sp
669: movea n0,rr
670: moveq 1,n0
671: lea 1(rr,rr),rr
672: _erstr(rr)
673: signal failure(rr)
674: end events
675:
676: %enq = proc ()
677: lea ibuf,r1
678: lea ev,rr
679: move (r1),n1
680: add n1,n1
681: addq 1,n1
682: move n1,4(rr)
683: move parms(r1),n1
684: add n1,n1
685: addq 1,n1
686: move n1,24(rr)
687: move parms+12(r1),n1
688: add n1,n1
689: addq 1,n1
690: move n1,12(rr)
691: moveaw parms+6(r1),r2
692: lea 1(r2,r2),r2
693: move r2,20(rr)
694: move (r1),n1
695: ifne andiw ExposeWindow+ExposeRegion,n1
696: then moveaw parms+8(r1),r2
697: lea 1(r2,r2),r2
698: move r2,32(rr)
699: moveaw parms+10(r1),r2
700: lea 1(r2,r2),r2
701: move r2,40(rr)
702: moveaw parms+16(r1),r2
703: lea 1(r2,r2),r2
704: move r2,36(rr)
705: moveaw parms+18(r1),r2
706: lea 1(r2,r2),r2
707: move r2,28(rr)
708: elfeq move (r1),n1
709: andiw UnmapWindow+FocusChange+ExposeCopy,n1
710: then clrb 21(rr)
711: andib 1,22(rr)
712: moveaw parms+4(r1),r2
713: lea 1(r2,r2),r2
714: move r2,16(rr)
715: moveq 0,n2
716: movew parms+6(r1),n2
717: clrb n2
718: add n2,n2
719: addq 1,n2
720: move n2,8(rr)
721: moveaw parms+8(r1),r2
722: lea 1(r2,r2),r2
723: move r2,28(rr)
724: moveaw parms+10(r1),r2
725: lea 1(r2,r2),r2
726: move r2,36(rr)
727: moveaw parms+16(r1),r2
728: lea 1(r2,r2),r2
729: move r2,40(rr)
730: moveaw parms+18(r1),r2
731: lea 1(r2,r2),r2
732: move r2,32(rr)
733: end
734: x_input$enq(rr)
735: end %enq
736:
737: get_lp0 = qproc () returns (int)
738: lea ibuf,rr
739: movea parms+0(rr),rr
740: lea 1(rr,rr),rr
741: return(rr)
742: end get_lp0
743:
744: get_lp1 = qproc () returns (int)
745: lea ibuf,rr
746: movea parms+4(rr),rr
747: lea 1(rr,rr),rr
748: return(rr)
749: end get_lp1
750:
751: get_lp2 = qproc () returns (int)
752: lea ibuf,rr
753: movea parms+8(rr),rr
754: lea 1(rr,rr),rr
755: return(rr)
756: end get_lp2
757:
758: get_lp3 = qproc () returns (int)
759: lea ibuf,rr
760: movea parms+12(rr),rr
761: lea 1(rr,rr),rr
762: return(rr)
763: end get_lp3
764:
765: get_sp0 = qproc () returns (int)
766: lea ibuf,rr
767: moveaw parms+0(rr),rr
768: lea 1(rr,rr),rr
769: return(rr)
770: end get_sp0
771:
772: get_sp1 = qproc () returns (int)
773: lea ibuf,rr
774: moveaw parms+2(rr),rr
775: lea 1(rr,rr),rr
776: return(rr)
777: end get_sp1
778:
779: get_sp2 = qproc () returns (int)
780: lea ibuf,rr
781: moveaw parms+4(rr),rr
782: lea 1(rr,rr),rr
783: return(rr)
784: end get_sp2
785:
786: get_sp3 = qproc () returns (int)
787: lea ibuf,rr
788: moveaw parms+6(rr),rr
789: lea 1(rr,rr),rr
790: return(rr)
791: end get_sp3
792:
793: get_sp4 = qproc () returns (int)
794: lea ibuf,rr
795: moveaw parms+8(rr),rr
796: lea 1(rr,rr),rr
797: return(rr)
798: end get_sp4
799:
800: get_sp5 = qproc () returns (int)
801: lea ibuf,rr
802: moveaw parms+10(rr),rr
803: lea 1(rr,rr),rr
804: return(rr)
805: end get_sp5
806:
807: get_bp10 = qproc () returns (int)
808: lea ibuf,rr
809: moveq 0,n1
810: moveb parms+10(rr),n1
811: add n1,n1
812: addqb 1,n1
813: return(n1)
814: end get_bp10
815:
816: get_bp11 = qproc () returns (int)
817: lea ibuf,rr
818: moveq 0,n1
819: moveb parms+11(rr),n1
820: add n1,n1
821: addqb 1,n1
822: return(n1)
823: end get_bp11
824:
825: end x_buf
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.