home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol044 / flags12.asm < prev    next >
Assembly Source File  |  1984-04-29  |  12KB  |  657 lines

  1. version    equ    12
  2. ;************************************************
  3. ;                        *
  4. ;    <<<  Flags Editor  >>>            *
  5. ;                        *
  6. ;        by Dick Lieber            *
  7. ;           comment at 312-326-4014    *
  8. ;           or via Chicago CBBS        *
  9. ;                        *
  10. ;        11/7/81                *
  11. ;                        *
  12. ;11/14/81 Screen functions generalized, f1, f2    *
  13. ;      attributes corrected. (C. Strom)    *
  14. ;************************************************
  15. ;                            
  16. no    equ    0
  17. yes    equ    not no
  18. ;
  19.     org    100h
  20. ;********************************************************
  21. ;    <<< This must be configured for     >>>        *
  22. ;    <<< your own terminal parameters >>>        *
  23. ;                            *
  24. lineeded equ    yes    ;yes if term needs lead-in    *
  25. lichar    equ    126    ;lead in char for your term    *
  26. clrchar    equ    28     ;clear screen character        *
  27. ;            ;modify for your terminal    *
  28. ;
  29. homeimp     equ    yes    ;yes if you have a home cursor    *
  30. ;            ;character.  lineeded applies.    *
  31. ;            ;clrchar is used if no        *
  32. homechar equ    18    ;character to home cursor    *
  33. ;                            *
  34. ;********************************************************
  35.  
  36. bdos    equ    05H
  37. deffcb    equ    5CH        ;used for inital search
  38. dmarea    equ    80H        ;used only
  39. filenamlen equ    0CH
  40. ptextlength equ    10H        ;length of each flag descriptor
  41. combuflen equ    16
  42.  
  43. cr    equ    0dh
  44. bs    equ    8
  45. ctlu    equ    15h        ;key to press to update flags
  46. esc    equ    1bh
  47. ;
  48. ;    bdos commands
  49. ;
  50. conin    equ    1
  51. conout    equ    2    
  52. prstr    equ    9
  53. readbuff equ    10
  54. searchf    equ    17
  55. setattr    equ    30
  56. ;
  57. ;    saveold and setup private stack
  58. ;
  59.     lxi    h,0
  60.     dad    sp
  61.     shld    oldstack
  62.     lxi    sp,stacktop
  63. ;
  64.     call    inlnprt
  65.     db    'Set  & Display file flags'
  66.     db    0dh,0ah
  67.     db    'Version '
  68.     db    version/10 + '0','.',version mod 10 + '0'
  69.     db    0
  70.     call    crlf
  71. ;
  72. ;    check if file was specified
  73. ;
  74.     lxi    h,deffcb+1
  75.     mvi    a,' '
  76.     cmp    m
  77.     jz    leaveflags
  78. ;
  79. ;    process file in defalut fcb at 5ch
  80. ;
  81. again:
  82.     lxi    d,deffcb    ;use default fcb
  83.     mvi    c,searchf    ;find file
  84.     call    bdos
  85.     cpi    0ffh        ;ff if not found
  86.     jz    nofile
  87.     lxi    h,dmarea    ;
  88.     rlc            ;calculate address of found fcb
  89.     rlc
  90.     rlc
  91.     rlc
  92.     rlc
  93.     mov    e,a
  94.     mvi    d,0
  95.     dad    d
  96.     shld    filefcb        ;save absolute fcb address
  97.     if    homeimp    ;if using home cursor screen must be erased
  98.     call    erase    ;initially
  99.     endif
  100. ;
  101. ;    copy found fcb to a workspace
  102. ;
  103. movoldtowk:
  104.     lhld    filefcb
  105.     lxi    d,workfcb
  106.     lxi    b,filenamlen
  107.     call    move
  108. ;
  109. ;    move drive code to workfcb
  110. ;
  111.     lda    deffcb        ;get drive code
  112.     sta    workfcb        ;put drive code into workfcb
  113. ;
  114. ;    main loop - this changes/displays flags in workfcb
  115. ;
  116. doover:    call    doheader    ;print top of page
  117.     call    displayflags    ;show flags status
  118.     call    crlf
  119.     call    crlf
  120.     call    inlnprt
  121.     db    '         Enter letter of flag to change or option > '
  122. ;
  123. ;    need to erase old char if not erasing screen each time
  124. ;
  125.     if    homeimp
  126.     db    ' ',bs,0
  127.     else
  128.     db    0
  129.     endif
  130. ;
  131. ;    get character from operator
  132. ;
  133.     mvi    c,conin
  134.     call    bdos
  135.     cpi    esc
  136.     jz    movoldtowk    ;get old flags
  137.     cpi    3
  138.     jz    leaveflags    ;quit
  139.     cpi    ctlu
  140.     jz    updfile        ;change flags in directory
  141.     ori    20h    ;make lower case
  142.     cpi    'l'
  143.     jnc    doover        ;out of range, loop back
  144.     cpi    'a'
  145.     JC    DOOVER        ;out of range, loop back
  146. ;
  147. ;    Change flag in temporary fcb
  148. ;    a has flag position in 4 ls bits
  149. ;
  150.     lxi    h,workfcb    ;point to name
  151.     ani    0fh        ;kill ascii
  152.     mov    e,a        ;put into de
  153.     mvi    d,0
  154.     dad    d        ;point to absolute address 
  155.     mov    a,m        ;get byte
  156.     xri    80h        ;toggle flag
  157.     mov    m,a        ;put it back
  158.     jmp    doover        ;loopbac to begining
  159. ;
  160. ;    update flags in directory
  161. ;
  162. updfile:
  163.     lxi    d,workfcb
  164.     lda    deffcb        ;get drive code
  165.     stax    d        ;set drive code in filename for setattr
  166.     mvi    c,setattr
  167.     call    bdos
  168.     jmp    leaveflags
  169. ;
  170. ;    print top of page
  171. ;
  172. doheader:
  173.     if    homeimp
  174.     call    homecur
  175.     else
  176.     call    erase
  177.     endif
  178.     call    inlnprt
  179.     db    0DH,0AH,0AH
  180.     db    '  File Parameter Flag Display/Change'
  181.     db    ' ver '
  182.     db    version/10 + '0','.',version mod 10 + '0'
  183.     db    0DH,0AH,0AH
  184.     db    '          Options:            ^C - leave as is'
  185.     db    0DH,0AH
  186.     db    '                              ^U - update file'
  187.     db    0Dh,0AH
  188.     db    '                              ESC -original flags'
  189.     db    0DH,0AH,0AH
  190.     db    '    File: ',0         
  191.     lxi    h,workfcb
  192.     call    shnm1        ;show mane of file
  193.     call    crlf
  194.     call    crlf
  195.     ret
  196. ;
  197. ;    move bc bytes from hl to de
  198. ;
  199. move:    mov    a,b
  200.     ora    c
  201.     rz
  202.     mov    a,m
  203.     stax    d
  204.     inx    h
  205.     inx    d
  206.     dcx    b
  207.     jmp    move
  208. ;
  209. ;    display status of flags, menu style
  210. ;    workfcb contains file name with flags set
  211. ;
  212. displayflags:
  213.     mvi    a,'a'        ;first letter of line
  214.     sta    letterofline    ;save for later
  215.     lxi    h,flagsm    ;point to start of flag descriptors
  216.     shld    textpoint
  217.     lxi    h,workfcb
  218.     shld    flagpoint
  219. displayloop:
  220.     call    inlnprt
  221.     db    '               ',0    ;a crude tab
  222.     lda    letterofline        ;print line letter
  223.     mov    e,a
  224.     cpi    6ch        ;must be less than 'l'
  225.     rz
  226.     inr    a
  227.     sta    letterofline
  228.     mov    a,e
  229.     call    printchar
  230.     mvi    a,' '
  231.     call    printchar
  232. ;
  233. ;    point to next char in filename
  234. ;
  235.     lhld    flagpoint
  236.     inx    h
  237.     shld    flagpoint
  238.     mov    a,m
  239.     ani    80h
  240.     jz    displayblank
  241. ;
  242. ;    flag set - write SET
  243. ;
  244.     call    displayset
  245.     jmp    describflg
  246. ;
  247. ;    flag not set - write four blanks
  248. ;
  249. displayblank:
  250.     call    blanks4
  251. ;
  252. ;    now write flags discriptor text
  253. ;
  254. describflg:
  255.     lhld    textpoint
  256.     xchg
  257.     mvi    c,prstr
  258.     call    bdos
  259.     call    crlf
  260.     lhld    textpoint
  261.     lxi    d,ptextlength
  262.     dad    d
  263.     shld    textpoint
  264.     jmp    displayloop
  265. ;
  266. ;    send char in a to con:
  267. ;
  268. printchar:
  269.     mov    e,a
  270.     push    h
  271.     push    b
  272.     mvi    c,conout
  273.     call    bdos
  274.     pop    b
  275.     pop    h
  276.     ret
  277. ;
  278. ;    write four blanks
  279. ;
  280. blanks4:
  281.     call    inlnprt
  282.     db    '    ',0
  283.     ret
  284. ;
  285. ;    display the work SET
  286. ;
  287. displayset:
  288.     call    inlnprt
  289.     db    'SET ',0
  290.     ret
  291. ;
  292. ;    search didn't find file
  293. ;    
  294. nofile:
  295.     call    erase
  296.     call    inlnprt
  297.     db    0ah,0ah,0ah,0ah,9,9
  298.     db    0
  299.     lxi    h,deffcb
  300.     call    shnm1
  301.     call    inlnprt
  302.     db    ' was not found.',0
  303.     jmp    leaveflags1
  304. crlf:
  305.     call    inlnprt
  306.     db    0DH,0AH,0
  307.     ret
  308. ;
  309. ;    display a file name
  310. ;    hl points to file name/type as in fcb
  311. ;
  312. showname:
  313.     lhld    filefcb
  314. shnm1:            ;calling program set pointer
  315.     push    h
  316. ;
  317. ;    first show drive code if not current
  318. ;
  319.     mov    a,m
  320.     inx    h    ;point to first char of name
  321.     ora    a    ;set flags
  322. ;
  323. ;    print drive code if not current
  324. ;
  325.     jz    dispfn
  326.     adi    '@'
  327.     call    printchar
  328.     mvi    a,':'
  329.     call    printchar
  330. ;
  331. ;    print filename
  332. ;    
  333. dispfn:    mvi    c,8    ;max length of filename
  334.     call    dispfnft
  335. ;
  336. ;    then a dot
  337. ;
  338.     mvi    a,'.'
  339.     call    printchar
  340. ;
  341. ;    and last the filetype
  342. ;
  343.     pop    h    ;get begining of name
  344.     lxi    b,9    ;namelength + drive code length
  345.     dad    b    ;point to filetype
  346.     mvi    c,3    ;max length of filetype
  347.     call    dispfnft
  348.     ret
  349. ;
  350. ;    display print character until count in c up or ' ' found
  351. ;
  352. dispfnft:
  353.     mov    a,m        ;get char from fcb
  354.     cpi    ' '        ;quit if space
  355.     rz
  356.     call    printchar    ;print character
  357.     inx    h        ;next charw
  358.     dcr    c
  359.     rz            ;quit if count up
  360.     jmp    dispfnft
  361. ;
  362. ;    In line print
  363. ;
  364. inlnprt:
  365.     pop    h    ;get address of string
  366. inlnloop:
  367.     mov    a,m
  368.     ora    a
  369.     jz    inlndone
  370.     mov    e,a
  371.     mvi    c,conout
  372.     push    h
  373.     call    bdos
  374.     pop    h
  375.     inx    h
  376.     jmp    inlnloop
  377. inlndone:
  378.     inx    h    ;push to code after text
  379.     pchl        ;go there
  380. ;
  381. ;    exit this program
  382. ;    give user a few choices
  383. ;
  384. leaveflags:
  385. leaveflags1:
  386.     call    inlnprt
  387.     db    0dh,0ah,0ah,0ah,09h
  388.     db    'Enter file or RETURN to exit > ',0
  389.     lxi    h,combuff
  390. ;
  391. ;    fill buffer with ' ' so makefcb sees proper terminator
  392. ;
  393.     push    h
  394.     pop    d
  395.     lxi    b,combuflen
  396.     mvi    a,' '
  397.     call    fillb        ;in makefcb.lib
  398. ;    
  399.     mvi    m,combuflen-1    ;set max
  400.     xchg
  401.     mvi    c,readbuff
  402.     push    d
  403.     call    bdos
  404.     pop    d
  405.     xchg
  406.     inx    h
  407.     mov    a,m
  408.     ora    a
  409.     jnz    newfile    ;if zero length then quit 
  410.     lhld    oldstack
  411.     sphl
  412.     ret        ;to ccp with old stack intact
  413. newfile:
  414.     inx    h        ;point to start of command string
  415.     lxi    d,deffcb     ;where to build fcb
  416.     call    makefcb        ;make fcb from string
  417.     jnc    again        ;if no error do flags again
  418.     call    crlf
  419.     call    inlnprt
  420.     db    9,9
  421.     db    'Bad file name: ',0
  422.     lxi    h,deffcb
  423.     call    shnm1
  424.     jmp    leaveflags1
  425. ;
  426. ;    erase screen
  427. ;
  428. erase:
  429.     if     lineeded
  430.     mvi    a,lichar
  431.     call    printchar
  432.     endif
  433.     mvi    a,clrchar
  434.     jmp    printchar
  435. ;
  436. ;    home cursor    (optional)
  437. ;
  438.     if    homeimp
  439. homecur:
  440.     endif
  441.     if    homeimp and lineeded
  442.     mvi    a,lichar
  443.     call    printchar
  444.     endif
  445.     if    homeimp
  446.     mvi    a,homechar
  447.     jmp    printchar
  448.     endif
  449. ;
  450. ;
  451. ;    flag descriptors
  452. ;    these must remain 16 chars long or change ptextlength
  453. ;
  454. flagsm:    
  455.     DB    'f1 no xmdm CP/M$'
  456.     DB    'f2 no xmdm MP/M$'
  457.     DB    'f3             $'
  458.     DB    'f4             $'
  459. ; above for user -- below reserved for system
  460.     DB    'f5             $'
  461.     DB    'f6             $'
  462.     DB    'f7             $'
  463.     DB    'f8             $'
  464.         db    'read only      $'
  465.     DB    'no directory   $'
  466.     DB    't3             $'
  467.  
  468. ;
  469. ;    make fcb from string with unambiguous file name
  470. ;    hl=filename; de=fcb
  471. ;    returns with carry set if bad name
  472. ;
  473. makefcb:
  474.     xra    a
  475.     sta    flag    ;flag non-zero if invalid char in name
  476.     push    h    ;save command pointer
  477.     push    d    ;save fcb pointer
  478. ;
  479. ;    clear fcb
  480. ;
  481.     lxi    b,36
  482.     call    clrb
  483. ;
  484. ;    put blanks in filename
  485. ;
  486.     pop    d
  487.     push    d
  488.     inx    d    ;point to start of filename
  489.     lxi    b,11    ;length of name + type
  490.     mvi    a,' '    ;char to fill
  491.     call    fillb
  492. ;
  493. ;    skip any leading blanks in filename string
  494. ;
  495.     call    skipb
  496. ;
  497. ;    look if drive specified
  498. ;
  499.     pop    d    ;get fcb
  500.     xchg
  501.     shld    mfcbfcb
  502.     xchg
  503.     pop    h    ;get filename
  504.  
  505.     call    checkdrive
  506.     inx    d    ;point to file name in fcb
  507. ;
  508. ;    process filename
  509. ;    eight chars or until '.'
  510. ;
  511.     mvi    c,8
  512.     call    getname
  513. ;
  514. ;    there may be a dot here if we counted down to zero
  515. ;
  516.     mov    a,m
  517.     cpi    '.'
  518.     jnz    nodot
  519.     inx    h    ;skip dot
  520. nodot:
  521. ;
  522. ;    adjust de to start of filetype in fcb
  523. ;
  524.     push    h
  525.     lhld    mfcbfcb    ;get fcbstart
  526.     lxi    d,9    ;offset from start of fcb to filetype
  527.     dad    d
  528.     xchg        ;de is at filetype of fcb
  529.     pop    h    ;hl is at filetype (or 9th char of filename)
  530. ;
  531. ;    process filetype
  532. ;
  533.     mvi    c,3
  534.     call    getname
  535.     lda    flag
  536.     adi    1    ;set carry if bad name
  537.     ret
  538. ;
  539. ;    move chars from (hl) to (de) until count in c is up or '.' found
  540. ;
  541. getname:
  542.     mov    a,m
  543.     inx    h
  544.     call    upcase    ;make upper case if lower
  545.     call    checkvalid    ;set flag if invalid
  546.     cpi    '.'    ;look for seperator
  547.     rz
  548.     cpi    ' '
  549.     rz
  550.     stax    d    ;put into fcb
  551.     inx    d
  552.     dcr    c    ;count down
  553.     rz    
  554.     jmp    getname
  555. ;
  556. ;    check if char is legal
  557. ;    make flag non-zero if fails
  558. ;
  559. checkvalid:
  560.     cpi    '*'
  561.     jz    badchar
  562.     cpi    '['
  563.     jz    badchar
  564.     cpi    ']'
  565.     jz    badchar
  566.     cpi    ','
  567.     mov    b,a
  568.     ani    30h
  569.     cpi    30h
  570.     mov    a,b
  571.     rnz        ;char is valid in filename
  572.     cpi    ':'
  573.     rc        ;3xH chars less than : are ok
  574. badchar:
  575.     mvi    a,0ffh
  576.     sta    flag
  577.     ret
  578. ;
  579. ;    check and process drive
  580. ;    hl at start at first char of filename
  581. ;    put drive code into fcb pointed to by de, if there
  582. ;
  583. checkdrive:
  584.     inx    h    ;2nd byte is a colon if drive spec'd
  585.     mov    a,m
  586.     dcx    h    ;point back to beginingv
  587.     cpi    ':'
  588.     rnz        ;no ':' no drive
  589.     mov    a,m
  590.     call    upcase    ;make upper
  591.     ani    0fh    ;remove ascii bias
  592.     stax    d    ;put into drive code of fcb
  593.     inx    h    ;point to colon
  594.     inx    h    ;point to first char of name
  595.     ret
  596. ;
  597. ;    skip blanks in filename
  598. ;    hl left pointing at first non-blank
  599. ;
  600. skipb:    mov    a,m
  601.     cpi    ' '
  602.     rnz
  603.     inx    h
  604.     jmp    skipb
  605. ;
  606. ;    convert character to upper case (if needed)
  607. ;    char in and returned in a
  608. ;
  609. upcase:    cpi    '`'    ;' has 60h bits set but is not lower case
  610.     rz
  611.     cpi    '{'    ;{ and above are good too
  612.     rnc
  613.     push    psw    ;save char
  614.     ani    60h    ;isolate bits
  615.     cpi    60h
  616.     jnz    notlower
  617.     pop    psw
  618.     ani    5fh    ;make upper
  619.     ret
  620. notlower:
  621.     pop    psw
  622.     ret
  623. ;
  624. ;    fill bc bytes with char in a, starting at de
  625. ;
  626. clrb:    mvi    a,0
  627. fillb:    inr    b
  628.     dcr    b
  629.     jnz    fillb1
  630.     inr    c
  631.     dcr    c
  632.     rz
  633. fillb1:    stax    d
  634.     inx    d
  635.     dcx    b
  636.     jmp    fillb
  637. ;
  638. ;    ram storage area
  639. ;
  640. workfcb:        ;this is the temporary filename
  641.     ds    36    ;used for all operations
  642. letterofline:        ;letter for display
  643.     ds    1
  644. combuff:        ;readbuffer for bdos cmd 10
  645.     ds    combuflen
  646. flagpoint:        ;points to character in workfcb 
  647.     ds    2
  648. textpoint:        ;points to flag descriptor in flagsm
  649.     ds    2
  650. oldstack ds    2    ;save stack pointer for no-boot return
  651. filefcb    ds    2    ;absolute address of fcb
  652. mfcbfcb    ds    2    ;address of fcb under constructio for makefcb
  653. flag:    ds    1    ;ff if bad char in filename
  654.     ds    30
  655. stacktop equ    $    ;private stack
  656.     end
  657.