; PROGRAM TO WRITE A DIRECTORY LISTING TO AN ASCII FILE ; IN A FORM SUITABLE FOR USE WITH A SUBMIT FILE (AFTER ; SUITABLE PROCESSING WITH ED). ; ; THE COMMAND FORMAT IS: ; ; A>DIRLST NAME.EXT ; ; WHERE NAME.EXT IS THE FILE NAME TO SAVE THE DIRECTORY IN. ; ; ; ; ; BY BRUCE KENDALL 1/1980 ; BUG FIXED 2/9/80 ; 10/4/80 ; 1/11/81 ; ADDED MORE '???' FOR WILD CARD ; ; TO FIX CP/M 2.2 BUG ; ; 4/10/81 ;changed formatting to eliminate ; ;extraneous characters at start of ; ;each file name (Ray Glueck) ; ; ---CP/M EQUATES --- ; FCB EQU 5CH BDOS EQU 05 FPRT EQU 9 FCLOSE EQU 16 DELETE EQU 19 WRITE EQU 21 MAKE EQU 22 SDMA EQU 26 SRCH EQU 17 SRCHX EQU 18 ; DMA EQU 80H ; DMA LOCATION ; ORG 100H ;CP/M TPA ; LXI H,0 DAD SP SHLD OLDSTK ;SAVE OLD STACK POINTER ; ; START: LXI SP,STACK ; LXI D,MSG1 ;POINT TO NAME ERROR MESSAGE LDA FCB+1 ;GET FIRST CHAR. OF NAME CPI 20H JZ ERROR+3 JC ERROR+3 ;IF BAD NAME ; LXI D,MSG ;POINT TO STARTUP MESSAGE CALL PTMSG ;PRINT OUT MESSAGE ; LXI D,DMA ;GET STD DMA ADDRESS MVI C,SDMA CALL BDOS ; LXI D,FCB ;POINT TO FCB MVI C,DELETE ;FUNCTION TO DELETE A FILE CALL BDOS ; XRA A STA FCB+12 ; CLEAR EXTENT BYTE STA FCB+32 ; CLEAR NEXT RECORD BYTE LXI D,FCB MVI C,MAKE CALL BDOS ;CREATE FILE CPI 0FFH JZ ERROR ; LXI H,BUFF ;POINT TO START OF MEMORY BUFFER SHLD BUFPTR ;SAVE POINTER ; MVI C,SRCH ;SETUP FOR DIRECTORY SEARCH LST: LXI D,FCB1 ;POINT TO WILD CARD FCB CALL BDOS CPI 0FFH ;TEST FOR END OF DIRECTORY JZ FLZ ;YES, DUMP BUFFER TO DISC FILE ANI 03H ;NO, SO MASK BYTE ADDRESS RLC RLC ;MULTIPLY BY 32 (32 BYTES/FCB) RLC RLC RLC ADI DMA AND 00FFH ;ADD IN START OF DMA BUFFER LXI D,DMA ; GET INTO (D,E) MOV E,A INX D ;POINT TO START OF FILE NAME LXI H,11 ;GET OFFSET TO EXTENT BYTE DAD D ;POINT TO EXTENT MOV A,M ;GET IT ORA A ;IS IT ZERO? JNZ LST1 ;IF NOT FIRST EXTENT ; MVI A,':' ;GET DELIMITER ; CALL STORE ; CALL STORE ; CALL STORE ;PUT DELIMITERS AHEAD OF FILE NAME ; MVI B,8 ;LENGTH OF FILE NAME CALL STOREN ;SAVE NAME ; MVI A,'.' ;DELIMITER BETWEEN NAME AND EXTENT CALL STORE ; MVI B,3 ;LENGTH OF EXTENT CALL STOREN ;SAVE EXTENT ; MVI A,0DH ;PUT IN CRLF CALL STORE MVI A,0AH CALL STORE ; LST1: MVI C,SRCHX ;SET TO SEARCH FOR NEXT NAME JMP LST ; STOREN: LDAX D ;GET CHAR. OF FILE NAME CPI ' ' ;IS IT A SPACE? CNZ STORE ;NO, SO SAVE IT INX D ;INCREMENT POINTER DCR B ;COUNT DOWN CHARACTERS JNZ STOREN ;LOOP UNTIL DONE RET ; FLZ: MVI A,'Z'-40H ;GET A CONTROL-Z CZ1: CALL STORE ;PUT IT IN BUFFER JNZ CZ1 ;FILL OUT SECTOR BUFFER WITH CTL-Z ; LXI H,BUFF ;POINT TO START OF BUFFER SHLD WPTR ;SAVE POINTER WMORE: LHLD WPTR ;GET POINTER XCHG ;INTO (D,E) MVI C,SDMA ;SET TO MOVE DMA BUFFER CALL BDOS ;DO IT LXI D,FCB ;POINT TO FCB MVI C,WRITE ;SET TO WRITE DMA BUFFER TO DISC CALL BDOS ;DO IT ORA A JNZ ERROR ;IF ERROR, EXIT WITH MESSAGE ; LHLD WPTR ;GET BUFFER POINTER LXI D,80H ;SIZE OF DMA BUFFER DAD D ;COMPUTE NEW POINTER SHLD WPTR ;SAVE IT LDA BUFPTR+1 ;GET UPPER ADDRESS OF BUFFER CMP H ;COMPARE IT WITH CURRENT WRITE POINTER JZ CLOSE ;CLOSE FILE IF THEY ARE THE SAME JNC WMORE ;LOOP TO SAVE ALL OF BUFFER TO DISC ; CLOSE: LXI D,80H ;GET STD DMA ADDRESS MVI C,SDMA CALL BDOS ;RESET DMA ADDRESS LXI D,FCB MVI C,FCLOSE CALL BDOS ;CLOSE FILE ; EXIT: LHLD OLDSTK ;GET OLD STACK POINTER BACK SPHL JMP 0 ;RETURN TO CP/M ; STORE: LHLD BUFPTR ;GET BUFFER POINTER MOV M,A ;SAVE BYTE IN MEMORY BUFFER MOV C,A ;AND IN (C) INX H ;POINT TO NEXT LOCATION MOV A,L ;GET LOWER ADDRESS BYTE ORA A ;IS IT ZERO? MOV A,C ;RESTORE BYTE SHLD BUFPTR ;SAVE NEW BUFFER POINTER RET ; PTMSG: MVI C,FPRT ;GET CP/M MESSAGE PRINT CODE JMP BDOS ;EXECUTE PRINT FUNCTION ; ERROR: LXI D,MSGE ;POINT TO ERROR MESSAGE CALL PTMSG JMP EXIT ;RETURN TO CP/M ; MSG: DB 0DH,0AH,' --- DIRECTORY SAVER ver 1.1 ---',0DH,0AH,'$' MSG1: DB 0DH,0AH,07,' -- INVALID FILE NAME --',0DH,0AH,0DH,0AH DB ' THE PROPER CALLING SEQUENCE IS:',0DH,0AH,0DH,0AH DB ' A>DIRLST NAME.EXT',0DH,0AH,0DH,0AH DB ' WHERE NAME.EXT IS THE FILE NAME TO SAVE THE DIRECTORY IN.' DB 0DH,0AH,'$' MSGE: DB 0DH,0AH,07,' -- R/W ERROR --',0DH,0AH,'$' ; FCB1: DB 0,'???????????????????' ;FCB FOR DIRECTORY SEARCH ; OLDSTK: DS 2 ;BUFFER FOR OLD STACK POINTER BUFPTR: DS 2 ;BUFFER POINTER FOR FILLING IT WPTR: DS 2 ;BUFFER POINTER FOR SAVING IT ON DISC DS 80H ;ROOM FOR STACK STACK: DS 1 ; ORG (($+101H) AND 0FF00H) ;START BUFFER ON PAGE BOUNDARY BUFF DB 0 ; END