home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / b / krtrms.min < prev    next >
Text File  |  2020-01-01  |  10KB  |  682 lines

  1.     .title    KRTRMS.MIN  RT-11 file I/O
  2.     .ident    "V03.62"
  3.  
  4. ; /62/    31-May-93  Billy Youdelman
  5.  
  6. ;    Copyright 1984,1986 Change Software, Inc.
  7.  
  8.     .include "IN:KRTMAC.MIN"
  9.     .iif ndf  KRTINC  .error    <; .include for IN:KRTMAC.MIN failed>
  10.     .include "IN:KRTDEF.MIN"
  11.     .iif ndf  MSG$DA  .error    <; .include for IN:KRTDEF.MIN failed>
  12.  
  13.     .MCALL    .CLOSE    ,.CSISPC,.DSTAT    ,.ENTER    ,.EXIT    ,.GTLIN
  14.     .MCALL    .LOOKUP,.PURGE    ,.RCTRLO,.READW    ,.WRITW
  15.  
  16.     .sbttl    I/O database
  17.  
  18.     LUN.KB    == 0
  19.     LUN.IN    == 1
  20.     LUN.OU    == 2
  21.     LUN.LO    == 3
  22.     LUN.TA    == 4
  23.     LUN.AT    == 5
  24.     LUN.SR    == 6
  25.     NRTQUE    == 10
  26.     PROT    =  100000
  27.     TTBSIZ    == 40
  28.  
  29.     .psect    $rtque    ,rw,d,gbl,rel,con
  30. rtque::    .blkw    10.*nrtque
  31.  
  32.     .psect    rtioda    ,rw,d,gbl,rel,con
  33. blknum::.word    0    ,0    ,0    ,0    ,0
  34. buflst::.word    ttbuf    ,0    ,0    ,0    ,0
  35. bufsiz::.word    ttbsiz    ,maxsiz    ,maxsiz    ,maxsiz    ,maxsiz
  36. bufp::    .word    0    ,0    ,0    ,0    ,0
  37. bufs::    .word    0    ,0    ,0    ,0    ,0
  38. date.a::.word    0    ,0    ,0    ,0    ,0
  39. filtyp::.word    terminal,text    ,text    ,text    ,text
  40. mode::    .word    1    ,0    ,0    ,0    ,0
  41. prot.a::.word    0    ,0    ,0    ,0    ,0
  42. sizof::    .word    0    ,0    ,0    ,0    ,0
  43.  
  44. status::.word    0
  45. totp.s::.word    0
  46. totp.r::.word    0
  47. ttbuf::    .blkb    ttbsiz+2
  48.  
  49. asname::.blkb    ln$max
  50. bintyp::.word    0
  51. context::.word    0
  52. cstat::    .word    0 ,0 ,0 ,0 ,0 ,0
  53. dblk::    .rad50    "   "
  54.     .word    0 ,0 ,0
  55. defdir::.blkb    4+2
  56. defext:    .word    0 ,0 ,0 ,0
  57. dirbfr::.word    0
  58. dirflg::.word    0
  59. dirnam::.word    0
  60. dkblk::    .rad50    "DK "
  61.     .word    0 ,0 ,0
  62. dkname::.asciz    "DK:"
  63.     .byte    0 ,0
  64. en$siz::.word    0
  65. filnam::.blkb    ln$max
  66. indnam::.blkb    16+2
  67. ininam::.blkb    16+2
  68. logfil::.blkb    16+2
  69. lokdate::.word    0
  70. loklen::.word    0
  71. lokstat::.word    0
  72. r50out:    .word    0 ,0 ,0 ,0
  73. rtwork::.word    0 ,0 ,0 ,0 ,0 ,0 ,0 ,0
  74. srcnam::.blkb    ln$max
  75.  
  76. freept::.word    0
  77. hilimi::.word    50
  78. maxtop::.word    0
  79. rt11ve::.word    0
  80.  
  81.  
  82.     .sbttl    Error mapping, codes are defined in KRTERR.MIN
  83.  
  84.     .psect    $pdata
  85. cloerr::.word    er$sy1    ,er$sy1    ,er$sys    ,er$prv
  86. csierr::.word    er$fnm    ,er$dev    ,er$sy2
  87. drderr::.word    fa$dio    ,er$rer    ,er$nop    ,er$sys
  88. dsterr::.word    fa$nhd
  89. enterr::.word    er$lby    ,er$ful    ,er$sy3    ,er$prv    ,er$sy3
  90. faterr::.word    fa$imp    ,fa$nhd    ,fa$dio    ,er$sys    ,fa$ovr    ,fa$dfl    ,fa$adr
  91.     .word    fa$lun    ,fa$imp    ,fa$imp    ,fa$imp    ,er$sys    ,fa$imp    ,fa$imp
  92.     .word    fa$imp    ,fa$imp    ,fa$imp    ,fa$imp    ,fa$dio
  93. lokerr::.word    er$lby    ,er$fnf    ,er$sys
  94. reaerr::.word    er$eof    ,er$rer    ,er$nop    ,er$sys
  95. renerr::.word    er$lby    ,er$fnf    ,er$iop    ,er$prv
  96. wrierr::.word    er$eof    ,er$wer    ,er$nop    ,er$sys
  97.  
  98.  
  99.     .sbttl    Get KMON command line args and pass to Kermit
  100.  
  101. getmcr::save    <r1,r2,r3>
  102.     mov    sp    ,mcrcmd
  103.     mov    #510    ,r1
  104.     mov    @r1    ,r2
  105.     dec    @r1
  106.     ble    40$
  107.     clr    (r1)+
  108.     mov    @r5    ,r3
  109. 3401$:    movb    (r1)+    ,(r3)+
  110.     bne    3401$
  111.     sub    #82.    ,sp
  112.     mov    sp    ,r0
  113.     .gtlin    r0
  114.     add    #82.    ,sp
  115.     mov    r2    ,r0
  116.     br    90$
  117. 40$:    mov    @r5    ,r0
  118.     clrb    @r0
  119.     clr    r0
  120. 90$:    unsave    <r3,r2,r1>
  121.     return
  122.  
  123.  
  124.     .sbttl    Not really fetch, just check in this version..
  125.  
  126. fetch::    .dstat    #rtwork,r5
  127.     bcs    70$
  128.     tst    rtwork+4
  129.     bne    50$
  130.     mov    #er$dev    ,r0
  131.     br    100$
  132. 50$:    clr    r0
  133.     br    100$
  134.  
  135. 70$:    mov    #dsterr    ,-(sp)
  136.     movb    @#errbyt,r0
  137.     bpl    95$
  138.     com    r0
  139.     mov    #faterr    ,(sp)
  140. 95$:    asl    r0
  141.     add    (sp)+    ,r0
  142.     mov    @r0    ,r0
  143. 100$:    return
  144.  
  145.  
  146.     .sbttl    Parse file name and fill in with defaults
  147.  
  148. fparse::save    <r3,r2,r1>
  149.     mov    2(r5)    ,r2
  150.     mov    @r5    ,r1
  151.     mov    #er$fnm    ,r0
  152.     cmpb    @r1    ,#comma
  153.     beq    100$
  154.     cmpb    @r1    ,#'D
  155.     bne    1$
  156.     cmpb    1(r1)    ,#'K
  157.     bne    1$
  158.     cmpb    2(r1)    ,#':
  159.     beq    5$
  160.  
  161. 1$:    scan    #':    ,r1
  162.     mov    r0    ,r3
  163.     beq    7$
  164.  
  165. 3$:    movb    (r1)+    ,(r2)+
  166.     sob    r0    ,3$
  167.     clrb    @r2
  168.     br    20$
  169.  
  170. 5$:    add    #3    ,r1
  171. 7$:    mov    #defdir    ,r0
  172. 10$:    movb    (r0)+    ,(r2)+
  173.     bne    10$
  174.     dec    r2
  175. 20$:    copyz    r1    ,r2 ,#ln$max-4
  176.     clr    r0
  177. 100$:    unsave    <r1,r2,r3>
  178.     return
  179.  
  180.  
  181.     .sbttl    Is it wild?
  182.  
  183. iswild::save    <r1>
  184.     mov    @r5    ,r1
  185.     scan    #comma    ,r1
  186.     tst    r0
  187.     bne    90$
  188.     scan    #'.    ,r1
  189.     tst    r0
  190.     beq    90$
  191.     clr    r0
  192. 5$:    cmpb    @r1    ,#'.
  193.     beq    90$
  194. 10$:    tstb    @r1
  195.     beq    100$
  196.     cmpb    @r1    ,#'%
  197.     beq    90$
  198.     cmpb    @r1    ,#'*
  199.     beq    90$
  200.     cmpb    (r1)+    ,#':
  201.     bne    10$
  202.     tstb    @r1
  203.     bne    5$
  204. 90$:    mov    #er$wld    ,r0
  205. 100$:    unsave    <r1>
  206.     return
  207.  
  208.  
  209.     .psect    $code
  210.     .sbttl    Open a file
  211.     .enabl    lsb
  212.  
  213. create::mov    #1    ,r0
  214.     br    1$
  215.  
  216. open::    clr    r0
  217. 1$:    save    <r1,r2,r3,r4,r5>
  218.     mov    r0    ,r2
  219.     mov    (r5)    ,r1
  220.     mov    2(r5)    ,r4
  221.     mov    r4    ,r3
  222.     asl    r4
  223.     bne    10$
  224.     mov    sp    ,mode+0
  225.     clr    bufp+0
  226.     clr    r0
  227.     jmp    110$
  228.  
  229. 10$:    sub    #40.*2    ,sp
  230.     clr    sizof(r4)
  231.     clr    bufp(r4)
  232.     clr    bufs(r4)
  233.     clr    mode(r4)
  234.     clr    blknum(r4)
  235.     mov    4(r5)    ,filtyp(r4)
  236.     mov    buflst(r4),r0
  237.     mov    bufsiz(r4),r5
  238. 20$:    clrb    (r0)+
  239.     sob    r5    ,20$
  240.     mov    sp    ,r5
  241. 30$:    movb    (r1)+    ,(r5)+
  242.     bne    30$
  243.     dec    r5
  244.     movb    #'=    ,(r5)+
  245.     clrb    @r5
  246.     mov    sp    ,r5
  247.     mov    #csierr    ,r1
  248.     .csispc    r5,#defext,r5
  249.     mov    r5    ,sp
  250.     bcs    80$
  251. 40$:    call    fetch
  252.     tst    r0
  253.     bne    100$
  254.     tst    r2
  255.     bne    50$
  256.  
  257. 45$:    mov    #lokerr    ,r1
  258.     .lookup    #rtwork,r3,r5
  259.     bcs    80$
  260.     mov    r0    ,sizof(r4)
  261.     mov    #-1    ,bufp(r4)
  262.     call    clr.at
  263.     mov    lokdate    ,date.a(r4)
  264.     bit    #prot    ,lokstat
  265.     beq    49$
  266.     inc    prot.a(r4)
  267. 49$:    clr    r0
  268.     br    100$
  269.  
  270. 50$:    tst    2(r5)
  271.     bne    60$
  272.     mov    #csierr    ,r1
  273.     br    80$
  274. 60$:    mov    #enterr    ,r1
  275.     mov    en$siz    ,r2
  276.     bne    70$
  277.     mov    at$len    ,r2
  278. 70$:    .enter    #rtwork,r3,r5,r2
  279.     bcs    80$
  280.     clr    en$siz
  281.     mov    r0    ,sizof(r4)
  282.     mov    sp    ,mode(r4)
  283.     cmp    r3    ,#lun.ou
  284.     bne    77$
  285.     clr    skipfile
  286.     mov    r5    ,r0
  287.     mov    #r50out    ,r1
  288.     mov    (r0)+    ,(r1)+
  289.     mov    (r0)+    ,(r1)+
  290.     mov    (r0)+    ,(r1)+
  291.     mov    (r0)    ,(r1)
  292. 77$:    clr    r0
  293.     br    100$
  294.  
  295. 80$:    movb    @#errbyt,r0
  296.     bpl    90$
  297.     com    r0
  298.     mov    #faterr    ,r1
  299. 90$:    asl    r0
  300.     add    r0    ,r1
  301.     call    clr.at
  302.     asr    r4
  303.     .purge    r4
  304.     mov    (r1)    ,r0
  305. 100$:    add    #40.*2    ,sp
  306. 110$:    unsave    <r5,r4,r3,r2,r1>
  307.     return
  308.  
  309.     .dsabl    lsb
  310.  
  311.  
  312.     .sbttl    Clear attributes
  313.  
  314. clr.at:    clr    date.a(r4)
  315.     clr    prot.a(r4)
  316.     return
  317.  
  318.  
  319.     .sbttl    Preset a file I/O channel to desired block and offset
  320.  
  321. prewind::save    <r2,r3>
  322.     mov    @r5    ,r2
  323.     asl    r2
  324.     mov    2(r5)    ,blknum(r2)
  325.     mov    bufsiz(r2),r3
  326.     asr    r3
  327.     .readw    #rtwork,@r5,buflst(r2),r3,blknum(r2)
  328.     bcs    100$
  329.     inc    blknum(r2)
  330.     mov    4(r5)    ,r3
  331.     mov    r3    ,bufp(r2)
  332.     asl    r0
  333.     sub    r3    ,r0
  334.     mov    r0    ,bufs(r2)
  335. 100$:    unsave    <r3,r2>
  336.     return
  337.  
  338.  
  339.     .sbttl    Set buffer pointers to the top of a file
  340.  
  341. rewind::mov    @r5    ,r0
  342.     beq    100$
  343.     asl    r0
  344.     mov    #-1    ,bufp(r0)
  345.     clr    bufs(r0)
  346.     clr    blknum(r0)
  347. 100$:    clr    r0
  348.     return
  349.  
  350.  
  351.     .sbttl    Close a file
  352.  
  353. close::    save    <r4,r2>
  354.     cmp    @r5    ,#lun.ou
  355.     bne    1$
  356.     tst    skipfile
  357.     beq    1$
  358.     .purge    @r5
  359.     clr    skipfile
  360.     br    19$
  361.  
  362. 1$:    mov    @r5    ,r4
  363.     asl    r4
  364.     tst    bufp(r4)
  365.     beq    7$
  366.     tst    mode(r4)
  367.     beq    7$
  368.     tst    r4
  369.     bne    3$
  370.     mov    buflst(r4),r0
  371.     add    bufp(r4),r0
  372.     clrb    (r0)
  373.     wrtall    buflst(r4)
  374.     br    19$
  375.  
  376. 3$:    mov    bufsiz(r4),r2
  377.     asr    r2
  378.     .writw    #rtwork,@r5,buflst(r4),r2,blknum(r4)
  379.     bcc    7$
  380.     movb    @#errbyt,r0
  381.     asl    r0
  382.     mov    wrierr(r0),r0
  383.     save    <r0>
  384.     .close    @r5
  385.     unsave    <r0>
  386.     br    20$
  387.  
  388. 7$:    mov    @r5    ,r4
  389.     beq    19$
  390.     .close    r4
  391.     bcc    10$
  392.     movb    @#errbyt,r0
  393.     asl    r0
  394.     mov    cloerr(r0),r0
  395.     br    20$
  396.  
  397. 10$:    cmp    rt11ver    ,#5
  398.     blt    19$
  399.     cmp    r4    ,#lun.ou
  400.     bne    19$
  401.     asl    r4
  402.     tst    date.a(r4)
  403.     beq    13$
  404.     MOV    #rtwork    ,R0
  405.     MOV    #lun.at+<34.*^o400>,@R0
  406.     MOV    #r50out    ,2.(R0)
  407.     MOV    date.a(r4),4.(R0)
  408.     EMT    ^o375
  409. 13$:    tst    prot.a(r4)
  410.     beq    19$
  411.     MOV    #rtwork    ,R0
  412.     MOV    #lun.at+<35.*^o400>,@R0
  413.     MOV    #r50out    ,2.(R0)
  414.     MOVB    #1    ,4.(R0)
  415.     EMT    ^o375
  416. 19$:    clr    r0
  417.  
  418. 20$:    mov    @r5    ,r4
  419.     asl    r4
  420.     clr    bufp(r4)
  421.     clr    sizof(r4)
  422.     call    clr.at
  423.     save    <r0>
  424.     .rctrlo
  425.     unsave    <r0>
  426.     unsave    <r2,r4>
  427.     return
  428.  
  429.  
  430.     .sbttl    Get one character from a file
  431.  
  432. getc::    mov    @r5    ,r0
  433.     jmp    getcr0
  434.  
  435. fgetcr::save    <r3>
  436. 10$:    mov    r0    ,r3
  437.     call    .getc
  438.     tst    r0
  439.     bne    100$
  440.     asl    r3
  441.     cmp    filtyp(r3),#text
  442.     bne    100$
  443.     tstb    r1
  444.     bne    100$
  445.     asr    r3
  446.     mov    r3    ,r0
  447.     br    10$
  448. 100$:    unsave    <r3>
  449.     return
  450.  
  451. .getc:    save    <r2,r3>
  452.     mov    r0    ,r2
  453.     mov    r0    ,r1
  454.     asl    r2
  455.     tst    bufs(r2)
  456.     beq    10$
  457.     cmp    bufp(r2),#-1
  458.     bne    20$
  459. 10$:    mov    bufsiz(r2),r3
  460.     asr    r3
  461.     .readw    #rtwork,r1,buflst(r2),r3,blknum(r2)
  462.     bcs    90$
  463.     inc    blknum(r2)
  464.     clr    bufp(r2)
  465.     asl    r0
  466.     mov    r0    ,bufs(r2)
  467.  
  468. 20$:    mov    buflst(r2),r3
  469.     add    bufp(r2),r3
  470.     clr    r1
  471.     bisb    @r3    ,r1
  472.     inc    bufp(r2)
  473.     dec    bufs(r2)
  474.     clr    r0
  475.     br    100$
  476.  
  477. 90$:    movb    @#errbyt,r0
  478.     asl    r0
  479.     mov    reaerr(r0),r0
  480. 100$:    unsave    <r3,r2>
  481.     return
  482.  
  483.  
  484.     .sbttl    Read a record from a sequential file
  485.  
  486. getrec::save    <r2,r3,r4>
  487.     clr    r4
  488.     mov    @r5    ,r3
  489.     mov    4(r5)    ,r2
  490.     clr    r1
  491.  
  492. 10$:    cmpb    r1    ,#ff
  493.     beq    30$
  494.     mov    2(r5)    ,r0
  495.     call    getcr0
  496.     tst    r0
  497.     bne    100$
  498.     cmpb    r1    ,#cr
  499.     beq    30$
  500.     cmpb    r1    ,#'z&37
  501.     beq    30$
  502.     cmpb    r1    ,#lf
  503.     beq    10$
  504.     inc    r4
  505.     movb    r1    ,(r3)+
  506.     sob    r2    ,10$
  507.     mov    #er$rtb    ,r0
  508.     br    100$
  509.  
  510. 30$:    cmpb    r1    ,#'z&37
  511.     bne    40$
  512.     mov    #er$eof    ,r0
  513.     clr    r1
  514.     br    100$
  515. 40$:    mov    r4    ,r1
  516. 100$:    unsave    <r4,r3,r2>
  517.     return
  518.  
  519.  
  520.     .sbttl    Put a single character to a file
  521.  
  522. putc::    save    <r1>
  523.     mov    2(r5)    ,r1
  524.     clr    r0
  525.     bisb    @r5    ,r0
  526.     call    putcr0
  527.     unsave    <r1>
  528.     return
  529.  
  530. putcr0::save    <r1,r2,r3,r4>
  531.     mov    r1    ,r2
  532.     asl    r2
  533.     cmp    bufp(r2),bufsiz(r2)
  534.     blo    20$
  535.     movb    r0    ,r3
  536.     mov    bufsiz(r2),r4
  537.     asr    r4
  538.     tst    r1
  539.     beq    3$
  540.     cmp    filtyp(r2),#terminal
  541.     bne    4$
  542. 3$:    mov    buflst(r2),r0
  543.     add    bufsiz(r2),r0
  544.     clrb    (r0)
  545.     wrtall    buflst(r2)
  546.     br    5$
  547. 4$:    .writw    #rtwork,r1,buflst(r2),r4,blknum(r2)
  548.     bcs    90$
  549. 5$:    inc    blknum(r2)
  550.     clr    bufp(r2)
  551.     mov    buflst(r2),r4
  552.     mov    bufsiz(r2),r0
  553. 10$:    clrb    (r4)+
  554.     sob    r0    ,10$
  555.     movb    r3    ,r0
  556. 20$:    mov    bufp(r2),r1
  557.     add    buflst(r2),r1
  558.     movb    r0    ,@r1
  559.     inc    bufp(r2)
  560.     clr    r0
  561.     br    100$
  562.  
  563. 90$:    movb    @#errbyt,r0
  564.     asl    r0
  565.     mov    wrierr(r0),r0
  566. 100$:    unsave    <r4,r3,r2,r1>
  567.     return
  568.  
  569.  
  570.     .sbttl    Put a record to a sequential file
  571.  
  572. putrec::save    <r1,r2,r3>
  573.     mov    2(r5)    ,r2
  574.     mov    @r5    ,r3
  575.     mov    4(r5)    ,r1
  576.     bne    10$
  577.  
  578.     tst    r2
  579.     beq    100$
  580.     mov    r3    ,r0
  581.     add    r2    ,r0
  582.     clrb    (r0)
  583.     wrtall    r3
  584.     clr    r0
  585.     br    100$
  586.  
  587. 10$:    tst    r2
  588.     beq    30$
  589.  
  590. 20$:    clr    r0
  591.     bisb    (r3)+    ,r0
  592.     call    putcr0
  593.     tst    r0
  594.     bne    100$
  595.     sob    r2    ,20$
  596.  
  597. 30$:    asl    r1
  598.     cmp    filtyp(r1),#text
  599.     bne    100$
  600.     asr    r1
  601.     mov    #cr    ,r0
  602.     call    putcr0
  603.     tst    r0
  604.     bne    100$
  605.     mov    #lf    ,r0
  606.     call    putcr0
  607. 100$:    unsave    <r3,r2,r1>
  608.     return
  609.  
  610.  
  611.     .sbttl    Suspend the mainline program
  612.  
  613. suspen::save    <r1>
  614.     mov    @r5    ,r1    ; secs to wait arg
  615.     beq    10$        ; no secs passed
  616.     mul    #60.    ,r1    ; secs --> ticks
  617.     br    20$        ; ignore passed ticks
  618. 10$:    mov    2(r5)    ,r1    ; ticks to wait arg
  619.     beq    100$        ; nothing to do..
  620. 20$:    mov    r1    ,-(sp)    ; ticks into outer loop
  621.     clr    -(sp)        ; init inner loop count
  622. 27$:    mov    #13700/2,(sp)    ; this takes 1/60 second with
  623. 29$:    dec    (sp)        ; a vaule of 13700 on an 11/44
  624.     bne    29$        ; try 13700/2 for default
  625.     dec    2(sp)        ; end of inner loop
  626.     bne    27$        ; now do the outer loop
  627.     cmp    (sp)+    ,(sp)+    ; done
  628. 100$:    unsave    <r1>
  629.     clr    r0
  630.     return
  631.  
  632.  
  633.     .sbttl    Reset the keypad
  634.  
  635. kp.clr::wrtall    #kp.res
  636.     return
  637.  
  638.     .save
  639.     .psect    $pdata
  640. kp.res:    .byte    33 ,'> ,0
  641.     .even
  642.     .restore
  643.  
  644.  
  645.     .sbttl    Exit to KMON
  646.  
  647. exit::    tst    sl.on
  648.     beq    10$
  649.     tst    sl.ked
  650.     beq    10$
  651.     call    kp.clr
  652. 10$:    mov    #cr    ,r0
  653.     call    writ1char
  654.     clr    r0
  655.     .exit
  656.  
  657.  
  658.     .sbttl    Main error handler
  659.  
  660. direr$::mov    r0    ,-(sp)
  661.     mov    4(sp)    ,r0
  662.     beq    10$
  663.     calls    syserr    ,<r0,#errtxt>
  664.     tst    cmdlun
  665.     beq    1$
  666.     mov    r0    ,tk.err
  667.     br    10$
  668. 1$:    wrtall    #errtxt
  669.     .newline
  670. 10$:    mov    (sp)+    ,r0
  671.     mov    @sp    ,2(sp)
  672.     tst    (sp)+
  673.     return
  674.  
  675.  
  676.     .sbttl    Increment status
  677.  
  678. incsts::inc    status
  679.     return
  680.  
  681.     .end
  682.