Annotation of researchv8dc/sys/kdi/input.s, revision 1.1

1.1     ! root        1: 
        !             2: /*
        !             3:  * Input Segment
        !             4:  */
        !             5:        .org    2048
        !             6: seg2:
        !             7: in:
        !             8:        CHK(B2_ENT,2)           /* check point */
        !             9:        SENDCMD(D_READ)         /* for dr11-c version */
        !            10: 
        !            11: i_csrtst:
        !            12: /*
        !            13:  * While there is data in the receiver fifo
        !            14:  * copy it out
        !            15:  * While (dkcsr & DKRDONE) {
        !            16:  */
        !            17:        READDATA(i_disp)
        !            18: /*
        !            19:  * Scan for the 1st word of a packet where a channel #
        !            20:  * in the low byte and DKMARK in the hi byte
        !            21:  * If not the packet marker, just throw it away and repeat
        !            22:  */
        !            23:        mov     ILO,r9          /* read chan # */
        !            24:        mov     IHI,brg         /* read hi byte and strobe */
        !            25:        br1     i_mark
        !            26:        DELAY(3)
        !            27:        br      i_csrtst
        !            28:  
        !            29: i_mk4:
        !            30: /*
        !            31:  * a data in odl left over from last chan# (r9)
        !            32:  */
        !            33:        CALL(copy1,s.copy1)
        !            34:        br      i_mk7
        !            35: i_mk5:
        !            36: /*
        !            37:  * for char mode, check for timeout
        !            38:  */
        !            39:        CALL(cktimer,s.cktimer)
        !            40:        br      i_mk8
        !            41: i_mk6:
        !            42: /*
        !            43:  * see a DKMARK again
        !            44:  * r13 and r12 can't be destroyed elsewhere e.g. 'rcv'
        !            45:  */
        !            46:        mov     r1,brg
        !            47:        addn    brg,r9,-
        !            48:        brz     i_lp0
        !            49:        mov     r12,brg
        !            50:        br0     i_mk4           /* copy the left-over byte in odl */
        !            51: i_mk7:
        !            52: /*
        !            53:  * if the previous channel was in char mode and timeout mode,
        !            54:  * then do timeout processing
        !            55:  */
        !            56:        asl     r13,brg
        !            57:        br7     i_mk5           /* char mode */
        !            58: i_mk8:
        !            59:        mov     r1,brg
        !            60:        mov     brg,r9
        !            61: i_mark:
        !            62: /*
        !            63:  * We found the 1st word, the channel # is in r9
        !            64:  * If the channel # is 377 (all 1's), that means
        !            65:  * probably power failed or module fell out of bin
        !            66:  */
        !            67:        dec     r9,-
        !            68:        brz     i_incomp
        !            69:        mov     CHANMODS,brg
        !            70:        sub     brg,r9,-        /* chan# - CHANMODS */
        !            71:        brc     i_incomp
        !            72:        GLTE(r9)                /* set up r8/r10 */
        !            73: /*
        !            74:  * r13: a global flag in input.s
        !            75:  * bit 7 - RBLEN > 0 (or C_RB != NULL)
        !            76:  * bit 6 - char mode
        !            77:  * bit 4 - C_TA0 != 0
        !            78:  * bit 1 - RLEN == 0
        !            79:  * bit 0 - RADDR is odd
        !            80:  * r12: a global flag in input.s
        !            81:  * bit 0 - odl has the 1st byte of a pair
        !            82:  * r15: report mode
        !            83:  */
        !            84:        mov     0,brg
        !            85:        mov     brg,r13
        !            86:        mov     brg,r12
        !            87:        mov     C_RB,brg
        !            88:        add     brg,r10,mar
        !            89:        mov     mem,brg
        !            90:        brz     1f
        !            91:        mov     (1<<7),brg
        !            92:        or      brg,r13
        !            93: 1:
        !            94:        mov     C_X1,brg
        !            95:        add     brg,r10,mar
        !            96:        mov     mem,r0
        !            97:        mov     XBLK,brg
        !            98:        orn     brg,r0,-
        !            99:        brz     1f
        !           100:        mov     (1<<6),brg
        !           101:        or      brg,r13
        !           102: 1:
        !           103:        mov     C_TA0,brg
        !           104:        add     brg,r10,mar
        !           105:        mov     mem,r0
        !           106:        dec     r0,-
        !           107:        brz     1f
        !           108:        mov     (1<<4),brg
        !           109:        or      brg,r13
        !           110: 1:
        !           111:        mov     C_RLEN,brg
        !           112:        add     brg,r10,mar
        !           113:        mov     mem,r0|mar++
        !           114:        or      mem,r0,r0|mar++
        !           115:        dec     r0,-
        !           116:        brc     1f
        !           117:        mov     (1<<1),brg
        !           118:        or      brg,r13
        !           119: 1:
        !           120:        mov     mem,brg
        !           121:        br0     1f
        !           122:        br      i_loop
        !           123: 1:
        !           124:        mov     (1<<0),brg
        !           125:        or      brg,r13
        !           126: i_lp0:
        !           127: /*
        !           128:  * add possible delay for null byte
        !           129:  */
        !           130:        DELAY(0)
        !           131:        D422(1)
        !           132: i_loop:
        !           133: /*
        !           134:  * main loop to read the rest of the packet
        !           135:  * see if a control envelop or data envelop
        !           136:  */
        !           137:        D422(0)
        !           138:        READDATA(i_id6)
        !           139:        mov     ILO,r1
        !           140:        mov     IHI,brg
        !           141:        br1     i_mk6           /* see DKMARK again */
        !           142:        br0     i_data
        !           143: /*
        !           144:  * A good control envelop is detected for chan # (in r9)
        !           145:  * control data in r1
        !           146:  * if 1 <= r1 <= 010, interface module cntl
        !           147:  * if 010 <= r1 <= 077, protocol cntl
        !           148:  * if 0100 <= r1 <= 0177, user cntl
        !           149:  * if r1 >= 0200, supervision cntl
        !           150:  */
        !           151:        dec     r1,-
        !           152:        brz     i_lp0           /* null byte */
        !           153:        CHK(B2_CNTL,2)          /* check point */
        !           154: /*
        !           155:  * if r12.0 call copy1, adjust r13
        !           156:  */
        !           157:        mov     r12,brg
        !           158:        br0     i_lp4
        !           159: i_lp2:
        !           160:        mov     r1,brg
        !           161:        br7     i_tdkcl
        !           162:        mov     0277,brg        /* 6-th bit is not set */
        !           163:        or      brg,r1,brg
        !           164:        brz     i_ucntl
        !           165: /*
        !           166:  * this is a protocol cntl char
        !           167:  * r5 = r1 & WINDOW
        !           168:  * r0 = r1 & 0370
        !           169:  */
        !           170:        mov     0370,brg
        !           171:        and     brg,r1,brg
        !           172:        mov     brg,r0
        !           173:        mov     WINDOW,brg
        !           174:        and     brg,r1,brg
        !           175:        mov     brg,r5
        !           176: /*
        !           177:  * switch (r0) {
        !           178:  *     case .....
        !           179:  */
        !           180:        mov     I_SEQ,brg
        !           181:        addn    brg,r0,-
        !           182:        brz     i_seq
        !           183:        mov     I_ECHO,brg
        !           184:        addn    brg,r0,-
        !           185:        brz     i_echo
        !           186:        mov     I_ACK,brg
        !           187:        addn    brg,r0,-
        !           188:        brz     i_ack
        !           189:        mov     I_BOT,brg
        !           190:        addn    brg,r0,-
        !           191:        brz     i_050
        !           192:        mov     I_REJ,brg
        !           193:        addn    brg,r0,-
        !           194:        brz     i_rej
        !           195:        mov     I_AINIT,brg
        !           196:        addn    brg,r1,-
        !           197:        brz     i_ainit
        !           198:        mov     I_INIT1,brg
        !           199:        addn    brg,r1,-
        !           200:        brz     i_init
        !           201:        mov     I_INIT0,brg
        !           202:        addn    brg,r1,-
        !           203:        brz     i_init
        !           204: i_umeta:
        !           205: /*
        !           206:  * un-recognized meta char
        !           207:  */
        !           208: /*
        !           209:        ERROR(E_UMETA)
        !           210:  */
        !           211:        br      i_loop
        !           212: i_tdkcl:
        !           213: /*
        !           214:  * code overflow to output.s
        !           215:  */
        !           216:        mov     %ii_tdkcl,brg
        !           217:        mov     brg,pcr
        !           218:        jmp     ii_tdkcl
        !           219: 
        !           220: i_ucntl:
        !           221: /*
        !           222:  * rcv a user cntl char
        !           223:  * if (r12.0) then copy odl to raddr first
        !           224:  * set idh to 0 and goto id9
        !           225:  */
        !           226:        CHK1(B2_SUP,2)
        !           227:        mov     0,brg
        !           228:        mov     brg,idh                 /* indicate cntl */
        !           229:        br      i_id9                   /* copy to C_RB */
        !           230: 
        !           231: i_lp4:
        !           232:        CALL(copy1,s.copy1)
        !           233:        br      i_lp2
        !           234: 
        !           235: i_050:
        !           236:        mov     sw050,brg
        !           237:        br      (add,brg,r5),%sw050
        !           238: sw050:
        !           239:        br      i_bot
        !           240:        br      i_botm
        !           241:        br      i_bots
        !           242:        br      i_soi
        !           243:        br      i_eoi
        !           244:        br      i_enq
        !           245:        br      i_check
        !           246:        br      i_initreq
        !           247: i_init:
        !           248: /*
        !           249:  * code overflow to output.s
        !           250:  */
        !           251:        mov     %ii_init,brg
        !           252:        mov     brg,pcr
        !           253:        jmp     ii_init
        !           254: i_ainit:
        !           255: /*
        !           256:  * code overflow to output.s
        !           257:  */
        !           258:        mov     %ii_ainit,brg
        !           259:        mov     brg,pcr
        !           260:        jmp     ii_ainit
        !           261: i_initreq:
        !           262: /*
        !           263:  * code overflow to output.s
        !           264:  */
        !           265:        mov     %ii_req,brg
        !           266:        mov     brg,pcr
        !           267:        jmp     ii_req
        !           268: i_enq:
        !           269: /*
        !           270:  * code overflow to output.s
        !           271:  */
        !           272:        mov     %ii_enq,brg
        !           273:        mov     brg,pcr
        !           274:        jmp     ii_enq
        !           275: i_check:
        !           276: /*
        !           277:  * code overflow to output.s
        !           278:  */
        !           279:        mov     %ii_check,brg
        !           280:        mov     brg,pcr
        !           281:        jmp     ii_check
        !           282: 
        !           283: i_bot:
        !           284: i_botm:
        !           285: i_bots:
        !           286: i_soi:
        !           287: /*
        !           288:  * TA0 = r1; TA1 = 0;
        !           289:  */
        !           290:        CHK(B4_BOT,4)
        !           291:        mov     r8,%mar
        !           292:        mov     C_TA0,brg
        !           293:        add     brg,r10,mar
        !           294:        mov     r1,mem|mar++
        !           295:        mov     0,mem
        !           296:        mov     (1<<4),brg
        !           297:        or      brg,r13
        !           298:        br      i_loop
        !           299: i_eoi:
        !           300: /*
        !           301:  * code overflow to output.s
        !           302:  */
        !           303:        mov     %ii_eoi,brg
        !           304:        mov     brg,pcr
        !           305:        jmp     ii_eoi
        !           306: 
        !           307: i_rej:
        !           308: /*
        !           309:  * if XENQ is set, then treat this REJ as ECHO
        !           310:  * otherwise ignore this REJ
        !           311:  */
        !           312:        mov     r8,%mar
        !           313:        mov     C_X1,brg
        !           314:        add     brg,r10,mar
        !           315:        mov     mem,r0
        !           316:        mov     ~XENQ,brg
        !           317:        or      brg,r0,-
        !           318:        brz     i_ec0           /* XENQ is set, no ECHO was rcv */
        !           319:        br      i_loop          /* ignore this REJ */
        !           320: i_echo:
        !           321: /*
        !           322:  * R = r5;
        !           323:  * if ((S-R-1)&07 < (S-A-1)&07) {
        !           324:  *     len1 = r5 - A;
        !           325:  *     X &= ~XREJ; A = r5;
        !           326:  *     if (len1==0) goto i_rej1;
        !           327:  *     len2 = (len1)*DKBLOCK;
        !           328:  *     ......
        !           329:  * }
        !           330:  */
        !           331:        CHK(B3_ECHO,3)
        !           332:        mov     r8,%mar
        !           333:        mov     C_X1,brg
        !           334:        add     brg,r10,mar
        !           335:        mov     mem,r0
        !           336:        mov     ~XENQ,brg
        !           337: i_ec0:
        !           338:        and     brg,r0,mem      /* reset XENQ */
        !           339:        mov     C_S,brg
        !           340:        add     brg,r10,mar
        !           341:        mov     mem,r3
        !           342:        mov     mem,r4|mar++            /* r4, r3 = S */
        !           343:        mov     r5,mem                  /* R = r5 */
        !           344:        addn    mem,r4,r4|mar++         /* r4 = S-R-1 */
        !           345:        addn    mem,r3                  /* r3 = S-A-1 */
        !           346:        mov     WINDOW,brg
        !           347:        and     brg,r4
        !           348:        and     brg,r3,brg
        !           349:        sub     brg,r4,-
        !           350:        brc     i_rej1                  /* (S-R-1) >= (S-A-1) */
        !           351: i_gack:
        !           352:        mov     mem,r2                  /* r2 = old A */
        !           353:        mov     r5,mem                  /* A = r5 */
        !           354:        mov     C_X1,brg
        !           355:        add     brg,r10,mar
        !           356:        mov     mem,r0
        !           357:        mov     ~XREJ,brg
        !           358:        and     brg,r0,mem              /* X &= ~XREJ */
        !           359: /*
        !           360:  * if XLEN==0 and XCNTL==0, xmit is inactive, discard this ECHO/REJ
        !           361:  */
        !           362:        mov     C_XLEN,brg
        !           363:        add     brg,r10,mar
        !           364:        mov     mem,r0|mar++
        !           365:        or      mem,r0
        !           366:        dec     r0,-
        !           367:        brc     1f
        !           368:        mov     C_XCNTL,brg
        !           369:        add     brg,r10,mar
        !           370:        mov     mem,r0
        !           371:        dec     r0,-
        !           372:        brz     i_xnil                  /* check if trailer only mode */
        !           373: 1:
        !           374:        mov     r2,brg
        !           375:        sub     brg,r1,brg
        !           376:        mov     brg,r2                  /* r2 = r1 - old A */
        !           377:        mov     WINDOW,brg
        !           378:        and     brg,r2                  /* r2 = len1 */
        !           379:        dec     r2,-
        !           380:        brz     i_rej1
        !           381:        mov     DKBLOCK,brg
        !           382:        mov     brg,r3
        !           383:        TIMES(r2,r3,r7,r6)              /* r7/6 (len2) = r2 * r3 */
        !           384: /*
        !           385:  * if (len2>XLEN) { XLEN=0; report; }
        !           386:  * else if (len2=XLEN) { XLEN=0; report if ~XCNTL; }
        !           387:  * else if (len2<XLEN) { XLEN -= len2; XADDR =+ len2; }
        !           388:  */
        !           389:        mov     C_XLEN,brg
        !           390:        add     brg,r10,mar
        !           391:        mov     mem,r3
        !           392:        mov     r6,brg
        !           393:        sub     brg,r3,mem
        !           394:        mov     mem,r0|mar++
        !           395:        mov     mem,r4
        !           396:        mov     r7,brg
        !           397:        subc    brg,r4,mem
        !           398:        brc     i_ec2           /* XLEN >= len2 */
        !           399: i_ec1:
        !           400: /*
        !           401:  * This chan has done the transmission
        !           402:  * remove chan# from 'outq' and report
        !           403:  */
        !           404:        mov     C_XLEN,brg
        !           405:        add     brg,r10,mar
        !           406:        mov     0,mem|mar++
        !           407:        mov     0,mem
        !           408:        mov     C_XCNTL,brg
        !           409:        add     brg,r10,mar
        !           410:        mov     0,mem
        !           411:        mov     %repinfo,%mar
        !           412:        mov     repinfo,mar
        !           413:        mov     KS_SEND,mem
        !           414:        CALL(report,s.report)
        !           415: /*
        !           416:  * remove chan# from 'outq'
        !           417:  * r2: running ptr of outq, r3: next ptr in outq, r4: ptr of outq1
        !           418:  */
        !           419:        mov     outq,mar
        !           420:        mov     %outq,%mar
        !           421:        mov     mem,r2
        !           422: 0:
        !           423:        brz     6f
        !           424:        QA(r2)
        !           425:        mov     mem,r3
        !           426:        mov     NIL,mem|mar++
        !           427:        addn    mem,r9,-
        !           428:        brz     5f
        !           429:        mov     outq1,mar
        !           430:        mov     %outq1,%mar
        !           431: 1:
        !           432:        mov     mem,r4
        !           433:        brz     2f
        !           434:        QA(r4)
        !           435:        br      1b
        !           436: 2:     /* put r2 at the end of outq1 */
        !           437:        mov     r2,mem
        !           438: 3:     /* put r3 to r2 */
        !           439:        mov     r3,brg
        !           440:        mov     brg,r2
        !           441:        br      0b
        !           442: 5:     /* delete this chan# */
        !           443:        FREEQ(r2)
        !           444:        br      3b
        !           445: 6:     /* restore outq from outq1 */
        !           446:        mov     outq1,mar
        !           447:        mov     %outq1,%mar
        !           448:        mov     mem,brg
        !           449:        mov     outq,mar
        !           450:        mov     %outq,%mar
        !           451:        mov     brg,mem|mar++
        !           452:        mov     NIL,mem
        !           453:        mov     r8,%mar
        !           454:        br      i_rej1
        !           455: i_ec2:
        !           456: /*
        !           457:  * len2 <= XLEN
        !           458:  */
        !           459:        or      mem,r0,r0|mar++
        !           460:        dec     r0,-
        !           461:        brc     i_ec3           /* len2 < XLEN */
        !           462: /*
        !           463:  * len2 = XLEN: check if XCNTL is user cntl
        !           464:  */
        !           465:        mov     C_XCNTL,brg
        !           466:        add     brg,r10,mar
        !           467:        mov     mem,r0
        !           468:        mov     0300,brg
        !           469:        and     brg,r0
        !           470:        mov     0100,brg
        !           471:        addn    brg,r0,-
        !           472:        brz     i_rej1          /* don't report */
        !           473:        br      i_ec1
        !           474: i_ec3:
        !           475: /*
        !           476:  * len2 < XLEN
        !           477:  * C_XADDR += len2;
        !           478:  */
        !           479:        mov     0,r0
        !           480:        add     mem,r6,mem|mar++
        !           481:        addc    mem,r7,mem|mar++
        !           482:        addc    mem,r0,mem
        !           483: i_rej1:
        !           484: /*
        !           485:  * if REJ && (X&XREJ==0)
        !           486:  */
        !           487:        mov     ~I_REJ,brg
        !           488:        or      brg,r1,brg
        !           489:        brz     1f
        !           490:        br      i_loop
        !           491: 1:
        !           492:        mov     C_X1,brg
        !           493:        add     brg,r10,mar
        !           494:        mov     mem,r0
        !           495:        mov     ~XREJ,brg
        !           496:        or      brg,r0,-
        !           497:        brz     i_loop          /* if REJ had been rcv, ignore this REJ */
        !           498: i_grej:
        !           499: /*
        !           500:  * rcv a REJ: S=(r5+1)&WINDOW, X |= XREJ;
        !           501:  */
        !           502:        CHK1(B3_REJ,3)
        !           503:        inc     r5
        !           504:        mov     C_S,brg
        !           505:        add     brg,r10,mar
        !           506:        mov     WINDOW,brg
        !           507:        and     brg,r5,mem
        !           508:        mov     C_X1,brg
        !           509:        add     brg,r10,mar
        !           510:        mov     XREJ,brg
        !           511:        mov     brg,r0
        !           512:        or      mem,r0,mem
        !           513: /*
        !           514:  * if XNIL, call strailer, else loop
        !           515:  */
        !           516:        mov     ~XNIL,brg
        !           517:        or      brg,r0,-
        !           518:        brz     1f
        !           519:        br      i_loop
        !           520: 1:
        !           521:        CALL(strailer,s.strailer)
        !           522:        br      i_loop
        !           523: i_xnil:
        !           524: /*
        !           525:  * if XNIL, report completion, else loop
        !           526:  */
        !           527:        mov     C_X1,brg
        !           528:        add     brg,r10,mar
        !           529:        mov     mem,r0
        !           530:        mov     XNIL,brg
        !           531:        orn     brg,r0,-
        !           532:        brz     1f
        !           533:        br      i_loop                  /* rcv suspicious ECHO */
        !           534: 1:     xor     brg,r0,mem              /* reset XNIL bit */
        !           535:        br      i_ec1                   /* report KS_SEND */
        !           536: 
        !           537: i_ack:
        !           538: /*
        !           539:  * if (r5!=A) goto i_gack;
        !           540:  * if ((X&XREJ) == 0)) goto i_grej;
        !           541:  * break;
        !           542:  */
        !           543:        CHK(B3_ACK,3)
        !           544:        mov     r8,%mar
        !           545:        mov     C_X1,brg
        !           546:        add     brg,r10,mar
        !           547:        mov     mem,r4
        !           548:        mov     ~XACK,brg
        !           549:        and     brg,r4,mem
        !           550:        mov     C_A,brg
        !           551:        add     brg,r10,mar
        !           552:        addn    mem,r5,-
        !           553:        brz     1f
        !           554:        br      i_gack
        !           555: 1:
        !           556:        mov     (XREJ|XACK),brg
        !           557:        and     brg,r4
        !           558:        dec     r4,-
        !           559:        brz     i_grej
        !           560:        br      i_loop
        !           561: 
        !           562: i_seq:
        !           563: /*
        !           564:  * pseq = ECHO + r5;
        !           565:  * check if char or block mode processing
        !           566:  * r13.6 == 0 block mode, else char mode
        !           567:  */
        !           568:        CHK(B3_SEQ,3)
        !           569:        mov     0,brg
        !           570:        mov     brg,r15         /* report mode */
        !           571:        mov     r8,%mar
        !           572:        asl     r13,brg         /* bit 6 of r13 is char mode */
        !           573:        br7     i_seq2
        !           574: /*
        !           575:  * BLOCK mode:
        !           576:  * check if trailer is well formed and len is correct:
        !           577:  */
        !           578:        mov     C_TA0,brg
        !           579:        add     brg,r10,mar
        !           580:        mov     mem,r7|mar++
        !           581:        mov     mem,r6|mar++
        !           582:        dec     r7,-
        !           583:        brz     i_nwwt
        !           584:        mov     I_SOI,brg
        !           585:        addn    brg,r7,-
        !           586:        brz     i_nwwt
        !           587:        mov     2,brg
        !           588:        addn    brg,r6,-
        !           589:        brz     1f
        !           590:        br      i_nwwt
        !           591: 1:
        !           592:        mov     mem,r0|mar++    /* TA2 */
        !           593:        mov     mem,r6          /* TA3 */
        !           594:        mov     C_RBLEN,brg
        !           595:        add     brg,r10,mar
        !           596:        mov     mem,r3|mar++
        !           597:        mov     mem,r2
        !           598:        mov     C_RULEN,brg
        !           599:        add     brg,r10,mar
        !           600:        add     mem,r3,brg|mar++
        !           601:        addc    mem,r2
        !           602:        sub     brg,r0
        !           603:        mov     r2,brg
        !           604:        subc    brg,r6,brg
        !           605:        or      brg,r0
        !           606:        dec     r0,-
        !           607:        brc     i_nwwt
        !           608:        mov     C_RSEQ,brg
        !           609:        add     brg,r10,mar
        !           610:        mov     mem,r0
        !           611:        inc     r0
        !           612:        mov     WINDOW,brg
        !           613:        and     brg,r0,brg
        !           614:        addn    brg,r5,-
        !           615:        brz     i_sq2.1
        !           616:        br      i_nwwt
        !           617: i_seq2:
        !           618: /*
        !           619:  * has rcv a good block
        !           620:  * C_RSEQ = r5;
        !           621:  */
        !           622:        mov     C_RSEQ,brg
        !           623:        add     brg,r10,mar
        !           624: i_sq2.1:
        !           625:        mov     r5,mem
        !           626: /*
        !           627:  * if (RB==NIL & RQ==NIL & (RLEN!=0 | RULEN!=0)), echo the seq# now
        !           628:  */
        !           629:        mov     C_RQ,brg
        !           630:        add     brg,r10,mar
        !           631:        mov     mem,r2
        !           632:        mov     C_RB,brg
        !           633:        add     brg,r10,mar
        !           634:        and     mem,r2
        !           635:        brz     1f
        !           636:        br      i_sq2.3
        !           637: 1:     mov     C_RLEN,brg
        !           638:        add     brg,r10,mar
        !           639:        mov     mem,r2|mar++
        !           640:        or      mem,r2
        !           641:        mov     C_RULEN,brg
        !           642:        add     brg,r10,mar
        !           643:        or      mem,r2,r2|mar++
        !           644:        or      mem,r2
        !           645:        dec     r2,-
        !           646:        brz     i_sq2.2
        !           647:        mov     I_ECHO,brg
        !           648:        or      brg,r5,brg
        !           649:        mov     brg,r1
        !           650:        CALL(send,s.send)
        !           651:        mov     r8,%mar
        !           652:        mov     C_C,brg
        !           653:        add     brg,r10,mar
        !           654:        mov     r1,mem
        !           655:        asl     r13,brg
        !           656:        br7     i_loop                  /* go if char mode */
        !           657: /*
        !           658:  * if TA0 (r7) != BOTM, interrupt with SBLOCK
        !           659:  */
        !           660:        mov     I_BOTM,brg
        !           661:        addn    brg,r7,-
        !           662:        brz     i_sq2.8
        !           663: /*
        !           664:  * see if YBLOCK is set
        !           665:  */
        !           666:        mov     C_Y,brg
        !           667:        add     brg,r10,mar
        !           668:        mov     mem,r0
        !           669:        mov     YBLOCK,brg
        !           670:        orn     brg,r0,-
        !           671:        brz     1f
        !           672:        br      i_sq2.8
        !           673: 1:
        !           674: /*
        !           675:  * interrupt RCV completion with SBLOCK
        !           676:  */
        !           677:        mov     SBLOCK,brg
        !           678:        or      brg,r15
        !           679:        br      i_sq2.8
        !           680: i_sq2.2:
        !           681:        mov     C_RB,brg
        !           682:        add     brg,r10,mar
        !           683: i_sq2.3:
        !           684: /*
        !           685:  * put seq# at the end of C_RB
        !           686:  * mar/%mar now points to C_RB
        !           687:  */
        !           688:        mov     mem,r2
        !           689:        brz     i_sq9.5
        !           690: i_sq2.4:
        !           691: /*
        !           692:  * block mode if r13.6==0
        !           693:  * at least part of the data is in stage-1 (RB: r2) buffer
        !           694:  * if TA0 (r7) != BOTM, pseq = I_SEQ + r5
        !           695:  */
        !           696:        mov     mem,r3
        !           697: 1:
        !           698:        QA(r3)
        !           699:        mov     mem,r3|mar++
        !           700:        brz     2f
        !           701:        br      1b
        !           702: 2:
        !           703:        mov     mem,mem|mar++           /* plen */
        !           704:        mov     mem,mem|mar++           /* *pdata */
        !           705:        asl     r13,brg
        !           706:        br7     i_sq9.3                 /* char mode */
        !           707: /*
        !           708:  * block mode
        !           709:  */
        !           710:        mov     I_BOTM,brg
        !           711:        addn    brg,r7,-
        !           712:        brz     1f
        !           713:        mov     I_SEQ,mem
        !           714:        br      2f
        !           715: 1:     mov     I_ECHO,mem
        !           716: 2:     or      mem,r5,mem              /* pseq */
        !           717: /*
        !           718:  * put this queue (r2) to end of C_RQ
        !           719:  */
        !           720:        mov     r8,%mar
        !           721:        mov     C_RQ,brg
        !           722:        add     brg,r10,mar
        !           723: 1:
        !           724:        mov     mem,r0
        !           725:        brz     2f
        !           726:        QA(r0)
        !           727:        br      1b
        !           728: 2:
        !           729:        mov     r2,mem
        !           730:        mov     r8,%mar
        !           731: i_sq2.8:
        !           732: /*
        !           733:  * if RULEN==0, no data have been copied to RADDR
        !           734:  */
        !           735:        mov     C_RULEN,brg
        !           736:        add     brg,r10,mar
        !           737:        mov     mem,r0
        !           738:        mov     0,mem|mar++
        !           739:        or      mem,r0
        !           740:        mov     0,mem
        !           741:        dec     r0,-
        !           742:        brz     i_seq3
        !           743: /*
        !           744:  * if RLEN==0, interrupt RCV completion
        !           745:  */
        !           746:        mov     C_RLEN,brg
        !           747:        add     brg,r10,mar
        !           748:        mov     mem,r0|mar++
        !           749:        or      mem,r0
        !           750:        dec     r0,-
        !           751:        brc     i_seq3
        !           752:        mov     SFULL,brg
        !           753:        or      brg,r15
        !           754: i_seq3:
        !           755:        dec     r15,-
        !           756:        brz     i_seq6
        !           757: /*
        !           758:  * report RCV completion
        !           759:  */
        !           760:        CHK1(B2_REP,2)
        !           761:        mov     C_RLEN,brg
        !           762:        add     brg,r10,mar
        !           763:        mov     mem,r2
        !           764:        mov     0,mem|mar++
        !           765:        mov     mem,r3
        !           766:        mov     0,mem
        !           767:        mov     %repinfo,%mar
        !           768:        mov     repinfo,mar
        !           769:        mov     KS_RDB,mem|mar++
        !           770:        mov     r2,mem|mar++
        !           771:        mov     r3,mem|mar++
        !           772:        mov     mem,mem|mar++           /* cntl char */
        !           773:        mov     r15,mem                 /* mode */
        !           774:        CALL(report,s.report)
        !           775: i_seq5:
        !           776:        mov     r8,%mar
        !           777: i_seq6:
        !           778: /*
        !           779:  * if C_RQ, call 'rcv' (ignore char mode here)
        !           780:  */
        !           781:        mov     C_RQ,brg        /* block mode */
        !           782:        add     brg,r10,mar
        !           783:        mov     mem,brg
        !           784:        brz     i_ebmode
        !           785:        mov     %rcvsave,%mar
        !           786:        mov     rcvsave,mar
        !           787:        mov     r13,mem|mar++
        !           788:        mov     r12,mem
        !           789:        CALL(rcv,s.rcv)
        !           790:        mov     rcvsave,mar
        !           791:        mov     %rcvsave,%mar
        !           792:        mov     mem,r13|mar++
        !           793:        mov     mem,r12
        !           794: i_ebmode:
        !           795: /*
        !           796:  * TA0, TA1 = 0;
        !           797:  * C_RB = NIL;
        !           798:  * RBLEN == 0;
        !           799:  * only RLEN may be 0 to turn on the bit in r13
        !           800:  */
        !           801:        mov     (1<<1),brg
        !           802:        and     brg,r13
        !           803:        mov     r8,%mar
        !           804:        mov     C_TA0,brg
        !           805:        add     brg,r10,mar
        !           806:        mov     0,mem|mar++
        !           807:        mov     0,mem
        !           808:        mov     C_RBLEN,brg
        !           809:        add     brg,r10,mar
        !           810:        mov     0,mem|mar++
        !           811:        mov     0,mem|mar++
        !           812:        mov     NIL,mem
        !           813:        br      i_loop
        !           814: i_sq9.3:
        !           815: /*
        !           816:  * char mode: put I_ECHO in RB
        !           817:  */
        !           818:        mov     I_ECHO,brg
        !           819:        or      brg,r5,mem              /* pseq */
        !           820:        br      i_loop
        !           821: i_sq9.5:
        !           822: /*
        !           823:  * C_RB was nil, now get a queue and put seq# in it
        !           824:  */
        !           825:        GETQ(r2,i_noqb)
        !           826:        mov     NIL,mem|mar++   /* pnext */
        !           827:        mov     0,mem|mar++     /* plen */
        !           828:        mov     NIL,mem|mar++   /* pdata */
        !           829:        mov     I_ECHO,brg
        !           830:        or      brg,r5,mem      /* pseq */
        !           831:        mov     r8,%mar
        !           832:        mov     C_RB,brg
        !           833:        add     brg,r10,mar
        !           834:        mov     r2,mem
        !           835:        br      i_sq2.4
        !           836: i_nwwt:
        !           837: /*
        !           838:  * rcv a not well formed trailer
        !           839:  * FREE C_RB and its buffer (*pdata)
        !           840:  * if TC0==BOTS RSEQ=r1&WINDOW;
        !           841:  * RSEQ is stored in r7
        !           842:  */
        !           843:        CHK1(B2_NWWT,2)
        !           844:        mov     C_RB,brg
        !           845:        add     brg,r10,mar
        !           846:        mov     mem,r2
        !           847:        brz     i_nw3
        !           848:        mov     NIL,mem
        !           849:        CALL(clean,s.clean)
        !           850:        mov     r8,%mar
        !           851: i_nw3:
        !           852:        mov     C_TA0,brg
        !           853:        add     brg,r10,mar
        !           854:        mov     mem,r0
        !           855:        mov     C_RSEQ,brg
        !           856:        add     brg,r10,mar
        !           857:        mov     I_BOTS,brg
        !           858:        addn    brg,r0,-
        !           859:        brz     1f
        !           860:        mov     I_REJ,brg
        !           861:        br      2f
        !           862: 1:
        !           863:        mov     r5,mem
        !           864:        mov     I_ECHO,brg
        !           865: 2:
        !           866:        mov     mem,r1
        !           867:        or      brg,r1
        !           868: /*
        !           869:  * if (RULEN>0) {
        !           870:  *     RADDR -= RULEN; RLEN += RULEN; RULEN = 0;
        !           871:  * }
        !           872:  */
        !           873:        mov     C_RULEN,brg
        !           874:        add     brg,r10,mar
        !           875:        mov     mem,r7
        !           876:        mov     0,mem|mar++
        !           877:        mov     mem,r6|brg
        !           878:        mov     0,mem
        !           879:        or      brg,r7,brg
        !           880:        mov     brg,r0
        !           881:        dec     r0,-
        !           882:        brz     i_nw6
        !           883:        mov     C_RLEN,brg
        !           884:        add     brg,r10,mar
        !           885:        mov     mem,r4
        !           886:        mov     r7,brg
        !           887:        add     brg,r4,mem|mar++
        !           888:        mov     mem,r4
        !           889:        mov     r6,brg
        !           890:        addc    brg,r4,mem|mar++
        !           891:        mov     mem,r4
        !           892:        mov     r7,brg
        !           893:        sub     brg,r4,mem|mar++        /* RADDR */
        !           894:        mov     mem,r4
        !           895:        mov     r6,brg
        !           896:        subc    brg,r4,mem|mar++
        !           897:        mov     mem,r4
        !           898:        mov     0,brg
        !           899:        subc    brg,r4,mem
        !           900: /*
        !           901:  * turn off all bits in r13 except char mode (1<<6) bit
        !           902:  * if char mode, should not receive trailer at all
        !           903:  * hence, it is possible to mov brg,r13 here
        !           904:  */
        !           905:        mov     (1<<6),brg
        !           906:        and     brg,r13                 /* turn off all except bit 6 */
        !           907: /*
        !           908:  * if RQ is nil, send (REJ+RSEQ) : RSEQ in r1
        !           909:  */
        !           910:        mov     C_RQ,brg
        !           911:        add     brg,r10,mar
        !           912:        mov     mem,brg
        !           913:        brz     1f
        !           914:        br      i_nw6
        !           915: 1:
        !           916:        mov     C_C,brg
        !           917:        add     brg,r10,mar
        !           918:        mov     r1,mem
        !           919:        CALL(send,s.send)
        !           920:        br      i_ebmode
        !           921: i_nw6:
        !           922: /*
        !           923:  * RULEN==0 or RQ!=NIL
        !           924:  * put (REJ+RSEQ) in C_RQ
        !           925:  * r13 will adjusted in ebmode
        !           926:  */
        !           927:        GETQ(r2,i_noqb)
        !           928:        mov     NIL,mem|mar++           /* pnext */
        !           929:        mov     0,mem|mar++             /* plen */
        !           930:        mov     NIL,mem|mar++           /* *pdata */
        !           931:        mov     r1,mem                  /* pseq (REJ+RSEQ) */
        !           932:        mov     r8,%mar
        !           933:        mov     C_RQ,brg
        !           934:        add     brg,r10,mar
        !           935: 1:
        !           936:        mov     mem,r0
        !           937:        brz     2f
        !           938:        QA(r0)
        !           939:        br      1b
        !           940: 2:
        !           941:        mov     r2,mem
        !           942:        br      i_ebmode
        !           943: 
        !           944: i_data:
        !           945: /*
        !           946:  * get a data byte: may be normal data, len, or express data in SOI
        !           947:  * r13:        bit 7- rblen > 0
        !           948:  *     bit 6 - char mode
        !           949:  *     bit 4- c_ta0 != 0
        !           950:  *     bit 1- rlen == 0
        !           951:  *     bit 0- raddr is odd
        !           952:  * r12: bit 0- 1st byte of a pair is in odl
        !           953:  *     note that if odl has the 1st byte, rlen must be >= 2
        !           954:  */
        !           955:        dec     r13,-
        !           956:        brc     i_id4           /* special treatment */
        !           957: i_id1:
        !           958:        mov     r12,brg
        !           959:        br0     i_id3
        !           960: /*
        !           961:  * test if rlen >= 2
        !           962:  */
        !           963:        mov     r8,%mar
        !           964:        mov     C_RLEN,brg
        !           965:        add     brg,r10,mar
        !           966:        mov     2,r2|brg
        !           967:        mov     mem,r3
        !           968:        sub     brg,r3,mem|mar++
        !           969:        mov     mem,r3
        !           970:        mov     0,r0|brg
        !           971:        subc    brg,r3,mem|mar++        /* mar points to RADDR */
        !           972:        brc     i_id2                   /* rlen >= 2 */
        !           973: /*
        !           974:  * rlen <= 1
        !           975:  */
        !           976:        mov     (1<<1),brg              /* turn on no rcv pending */
        !           977:        or      brg,r13
        !           978:        mov     C_RLEN,brg
        !           979:        add     brg,r10,mar
        !           980:        add     mem,r2
        !           981:        mov     r2,mem|mar++
        !           982:        mov     0,mem
        !           983:        dec     r2,-
        !           984:        brz     i_id8                   /* RLEN == 0 */
        !           985: /*
        !           986:  * RLEN==1: copy one byte only
        !           987:  */
        !           988:        br      i_id5
        !           989: i_id2:
        !           990:        mov     mem,oal         /* RADDR */
        !           991:        add     mem,r2,mem|mar++
        !           992:        mov     mem,oah
        !           993:        addc    mem,r0,mem|mar++
        !           994:        mov     mem,r11
        !           995:        adc     r11,mem|mar++
        !           996:        add     mem,r2,mem|mar++        /* RULEN */
        !           997:        addc    mem,r0,mem
        !           998:        mov     (1<<0),brg
        !           999:        or      brg,r12
        !          1000:        mov     r1,brg
        !          1001:        mov     brg,odl
        !          1002:        br      i_loop
        !          1003: i_id3:
        !          1004: /*
        !          1005:  * 2nd byte of a pair: put r1 in odh and copy them to RADDR
        !          1006:  * reset r12
        !          1007:  */
        !          1008:        mov     ~(1<<0),brg
        !          1009:        and     brg,r12         /* reset bit0 */
        !          1010:        mov     r1,brg
        !          1011:        mov     brg,odh
        !          1012:        SPUTTWO(r11,err_bus)
        !          1013:        br      i_loop
        !          1014: i_id4:
        !          1015: /*
        !          1016:  * r13 > 0
        !          1017:  */
        !          1018:        mov     r13,brg
        !          1019:        br4     i_id10          /* c_ta0 != 0 */
        !          1020:        br7     i_id8           /* rblen > 0 */
        !          1021:        br1     i_id8           /* no read pending */
        !          1022:        br0     i_id4.5         /* raddr is odd */
        !          1023:        br      i_id1           /* char mode */
        !          1024: i_id4.5:
        !          1025: /*
        !          1026:  * raddr is odd
        !          1027:  * try to copy one byte first and make raddr even
        !          1028:  */
        !          1029:        mov     ~(1<<0),brg
        !          1030:        and     brg,r13
        !          1031: i_id5:
        !          1032: /*
        !          1033:  * enter here: copy r1 to raddr, since rlen, raddr, rulen were not updated,
        !          1034:  * now dec rlen and inc raddr and rulen
        !          1035:  */
        !          1036:        mov     r1,brg
        !          1037:        mov     brg,odl
        !          1038:        mov     brg,odh
        !          1039:        mov     r8,%mar
        !          1040:        mov     C_RLEN,brg
        !          1041:        add     brg,r10,mar
        !          1042:        mov     1,r1
        !          1043:        mov     mem,r2
        !          1044:        dec     r2,mem|mar++    /* dec rlen */
        !          1045:        mov     mem,r2
        !          1046:        mov     0,r0|brg
        !          1047:        mov     brg,r12         /* reset r12 */
        !          1048:        subc    brg,r2,mem|mar++
        !          1049:        mov     mem,oal         /* inc raddr */
        !          1050:        add     mem,r1,mem|mar++
        !          1051:        mov     mem,oah
        !          1052:        addc    mem,r0,mem|mar++
        !          1053:        mov     mem,r2
        !          1054:        addc    mem,r0,mem|mar++
        !          1055: /*
        !          1056:        mov     C_RULEN,brg
        !          1057:        add     brg,r10,mar
        !          1058:  */
        !          1059:        add     mem,r1,mem|mar++        /* inc rulen */
        !          1060:        addc    mem,r0,mem
        !          1061:        SPUTONE(r2,err_bus)
        !          1062:        br      i_loop
        !          1063: i_id6:
        !          1064: /*
        !          1065:  * no more data in DK rcv fifo, check if odl has the 1st byte
        !          1066:  */
        !          1067:        mov     r12,brg
        !          1068:        br0     1f
        !          1069:        br      i_id7
        !          1070: 1:
        !          1071: /*
        !          1072:  * odl has the 1st byte of a pair: copy it to RADDR then return
        !          1073:  * r13 needs adjusted
        !          1074:  */
        !          1075:        CALL(copy1,s.copy1)
        !          1076: i_id7:
        !          1077: /*
        !          1078:  * if char mode and rulen>0, go check timer
        !          1079:  */
        !          1080:        mov     r8,%mar
        !          1081:        mov     C_X1,brg
        !          1082:        add     brg,r10,mar
        !          1083:        mov     mem,r0
        !          1084:        mov     XBLK,brg
        !          1085:        orn     brg,r0,-
        !          1086:        brz     i_disp
        !          1087:        CALL(cktimer,s.cktimer)
        !          1088:        br      i_disp
        !          1089: i_id8:
        !          1090: /*
        !          1091:  * rblen > 0 or no read pending
        !          1092:  */
        !          1093:        mov     1,brg
        !          1094:        mov     brg,idh         /* indicate data byte */
        !          1095: i_id9:
        !          1096: /*
        !          1097:  * copy data/cntl to C_RB
        !          1098:  */
        !          1099:        mov     (1<<7),brg
        !          1100:        or      brg,r13
        !          1101:        br      i_nd
        !          1102: i_id10:
        !          1103: /*
        !          1104:  * c_ta0 != 0
        !          1105:  */
        !          1106:        mov     r8,%mar
        !          1107:        mov     C_TA1,brg
        !          1108:        add     brg,r10,mar
        !          1109:        mov     mem,r0
        !          1110:        dec     r0
        !          1111:        brz     1f
        !          1112:        dec     r0
        !          1113:        brz     3f
        !          1114: /*
        !          1115:  * TA1 (len) >=2; throw away the trailer (TA0);
        !          1116:  */
        !          1117:        mov     C_TA0,brg
        !          1118:        add     brg,r10,mar
        !          1119:        mov     0,mem|mar++
        !          1120:        mov     0,mem
        !          1121:        br      4f
        !          1122: 1:
        !          1123: /*
        !          1124:  * len was 0: TA2=r1, len=1;;
        !          1125:  */
        !          1126:        mov     1,mem|mar++             /* TA1 = 1 */
        !          1127:        mov     r1,mem                  /* TA2 = r1 */
        !          1128:        br      i_loop
        !          1129: 3:
        !          1130: /*
        !          1131:  * len was 1: TA3=r1, len=2;
        !          1132:  */
        !          1133:        mov     2,mem|mar++             /* TA1 = 2 */
        !          1134:        mov     mem,mem|mar++
        !          1135:        mov     r1,mem                  /* TA3 = r1 */
        !          1136:        br      i_loop
        !          1137: 4:
        !          1138:        mov     ~(1<<4),brg
        !          1139:        and     brg,r13                 /* reset c_ta0 bit */
        !          1140:        br      i_loop
        !          1141: 
        !          1142: i_incomp:
        !          1143: i_badp:
        !          1144: /*
        !          1145:  * bad packet is received
        !          1146:  */
        !          1147:        br      i_csrtst
        !          1148: /*
        !          1149:  * OLD code for i_badp
        !          1150:  * Check for the # of badpacks and possibly panic.
        !          1151:        mov     %m_badpack,%mar
        !          1152:        mov     m_badpack,mar
        !          1153:        mov     mem,r0
        !          1154:        inc     r0,mem
        !          1155:        mov     MAXBADPK,brg
        !          1156:        sub     brg,r0
        !          1157:        ERROR(E_IPANIC)
        !          1158:        br      i_loop
        !          1159:  */
        !          1160: i_noqb:
        !          1161: /*
        !          1162:  * Run out of queues or input buffers
        !          1163:  */
        !          1164:        ERROR(E_NOQB)
        !          1165:        br      i_disp
        !          1166: i_disp:
        !          1167: /*
        !          1168:  * Return to main dispatch loop
        !          1169:  */
        !          1170:        mov     %disp2,brg
        !          1171:        mov     brg,pcr
        !          1172:        jmp     disp2
        !          1173: 
        !          1174: i_nd:
        !          1175: /*
        !          1176:  * copy data (r1) to stage-1 buffer (C_RB)
        !          1177:  * C_RB is a queue pointer: pnext, plen, *pdata, pseq.
        !          1178:  * idh - 1 if normal data, 0 if user cntl
        !          1179:  * r7-r5 - buffer address
        !          1180:  * r4 - stage-1 buffer index
        !          1181:  * r3 - plen
        !          1182:  * r2 - queue entry
        !          1183:  * r1 - data byte
        !          1184:  */
        !          1185:        CHK(B2_DATA,2)
        !          1186:        mov     r8,%mar
        !          1187:        mov     C_RBLEN,brg
        !          1188:        add     brg,r10,mar
        !          1189:        mov     mem,r0
        !          1190:        inc     r0,mem|mar++
        !          1191:        mov     mem,r0
        !          1192:        adc     r0,mem|mar++            /* RBLEN++ */
        !          1193:        mov     mem,r0                  /* r0 = C_RB */
        !          1194:        brz     i_nd5
        !          1195: i_nd1:
        !          1196:        mov     r0,odl          /* save temporarily in odl */
        !          1197:        QA(r0)
        !          1198:        mov     mem,r0|mar++
        !          1199:        brz     i_nd2
        !          1200:        br      i_nd1
        !          1201: i_nd2:
        !          1202: /*
        !          1203:  * found end of the queue
        !          1204:  */
        !          1205:        mov     mem,r3|mar++            /* plen */
        !          1206:        mov     mem,r4|mar++            /* *pdata */
        !          1207:        mov     mem,r0                  /* pseq */
        !          1208:        dec     r0,-
        !          1209:        brc     i_nd7                   /* get a new queue */
        !          1210:        mov     BSIZE,brg
        !          1211:        sub     brg,r3,-
        !          1212:        brc     i_nd7                   /* this buffer is full */
        !          1213:        mov     odl,r0
        !          1214:        QA(r0)
        !          1215:        mov     brg,brg|mar++           /* pnext */
        !          1216:        inc     r3,mem|mar++            /* plen++ */
        !          1217: i_nd3:
        !          1218: /*
        !          1219:  * r4 is buffer index, store 2 bytes (lo in r1 , hi in odh)
        !          1220:  */
        !          1221:        BITA(r4,r7,r6,r5)
        !          1222:        asl     r3,brg          /* offset is 2*plen */
        !          1223:        add     brg,r7,r7|brg
        !          1224:        mov     brg,oal
        !          1225:        adc     r6,r6|brg
        !          1226:        mov     brg,oah
        !          1227:        adc     r5
        !          1228:        mov     r1,brg
        !          1229:        mov     brg,odl
        !          1230:        mov     idh,odh
        !          1231:        SPUTTWO(r5,err_bus)             /* always at even boundary */
        !          1232:        br      i_loop
        !          1233: i_nd5:
        !          1234: /*
        !          1235:  * no stage-1 buffer exists yet
        !          1236:  */
        !          1237:        GETQ(r2,i_noqb)
        !          1238:        mov     r8,%mar
        !          1239:        mov     C_RB,brg
        !          1240:        add     brg,r10,mar
        !          1241:        mov     r2,mem
        !          1242: i_nd6:
        !          1243: /*
        !          1244:  * get a buffer and store 2 bytes at offset plen
        !          1245:  */
        !          1246:        GEBI(r4,i_noqb)
        !          1247:        QA(r2)
        !          1248:        mov     NIL,mem|mar++
        !          1249:        mov     1,mem|mar++             /* plen after storing */
        !          1250:        mov     r4,mem|mar++            /* *pdata */
        !          1251:        mov     0,mem                   /* pseq */
        !          1252:        mov     mem,r3                  /* plen before storing */
        !          1253:        br      i_nd3
        !          1254: i_nd7:
        !          1255: /*
        !          1256:  * get another queue and buffer to store 2 bytes
        !          1257:  */
        !          1258:        GETQ(r2,i_noqb)
        !          1259:        mov     odl,r0
        !          1260:        QA(r0)
        !          1261:        mov     r2,mem
        !          1262:        br      i_nd6
        !          1263: 
        !          1264: endseg2:
        !          1265: 
        !          1266: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.