home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol074
/
sortdir.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
5KB
|
339 lines
; 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 ;<CR> ?
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, <CR> 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