Annotation of researchv8dc/sys/kdi/subr.s, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

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