; 
;                       FILE-EXT.ASM
;  
;  Originally  named  FILES.ASM,  and  from a  disassembly  by 
; "J.A.P"  of January 23,1980...FILE-EXT.ASM will display  the 
; selected disk's directory entries in the form:
; 
;          Filename.Typ   exs1s2rc <-----Group----->
;          =========================================
; 
;  The "hack-job" I did on this one was less than  ideal,  but 
; none the less, it get's the job done...the display format is 
; now  alot  cleaner,  and  it  does'nt  "warm  boot"  as  the 
; FILES.ASM version did...
; 
;  The  program will display the disk directory of the  logged 
; on  disk,  including all the Hexadecimal information on  the 
; groups.  If an illegal character is found in the filename or 
; filetype,  it  will  prompt  the operator as to  whether  to 
; delete the file (or not).  If the operator answers Y  (yes), 
; the  program will go on displaying more file information and 
; stopping  when  a bad filename or filetype  is  encountered. 
; When the display is all done,  the files that were  selected 
; for deletion will be removed from the directory.
; 
;  On  the  subject  of  "hack-job's"  of  software,  read  an 
; interesting  article  in  Psychology  Today  magazine,  "The 
; Hacker  Papers;  Computer  Addiction:  Reflection on  a  New 
; Obsession"...August 1980 issue, pages 62-69.
; 
;                               Best regards,
; 
;                               Kelly Smith, CP/M-NET (tm)
;                               805-527-9321 (Modem, 300 Baud)
;                               805-527-0518 (Verbal)
; 

	ORG	0100H

BDOS	EQU	05H
TBUFF	EQU	80H
;
CR	EQU	0DH	;ASCII CARRIAGE RETURN
LF	EQU	0AH	;ASCII LINE FEED
;
;
FILES:			; 
	LXI	H,0	;
	DAD	SP	;
	SHLD	OLDSTK	;
	LXI	SP,NEWSTK	;
	JMP	BEGIN	;
;
;
;	SYSTEM SUBROUTINES
;
;	PRINT STRING FROM D&E REGS.
;
PRINT:	MVI	C,9
	CALL	BDOS
	RET
;
;	TYPE A CHAR FROM (A)
;
TYPE:		; 
	PUSH	B
	PUSH	D
	PUSH	H
	MVI	C,2
	MOV	E,A
	CALL	BDOS	;
	POP	H
	POP	D
	POP	B
	RET
;
;	SEARCH FOR A FILE
;
SEARCH:		; 
	PUSH	B
	PUSH	D
	PUSH	H
	MVI	C,11H
	LXI	D,AFN	;
	CALL	BDOS	;
	STA	RESULT	;
	POP	H
	POP	D
	POP	B
	RET
;
;	AMBIGUOUS FILENAME.TYP
;
AFN:		; 
	DB	'?????????????'
RESULT:		; 
	DB	0	;STORAGE FOR RESULT OF BDOS CALL
;
;	FIND NEXT OCCURRENCE OF FILE
;
NEXTFILE:		; 
	PUSH	B
	PUSH	D
	PUSH	H
	MVI	C,12H
	LXI	D,AFN	;
	CALL	BDOS	;
	STA	RESULT	;
	POP	H
	POP	D
	POP	B
	RET
;
;	DELETE A FILE
;
DELETE:		; 
	PUSH	B
	PUSH	D
	PUSH	H
	MVI	C,13H
	CALL	BDOS	;
	POP	H
	POP	D
	POP	B
	RET
;
;	GET INPUT FROM CONSOLE
;
CONIN:		; 
	PUSH	B
	PUSH	D
	PUSH	H
	MVI	C,1
	CALL	BDOS	;
	POP	H
	POP	D
	POP	B
	RET
;
;	CONVERT A BYTE IN (A) TO TWO PRINTED CHARACTERS
;
HEXASC:		; 
	CPI	0AH
	JC	HEXA2	;
	ADI	'7'	;
	CALL	TYPE	;
	RET
