forked from KolibriOS/kolibrios
Deleted obsolete sysfunction 58.1
git-svn-id: svn://kolibrios.org@495 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
ba74e7f00f
commit
a469f3f7e8
@ -43,33 +43,6 @@ reserve_flp:
|
||||
sti
|
||||
ret
|
||||
|
||||
floppy_free_space:
|
||||
;---------------------------------------------
|
||||
;
|
||||
; returns free space in edi
|
||||
;
|
||||
;---------------------------------------------
|
||||
push eax ebx ecx
|
||||
call read_flp_fat
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_2
|
||||
mov eax,0x282004
|
||||
xor edi,edi
|
||||
mov ecx,2847 ;1448000/512
|
||||
rdfs1_1:
|
||||
mov ebx,[eax]
|
||||
and ebx,4095
|
||||
jne rdfs2_1
|
||||
add edi,512
|
||||
rdfs2_1:
|
||||
add eax,2
|
||||
loop rdfs1_1
|
||||
fdc_status_error_2:
|
||||
pop ecx ebx eax
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
floppy_fileread:
|
||||
;----------------------------------------------------------------
|
||||
@ -506,321 +479,6 @@ restorefatchain_flp: ; restore fat chain
|
||||
ret
|
||||
|
||||
|
||||
floppy_filedelete:
|
||||
;--------------------------------------------
|
||||
;
|
||||
; filedelete - sys floppy
|
||||
; in:
|
||||
; eax - filename 11 chars - for root directory
|
||||
; edi pointer to path /fd/1/...... - for all files in nested directories
|
||||
;
|
||||
; out:
|
||||
; eax - 0 = successful, 1 = file not found, 10 = access denied
|
||||
;
|
||||
;--------------------------------------------
|
||||
mov [path_pointer_flp],edi
|
||||
mov [save_flag],0
|
||||
mov ebp,1 ; file not found as default
|
||||
filedelete_newtry_1:
|
||||
sub esp,32
|
||||
call expand_filename
|
||||
push eax ebx ecx edx esi edi
|
||||
call read_flp_fat
|
||||
cmp [FDC_Status],0
|
||||
jne frnoreadd_1
|
||||
mov [FDD_Track],0 ; Öèëèíäð
|
||||
mov [FDD_Head],1 ; Ñòîðîíà
|
||||
mov [FDD_Sector],2 ; Ñåêòîð
|
||||
call SeekTrack
|
||||
mov dh,14
|
||||
l.20_2:
|
||||
call ReadSectWithRetr
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_4
|
||||
mov dl,16
|
||||
mov edi,FDD_BUFF
|
||||
inc [FDD_Sector]
|
||||
l.21_2:
|
||||
mov esi,eax ;Name of file we want
|
||||
mov ecx,11
|
||||
cld
|
||||
rep cmpsb ;Found the file?
|
||||
je fifoundd_1 ;Yes
|
||||
add ecx,21
|
||||
add edi, ecx ;Advance to next entry
|
||||
dec dl
|
||||
jne l.21_2
|
||||
dec dh
|
||||
jne l.20_2
|
||||
jmp frnoreadd_1
|
||||
|
||||
fdc_status_error_4:
|
||||
pop edi esi edx ecx ebx eax
|
||||
add esp,32
|
||||
jmp fdc_status_error_1
|
||||
|
||||
fifoundd_1:
|
||||
mov eax,[path_pointer_flp]
|
||||
cmp [eax+36],byte 0
|
||||
je fifoundd_2
|
||||
movzx eax, word [edi+0xf]
|
||||
mov ebx,[path_pointer_flp]
|
||||
add ebx,36
|
||||
call get_cluster_of_a_path_flp
|
||||
jc frnoreadd_1_1
|
||||
mov edi,ebx
|
||||
add edi,11
|
||||
jmp fifoundd_2_1
|
||||
fifoundd_2:
|
||||
dec [FDD_Sector]
|
||||
fifoundd_2_1:
|
||||
mov [edi-11],byte 0xE5 ;mark filename deleted
|
||||
movzx edi, word [edi+0xf] ;edi = cluster
|
||||
frnewd_1:
|
||||
shl edi,1 ;find next cluster from FAT
|
||||
add edi,FLOPPY_FAT
|
||||
mov eax,[edi]
|
||||
mov [edi],word 0x0 ;clear fat chain cluster
|
||||
and eax,4095
|
||||
mov edi,eax
|
||||
cmp edi,dword 4095 ;last cluster ?
|
||||
jz frnoreadd2_1
|
||||
jmp frnewd_1
|
||||
|
||||
frnoreadd2_1:
|
||||
call WriteSectWithRetr
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_4
|
||||
call save_flp_fat
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_4
|
||||
; pop edi esi edx ecx ebx eax
|
||||
; add esp,32
|
||||
mov ebp,0 ; file found
|
||||
; jmp filedelete_newtry_1
|
||||
jmp frnoreadd_1
|
||||
|
||||
frnoreadd_1_1:
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_4
|
||||
frnoreadd_1:
|
||||
pop edi esi edx ecx ebx eax
|
||||
add esp,32
|
||||
mov eax,ebp
|
||||
ret
|
||||
|
||||
floppy_filesave:
|
||||
;----------------------------------------------------------
|
||||
;
|
||||
; filesave - sys floppy
|
||||
;
|
||||
; eax ; pointer to file name 11 chars - for root directory
|
||||
; ebx ; buffer
|
||||
; ecx ; count to write in bytes
|
||||
; edx ; 0 create new , 1 append
|
||||
; edi pointer to path /fd/1/...... - for all files in nested directories
|
||||
;
|
||||
; output : eax = 0 - ok
|
||||
; 5 - file not found / directory not found
|
||||
; 8 - disk full
|
||||
; 10 - access denied
|
||||
;-----------------------------------------------------------
|
||||
mov [path_pointer_flp],edi
|
||||
sub esp,32
|
||||
call expand_filename
|
||||
cmp edx,0
|
||||
jnz fsdel_1
|
||||
pusha
|
||||
call floppy_filedelete
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_6
|
||||
popa
|
||||
mov [save_flag],1
|
||||
fsdel_1:
|
||||
call floppy_free_space
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_6
|
||||
cmp ecx,edi
|
||||
jb rd_do_save_1
|
||||
add esp,32
|
||||
mov eax,8 ; not enough free space
|
||||
mov [flp_status],0
|
||||
ret
|
||||
|
||||
fdc_status_error_6:
|
||||
popa
|
||||
add esp,32
|
||||
jmp fdc_status_error_1
|
||||
|
||||
rd_do_save_1:
|
||||
push eax ebx ecx edx esi edi
|
||||
call read_flp_fat
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_7
|
||||
push eax
|
||||
mov eax,[path_pointer_flp]
|
||||
cmp [eax+36],byte 0
|
||||
jne fifoundds_2
|
||||
pop eax
|
||||
mov [save_root_flag],1
|
||||
call read_flp_root
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_7
|
||||
mov edi,FLOPPY_BUFF ;Point at directory
|
||||
mov edx,224 +1
|
||||
; find an empty spot for filename in the root dir
|
||||
l20ds_1:
|
||||
sub edx,1
|
||||
jz frnoreadds_1
|
||||
l21ds_1:
|
||||
cmp [edi],byte 0xE5
|
||||
jz fifoundds_1
|
||||
cmp [edi],byte 0x0
|
||||
jz fifoundds_1
|
||||
add edi,32 ; Advance to next entry
|
||||
jmp l20ds_1
|
||||
|
||||
fifoundds_2:
|
||||
pop eax
|
||||
mov [save_root_flag],0
|
||||
mov [FDD_Track],0 ; Öèëèíäð
|
||||
mov [FDD_Head],1 ; Ñòîðîíà
|
||||
mov [FDD_Sector],2 ; Ñåêòîð
|
||||
call SeekTrack
|
||||
mov dh,14
|
||||
l.20_3:
|
||||
call ReadSectWithRetr
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_7
|
||||
mov dl,16
|
||||
mov edi,FDD_BUFF
|
||||
inc [FDD_Sector]
|
||||
l.21_3:
|
||||
mov esi,eax ;Name of file we want
|
||||
mov ecx,11
|
||||
cld
|
||||
rep cmpsb ;Found the file?
|
||||
je fifoundds_3 ;Yes
|
||||
add ecx,21
|
||||
add edi, ecx ;Advance to next entry
|
||||
dec dl
|
||||
jne l.21_3
|
||||
dec dh
|
||||
jne l.20_3
|
||||
fdc_status_error_8:
|
||||
pop edi esi edx ecx ebx eax
|
||||
mov eax,5 ; file not found ?
|
||||
mov ebx,-1
|
||||
add esp,32
|
||||
mov [flp_status],0
|
||||
ret
|
||||
|
||||
fifoundds_3:
|
||||
add edi,0xf
|
||||
mov eax,[edi]
|
||||
and eax,65535
|
||||
mov ebx,[path_pointer_flp]
|
||||
add ebx,36
|
||||
call get_cluster_of_a_path_flp
|
||||
jc fdc_status_error_7_1
|
||||
found_directory_for_writing_flp:
|
||||
call analyze_directory_to_write_flp
|
||||
jc fdc_status_error_7_1
|
||||
mov edi,ebx
|
||||
fifoundds_1:
|
||||
push edi ; move the filename to root dir
|
||||
mov esi,[esp+4+20]
|
||||
cmp [save_root_flag],0
|
||||
jne fifoundds_4
|
||||
mov esi,[pointer_file_name_flp]
|
||||
fifoundds_4:
|
||||
mov ecx,11
|
||||
cld
|
||||
rep movsb
|
||||
pop edi
|
||||
mov edx,edi
|
||||
add edx,11+0xf ; edx <- cluster save position
|
||||
mov ebx,[esp+12] ; save file size
|
||||
mov [edi+28],ebx
|
||||
mov [edi+11],byte 0x20 ; attribute
|
||||
call get_date_for_file ; from FAT32.INC
|
||||
mov [edi+24],ax ; date
|
||||
mov [edi+18],ax ; date
|
||||
call get_time_for_file ; from FAT32.INC
|
||||
mov [edi+22],ax ; time
|
||||
xor ax,ax
|
||||
mov [edi+20],ax
|
||||
mov ebx,1 ; first cluster
|
||||
cmp [save_root_flag],0
|
||||
jne frnewds_1
|
||||
call frnewds_2
|
||||
pusha
|
||||
call WriteSectWithRetr
|
||||
popa
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_7
|
||||
jmp frnewds_3
|
||||
|
||||
frnewds_1:
|
||||
call frnewds_2
|
||||
frnewds_3:
|
||||
pusha ; move save to floppy cluster
|
||||
add ebx,31
|
||||
mov eax,ebx
|
||||
mov esi,[esp+32+16]
|
||||
call take_data_from_application_1
|
||||
call save_chs_sector
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_7
|
||||
popa
|
||||
mov eax,[esp+12]
|
||||
cmp eax,512
|
||||
jb flnsa_1
|
||||
sub eax,512
|
||||
mov [esp+12],eax
|
||||
mov eax,[esp+16]
|
||||
add eax,512
|
||||
mov [esp+16],eax
|
||||
jmp frnewds_1
|
||||
|
||||
frnewds_2:
|
||||
add ebx,1
|
||||
mov edi,ebx ; find free cluster in FAT
|
||||
shl edi,1
|
||||
add edi,FLOPPY_FAT
|
||||
mov eax,[edi]
|
||||
and eax,4095
|
||||
jnz frnewds_2
|
||||
mov [edx],bx ; save next cluster pos. to prev cl.
|
||||
mov edx,edi ; next save pos abs mem add
|
||||
ret
|
||||
|
||||
flnsa_1:
|
||||
mov [edi],word 4095 ; mark end of file - last cluster
|
||||
cmp [save_root_flag],1
|
||||
jne flnsa_2
|
||||
call save_flp_root
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_7
|
||||
flnsa_2:
|
||||
call save_flp_fat
|
||||
cmp [FDC_Status],0
|
||||
jne fdc_status_error_7
|
||||
frnoreadds_1:
|
||||
pop edi esi edx ecx ebx eax
|
||||
add esp,32
|
||||
mov eax,0
|
||||
mov [flp_status],0
|
||||
ret
|
||||
|
||||
fdc_status_error_7_1:
|
||||
cmp [FDC_Status],0
|
||||
je fdc_status_error_8
|
||||
fdc_status_error_7:
|
||||
pop edi esi edx ecx ebx eax
|
||||
add esp,32
|
||||
jmp fdc_status_error_1
|
||||
|
||||
save_chs_sector:
|
||||
call calculate_chs
|
||||
call WriteSectWithRetr
|
||||
@ -965,115 +623,6 @@ found_file_analyze_flp:
|
||||
ret
|
||||
|
||||
|
||||
analyze_directory_to_write_flp:
|
||||
;--------------------------------
|
||||
; input : EAX = first cluster of the directory
|
||||
; output : IF CARRY=0 EAX = sector where the file is found
|
||||
; EBX = pointer in buffer
|
||||
; [buffer .. buffer+511]
|
||||
; ECX,EDX,EDI,EDI not changed
|
||||
; IF CARRY=1
|
||||
;--------------------------------
|
||||
|
||||
push ecx
|
||||
push edx
|
||||
push esi
|
||||
|
||||
adr561:
|
||||
mov [clust_tmp_flp],eax
|
||||
add eax,31
|
||||
pusha
|
||||
call read_chs_sector
|
||||
popa
|
||||
cmp [FDC_Status],0
|
||||
jne error_found_file_analyze1
|
||||
|
||||
mov ecx,512/32
|
||||
mov ebx,FDD_BUFF
|
||||
|
||||
adr1_analyze1:
|
||||
cmp byte [ebx],0x00
|
||||
je found_file_analyze1
|
||||
cmp byte [ebx],0xe5
|
||||
je found_file_analyze1
|
||||
|
||||
avanti:
|
||||
add ebx,32
|
||||
loop adr1_analyze1
|
||||
|
||||
mov eax,[clust_tmp_flp]
|
||||
shl eax,1 ;find next cluster from FAT
|
||||
add eax,FLOPPY_FAT
|
||||
mov eax,[eax]
|
||||
and eax,4095
|
||||
cmp eax,0x0ff8
|
||||
jb adr561
|
||||
|
||||
call get_free_FAT ;this block of code add a new cluster
|
||||
;for the directory because the directory
|
||||
;is full
|
||||
|
||||
mov [edi],word 0x0fff
|
||||
|
||||
mov eax,[clust_tmp_flp]
|
||||
shl eax,1 ;find next cluster from FAT
|
||||
add eax,FLOPPY_FAT
|
||||
sub edi,FLOPPY_FAT
|
||||
mov [eax],di
|
||||
|
||||
pusha
|
||||
mov ecx,512/4
|
||||
xor eax,eax
|
||||
mov edi,FDD_BUFF
|
||||
cld
|
||||
rep stosd
|
||||
popa
|
||||
|
||||
mov eax,edi
|
||||
add eax,31
|
||||
pusha
|
||||
call save_chs_sector
|
||||
popa
|
||||
cmp [FDC_Status],0
|
||||
jne error_found_file_analyze1
|
||||
mov ebx,FDD_BUFF
|
||||
|
||||
found_file_analyze1:
|
||||
|
||||
pop esi
|
||||
pop edx
|
||||
pop ecx
|
||||
clc ;file found
|
||||
ret
|
||||
|
||||
error_found_file_analyze1:
|
||||
pop esi
|
||||
pop edx
|
||||
pop ecx
|
||||
stc
|
||||
ret
|
||||
|
||||
get_free_FAT_flp:
|
||||
;------------------------------------------
|
||||
; input : EAX = # cluster for start the searching
|
||||
; output : EAX = # first cluster found free
|
||||
;-------------------------------------------
|
||||
push ebx
|
||||
|
||||
mov ebx,1
|
||||
check_new_flp:
|
||||
add ebx,1
|
||||
mov edi,ebx ; find free cluster in FAT
|
||||
shl edi,1
|
||||
add edi,FLOPPY_FAT
|
||||
mov eax,[edi]
|
||||
and eax,4095
|
||||
cmp eax,0x0
|
||||
jnz check_new_flp
|
||||
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
; \begin{diamond}
|
||||
fat_find_lfn:
|
||||
; in: esi->name
|
||||
|
@ -1,5 +1,5 @@
|
||||
$Revision$
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
@ -69,7 +69,6 @@ PUSHAD_EDI equ [esp+0]
|
||||
|
||||
uglobal
|
||||
align 4
|
||||
cluster dd 0 ; used by file_write,makedir,append
|
||||
partition_count dd 0 ; partitions found by set_FAT32_variables
|
||||
longname_sec1 dd 0 ; used by analyze_directory to save 2 previous
|
||||
longname_sec2 dd 0 ; directory sectors for delete long filename
|
||||
@ -83,13 +82,6 @@ cluster_tmp dd 0 ; used by analyze_directory
|
||||
|
||||
file_size dd 0 ; used by file_read
|
||||
|
||||
sector_tmp dd 0 ; used by rename,append,file_write
|
||||
entry_pos dd 0 ; used by rename,append,file_write
|
||||
|
||||
old_filesize dd 0 ; used by append
|
||||
new_filepos dd 0 ; used by append
|
||||
bytes2write dd 0 ; used by append
|
||||
|
||||
cache_search_start dd 0 ; used by find_empty_slot
|
||||
endg
|
||||
|
||||
@ -106,13 +98,8 @@ fat_cache: times 512 db 0
|
||||
endg
|
||||
|
||||
uglobal
|
||||
dir_entry: times 32 db 0
|
||||
|
||||
startpath: times 255 db 0
|
||||
|
||||
fat16_root db 0 ; flag for fat16 rootdir
|
||||
fat_change db 0 ; 1=fat has changed
|
||||
|
||||
endg
|
||||
|
||||
reserve_hd1:
|
||||
@ -470,131 +457,6 @@ analyze_directory:
|
||||
ret
|
||||
|
||||
|
||||
analyze_directory_to_write:
|
||||
;-----------------------------------------------------------
|
||||
; input : EAX = first cluster of the directory
|
||||
; output : IF CARRY=0 EAX = sector where the empty pos is found
|
||||
; EBX = pointer in buffer
|
||||
; [buffer .. buffer+511]
|
||||
; ECX,EDX,ESI,EDI not changed
|
||||
; IF CARRY=1 disk full or fat corrupted
|
||||
; Note : if cluster=0 it's changed to read rootdir
|
||||
;-----------------------------------------------------------
|
||||
push ecx edx edi
|
||||
|
||||
adw_new_cluster:
|
||||
mov [cluster_tmp],eax
|
||||
mov [fat16_root],0
|
||||
cmp eax,[LAST_CLUSTER]
|
||||
ja adw_not_found ; too big cluster number, something is wrong
|
||||
cmp eax,2
|
||||
jnb adw_data_cluster
|
||||
|
||||
mov eax,[ROOT_CLUSTER] ; if cluster < 2 then read rootdir
|
||||
cmp [fs_type],16
|
||||
jne adw_data_cluster
|
||||
mov eax,[ROOT_START]
|
||||
mov edx,[ROOT_SECTORS]
|
||||
mov [fat16_root],1 ; flag for fat16 rootdir
|
||||
jmp adw_new_sector
|
||||
|
||||
adw_data_cluster:
|
||||
sub eax,2
|
||||
mov edx,[SECTORS_PER_CLUSTER]
|
||||
imul eax,edx
|
||||
add eax,[DATA_START]
|
||||
|
||||
adw_new_sector:
|
||||
mov ebx,buffer
|
||||
call hd_read
|
||||
cmp [hd_error],0
|
||||
jne adw_not_found
|
||||
|
||||
mov ecx,512/32 ; count of dir entrys per sector = 16
|
||||
|
||||
adw_analyze:
|
||||
cmp byte [ebx],0x00 ; is free entry?
|
||||
je adw_found ; yes
|
||||
cmp byte [ebx],0xe5 ; is deleted entry?
|
||||
je adw_found ; yes
|
||||
add ebx,32 ; position of next dir entry
|
||||
dec ecx
|
||||
jnz adw_analyze
|
||||
|
||||
inc eax ; next sector
|
||||
dec edx
|
||||
jne adw_new_sector
|
||||
cmp [fat16_root],1 ; end of fat16 rootdir
|
||||
je adw_not_found
|
||||
|
||||
mov eax,[cluster_tmp]
|
||||
call get_FAT ; get next cluster
|
||||
cmp [hd_error],0
|
||||
jne adw_not_found
|
||||
|
||||
cmp eax,2 ; incorrect fat chain?
|
||||
jb adw_not_found ; yes
|
||||
cmp eax,[fatRESERVED] ; is it end of directory?
|
||||
jb adw_new_cluster ; no. analyse it
|
||||
|
||||
mov eax,2 ; this block of code add a new cluster
|
||||
call get_free_FAT ; for the directory because the directory
|
||||
jc adw_not_found ; is full
|
||||
|
||||
mov edx,[fatEND] ; new end for directory
|
||||
call set_FAT
|
||||
cmp [hd_error],0
|
||||
jne adw_not_found
|
||||
|
||||
push eax ; save new cluster
|
||||
mov edx,eax
|
||||
mov eax,[cluster_tmp] ; change last cluster to point new cluster
|
||||
call set_FAT
|
||||
cmp [hd_error],0
|
||||
jne adw_not_found_1
|
||||
|
||||
mov ecx,-1 ; remove 1 cluster from free disk space
|
||||
call add_disk_free_space
|
||||
cmp [hd_error],0
|
||||
jne adw_not_found_1
|
||||
|
||||
mov ecx,512/4
|
||||
xor eax,eax
|
||||
mov edi,buffer
|
||||
cld
|
||||
rep stosd ; clear new directory cluster
|
||||
pop eax
|
||||
|
||||
sub eax,2
|
||||
mov ecx,[SECTORS_PER_CLUSTER]
|
||||
imul eax,ecx
|
||||
add eax,[DATA_START]
|
||||
mov ebx,buffer
|
||||
push eax ; save sector number
|
||||
|
||||
adw_set_empty_directory:
|
||||
call hd_write
|
||||
cmp [hd_error],0
|
||||
jne adw_not_found_1
|
||||
|
||||
inc eax ; next sector
|
||||
dec ecx
|
||||
jnz adw_set_empty_directory
|
||||
|
||||
pop eax
|
||||
|
||||
adw_found:
|
||||
pop edi edx ecx
|
||||
clc ; free space found
|
||||
ret
|
||||
adw_not_found_1:
|
||||
add esp,4
|
||||
adw_not_found:
|
||||
pop edi edx ecx
|
||||
stc ; free space not found
|
||||
ret
|
||||
|
||||
|
||||
get_data_cluster:
|
||||
;-----------------------------------------------------------
|
||||
; input : EAX = cluster
|
||||
@ -660,43 +522,6 @@ get_data_cluster:
|
||||
ret
|
||||
|
||||
|
||||
set_data_cluster:
|
||||
;-----------------------------------------------------------
|
||||
; input : EAX = cluster
|
||||
; EBX = pointer to buffer
|
||||
; output : if CARRY=0 ok
|
||||
; if CARRY=1 cluster out of range
|
||||
;-----------------------------------------------------------
|
||||
push eax ebx edx
|
||||
|
||||
cmp eax,[LAST_CLUSTER]
|
||||
ja sdc_error ; too big cluster number, something is wrong
|
||||
sub eax,2
|
||||
jb sdc_error ; don't allow rootdir write
|
||||
|
||||
mov edx,[SECTORS_PER_CLUSTER]
|
||||
imul eax,edx
|
||||
add eax,[DATA_START]
|
||||
|
||||
sdc_write:
|
||||
call hd_write
|
||||
cmp [hd_error],0
|
||||
jne sdc_error
|
||||
|
||||
add ebx,512 ; update pointer
|
||||
inc eax
|
||||
dec edx
|
||||
jnz sdc_write
|
||||
pop edx ebx eax
|
||||
clc
|
||||
ret
|
||||
|
||||
sdc_error:
|
||||
pop edx ebx eax
|
||||
stc
|
||||
ret
|
||||
|
||||
|
||||
get_cluster_of_a_path:
|
||||
;---------------------------------------------------------
|
||||
; input : EBX = pointer to a path string
|
||||
@ -855,191 +680,6 @@ add_disk_free_space:
|
||||
ret
|
||||
|
||||
|
||||
file_write:
|
||||
;--------------------------------------------------------------------------
|
||||
; INPUT : user-reg register-in-this meaning symbol-in-this-routine
|
||||
;
|
||||
; EAX EDI system call to write /
|
||||
; EBX EAX (PAR0) pointer to file-name PAR0
|
||||
; EDX ECX (PAR1) pointer to buffer PAR1
|
||||
; ECX EBX (PAR2) file size PAR2
|
||||
; ESI EDX (PAR3) pointer to path PAR3
|
||||
;
|
||||
; output : eax = 0 - ok
|
||||
; 3 - unknown FS
|
||||
; 5 - file not found
|
||||
; 8 - disk full
|
||||
; 10 - access denied
|
||||
;--------------------------------------------------------------------------
|
||||
cmp [fs_type], 16
|
||||
jz fat_ok_for_writing
|
||||
cmp [fs_type], 32
|
||||
jz fat_ok_for_writing
|
||||
push ERROR_UNKNOWN_FS
|
||||
pop eax
|
||||
ret
|
||||
|
||||
fat_ok_for_writing:
|
||||
; call reserve_hd1
|
||||
|
||||
pushad
|
||||
|
||||
xor edi,edi ; don't allow directory remove
|
||||
call file_delete ; try to delete the file first
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
|
||||
test eax,eax
|
||||
jz old_deleted ; deleted ok
|
||||
cmp eax,ERROR_FILE_NOT_FOUND
|
||||
jnz exit_write_access ; it exist but can't delete
|
||||
|
||||
old_deleted:
|
||||
mov ebx,PUSHAD_EDX
|
||||
call get_cluster_of_a_path
|
||||
jnc found_directory_for_writing
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access
|
||||
|
||||
exit_writing_with_error:
|
||||
popad
|
||||
call update_disk ; write all of cache and fat to hd
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_2
|
||||
|
||||
mov [hd1_status],0
|
||||
mov eax,ERROR_FILE_NOT_FOUND
|
||||
ret
|
||||
|
||||
exit_writing_disk_full_clear:
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
mov eax,[sector_tmp]
|
||||
mov ebx,buffer
|
||||
call hd_read ; read directory sector
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
|
||||
mov edx,[entry_pos]
|
||||
mov byte [edx],0xe5 ; mark as deleted
|
||||
call hd_write
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
|
||||
mov eax,[edx+20-2] ; FAT entry
|
||||
mov ax,[edx+26]
|
||||
and eax,[fatMASK]
|
||||
call clear_cluster_chain
|
||||
|
||||
exit_writing_disk_full:
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
popad
|
||||
call update_disk ; write all of cache and fat to hd
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_2
|
||||
mov [hd1_status],0
|
||||
mov eax,ERROR_DISK_FULL
|
||||
ret
|
||||
|
||||
exit_write_access:
|
||||
popad
|
||||
call update_disk ; write all of cache and fat to hd
|
||||
mov [hd1_status],0
|
||||
mov eax,ERROR_ACCESS_DENIED
|
||||
ret
|
||||
|
||||
exit_write_access_1:
|
||||
popad
|
||||
exit_write_access_2:
|
||||
mov [hd1_status],0
|
||||
mov eax,ERROR_ACCESS_DENIED
|
||||
ret
|
||||
|
||||
found_directory_for_writing:
|
||||
call analyze_directory_to_write
|
||||
jc exit_writing_disk_full
|
||||
|
||||
mov [sector_tmp],eax
|
||||
mov [entry_pos],ebx
|
||||
push eax ; save directory sector
|
||||
mov eax,2
|
||||
call get_free_FAT
|
||||
mov [cluster],eax ; first free cluster
|
||||
pop eax
|
||||
jc exit_writing_disk_full
|
||||
|
||||
mov esi,PUSHAD_EAX ; file name
|
||||
mov edi,ebx ; pointer in buffer
|
||||
mov ecx,11
|
||||
cld
|
||||
rep movsb
|
||||
|
||||
mov esi,PUSHAD_EBX ; file size (bytes left)
|
||||
mov [ebx+28],esi ; file size
|
||||
mov ecx,[cluster]
|
||||
mov [ebx+26],cx ; 16 bits low of cluster
|
||||
shr ecx,16
|
||||
mov [ebx+20],cx ; 16 bits high of cluster (=0 fat16)
|
||||
mov byte [ebx+11],0x20 ; attribute = archive
|
||||
|
||||
call set_current_time_for_entry
|
||||
|
||||
mov ebx,buffer ; save the directory name,length,cluster
|
||||
call hd_write
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
|
||||
imul edi,[SECTORS_PER_CLUSTER],512 ; edi = cluster size in bytes
|
||||
xor ecx,ecx ; cluster count
|
||||
mov ebx,PUSHAD_ECX ; ebx = buffer
|
||||
|
||||
hd_new_block_write:
|
||||
|
||||
mov eax,[cluster] ; eax = block
|
||||
call set_data_cluster
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
|
||||
sub esi,edi ; sub wrote bytes
|
||||
jbe file_saved_OK ; end if all done
|
||||
add ebx,edi ; update buffer position
|
||||
|
||||
inc eax
|
||||
call get_free_FAT ; next free in FAT
|
||||
jc exit_writing_disk_full_clear
|
||||
|
||||
mov edx,eax
|
||||
xchg eax,[cluster] ; get old cluster and save new cluster
|
||||
call set_FAT ; add it in cluster chain
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
|
||||
dec ecx ; update cluster count
|
||||
jmp hd_new_block_write
|
||||
|
||||
file_saved_OK:
|
||||
|
||||
mov edx,[fatEND] ; new end for cluster chain
|
||||
call set_FAT
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
|
||||
dec ecx ; update cluster count
|
||||
|
||||
call add_disk_free_space ; remove clusters from free disk space
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_1
|
||||
|
||||
popad
|
||||
call update_disk ; write all of cache and fat to hd
|
||||
cmp [hd_error],0
|
||||
jne exit_write_access_2
|
||||
mov [hd1_status],0
|
||||
xor eax,eax
|
||||
ret
|
||||
|
||||
|
||||
file_read:
|
||||
;--------------------------------------------------------------------------
|
||||
; INPUT : user-register register-in-this meaning symbol-in-this
|
||||
@ -1209,67 +849,6 @@ get_dir_size:
|
||||
ret
|
||||
|
||||
|
||||
file_delete:
|
||||
;-----------------------------------------------------
|
||||
; input : eax = file/directory name
|
||||
; edx = path
|
||||
; edi = 1 - allow directory remove else don't remove directory
|
||||
; output : eax = 0 - ok
|
||||
; 3 - unknown FS
|
||||
; 5 - file not found
|
||||
; 10 - access denied
|
||||
;-----------------------------------------------------
|
||||
cmp [fs_type], 16
|
||||
jz file_del_fat_ok
|
||||
cmp [fs_type], 32
|
||||
jz file_del_fat_ok
|
||||
push ERROR_UNKNOWN_FS
|
||||
pop eax
|
||||
ret
|
||||
|
||||
file_del_fat_ok:
|
||||
pushad
|
||||
|
||||
mov ebx,edx
|
||||
call get_cluster_of_a_path
|
||||
jc file_to_delete_not_found
|
||||
|
||||
mov ebx,PUSHAD_EAX ; file/directory name
|
||||
call analyze_directory
|
||||
jc file_to_delete_not_found
|
||||
|
||||
test byte [ebx+11],0x10 ; is it directory?
|
||||
jnz delete_no_access
|
||||
|
||||
delete_notdir:
|
||||
call delete_entry_name
|
||||
cmp [hd_error],0
|
||||
jne delete_no_access
|
||||
|
||||
mov eax,ecx ; first cluster of file
|
||||
call clear_cluster_chain
|
||||
cmp [hd_error],0
|
||||
jne delete_no_access
|
||||
|
||||
popad
|
||||
xor eax,eax
|
||||
ret
|
||||
|
||||
delete_no_access_1:
|
||||
add esp,4
|
||||
delete_no_access:
|
||||
popad
|
||||
mov eax,ERROR_ACCESS_DENIED
|
||||
ret
|
||||
|
||||
file_to_delete_not_found:
|
||||
cmp [hd_error],0
|
||||
jne delete_no_access
|
||||
popad
|
||||
mov eax,ERROR_FILE_NOT_FOUND
|
||||
ret
|
||||
|
||||
|
||||
clear_cluster_chain:
|
||||
;-----------------------------------------------------
|
||||
; input : eax = first cluster
|
||||
@ -1301,60 +880,6 @@ clear_cluster_chain:
|
||||
ret
|
||||
|
||||
|
||||
delete_entry_name:
|
||||
;-----------------------------------------------------
|
||||
; input : eax = directory sector
|
||||
; ebx = directory pointer in buffer
|
||||
; longname_sec = 2 previous directory sectors
|
||||
; output : ecx = first cluster
|
||||
; change : eax,ebx,edx
|
||||
;-----------------------------------------------------
|
||||
mov byte [ebx],0xe5
|
||||
mov ecx,[ebx+20-2] ; first cluster of file
|
||||
mov cx,[ebx+26] ; 0 length files start cluster = 0
|
||||
and ecx,[fatMASK]
|
||||
|
||||
delete_empty:
|
||||
sub ebx,32
|
||||
cmp ebx,buffer
|
||||
jnb delete_test_long
|
||||
|
||||
mov ebx,buffer
|
||||
call hd_write ; write directory sector back
|
||||
cmp [hd_error],0
|
||||
jne delete_name_end
|
||||
|
||||
xor eax,eax
|
||||
xchg eax,[longname_sec2]
|
||||
xchg eax,[longname_sec1]
|
||||
test eax,eax ; is there previous directory sector?
|
||||
jz delete_name_end ; no
|
||||
|
||||
mov ebx,buffer
|
||||
call hd_read ; read previous sector
|
||||
cmp [hd_error],0
|
||||
jne delete_name_end
|
||||
|
||||
mov ebx,buffer+0x1e0 ; start from last entry
|
||||
|
||||
delete_test_long:
|
||||
mov dh,[ebx+11] ; file attribute
|
||||
and dh,0xf
|
||||
cmp dh,0xf
|
||||
jne delete_write_buffer
|
||||
|
||||
cmp byte [ebx],0x40 ; end of long dir entry?
|
||||
mov byte [ebx],0xe5
|
||||
jb delete_empty
|
||||
|
||||
delete_write_buffer:
|
||||
mov ebx,buffer
|
||||
call hd_write ; write directory sector back
|
||||
|
||||
delete_name_end:
|
||||
ret
|
||||
|
||||
|
||||
get_hd_info:
|
||||
;-----------------------------------------------------------
|
||||
; output : eax = 0 - ok
|
||||
@ -1428,55 +953,6 @@ update_disk:
|
||||
update_disk_acces_denied:
|
||||
ret
|
||||
|
||||
read_hd_file:
|
||||
;-----------------------------------------------------------------
|
||||
;
|
||||
; Converting old reading function for hd-application start.
|
||||
;
|
||||
; IN:
|
||||
;
|
||||
; eax - pointer to file (0 = read only first sector of drive: eg 'label')
|
||||
; ebx - file lenght
|
||||
; ecx - start 512 byte block number
|
||||
; edx - number of blocks to read
|
||||
; esi - pointer to return/work area (atleast 20 000 bytes)
|
||||
;
|
||||
; For new read function
|
||||
;
|
||||
; EAX (PAR0) pointer to file-name
|
||||
; ECX (PAR1) pointer to buffer
|
||||
; EBX (PAR2) vt file blocks to read
|
||||
; EDX (PAR3) pointer to path
|
||||
; ESI vt first 512 block to read
|
||||
; EDI if 0 - return root
|
||||
;--------------------------------------------------------------------------
|
||||
|
||||
push ecx esi edi
|
||||
mov esi,eax
|
||||
mov edi,startpath
|
||||
mov ecx,250
|
||||
cld
|
||||
rep movsb
|
||||
pop edi esi ecx
|
||||
|
||||
mov eax,startpath
|
||||
mov [eax+ebx-12],byte 0
|
||||
|
||||
push eax ebx ecx edx esi
|
||||
|
||||
pop ecx ; pointer to buffer
|
||||
add ecx,1024
|
||||
pop ebx ; number of blocks to read
|
||||
pop esi ; first block to read
|
||||
dec esi
|
||||
pop eax ; file length
|
||||
pop edx ; pointer to path
|
||||
|
||||
mov edi,12
|
||||
lea eax,[eax+edx-12+1]
|
||||
call file_read
|
||||
|
||||
ret
|
||||
|
||||
; \begin{diamond}
|
||||
hd_find_lfn:
|
||||
|
@ -41,7 +41,6 @@ file_system:
|
||||
; IN:
|
||||
;
|
||||
; eax = 0 ; read file /RamDisk/First 6
|
||||
; eax = 1 ; write file /RamDisk/First 33 /HardDisk/First 56
|
||||
; eax = 8 ; lba read
|
||||
; eax = 15 ; get_disk_info
|
||||
;
|
||||
@ -263,22 +262,6 @@ endg
|
||||
|
||||
|
||||
fs_noramdisk_read:
|
||||
|
||||
cmp dword [esp+20],1 ; WRITE
|
||||
jne fs_noramdisk_write
|
||||
|
||||
mov eax,[esp+4] ; fname
|
||||
add eax,2*12+1
|
||||
mov ebx,[esp+8] ; buffer
|
||||
mov ecx,[esp+12] ; count to write
|
||||
mov edx,0 ; create new
|
||||
call filesave
|
||||
|
||||
; eax=0 ok - eax=1 not enough free space
|
||||
|
||||
jmp file_system_return
|
||||
|
||||
fs_noramdisk_write:
|
||||
fs_noramdisk:
|
||||
|
||||
;********************************************************************
|
||||
@ -329,23 +312,6 @@ endg
|
||||
|
||||
|
||||
fs_noflpdisk_read:
|
||||
|
||||
cmp dword [esp+20],1 ; WRITE
|
||||
jne fs_noflpdisk_write
|
||||
|
||||
mov eax,[esp+4] ; fname
|
||||
add eax,2*12+1
|
||||
mov ebx,[esp+8] ; buffer
|
||||
mov ecx,[esp+12] ; count to write
|
||||
mov edx,0 ; create new
|
||||
call floppy_filesave
|
||||
|
||||
; eax=0 ok - eax=1 not enough free space
|
||||
|
||||
jmp file_system_return
|
||||
|
||||
fs_noflpdisk_write:
|
||||
|
||||
fs_noflpdisk:
|
||||
;*****************************************************************
|
||||
|
||||
@ -476,34 +442,6 @@ hd_err_return:
|
||||
|
||||
fs_noharddisk_read:
|
||||
|
||||
|
||||
cmp dword [esp+20],1 ; WRITE
|
||||
jne fs_noharddisk_write
|
||||
|
||||
mov eax,[esp+0] ; /fname
|
||||
mov byte [eax],0 ; path to asciiz
|
||||
inc eax ; filename start
|
||||
|
||||
mov ebx,[esp+12] ; count to write
|
||||
mov ecx,[esp+8] ; buffer
|
||||
mov edx,[esp+4]
|
||||
add edx,12*2 ; path start
|
||||
|
||||
call file_write
|
||||
|
||||
mov edi,[esp+0]
|
||||
mov byte [edi],'/'
|
||||
|
||||
; eax=0 ok - eax=1 not enough free space
|
||||
|
||||
call free_hd_channel
|
||||
and [hd1_status], 0
|
||||
jmp file_system_return
|
||||
|
||||
|
||||
fs_noharddisk_write:
|
||||
|
||||
|
||||
call free_hd_channel
|
||||
and [hd1_status], 0
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user