You are on page 1of 6

;FAT

MESSAGE MACRO MSG MOV AH, 09H LEA DX, MSG INT 21H ENDM PUTCH MACRO C MOV DL, C MOV AH, 02H INT 21H ENDM GETCH MACRO MOV AH,01H INT 21H ENDM EXITDOS MACRO MOV AH,4CH INT 21H ENDM READSECTS MACRO D, N, S, BUFF MOV AL, D ; DRIVE NUMBER MOV CX, N ; NO.OF SECTORS TO READ MOV DX, S ; START SECTOR NUMBER LEA BX, BUFF ; SEG:OFFSET OF BUFFER INT 25H ENDM .MODEL SMALL .STACK 200H .DATA M1 DB 13,10,'ENTER FILENAME!!!','$' M2 DB 13,10,'ENTER EXTENSION!!!','$' MSG1 DB 13,10,'FAT READ FAILED!!!','$' MSG2 DB 13,10,'ROOT READ FAILED!!!','$' MSG5 DB 13,10,'FILE NOT FOUND!!!','$' MSG6 DB 13,10,'FILE FOUND!!!','$' MSG7 DB 13,10,'CLUSTER NO:','$' MSG8 DB 13,10,'PROGRAM TERMINATES...','$' FAT DB 9*512 DUP(0) ROOT DB 14*512 DUP(0) FBUFF DB 512 DUP(0) FNAME DB 8 DUP(20H)

EXT DB 3 DUP(20H) TFNAME DB 8 DUP(20H) TEXT DB 3 DUP(20H) CLUSTNO DW ? SECNO DW ? OFF_SET DW ? RESULT DW ? NO1 DB ? CNT DW 224 .CODE START: MOV AX, @DATA MOV DS, AX MOV ES, AX ;READ FAT READSECTS 0, 9, 1, FAT JNC READROOT MESSAGE MSG1 EXITDOS READROOT: ;READ ROOT DIRECTORY READSECTS 0, 14, 19, ROOT JNC READFILENAME MESSAGE MSG2 EXITDOS READFILENAME: ;GET THE FILE NAME MESSAGE M1 LEA SI,FNAME MOV CX,12 CALL ACCEPT ;GET THE EXTENSION OF FILE MESSAGE M2 LEA SI,EXT MOV CX,12 CALL ACCEPT ;GET THE ADDRESS OF ROOT INTO REGISTORS LEA BX, ROOT LEA SI, ROOT BACK2: ;IF ROOT DIRECTORY ENTRY IS EMPTY MOV AH,[BX] CMP AH,0

JNE SEARCH MESSAGE MSG5 EXITDOS SEARCH: ;MOVE THE FILENAME WITH ENTRY LEA DI, TFNAME CLD MOV CX, 8 REP MOVSB ;MOVE THE EXTENTION WITH ENTRY LEA DI, TEXT CLD MOV CX, 3 REP MOVSB ;COMPARE THE ENTRY WITH USER GIVEN FILE_NAME PUSH SI LEA SI, FNAME LEA DI, TFNAME MOV CX, 8 CLD REPE CMPSB JE FILEFOUND L1: ;IF NOT FOUND GO TO NEXT ENTRY POP SI ADD SI, 21 ADD BX, 32 JMP BACK2 ;IF STILL NOT FOUND THEN EXIT MESSAGE MSG5 EXITDOS FILEFOUND: ;COMPARE THE EXTENSION LEA SI, EXT LEA DI, TEXT MOV CX, 3 CLD REPE CMPSB JE EXTFOUND JMP L1;IF NOT FOUND FIND NEXT EXTFOUND: ;FILE FOUND NOW GO TO STARTING CLUSTER

MESSAGE MSG6 ADD BX, 26 MOV AX, WORD PTR [BX] MOV CLUSTNO, AX ; ************** GETNEXT: MESSAGE MSG7 CALL DISPCLUST GETCH ;GO TO NEXT CLUSTER MOV AX, CLUSTNO ADD AX, 31 MOV SECNO, AX READSECTS 0, 1, SECNO, FBUFF CALL DISPFILE CALL MUL3DIV2 MOV BX, OFF_SET MOV AX, WORD PTR FAT[BX] MOV RESULT, AX CALL EVENODD JNZ ODD1 MOV AX, RESULT AND AX, 0FFFH MOV CLUSTNO, AX JMP NEXTCLUST ODD1: MOV AX, RESULT SHR AX, 1 SHR AX,1 SHR AX,1 SHR AX,1 MOV CLUSTNO, AX NEXTCLUST: CMP AX, 0FFFH JE EXIT JMP GETNEXT EXIT: MESSAGE MSG8 EXITDOS

EVENODD

EVENODD

PROC NEAR MOV AX, CLUSTNO TEST AX, 1 RET ENDP

MUL3DIV2 PROC NEAR MOV AX, CLUSTNO MOV CX, AX SHR AX, 1 ADD AX, CX MOV OFF_SET, AX RET MUL3DIV2 ENDP

DISPFILE PROC NEAR LEA SI, FBUFF MOV CX, 512 PUTCH [SI] INC SI LOOP BACK1 RET ENDP

BACK1:

DISPFILE

ACCEPT PROC NEAR BACK: GETCH CMP AL,0DH JE LOOP1 CMP AL,61H ;COMPARE IF FILENAME IS IN LOWER JB GO ;CASE AND IF YES THEN CHANGE TO SUB AL,20H ;UPPER CASE

GO:

MOV [SI],AL INC SI LOOP BACK LOOP1: RET ENDP

ACCEPT

DISPCLUST PROC NEAR MOV AX, CLUSTNO MOV NO1, AH CALL DISP MOV AX, CLUSTNO MOV NO1, AL

CALL DISP RET DISPCLUST ENDP

DISP PROC NEAR MOV AH, NO1 AND AH, 0F0H ROR AH, 1 ROR AH,1 ROR AH,1 ROR AH,1 CMP AH, 9 JG NXT1 ADD AH, 48 PUTCH AH JMP NXT2

NXT1: ADD AH, 55 PUTCH AH NXT2: MOV AH, NO1 AND AH, 0FH CMP AH, 9 JG NXT3 ADD AH, 48 PUTCH AH JMP NXT4 NXT3: ADD AH, 55 PUTCH AH NXT4: RET DISP END START ENDP

You might also like