;***********************************************
CODESEG	SEGMENT	BYTE PUBLIC 'CODE'
	ASSUME	CS:CODESEG,DS:CODESEG,ES:CODESEG
;
;----------------------------------------------
INDXKEY	PROC	FAR
	ORG	100H
START:	JMP	ENTER
ASCIIZ	DB	80 DUP (0)
FILE_BUFF DB	150 DUP (?)
CURR_DRIVE DB   ?
CURR_DIR  DB    '\',63 DUP (?)
PATH_FLAG DB	0
DRIVE_FLAG DB   0
COUNTER    DB   1
BYTES_READ DW	?
DEFAULT DB      '*.NDX',0
DTA	DB	30 DUP (?)
FILENAME DB	13 DUP (?)
BAD_DOS DB	'INCORRECT DOS VERSION - MUST BE 2.0 OR GREATER'
	DB	0DH,0AH,'$'
ERRMSG1 DB	'FILE NOT FOUND',0DH,0AH,'$'
ERRMSG2 DB	'ACCESS DENIED',0DH,0AH,'$'
ERRMSG3	DB	'READ ACCESS TO REQUESTED FILE NOT PERMITTED'
	DB	0DH,0AH,'$'
ERRMSG4 DB	'INVALID FILE HANDLE',0DH,0AH,'$'
ERRMSG5 DB	'PATH NOT FOUND',0DH,0AH,'$'
ERRMSG6 DB	'TOO MANY FILES ARE OPEN',0DH,0AH,'$'
FILEMSG DB	'ENTER FILENAME (<RETURN> FOR *.NDX):  ','$'
CONT_MSG DB	0DH,0AH,'PRESS ANY KEY TO CONTINUE...$'
;
ENTER:	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	PUSH	DI
	MOV	AX,CS
	MOV	DS,AX
	MOV	ES,AX
	XOR	AX,AX
	CLC
	CALL	CHECK_DOS
	JNC	DOS_OK
	MOV	DX,OFFSET BAD_DOS
	CALL	PRINTMESS
	JMP	EXIT
DOS_OK:
	CALL	SET_DTA
	CALL	GET_DRIVE
	MOV	CURR_DRIVE,AL
	MOV	SI,80H
MOVE_FILENAME:
	MOV	DI,OFFSET ASCIIZ
	XOR	CX,CX
	MOV	CL,[SI]
	CMP	CL,0
	JNZ	YES_FILE
	MOV	DX,OFFSET FILEMSG
	CALL	PRINTMESS
	MOV	DX,7FH
	MOV	BYTE PTR [SI-1],80
	MOV	AH,0AH
	INT	21H
	CALL	CRLF
	INC	DX
	MOV	BX,DX
 	CMP	BYTE PTR [BX],0
	JNE	NAMENTRD
	MOV	CX,6
	MOV	SI,OFFSET DEFAULT
REP	MOVSB
	JMP	PROCESS_FILE
NAMENTRD:
	XOR	CX,CX
	MOV	CL,[BX]
	INC	SI
	PUSH	DI
	MOV	DI,OFFSET ASCIIZ
	PUSH	CX
REP	MOVSB
	POP	CX
	POP	DI
	PUSH	DI
	MOV	DI,BX
	INC	DI
	CLD
	CLC
	CALL	IS_PATH
	POP	DI
	JNC	MOVE_NAME
	CALL	GET_DIR
	OR 	PATH_FLAG,0FFH
MOVE_NAME:
	MOV	BX,DX
	ADD	DL,[BX]
	ADC	DH,0
	INC	DX
	MOV	BX,DX
	MOV	BYTE PTR [BX],0
	JMP	PROCESS_FILE
YES_FILE:
	DEC	CL
	ADD	SI,2
	CLD
	CLC
	PUSH	DI
	MOV	DI,SI
	CALL	IS_PATH
	POP	DI
	JNC	DO_MOVE
	OR 	PATH_FLAG,0FFH
DO_MOVE:
REP     MOVSB
	MOV	BYTE PTR [DI],0
PROCESS_FILE:
	PUSH	SI
	MOV	SI,OFFSET ASCIIZ + 1
	CMP 	BYTE PTR [SI],':'
	JNE	CHEK_PATH
	DEC	SI
	MOV	DL,[SI]
	AND	DL,0DFH
	SUB	DL,'A'
	CALL	SET_DRIVE
	OR	DRIVE_FLAG,0FFH
	POP	SI
CHEK_PATH:
	TEST	PATH_FLAG,0FFH
	JZ	GO_AHEAD
	CALL	GET_DIR
	PUSH	DI
	MOV	DI,80H
	XOR	CX,CX
	MOV	CL,[DI]
	ADD	DI,[DI]
	AND	DI,0FFH
	STD
	MOV	AL,'\'
