home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol004
/
dirfix.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
4KB
|
240 lines
;
; 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