; SORTDIR - CP/M UTILITY TO SORT DISK DIRECTORY ; ORG 0100H JMP SORTDIR DB '(C) 1980 - N D H HAMMOND' PRGNAME DB 'SORTDIR V1.1 OF 22APR80' DB 0DH,0AH,'$' ; ; DEFINITIONS ; BOOT EQU 0000H ;CP/M BOOT VECTOR CBIOS EQU BOOT+1 ;^CBIOS ENTRY EQU 0005H ;CP/M FDOS ENTRY TBUFF EQU 0080H ;DEFAULT BUFFER DIRTRK EQU 2 ;DIRECTORY TRACK NO NDIRSEC EQU 16 ;NO OF DIR SECTORS NDIRENT EQU 64 ;MAX NO OF DIR ENTRIES ENTLGTH EQU 32 ;ENTRY LGTH IN BYTES NLGTH EQU 8 ;NAME FIELD LGTH TLGTH EQU 3 ;TYPE FIELD LGTH FNLGTH EQU NLGTH+TLGTH ;LENGTH OF FILENAME FLSTEP EQU 0FH ;OFFSET TO FL FIELD DELCHR EQU 0E5H ;DELETED DATA CHAR NAME EQU 0 ;SORT BY FILE NAME TYPE EQU 0FFH ;SORT BY FILE TYPE ; ; MAIN PROGRAM ; SORTDIR LXI H,0 ;SAVE SYSTEM SP DAD SP SHLD OLDSP LXI SP,STACK LXI D,PRGNAME ;PRINT SIGNON MSG CALL WRITESTRING CALL CHECKMODE CALL GETDISK CALL READDIR CALL TIDY CALL SORT CALL WRITEDIR CALL INITBDOS LXI D,TERMMSG CALL WRITESTRING LHLD OLDSP ;RESTORE SYSTEM SP SPHL RET ;RETURN TO CP/M ; ; SUBROUTINES ; CHECKMODE ;CHECK FOR NAME-TYPE OR TYPE-NAME SORT MVI A,NAME STA MODE LXI H,TBUFF MOV A,M CPI 2 JNZ NOSTAR INX H INX H MOV A,M CPI '*' JNZ NOSTAR MVI A,TYPE STA MODE NOSTAR RET ; ; GETDISK ;PROMPT OPERATOR FOR DISK LXI D,DSKMSG CALL WRITESTRING GET1 CALL READCHAR CPI 0DH ; ? RZ CPI 03H ;<^C> ? JZ BOOT JMP GET1 ; ; READDIR ;READ DISK DIRECTORY INTO BUFFER MVI C,DIRTRK ;SET TRACK NO CALL SETTRK LXI H,BUFFER ;INITIALIZE BUFFPT SHLD BUFFPT XRA A ;INITIALIZE SECTOR STA SECTOR READLP CALL NEXTSEC ;SET SECTOR NO LHLD BUFFPT ;SET DMA ADDRESS MOV B,H MOV C,L CALL SETDMA CALL READ ;READ SECTOR LHLD BUFFPT ;UPDATE DMA ADDRESS LXI D,80H DAD D SHLD BUFFPT LDA SECTOR ;UPDATE SECTOR INR A STA SECTOR CPI NDIRSEC JNZ READLP RET ; ; WRITEDIR ;WRITE DISK DIRECTORY FROM BUFFER MVI C,DIRTRK ;SET TRACK NO CALL SETTRK LXI H,BUFFER ;INITIALIZE BUFFPT SHLD BUFFPT XRA A ;INITIALIZE SECTOR STA SECTOR WRITELP CALL NEXTSEC ;SET SECTOR NO LHLD BUFFPT ;SET DMA ADDRESS MOV B,H MOV C,L CALL SETDMA CALL WRITE ;WRITE SECTOR LHLD BUFFPT ;UPDATE DMA ADDRESS LXI D,80H DAD D SHLD BUFFPT LDA SECTOR ;UPDATE SECTOR INR A STA SECTOR CPI NDIRSEC JNZ WRITELP RET ; ; NEXTSEC ;SET SECTOR NO TO NEXT DIRECTORY SECTOR ;MAPS SEQUENTIAL NO IN REG-A TO PHYSICAL ;SECTOR ON DISK. LXI H,SEGTABLE MVI B,0 MOV C,A DAD B MOV C,M CALL SETSEC RET ; SEGTABLE DB 01H,07H,0DH,13H DB 19H,05H,0BH,11H DB 17H,03H,09H,0FH DB 15H,02H,08H,0EH ; ; TIDY ;TIDY DIRECTORY BY COMPLETELY DELETING ;ERASED ENTRIES AND ENTRIES OF ZERO LENGTH MVI D,NDIRENT LXI H,BUFFER TIDYLP MOV A,M ;CHECK FOR ERASED FILE PUSH H CPI DELCHR CZ DELETE LXI B,FLSTEP ;CHECK FOR ZERO LGTH DAD B MOV A,M POP H PUSH H CPI 0 CZ DELETE LXI B,ENTLGTH ;STEP TO NEXT ENTRY POP H DAD B DCR D JNZ TIDYLP RET ; ; DELETE ;DELETE FILE ENTRY AT HL^ ;PRESERVE HL PUSH H MVI B,ENTLGTH DELLP MVI M,DELCHR INX H DCR B JNZ DELLP POP H RET ; ; SORT ;BUBBLE SORT DIRECTORY INTO ALPHABETICAL ORDER MVI A,NDIRENT-1 STA OPC ;OUTER LOOP PASSES SORTOLP STA IPC ;INNER LOOP PASSES LXI B,2*ENTLGTH LXI H,BUFFER LXI D,BUFFER+ENTLGTH SORTILP PUSH B PUSH H PUSH D LDA MODE CPI NAME JNZ CTYP CALL COMPNAME JMP CKSWP CTYP CALL COMPTYPE CKSWP CC SWAP POP D POP H POP B DAD B XCHG LDA IPC DCR A STA IPC JNZ SORTILP ;END INNER LOOP LDA OPC DCR A STA OPC JNZ SORTOLP ;END OUTER LOOP RET ; ; COMPNAME ;COMPARE FILES BY NAME:TYPE MVI B,FNLGTH CALL COMPARE RET ; ; COMPTYPE ;COMPARE BY TYPE:NAME PUSH H PUSH D LXI B,NLGTH+1 DAD B XCHG DAD B XCHG MVI B,TLGTH CALL COMPARE POP D POP H RNZ MVI B,NLGTH CALL COMPARE RET ; ; COMPARE ;COMPARE FIELDS (LENGTH B) OF ENTRIES AT HL^ ;AND DE^. SET C AND Z FLAGS (C => DE^ ;FILENAME SMALLER). ;PRESERVE REGS HL AND DE PUSH D PUSH H COMPLP LDAX D CMP M JNZ ENDCOMP INX D INX H DCR B JNZ COMPLP XRA A ENDCOMP POP H POP D RET ; ; SWAP ;SWAP ENTRIES AT HL^ AND DE^ MVI B,ENTLGTH SWAPLP LDAX D MOV C,A MOV A,M MOV M,C STAX D INX H INX D DCR B JNZ SWAPLP RET ; ; I/O ROUTINES ; WRITESTRING ;WRITE STRING TO CONSOLE MVI C,9 JMP ENTRY ; ; READCHAR ;READ CHARACTER FROM CONSOLE MVI C,1 JMP ENTRY ; ; INITBDOS ;INITIALIZE BDOS, LOG IN DISK A MVI C,13 JMP ENTRY ; ; ; WARNING - THESE LOW LEVEL DISK I/O ROUTINES ; ACCESS THE CP/M CBIOS DIRECTLY. THEY MAY ; NEED MODIFICATION WITH NON STANDARD SYSTEMS. ; ; SETTRK ;SET TRACK (C-REG) LHLD CBIOS MVI L,1EH PCHL ; ; SETSEC ;SET SECTOR (C-REG) LHLD CBIOS MVI L,21H PCHL ; ; SETDMA ;SET TRANSFER ADDRESS (BC-REG) LHLD CBIOS MVI L,24H PCHL ; ; READ ;READ A SECTOR LHLD CBIOS MVI L,27H PCHL ; ; WRITE ;WRITE A SECTOR LHLD CBIOS MVI L,2AH PCHL ; ; ; DATA AREA ; DSKMSG DB 'INSERT DISK, TO CONTINUE' DB 0DH,0AH,'$' TERMMSG DB 'FUNCTION COMPLETE' DB 0DH,0AH,'$' OLDSP DS 2 ;SYSTEM STACK POINTER SECTOR DS 1 ;CURRENT SECTOR SEQUENCE NO MODE DS 1 ;SORT MODE FLAG IPC DS 1 ;INNER PASS COUNTER OPC DS 1 ;OUTER PASS COUNTER BUFFPT DS 2 ;BUFFER POINTER DS 20H ;STACK SPACE STACK EQU $ ;GROWS DOWN BUFFER EQU $ ;GROWS UP ; END