REPNE	SCASB
	INC	DI
	MOV	BYTE PTR [DI],0
	CLD
	POP	DI
GO_AHEAD:
	CLC
	MOV	AL,0
	CALL	FIND_FILE
	JNC	FILE_FOUND
	JMP	EXIT
FILE_FOUND:
	MOV	DX,81H
	MOV	SI,DX
	CMP	BYTE PTR [SI],' '
	JNE	CHANGE_IT
	INC	DX
CHANGE_IT:
	CALL	CHANGE_DIR
OPEN_IT:
	MOV	AL,0
	CALL	OPEN_FILE
	JC	EXIT
	MOV	BX,AX
	PUSH	BX
	CLC
	CALL	READ_FILE
	POP	BX
	JC	EXIT
	CLC
	CALL	CLOSE_FILE
	JC	EXIT
	CALL	CRLF
	MOV	BX,OFFSET ASCIIZ
	MOV	DI,OFFSET ASCIIZ
	MOV	CX,SIZE ASCIIZ
	MOV	AL,'*'
REPNE	SCASB
	JCXZ	FILE_DISP_LOOP
	MOV	BX,OFFSET FILENAME
FILE_DISP_LOOP:
	MOV	DL,BYTE PTR [BX]
	MOV	AH,2
	INT	21H
	INC	BX
	CMP	BYTE PTR [BX],00H
	JNZ	FILE_DISP_LOOP
;
	CALL	CRLF
	MOV	DL,9
	MOV	AH,2
	INT	21H
	MOV	SI,OFFSET FILE_BUFF+10
	CMP	BYTE PTR [SI],'!'
	JGE	PRINTKEY
	MOV	SI,OFFSET FILE_BUFF+24
PRINTKEY:
	MOV	DL,[SI]
	CMP	DL,20H
	JL     	NEXT_FILE
	MOV	AH,2
	INT	21H
	INC	SI
	JMP	SHORT PRINTKEY
NEXT_FILE:
	CALL	CRLF
	INC	COUNTER
	CMP	COUNTER,7
	JLE	CONTINUE
	MOV	COUNTER,1
	MOV	DX,OFFSET CONT_MSG
	MOV	AH,9
	INT	21H
	MOV	AH,8
	INT	21H
CONTINUE:
	CALL	FIND_NEXT
	JC	EXIT
	JMP	FILE_FOUND
EXIT:	TEST	PATH_FLAG,0FFH
	JZ	TEST_DRIVE
	MOV	DX,OFFSET CURR_DIR
	CALL	CHANGE_DIR
TEST_DRIVE:
	TEST	DRIVE_FLAG,0FFH
	JZ	EXIT2
	MOV	DL,CURR_DRIVE
	CALL	SET_DRIVE
EXIT2:	POP	DI
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	CALL	CRLF
	INT	20H
INDXKEY	ENDP
;-------------------------------------------
SET_DTA PROC	NEAR
	PUSH	AX
	PUSH	DX
	MOV	DX,OFFSET DTA
	MOV	AH,1AH
	INT	21H
	POP	DX
	POP	AX
	RET
SET_DTA ENDP
;-------------------------------------------
CHECK_DOS PROC	NEAR
	PUSH	AX
	MOV	AH,30H
	INT	21H
	CMP	AL,2
	POP	AX
	RET
CHECK_DOS ENDP
;--------------------------------------------
FIND_FILE PROC	NEAR
	PUSH	AX
	PUSH	CX
	PUSH	DX
	MOV	AH,4EH
	XOR	CX,CX
	MOV	DX,OFFSET ASCIIZ
	INT	21H
	JNC	END_FIND
	CMP	AL,12H
	JNZ	CHECK_PATH2
	MOV	DX,OFFSET ERRMSG1
	CALL	PRINTMESS
	STC
	JMP	END_FIND
CHECK_PATH2:
	CMP	AL,3
	JNZ	CHECK_FILES2
	MOV	DX,OFFSET ERRMSG5
	CALL	PRINTMESS
	STC
	JMP	END_FIND
CHECK_FILES2:
	CMP	AL,4
	JNZ	ACCESS_ERR2
	MOV	DX,OFFSET ERRMSG6
	CALL	PRINTMESS
	STC
	JMP	END_FIND
ACCESS_ERR2:
	CMP	AL,5
	JNZ	BAD_CODE2
	MOV	DX,OFFSET ERRMSG2
	CALL	PRINTMESS
	STC
	JMP	END_FIND
BAD_CODE2:
	MOV	DX,OFFSET ERRMSG3
	CALL	PRINTMESS
	STC
END_FIND:
	POP	DX
	POP	CX
	POP	AX
	RET
