0,0 → 1,112 |
fat32_parse_dir: |
; in: eax=directory cluster |
; out: eax=entry cluster |
mov bx, 900h |
mov di, bx |
push eax |
call read_cluster |
mov cx, word [cluster_size] |
shr cx, 5 ; div 20h |
.scan_cluster: |
pop eax |
cmp byte [di], 0 |
jz file_not_found |
mov si, [esp+2] |
push eax |
call fat_compare_name |
jz .file_found |
and di, not 1Fh |
add di, 20h |
loop .scan_cluster |
pop eax |
call next_cluster |
jnc file_not_found |
jc fat32_parse_dir |
.file_found: |
pop eax |
mov si, [esp+2] |
mov [cur_obj], si |
and di, not 1Fh |
mov si, directory_string |
mov ax, [di+14h] |
shl eax, 10h |
mov ax, [di+1Ah] |
test eax, eax |
mov si, nodata_string |
jz find_error_si |
ret 2 |
|
fat_compare_name: |
push cx |
mov cx, 9 |
.scan: |
lodsb |
cmp al, '.' |
jz .ext |
cmp al, 0 |
jz .nameend |
cmp al, 'a' |
jb .notletter |
cmp al, 'z' |
ja .notletter |
or byte [di], 20h |
.notletter: |
scasb |
loopz .scan |
.notfound: |
inc cx ; to clear ZF flag |
pop cx |
ret |
.ext: |
mov al, ' ' |
dec cx |
repz scasb |
jnz .notfound |
test di, 1 |
jnz .notfound |
mov cx, 4 |
jmp .scan |
.nameend: |
mov al, ' ' |
dec cx |
repz scasb |
jnz .notfound |
test di, 1 |
jnz .file_found |
mov cx, 3 |
repz scasb |
jnz .notfound |
.file_found: |
xor cx, cx ; to set ZF flag |
pop cx |
ret |
|
read_cluster: |
; in: eax=cluster,bx->buffer |
and eax, 0FFFFFFFh |
movzx ecx, byte [50Dh] ; sects_per_clust |
mul ecx |
add eax, [data_start] |
; call read |
; ret |
jmp relative_read |
next_cluster: |
mov bx, 700h |
; sector is 200h bytes long, one entry in FAT occupies 4 bytes => 80h entries in sector |
push eax |
shr eax, 7 ; div 80h |
cmp eax, [fat_cur_sector] |
jz @f |
mov [fat_cur_sector], eax |
add eax, [fat_start] |
mov cx, 1 |
call relative_read |
@@: |
pop eax |
and eax, 7Fh |
mov eax, [700h+eax*4] |
and eax, 0FFFFFFFh |
cmp eax, 0FFFFFF7h |
mov si, bad_cluster_string |
jz find_error_si |
ret |