|
|
1.1 ! root 1: ! 2: /* ! 3: * subroutine ! 4: */ ! 5: .org 3072 ! 6: seg3: ! 7: r_err_bus: ! 8: /* ! 9: * Unibus request fails to complete within 20 usec ! 10: * currently is not tested ! 11: */ ! 12: mov %err_bus,brg ! 13: mov brg,pcr ! 14: jmp err_bus ! 15: ! 16: rcv: ! 17: /* ! 18: * copy packets from C_RQ to C_RADDR (from host to host for XBLK) ! 19: * copy from C_RB to C_RADDR for ~XBLK ! 20: * input : r9 is the chan #, r8/r10 point to LTE ! 21: * Registers are used as follows: ! 22: * r15 - repmode ! 23: * r13(LSB), r12, r11 - ptr2 (RADDR) ! 24: * r9 - chan # ! 25: * r8/r10 - LTE address ! 26: * r7 - RQ ! 27: * r6(LSB), r5, r4(MSB) - stage 2 buffer ! 28: * r3 - plen ! 29: * r2 - len ! 30: */ ! 31: CHK(B5_ENT,5) ! 32: /* ! 33: mov repsave,mar ! 34: mov %repsave,%mar ! 35: mov r12,mem ! 36: */ ! 37: mov 0,brg ! 38: mov brg,r15 ! 39: mov repctl,mar ! 40: mov %repctl,%mar ! 41: mov 0,mem /* flag to indicate no CNTL rcv yet */ ! 42: /* ! 43: * set STIME if timer expires ! 44: */ ! 45: mov r8,%mar ! 46: mov C_Y,brg ! 47: add brg,r10,mar ! 48: mov mem,r0 ! 49: mov YEXPIRE,brg ! 50: orn brg,r0,- ! 51: brz 1f ! 52: br 2f ! 53: 1: mov STIME,brg ! 54: or brg,r15 ! 55: 2: ! 56: /* ! 57: * put RADDR into r13, r12, r11 ! 58: * put RQ/RB into r7 ! 59: * RQ and RADDR will be restored with the new value after the while loop ! 60: */ ! 61: mov C_X1,brg ! 62: add brg,r10,mar ! 63: mov mem,r0 ! 64: mov XBLK,brg ! 65: orn brg,r0,- ! 66: brz 1f ! 67: mov C_RB,brg ! 68: br 2f ! 69: 1: /* block mode */ ! 70: mov C_RQ,brg ! 71: 2: add brg,r10,mar ! 72: mov mem,r7 ! 73: brz r_ex2 ! 74: mov C_RADDR,brg ! 75: add brg,r10,mar ! 76: mov mem,r13|mar++ ! 77: mov mem,r12|mar++ ! 78: mov mem,r11 ! 79: r_while: ! 80: /* ! 81: * while ((C_RLEN>0) && (C_RQ!=NULL)) ! 82: */ ! 83: mov r7,r7 ! 84: brz r_endwhile ! 85: mov C_RLEN,brg ! 86: add brg,r10,mar ! 87: mov mem,r0 ! 88: mov mem,r2|mar++ ! 89: mov mem,r1 ! 90: or mem,r0 ! 91: dec r0,- ! 92: brz r_endwhile ! 93: /* ! 94: * len222 = len = min(plen,C_RLEN); ! 95: */ ! 96: QA(r7) ! 97: mov mem,mem|mar++ ! 98: mov mem,r3|mar++ /* plen */ ! 99: mov mem,idl|mar++ /* *pdata */ ! 100: dec r3,- /* test for rej packet */ ! 101: brz r_rq ! 102: /* ! 103: * r2,r1 -= len222 ! 104: */ ! 105: mov r8,%mar ! 106: mov C_RLEN,brg ! 107: add brg,r10,mar ! 108: mov r3,brg ! 109: sub brg,r2 ! 110: mov 0,brg ! 111: subc brg,r1 ! 112: brc 1f ! 113: /* ! 114: * case: plen > C_RLEN ! 115: * len = C_RLEN (r2) ! 116: * C_RLEN = 0 ! 117: * plen (r3) = plen - len ! 118: */ ! 119: mov mem,r2 ! 120: mov 0,mem|mar++ ! 121: mov 0,mem ! 122: CHK(B5_PLEN,5) ! 123: mov r2,brg ! 124: sub brg,r3 ! 125: br 2f ! 126: 1: ! 127: /* ! 128: * case: plen <= C_RLEN ! 129: * C_RLEN is now in r2, r1 ! 130: * len = plen (r3) ! 131: * plen = 0; ! 132: */ ! 133: mov r2,mem|mar++ ! 134: mov r1,mem ! 135: mov r3,brg ! 136: mov brg,r2 ! 137: sub brg,r3 /* plen = 0 */ ! 138: 2: ! 139: /* ! 140: * idl is the buffer index ! 141: * let r6-r4 points to pdata ! 142: */ ! 143: mov idl,brg ! 144: mov brg,r1 ! 145: BITA(r1,r6,r5,r4) ! 146: /* ! 147: * while (len--) *ptr2++ = *ptr1++; ! 148: * test 'r13' for even or odd first ! 149: */ ! 150: mov r13,brg ! 151: br0 r_odd ! 152: br r_even ! 153: r_odd: ! 154: /* ! 155: * copy one byte ! 156: */ ! 157: CHK(B5_ODD,5) ! 158: GETTWO(r6,r5,r4,r_err_bus) ! 159: dec r2 ! 160: mov idh,brg ! 161: br0 1f ! 162: br r_cnt1 /* cntl is rcv */ ! 163: 1: ! 164: mov idl,brg ! 165: mov brg,odl ! 166: mov brg,odh ! 167: PUTONE(r13,r12,r11,r_err_bus) ! 168: dec r2,- ! 169: brz r_done ! 170: r_even: ! 171: /* ! 172: * copy two bytes at a time ! 173: */ ! 174: mov 2,brg ! 175: sub brg,r2,- /* len - 2 */ ! 176: brc 1f ! 177: brz r_odd ! 178: br r_done ! 179: 1: ! 180: GETTWO(r6,r5,r4,r_err_bus) ! 181: dec r2 ! 182: mov idh,brg ! 183: br0 1f ! 184: br r_cnt1 /* cntl is rcv */ ! 185: 1: ! 186: mov idl,brg ! 187: mov brg,odl ! 188: GETTWO(r6,r5,r4,r_err_bus) ! 189: dec r2 ! 190: mov idh,brg ! 191: br0 1f ! 192: br r_cnt0 ! 193: 1: ! 194: mov idl,brg ! 195: mov brg,odh ! 196: PUTTWO(r13,r12,r11,r_err_bus) ! 197: br r_even ! 198: r_done: ! 199: /* ! 200: * this is the end of copy ! 201: * if (plen==0) ? ! 202: */ ! 203: dec r3,- ! 204: brz r_rq ! 205: /* ! 206: * plen != 0, move data to the front of the buffer ! 207: * while (plen--) *ptr2++ = *ptr1++ ! 208: * ptr2 in r13-11 (pdata[0]), ptr1 in r6-r4 (pdata[plen]) ! 209: */ ! 210: CHK(B5_MOVE,5) ! 211: mov tmp,mar ! 212: mov %tmp,%mar ! 213: mov r13,mem|mar++ ! 214: mov r12,mem|mar++ ! 215: mov r11,mem ! 216: QA(r7) ! 217: mov mem,mem|mar++ ! 218: mov r3,mem /* store plen */ ! 219: mov mem,idl|mar++ /* idl = plen */ ! 220: mov mem,r3 /* points to pdata[0] */ ! 221: BITA(r3,r13,r12,r11) ! 222: mov idl,brg ! 223: mov brg,r3 ! 224: r_move: ! 225: /* ! 226: * while (plen--) .... ! 227: */ ! 228: dec r3,- ! 229: brz r_ret ! 230: GETTWO(r6,r5,r4,r_err_bus) ! 231: mov idl,brg ! 232: mov brg,odl ! 233: mov idh,brg ! 234: mov brg,odh ! 235: PUTTWO(r13,r12,r11,r_err_bus) ! 236: dec r3 /* move 2-bytes: 1 9-bit envelop */ ! 237: br r_move ! 238: r_ret: ! 239: /* ! 240: * restore r13, r12, r11 ! 241: */ ! 242: mov tmp,mar ! 243: mov %tmp,%mar ! 244: mov mem,r13|mar++ ! 245: mov mem,r12|mar++ ! 246: mov mem,r11 ! 247: /* ! 248: * now test if cntl was rcv ! 249: */ ! 250: mov repctl,mar ! 251: mov %repctl,%mar ! 252: mov mem,r0 ! 253: dec r0,- ! 254: brc r_cnt3 /* rcv cntl flag set */ ! 255: br r_rp2 /* plen>0, then RLEN must be 0 */ ! 256: r_rq: ! 257: /* ! 258: * RQ = Pnext; ! 259: * release buffer and queue ! 260: * send echo or rej if pseq!=0 ! 261: */ ! 262: mov r7,brg ! 263: mov brg,r5 /* r5 = old RQ */ ! 264: QA(r5) ! 265: mov mem,r7|mar++ /* r7 = new RQ */ ! 266: mov 0,mem|mar++ /* plen = 0 */ ! 267: mov mem,r6 /* r6 = buf pointer */ ! 268: mov NIL,mem|mar++ ! 269: mov mem,r1 /* pseq */ ! 270: mov mem,r2 ! 271: mov 0,mem ! 272: FREEQ(r5) ! 273: IBEG(r6) ! 274: dec r1,- ! 275: brz r_rq2 ! 276: /* ! 277: * if pseq&0370 == I_SEQ: pseq += I_ECHO - I_SEQ; set SBLOCK ! 278: */ ! 279: mov ~WINDOW,brg ! 280: and brg,r2 ! 281: mov I_SEQ,brg ! 282: xor brg,r2 ! 283: dec r2,- ! 284: brc r_rq1 ! 285: mov WINDOW,brg ! 286: and brg,r1 ! 287: mov I_ECHO,brg ! 288: or brg,r1 /* r1 = ECHO + seq */ ! 289: /* ! 290: * if YBLOCK is set, set SBLOCK ! 291: */ ! 292: mov r8,%mar ! 293: mov C_Y,brg ! 294: add brg,r10,mar ! 295: mov mem,r0 ! 296: mov YBLOCK,brg ! 297: orn brg,r0,- ! 298: brz 1f ! 299: br r_rq1 ! 300: 1: ! 301: mov SBLOCK,brg ! 302: or brg,r15 /* reach end of a block */ ! 303: r_rq1: ! 304: CALL(send,s.send) ! 305: mov r8,%mar ! 306: mov C_C,brg ! 307: add brg,r10,mar ! 308: mov r1,mem ! 309: r_rq2: ! 310: mov repctl,mar ! 311: mov %repctl,%mar ! 312: mov mem,r0 ! 313: dec r0,- ! 314: brc r_cnt3 ! 315: r_report: ! 316: /* ! 317: * if C_RLEN==0 report(KS_RDB,r9) ! 318: */ ! 319: mov r8,%mar ! 320: mov C_RLEN,brg ! 321: add brg,r10,mar ! 322: mov mem,r0|mar++ ! 323: or mem,r0 ! 324: dec r0,- ! 325: brz r_rp2 ! 326: mov SBLOCK,brg ! 327: orn brg,r15,- ! 328: brz r_rp3 ! 329: br r_while ! 330: r_rp2: ! 331: mov SFULL,brg ! 332: or brg,r15 /* RLEN reaches 0 */ ! 333: r_rp3: ! 334: /* ! 335: * save r7 and r13,r12, r11 here ! 336: * report READ completion: code in r15. ! 337: */ ! 338: CHK(B5_REP,5) ! 339: mov r8,%mar ! 340: mov C_RLEN,brg ! 341: add brg,r10,mar ! 342: mov mem,r2 ! 343: mov 0,mem|mar++ ! 344: mov mem,r3 ! 345: mov 0,mem ! 346: mov %repinfo,%mar ! 347: mov repinfo,mar ! 348: mov KS_RDB,mem|mar++ ! 349: mov r2,mem|mar++ ! 350: mov r3,mem|mar++ ! 351: mov mem,mem|mar++ /* cntl char */ ! 352: mov r15,mem ! 353: CALL(report,s.report) ! 354: mov r8,%mar ! 355: br r_ex0 ! 356: r_endwhile: ! 357: /* ! 358: * Restore RADDR from r13, r12, r11 ! 359: * Restore RQ or RB (if ~XBLK) from r7 ! 360: */ ! 361: dec r15,- ! 362: brc r_rp3 ! 363: mov r8,%mar ! 364: mov C_RADDR,brg ! 365: add brg,r10,mar ! 366: mov r13,mem|mar++ ! 367: mov r12,mem|mar++ ! 368: mov r11,mem ! 369: r_ex0: ! 370: mov C_X1,brg ! 371: add brg,r10,mar ! 372: mov mem,r0 ! 373: mov XBLK,brg ! 374: orn brg,r0,- ! 375: brz 1f ! 376: mov C_RB,brg ! 377: br 2f ! 378: 1: /* block mode */ ! 379: mov C_RQ,brg ! 380: 2: add brg,r10,mar ! 381: mov r7,mem ! 382: r_exit: ! 383: CHK(B5_EXIT,5) ! 384: /* ! 385: mov repsave,mar ! 386: mov %repsave,%mar ! 387: mov mem,r12 ! 388: */ ! 389: RETURN(s.rcv) ! 390: r_ex2: ! 391: dec r15,- ! 392: brc r_rp3 ! 393: br r_exit ! 394: r_cnt0: ! 395: /* ! 396: * copy 1 byte to RADDR and report completion for SCNTL ! 397: */ ! 398: mov odl,brg ! 399: mov brg,odh ! 400: PUTONE(r13,r12,r11,r_err_bus) ! 401: r_cnt1: ! 402: /* ! 403: * len (r2) may not be 0 ! 404: * adjust RLEN and plen ! 405: */ ! 406: mov r2,brg ! 407: add brg,r3 ! 408: mov 0,r0 ! 409: inc r2 ! 410: mov r8,%mar ! 411: mov C_RLEN,brg ! 412: add brg,r10,mar ! 413: add mem,r2,mem|mar++ ! 414: addc mem,r0,mem ! 415: mov repctl,mar ! 416: mov %repctl,%mar ! 417: mov idl,mem ! 418: br r_done ! 419: r_cnt3: ! 420: /* ! 421: * prepare for report ! 422: */ ! 423: mov SCNTL,brg ! 424: or brg,r15 ! 425: br r_rp3 ! 426: ! 427: clean: ! 428: /* ! 429: * r2 is a queue pointer: release all queues/buffers ! 430: * using r0, r2, r3, brg, mar, %mar ! 431: */ ! 432: CHK(B5_AJAX,5) ! 433: c_1: ! 434: mov r2,brg ! 435: brz c_exit ! 436: mov brg,r0 ! 437: QA(r0) ! 438: mov mem,r2|mar++ /* pnext */ ! 439: mov 0,mem|mar++ /* plen */ ! 440: mov mem,r3 ! 441: mov NIL,mem|mar++ /* *pdata */ ! 442: mov 0,mem /* pseq */ ! 443: FREEQ(r0) ! 444: IBEG(r3) ! 445: br c_1 ! 446: c_exit: ! 447: RETURN(s.clean) ! 448: ! 449: send: ! 450: /* ! 451: * This subroutine sends a 1-byte (in r1) meta packet on chan r9 ! 452: */ ! 453: SENDHEAD(r9) ! 454: D422(4) ! 455: SENDDATA(D_WCNTL,r1) ! 456: D422(4) ! 457: SENDPACK(r1) ! 458: D422(4) ! 459: SENDCMD(D_READ) ! 460: RETURN(s.send) ! 461: ! 462: ! 463: report: ! 464: mov csr0,brg ! 465: br0 report /* csr0==3, loop forever */ ! 466: /* ! 467: * kin is 12 bytes: KS_SEND info 4 bytes ==> INCA(8) ! 468: * KS_RDB info 8 bytes ==> INCA(4) ! 469: * KS_EOI, KS_ERR info 6 bytes ==> INCA(6) ! 470: * r9 - channel # ! 471: * repinfo: code, lenlo, lenhi, cntl, mode ! 472: * r1, r12, r13 are saved and restored when exit ! 473: * this implementation is fast but use 70 more instructions than: ! 474: * have a loop to put info in repinfo to odl/odh for PUTTWO ! 475: * Modify HS and sbhead ! 476: * Interrupt cpu ! 477: * using r0, r1, r2, r9, r11, r12, r13, npr, mar, %mar, odl, odh, oal, oah, brg ! 478: */ ! 479: mov repsave,mar ! 480: mov %repsave,%mar ! 481: mov r1,mem|mar++ ! 482: mov r12,mem|mar++ ! 483: mov r13,mem|mar++ ! 484: mov sbhead,mar ! 485: mov %sbhead,%mar ! 486: mov mem,r13|mar++ ! 487: mov mem,r12|mar++ ! 488: mov mem,r11 ! 489: mov %repinfo,%mar ! 490: mov repinfo,mar ! 491: mov mem,odl ! 492: mov mem,r2 /* r2 = (repinfo) */ ! 493: mov kseq,mar ! 494: mov %kseq,%mar ! 495: mov mem,odh /* for debugging */ ! 496: mov mem,r0 ! 497: inc r0,mem ! 498: PUTTWO(r13,r12,r11,r_err_bus) ! 499: mov r9,brg ! 500: mov brg,odl /* chan# */ ! 501: PUTTWO(r13,r12,r11,r_err_bus) ! 502: mov KS_SEND,brg ! 503: addn brg,r2,- ! 504: brz rp2 ! 505: /* ! 506: * report is KS_RDB and others ! 507: */ ! 508: mov %replen,%mar ! 509: mov replen,mar ! 510: mov mem,odl|mar++ /* lenlo */ ! 511: mov mem,odh /* lenhi */ ! 512: PUTTWO(r13,r12,r11,r_err_bus) ! 513: mov %repctl,%mar ! 514: mov repctl,mar ! 515: mov mem,odl|mar++ ! 516: mov mem,odh ! 517: PUTTWO(r13,r12,r11,r_err_bus) ! 518: mov KS_RDB,brg ! 519: addn brg,r2,- ! 520: brz rp3 ! 521: br rp4 ! 522: rp2: ! 523: /* ! 524: * report is KS_SEND ! 525: */ ! 526: mov 8,brg ! 527: br rpy ! 528: rp2.5: ! 529: /* ! 530: * reset bit map for chan# in r9 ! 531: */ ! 532: mov 7,brg ! 533: and brg,r9,brg ! 534: mov brg,r0 ! 535: mov %bitpatt,%mar ! 536: mov bitpatt,brg ! 537: add brg,r0,mar ! 538: mov mem,r0 ! 539: mov r9,brg ! 540: mov 0,brg>> ! 541: mov 0,brg>> ! 542: mov 0,brg>> ! 543: mov brg,r2 ! 544: mov %timemap,%mar ! 545: mov timemap,brg ! 546: add brg,r2,mar ! 547: or mem,r0,mem /* turn bit on */ ! 548: xor mem,r0,mem /* turn bit off */ ! 549: br rp4 ! 550: rp3: ! 551: /* ! 552: * report was KS_RDB ! 553: * reset C_Y and RULEN ! 554: */ ! 555: mov r8,%mar ! 556: mov C_Y,brg ! 557: add brg,r10,mar ! 558: mov mem,r0 ! 559: mov 0,mem /* reset READ mode */ ! 560: mov C_RULEN,brg ! 561: add brg,r10,mar ! 562: mov 0,mem|mar++ ! 563: mov 0,mem ! 564: /* ! 565: * if YTIMACT, reset bit in timemap ! 566: */ ! 567: mov YTIMACT,brg ! 568: orn brg,r0,- ! 569: brz rp2.5 ! 570: rp4: ! 571: mov 4,brg ! 572: rpy: ! 573: /* ! 574: * brg: increment count ! 575: * Now modify HS and sbhead ! 576: * If HS==BUFSIZ-1, then HS=0 and sbhead=sbaddr ! 577: */ ! 578: mov brg,odl ! 579: mov HS,r0 ! 580: mov BUFSIZ-1,brg ! 581: sub brg,r0,- /* HS-(BUFSIZ-1) */ ! 582: brc 1f ! 583: inc r0,HS ! 584: INCA(r13,r12,r11,odl) ! 585: br 2f ! 586: 1: mov 0,brg /* reset HS */ ! 587: mov brg,HS ! 588: mov sbaddr,mar ! 589: mov %sbaddr,%mar ! 590: mov mem,r13|mar++ ! 591: mov mem,r12|mar++ ! 592: mov mem,r11 ! 593: 2: ! 594: /* ! 595: * Restore sbhead ! 596: */ ! 597: mov sbhead,mar ! 598: mov %sbhead,%mar ! 599: mov r13,mem|mar++ ! 600: mov r12,mem|mar++ ! 601: mov r11,mem|mar++ ! 602: /* ! 603: * Send interrupt 2 to the PDP-11 ! 604: */ ! 605: mov 0200,brg ! 606: mov brg,csr2 /* RDYO to csr2 for kmc.c */ ! 607: mov nprx,brg|r0 ! 608: br7 1f ! 609: mov BRQ|VEC4,brg ! 610: mov brg,nprx ! 611: 1: ! 612: /* ! 613: * restore r1, r12, r13 ! 614: */ ! 615: mov repsave,mar ! 616: mov %repsave,%mar ! 617: mov mem,r1|mar++ ! 618: mov mem,r12|mar++ ! 619: mov mem,r13|mar++ ! 620: RETURN(s.report) ! 621: ! 622: copy1: ! 623: /* ! 624: * r13 is set to (1<<0) and bit 6 (block/char mode) unchanged because: ! 625: * rblen == 0; c_ta0 == 0; rlen>0; raddr will become odd after copy1 ! 626: * r12.0 is 1; reset r12 when exit ! 627: * copy odl to raddr and restore r1 before return ! 628: * raddr is in oal, oah, r11 ! 629: * since rlen, raddr, rulen were changed for 2 bytes ! 630: * adjustments are needed here ! 631: */ ! 632: mov (1<<6),brg ! 633: and brg,r13 /* preserve block/char mode bit */ ! 634: mov r1,brg ! 635: mov brg,idh /* save r1 */ ! 636: mov odl,brg ! 637: mov brg,odh ! 638: SPUTONE(r11,r_err_bus) ! 639: mov r8,%mar ! 640: mov C_RLEN,brg ! 641: add brg,r10,mar ! 642: mov 1,r1|brg ! 643: or brg,r13 /* set bit 0 (radd odd) */ ! 644: mov 0,r0|brg ! 645: mov brg,r12 /* reset r12 */ ! 646: add mem,r1,mem|mar++ /* inc rlen */ ! 647: addc mem,r0,mem|mar++ ! 648: mov mem,r11 ! 649: dec r11,mem|mar++ /* dec raddr */ ! 650: mov mem,r11 ! 651: subc brg,r11,mem|mar++ ! 652: mov mem,r11 ! 653: subc brg,r11,mem|mar++ ! 654: mov mem,r11 ! 655: dec r11,mem|mar++ /* dec rulen */ ! 656: mov mem,r11 ! 657: subc brg,r11,mem|mar++ ! 658: /* ! 659: * restore r1 from idh and return ! 660: */ ! 661: mov idh,brg ! 662: mov brg,r1 ! 663: RETURN(s.copy1) ! 664: ! 665: cktimer: ! 666: /* ! 667: * check timer status: it is called from input routine: ! 668: * if char mode and channel # is changed or fifo is empty; ! 669: * if rulen>0 && rlen==0, reset rulen to 0, report SFULL, and return ! 670: * if (c_rb==nil && c_rulen==0) return; ! 671: * if (YTIME) set YEXPIRE or turn on timer ! 672: * call 'rcv' ! 673: * r1 has to be preserved ! 674: * r9: channel number ! 675: * using: r0, .... ! 676: */ ! 677: mov r8,%mar ! 678: mov C_RULEN,brg ! 679: add brg,r10,mar ! 680: mov mem,r2|mar++ ! 681: or mem,r2 ! 682: dec r2,- ! 683: brz ct_3 ! 684: /* ! 685: * if rlen==0, report SFULL ! 686: */ ! 687: mov C_RLEN,brg ! 688: add brg,r10,mar ! 689: mov mem,r0|mar++ ! 690: or mem,r0 ! 691: dec r0,- ! 692: brc ct_4 ! 693: mov %repinfo,%mar ! 694: mov repinfo,mar ! 695: mov KS_RDB,mem|mar++ ! 696: mov 0,mem|mar++ /* residue length */ ! 697: mov 0,mem|mar++ ! 698: mov 0,mem|mar++ /* cntl char */ ! 699: mov SFULL,mem /* mode */ ! 700: CALL(report,s.report) ! 701: br ct_9 ! 702: ct_3: ! 703: mov C_RB,brg ! 704: add brg,r10,mar ! 705: mov mem,brg ! 706: brz ct_9 ! 707: ct_4: ! 708: /* ! 709: * check if timeout mode ! 710: */ ! 711: mov C_Y,brg ! 712: add brg,r10,mar ! 713: mov mem,r0 ! 714: mov YTIME,brg ! 715: orn brg,r0,- ! 716: brz 1f ! 717: br ct_7 ! 718: 1: ! 719: mov YEXPIRE,brg ! 720: orn brg,r0,brg ! 721: brz ct_7 /* timer already expires */ ! 722: mov YTIMACT,brg ! 723: orn brg,r0,- ! 724: brz ct_7 /* timer already active */ ! 725: /* ! 726: * set timer active and load initial timer value ! 727: */ ! 728: or brg,r0,mem /* set YTIMACT */ ! 729: mov C_INITIM,brg ! 730: add brg,r10,mar ! 731: mov mem,r0 ! 732: mov C_ITIME,brg ! 733: add brg,r10,mar ! 734: dec r0,mem ! 735: brc ct_10 ! 736: /* ! 737: * timer expires: INITIM is 0 ! 738: */ ! 739: mov 0,mem ! 740: mov C_Y,brg ! 741: add brg,r10,mar ! 742: mov mem,r0 ! 743: mov YEXPIRE,brg ! 744: or brg,r0 ! 745: mov ~YTIMACT,brg ! 746: and brg,r0,mem ! 747: ct_7: ! 748: /* ! 749: * timer expires, call rcv ! 750: * save r1 here before calling 'rcv' ! 751: */ ! 752: mov %rcvsave,%mar ! 753: mov rcvsave,mar ! 754: mov r13,mem|mar++ ! 755: mov r12,mem|mar++ ! 756: mov r1,mem|mar++ ! 757: CALL(rcv,s.rcv) ! 758: mov %rcvsave,%mar ! 759: mov rcvsave,mar ! 760: mov mem,r13|mar++ ! 761: mov mem,r12|mar++ ! 762: mov mem,r1 ! 763: ct_9: ! 764: RETURN(s.cktimer) ! 765: ct_10: ! 766: /* ! 767: * timer not expire: turn on bitmap and set YTIMACT ! 768: */ ! 769: mov r9,brg ! 770: mov 7,r7 ! 771: and brg,r7 ! 772: mov 0,brg>> ! 773: mov 0,brg>> ! 774: mov 0,brg>> ! 775: mov brg,r0 ! 776: mov %bitpatt,%mar ! 777: mov bitpatt,brg ! 778: add brg,r7,mar ! 779: mov mem,r7 ! 780: mov %timemap,%mar ! 781: mov timemap,brg ! 782: add brg,r0,mar ! 783: or mem,r7,mem ! 784: br ct_7 ! 785: ! 786: strailer: ! 787: /* ! 788: * XNIL is set, send trailer-only on this channel ! 789: * chan# is not on 'outq' ! 790: * r9, r8/r10 is set up ! 791: * using r0, r1, r2, ... ! 792: */ ! 793: mov r8,%mar ! 794: mov C_S,brg ! 795: add brg,r10,mar ! 796: mov mem,r0 ! 797: mov I_SEQ,brg ! 798: or brg,r0,brg ! 799: mov brg,r1 ! 800: inc r0 ! 801: mov WINDOW,brg ! 802: and brg,r0,mem ! 803: mov C_X1,brg ! 804: add brg,r10,mar ! 805: mov mem,r0 ! 806: mov XBOTM,brg ! 807: orn brg,r0,- ! 808: brz 1f ! 809: mov I_BOT,brg ! 810: br 2f ! 811: 1: mov I_BOTM,brg ! 812: 2: mov brg,r2 ! 813: SENDHEAD(r9) ! 814: D422(4) ! 815: SENDDATA(D_WCNTL,r2) ! 816: D422(4) ! 817: SENDDATA(D_WDATA,0) ! 818: D422(4) ! 819: SENDDATA(D_WDATA,0) ! 820: D422(4) ! 821: SENDDATA(D_WCNTL,r1) ! 822: D422(4) ! 823: SENDPACK(r0) ! 824: D422(4) ! 825: SENDCMD(D_READ) ! 826: RETURN(s.strailer) ! 827: ! 828: /* ! 829: * end of segment 3 ! 830: */ ! 831: endseg3: ! 832: ! 833:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.