|
|
1.1 ! root 1: ; Copyright Barbara Liskov 1985 ! 2: ! 3: x_buf = cluster is init, ! 4: get, send_data, send_array, flush, receive, receive_data, ! 5: events, ! 6: get_lp0, get_lp1, get_lp2, get_lp3, ! 7: get_sp0, get_sp1, get_sp2, get_sp3, get_sp4, get_sp5, ! 8: get_bp10, get_bp11 ! 9: ! 10: rep = null ! 11: ! 12: bufsize = 2048 ! 13: ! 14: rsize = 24 ! 15: ! 16: x_err = -1 ! 17: x_reply = 0 ! 18: ! 19: ExposeWindow = #0080 ! 20: ExposeRegion = #0100 ! 21: ExposeCopy = #0200 ! 22: UnmapWindow = #2000 ! 23: FocusChange = #4000 ! 24: ! 25: rcode = 16 ! 26: parms = 20 ! 27: ! 28: sock_stream = 1 ! 29: %fionread = #4004,,#667f ! 30: ! 31: wvec ev {11} ! 32: wvec wbuf {4} ! 33: wvec pbuf {5} ! 34: wvec obuf {513} ! 35: wvec ibuf {10} ! 36: wvec padbuf {1} ! 37: ! 38: own bufptr ! 39: own bufmin ! 40: own bufmax ! 41: own reqcount ! 42: ! 43: init = proc (addr: _wordvec) signals (error(string)) ! 44: movl pbuf,pp ! 45: movl 3,(pp) ! 46: movzwl 4(rr),4(pp) ! 47: movq sock_stream,8(pp) ! 48: chmk %socket ! 49: bcs death ! 50: movl n0,r1 ! 51: movl r1,4(pp) ! 52: addl 4,rr,8(pp) ! 53: movzwl (rr),12(pp) ! 54: ifcs chmk %connect ! 55: then movl n0,n1 ! 56: movl 1,(pp) ! 57: chmk %close ! 58: movl n1,n0 ! 59: death: _erstr(n0) ! 60: signal error(rr) ! 61: end ! 62: movl wbuf,n1 ! 63: movl 3,(n1) ! 64: movl r1,4(n1) ! 65: movl ibuf,n1 ! 66: movl 3,(n1) ! 67: movl r1,4(n1) ! 68: addl rcode,n1,8(n1) ! 69: movl rsize,12(n1) ! 70: movl pbuf,n1 ! 71: movl 3,(n1) ! 72: movl r1,4(n1) ! 73: movl %fionread,8(n1) ! 74: addl 16,n1,12(n1) ! 75: clrl reqcount ! 76: subl 4,obuf,bufmin ! 77: movl bufmin,bufptr ! 78: addl bufmin,bufsize,bufmax ! 79: movl 10,@ev ! 80: end init ! 81: ! 82: get = qproc () returns (oreq, ereq) ! 83: movl bufptr,rr ! 84: addl rsize,bufptr ! 85: ifgtr cmpl bufptr,bufmax ! 86: then movl wbuf,pp ! 87: movl obuf,8(pp) ! 88: subl bufmin,rr,12(pp) ! 89: qloop ! 90: chmk %write ! 91: bcs oops ! 92: addl n0,8(pp) ! 93: subl n0,12(pp) ! 94: bneq this ! 95: end ! 96: movl bufmin,rr ! 97: addl rsize,rr,bufptr ! 98: end ! 99: movl (sp),pp ! 100: addl 2,rr,(sp) ! 101: incl reqcount ! 102: jmp (pp) ! 103: oops: pushl ep ! 104: movl sp,ep ! 105: _erstr(n0) ! 106: movl (sp)+,ep ! 107: signal failure(rr) ! 108: end get ! 109: ! 110: send_data = qproc (b: _bytevec, strt, z: int) ! 111: movq strt,r1 ! 112: movzwl (r2),n1 ! 113: if sobgeq r1,next ! 114: then ! 115: bnds: signal failure("unhandled exception: bounds") ! 116: end ! 117: iflss cmpl r1,n1 ! 118: then tstl rr ! 119: bleq check ! 120: addl r1,rr,n0 ! 121: cmpl n0,n1 ! 122: bgtr bnds ! 123: addl 3,rr ! 124: bicb 3,rr ! 125: movl bufptr,r3 ! 126: addl rr,r3,r4 ! 127: ifleq cmpl r4,bufmax ! 128: then movc rr,4(r2)[r1],4(r3) ! 129: movl r4,bufptr ! 130: return ! 131: end ! 132: movl wbuf,pp ! 133: movl obuf,8(pp) ! 134: subl bufmin,r3,12(pp) ! 135: qloop ! 136: chmk %write ! 137: bcs oops ! 138: addl n0,8(pp) ! 139: subl n0,12(pp) ! 140: bneq this ! 141: end ! 142: movl bufmin,bufptr ! 143: movab 4(r2)[r1],8(pp) ! 144: movl rr,12(pp) ! 145: qloop ! 146: chmk %write ! 147: bcs oops ! 148: addl n0,8(pp) ! 149: subl n0,12(pp) ! 150: bneq this ! 151: end ! 152: return ! 153: end ! 154: bgtr bnds ! 155: check: tstl rr ! 156: bneq bnds ! 157: return ! 158: oops: pushl ep ! 159: movl sp,ep ! 160: pushl rr ! 161: _erstr(n0) ! 162: movl (sp)+,rr ! 163: movl (sp)+,ep ! 164: signal failure(rr) ! 165: end send_data ! 166: ! 167: send_array = qproc (a: array[char], strt, z: int) ! 168: ifleq tstl rr ! 169: then ifeql ! 170: then return ! 171: end ! 172: bnds: signal failure("unhandled exception: bounds") ! 173: end ! 174: movq strt,r1 ! 175: subl dv%low(r2),r1 ! 176: cmpl r1,dv%size(r2) ! 177: bgtru bnds ! 178: addl rr,r1,n3 ! 179: cmpl n3,dv%size(r2) ! 180: bgtr bnds ! 181: moval @dv%rel(r2)[r1],n3 ! 182: addl 3,rr ! 183: bicb 3,rr ! 184: movl bufptr,r3 ! 185: addl rr,r3,r4 ! 186: ifgtr cmpl r4,bufmax ! 187: then movl wbuf,pp ! 188: movl obuf,8(pp) ! 189: subl bufmin,r3,12(pp) ! 190: qloop ! 191: chmk %write ! 192: bcs oops ! 193: addl n0,8(pp) ! 194: subl n0,12(pp) ! 195: bneq this ! 196: end ! 197: movl bufmin,r3 ! 198: end ! 199: addl 4,r3 ! 200: qloop ! 201: cvtlb (n3)+,(r3)+ ! 202: sobgtr rr,this ! 203: end ! 204: subl 4,r3,bufptr ! 205: return ! 206: oops: pushl ep ! 207: movl sp,ep ! 208: pushl rr ! 209: _erstr(n0) ! 210: movl (sp)+,rr ! 211: movl (sp)+,ep ! 212: signal failure(rr) ! 213: end send_array ! 214: ! 215: flush = qproc () ! 216: ifgtr cmpl bufptr,obuf ! 217: then movl wbuf,pp ! 218: movl obuf,8(pp) ! 219: subl bufmin,bufptr,12(pp) ! 220: qloop ! 221: chmk %write ! 222: bcs oops ! 223: addl n0,8(pp) ! 224: subl n0,12(pp) ! 225: bneq this ! 226: end ! 227: movl bufmin,bufptr ! 228: end ! 229: return ! 230: oops: pushl ep ! 231: movl sp,ep ! 232: _erstr(n0) ! 233: movl (sp)+,ep ! 234: signal failure(rr) ! 235: end flush ! 236: ! 237: receive = proc () signals (error(string)) ! 238: ifgtr cmpl bufptr,obuf ! 239: then movl wbuf,pp ! 240: movl obuf,8(pp) ! 241: subl bufmin,bufptr,12(pp) ! 242: qloop ! 243: chmk %write ! 244: bcs oops ! 245: addl n0,8(pp) ! 246: subl n0,12(pp) ! 247: bneq this ! 248: end ! 249: movl bufmin,bufptr ! 250: end ! 251: loop ! 252: movl ibuf,pp ! 253: chmk %read ! 254: bcs oops ! 255: cmpl n0,rsize ! 256: bneq bad ! 257: ifeql tstl rcode(pp) ! 258: then return ! 259: end ! 260: ifneq cmpl rcode(pp),x_err ! 261: then x_buf$%enq() ! 262: continue ! 263: end ! 264: cvtbl parms+4(pp),-(sp) ! 265: pushl parms+0(pp) ! 266: cvtbl parms+5(pp),-(sp) ! 267: cvtbl parms+6(pp),-(sp) ! 268: movl parms+8(pp),rr ! 269: ifeql cmpl parms+0(pp),reqcount ! 270: then x_erstr(*, *, *, *, *) ! 271: signal error(rr) ! 272: end ! 273: x_erstr(*, *, *, *, *) ! 274: x_error(rr) ! 275: end ! 276: oops: _erstr(n0) ! 277: signal failure(rr) ! 278: bad: signal failure("incomplete message received") ! 279: end receive ! 280: ! 281: receive_data = proc (b: _bytevec) ! 282: movl wbuf,pp ! 283: addl 4,rr,8(pp) ! 284: movzwl (rr),12(pp) ! 285: qloop ! 286: chmk %read ! 287: bcs oops ! 288: addl n0,8(pp) ! 289: subl n0,12(pp) ! 290: bneq this ! 291: end ! 292: ifneq bicl -4,(rr),n0 ! 293: then subl n0,4,12(pp) ! 294: movl padbuf,8(pp) ! 295: qloop ! 296: chmk %read ! 297: bcs oops ! 298: addl n0,8(pp) ! 299: subl n0,12(pp) ! 300: bneq this ! 301: end ! 302: end ! 303: return ! 304: oops: _erstr(n0) ! 305: signal failure(rr) ! 306: end receive_data ! 307: ! 308: events = proc (need: bool) ! 309: var cnt ! 310: ifgtr cmpl bufptr,obuf ! 311: then movl wbuf,pp ! 312: movl obuf,8(pp) ! 313: subl bufmin,bufptr,12(pp) ! 314: qloop ! 315: chmk %write ! 316: bcs oops ! 317: addl n0,8(pp) ! 318: subl n0,12(pp) ! 319: bneq this ! 320: end ! 321: movl bufmin,bufptr ! 322: end ! 323: loop ! 324: again: movl pbuf,pp ! 325: chmk %ioctl ! 326: bcs oops ! 327: ifeql movl 16(pp),cnt ! 328: then movl need,cnt ! 329: beql next ! 330: end ! 331: clrl need ! 332: qloop ! 333: movl ibuf,pp ! 334: chmk %read ! 335: bcs oops ! 336: ifneq cmpl n0,rsize ! 337: then signal failure("incomplete message received") ! 338: end ! 339: ifeql tstl rcode(pp) ! 340: then signal failure("protocol screwup") ! 341: end ! 342: ifeql cmpl rcode(pp),x_err ! 343: then cvtbl parms+4(pp),-(sp) ! 344: pushl parms+0(pp) ! 345: cvtbl parms+5(pp),-(sp) ! 346: cvtbl parms+6(pp),-(sp) ! 347: movl parms+8(pp),rr ! 348: x_erstr(*, *, *, *, *) ! 349: x_error(rr) ! 350: br again ! 351: end ! 352: x_buf$%enq() ! 353: subl rsize,cnt ! 354: bgtr this ! 355: end ! 356: end ! 357: return ! 358: oops: _erstr(n0) ! 359: signal failure(rr) ! 360: end events ! 361: ! 362: %enq = proc () ! 363: movl ibuf,pp ! 364: movl ev,rr ! 365: movl rcode(pp),4(rr) ! 366: movl parms+0(pp),24(rr) ! 367: movl parms+12(pp),12(rr) ! 368: movzwl parms+6(pp),20(rr) ! 369: ifneq bitw ExposeWindow+ExposeRegion,rcode(pp) ! 370: then cvtwl parms+8(pp),32(rr) ! 371: cvtwl parms+10(pp),40(rr) ! 372: cvtwl parms+16(pp),36(rr) ! 373: cvtwl parms+18(pp),28(rr) ! 374: elfeql bitw UnmapWindow+FocusChange+ExposeCopy,rcode(pp) ! 375: then clrb 21(rr) ! 376: movzwl parms+4(pp),16(rr) ! 377: movzwl parms+6(pp),8(rr) ! 378: clrb 8(rr) ! 379: cvtwl parms+8(pp),28(rr) ! 380: cvtwl parms+10(pp),36(rr) ! 381: cvtwl parms+16(pp),40(rr) ! 382: cvtwl parms+18(pp),32(rr) ! 383: end ! 384: x_input$enq(rr) ! 385: end %enq ! 386: ! 387: get_lp0 = qproc () returns (int) ! 388: movl ibuf,rr ! 389: movl parms+0(rr),rr ! 390: return(rr) ! 391: end get_lp0 ! 392: ! 393: get_lp1 = qproc () returns (int) ! 394: movl ibuf,rr ! 395: movl parms+4(rr),rr ! 396: return(rr) ! 397: end get_lp1 ! 398: ! 399: get_lp2 = qproc () returns (int) ! 400: movl ibuf,rr ! 401: movl parms+8(rr),rr ! 402: return(rr) ! 403: end get_lp2 ! 404: ! 405: get_lp3 = qproc () returns (int) ! 406: movl ibuf,rr ! 407: movl parms+12(rr),rr ! 408: return(rr) ! 409: end get_lp3 ! 410: ! 411: get_sp0 = qproc () returns (int) ! 412: movl ibuf,rr ! 413: cvtwl parms+0(rr),rr ! 414: return(rr) ! 415: end get_sp0 ! 416: ! 417: get_sp1 = qproc () returns (int) ! 418: movl ibuf,rr ! 419: cvtwl parms+2(rr),rr ! 420: return(rr) ! 421: end get_sp1 ! 422: ! 423: get_sp2 = qproc () returns (int) ! 424: movl ibuf,rr ! 425: cvtwl parms+4(rr),rr ! 426: return(rr) ! 427: end get_sp2 ! 428: ! 429: get_sp3 = qproc () returns (int) ! 430: movl ibuf,rr ! 431: cvtwl parms+6(rr),rr ! 432: return(rr) ! 433: end get_sp3 ! 434: ! 435: get_sp4 = qproc () returns (int) ! 436: movl ibuf,rr ! 437: cvtwl parms+8(rr),rr ! 438: return(rr) ! 439: end get_sp4 ! 440: ! 441: get_sp5 = qproc () returns (int) ! 442: movl ibuf,rr ! 443: cvtwl parms+10(rr),rr ! 444: return(rr) ! 445: end get_sp5 ! 446: ! 447: get_bp10 = qproc () returns (int) ! 448: movl ibuf,rr ! 449: cvtbl parms+10(rr),rr ! 450: return(rr) ! 451: end get_bp10 ! 452: ! 453: get_bp11 = qproc () returns (int) ! 454: movl ibuf,rr ! 455: cvtbl parms+11(rr),rr ! 456: return(rr) ! 457: end get_bp11 ! 458: ! 459: end x_buf
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.