113 lines
1.8 KiB
PHP
113 lines
1.8 KiB
PHP
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
|