HEXA2:		; 
	ADI	'0'	;
	CALL	TYPE	;
	RET
HEXCON:		; 
	PUSH	PSW
	RAR
	RAR
	RAR
	RAR
	ANI	0FH
	CALL	HEXASC	;
	POP	PSW
	ANI	0FH
	CALL	HEXASC	;
	RET
;
;	NEWLINE
;
CRLF:		; 
	MVI	A,CR
	CALL	TYPE	;
	MVI	A,LF
	CALL	TYPE	;
	RET
;
;	PRINT A SPACE
;
SPACE:		; 
	MVI	A,' '	;
	CALL	TYPE	;
	RET
;
;	MAIN WORK LOOP
;
;	THIS ROUTINE FINDS THE POSITION OF THE FILE
;	INFORMATION IN THE DIRECTORY DMA, PRINTS THE
;	DATA IF IT IS A CURRENT FILE, AND PROMPTS THE
;	OPERATOR FOR INSTRUCTIONS IF THE FILENAME HAS
;	ILLEGAL (NON-ASCII) DATA IN IT.
;
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 AT THE FILE INFO
	MOV	A,M
	CPI	0E5H	;KILLED FILE?
	RZ		;YES
	MOV	A,M
	STA	ENTBYT	;
	PUSH	H
	PUSH	H
	MVI	B,8
	INX	H
WORK02:	MOV	A,M	;PRINT FILE NAME
	CALL	ILLCHK	;
	CALL	TYPE	;
	DCR	B
	INX	H
	JNZ	WORK02	;
	MVI	B,3
	MVI	A,'.'
	CALL	TYPE	;PRINT NEXT THREE CHARACTERS AS ASCII
WORK03:	MOV	A,M
	CALL	ILLCHK	;
	CALL	TYPE	;
	DCR	B
	INX	H
	JNZ	WORK03	;
	CALL	TYPE
	CALL	SPACE
	MVI	B,3
	POP	H	;NOW DISPLAY ATTRIBUTES
	LXI	D,9
	DAD	D
WORK03A:CALL	SPACE
	MOV	A,M
	RLC		;TEST $SYS AND $R/O, AND RESERVED
	MVI	A,'1'
	JC	WORK03B
	MVI	A,'0'
WORK03B:CALL	TYPE
	CALL	SPACE
	DCR	B
	INX	H
	JNZ	WORK03A
	MVI	B,20
WORK04:	MOV	A,B
	ANI	3
	CZ	SPACE	;
	MOV	A,M
	CALL	HEXCON	;
	INX	H
	DCR	B
	JNZ	WORK04	;
	CALL	CRLF	;
	POP	H
	LDA	ENTBYT	;
	ORA	A
	RZ
	PUSH	H
	LXI	H,DELMSG	;
WORK06:		; 
	MOV	A,M
	ORA	A
	JZ	WORK08	;
	CALL	TYPE	;
	INX	H
	JMP	WORK06	;
DELMSG:		; 
	DB	'Delete this file ? ',0
WORK08:		; 
	CALL	CONIN	;
	POP	H
	ANI	5FH
	CPI	'Y'	;
	PUSH	PSW
	CALL	CRLF	;KEEP IT NEAT
	POP	PSW
	RNZ
	XCHG
	LHLD	DELPTR	;
	MVI	B,10H
WORK10:		; 
	LDAX	D
	MOV	M,A
	INX	H
	INX	D
	DCR	B
	JNZ	WORK10	;
	SHLD	DELPTR	;
	RET
;
;	CHECK FOR NONASCII CHARACTER  <20H  OR  >60H
;
ILLCHK:	PUSH	PSW
	ANI	07FH	;MASK FOR PROPRIETARY", "$SYS", "$R/W"
	CPI	' '	;
	JC	ILLEGL	;
	CPI	61H
	JNC	ILLEGL	;
	POP	PSW
	RET
