home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PUBPATCH / PUBPTZ10.LBR / PUBLIC.AZM / PUBLIC.ASM
Assembly Source File  |  2000-06-30  |  6KB  |  476 lines

  1. ;PUBLIC.ASM -- From Dr. Dobbs November, 1984.
  2. ;
  3. ;Utility to set/clear attribute bit 2 of filename.
  4. ;For use with PUBlic file BDOS patch.
  5. ;
  6. ;I have left out the comments to shorten the code file.  To supplement
  7. ;this file refer to original article referenced above -- pp. 61 - 72.
  8. ;
  9. ;MAC or RMAC is required for assembly.
  10. ;
  11. ;USAGE:  PUBLIC [d:]        -- lists PUBlic files (on d:)
  12. ;     PUBLIC [d:]file.ext    -- makes file.ext PUBlic
  13. ;     PUBLIC [d:]file.ext X    -- makes file.ext private
  14. ;
  15. ;     file.ext must be unambiguous - no wildcards
  16. ;
  17. ;prints drive/user number of all files of specified name,
  18. ;with attribute bits displayed as lower case
  19. ;
  20. ;
  21. vers    equ    1$0
  22. ;
  23.     maclib    z80
  24. ;
  25. false    equ    0
  26. true    equ    not false
  27. ;
  28. listpubbit    equ    0
  29. makpubbit    equ    1
  30. fence        equ    '|'
  31. ;
  32. null    equ    0
  33. bell    equ    'G'-'@'
  34. cr    equ    0dh
  35. lf    equ    0ah
  36. esc    equ    1bh
  37. space    equ    20h
  38. del    equ    7eh
  39. ;
  40. drivefn    equ    14
  41. openfn    equ    15
  42. closefn    equ    16
  43. srchfstfn    equ    17
  44. srchnxtfn    equ    18
  45. deletefn    equ    19
  46. readfn    equ    20
  47. writefn    equ    21
  48. makefn    equ    22
  49. renamefn    equ    23
  50. logvecfn    equ    24
  51. curdskfn    equ    25
  52. dmafn    equ    26
  53. setattrfn    equ    30
  54. getaddrfn    equ    31
  55. userfn    equ    32
  56. readrfn    equ    33
  57. writerfn    equ    34
  58. sizefn    equ    35
  59. ;
  60. reccnt    equ    15
  61. currec    equ    32
  62. r0    equ    33
  63. tbuff    equ    80h
  64. fcb    equ    5ch
  65. fcb2    equ    fcb+16
  66. ;
  67. boot    equ    0000h
  68. bdos    equ    0005h
  69. address    equ    0ffffh
  70. bdoslen    equ    0e00h
  71. ;
  72. ;
  73. dobdos    macro    num,arg
  74.     if not nul arg
  75.     lxi    d,arg
  76.     endif
  77.     mvi    c,num
  78.     call    5
  79.     endm
  80. ;
  81. print    macro    msg
  82.     if not nul msg
  83.     lxi    d,msg
  84.     endif
  85.     call    printde
  86.     endm
  87. ;
  88.     $-macro
  89. ;
  90.     aseg
  91.        org     0100h
  92. ;
  93. top:    jmp    start
  94. banner:    db    cr,lf,'PUBLIC vers '
  95.     db    vers/10+'0','.',(vers mod 10)+'0'
  96.     db    ' (c) 1984 Plu*Perfect Systems$'
  97. ;
  98. usage:    db     cr,lf,lf,'Usage:  '
  99.     db    'PUBLIC [d:]        -- list PUBlic files (on d:)'
  100.     db    cr,lf,'        '
  101.     db    'PUBLIC [d:]file.ext    -- make file PUBlic'
  102.     db    cr,lf,'        '
  103.     db    'PUBLIC [d:]file.ext X    -- make file private'
  104.     db    cr,lf,lf,'$'
  105. ;
  106. header:    db    cr,lf,lf,'The currently PUBlic files are:',cr,lf,'$'
  107. tomsg:    db    ' set to ==> $'
  108. pubnam:    db    'PUBLIC   $'
  109. privnam:
  110.     db    'PRIVATE  $'
  111. ismsg:    db    '  ==> is already $'
  112. ;
  113. multimsg:
  114.     db    cr,lf,bell,'*** Multiple copies, can''t change!$'
  115. nonemsg:
  116.     db    cr,lf,bell,'*** No file!$'
  117. cantmsg:
  118.     db    cr,lf,bell,'*** Can''t make file $'
  119. nopubs:    db    cr,lf,'(None.)$'
  120. ;
  121. ;
  122. start:
  123.     sspd    ustack
  124.     lxi    sp,stack
  125.     print    banner
  126.     lxi    h,fcb+1
  127.     mov    a,m
  128.     cpi    space
  129.     lxi    h,flags
  130.     res    listpubbit,m
  131.     jrnz    setup
  132.     setb    listpubbit,m
  133.     print    header
  134. ;
  135. setup:    dobdos    dmafn,buf
  136.     dobdos    curdskfn
  137.     sta    drive
  138.     sta    udrive
  139.     lda    fcb
  140.     ora    a
  141.     jrz    savusr
  142.     dcr    a
  143.     sta     drive
  144.     mov    e,a
  145.     dobdos    drivefn,
  146. ;
  147. savusr:    dobdos    userfn,0ffh
  148.     sta    uuser
  149.     dobdos    getaddrfn
  150.     inx    h
  151.     inx    h
  152.     inx    h
  153.     inx    h
  154.     mov    a,m
  155.     sta    extmask
  156.     xra    a
  157.     sta    count
  158.     lda    fcb2+1
  159.     cpi    'X'
  160.     lxi    h,flags
  161.     res    makpubbit,m
  162.     jrz    find
  163.     setb    makpubbit,m
  164. ;
  165. find:    lxi    h,fcb
  166.     mvi    m,'?'
  167.     xchg
  168.     dobdos    srchfstfn,
  169.     sta    indx
  170.     inr    a
  171.     jrz    done
  172. ;
  173. findall:
  174.     call    chknxt
  175.     jrnz    findnxt
  176.     call    savefcb
  177.     call    setcol
  178.     call    printentry
  179.     lxi    h,count
  180.     inr    m
  181. findnxt:
  182.     dobdos    srchnxtfn,fcb
  183.     sta    indx
  184.     inr    a
  185.     jrnz    findall
  186. ;
  187. nomore:    lxi    h,flags
  188.     bit    listpubbit,m
  189.     lda    count
  190.     jrz    nom0
  191.     ora    a
  192.     jrnz    done
  193.     print    nopubs
  194.     jr    done
  195. ;
  196. nom0:    sui    1
  197.     jrc    none
  198.     jrnz    nochanges
  199.     lxi    h,flags
  200.     bit    makpubbit,m
  201.     jrz    nom1
  202.     call    setpub
  203.     jr    done
  204. nom1:    call    setpriv
  205.     jr    done
  206. ;
  207. nochanges:
  208.     print    multimsg
  209.     jr    done
  210. ;
  211. none:    print    nonemsg
  212.     jr    done
  213. ;
  214. nopub:    lxi    d,pubnam
  215.     call    cant
  216. ;
  217. done:    lxi    h,flags
  218.     bit    listpubbit,m
  219.     jrz    done0
  220.     print    usage
  221. done0:    lda    udrive
  222.     mov    e,a
  223.     dobdos    drivefn,
  224. done1:    lda    uuser
  225.     mov    e,a
  226.     dobdos    userfn,
  227.     call    crlf
  228. xit:    lspd    ustack
  229.     ret
  230. ;
  231. setpub:    lxi    h,pubfcb+2
  232.     bit    7,m
  233.     jrnz    ispub
  234.     setb    7,m
  235.     lda    pubfcb
  236.     mov    e,a
  237.     dobdos    userfn,
  238.     lxi    h,pubfcb
  239.     mvi    m,0
  240.     xchg
  241.     dobdos    setattrfn,
  242.     inr    a
  243.     jrz    nopub
  244.     print    tomsg
  245.     print    pubnam
  246. setpend:
  247.     lxi    h,pubfcb
  248.     jmp    printent1
  249. ;
  250. ispub:    lxi    d,pubnam
  251.     jmp    istype
  252. ;
  253. setpriv:    
  254.     lda    pubfcb
  255.     mov    e,a
  256.     dobdos    userfn,
  257.     lxi    h,pubfcb+2
  258.     bit    7,m
  259.     jrz    ispriv
  260.     res    7,m
  261.     lxi    h,pubfcb
  262.     mvi    m,0
  263.     xchg
  264.     dobdos    setattrfn
  265.     inr    a
  266.     jrz    nopriv
  267.     print    tomsg
  268.     print   privnam
  269.     jr    setpend
  270. ;
  271. nopriv:    lxi    d,privnam
  272.     jmp    cant
  273. ;
  274. ispriv:    lxi    d,privnam
  275. ;
  276. istype:    push    d
  277.     print    ismsg
  278.     pop    d
  279. ;
  280. printde:
  281.     mvi    c,9
  282.     jmp    5
  283. ;
  284. cant:    push    d
  285.     print    cantmsg
  286.     pop    d
  287.     jr    printde
  288. ;
  289. chknxt:    call    findentry
  290.     mov    a,m
  291.     cpi    0e5h
  292.     jrnz    chkn0
  293.     ora    a
  294.     ret
  295. chkn0:    inx    h
  296.     lda    flags
  297.     bit    listpubbit,a
  298.     jrz    chkn1
  299. ;
  300.     inx    h
  301.     mov    a,m
  302.     cma
  303.     ani    80h
  304.     rnz
  305.     lxi    d,12-2
  306.     dad    d
  307.     xra    a
  308.     jr    chkn3
  309. ;
  310. chkn1:    lxi    d,fcb+1
  311.     mvi    b,11
  312. chkn2:    ldax    d
  313.     sub    m
  314.     ani    7fh
  315.     inx    h
  316.     inx    d
  317.     rnz
  318.     djnz    chkn2
  319.     ldax    d
  320. chkn3:    mov    c,m
  321. ;
  322. samext:
  323.     push    b
  324.     push    psw
  325. extmask    equ    $+1
  326.     mvi    a,00h
  327.     cma
  328.     mov    b,a
  329.     mov    a,c
  330.     ana    b
  331.     mov    c,a
  332.     pop    psw
  333.     ana    b
  334.     sub    c
  335.     ani    1fh
  336.     pop    b
  337.     ret
  338. ;
  339. savefcb:
  340.     call    findentry
  341.     mov    a,m
  342.     sta    fileuserno
  343.     lxi    d,pubfcb
  344.     lxi    b,32
  345.     ldir
  346.     ret
  347. ;
  348. findentry:
  349.     lda    indx
  350.     add    a
  351.     add    a
  352.     add    a
  353.     add    a
  354.     add    a
  355.     lxi    h,buf
  356.     add    l
  357.     mov    l,a
  358.     rnc    
  359.     inr    h
  360.     ret
  361. ;
  362. setcol:    lda    count
  363.     ani    03h
  364.     jz    crlf
  365.     call    twosp
  366.     mvi    c,fence
  367.     call    charout
  368. twosp:    mvi    c,space
  369.     call    charout
  370.     mvi    c,space
  371.     jmp    charout
  372. printentry:
  373.     call    findentry
  374. printent1:
  375.     push    h
  376.     call    printdrv
  377. fileuserno    equ    $+1
  378.     mvi    a,00h
  379.     call    printuser
  380.     pop    h
  381. ;
  382. print$fn:
  383.     inx    h
  384.     mvi     b,8
  385.     call    prfn
  386.     mvi    c,'.'
  387.     call    charout
  388.     mvi    b,3
  389. ;
  390. prfn:    mov    a,m
  391.     ani    7fh
  392.     cmp    m
  393.     jrz    prfn1
  394.     ori    20h
  395. prfn1:    mov    c,a
  396.     call    charout
  397.     inx    h
  398.     djnz    prfn
  399.     ret
  400. ;
  401. printdrv:
  402.     lda    drive
  403.     adi    'A'
  404.     mov    c,a
  405.     jr    charout
  406. ;
  407. crlf:    mvi    c,cr
  408.     call    charout
  409.     mvi    c,lf
  410. ;
  411. charout:    
  412.     push    h
  413.     push    b
  414.     push    d
  415.     mov    e,c
  416.     mvi    c,2
  417.     call    5
  418.     pop    d
  419.     pop    b
  420.     pop    h
  421.     ret
  422. ;
  423. printuser:
  424.     cpi    10
  425.     jrnc    printu1
  426.     push    psw
  427.     mvi    c,' '
  428.     call    charout
  429.     pop    psw
  430. printu1:
  431.     mov    l,a
  432.     mvi    h,0
  433.     call    printdec
  434.     mvi    c,':'
  435.     jr    charout
  436. ;
  437. printdec:
  438. decout:    push    psw
  439.     push    b
  440.     push    d
  441.     push    h
  442.     lxi    b,-10
  443.     lxi    d,-1
  444. decou2:    dad    b
  445.     inx    d
  446.     jc    decou2
  447.     lxi    b,10
  448.     dad    b
  449.     xchg
  450.     mov    a,h
  451.     ora    l
  452.     cnz    decout
  453.     mov    a,e
  454.     adi    '0'
  455.     mov    c,a
  456.     call    charout
  457.     pop    h
  458.     pop    d
  459.     pop    b
  460.     pop    psw
  461.     ret
  462. ;
  463. flags:    db    0
  464. indx:    db    0
  465. drive:    db    0
  466. count:    db    0
  467. udrive:    db    0
  468. uuser:    db    0
  469. ustack:    dw    0
  470. pubfcb    equ    $
  471. stack    equ    pubfcb+32+48
  472. ;
  473. buf    equ    stack
  474. ;
  475.     end
  476.