rgt%a@LANL.ARPA (Richard Thomsen) (10/15/85)
Paul, Thanks for your help, but that is what I tried. Please look at my code, which I got from _The CP/M Programmer's Handbook_ by Andy Johnson-Laird. I have the address of the ambigious filename in reg HL, and the unambigious file name in reg DE. I search for the "destination" FCB (the one found last time), then search for the next one using the ambigious FCB, which I have copied into the "destination" FCB. In one case, it never finds the second filename. In another case, it finds 17 out of 25 filenames. I can see no patterns in what it does and does not find. My code is not exactly like that in the book, but the idea is the same. Excerpted from my subroutine to get first/next filename. The entire subroutine was posted last time. This is just the part that finds the NEXT filename. The DMA buffer has been set up already. The "destination" FCB is the one that was filled last time from the one found. The file name in that FCB has been opened and closed, using this FCB. The "source" FCB is the ambigious file name used in the last "find first/find next" call to this subroutine. ; ; Request is to get the next file name -- search for next ; First, the context of the file name must be restored by again ; searching for the last one found. ; GNFNEXT: POP H ;Recover address of source file name FCB POP D ;Recover address of destination FCB PUSH H ;Save them again, but in opposite order PUSH D CALL GNFZEROFILE ;Clear all but the name from the FCB POP D ;Recover the destination FCB address PUSH D ;And save it again MVI C,SEARCHF ;Get code to search for the last file found CALL BDOS ;And re-find that file ; ; Now the FCB is set to what it was at the end of the last search. ; Move the source FCB into the destination FCB and search for the next. ; POP D ;Get the address of the destination FCB POP H ;Get the address of the source FCB PUSH D ;Save them again in the opposite order PUSH H PUSH D ;Save address of destination FCB again MVI C,FCBSIZE ;Get the size of the FCB's CALL MOVE ;Set the destination FCB to the source FCB ; ; Now call the BDOS to search for the next occurance of the FCB ; POP D ;Get address of destination FCB CALL GNFZEROFILE ;And clear all but the name MVI C,SEARCHN ;Get code to search for next file name CALL BDOS ;Call the BDOS to do the search POP H ;Restore the address of the source FCB POP D ;Restore the address of the destination FCB CPI 0FFH ;See if file was found JZ GNFFILENOTFND ;If not, then just exit with error ; ; File was found -- save the filename found in the save area for ; next search ; GNFGETFCB:
RCONN@SIMTEL20.ARPA (Rick Conn) (10/16/85)
SYSLIB contains a set of routines for directory accessing, and the source code may help in answering your questions. The DIRF routine inits a buffer area, loads a disk directory, selects a set of files from the loaded dir, selects user areas, packs the dir, and alphabetizes. DIRFS does the same, but provides information on file sizes as well (and runs slower). There are also DIRLOAD and DIRSLOAD. The source code is in the SDIR.MAC modules of SYSLIB3: on SIMTEL20. I think there are several SDIR*.MAC modules there. Rick -------