ILLEGL:	POP	PSW
	PUSH	PSW
	MVI	A,0FFH
	STA	ENTBYT	;
	POP	PSW
	RET
;
;
;
MSG:	DB	'Filename.Typ R/OSysRes exs1s2rc'
	DB	' <--------------Group-------------->'
	DB	CR,LF
	DB	'==============================='
	DB	'===================================='
	DB	CR,LF,'$'
;
;
;
; ERROR MESSAGES
;
ERROR1:	LXI	D,ERMSG1;SAY NO GO, AND BAIL OUT
	CALL	PRINT
	JMP	QUIT

;
ERMSG1:	DB	CR,LF,'Disk select should be " N:"$'

;
ERROR2:	LXI	D,ERMSG2;SAY NO GO, AND BAIL OUT
	CALL	PRINT
	JMP	QUIT

ERMSG2:	DB	CR,LF,'Bad delimeter, should be ":"$'

;
ERROR3:	LXI	D,ERMSG3;SAY NO GO, AND BAIL OUT
	CALL	PRINT
	JMP	QUIT

ERMSG3:	DB	CR,LF,'No drive specified$'

;
ERROR4:	LXI	D,ERMSG4;SAY NO GO, AND BAIL OUT
	CALL	PRINT
	JMP	QUIT

ERMSG4:	DB	CR,LF,'Only drives A to D allowed$'

;

;	PROGRAM BEGINS HERE
;
BEGIN:
;
; CHECK FOR DRIVE SPECIFICATION
;
	LDA	TBUFF	;GET LENGTH OF COMMAND PARAMETERS
	CPI	2	; IF <2, NO PARAMETERS
	JC	MAIN01	; MUST BE PRESENT LOGGED-IN DRIVE
	JZ	ERROR1	;EXACTLY 2, IS ERROR
	LHLD	TBUFF+2	;AT LEAST 3 THEN...
	MOV	A,H	;NEXT CHARACTER SHOULD BE ":"
	CPI	':'
	JNZ	ERROR2	;ONLY ALLOW DRIVE SET
	MOV	A,L	;NEXT CHARACTER SHOULD BE DRIVE
	CPI	'A'	;AT A MINIMUM, "A"
	JC	ERROR3
	CPI	'E'	;AT A MAXIMUM "D"
	JNC	ERROR4
	ANI	7	;STRIP BITS, FOR 0 TO 3
	DCR	A	;BACK OFF FOR 0 TO 3
	MOV	E,A	;MAKE DISK NUMBER
	MVI	D,0
	MVI	C,14	;BDOS SELECT DISK FUNCTION
	CALL	BDOS

MAIN01:	LXI	D,MSG
	CALL	PRINT
		; 
	LXI	H,DELFIL	;
	SHLD	DELPTR	;
	CALL	SEARCH	;
MAIN02:		; 
	LDA	RESULT	;
	CPI	0FFH
	JZ	MAIN04	;
	CALL	WORKLOOP	;
	CALL	NEXTFILE	;
	JMP	MAIN02	;
MAIN04:		; 
	LHLD	DELPTR	;
	LXI	D,DELFIL
	MOV	A,L
	CMP	E
	JNZ	MAIN06	;
	MOV	A,H
	CMP	D
	JZ	QUIT	;
MAIN06:		; 
	LXI	D,-10H
	DAD	D
	SHLD	DELPTR	;
	XCHG
	CALL	DELETE	;
	JMP	MAIN04	;
QUIT:		; 
	LHLD	OLDSTK	;
	SPHL
	RET		;
;
;	SOME STORAGE LOCATIONS
;
OLDSTK:	DS	2	;STORAGE FOR "OLD" STACK POINTER
	DS	32
NEWSTK	EQU	$	;STORAGE FOR "NEW" STACK
ENTBYT:	DS	1	;
DELPTR:	DS	16	;
DELFIL	EQU	$	;FILE OF DELETEABLE FILE BUILDS HERE
;
;
	END
