diff --git a/kernel/trunk/fs/fat32.inc b/kernel/trunk/fs/fat32.inc index 7e6a908f76..b3d078bb50 100644 --- a/kernel/trunk/fs/fat32.inc +++ b/kernel/trunk/fs/fat32.inc @@ -129,8 +129,41 @@ reserve_hd1: pop eax sti ret - - +;******************************************** +reserve_hd_channel: + cmp [hdbase], 0x1F0 + jne .IDE_Channel_2 +.IDE_Channel_1: + cli + cmp [IDE_Channel_1],0 + je .reserve_ok_1 + sti + call change_task + jmp .IDE_Channel_1 +.IDE_Channel_2: + cli + cmp [IDE_Channel_2],0 + je .reserve_ok_2 + sti + call change_task + jmp .IDE_Channel_1 +.reserve_ok_1: + mov [IDE_Channel_1],1 + ret +.reserve_ok_2: + mov [IDE_Channel_2],1 + ret + +free_hd_channel: + cmp [hdbase], 0x1F0 + jne .IDE_Channel_2 +.IDE_Channel_1: + mov [IDE_Channel_1],0 + ret +.IDE_Channel_2: + mov [IDE_Channel_2],0 + ret +;******************************************** clear_hd_cache: push eax ecx edi diff --git a/kernel/trunk/fs/fs_lfn.inc b/kernel/trunk/fs/fs_lfn.inc index 6aa7e240e0..8bdae2f0d9 100644 --- a/kernel/trunk/fs/fs_lfn.inc +++ b/kernel/trunk/fs/fs_lfn.inc @@ -407,6 +407,7 @@ fs_OnHd3: mov [hdid], 0x10 push 4 fs_OnHd: + call reserve_hd_channel pop eax mov [hdpos], eax cmp ecx, 0x100 @@ -414,6 +415,7 @@ fs_OnHd: cmp cl, [0x40001+eax] jbe @f .nf: + call free_hd_channel and [hd1_status], 0 mov dword [esp+36], 5 ; not found ret @@ -430,11 +432,13 @@ fs_OnHd: jae .not_impl add ebx, 4 call dword [fs_HdServices + eax*4] + call free_hd_channel and [hd1_status], 0 mov [esp+36], eax mov [esp+24], ebx ret .not_impl: + call free_hd_channel and [hd1_status], 0 mov dword [esp+36], 2 ; not implemented ret @@ -475,7 +479,7 @@ fs_OnCd3: mov [DiskNumber],1 push 0 fs_OnCd: - + call reserve_cd_channel pop eax mov [hdpos], eax cmp ecx, 0x100 @@ -489,6 +493,7 @@ fs_OnCd: jnz @f .nf: + call free_cd_channel and [cd_status], 0 mov dword [esp+36], 5 ; not found ret @@ -501,11 +506,13 @@ fs_OnCd: jae .not_impl add ebx, 4 call dword [fs_CdServices + eax*4] + call free_cd_channel and [cd_status], 0 mov [esp+36], eax mov [esp+24], ebx ret .not_impl: + call free_cd_channel and [cd_status], 0 mov dword [esp+36], 2 ; not implemented ret diff --git a/kernel/trunk/fs/iso9660.inc b/kernel/trunk/fs/iso9660.inc index 40d7082b84..72cd5bff89 100644 --- a/kernel/trunk/fs/iso9660.inc +++ b/kernel/trunk/fs/iso9660.inc @@ -4,6 +4,8 @@ cd_current_pointer_of_input dd 0 cd_current_pointer_of_input_2 dd 0 cd_mem_location dd 0 cd_counter_block dd 0 +IDE_Channel_1 db 0 +IDE_Channel_2 db 0 endg CDDataBuf equ 0x7000 @@ -16,7 +18,7 @@ reserve_cd: sti call change_task - jmp reserve_hd1 + jmp reserve_cd reserve_ok2: @@ -28,6 +30,40 @@ reserve_cd: pop eax sti ret + +reserve_cd_channel: + cmp [ChannelNumber],1 + jne .IDE_Channel_2 +.IDE_Channel_1: + cli + cmp [IDE_Channel_1],0 + je .reserve_ok_1 + sti + call change_task + jmp .IDE_Channel_1 +.IDE_Channel_2: + cli + cmp [IDE_Channel_2],0 + je .reserve_ok_2 + sti + call change_task + jmp .IDE_Channel_1 +.reserve_ok_1: + mov [IDE_Channel_1],1 + ret +.reserve_ok_2: + mov [IDE_Channel_2],1 + ret + +free_cd_channel: + cmp [ChannelNumber],1 + jne .IDE_Channel_2 +.IDE_Channel_1: + mov [IDE_Channel_1],0 + ret +.IDE_Channel_2: + mov [IDE_Channel_2],0 + ret cd_status dd 0