;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2011, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; VFS.ASM ; Virtual file system ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; include ..\os\system.def include ..\os.def include ..\os.inc include ..\serv.def include ..\serv.inc include ..\user.def include ..\user.inc include ..\driver.def include ..\handle.inc include ..\wait.inc include ..\os\protseg.def include vfs.inc .386p ;;;;;;;;; INTERNAL PROCEDURES ;;;;;;;;;;; code SEGMENT byte public 'CODE' assume cs:code extern init_sys_handle:near extern init_buf:near extern init_server:near extern init_disc:near extern init_dir:near extern init_client_file:near extern init_server_file:near extern HandleDiscReq:near extern HandleDiscMsg:near extern CreateBuffer:near extern CreateDiscSel:near extern InitPartSel:near extern AddDisc:near ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CalcParam ; ; DESCRIPTION: Calculate schedule params ; ; PARAMETERS: DS VFS sel ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CalcParam Proc near mov eax,ds:vfs_sectors mov edx,ds:vfs_sectors+4 mov bx,ds:vfs_bytes_per_sector xor cl,cl cpSectorLoop: cmp bx,1000h jae cpSectorOk ; clc rcr edx,1 rcr eax,1 shl bx,1 inc cl jmp cpSectorLoop cpSectorOk: mov bl,3 sub bl,cl mov ds:vfs_sector_shift,bl ; add eax,1 adc edx,0 mov ds:vfs_blocks,eax mov ds:vfs_blocks+4,edx ; mov ebx,eax rol ebx,3 and bl,7 shl edx,3 or dl,bl inc edx mov ds:vfs_buf_count,edx ; mov ax,1 shl ax,cl mov ds:vfs_sectors_per_block,ax ; ret CalcParam Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DiscThread ; ; DESCRIPTION: Disc init & msg thread ; ; PARAMETERS: BX VFS sel ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; disc_thread: mov ds,bx mov eax,1000h AllocateBigServ mov ds:vfs_map_entry,edx ; call AddDisc call HandleDiscMsg TerminateThread ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: HexToAscii ; ; DESCRIPTION: ; ; PARAMETERS: AL Number to convert ; ; RETURNS: AX Ascii result ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HexToAscii PROC near mov ah,al and al,0F0h rol al,1 rol al,1 rol al,1 rol al,1 cmp al,0Ah jb ok_low1 ; add al,7 ok_low1: add al,30h and ah,0Fh cmp ah,0Ah jb ok_high1 ; add ah,7 ok_high1: add ah,30h ret HexToAscii ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CreatePartThread ; ; DESCRIPTION: Start part thread ; ; PARAMETERS: DS VFS sel ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; disc_name DB 'VFS Disc ',0 CreateDiscThread Proc near push ds push es pushad ; mov eax,20 AllocateSmallGlobalMem ; xor edi,edi mov esi,OFFSET disc_name cdtCopyDev: mov al,cs:[esi] inc esi or al,al jz cdtCopyDone ; stos byte ptr es:[edi] jmp cdtCopyDev cdtCopyDone: mov al,ds:vfs_disc_nr call HexToAscii stos word ptr es:[edi] ; xor al,al stos byte ptr es:[edi] ; xor edi,edi ; mov bx,ds mov eax,cs mov ds,eax mov esi,OFFSET disc_thread mov al,2 CreateThread ; FreeMem ; popad pop es pop ds ret CreateDiscThread Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: VfsServer ; ; DESCRIPTION: Vfs server ; ; PARAMETERS: BX VFS sel ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; VfsServer: GetThread mov ds,bx mov ds:vfs_server,ax ; mov bx,ds:vfs_param call fword ptr ds:vfs_init jc vfsTerm ; mov ds:vfs_sectors,eax mov ds:vfs_sectors+4,edx mov ds:vfs_bytes_per_sector,cx ; mov eax,SIZE vfs_part AllocateSmallGlobalMem mov ecx,eax xor edi,edi xor al,al rep stos byte ptr es:[edi] ; mov esi,ds:vfs_sectors mov edi,ds:vfs_sectors+4 xor eax,eax xor edx,edx ; call InitPartSel mov ds:vfs_my_part,es ; and bl,0F8h mov ds:vfs_max_req,bx movzx eax,bx shl eax,3 AllocateSmallServ mov ds:vfs_req_buf,es ; mov bx,ds mov es,bx mov edi,OFFSET vfs_vendor_str mov bx,ds:vfs_param call fword ptr ds:vfs_get_vendor ; mov ds:vfs_scan_pos,-1 mov ds:vfs_scan_pos+4,-1 mov ds:vfs_active_count,0 mov ds:vfs_req_list,0 InitSection ds:vfs_section ; call CalcParam call CreateBuffer call CreateDiscThread call HandleDiscReq mov ds:vfs_server,0 vfsExit: mov bx,ds:vfs_param call fword ptr ds:vfs_exit vfsTerm: mov ax,25 WaitMilliSec TerminateThread ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: StartVfs ; ; DESCRIPTION: Start VFS ; ; PARAMETERS: DS:ESI VFS table ; ES:EDI Server name ; BX Dev param ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; start_vfs_name DB 'Start VFS',0 start_vfs Proc far push ds push eax push esi ; call CreateDiscSel jc svfsDone ; mov eax,cs mov ds,eax mov esi,OFFSET VfsServer mov al,2 CreateServerProcess svfsDone: pop esi pop eax pop ds ret start_vfs Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: StopVfs ; ; DESCRIPTION: Stop vfs ; ; PARAMETERS: BX VFS handle ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; stop_vfs_name DB 'Stop VFS',0 stop_vfs Proc far push es push ebx ; mov es,ebx lock or es:vfs_flags,VFS_FLAG_STOPPED mov bx,es:vfs_server Signal ; mov bx,es:vfs_cmd_thread Signal spvWait: mov ax,25 WaitMilliSec ; mov bx,es:vfs_server or bx,bx jnz spvWait ; pop ebx pop es ret stop_vfs Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: init ; ; description: Init device ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init Proc far call init_sys_handle call init_buf call init_server call init_disc call init_dir call init_server_file call init_client_file ; mov ax,cs mov ds,ax mov es,ax ; mov esi,OFFSET start_vfs mov edi,OFFSET start_vfs_name xor cl,cl mov ax,start_vfs_nr RegisterOsGate ; mov esi,OFFSET stop_vfs mov edi,OFFSET stop_vfs_name xor cl,cl mov ax,stop_vfs_nr RegisterOsGate clc ret init Endp code ENDS END init