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 / UTILS / DIRUTL / DIR-FIX.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  4KB  |  240 lines

  1. ;
  2. ;    DIRFIX.ASM as of 6/4/80
  3. ;    by Keith Petersen, W8SDZ
  4. ;
  5. ;This program is for use on CP/M 1.4, CDOS or IMDOS.
  6. ;Its purpose is to fix directory entries made under
  7. ;CP/M 2.x or other operating systems which use bit
  8. ;7 of the file name for attributes, thus making the
  9. ;file unreadable.
  10. ;
  11. ;The program prints  out the disk directory
  12. ;on the signed on drive. If an illegal ASCII
  13. ;character is found in the filename or filetype
  14. ;it will be stored in a table of names to be renamed
  15. ;when the printing is finished.
  16. ;
  17. BDOS    EQU    05H
  18. FCB    EQU    5CH
  19. FCBEXT    EQU    FCB+12
  20. FCB2    EQU    FCB+16
  21. FCBEXT2    EQU    FCB2+12
  22. TBUFF    EQU    80H
  23. ;
  24.     ORG    100H
  25. ;
  26. ;    PROGRAM BEGINS HERE
  27. ;
  28. BEGIN:    LXI    SP,STACK
  29.     LXI    H,RENFIL
  30.     SHLD    RENPTR    ;INITIALIZE RENAME POINTER
  31.     CALL    SEARCH    ;SEARCH FOR FIRST FILE
  32. ;
  33. MAIN02:    LDA    RESULT
  34.     CPI    0FFH    ;NO FILE?
  35.     JZ    MAIN04    ;NO FILE, EXIT LOOP
  36.     CALL    WORKLOOP
  37.     CALL    NEXTFILE ;SEARCH FOR NEXT FILE
  38.     JMP    MAIN02
  39. ;
  40. MAIN04:    LHLD    RENPTR    ;GET TABLE POINTER
  41.     LXI    D,RENFIL ;POINT TO TABLE START
  42.     MOV    A,L    ;CHECK TO SEE IF THEY ARE SAME
  43.     CMP    E
  44.     JNZ    MAIN06    ;NOT SAME, CONTINUE
  45.     MOV    A,H
  46.     CMP    D
  47.     JZ    QUIT    ;YES, SAME - EXIT TO CP/M
  48. ;
  49. MAIN06:    LXI    D,-11    ;SUBTRACT 11
  50.     DAD    D
  51.     SHLD    RENPTR
  52.     XCHG        ;DE POINTS TO NAME
  53.     LXI    H,FCB+1    ;WHERE TO PUT OLD NAME
  54.     MVI    B,11    ;NUMBER OF CHARACTERS
  55.     CALL    MOVE
  56.     XRA    A
  57.     STA    FCB    ;ZERO DRIVE NAME
  58.     STA    FCBEXT    ;ZERO EXTENT BYTE
  59.     STA    FCB2    ;ZERO DRIVE NAME
  60.     STA    FCBEXT2    ;ZERO FCB2 EXTENT BYTE
  61.     LHLD    RENPTR
  62.     XCHG        ;DE NOW HAS NAME POINTER
  63.     LXI    H,FCB2+1 ;WHERE TO PUT NEW NAME
  64.     MVI    B,11    ;NUMBER OF CHARACTERS
  65. ;
  66. MAIN08:    LDAX    D    ;GET CHARACTER
  67.     ANI    7FH    ;STRIP OFF ATTRIBUTE
  68.     MOV    M,A
  69.     INX    H
  70.     INX    D
  71.     DCR    B
  72.     JNZ    MAIN08
  73.     LXI    D,FCB
  74.     CALL    RENAME
  75.     JMP    MAIN04
  76. ;
  77. QUIT:    JMP    0    ;EXIT TO CP/M WARM BOOT
  78. ;
  79. ;    SYSTEM SUBROUTINES
  80. ;
  81. ;MAIN WORK LOOP
  82. ;
  83. ;THIS ROUTINE FINDS THE POSITION OF THE FILE
  84. ;INFORMATION IN THE DIRECTORY DMA, PRINTS THE
  85. ;NAME IF IT IS A CURRENT FILE, AND PRINTS A
  86. ;MESSAGE IF THE FILE WILL BE RENAMED.
  87. ;
  88. WORKLOOP:
  89.     LDA    RESULT    ;RESULT HOLDS POSITION OF-
  90.     MOV    B,A    ; -THE DIRECTORY ENTRY IN THE DIR. DMA
  91.     ANI    3
  92.     RAL
  93.     RAL
  94.     RAL
  95.     RAL
  96.     RAL
  97.     ANI    0E0H
  98.     MOV    E,A
  99.     MVI    D,0
  100.     LXI    H,TBUFF
  101.     DAD    D    ;HL NOW POINTS TO THE FILE INFO
  102.     MOV    A,M
  103.     ORA    A    ;USER 0 FILE?
  104.     RNZ        ;NO, IGNORE IT
  105.     STA    ENTBYT    ;A = 0
  106.     INX    H    ;POINT TO NAME
  107.     SHLD    DIRPTR    ;SAVE DIRECTORY POSITION POINTER
  108.     MVI    B,11    ;NUMBER OF CHARACTERS
  109. ;
  110. ;PRINT AS ASCII THE FIRST 11 CHARS IN THE ENTRY 
  111. ;
  112. WORK02:    MOV    A,M
  113.     CALL    ILLCHK
  114.     CALL    TYPE
  115.     DCR    B    ;ONE LESS CHARACTER
  116.     INX    H
  117.     JNZ    WORK02
  118.     CALL    CRLF    ;TURN UP NEW LINE
  119.     LDA    ENTBYT
  120.     ORA    A
  121.     RZ
  122.     LXI    D,RENMSG ;RENAMING MESSAGE
  123.     MVI    C,9    ;WRITE CONSOLE FUNCTION
  124.     CALL    BDOS
  125.     CALL    CRLF    ;TURN UP NEW LINE
  126.     LHLD    DIRPTR    ;GET DIRECTORY POSITION POINTER
  127.     XCHG        ;DE NOW = DIRECTORY POSITION
  128.     LHLD    RENPTR
  129.     MVI    B,11    ;NUMBER OF CHARACTERS
  130.     CALL    MOVE
  131.     SHLD    RENPTR
  132.     RET
  133. ;
  134. ;    TYPE A CHAR FROM (A)
  135. ;
  136. TYPE:    PUSH    B
  137.     PUSH    D
  138.     PUSH    H
  139.     MVI    C,2    ;WRITE CONSOLE FUNCTION
  140.     MOV    E,A    ;CHARACTER TO E FOR CP/M
  141.     CALL    BDOS
  142.     POP    H
  143.     POP    D
  144.     POP    B
  145.     RET
  146. ;
  147. ;    SEARCH FOR A FILE
  148. ;
  149. SEARCH:    PUSH    B
  150.     PUSH    D
  151.     PUSH    H
  152.     MVI    C,17    ;SEARCH FIRST FUNCTION
  153.     LXI    D,AFN
  154.     CALL    BDOS
  155.     STA    RESULT
  156.     POP    H
  157.     POP    D
  158.     POP    B
  159.     RET
  160. ;
  161. ;FIND NEXT OCCURRENCE OF FILE
  162. ;
  163. NEXTFILE:
  164.     PUSH    B
  165.     PUSH    D
  166.     PUSH    H
  167.     MVI    C,18    ;SEARCH NEXT FUNCTION
  168.     LXI    D,AFN
  169.     CALL    BDOS
  170.     STA    RESULT
  171.     POP    H
  172.     POP    D
  173.     POP    B
  174.     RET
  175. ;
  176. ;RENAME A FILE
  177. ;
  178. RENAME:    PUSH    B
  179.     PUSH    D
  180.     PUSH    H
  181.     MVI    C,23    ;RENAME FUNCTION
  182.     CALL    BDOS
  183.     POP    H
  184.     POP    D
  185.     POP    B
  186.     RET
  187. ;
  188. ;NEWLINE
  189. ;
  190. CRLF:    MVI    A,0DH
  191.     CALL    TYPE
  192.     MVI    A,0AH
  193.     CALL    TYPE
  194.     RET
  195. ;
  196. ;MOVE (B) CHARACTERS FROM (DE) TO (HL)
  197. ;
  198. MOVE:    LDAX    D
  199.     MOV    M,A
  200.     INX    H
  201.     INX    D
  202.     DCR    B
  203.     JNZ    MOVE
  204.     RET
  205. ;
  206. ;CHECK FOR NONASCII CHARACTER  <20H  OR  >60H
  207. ;
  208. ILLCHK:    CPI    20H
  209.     JC    ILLEGL
  210.     CPI    61H
  211.     JNC    ILLEGL
  212.     RET
  213. ;
  214. ILLEGL:    MVI    A,0FFH
  215.     STA    ENTBYT
  216.     MVI    A,'-'
  217.     RET
  218. ;
  219. RENMSG:    DB    ' ++RENAMING$'
  220. ;
  221. ;AMBIGUOUS FILENAME.TYP
  222. ;
  223. AFN:    DB    0,'???????????',0
  224. ;
  225. RESULT:    DB    0    ;STORAGE FOR RESULT OF BDOS CALL
  226. ;
  227. ;STACK SPACE
  228. ;
  229.     DS    60
  230. STACK:    EQU    $
  231. ;
  232. ;SOME STORAGE LOCATIONS
  233. ;
  234. ENTBYT:    DS    1
  235. DIRPTR:    DS    2
  236. RENPTR:    DS    2
  237. RENFIL    EQU    $    ;FILE OF RENAMEABLE FILES BUILDS HERE
  238. ;
  239.     END
  240.