; ; DIRFIX.ASM as of 6/4/80 ; by Keith Petersen, W8SDZ ; ;This program is for use on CP/M 1.4, CDOS or IMDOS. ;Its purpose is to fix directory entries made under ;CP/M 2.x or other operating systems which use bit ;7 of the file name for attributes, thus making the ;file unreadable. ; ;The program prints out the disk directory ;on the signed on drive. If an illegal ASCII ;character is found in the filename or filetype ;it will be stored in a table of names to be renamed ;when the printing is finished. ; BDOS EQU 05H FCB EQU 5CH FCBEXT EQU FCB+12 FCB2 EQU FCB+16 FCBEXT2 EQU FCB2+12 TBUFF EQU 80H ; ORG 100H ; ; PROGRAM BEGINS HERE ; BEGIN: LXI SP,STACK LXI H,RENFIL SHLD RENPTR ;INITIALIZE RENAME POINTER CALL SEARCH ;SEARCH FOR FIRST FILE ; MAIN02: LDA RESULT CPI 0FFH ;NO FILE? JZ MAIN04 ;NO FILE, EXIT LOOP CALL WORKLOOP CALL NEXTFILE ;SEARCH FOR NEXT FILE JMP MAIN02 ; MAIN04: LHLD RENPTR ;GET TABLE POINTER LXI D,RENFIL ;POINT TO TABLE START MOV A,L ;CHECK TO SEE IF THEY ARE SAME CMP E JNZ MAIN06 ;NOT SAME, CONTINUE MOV A,H CMP D JZ QUIT ;YES, SAME - EXIT TO CP/M ; MAIN06: LXI D,-11 ;SUBTRACT 11 DAD D SHLD RENPTR XCHG ;DE POINTS TO NAME LXI H,FCB+1 ;WHERE TO PUT OLD NAME MVI B,11 ;NUMBER OF CHARACTERS CALL MOVE XRA A STA FCB ;ZERO DRIVE NAME STA FCBEXT ;ZERO EXTENT BYTE STA FCB2 ;ZERO DRIVE NAME STA FCBEXT2 ;ZERO FCB2 EXTENT BYTE LHLD RENPTR XCHG ;DE NOW HAS NAME POINTER LXI H,FCB2+1 ;WHERE TO PUT NEW NAME MVI B,11 ;NUMBER OF CHARACTERS ; MAIN08: LDAX D ;GET CHARACTER ANI 7FH ;STRIP OFF ATTRIBUTE MOV M,A INX H INX D DCR B JNZ MAIN08 LXI D,FCB CALL RENAME JMP MAIN04 ; QUIT: JMP 0 ;EXIT TO CP/M WARM BOOT ; ; SYSTEM SUBROUTINES ; ;MAIN WORK LOOP ; ;THIS ROUTINE FINDS THE POSITION OF THE FILE ;INFORMATION IN THE DIRECTORY DMA, PRINTS THE ;NAME IF IT IS A CURRENT FILE, AND PRINTS A ;MESSAGE IF THE FILE WILL BE RENAMED. ; WORKLOOP: LDA RESULT ;RESULT HOLDS POSITION OF- MOV B,A ; -THE DIRECTORY ENTRY IN THE DIR. DMA ANI 3 RAL RAL RAL RAL RAL ANI 0E0H MOV E,A MVI D,0 LXI H,TBUFF DAD D ;HL NOW POINTS TO THE FILE INFO MOV A,M ORA A ;USER 0 FILE? RNZ ;NO, IGNORE IT STA ENTBYT ;A = 0 INX H ;POINT TO NAME SHLD DIRPTR ;SAVE DIRECTORY POSITION POINTER MVI B,11 ;NUMBER OF CHARACTERS ; ;PRINT AS ASCII THE FIRST 11 CHARS IN THE ENTRY ; WORK02: MOV A,M CALL ILLCHK CALL TYPE DCR B ;ONE LESS CHARACTER INX H JNZ WORK02 CALL CRLF ;TURN UP NEW LINE LDA ENTBYT ORA A RZ LXI D,RENMSG ;RENAMING MESSAGE MVI C,9 ;WRITE CONSOLE FUNCTION CALL BDOS CALL CRLF ;TURN UP NEW LINE LHLD DIRPTR ;GET DIRECTORY POSITION POINTER XCHG ;DE NOW = DIRECTORY POSITION LHLD RENPTR MVI B,11 ;NUMBER OF CHARACTERS CALL MOVE SHLD RENPTR RET ; ; TYPE A CHAR FROM (A) ; TYPE: PUSH B PUSH D PUSH H MVI C,2 ;WRITE CONSOLE FUNCTION MOV E,A ;CHARACTER TO E FOR CP/M CALL BDOS POP H POP D POP B RET ; ; SEARCH FOR A FILE ; SEARCH: PUSH B PUSH D PUSH H MVI C,17 ;SEARCH FIRST FUNCTION LXI D,AFN CALL BDOS STA RESULT POP H POP D POP B RET ; ;FIND NEXT OCCURRENCE OF FILE ; NEXTFILE: PUSH B PUSH D PUSH H MVI C,18 ;SEARCH NEXT FUNCTION LXI D,AFN CALL BDOS STA RESULT POP H POP D POP B RET ; ;RENAME A FILE ; RENAME: PUSH B PUSH D PUSH H MVI C,23 ;RENAME FUNCTION CALL BDOS POP H POP D POP B RET ; ;NEWLINE ; CRLF: MVI A,0DH CALL TYPE MVI A,0AH CALL TYPE RET ; ;MOVE (B) CHARACTERS FROM (DE) TO (HL) ; MOVE: LDAX D MOV M,A INX H INX D DCR B JNZ MOVE RET ; ;CHECK FOR NONASCII CHARACTER <20H OR >60H ; ILLCHK: CPI 20H JC ILLEGL CPI 61H JNC ILLEGL RET ; ILLEGL: MVI A,0FFH STA ENTBYT MVI A,'-' RET ; RENMSG: DB ' ++RENAMING$' ; ;AMBIGUOUS FILENAME.TYP ; AFN: DB 0,'???????????',0 ; RESULT: DB 0 ;STORAGE FOR RESULT OF BDOS CALL ; ;STACK SPACE ; DS 60 STACK: EQU $ ; ;SOME STORAGE LOCATIONS ; ENTBYT: DS 1 DIRPTR: DS 2 RENPTR: DS 2 RENFIL EQU $ ;FILE OF RENAMEABLE FILES BUILDS HERE ; END