home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug077.arc / SETATT.ASM < prev    next >
Assembly Source File  |  1979-12-31  |  21KB  |  714 lines

  1. ;                   SETATT
  2. ;    
  3. ;             A file attribute change utility for CP/M 80
  4. ;    
  5. ;         Copyright:  Ian Ashdown
  6. ;                 byHeart Software
  7. ;                 2 - 2016 West 1st Avenue
  8. ;                 Vancouver, B.C. V6J 1G8
  9. ;                 Canada
  10. ;    
  11. ;         Version 1.0 15 December 1983 -- published in 'Microcomputing'
  12. ;                vol VIII no. 5 May 1984
  13. ;    
  14. ;         Version 1.1 10 June 1985 -- modified by Peter Martin to cover
  15. ;                the 'archive' attribute (t3')
  16. ;    
  17. ;         NOTICE:    This program has been released into the public 
  18. ;            domain for non-commercial use.     As this 
  19. ;            assembly-language listing forms the only 
  20. ;            documentation for the use of SETATT, it is 
  21. ;            requested that any copies of SETATT.COM made 
  22. ;            for redistribution include this listing.
  23. ;    
  24. ;    This version: 1.1   of 10 June 1985
  25. ;    
  26. ;    
  27. ;    USE:    'SETATT' is designed to replace CP/M's 'STAT' utility for 
  28. ;        setting the READ-ONLY, SYSTEM and 'ARCHIVE' attributes of 
  29. ;        a file.
  30. ;    
  31. ;        The command line syntax expected by SETATT is:
  32. ;    
  33. ;        SETATT filename.typ (specifier)
  34. ;    
  35. ;         where     (specifier) can be one of:
  36. ;    
  37. ;        R/W    to reset files to Read/Write
  38. ;        R/O    to set files to Read-Only
  39. ;        DIR    to reset files to Directory
  40. ;        SYS    to set files to System
  41. ;        NRC    to reset files to 'non-archived'
  42. ;        ARC    to set files to 'Archived'
  43. ;    
  44. ;        The following example indicates how to use SETATT
  45. ;        to set a group of files to R/O.      The symbol (x) 
  46. ;        denotes that the operator has typed the character
  47. ;        'x' at the console as a response.  Note that the
  48. ;        wild card characters '?' and '*' are permitted to
  49. ;        specify ambiguous file names.    Also (not shown)
  50. ;        typing ^C in response to any question will termin-
  51. ;        ate the program without changing any file attrib-
  52. ;        utes.
  53. ;    
  54. ;    
  55. ;    Example:
  56. ;    
  57. ; A>SETATT PRO*.??? R/O 
  58. ;    
  59. ; SETATT - Version 1.1                  Copyright 1983
  60. ;
  61. ; File Name:      READ Status: SYSTEM Status: ARCHIVE Status: Make READ-ONLY ?
  62. ;    
  63. ; A: PROG    .TXT  READ/WRITE     DIRECTORY     NOT ARCHIVED      ? (Y) Yes
  64. ; A: PROG    .ASM  READ/WRITE     DIRECTORY     NOT ARCHIVED      ? (N) No
  65. ; A: PROG    .001  READ/ONLY     SYSTEM           NOT ARCHIVED   Already READ-ONLY
  66. ; A: PROGRESS.BAS  READ/WRITE     DIRECTORY     ARCHIVED          ? (Y) Yes
  67. ; A: PROG    .TXT  READ/WRITE     DIRECTORY     ARCHIVED          ? (Y) Yes
  68. ;    
  69. ;    O.K. to change    [Y/N] ? (Y) Yes
  70. ;    
  71.  
  72. ;            **** DEFINITIONS ****
  73.  
  74.     BOOT    EQU 0000H    ; warm start vector
  75.     BDOS    EQU 0005H    ; fdos entry vector
  76.     FCB1    EQU 005CH    ; default file control block #1 address
  77.     FCB2    EQU 006CH    ; default file control block #2 address
  78.     DFDMA   EQU 0080H    ; default DMA address
  79.  
  80.     CONOUT  EQU 02H    ; bdos console output function
  81.     DIRCIO  EQU 06H    ; bdos direct console i/o function
  82.     PSTRNG  EQU 09H    ; bdos print string function
  83.     SRCHF   EQU 11H    ; bdos search first function
  84.     SRCHN   EQU 12H    ; bdos search next function
  85.     DSKNO   EQU 19H    ; bdos return current disk function
  86.     SETFAT  EQU 1EH    ; bdos set file attributes function
  87.  
  88.     BELL    EQU 07H    ; ASCII bell
  89.     CR        EQU 0DH    ; ASCII carriage return
  90.     LF        EQU 0AH    ; ASCII line feed
  91.  
  92.     RWATT   EQU 1    ; read/write flag
  93.     ROATT   EQU 2    ; read-only flag
  94.     DIRATT  EQU 3    ; directory flag
  95.     SYSATT  EQU 4    ; system flag
  96.     NRCATT  EQU 5    ; non-archived flag
  97.     ARCATT  EQU 6    ; archived flag
  98.  
  99.  
  100. ;        ********** MAIN PROGRAM ************
  101.  
  102.     org 0100h
  103.  
  104.     lxi        sp,Stack    ; set stack pointer to local stack
  105.     lxi        d,Head1    ; print first part of program heading
  106.     call    Print
  107.     call    Init    ; initialise variables
  108.     lxi        h,FNBA    ; store address of start of File Name Buffer
  109.     shld    Buff    ; Array in pointer Buff
  110.     call    GetAttrib    ; get attribute type from default FCB #2
  111.     jz        AttribOK    ; jump to AttribOK if attribute type is valid
  112.  
  113.     lxi        d,AttError    ; else print 'ATTRIBUTE ERROR' message if
  114.     call    Print    ; invalid or missing attribute type
  115.     jmp        BOOT    ; and then return to cp/m
  116.  
  117. AttribOK:
  118.     call    SerchFirst    ; search for the first file match
  119.     call    QueryFind    ; check to see if a match was found
  120.     jnz        FileFound    ; jump to FileFound if match found
  121.     lxi        d,NoFileMsg ; else print 'NO FILE' message
  122.     call    Print
  123.     jmp        BOOT    ; and exit
  124.  
  125. FileFound:
  126.     call    MovName    ; move file name to current File Name Buffer
  127.     call    IncBuff    ; increment buffer pointer
  128.     call    SerchNext    ; search for next file match
  129.     call    QueryFind    ; see if any found
  130.     jnz        FileFound    ; yes? loop for another...
  131.  
  132.     lxi        h,FNBA    ; reset buffer pointer to start
  133.     shld    Buff    ; and store that away
  134.     call    SaveCount    ; then save copy of file count
  135.     call    QueryDisk    ; find out what disk we're on
  136.     call    PrintHedder ; print remainder of program heading
  137.  
  138. NextFile:
  139.     call    TestFAtt    ; test existing file attributes
  140.     lda        AttReg    ; get Attribute Type Register contents
  141.     cpi        RWATT    ; Is it R/W we have to change ?
  142.     jz        RwDirNrc    ; jump to RWDIRNRC
  143.     cpi        DIRATT    ; Is it DIR we have to change?
  144.     jz        RwDirNrc    ; go to same place
  145.     cpi        NRCATT    ; Is it NRC we have to change?
  146.     jz        RwDirNrc    ;.. and again
  147.     call    TestFAttCh    ; else (r/o,sys,arc) -- test one to be changed...
  148.     jnz        NextFile2    ; if found set, skip past
  149.     jmp        NextFile1    ; else set flags and check with query
  150.  
  151. RwDirNrC:
  152.     call    TestFAttCh    ; test attribute in non-set group
  153.     jnz        NextFile1    ; skip over check/count if r/w or dir already
  154.     mvi        a,0ffh
  155.     sta        AlreadyFlag
  156.     jmp        NextFile1a
  157.  
  158. NextFile1:
  159.     mvi        a,0ffh    ; set File Found flag
  160.     sta        FoundFlag
  161.  
  162. NextFile1a:
  163.     call    PrintFN    ; show file name
  164.     call    PrintAtt    ; show current att setting
  165.     lda        AlreadyFlag ; see if file set already
  166.     inr        a
  167.     jnz        NextFile1b    ; no -- go do query
  168.     call    AlreadyOut ;  else say already set and move on
  169.     jmp        NextFile2
  170.  
  171. NextFile1b:
  172.     call    QueryChange ; ask if attribute is to be changed
  173.  
  174. NextFile2:
  175.     call    IncBuff    ; increment file buffer pointer to next
  176.     lxi        h,DirFileCnt; point to directory file counter
  177.     dcr m        ; and decrement it.
  178.     jnz        NextFile    ; and loop if not finished....
  179.     lda        FoundFlag    ; check file-found flag
  180.     inr        a        ; is it set?
  181.     jnz        AllOK    ; if not, exit -- none need changing
  182.     lda        QueryFlag    ; check if queries confirmed a change
  183.     inr        a 
  184.     jnz        BOOT    ; exit if they didn't
  185.     lxi        h,FNBA    ; pointer to start of filename buffer
  186.     shld    Buff    ; stored again for run-down
  187.     call    QueryOK    ; do the end query bit
  188.     cc        DoChanges    ; if that's confirmed, do the changes
  189.     jmp        BOOT    ; and close down.
  190.  
  191. ;
  192. ;            ********** SUBROUTINES *********
  193. ; Initialize variables
  194. Init:
  195.     xra        a        ; clear Accumulator and with it
  196.     sta        DirFileCnt    ; clear our counts and flags
  197.     sta        FoundFlag
  198.     sta        QueryFlag
  199.     sta        AlreadyFlag
  200.     ret
  201.  
  202. ; Get attribute type from Default FCB #2
  203. GetAttrib:
  204.     lxi        h,RW    ; point to the 'R/W' string
  205.     mvi        a,RWATT    ; put corresponding value in Acc (RWATT=0)
  206.     call    CmpAtt    ; call comparison routine
  207.     rz            ; and return if match found
  208.     lxi        h,RO    ; do same for 'R/O'
  209.     mvi        a,ROATT    ;
  210.     call    CmpAtt
  211.     rz
  212.     lxi        h,DIR    ; ... and for 'DIR'
  213.     mvi        a,DIRATT
  214.     call    CmpAtt
  215.     rz
  216.     lxi        h,SYS    ; ... and 'SYS'
  217.     mvi        a,SYSATT
  218.     call    CmpAtt
  219.     rz
  220.     lxi        h,NRC    ; ... and 'NRC'
  221.     mvi        a,NRCATT
  222.     call    CmpAtt
  223.     rz
  224.     lxi        h,ARC    ; ... and 'ARC'
  225.     mvi        a,ARCATT
  226.     call    CmpAtt
  227.     ret
  228.  
  229. ; Compare attribute type to string
  230. CmpAtt:
  231.     sta        AttReg    ;store value in A as variable AttReg
  232.     mvi        b,3        ; set character count to 3 
  233.     lxi        d,FCB2+1    ; set DE to point to first char
  234.  
  235. NextCh:
  236.     ldax    d        ; get char into Acc 
  237.     cpi        '/'        ; is it the slash ?
  238.     jz        NextCh1    
  239.     ani        5fh        ; toupper
  240.  
  241. NextCh1:
  242.     cmp        m        ; same as one laid down?
  243.     rnz            ; no? return-- we have a mismatch
  244.     inx        d        ; else move along to next
  245.     inx        h
  246.     dcr        b        ; and decrement counter
  247.     jnz        NextCh    ; loop if not done
  248.     ret            ; else return Z flag set for full match
  249.  
  250. ; Search for first file
  251. SerchFirst:
  252.     lxi        d,FCB1    ; bdos preparation
  253.     mvi        c,SRCHF
  254.     call    BDOS
  255.     ret
  256.  
  257. ; Search for next file
  258. SerchNext:
  259.     lxi        d,FCB1    ; bdos preparation
  260.     mvi        c,SRCHN
  261.     call    BDOS
  262.     ret
  263.  
  264. ; Determine if file found
  265. QueryFind:
  266.     inr        a        ; if ERROR, 0ffh returned. test 
  267.     rz            ; by incrementing. zero means ERROR
  268.     dcr        a        ; else restore value
  269.     lxi        h,DirFileCnt  ; else increment count of finds
  270.     inr        m
  271.     ret
  272.  
  273. ; Move filename from default DMA to current file name buffer
  274. MovName:
  275.     lhld    Buff
  276.     xchg        ; buffer pointer into DE
  277.     lxi        h,DFDMA ; while HL=> DMA buffer base
  278.     add        a        ; use offset from search functions
  279.     add        a        ; *32 to make HL=> file found
  280.     add        a
  281.     add        a
  282.     add        a
  283.     add        l
  284.     mov        l,a
  285.     lda        FCB1    ; get disk number from default FCB #1
  286.     mov        m,a        ; store it as first item in buffer
  287.     mvi        b,15    ; set up counter in b
  288.  
  289. NextChar:
  290.     mov        a,m        ; get char into Acc from DMA buffer
  291.     stax    d        ; and store in our buffer
  292.     inx        h        ; incrementing pointers
  293.     inx        d
  294.     dcr        b        ; and decrementing char count
  295.     jnz        NextChar; looping until all done
  296.  
  297. ; NOTE -- byte following filename in our new buffer is used as a flag
  298. ;     for changing of attributes.  zero means no change, -1 means change.
  299.     inx        h
  300.     xra        a 
  301.     mov        m,a
  302.     ret
  303.  
  304. ; Increment file name buffer pointer
  305. IncBuff:
  306.     lhld    Buff
  307.     lxi        d,16
  308.     dad        d
  309.     shld    Buff
  310.     ret
  311.  
  312. ; Save copy of directory file count
  313. SaveCount:
  314.     lda        DirFileCnt
  315.     sta        DirFileCnt1
  316.     ret
  317.  
  318. ; Determine name of specified disk
  319. QueryDisk:
  320.     lda        FCB1
  321.     ora        a        ; none specified ?
  322.     cz        Current    ; then get current...
  323.     adi        40h        ; and adjust to ASCII
  324.     sta        Disk    ; saving it...
  325.     ret
  326.  
  327. Current:
  328.     mvi        c,DSKNO
  329.     call    BDOS
  330.     adi        1
  331.     ret
  332.  
  333. ; Print remainer of program heading
  334. PrintHedder:
  335.     lxi        d,Head2        ; output the heading
  336.     call    Print
  337.     lda        AttReg        ; check which we have to change
  338.     dcr        a            ; get it to zero base
  339.     mov        c,a            ; use value as an offset 
  340.     mvi        b,0            ; in BC for a pointer to the right 
  341.     lxi        h,HeadMsgs        ; query message held in table
  342.     call    TablePrint        ; go and print it in another routine
  343.     ret
  344.  
  345. ; Test existing file attributes
  346. TestFAtt:
  347.     lhld    Buff        ; get current pointer to current filename
  348.     lxi        d,9            ; offset to point to 1st char in 'typ'
  349.     dad        d
  350.     mov        a,m            ; get that character in
  351.     ani        80h            ; mask off its READ bit
  352.     rlc                ; and move it round into bit 0
  353.     mov        b,a            ; storing temporarily in B
  354.     inx        h            ; while we look at the next
  355.     mov        a,m
  356.     ani        80h            ; and mask for its SYSTEM bit
  357.     rlc                ; moving it around
  358.     rlc                ; into bit 1
  359.     add        b            ; and combining results with addition
  360.     mov        b,a            ; saving again
  361.     inx        h            ; for another turn on the merry-go-round
  362.     mov        a,m
  363.     ani        80h
  364.     rlc
  365.     rlc
  366.     rlc
  367.     add        b
  368.     sta        FAtt
  369.     ret
  370.  
  371. ; Test for file attribute to be changed
  372. TestFAttCh:
  373.     lda        AttReg
  374.     cpi        NRCATT
  375.     jc        TestFC1
  376.     lda        FAtt
  377.     ani        04
  378.     ret
  379.  
  380. TestFC1:
  381.     cpi        DIRATT
  382.     jc        TestFC2
  383.     lda        FAtt
  384.     ani        02
  385.     ret
  386.  
  387. TestFC2
  388.     lda        FAtt
  389.     ani        01
  390.     ret
  391.  
  392. ; Print File Name
  393. PrintFN:
  394.     lda        Disk    ; print disk name....
  395.     mov        e,a
  396.     mvi        c,CONOUT
  397.     call    BDOS
  398.     lxi        d,Colon    ; followed by colon
  399.     call    Print
  400.     lhld    Buff    ; point to filename in buffer
  401.     inx        h
  402.     mvi        b,8        ; counter for chars in filename
  403.  
  404. NextN2:
  405.     push    h        ; output 8 chars
  406.     push    b
  407.     mov        a,m
  408.     ani        7fh
  409.     mov        e,a
  410.     mvi        c,CONOUT
  411.     call    BDOS
  412.     pop        b
  413.     pop        h
  414.     inx        h
  415.     dcr        b
  416.     jnz        NextN2
  417.     push    h
  418.     mvi        e,'.'    ; put in delimiter for filename
  419.     mvi        c,CONOUT
  420.     call    BDOS
  421.     pop        h
  422.     mvi        b,3        ; now counter for filetyp
  423.  
  424. NextT2:
  425.     push    h
  426.     push    b
  427.     mov        a,m
  428.     ani        7fh
  429.     mov        e,a
  430.     mvi        c,CONOUT
  431.     call    BDOS
  432.     pop        b
  433.     pop        h
  434.     inx        h
  435.     dcr        b
  436.     jnz        NextT2
  437.     mvi        e,' '        ; and a space at end
  438.     mvi        c,CONOUT
  439.     call    BDOS
  440.     ret
  441.  
  442. ; Print existing (unchanged) file attribute
  443. PrintAtt:
  444.     lda        FAtt
  445.     mov        c,a        ; make it into offset in BC
  446.     mvi        b,0
  447.     lxi        h,ComboMsgs
  448.     call    TablePrint
  449.     ret
  450. ;
  451. ; Signal a file already set for attribute wanted
  452.  
  453. AlreadyOut:
  454.     lxi        d,Already    ; say 'Already...'
  455.     call    Print
  456.     lda        AttReg
  457.     dcr        a
  458.     mov        c,a
  459.     mvi        b,0
  460.     lxi        h,NoFCM    ; and the setting
  461.     call    TablePrint
  462.     xra        a        ; reset flag for next time through
  463.     sta        AlreadyFlag
  464.     ret
  465.  
  466. ; Ask if attribute is to be changed
  467. QueryChange:
  468.     lxi        d,Ask
  469.     call    Print
  470.     call    Charin
  471.     cpi        03        ; was it a ctrl-C ?
  472.     jz        Exit    ; yes? then go away
  473.     ani        5fh        ; else toupper
  474.     cpi        'Y'
  475.     jz        CheckAtt
  476.     lxi        d,No
  477.     call    Print
  478.     ret
  479.  
  480. CheckAtt:
  481.     lhld    Buff
  482.     lxi        d,15    ; (clears D to 00)
  483.     dad        d        ; pointer set to byte at end of filename
  484.     mvi        a,0ffh    ; and Acc set to -1
  485.     mov        m,a        ; put it in there
  486.     lhld    Buff    ; reset HL to point to start of buffer
  487.     lda        AttReg    ; get attribute we have to change
  488.     cpi        NRCATT    ; nrc or arc ?
  489.     jc        CheckAtt1    ; no? -- press on
  490.     mvi        e,0bh    ; load offset to 3rd char in typ
  491.     jmp        CheckAtt3
  492.  
  493. CheckAtt1:
  494.     cpi        DIRATT
  495.     jc        CheckAtt2    ; not dir or system? -- press on
  496.     mvi        e,0ah    ; else load offset to 2nd char in typ
  497.     jmp        CheckAtt3
  498.  
  499. CheckAtt2:
  500.     mvi        e,09h    ; load offset to r/o;r/w -- 1st char in typ
  501.  
  502. CheckAtt3:
  503.     dad        d        ; apply the offset
  504.     mov        a,m        ; get the character in
  505.     xri        80h        ; toggle bit 7 as required
  506.     mov        m,a        ; and put result back
  507.     mvi        a,0ffh    ; get -1 into A
  508.     sta        QueryFlag    ; and set the query flag
  509.     lxi        d,Yes    ; and acknowledge response
  510.     call    Print
  511.     ret
  512.  
  513. Exit:
  514.     lxi        d,ExitMsg    ; tell em 'You asked for it...'
  515.     call    Print    ; and go away.
  516.     jmp        BOOT
  517.  
  518. ; Return to CP/M if specified files already have desired attributes
  519. AllOK:
  520.     lxi        d,NoFC1    ; Print 'Specified files are already...'
  521.     call    Print
  522.     lda        AttReg
  523.     dcr        a
  524.     mov        c,a        ; do offset bit for message
  525.     mvi        b,0
  526.     lxi        h,NoFCM    ; from NoFCM base
  527.     call    TablePrint
  528.     jmp        BOOT
  529.  
  530. ; Ask if attributes of indicated files should be changed
  531. QueryOK:
  532.     lxi        d,OKChange
  533.     call    Print
  534.     call    Charin
  535.     ani        5fh
  536.     cpi        'Y'
  537.     jz        ChangeYes
  538.     lda        AttReg
  539.     cpi        NRCATT
  540.     jc        QueryOk1
  541.     lxi        d,NoAB3    ; says 'No -- ARCHIVE attributes NOT CHANGED'
  542.     call    Print
  543.     jmp        QueryOk3
  544.  
  545. QueryOk1:
  546.     cpi        DIRATT
  547.     jc        QueryOk2
  548.     lxi        d,NoAB2    ; says 'No -- SYSTEM attributes NOT CHANGED'
  549.     call    Print
  550.     jmp        QueryOk3
  551.  
  552. QueryOk2:
  553.     lxi        d,NoAB1    ; says 'No -- READ attributes NOT CHANGED'
  554.     call    Print
  555.  
  556. QueryOk3:
  557.     ora        a        ; clear Cy flag as 'not changed' indicator
  558.     ret
  559.  
  560. ChangeYes:
  561.     lxi        d,Yes
  562.     call    Print
  563.     stc            ; set Cy
  564.     ret
  565.  
  566. ; Change attributes of indicated files
  567. DoChanges:
  568.     lda        DirFileCnt1 ; restore original file count from saved byte
  569.     mov        b,a        ; get count of files to be done in B
  570.  
  571. NextFC:
  572.     lhld    Buff    ; get pointer over buffer
  573.     lxi        d,15    ; and offset to flag for change on each file
  574.     dad        d
  575.     mov        a,m        ; check change status byte
  576.     inr        a
  577.     jnz        NoChange
  578.     push    b        ; save counter
  579.     lhld    Buff    ; get back pointer
  580.     xchg        ; into DE
  581.     mvi        c,SETFAT    ; and leave it to bdos
  582.     call    BDOS
  583.     pop        b        ; restoring counter
  584.     
  585. NoChange:
  586.     call    IncBuff    ; increment pointer to next file
  587.     dcr        b        ; and decrement counter of files
  588.     jnz        NextFC    ; looping as required
  589.     ret
  590.  
  591. ; Table-driven print message routine -- HL=> base, BC= offset of message
  592. TablePrint:
  593.     dad        b
  594.     dad        b        ; two-byte arrays
  595.     mov        e,m        ; get address into DE
  596.     inx        h
  597.     mov        d,m
  598.     call    Print
  599.     ret
  600.  
  601. ; Print String Routine
  602. Print:
  603.     mvi        c,PSTRNG
  604.     call    BDOS
  605.     ret
  606. ;
  607. ; Direct input of character routine
  608. Charin:
  609.     mvi        e,0ffh    ; code for bdos
  610.     mvi        c,DIRCIO
  611.     call    BDOS
  612.     ora        a
  613.     jz        Charin    ; loop till character ready
  614.     ret
  615.  
  616. ;
  617. ;        ********** DATA STATEMENTS AND TABLES *********
  618.  
  619. Ask:        db    '       ? $'
  620. AttError:   db    BELL,'The command line syntax expected by SETATT is:',CR,LF,LF
  621.         db    '   SETATT <filename.typ> (specifier) ',CR,LF,LF
  622.         db    '    WHERE  (specifier) can be one of:',CR,LF,LF
  623.         db    '        R/W      to reset files to READ/WRITE',CR,LF
  624.         db    '        R/O      to set files to READ-ONLY',CR,LF
  625.         db    '        DIR      to reset files to DIRECTORY',CR,LF
  626.         db    '        SYS      to set files to SYSTEM',CR,LF
  627.         db    '        NRC      to reset files to NON-ARCHIVED',CR,LF
  628.         db    '        ARC      to set files to ARCHIVED',CR,LF,LF
  629.         db    '  e.g.  -- SETATT FILE.TYP R/O',CR,LF,'$'
  630. Colon:        db    ': $'
  631. ExitMsg:    db    BELL,CR,LF,LF,'SETATT terminated at your request -- '
  632.         db    'NO ATTRIBUTES CHANGED',CR,LF,'$'
  633. Head1:        db    CR,LF, 'SETATT -- version 1.1 1985'
  634.         db    '             Copyright 1983 byHeart Software',CR,LF,LF,'$'
  635. Head2:        db    'Filename:      '
  636.         db    ' READ Status:   SYSTEM Status: ARCHIVE Status: Make $'
  637. Combo0:        db    ' READ/WRITE     DIRECTORY    NON-ARCHIVED$'
  638. Combo1:        db    ' READ-ONLY      DIRECTORY    NON-ARCHIVED$'
  639. Combo2:        db    ' READ/WRITE      SYSTEM      NON-ARCHIVED$'
  640. Combo3:        db    ' READ-ONLY       SYSTEM      NON-ARCHIVED$'
  641. Combo4:        db    ' READ/WRITE     DIRECTORY      ARCHIVED  $'
  642. Combo5:        db    ' READ-ONLY      DIRECTORY      ARCHIVED  $'
  643. Combo6:        db    ' READ/WRITE      SYSTEM        ARCHIVED  $'
  644. Combo7:        db    ' READ-ONLY       SYSTEM        ARCHIVED  $'
  645. Head3:        db    'READ/WRITE?',CR,LF,LF,'$'
  646. Head4:        db    'READ-ONLY?',CR,LF,LF,'$'
  647. Head5:        db    'DIRECTORY?',CR,LF,LF,'$'
  648. Head6:        db    'SYSTEM?',CR,LF,LF,'$'
  649. Head7:        db    'NON-ARCHIVED?',CR,LF,LF,'$'
  650. Head8:        db    'ARCHIVED?',CR,LF,LF,'$'
  651. No:        db    'No',CR,LF,'$'
  652. NoAB1:        db    BELL,'No -- READ attributes NOT CHANGED',CR,LF,'$'
  653. NoAB2:        db    BELL,'No -- SYSTEM attributes NOT CHANGED',CR,LF,'$'
  654. NoAB3:        db    BELL,'No -- ARCHIVE attributes NOT CHANGED',CR,LF,'$'
  655. NoFileMsg:  db    BELL,'Sorry -- specified file(s) could not be found',CR,LF,'$'
  656. NoFC1:        db    BELL,'Specified files are already $'
  657. Already:    db    '  Already $'
  658. NoFC2A:        db    'READ/WRITE',CR,LF,'$'
  659. NoFC2B:        db    'READ-ONLY',CR,LF,'$'
  660. NoFC2C:        db    'DIRECTORY',CR,LF,'$'
  661. NoFC2D:        db    'SYSTEM',CR,LF,'$'
  662. NoFC2E:        db    'NON-ARCHIVED',CR,LF,'$'
  663. NoFC2F:        db    'ARCHIVED',CR,LF,'$'
  664. OkChange:   db    CR,LF,LF,'O.K. to change ?    [Y/N] $'
  665. RW:        db    'R/W$'
  666. RO:        db    'R/O$'
  667. DIR:        db    'DIR$'
  668. SYS:        db    'SYS$'
  669. NRC:        db    'NRC$'
  670. ARC:        db    'ARC$'
  671. YES:        db    'Yes',CR,LF,'$'
  672. ;
  673. ;        ****** POINTER TABLE *******
  674. ;
  675. ComboMsgs:  dw    Combo0
  676.         dw    Combo1
  677.         dw    Combo2
  678.         dw    Combo3
  679.         dw    Combo4
  680.         dw    Combo5
  681.         dw    Combo6
  682.         dw    Combo7
  683.  
  684. HeadMsgs:   dw    Head3
  685.         dw    Head4
  686.         dw    Head5
  687.         dw    Head6
  688.         dw    Head7
  689.         dw    Head8
  690.  
  691. NoFCM:
  692.         dw    NoFC2A
  693.         dw    NoFC2B
  694.         dw    NoFC2C
  695.         dw    NoFC2D
  696.         dw    NoFC2E
  697.         dw    NoFC2F
  698.  
  699. ;            ****** RESERVED DATA AREA ******
  700.  
  701. AttReg:        ds  1
  702. Buff:        ds  2
  703. DirFileCnt:    ds  1
  704. DirFileCnt1:    ds  1
  705. Disk:        ds  1
  706. FAtt:        ds  1
  707. QueryFlag:    ds  1
  708. FoundFlag:    ds  1
  709. AlreadyFlag:    ds  1
  710.         ds  8
  711. Stack
  712. FNBA        EQU $
  713.         END
  714.