FIND_FILE ENDP
;--------------------------------------------
OPEN_FILE PROC	NEAR
	PUSH	DX
	MOV	AH,3DH
	MOV	DX,OFFSET FILENAME
	INT	21H
	JNC	LEAVE
	CMP	AL,2
	JNZ	CHECK_PATH
	MOV	DX,OFFSET ERRMSG1
	CALL	PRINTMESS
	STC
	JMP	LEAVE
CHECK_PATH:
	CMP	AL,3
	JNZ	CHECK_FILES
	MOV	DX,OFFSET ERRMSG5
	CALL	PRINTMESS
	STC
	JMP	LEAVE
CHECK_FILES:
	CMP	AL,4
	JNZ	ACCESS_ERR
	MOV	DX,OFFSET ERRMSG6
	CALL	PRINTMESS
	STC
	JMP	LEAVE
ACCESS_ERR:
	CMP	AL,5
	JNZ	BAD_CODE
	MOV	DX,OFFSET ERRMSG2
	CALL	PRINTMESS
	STC
	JMP	LEAVE
BAD_CODE:
	MOV	DX,OFFSET ERRMSG3
	CALL	PRINTMESS
	STC
LEAVE:	POP	DX
	RET
OPEN_FILE ENDP
;-----------------------------------------
READ_FILE PROC	NEAR
	PUSH	AX
	PUSH	CX
	PUSH	DX
	MOV	CX,SIZE FILE_BUFF
	MOV	DX,OFFSET FILE_BUFF
	MOV	AH,3FH
	INT	21H
	JNC	GOOD_READ
	CMP	AL,5
	JNZ	BAD_HANDLE
	MOV	DX,OFFSET ERRMSG3
	CALL	PRINTMESS
	STC
	JMP	LEAVE_READ
BAD_HANDLE:
	MOV	DX,OFFSET ERRMSG4
	CALL	PRINTMESS
	STC
	JMP	LEAVE_READ
GOOD_READ:
	MOV	BYTES_READ,AX
LEAVE_READ:
	POP	DX
	POP	CX
	POP	AX
	RET
READ_FILE ENDP
;-------------------------------------------
CLOSE_FILE PROC	NEAR
	PUSH	AX
	PUSH	DX
	MOV	AH,3EH
	INT	21H
	JNC	LEAVE_CLOSE
	MOV	DX,OFFSET ERRMSG4
	CALL	PRINTMESS
	STC
LEAVE_CLOSE:
	POP	DX
	POP	AX
	RET
CLOSE_FILE ENDP
;-------------------------------------------
FIND_NEXT PROC	NEAR
	PUSH	AX
	PUSH	DX
	MOV	DX,OFFSET DTA
	MOV	AH,4FH
	INT	21H
	POP	DX
	POP	AX
	RET
FIND_NEXT ENDP
;-------------------------------------------
PRINTMESS PROC NEAR
	PUSH	AX
	MOV	AH,9
	INT	21H
	POP	AX
	RET
PRINTMESS ENDP
;------------------------------------------
CRLF	PROC	NEAR
	PUSH	AX
	PUSH	DX
	MOV	DL,0DH
	MOV	AH,2
	INT	21H
	MOV	DL,0AH
	MOV	AH,2
	INT	21H
	POP	DX
	POP	AX
	RET
CRLF	ENDP
;------------------------------------------
CURSREAD PROC	NEAR
	PUSH	AX
	PUSH	BX
	MOV	AH,3
	MOV	BH,0
	INT	10H
	POP	BX
	POP	AX
	RET
CURSREAD ENDP
;------------------------------------------
IS_PATH PROC	NEAR
	PUSH	AX
	PUSH	CX
	PUSH	DI
	MOV	AL,'\'
REPNE   SCASB
	JCXZ	LEAVE_IS_PATH
	STC
LEAVE_IS_PATH:
	POP	DI
	POP	CX
	POP	AX
	RET
IS_PATH ENDP
;-------------------------------------------
GET_DRIVE PROC	NEAR
	MOV	AH,19H
	INT	21H
	RET
GET_DRIVE ENDP
;-------------------------------------------
GET_DIR	PROC	NEAR
	PUSH	AX
	PUSH	SI
	PUSH	DX
	MOV	AH,47H
	MOV	SI,OFFSET CURR_DIR+1
	MOV	DL,0
	INT	21H
	POP	DX
	POP	SI
	POP	AX
	RET
GET_DIR ENDP 
;-------------------------------------------
SET_DRIVE PROC	NEAR
	MOV	AH,0EH
	INT	21H
	RET
SET_DRIVE ENDP
;-------------------------------------------
CHANGE_DIR PROC	NEAR
	PUSH	AX
	MOV	AH,3BH
	INT	21H
	POP	AX
	RET
CHANGE_DIR ENDP
;-------------------------------------------
CODESEG	ENDS
;********************************************
	END	START
