home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol5n16.zip / XDEL.ASM next >
Assembly Source File  |  1987-12-13  |  17KB  |  363 lines

  1. TITLE   XDEL.ASM   SCANS CURRENT DIRECTORY ALLOWING FILE DELETION.
  2. ;                  COMMAND LINE SPECIFIES FILE MATCHING MASK
  3. ;
  4. DOS      EQU       21H                             ;DOS  FUNC  INTERRUPT
  5. VIDEO    EQU       10H                             ;BIOS VIDEO INTERRUPT
  6.  
  7. CSEG     SEGMENT
  8.          ASSUME    CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
  9.  
  10.          ORG       80H
  11. PARM     LABEL     BYTE                            ;UNFORMATTED AREA OF PSP
  12.  
  13.          ORG       9EH
  14. FNAME    LABEL     BYTE                            ;FILE NAME RETURNED IN DTA
  15.                                                    ; WITHIN PSP BY 4EH CALL
  16.          ORG       100H
  17. ENTRY:   JMP       BEGIN                           ;SKIP OVER DATA
  18.  
  19.             DB       "Copyright 1986 Ziff-Davis Publishing Co.",1Ah
  20. APAGE       DB     0                               ;CURRENT VIDEO PAGE
  21.             db     'ATTR='                         ;PATCH POINT TO PRESET
  22. ATTR        DB     0                               ; SCREEN ATTRIBUTE
  23. COUNT       DB     0                               ;COUNT FILE NAMES
  24. DELIM       DB     9,' ,;='                        ;COMMAND LINE DELIMITERS
  25.  
  26. DRIVE_NO    DB     ?                               ;DISK DRIVE  (0=A, ETC)
  27.  
  28. DRIVE_SPEC  DB     3 DUP(0)                        ;DRIVE LETTER & ":"
  29. PATH_SPEC   DB     '\',65 DUP(0),0                 ;CURRENT DIRECTORY
  30.                                                    ; FILE NAME MASK
  31. DELETE_PATH DB     14 DUP(0),0                     ;NAME OF FILE TO DELETE
  32. MATCH_PATH  DB     'A:*.*',9 DUP(0),0              ;FILE MATCH STRING
  33.  
  34. INSTR       DB     13,10,10,'Home - first file match   ',9,9,9
  35.             DB     'PgDn - next file match ',13,10
  36.             DB     'F1   - delete last file shown',9,9,9
  37.             DB     'ESC  - back to DOS',13,10
  38.             DB     80 DUP(205),13,0
  39.  
  40. HDR         DB     9,9,9,'    DIRECTORY PURGE UTILITY',13,10
  41.             DB     'Current Directory :',13,10,0
  42. PATH_MSG    DB     16,' ',0                        ;RIGHT ARROW
  43. NOT_FOUND   DB     13,10,'File not found',0
  44. BAD_SPEC    DB     13,10,'Invalid drive / file specification',13,10
  45.             DB     'Change directory before using XDEL',0
  46.  
  47. SPEC_ERROR:
  48.          MOV       DX,OFFSET BAD_SPEC              ;ERROR MSG
  49.          CALL      PRT_ASCIIZ                      ;PRINT ERROR
  50.          INT       20H                             ;RETURN TO DOS
  51.  
  52. BEGIN:   MOV       AH,8                            ;GET CHAR/ATTR AT CURSOR POS
  53.          INT       VIDEO                           ;BIOS CALL
  54.          MOV       APAGE,BH                        ;BH = ACTIVE PAGE
  55.          CMP       ATTR,0                          ;ATTRIBUTE PRESET?
  56.          JNE       SCAN_CMD                        ;YES, USE SPECIFIED ATTR
  57.          MOV       ATTR,AH                         ;NO, SAVE CURRENT ATTR
  58.  
  59. ;
  60. ;SEARCH UNFORMATTED AREA OF PSP FOR FILE NAME SPECIFICATION
  61. ;TO USE IN FILE MATCH COMPARISON
  62. ;
  63.  
  64. SCAN_CMD:
  65.          CLD                                       ;SET DIRECTION FLAG
  66.          MOV       SI,1 + OFFSET PARM              ;UNFORMATTED PSP AREA
  67.          MOV       DI,OFFSET DRIVE_SPEC            ;DRIVE SPEC AREA
  68.  
  69. SKIP_DELIM:
  70.          CALL      PARM_SCAN                       ;GET NEXT PARM BYTE
  71.          JE        SKIP_DELIM                      ;SKIP OVER LEADING DELIMS
  72.          DEC       SI                              ;POINT TO 1ST BYTE OF SPEC
  73.  
  74.          CMP       AL,13                           ;CARRIAGE RETURN ?
  75.          JZ        GET_DRIVE                       ;YES, NO PARM SPECIFIED
  76.  
  77.          CMP       BYTE PTR [SI + 1],':'           ;DRIVE SPEC PRESENT?
  78.          JNZ       GET_DRIVE                       ;NO, GET DEFAULT DRIVE
  79.  
  80.          LODSW                                     ;GET DRIVE AND ":"
  81.          AND       AL,0DFH                         ;CAPITALIZE DRIVE LETTER
  82.          JMP       STORE_DRIVE                     ;SKIP DEFAULT DRIVE CHECK
  83.  
  84. GET_DRIVE:
  85.          MOV       AH,019H                         ;GET CURRENT DRIVE (0=A,ETC)
  86.          INT       DOS                             ; THRU DOS CALL
  87.          ADD       AL,'A'                          ;CHANGE TO LETTER
  88.          MOV       AH,':'                          ;DRIVE SPEC SEPARATOR
  89.  
  90. STORE_DRIVE:
  91.          CMP       AL,'A'                          ;VALID RANGE OF DRIVES
  92.          JB        SPEC_ERROR                      ; INVALID DRIVE
  93.          CMP       AL,'Z'
  94.          JA        SPEC_ERROR
  95.  
  96.          STOSW                                     ;SAVE DRIVE SPEC AND ":"
  97.          MOV       DI,OFFSET DELETE_PATH           ;DELETE RTN PATH
  98.          STOSW                                     ;LOAD DRIVE
  99.  
  100.          MOV       DI,OFFSET MATCH_PATH            ;FILE MATCHING PATH
  101.          STOSW                                     ;LOAD DRIVE
  102.  
  103.          SUB       AL,'A'                          ;CHG DRIVE TO NUM (0=A, ETC)
  104.          MOV       DRIVE_NO,AL                     ;SAVE DRIVE
  105.  
  106.          CMP       BYTE PTR [SI],13                ;CARRIAGE RETURN ?
  107.          JE        GLOBAL_SCAN                     ;YES, SCAN *.*
  108.  
  109.          MOV       CX,12                           ;MAX LENGTH FILE SPEC
  110. PARSE:
  111.          CALL      PARM_SCAN                       ;GET NEXT PARM BYTE
  112.          JE        PARSE                           ;SKIP DELIMS
  113.          CMP       AL,13                           ;CARRIAGE RETURN?
  114.          JE        END_SPEC                        ;YES, END OF FILE SPEC
  115.          CMP       AL,'\'                          ;PATH SPECIFIED?
  116.          JE        SPEC_ERROR                      ;YES, ERROR
  117.  
  118.          STOSB                                     ;MOVE BYTE TO MATCH PATH
  119.          DEC       CX                              ;COUNT FILE SPEC LENGTH
  120.          JCXZ      END_SPEC                        ;IF CX = 0, STOP BUILD
  121.          JMP       PARSE
  122.  
  123. END_SPEC:
  124.          MOV       BYTE PTR [DI],0                 ;TRAILING ZERO
  125.  
  126. GLOBAL_SCAN:
  127.          CALL      GET_PATH                        ;GET PATH FOR DRIVE SPEC
  128.  
  129. RESTART:
  130.          CALL      CLR_SCR                         ;CLEAR SCREEN
  131.          MOV       DX,OFFSET HDR                   ;SCREEN TITLE LINE
  132.          CALL      PRT_ASCIIZ                      ; AND PRINT
  133.          MOV       DX,OFFSET PATH_MSG              ;DIRECTORY INFO MSG
  134.          CALL      PRT_ASCIIZ                      ; AND PRINT
  135.          MOV       DX,OFFSET DRIVE_SPEC            ;DRIVE/PATH/FILE
  136.          CALL      PRT_ASCIIZ                      ; AND PRINT
  137.          MOV       DX,OFFSET PATH_SPEC             ;PATH_SPEC
  138.          CALL      PRT_ASCIIZ                      ; AND PRINT
  139.          MOV       DX,OFFSET MATCH_PATH + 2        ;FILE SPEC
  140.          CALL      PRT_ASCIIZ                      ; AND PRINT
  141.          MOV       DX,OFFSET INSTR                 ;INSTRUCTION LINE
  142.          CALL      PRT_ASCIIZ                      ; AND PRINT
  143.  
  144.          MOV       COUNT,0                         ;INITIALIZE FILE COUNTER
  145.          MOV       DX,OFFSET MATCH_PATH            ;ADDRESS OF SEARCH MATCH
  146.          MOV       CX,0                            ;ATTRIBUTE FOR FILES
  147.          MOV       AH,04EH                         ;FIND FIRST MATCH
  148.          INT       DOS                             ; THRU DOS FUNC CALL
  149.          JC        ERROR_RTN                       ;CARRY SET = ERROR
  150.  
  151. FILE_LOOP:
  152.          MOV       DX,OFFSET FNAME                 ;POINT TO FILE NAME
  153.          CALL      PRT_ASCIIZ                      ; AND PRINT
  154.                                                    ;CX = FILE NAME LENGTH
  155.          ADD       COUNT,1                         ;INCREMENT COUNT
  156.  
  157. READ_KYBD:
  158.          CALL      GET_KEY                         ;GET KEY INSTRUCTION
  159.          CMP       AL,27                           ;ESCAPE KEY?
  160.          JE        END_PGM                         ;YES, END PGM
  161. ;
  162. ; EXTENDED KEY TESTS
  163. ;
  164.          CMP       AL,59                           ;FUNC KEY 1?
  165.          JE        DEL_IT                          ;YES, DELETE FILE
  166.          CMP       AL,71                           ;HOME KEY?
  167.          JE        RESTART                         ;YES, RESTART
  168.          CMP       AL,81                           ;PAGE DOWN?
  169.          JE        SKIP_IT                         ;YES, SKIP TO NEXT FILE
  170.          JMP       READ_KYBD                       ;NO, IGNORE KEY
  171. DEL_IT:
  172.          PUSH      CX                              ;SAVE FILE NAME LENGTH
  173.          MOV       SI,OFFSET FNAME                 ;POINT TO FILE NAME
  174.          MOV       DI,OFFSET DELETE_PATH + 2       ;DELETE PATH FILE SPEC
  175.          MOV       CX,13                           ;BYTES TO MOVE
  176.      REP MOVSB                                     ;MOVE FILE NAME
  177.          POP       CX                              ;RESTORE FILE NAME LENGTH
  178.  
  179.          CALL      DEL_RTN                         ;DELETE FILE
  180.          JC        SOUND_ALARM                     ;CARRY SET - NOT DELETED
  181.  
  182.          MOV       DL,017                          ;"LEFT POINTER" CHAR
  183.          CALL      PRT_CHAR                        ; AND PRINT
  184.          INC       CX                              ;INCREMENT STRING COUNT
  185.          JMP       SKIP_IT                         ;SKIP TO NEXT FILE
  186.  
  187. SOUND_ALARM:
  188.          MOV       DL,07                           ;CTRL-G "BEEP" CHAR
  189.          CALL      PRT_CHAR                        ; PRINT
  190.          JMP       READ_KYBD                       ;READ KEYBOARD AGAIN
  191.  
  192. SKIP_IT:
  193.          CALL      SPACE_FILL                      ;POSITION FOR NEXT NAME
  194.          CALL      NEXT_FILE                       ;FIND NEXT FILE MATCH
  195.          JC        END_PGM                         ;CARRY SET = NO MORE FILES
  196.          CMP       COUNT,80                        ;80 FILE NAMES DISPLAYED?
  197.          JB        FILE_LOOP                       ;NO, SKIP SCROLL
  198.          CALL      SCROLL_HALF                     ;SCROLL HALF OF WINDOW
  199.          SUB       COUNT,40                        ;SUBTRACT 40 FROM FILE COUNT
  200.          JMP       FILE_LOOP                       ;KEEP GOING
  201.  
  202. ERROR_RTN:
  203.          MOV       DX,OFFSET NOT_FOUND             ;POINT TO MSG
  204.          CALL      PRT_ASCIIZ                      ; AND PRINT
  205. END_PGM:
  206.          INT       20H                             ;RETURN TO DOS
  207.  
  208. ;* * * * * * * * * * S U B R O U T I N E S * * * * * * * * * * * * * * *
  209. ;
  210. ;GET NEXT PARAMTER BYTE AND COMPARE AGAINST DELIMITER TABLE
  211. ;        ZERO FLAG INDICATES BYTE IN AL IS DELIMITER
  212. ;
  213.  
  214. PARM_SCAN:
  215.          PUSH      CX
  216.          PUSH      DI
  217.          LODSB                                      ;GET BYTE AT DS:[SI]
  218.          MOV       DI,OFFSET DELIM                  ;POINT TO DELIM STRING
  219.          MOV       CX,5                             ;LENGTH OF DELIM STRING
  220.    REPNE SCASB                                      ;SCAN DELIM UNTIL CX=0
  221.                                                     ; OR AL=DS:[DI]
  222.          POP       DI
  223.          POP       CX
  224.          RET
  225.  
  226. ;
  227. ;GET CURRENT DIRECTORY PATH FOR DRIVE SPECIFIED
  228. ;
  229.  
  230. GET_PATH:
  231.          PUSH      SI                              ;SAVE INDEX TO COMMAND LINE
  232.          MOV       AH,047H                         ;GET CURRENT DIRECTORY
  233.          MOV       DL,DRIVE_NO                     ;GET DRIVE NUMBER (0=A,ETC)
  234.          INC       DL                              ;DL = (0=DEFAULT, 1=A, ETC)
  235.          MOV       SI,OFFSET PATH_SPEC + 1         ;SAVE DIRECTORY TO DS:[SI]
  236.          INT       DOS                             ;DOS CALL
  237.  
  238.          SUB       AL,AL                           ;ASCIIZ ZERO BYTE
  239.          CMP       [SI],AL                         ;CHECK IF ROOT DIR
  240.          JZ        ROOT_DIR                        ;IF SO, SKIP SEARCH
  241.  
  242.          MOV       DI,SI                           ;SCAN PATH FOR HEX 0
  243.          MOV       CX,64                           ;BYTES TO SEARCH
  244.    REPNZ SCASB                                     ;DO SEARCH FOR TRAILING ZERO
  245.          DEC       DI                              ;DI POINTS TO END ZERO
  246.          MOV       AL,'\'                          ;OVERLAY WITH BACK SLASH
  247.          STOSB                                     ;APPEND TO PATH
  248. ROOT_DIR:
  249.          POP       SI                              ;RESTORE INDEX
  250.          RET
  251.  
  252. ;
  253. ;FINDS NEXT FILE NAME WHICH MATCHES MASK
  254. ;
  255. NEXT_FILE:
  256.          PUSH      CX
  257.          MOV       DX,OFFSET MATCH_PATH            ;ADDRESS OF MATCH STRING
  258.          MOV       CX,0                            ;ATTRIBUTE FOR FILES
  259.          MOV       AH,04FH                         ;FIND NEXT MATCH
  260.          INT       DOS                             ;DOS FUNC CALL
  261.          POP       CX
  262.          RET
  263. ;
  264. ;SPACES OUT FILE NAME TO LENGTH OF 16 BYTES (FIVE NAME PER LINE)
  265. ;
  266. SPACE_FILL:
  267.          CMP       CX,16                           ;PRINTED 16 BYTES?
  268.          JAE       SPC_EXIT                        ;YES, EXIT
  269.          MOV       DL,' '                          ;NO, PRINT SPACE AFTER NAME
  270.          CALL      PRT_CHAR                        ;PRINT CHAR
  271.          INC       CX                              ;INCREMENT CX (STRING COUNT)
  272.          JMP       SPACE_FILL                      ;KEEP GOING
  273. SPC_EXIT:
  274.          RET
  275. ;
  276. ;PRINTS ASCIIZ STRING POINTED TO BY DS:DX
  277. ;  CX RETURNS NUMBER OF BYTES PRINTED
  278. ;
  279. PRT_ASCIIZ:
  280.          PUSH      SI
  281.          PUSH      DX
  282.          SUB       CX,CX                           ;INIT BYTE COUNT
  283.          MOV       SI,DX                           ;SET SOURCE INDEX
  284. ASC_LOOP:
  285.          MOV       DL,BYTE PTR [SI]                ;POINT TO CHAR IN ASCIIZ
  286.          CMP       DL,0                            ;FOUND TRAILING ZERO?
  287.          JZ        ASC_EXIT                        ;YES, EXIT
  288.          CALL      PRT_CHAR                        ;NO, PRINT CHAR
  289.          INC       SI                              ;POINT TO NEXT BYTE
  290.          INC       CX                              ;INCR BYTES PRINTED
  291.          JMP       ASC_LOOP                        ;KEEP GOING
  292. ASC_EXIT:
  293.          POP       DX
  294.          POP       SI
  295.          RET
  296. ;
  297. ;PRINTS CHARACTER IN DL
  298. ;
  299. PRT_CHAR:
  300.          PUSH      AX
  301.          MOV       AH,2                            ;PRINT CHAR IN DL
  302.          INT       DOS                             ;DOS FUNC CALL
  303.          POP       AX
  304.          RET
  305. ;
  306. ; ACCEPT ONLY ESCAPE, AND ALL EXTENDED KEY CODES
  307. ;
  308. GET_KEY:
  309.          MOV       AH,0                            ;GET NEXT KEYBOARD CHAR
  310.          INT       16H                             ;BIOS CALL
  311.          CMP       AL,27                           ;ESCAPE KEY?
  312.          JE        GET_EXIT                        ;YES, EXIT
  313.  
  314.          CMP       AL,0                            ;EXTENDED KEY?
  315.          JNZ       GET_KEY                         ;NO, IGNORE
  316.          XCHG      AH,AL                           ;SWAP SCAN CODE INTO AL
  317.  
  318. GET_EXIT:
  319.          RET
  320. ;
  321. ;DELETES FILE NAME IN FIELD "FNAME"
  322. ;    CARRY FLAG SET   - FILE COULD NOT BE DELETED
  323. ;    CARRY FLAG CLEAR - FILE WAS SUCCESFULLY DELETED
  324. ;
  325. DEL_RTN:
  326.          MOV       DX,OFFSET DELETE_PATH           ;POINT TO DELETE PATH
  327.          MOV       AH,041H                         ;DELETE FILE FUNC
  328.          INT       DOS                             ;DOS CALL
  329.          RET
  330. ;
  331. ;CLEARS ENTIRE SCREEN AND POSITIONS CURSOR IN UPPER LEFT CORNER
  332. ;
  333. CLR_SCR:
  334.          MOV       AH,2                            ;SET CURSOR POSITION
  335.          MOV       BH,APAGE                        ;SET CURR PAGE
  336.          MOV       DX,0                            ; UPPER LEFT CORNER
  337.          INT       VIDEO                           ;BIOS CALL
  338.  
  339.          MOV       BH,ATTR                         ;ATTRIBUTE TO BH
  340.          MOV       AX,0600H                        ;SCROLL UP BIOS FUNC
  341.          MOV       CX,0                            ;UPPER LEFT WINDOW CORNER
  342.          MOV       DX,1850H                        ;LOWER RIGHT CORNER 24 X 80
  343.          INT       VIDEO                           ;BIOS CALL
  344.          RET
  345. ;
  346. ;SCROLLS TOP HALF OF FILE DISPLAY AREA AND POSITIONS CURSOR ON BLANK LINE
  347. ;
  348. SCROLL_HALF:
  349.          MOV       AH,2                            ;SET CURSOR POSITION
  350.          MOV       BH,APAGE                        ;SET CURR PAGE
  351.          MOV       DX,0F00H                        ;PUT CURSOR ON LINE 15
  352.          INT       VIDEO                           ;BIOS CALL
  353.  
  354.          MOV       BH,ATTR                         ;ATTRIBUTE TO BH
  355.          MOV       AX,0608H                        ;SCROLL UP EIGHT LINES
  356.          MOV       CX,0700H                        ;UPPER LEFT CORNER OF WINDOW
  357.          MOV       DX,1850H                        ;LOWER RIGHT CORNER 24 X 80
  358.          INT       VIDEO                           ;BIOS CALL
  359.          RET
  360.  
  361. CSEG     ENDS
  362.          END    ENTRY
  363.