home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / b / krtpak.min < prev    next >
Text File  |  2020-01-01  |  15KB  |  1,092 lines

  1.     .title    KRTPAK.MIN  Packet driver
  2.     .ident    "V03.62"
  3.  
  4. ; /62/    31-May-93  Billy Y..
  5.  
  6. ;    Change Software, Toledo, Ohio
  7. ;    University of Toledo, Toledo, Ohio
  8.  
  9.     .include "IN:KRTMAC.MIN"
  10.     .iif ndf  KRTINC  .error    <; .include for IN:KRTMAC.MIN failed>
  11.     .include "IN:KRTDEF.MIN"
  12.     .iif ndf  MSG$DA  .error    <; .include for IN:KRTDEF.MIN failed>
  13.  
  14.     .mcall    .CLOSE    ,.PURGE
  15.  
  16.     BADCHK    ==    377
  17.     DEFCHK    ==    '1
  18.     DEFDLY    ==    6
  19.     IN$TRY    ==    5
  20.     MX$TRY    ==    20
  21.     MYCHKT    ==    defchk
  22.     MYEOL    ==    cr
  23.     MYQUOTE    ==    '#
  24.     MYPAD    ==    0
  25.     MYPCHAR    ==    0
  26.     MYQBIN    ==    '&
  27.     MYREPT    ==    176
  28.     MYRTMO    ==    10.
  29.     MYSTMO    ==    13.
  30.     TIMOUT    ==    'T&137
  31.  
  32.  
  33.     .sbttl    Local and some global data
  34.  
  35.     .psect    $pdata
  36. aspace::.byte    40 ,0
  37. null::    .byte     0 ,0
  38. e$par:    .asciz    ", parity is possibly being introduced"
  39. e$retr:    .asciz    "Retry limit reached"
  40. e$sync:    .asciz    "Packet serial numbers are out of sync"
  41. R20$:    .asciz    "<<< RPACK - "
  42. RP2$:    .asciz    "BAD Checksum: RCV,CALC = "
  43. RX2$:    .asciz    <cr><lf>
  44. S2$:    .asciz    ">>> SPACK - "
  45.     .even
  46.  
  47.  
  48.     .psect    $code
  49.     .sbttl    Decide where to get the next character
  50.  
  51. getcr0::tst    getcroutine
  52.     bne    10$
  53.     call    fgetcr0
  54.     br    100$
  55. 10$:    call    @getcroutine
  56. 100$:    return
  57.  
  58. tgetcr::tst    tgetaddr
  59.     beq    90$
  60.     movb    @tgetaddr,r1
  61.     beq    90$
  62.     inc    tgetaddr
  63.     clr    r0
  64.     br    100$
  65. 90$:    mov    #er$eof    ,r0
  66.     clr    getcroutine
  67. 100$:    return
  68.  
  69.  
  70.     .sbttl    Get next file to send
  71.  
  72. getnxt::save    <r1>
  73.     calls    lookup    ,<#srcnam,#filnam>
  74.     tst    r0
  75.     beq    100$
  76.     cmp    r0    ,#er$nmf
  77.     beq    20$
  78.     cmp    r0    ,#er$fnf
  79.     bne    30$
  80. 20$:    tst    index
  81.     bne    100$
  82.     mov    #er$fnf    ,r0
  83. 30$:    mov    r0    ,-(sp)
  84.     calls    syserr    ,<r0,#errtxt>
  85.     calls    error    ,<#3,#errtxt,#aspace,#filnam>
  86.     .purge    #lun.sr
  87.     mov    (sp)+    ,r0
  88. 100$:    unsave    <r1>
  89.     return
  90.  
  91.  
  92.     .sbttl    Read incoming packet
  93.  
  94.     O$LEN    =  0
  95.     O$SEQ    =  2
  96.     O$TYP    =  4
  97.     .TYP    =  0
  98.     .CCHECK    =  2
  99.     .RCHECK    =  4
  100.     .LEN    =  6
  101.     .TIMEO    = 10
  102.     .SEQ    = 12
  103.     .SIZE    = 14
  104.     .TOGO    = 26
  105.     .HDTYPE    = 20
  106.     .CBUFF    = 22
  107.     .LSIZE    = 24
  108.  
  109. rpack$::save    <r1,r2,r3,r4>
  110.     clr    recbit
  111.     sub    #.lsize    ,sp
  112.     mov    sp    ,r4
  113.     sub    #$allsiz,sp
  114.     call    waitsoh
  115.     tst    r0
  116.     beq    5$
  117.     jmp    95$
  118.  
  119. 5$:    mov    sp    ,r3
  120.     mov    sp    ,.cbuff(r4)
  121.     call    rpakin
  122.     call    rpakrd
  123.     bcs    95$
  124.     bisb    r1    ,recbit
  125.     bic    #^c177    ,r1
  126.     cmpb    r1    ,recsop
  127.     beq    5$
  128.     movb    r1    ,(r3)+
  129.     unchar    r1    ,r0
  130.     mov    r0    ,.hdtype(r4)
  131.     cmp    r0    ,#2
  132.     ble    15$
  133.  
  134. 14$:    sub    #2    ,r0
  135.     sub    chksiz    ,r0
  136.     bge    15$
  137.     clr    r0
  138. 15$:    mov    r0    ,.len(r4)
  139.  
  140.     call    rpakrd
  141.     bcs    95$
  142.     bisb    r1    ,recbit
  143.     bic    #^c177    ,r1
  144.     cmpb    r1    ,recsop
  145.     beq    5$
  146.     movb    r1    ,(r3)+
  147.     unchar    r1    ,.seq(r4)
  148.  
  149.     call    rpakrd
  150.     bcs    95$
  151.     bisb    r1    ,recbit
  152.     bic    #^c177    ,r1
  153.     cmpb    r1    ,recsop
  154.     beq    5$
  155.     movb    r1    ,(r3)+
  156.     mov    r1    ,.typ(r4)
  157.  
  158.     tst    .hdtype(r4)
  159.     bne    19$
  160.     call    rdexhd
  161.     tst    r0
  162.     bgt    5$
  163.     bmi    96$
  164.  
  165. 19$:    mov    .len(r4),.togo(r4)
  166.     cmp    .togo(r4),4(r5)
  167.     blos    190$
  168.     mov    4(r5)    ,.togo(r4)
  169. 190$:    mov    @r5    ,r2
  170.  
  171. 20$:    tst    .togo(r4)
  172.     beq    30$
  173.     call    rpakrd
  174.     bcs    95$
  175.     tst    parity
  176.     bne    21$
  177.     tst    image
  178.     bne    23$
  179. 21$:    bic    #^c177    ,r1
  180. 23$:    cmpb    r1    ,recsop
  181.     beq    5$
  182.     cmp    .size(r4),#maxlng
  183.     bhis    25$
  184.     movb    r1    ,(r2)+
  185.     movb    r1    ,(r3)+
  186.  
  187. 25$:    inc    .size(r4)
  188.     dec    .togo(r4)
  189.     br    20$
  190.  
  191. 30$:    clrb    @r2
  192.     clrb    @r3
  193.     mov    sp    ,r3
  194.     call    rpakck
  195.     bcs    95$
  196.     call    rpakfi
  197.     br    100$
  198.  
  199. 95$:    mov    2(r5)    ,r1
  200.     mov    #timout    ,o$typ(r1)
  201.     mov    #timout    ,.typ(r4)
  202.     clr    o$len(r1)
  203.     clr    .len(r4)
  204.     clr    .seq(r4)
  205. 96$:    call    rpakst
  206.  
  207. 100$:    add    #.lsize+$allsiz,sp
  208.     unsave    <r4,r3,r2,r1>
  209.     return
  210.  
  211.  
  212.     .sbttl    RPACK$ wait for a start of packet char (SOH)
  213.  
  214. waitsoh:clr    r1
  215. 10$:    cmpb    r1    ,recsop
  216.     beq    100$
  217.     mov    sertim    ,r0
  218.     bne    11$
  219.     movb    senpar+p.time,r0
  220. 11$:    calls    binrea    ,<r0>
  221.     tst    r0
  222.     bne    30$
  223.     bic    #^c177    ,r1
  224. 20$:    call    rawio
  225.     br    10$
  226. 30$:    clr    r1
  227. 100$:    return
  228.  
  229.  
  230.     .sbttl    RPACK$ initialization
  231.  
  232. rpakin:    mov    r4    ,r0
  233.     mov    #11    ,r1
  234. 10$:    clr    (r0)+
  235.     sob    r1    ,10$
  236.     bisb    senpar+p.time,.timeo(r4)
  237.     mov    2(r5)    ,r0
  238.     clr    (r0)+
  239.     clr    (r0)+
  240.     clr    (r0)+
  241.     return
  242.  
  243.  
  244.     .sbttl    RPACK$ read with time_out
  245.  
  246. rpakrd:    calls    binrea    ,<.timeo(r4)>
  247.     tst    r0
  248.     bne    110$
  249.     call    rawio
  250.     clr    r0
  251.     return
  252. 110$:    sec
  253.     return
  254.  
  255.  
  256.     .sbttl    RPACK$ extended header type 0 for long packets
  257.  
  258. rdexhd:    mov    r2    ,-(sp)
  259.     mov    r5    ,-(sp)
  260.     call    rpakrd
  261.     bcs    90$
  262.     bic    #^c177    ,r1
  263.     cmpb    r1    ,recsop
  264.     beq    80$
  265.     movb    r1    ,(r3)+
  266.     unchar    r1    ,r5
  267.     mul    #95.    ,r5
  268.     call    rpakrd
  269.     bcs    90$
  270.     bic    #^c177    ,r1
  271.     cmpb    r1    ,recsop
  272.     beq    80$
  273.     movb    r1    ,(r3)+
  274.     unchar    r1    ,r1
  275.     add    r1    ,r5
  276.     sub    chksiz    ,r5
  277.     mov    r5    ,.len(r4)
  278.  
  279.     mov    .cbuff(r4),r5
  280.     mov    #5    ,r1
  281.     clr    -(sp)
  282. 10$:    clr    r0
  283.     bisb    (r5)+    ,r0
  284.     add    r0    ,(sp)
  285.     sob    r1    ,10$
  286.     mov    (sp)+    ,r0
  287.     mov    r0    ,r2
  288.     bic    #^c300    ,r2
  289.     ash    #-6    ,r2
  290.     add    r0    ,r2
  291.     bic    #^c77    ,r2
  292.  
  293.     call    rpakrd
  294.     bcs    90$
  295.     bic    #^c177    ,r1
  296.     cmpb    r1    ,recsop
  297.     beq    80$
  298.     movb    r1    ,(r3)+
  299.     unchar    r1    ,r1
  300.     cmpb    r1    ,r2
  301.     bne    85$
  302.     clr    r0
  303.     br    100$
  304.  
  305. 80$:    mov    #1    ,r0
  306.     br    100$
  307.  
  308. 85$:    mov    #badchk    ,r0
  309.     br    95$
  310. 90$:    mov    #timout    ,r0
  311.     clr    .len(r4)
  312. 95$:    mov    2(sp)    ,r5
  313.     mov    2(r5)    ,r1
  314.     clr    o$len(r1)
  315.     mov    r0    ,o$typ(r1)
  316.     mov    r0    ,.typ(r4)
  317.     mov    #-1    ,r0
  318. 100$:    mov    (sp)+    ,r5
  319.     mov    (sp)+    ,r2
  320.     return
  321.  
  322.  
  323.     .sbttl    RPACK$ get and convert the checksum
  324.  
  325. rpakck:    save    <r3>
  326.     clr    r3
  327.     call    rpakrd
  328.     bcs    110$
  329.     bisb    r1    ,recbit
  330.     bic    #^c177    ,r1
  331.     unchar    r1    ,r3
  332.     cmpb    chktyp    ,#defchk
  333.     blos    10$
  334.      ash    #6    ,r3
  335.      call    rpakrd
  336.      bcs    110$
  337.      bic    #^c177    ,r1
  338.      unchar    r1    ,r1
  339.      bisb    r1    ,r3
  340.      cmpb    chktyp    ,#'3
  341.      bne    10$
  342.      ash    #6    ,r3
  343.      call    rpakrd
  344.      bcs    110$
  345.      bic    #^c177    ,r1
  346.      unchar    r1    ,r1
  347.      bisb    r1    ,r3
  348. 10$:    clc
  349. 110$:    mov    r3    ,.rcheck(r4)
  350.     unsave    <r3>
  351.     return
  352.  
  353.  
  354.     .sbttl    RPACK$ end of packet housekeeping
  355.  
  356. rpakfi:    mov    r3    ,-(sp)
  357.     call    checks
  358.     mov    (sp)+    ,.ccheck(r4)
  359.     cmpb    .ccheck(r4),.rcheck(r4)
  360.     beq    10$
  361.     mov    #badchk    ,.typ(r4)
  362. 10$:    mov    2(r5)    ,r1
  363.     mov    .len(r4),(r1)+
  364.     mov    .seq(r4),(r1)+
  365.     mov    .typ(r4),(r1)
  366.     call    rpakst
  367.     jmp    rpaklo
  368.  
  369.  
  370.     .sbttl    RPACK$ statistics, logging, resonating packets fix
  371.  
  372. rpakst:    cmpb    .typ(r4),#'A&137
  373.     blo    110$
  374.     cmpb    .typ(r4),#'Z&137
  375.     bhi    110$
  376.     asr    nakrec
  377.     cmpb    .typ(r4),#'N&137
  378.     bne    55$
  379.     bis    #4    ,nakrec
  380. 55$:    cmp    nakrec    ,#4+1
  381.     bge    67$
  382. 60$:    cmpb    .typ(r4),#timout
  383.     bne    77$
  384. 67$:    call    hose
  385.     clr    nakrec
  386.  
  387. 77$:     movb    .typ(r4),r1
  388.      sub    #100    ,r1
  389.      asl    r1
  390.      asl    r1
  391.      add    #1    ,pcnt.r+2(r1)
  392.      adc    pcnt.r+0(r1)
  393.      add    #1    ,pcnt.r+2
  394.      adc    pcnt.r+0
  395.  
  396. 110$:    bit    #log$pa    ,trace
  397.     beq    130$
  398. 121$:    calls    dskdmp    ,<#R20$,.seq(r4),.typ(r4),.len(r4),@r5>
  399. 130$:    return
  400.  
  401.  
  402.     .sbttl    RPACK$ packet logging
  403.  
  404. rpaklo:    cmp    .rcheck(r4),.ccheck(r4)
  405.     beq    110$
  406.     save    <r0,r1>
  407.     bit    #log$pa    ,trace
  408.     beq    100$
  409.     sub    #100    ,sp
  410.     mov    sp    ,r1
  411.     strcpy    r1    ,#RP2$
  412.     strlen    r1
  413.     add    r0    ,r1
  414.     deccvt    .rcheck(r4),r1
  415.     add    #6    ,r1
  416.     movb    #comma    ,(r1)+
  417.     deccvt    .ccheck(r4),r1
  418.     add    #6    ,r1
  419.     clrb    @r1
  420.     mov    sp    ,r1
  421.     strlen    r1
  422.     calls    putrec    ,<r1,r0,#lun.lo>
  423.     tst    r0
  424.     beq    30$
  425.     call    logerr
  426. 30$:    add    #100    ,sp
  427. 100$:    unsave    <r1,r0>
  428. 110$:    return
  429.  
  430.  
  431.     .sbttl    RPACK$ raw I/O logging, chars to RPACK debug display
  432.  
  433. rawio:    bit    #log$io    ,trace
  434.     beq    10$
  435.     save    <r0,r1>
  436.     clr    r0
  437.     bisb    r1    ,r0
  438.     mov    #lun.lo    ,r1
  439.     call    putcr0
  440.     tst    r0
  441.     beq    1$
  442.     call    logerr
  443. 1$:    unsave    <r1,r0>
  444. 10$:    return
  445.  
  446.  
  447.     .sbttl    Send a packet
  448.  
  449. spack$::save    <r1,r2,r3,r4>
  450.     call    spakin
  451.     sub    #$allsiz,sp
  452.     mov    sp    ,r4
  453.     clr    -(sp)
  454.     tst    prexon
  455.     beq    5$
  456.     movb    #xon    ,(r4)+
  457.     inc    @sp
  458. 5$:    setpar    sensop    ,(r4)+
  459.     mov    r4    ,r2
  460.     inc    @sp
  461.     mov    4(r5)    ,r0
  462.     mov    #maxpak    ,r1
  463.     cmp    senlng    ,r1
  464.     blos    7$
  465.     sub    chksiz    ,r1
  466.     sub    #2    ,r1
  467. 7$:    cmp    r0    ,r1
  468.     blos    15$
  469.     tst    senlng
  470.     beq    10$
  471.  
  472.     mov    r2    ,-(sp)
  473.     mov    #space    ,-(sp)
  474.     setpar    #space    ,(r4)+
  475.     tochar    2(r5)    ,r1
  476.     add    r1    ,(sp)
  477.     setpar    r1    ,(r4)+
  478.     movb    (r5)    ,r1
  479.     bicb    #40    ,r1
  480.     add    r1    ,(sp)
  481.     setpar    r1    ,(r4)+
  482.     mov    r0    ,r3
  483.     clr    r2
  484.     add    chksiz    ,r3
  485.     div    #95.    ,r2
  486.     tochar    r2    ,r2
  487.     tochar    r3    ,r3
  488.     setpar    r2    ,(r4)+
  489.     add    r2    ,(sp)
  490.     setpar    r3    ,(r4)+
  491.     add    r3    ,(sp)
  492.     mov    (sp)+    ,r0
  493.     mov    r0    ,r2
  494.     bic    #^c300    ,r2
  495.     ash    #-6    ,r2
  496.     add    r0    ,r2
  497.     bic    #^c77    ,r2
  498.     tochar    r2    ,r2
  499.     setpar    r2    ,(r4)+
  500.     mov    (sp)+    ,r2
  501.     add    #7    ,(sp)
  502.     br    20$
  503.  
  504. 10$:    mov    #maxpak-3,r0
  505. 15$:    add    #2    ,r0
  506.     add    chksiz    ,r0
  507.     clr    r1
  508.     tochar    r0    ,r1
  509.     setpar    r1    ,(r4)+
  510.     inc    @sp
  511.     tochar    2(r5)    ,r0
  512.     setpar    r0    ,(r4)+
  513.     inc    @sp
  514.     movb    @r5    ,r0
  515.     bicb    #40    ,r0
  516.     setpar    r0    ,(r4)+
  517.     inc    @sp
  518.  
  519. 20$:    mov    4(r5)    ,r1
  520.     beq    40$
  521.     mov    6(r5)    ,r3
  522.  
  523. 30$:    clr    r0
  524.     bisb    (r3)+    ,r0
  525.     setpar    r0    ,(r4)+
  526.     inc    @sp
  527.     sob    r1    ,30$
  528.  
  529. 40$:    clrb    @r4
  530.     mov    r2    ,-(sp)
  531.     call    checks
  532.     mov    (sp)+    ,r2
  533.     call    spakck
  534.     add    r0    ,@sp
  535.     setpar    conpar+p.eol,(r4)+
  536.     inc    @sp
  537.     mov    (sp)+    ,r1
  538.     mov    sp    ,r4
  539.     calls    binwri    ,<r4,r1>
  540.     call    spakfi
  541.     add    #$allsiz,sp
  542.     unsave    <r4,r3,r2,r1>
  543.     return
  544.  
  545.  
  546.     .sbttl    SPACK$ logging, padding, packet type stats
  547.  
  548. spakin:    bit    #log$pa    ,trace
  549.     beq    5$
  550. 1$:    calls    dskdmp    ,<#S2$,2(r5),@r5,4(r5),6(r5)>
  551.  
  552. 5$:    tst    pauset
  553.     beq    6$
  554.     calls    suspend    ,<pauset>
  555. 6$:    clr    r1
  556.     bisb    conpar+p.npad,r1
  557.     beq    20$
  558.     mov    #conpar+p.padc,r2
  559. 10$:    calls    binwri    ,<r2,#1>
  560.     sob    r1    ,10$
  561.  
  562. 20$:    movb    @r5    ,r1
  563.     cmpb    r1    ,#'A&137
  564.     blo    30$
  565.     cmpb    r1    ,#'Z&137
  566.     bhi    30$
  567.      sub    #100    ,r1
  568.      asl    r1
  569.      asl    r1
  570.      add    #1    ,pcnt.s+2(r1)
  571.      adc    pcnt.s+0(r1)
  572.      add    #1    ,pcnt.s+2
  573.      adc    pcnt.s+0
  574. 30$:    return
  575.  
  576.  
  577.     .sbttl    SPACK$ compute checksum
  578.  
  579. spakck:    clr    r0
  580.     cmpb    chktyp    ,#defchk
  581.     blos    20$
  582.     cmpb    chktyp    ,#'3
  583.     bne    10$
  584.     mov    r2    ,r1
  585.      ash    #-14    ,r1
  586.      bic    #^c17    ,r1
  587.      tochar    r1    ,@r4
  588.      setpar    @r4    ,(r4)+
  589.      inc    r0
  590.  
  591. 10$:     mov    r2    ,r1
  592.      ash    #-6    ,r1
  593.      bic    #^c77    ,r1
  594.      tochar    r1    ,@r4
  595.      setpar    @r4    ,(r4)+
  596.      inc    r0
  597.      bic    #^c77    ,r2
  598.  
  599. 20$:    tochar    r2    ,@r4
  600.     setpar    @r4    ,(r4)+
  601.     inc    r0
  602.     return
  603.  
  604.  
  605.     .sbttl    SPACK$ log to disk
  606.  
  607. spakfi:    bit    #log$io    ,trace
  608.     beq    230$
  609.     save    <r0,r1,r2,r4>
  610.     mov    r1    ,r2
  611.     beq    220$
  612. 210$:    clr    r0
  613.     bisb    (r4)+    ,r0
  614.     mov    #lun.lo    ,r1
  615.     call    putcr0
  616.     tst    r0
  617.     beq    213$
  618.     call    logerr
  619.     br    220$
  620. 213$:    sob    r2    ,210$
  621. 220$:    unsave    <r4,r2,r1,r0>
  622. 230$:    return
  623.  
  624.  
  625.     .sbttl    Compute checksum
  626.  
  627. checks:    save    <r0,r1,r2,r3>
  628.     mov    10+2(sp),r2
  629.     cmpb    chktyp    ,#'3
  630.     bne    5$
  631.     strlen    r2
  632.     calls    crcclc    ,<r2,r0>
  633.     mov    r0    ,r2
  634.     br    90$
  635.  
  636. 5$:    clr    r1
  637. 10$:    clr    r3
  638.     bisb    (r2)+    ,r3
  639.     beq    20$
  640.     tst    parity
  641.     beq    15$
  642.     bic    #^c177    ,r3
  643. 15$:    bic    #170000    ,r1
  644.     add    r3    ,r1
  645.     br    10$
  646.  
  647. 20$:    mov    r1    ,r2
  648.     cmpb    chktyp    ,#'2
  649.     beq    30$
  650.     bic    #^c300    ,r2
  651.     ash    #-6    ,r2
  652.     add    r1    ,r2
  653.     bic    #^c77    ,r2
  654.     br    90$
  655.  
  656. 30$:    bic    #170000    ,r2
  657. 90$:    mov    r2    ,10+2(sp)
  658. 100$:    unsave    <r3,r2,r1,r0>
  659.     return
  660.  
  661.  
  662.     .sbttl    CRC calculation
  663.  
  664. crcclc:    save    <r1,r2,r3,r4,r5>
  665.     clr    r0
  666.     mov    @r5    ,r3
  667.     mov    2(r5)    ,r4
  668.     beq    100$
  669.  
  670. 10$:    clr    r1
  671.     bisb    (r3)+    ,r1
  672.     tst    parity
  673.     beq    20$
  674.     bic    #^c177    ,r1
  675. 20$:    ixor    r0    ,r1
  676.     mov    r1    ,r2
  677.     ash    #-4    ,r2
  678.     bic    #^c17    ,r2
  679.     bic    #^c17    ,r1
  680.     asl    r1
  681.     asl    r2
  682.     mov    crctb2(r1),r1
  683.     ixor    crctab(r2),r1
  684.     swab    r0
  685.     bic    #^c377    ,r0
  686.     ixor    r1    ,r0
  687.     sob    r4    ,10$
  688.  
  689. 100$:    unsave    <r5,r4,r3,r2,r1>
  690.     return
  691.  
  692.     .save
  693.     .psect    $pdata
  694. crctab:    .word         0 ,010201 ,020402 ,030603 ,041004 ,051205 ,061406 ,071607
  695.     .word    102010 ,112211 ,122412 ,132613 ,143014 ,153215 ,163416 ,173617
  696. crctb2:    .word         0 ,010611 ,021422 ,031233 ,043044 ,053655 ,062466 ,072277
  697.     .word    106110 ,116701 ,127532 ,137323 ,145154 ,155745 ,164576 ,174367
  698.     .restore
  699.  
  700.  
  701.     .sbttl    Buffer file being sent
  702.  
  703. buffil::save    <r2,r3,r4,r5>
  704.     mov    @r5    ,r4
  705.     clr    r3
  706.     mov    senlng    ,r5
  707.     bne    5$
  708. 4$:    bisb    conpar+p.spsiz,r5
  709. 5$:    cmp    r5    ,senlen
  710.     ble    7$
  711.     mov    senlen    ,r5
  712. 7$:    sub    #10    ,r5
  713.  
  714. 10$:    tst    dorpt
  715.     beq    50$
  716.  
  717. 15$:    call    gnc
  718.     bcs    30$
  719.     tst    rptinit
  720.     beq    20$
  721.     clr    rptinit
  722.     clr    rptcount
  723.     movb    r1    ,rptlast
  724. 20$:    cmpb    r1    ,rptlast
  725.     bne    30$
  726.     cmp    rptcount,#maxpak
  727.     bge    30$
  728.     inc    rptcount
  729.     br    15$
  730.  
  731. 30$:    mov    r1    ,rptsave
  732.     tst    rptcount
  733.     beq    90$
  734.  
  735.     cmp    rptcount,#2
  736.     bgt    40$
  737. 35$:    clr    r1
  738.     bisb    rptlast    ,r1
  739.     call    200$
  740.     dec    rptcount
  741.     bne    35$
  742.     br    45$
  743.  
  744. 40$:    movb    rptquo    ,(r4)+
  745.     inc    r3
  746.     tochar    rptcount,(r4)+
  747.     inc    r3
  748.     clr    r1
  749.     bisb    rptlast    ,r1
  750.     call    200$
  751. 45$:    movb    rptsave    ,rptlast
  752.     clr    rptcount
  753.     tst    r0
  754.     bne    90$
  755.     inc    rptcount
  756.     br    70$
  757.  
  758. 50$:    call    gnc
  759.     bcs    90$
  760.     call    200$
  761.  
  762. 70$:    cmp    r3    ,r5
  763.     blo    10$
  764.  
  765. 90$:    mov    r3    ,r1
  766.     beq    100$
  767.     clr    r0
  768. 100$:    unsave    <r5,r4,r3,r2>
  769.     return
  770.  
  771.  
  772.     .sbttl    Actually quote and stuff the char for BUFFIL
  773.  
  774. 200$:    tst    do8bit
  775.     beq    210$
  776.     tstb    r1
  777.     bpl    210$
  778.      movb    ebquot    ,(r4)+
  779.      inc    r3
  780.      bicb    #200    ,r1
  781. 210$:    clr    r2
  782.     bisb    r1    ,r2
  783.     bic    #^c177    ,r2
  784.  
  785.     cmpb    r2    ,#space
  786.     blo    220$
  787.     cmpb    r2    ,#del
  788.     beq    220$
  789.     cmpb    r2    ,senpar+p.qctl
  790.     beq    220$
  791.     tst    do8bit
  792.     beq    215$
  793.     cmpb    r2    ,ebquot
  794.     beq    220$
  795. 215$:    tst    dorpt
  796.     beq    230$
  797.     cmpb    r2    ,rptquo
  798.     bne    230$
  799.  
  800. 220$:    movb    senpar+p.qctl,(r4)+
  801.     inc    r3
  802.     cmpb    r2    ,#37
  803.     blos    225$
  804.     cmpb    r2    ,#del
  805.     bne    230$
  806. 225$:    ctl    r1    ,r1
  807.     ctl    r2    ,r2
  808. 230$:    tst    image
  809.     beq    240$
  810.     movb    r1    ,(r4)+
  811.     br    250$
  812. 240$:    movb    r2    ,(r4)+
  813. 250$:    inc    r3
  814.     return
  815.  
  816.  
  817.     .sbttl    Get the next char
  818.  
  819. gnc:    mov    #lun.in    ,r0
  820.     call    getcr0
  821.     tst    r0
  822.     beq    100$
  823.     sec
  824.     return
  825. 100$:    add    #1    ,fileout+2
  826.     adc    fileout+0
  827.     clc
  828.     return
  829.  
  830.  
  831.     .sbttl    Like bufemp, but return data to a buffer
  832.  
  833. bufunp::save    <r2,r3,r4,r5>
  834.     mov    @r5    ,r2
  835.     clr    r3
  836.     mov    2(r5)    ,r4
  837.  
  838. 10$:    clr    r0
  839.     bisb    (r2)+    ,r0
  840.     beq    100$
  841.     bic    #^c177    ,r0
  842.     mov    #1    ,r5
  843.     tst    dorpt
  844.     beq    20$
  845.     cmpb    r0    ,rptquo
  846.     bne    20$
  847.     clr    r5
  848.     bisb    (r2)+    ,r5
  849.     bic    #^c177    ,r5
  850.     unchar    r5    ,r5
  851.     tst    r5
  852.     bgt    15$
  853.     mov    #1    ,r5
  854. 15$:    clr    r0
  855.     bisb    (r2)+    ,r0
  856.     bic    #^c177    ,r0
  857. 20$:    cmpb    r0    ,senpar+p.qctl
  858.     bne    30$
  859.     clr    r0
  860.     bisb    (r2)+    ,r0
  861.     clr    r1
  862.     bisb    r0    ,r1
  863.     bic    #^c177    ,r1
  864.     cmpb    r1    ,senpar+p.qctl
  865.     beq    30$
  866.     ctl    r0    ,r0
  867.  
  868. 30$:    movb    r0    ,(r4)+
  869.     inc    r3
  870.     sob    r5    ,30$
  871.     br    10$
  872.  
  873. 100$:    clrb    @r4
  874.     mov    r3    ,r1
  875.     clr    r0
  876.     unsave    <r5,r4,r3,r2>
  877.     return
  878.  
  879.  
  880.     .sbttl    Dump a debug packet to disk
  881.     .enabl    lsb
  882.  
  883. dskdmp::save
  884.     sub    #64    ,sp
  885.     mov    sp    ,r1
  886.     mov    #64    ,r0
  887. 10$:    movb    #space    ,(r1)+
  888.     sob    r0    ,10$
  889.     mov    sp    ,r1
  890.     mov    (r5)+    ,r0
  891.     call    200$
  892.     dec    r1
  893.     mov    #110$    ,r0
  894.     call    200$
  895.     inc    r1
  896.     mov    (r5)+    ,r0
  897.     deccvt    r0    ,r1    ,#2
  898.     add    #6    ,r1
  899.     mov    #120$    ,r0
  900.     call    200$
  901.     inc    r1
  902.     movb    (r5)+    ,(r1)
  903.     inc    r5
  904.     cmpb    (r1)    ,#badchk
  905.     bne    12$
  906.     movb    #'*    ,(r1)
  907.     br    17$
  908. 12$:    cmpb    (r1)    ,#'A&137
  909.     blt    13$
  910.     cmpb    (r1)    ,#'Z&137
  911.     ble    17$
  912. 13$:    movb    #'?    ,(r1)
  913. 17$:    add    #5    ,r1
  914.     mov    #130$    ,r0
  915.     call    200$
  916.     inc    r1
  917.     mov    (r5)+    ,r2
  918.     deccvt    r2    ,r1    ,#4
  919.     add    #4    ,r1
  920.     clrb    @r1
  921.     mov    sp    ,r1
  922.     strlen    r1
  923.     calls    putrec    ,<r1,r0,#lun.lo>
  924.     tst    r0
  925.     beq    27$
  926.     call    logerr
  927.     br    50$
  928. 27$:    mov    @r5    ,r3
  929.     cmp    r2    ,#$allsiz-2
  930.     ble    29$
  931.     mov    #$allsiz-2,r2
  932. 29$:    mov    r2    ,r4
  933. 30$:    mov    r4    ,r0
  934.     ble    50$
  935.     cmp    r0    ,#72.
  936.     ble    40$
  937.     mov    #72.    ,r0
  938. 40$:    call    300$
  939.     calls    putrec    ,<r3,r0,#lun.lo>
  940.     tst    r0
  941.     beq    47$
  942.     call    logerr
  943.     br    50$
  944. 47$:    add    #72.    ,r3
  945.     sub    #72.    ,r4
  946.     br    30$
  947.  
  948. 50$:    add    #64    ,sp
  949.     unsave
  950.     return
  951.  
  952. 200$:    movb    (r0)+    ,(r1)+
  953.     bne    200$
  954.     dec    r1
  955.     movb    #space    ,(r1)+
  956.     return
  957.  
  958. 300$:    save    <r2,r1,r0>
  959.     mov    #4    ,r2
  960.     mov    #lun.lo    ,r1
  961. 310$:    mov    #space    ,r0
  962.     call    putcr0
  963.     sob    r2    ,310$
  964.     unsave    <r0,r1,r2>
  965.     return
  966.  
  967.     .save
  968.     .psect    $pdata
  969. 110$:    .asciz    "Paknum"
  970. 120$:    .asciz    "Type"
  971. 130$:    .asciz    "Length"
  972. 140$:    .asciz    "    "
  973.     .even
  974.     .restore
  975.  
  976.     .dsabl    lsb
  977.  
  978.  
  979.     .sbttl    Error message handler
  980.  
  981. error::    save    <r1,r2,r3,r4,r5>
  982.     mov    (r5)+    ,r1
  983.     beq    100$
  984.  
  985.     sub    #erbfsiz+2,sp
  986.     mov    sp    ,r4
  987.     mov    #erbfsiz,r2
  988.  
  989. 30$:    mov    (r5)+    ,r3
  990. 40$:    movb    (r3)+    ,@r4
  991.     beq    50$
  992. 45$:    inc    r4
  993.     sob    r2    ,40$
  994.     br    60$
  995. 50$:    dec    r2
  996.     beq    60$
  997.     sob    r1    ,30$
  998. 60$:    clrb    @r4
  999.  
  1000.     mov    sp    ,r4
  1001.     strlen    r4
  1002.     spack    #msg$error,paknum,r0,r4
  1003.     bit    #log$pa    ,trace
  1004.     beq    99$
  1005.     strlen    r4
  1006.     calls    putrec    ,<r4,r0,#lun.lo>
  1007.     tst    r0
  1008.     beq    99$
  1009.     call    logerr
  1010. 99$:    add    #erbfsiz+2,sp
  1011. 100$:    unsave    <r5,r4,r3,r2,r1>
  1012.     return
  1013.  
  1014.  
  1015.     .sbttl    Logfile error handler
  1016.  
  1017. logerr::calls    syserr    ,<r0,#errtxt>
  1018.     .close    #lun.lo
  1019.     clr    trace
  1020.     mov    #er$lwe    ,r0
  1021.     calls    syserr    ,<r0,#spare1>
  1022.     strcat    #spare1    ,#RX2$
  1023.     strcat    #spare1    ,#errtxt
  1024.     strlen    #spare1
  1025.     spack    #MSG$ERROR,paknum,r0,#spare1
  1026.     return
  1027.  
  1028.  
  1029.     .sbttl    Process retry and sync errors
  1030.  
  1031. m$retr::save    <r0>
  1032.     bitb    #200    ,recbit
  1033.     beq    10$
  1034.     tst    parity
  1035.     bne    10$
  1036.     calls    error    ,<#2,#e$retr,#e$par>
  1037.     br    100$
  1038. 10$:    calls    error    ,<#1,#e$retr>
  1039. 100$:    unsave    <r0>
  1040.     return
  1041.  
  1042. m$sync::save    <r0>
  1043.     calls    error    ,<#1,#e$sync>
  1044.     unsave    <r0>
  1045.     return
  1046.  
  1047.  
  1048.     .sbttl    Compute parity for an outgoing 8-bit link
  1049.  
  1050. dopari::save    <r0,r1>
  1051.     mov    parity    ,r0
  1052.     beq    10$
  1053.     asl    r0
  1054.     mov    6(sp)    ,r1
  1055.     jsr    pc    ,@pardsp(r0)
  1056.     mov    r1    ,6(sp)
  1057. 10$:    unsave    <r1,r0>
  1058.     return
  1059.  
  1060. mark.p:    bisb    #200    ,r1
  1061.     return
  1062.  
  1063. spac.p:    bicb    #200    ,r1
  1064.     return
  1065.  
  1066. odd.p:    bic    #^c177    ,r1
  1067.     tstb    partab(r1)
  1068.     bne    100$
  1069.     bisb    #200    ,r1
  1070. 100$:    return
  1071.  
  1072. even.p:    bic    #^c177    ,r1
  1073.     tstb    partab(r1)
  1074.     beq    100$
  1075.     bisb    #200    ,r1
  1076. 100$:    return
  1077.  
  1078.     .save
  1079.     .psect    $pdata
  1080. pardsp:    .word    0  ,odd.p  ,even.p  ,mark.p  ,spac.p
  1081. partab:    .byte    0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
  1082.     .byte    1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
  1083.     .byte    1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
  1084.     .byte    0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
  1085.     .byte    1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
  1086.     .byte    0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
  1087.     .byte    0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
  1088.     .byte    1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1
  1089.     .restore
  1090.  
  1091.     .end
  1092.