home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol018 / file-ext.asm < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  422 lines

  1. ;                       FILE-EXT.ASM
  2. ;  
  3. ;  Originally  named  FILES.ASM,  and  from a  disassembly  by 
  4. ; "J.A.P"  of January 23,1980...FILE-EXT.ASM will display  the 
  5. ; selected disk's directory entries in the form:
  6. ;          Filename.Typ   exs1s2rc <-----Group----->
  7. ;          =========================================
  8. ;  The "hack-job" I did on this one was less than  ideal,  but 
  9. ; none the less, it get's the job done...the display format is 
  10. ; now  alot  cleaner,  and  it  does'nt  "warm  boot"  as  the 
  11. ; FILES.ASM version did...
  12. ;  The  program will display the disk directory of the  logged 
  13. ; on  disk,  including all the Hexadecimal information on  the 
  14. ; groups.  If an illegal character is found in the filename or 
  15. ; filetype,  it  will  prompt  the operator as to  whether  to 
  16. ; delete the file (or not).  If the operator answers Y  (yes), 
  17. ; the  program will go on displaying more file information and 
  18. ; stopping  when  a bad filename or filetype  is  encountered. 
  19. ; When the display is all done,  the files that were  selected 
  20. ; for deletion will be removed from the directory.
  21. ;  On  the  subject  of  "hack-job's"  of  software,  read  an 
  22. ; interesting  article  in  Psychology  Today  magazine,  "The 
  23. ; Hacker  Papers;  Computer  Addiction:  Reflection on  a  New 
  24. ; Obsession"...August 1980 issue, pages 62-69.
  25. ;                               Best regards,
  26. ;                               Kelly Smith, CP/M-NET (tm)
  27. ;                               805-527-9321 (Modem, 300 Baud)
  28. ;                               805-527-0518 (Verbal)
  29.  
  30.     ORG    0100H
  31.  
  32. BDOS    EQU    05H
  33. TBUFF    EQU    80H
  34. ;
  35. CR    EQU    0DH    ;ASCII CARRIAGE RETURN
  36. LF    EQU    0AH    ;ASCII LINE FEED
  37. ;
  38. ;
  39. FILES:            ; 
  40.     LXI    H,0    ;
  41.     DAD    SP    ;
  42.     SHLD    OLDSTK    ;
  43.     LXI    SP,NEWSTK    ;
  44.     JMP    BEGIN    ;
  45. ;
  46. ;
  47. ;    SYSTEM SUBROUTINES
  48. ;
  49. ;    PRINT STRING FROM D&E REGS.
  50. ;
  51. PRINT:    MVI    C,9
  52.     CALL    BDOS
  53.     RET
  54. ;
  55. ;    TYPE A CHAR FROM (A)
  56. ;
  57. TYPE:        ; 
  58.     PUSH    B
  59.     PUSH    D
  60.     PUSH    H
  61.     MVI    C,2
  62.     MOV    E,A
  63.     CALL    BDOS    ;
  64.     POP    H
  65.     POP    D
  66.     POP    B
  67.     RET
  68. ;
  69. ;    SEARCH FOR A FILE
  70. ;
  71. SEARCH:        ; 
  72.     PUSH    B
  73.     PUSH    D
  74.     PUSH    H
  75.     MVI    C,11H
  76.     LXI    D,AFN    ;
  77.     CALL    BDOS    ;
  78.     STA    RESULT    ;
  79.     POP    H
  80.     POP    D
  81.     POP    B
  82.     RET
  83. ;
  84. ;    AMBIGUOUS FILENAME.TYP
  85. ;
  86. AFN:        ; 
  87.     DB    '?????????????'
  88. RESULT:        ; 
  89.     DB    0    ;STORAGE FOR RESULT OF BDOS CALL
  90. ;
  91. ;    FIND NEXT OCCURRENCE OF FILE
  92. ;
  93. NEXTFILE:        ; 
  94.     PUSH    B
  95.     PUSH    D
  96.     PUSH    H
  97.     MVI    C,12H
  98.     LXI    D,AFN    ;
  99.     CALL    BDOS    ;
  100.     STA    RESULT    ;
  101.     POP    H
  102.     POP    D
  103.     POP    B
  104.     RET
  105. ;
  106. ;    DELETE A FILE
  107. ;
  108. DELETE:        ; 
  109.     PUSH    B
  110.     PUSH    D
  111.     PUSH    H
  112.     MVI    C,13H
  113.     CALL    BDOS    ;
  114.     POP    H
  115.     POP    D
  116.     POP    B
  117.     RET
  118. ;
  119. ;    GET INPUT FROM CONSOLE
  120. ;
  121. CONIN:        ; 
  122.     PUSH    B
  123.     PUSH    D
  124.     PUSH    H
  125.     MVI    C,1
  126.     CALL    BDOS    ;
  127.     POP    H
  128.     POP    D
  129.     POP    B
  130.     RET
  131. ;
  132. ;    CONVERT A BYTE IN (A) TO TWO PRINTED CHARACTERS
  133. ;
  134. HEXASC:        ; 
  135.     CPI    0AH
  136.     JC    HEXA2    ;
  137.     ADI    '7'    ;
  138.     CALL    TYPE    ;
  139.     RET
  140. HEXA2:        ; 
  141.     ADI    '0'    ;
  142.     CALL    TYPE    ;
  143.     RET
  144. HEXCON:        ; 
  145.     PUSH    PSW
  146.     RAR
  147.     RAR
  148.     RAR
  149.     RAR
  150.     ANI    0FH
  151.     CALL    HEXASC    ;
  152.     POP    PSW
  153.     ANI    0FH
  154.     CALL    HEXASC    ;
  155.     RET
  156. ;
  157. ;    NEWLINE
  158. ;
  159. CRLF:        ; 
  160.     MVI    A,CR
  161.     CALL    TYPE    ;
  162.     MVI    A,LF
  163.     CALL    TYPE    ;
  164.     RET
  165. ;
  166. ;    PRINT A SPACE
  167. ;
  168. SPACE:        ; 
  169.     MVI    A,' '    ;
  170.     CALL    TYPE    ;
  171.     RET
  172. ;
  173. ;    MAIN WORK LOOP
  174. ;
  175. ;    THIS ROUTINE FINDS THE POSITION OF THE FILE
  176. ;    INFORMATION IN THE DIRECTORY DMA, PRINTS THE
  177. ;    DATA IF IT IS A CURRENT FILE, AND PROMPTS THE
  178. ;    OPERATOR FOR INSTRUCTIONS IF THE FILENAME HAS
  179. ;    ILLEGAL (NON-ASCII) DATA IN IT.
  180. ;
  181. WORKLOOP:        ; 
  182.     LDA    RESULT    ;RESULT HOLDS POSITION OF-
  183.     MOV    B,A    ; -THE DIRECTORY ENTRY IN THE DIR. DMA
  184.     ANI    3
  185.     RAL
  186.     RAL
  187.     RAL
  188.     RAL
  189.     RAL
  190.     ANI    0E0H
  191.     MOV    E,A
  192.     MVI    D,0
  193.     LXI    H,TBUFF    ;
  194.     DAD    D    ;HL NOW POINTS AT THE FILE INFO
  195.     MOV    A,M
  196.     CPI    0E5H    ;KILLED FILE?
  197.     RZ        ;YES
  198.     MOV    A,M
  199.     STA    ENTBYT    ;
  200.     PUSH    H
  201.     PUSH    H
  202.     MVI    B,8
  203.     INX    H
  204. WORK02:    MOV    A,M    ;PRINT FILE NAME
  205.     CALL    ILLCHK    ;
  206.     CALL    TYPE    ;
  207.     DCR    B
  208.     INX    H
  209.     JNZ    WORK02    ;
  210.     MVI    B,3
  211.     MVI    A,'.'
  212.     CALL    TYPE    ;PRINT NEXT THREE CHARACTERS AS ASCII
  213. WORK03:    MOV    A,M
  214.     CALL    ILLCHK    ;
  215.     CALL    TYPE    ;
  216.     DCR    B
  217.     INX    H
  218.     JNZ    WORK03    ;
  219.     CALL    TYPE
  220.     CALL    SPACE
  221.     MVI    B,3
  222.     POP    H    ;NOW DISPLAY ATTRIBUTES
  223.     LXI    D,9
  224.     DAD    D
  225. WORK03A:CALL    SPACE
  226.     MOV    A,M
  227.     RLC        ;TEST $SYS AND $R/O, AND RESERVED
  228.     MVI    A,'1'
  229.     JC    WORK03B
  230.     MVI    A,'0'
  231. WORK03B:CALL    TYPE
  232.     CALL    SPACE
  233.     DCR    B
  234.     INX    H
  235.     JNZ    WORK03A
  236.     MVI    B,20
  237. WORK04:    MOV    A,B
  238.     ANI    3
  239.     CZ    SPACE    ;
  240.     MOV    A,M
  241.     CALL    HEXCON    ;
  242.     INX    H
  243.     DCR    B
  244.     JNZ    WORK04    ;
  245.     CALL    CRLF    ;
  246.     POP    H
  247.     LDA    ENTBYT    ;
  248.     ORA    A
  249.     RZ
  250.     PUSH    H
  251.     LXI    H,DELMSG    ;
  252. WORK06:        ; 
  253.     MOV    A,M
  254.     ORA    A
  255.     JZ    WORK08    ;
  256.     CALL    TYPE    ;
  257.     INX    H
  258.     JMP    WORK06    ;
  259. DELMSG:        ; 
  260.     DB    'Delete this file ? ',0
  261. WORK08:        ; 
  262.     CALL    CONIN    ;
  263.     POP    H
  264.     ANI    5FH
  265.     CPI    'Y'    ;
  266.     PUSH    PSW
  267.     CALL    CRLF    ;KEEP IT NEAT
  268.     POP    PSW
  269.     RNZ
  270.     XCHG
  271.     LHLD    DELPTR    ;
  272.     MVI    B,10H
  273. WORK10:        ; 
  274.     LDAX    D
  275.     MOV    M,A
  276.     INX    H
  277.     INX    D
  278.     DCR    B
  279.     JNZ    WORK10    ;
  280.     SHLD    DELPTR    ;
  281.     RET
  282. ;
  283. ;    CHECK FOR NONASCII CHARACTER  <20H  OR  >60H
  284. ;
  285. ILLCHK:    PUSH    PSW
  286.     ANI    07FH    ;MASK FOR PROPRIETARY", "$SYS", "$R/W"
  287.     CPI    ' '    ;
  288.     JC    ILLEGL    ;
  289.     CPI    61H
  290.     JNC    ILLEGL    ;
  291.     POP    PSW
  292.     RET
  293. ILLEGL:    POP    PSW
  294.     PUSH    PSW
  295.     MVI    A,0FFH
  296.     STA    ENTBYT    ;
  297.     POP    PSW
  298.     RET
  299. ;
  300. ;
  301. ;
  302. MSG:    DB    'Filename.Typ R/OSysRes exs1s2rc'
  303.     DB    ' <--------------Group-------------->'
  304.     DB    CR,LF
  305.     DB    '==============================='
  306.     DB    '===================================='
  307.     DB    CR,LF,'$'
  308. ;
  309. ;
  310. ;
  311. ; ERROR MESSAGES
  312. ;
  313. ERROR1:    LXI    D,ERMSG1;SAY NO GO, AND BAIL OUT
  314.     CALL    PRINT
  315.     JMP    QUIT
  316.  
  317. ;
  318. ERMSG1:    DB    CR,LF,'Disk select should be " N:"$'
  319.  
  320. ;
  321. ERROR2:    LXI    D,ERMSG2;SAY NO GO, AND BAIL OUT
  322.     CALL    PRINT
  323.     JMP    QUIT
  324.  
  325. ERMSG2:    DB    CR,LF,'Bad delimeter, should be ":"$'
  326.  
  327. ;
  328. ERROR3:    LXI    D,ERMSG3;SAY NO GO, AND BAIL OUT
  329.     CALL    PRINT
  330.     JMP    QUIT
  331.  
  332. ERMSG3:    DB    CR,LF,'No drive specified$'
  333.  
  334. ;
  335. ERROR4:    LXI    D,ERMSG4;SAY NO GO, AND BAIL OUT
  336.     CALL    PRINT
  337.     JMP    QUIT
  338.  
  339. ERMSG4:    DB    CR,LF,'Only drives A to D allowed$'
  340.  
  341. ;
  342.  
  343. ;    PROGRAM BEGINS HERE
  344. ;
  345. BEGIN:
  346. ;
  347. ; CHECK FOR DRIVE SPECIFICATION
  348. ;
  349.     LDA    TBUFF    ;GET LENGTH OF COMMAND PARAMETERS
  350.     CPI    2    ; IF <2, NO PARAMETERS
  351.     JC    MAIN01    ; MUST BE PRESENT LOGGED-IN DRIVE
  352.     JZ    ERROR1    ;EXACTLY 2, IS ERROR
  353.     LHLD    TBUFF+2    ;AT LEAST 3 THEN...
  354.     MOV    A,H    ;NEXT CHARACTER SHOULD BE ":"
  355.     CPI    ':'
  356.     JNZ    ERROR2    ;ONLY ALLOW DRIVE SET
  357.     MOV    A,L    ;NEXT CHARACTER SHOULD BE DRIVE
  358.     CPI    'A'    ;AT A MINIMUM, "A"
  359.     JC    ERROR3
  360.     CPI    'E'    ;AT A MAXIMUM "D"
  361.     JNC    ERROR4
  362.     ANI    7    ;STRIP BITS, FOR 0 TO 3
  363.     DCR    A    ;BACK OFF FOR 0 TO 3
  364.     MOV    E,A    ;MAKE DISK NUMBER
  365.     MVI    D,0
  366.     MVI    C,14    ;BDOS SELECT DISK FUNCTION
  367.     CALL    BDOS
  368.  
  369. MAIN01:    LXI    D,MSG
  370.     CALL    PRINT
  371.         ; 
  372.     LXI    H,DELFIL    ;
  373.     SHLD    DELPTR    ;
  374.     CALL    SEARCH    ;
  375. MAIN02:        ; 
  376.     LDA    RESULT    ;
  377.     CPI    0FFH
  378.     JZ    MAIN04    ;
  379.     CALL    WORKLOOP    ;
  380.     CALL    NEXTFILE    ;
  381.     JMP    MAIN02    ;
  382. MAIN04:        ; 
  383.     LHLD    DELPTR    ;
  384.     LXI    D,DELFIL
  385.     MOV    A,L
  386.     CMP    E
  387.     JNZ    MAIN06    ;
  388.     MOV    A,H
  389.     CMP    D
  390.     JZ    QUIT    ;
  391. MAIN06:        ; 
  392.     LXI    D,-10H
  393.     DAD    D
  394.     SHLD    DELPTR    ;
  395.     XCHG
  396.     CALL    DELETE    ;
  397.     JMP    MAIN04    ;
  398. QUIT:        ; 
  399.     LHLD    OLDSTK    ;
  400.     SPHL
  401.     RET        ;
  402. ;
  403. ;    SOME STORAGE LOCATIONS
  404. ;
  405. OLDSTK:    DS    2    ;STORAGE FOR "OLD" STACK POINTER
  406.     DS    32
  407. NEWSTK    EQU    $    ;STORAGE FOR "NEW" STACK
  408. ENTBYT:    DS    1    ;
  409. DELPTR:    DS    16    ;
  410. DELFIL    EQU    $    ;FILE OF DELETEABLE FILE BUILDS HERE
  411. ;
  412. ;
  413.     END
  414.